From 4b89c4db62fd3685d214d038bafdde3925a49930 Mon Sep 17 00:00:00 2001 From: Martin Donnelly Date: Wed, 3 May 2023 17:08:16 +0100 Subject: [PATCH] new-dev --- .eslintrc.json | 0 .gitignore | 8 +- .idea/.gitignore | 0 .idea/inspectionProfiles/Project_Default.xml | 0 .idea/jsLibraryMappings.xml | 0 .idea/misc.xml | 0 .idea/modules.xml | 0 .idea/svelte-jubilee.iml | 0 README.md | 0 favicon.png | Bin 0 -> 367054 bytes package-lock.json | 1722 +- package.json | 34 +- pnpm-lock.yaml | 3484 +++ public/browserconfig.xml | 0 public/build/bundle.css | 14 + public/build/bundle.css.map | 34 + public/build/bundle.js | 23837 ++++++++++++++++ public/build/bundle.js.map | 1 + public/build/fonts/Roboto-italic-400.woff | Bin 0 -> 21952 bytes public/build/fonts/Roboto-italic-700.woff | Bin 0 -> 21588 bytes public/build/fonts/Roboto-normal-100.woff | Bin 0 -> 20368 bytes public/build/fonts/Roboto-normal-300.woff | Bin 0 -> 20348 bytes public/build/fonts/Roboto-normal-400.woff | Bin 0 -> 20268 bytes public/build/fonts/Roboto-normal-500.woff | Bin 0 -> 20464 bytes public/build/fonts/Roboto-normal-700.woff | Bin 0 -> 20356 bytes public/build/fonts/Roboto-normal-900.woff | Bin 0 -> 20392 bytes .../fonts/Roboto_Condensed-normal-300.woff | Bin 0 -> 20120 bytes .../fonts/Roboto_Condensed-normal-400.woff | Bin 0 -> 20156 bytes .../fonts/Roboto_Condensed-normal-700.woff | Bin 0 -> 20216 bytes .../build/fonts/Roboto_Mono-normal-400.woff | Bin 0 -> 15160 bytes public/build/fonts/fonts.css | 96 + public/build/fonts/fujicons.css | 282 + public/build/fonts/fujicons.ttf | Bin 0 -> 127756 bytes public/build/fonts/test.html | 31 + public/build/fonts/weather-icons.css | 1838 ++ .../fonts/weathericons-regular-webfont.eot | Bin 0 -> 99774 bytes .../fonts/weathericons-regular-webfont.svg | 257 + .../fonts/weathericons-regular-webfont.ttf | Bin 0 -> 99564 bytes .../fonts/weathericons-regular-webfont.woff | Bin 0 -> 56468 bytes .../fonts/weathericons-regular-webfont.woff2 | Bin 0 -> 44720 bytes public/build/public/build/bundle.css | 14 + public/build/public/build/bundle.css.map | 34 + public/favicon.png | Bin 3127 -> 457447 bytes public/fonts/Roboto-italic-400.woff | Bin public/fonts/Roboto-italic-700.woff | Bin public/fonts/Roboto-normal-100.woff | Bin public/fonts/Roboto-normal-300.woff | Bin public/fonts/Roboto-normal-400.woff | Bin public/fonts/Roboto-normal-500.woff | Bin public/fonts/Roboto-normal-700.woff | Bin public/fonts/Roboto-normal-900.woff | Bin public/fonts/Roboto_Condensed-normal-300.woff | Bin public/fonts/Roboto_Condensed-normal-400.woff | Bin public/fonts/Roboto_Condensed-normal-700.woff | Bin public/fonts/Roboto_Mono-normal-400.woff | Bin public/fonts/fonts.css | 0 public/fonts/fujicons.css | 0 public/fonts/gotham.css | 0 public/fonts/test.html | 0 public/fonts/weather-icons.css | 0 public/gfx/stars_00.png | Bin public/gfx/stars_10.png | Bin public/gfx/stars_15.png | Bin public/gfx/stars_20.png | Bin public/gfx/stars_25.png | Bin public/gfx/stars_30.png | Bin public/gfx/stars_35.png | Bin public/gfx/stars_40.png | Bin public/gfx/stars_45.png | Bin public/gfx/stars_50.png | Bin public/gfx/yelp_logo.jpg | Bin public/global.css | 0 public/img/android-chrome-192x192.png | Bin public/img/android-chrome-512x512.png | Bin public/img/apple-touch-icon.png | Bin public/img/browserconfig.xml | 0 public/img/favicon-16x16.png | Bin public/img/favicon-32x32.png | Bin public/img/favicon.ico | Bin public/img/mstile-150x150.png | Bin public/img/safari-pinned-tab.svg | 0 public/index.html | 4 +- public/manifest.json | 0 public/service-worker.js | 51 +- rollup.config.js | 0 src/App.svelte | 28 +- src/components/Agenda.svelte | 0 src/components/AroundMe.svelte | 0 src/components/ByMe.svelte | 0 src/components/ClosestItem.svelte | 0 src/components/Debug.svelte | 0 src/components/Greeter.svelte | 105 +- src/components/Header.svelte | 59 +- src/components/LatestNews.svelte | 18 +- src/components/LineLoader.svelte | 76 +- src/components/NearbyPlaces.svelte | 65 +- src/components/NewsCard.svelte | 3 - src/components/NewsItem.svelte | 0 src/components/Spinner.svelte | 109 +- src/components/Traffic.svelte | 0 src/components/UpcomingEvents.svelte | 0 src/components/Weather.svelte | 120 +- src/components/WeatherAlert.svelte | 0 src/components/forecast/Currently.svelte | 48 +- src/components/forecast/Daylight.svelte | 110 + .../forecast/ForecastDetails.svelte | 75 +- src/components/forecast/TodaysForecast.svelte | 78 +- src/components/venue/VenueMap.svelte | 69 +- src/css/bronze.scss | 4 +- src/css/bronze/_small.scss | 4 +- src/css/bronze/_xlarge.scss | 0 src/css/bronze/base.scss | 2 +- src/css/bronze/button.scss | 0 src/css/bronze/cards.scss | 0 src/css/bronze/custom.scss | 5 + src/css/bronze/dropdown.scss | 0 src/css/bronze/forms.scss | 0 src/css/bronze/grid.scss | 0 src/css/bronze/list.scss | 0 src/css/bronze/margin.scss | 0 src/css/bronze/modal.scss | 0 src/css/bronze/mouse.scss | 0 src/css/bronze/navbar.scss | 0 src/css/bronze/padding.scss | 0 src/css/bronze/panel.scss | 0 src/css/bronze/table.scss | 0 src/css/bronze/text.scss | 0 src/css/common.css | 0 src/css/global-navbar.scss | 64 + src/css/global.scss | 288 +- src/css/horscroll.scss | 0 src/css/jubilee.scss | 0 src/css/lineloader.scss | 34 + src/css/nord.scss | 0 src/css/spinner.scss | 0 src/css/temprature.scss | 111 + src/css/viewport.scss | 16 - src/css/weather.scss | 0 src/fonts/fonts.css | 0 src/fonts/fujicons.css | 97 +- src/fonts/weather-icons.css | 0 src/lib/location.js | 29 +- src/lib/reducers.js | 19 +- src/lib/utils.js | 84 +- src/main.js | 19 +- src/pages/Home.svelte | 10 +- src/pages/NearbyLocationsPage.svelte | 78 +- src/pages/NewsItemPage.svelte | 180 +- src/pages/NotFound.svelte | 0 src/pages/VenueDetailsPage.svelte | 68 +- src/pages/WeatherPage.svelte | 203 +- src/pages/test.svelte | 10 + src/routes.js | 13 +- src/store/globalState.js | 239 +- src/tempPages/Home.Old.svelte | 0 src/tempPages/NewsListPage.svelte | 0 sunlight-opt.svg | 17 + sunlight.svg | 65 + 158 files changed, 33061 insertions(+), 1302 deletions(-) mode change 100644 => 100755 .eslintrc.json mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .idea/.gitignore mode change 100644 => 100755 .idea/inspectionProfiles/Project_Default.xml mode change 100644 => 100755 .idea/jsLibraryMappings.xml mode change 100644 => 100755 .idea/misc.xml mode change 100644 => 100755 .idea/modules.xml mode change 100644 => 100755 .idea/svelte-jubilee.iml mode change 100644 => 100755 README.md create mode 100755 favicon.png mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 package.json create mode 100755 pnpm-lock.yaml mode change 100644 => 100755 public/browserconfig.xml create mode 100755 public/build/bundle.css create mode 100755 public/build/bundle.css.map create mode 100755 public/build/bundle.js create mode 100755 public/build/bundle.js.map create mode 100755 public/build/fonts/Roboto-italic-400.woff create mode 100755 public/build/fonts/Roboto-italic-700.woff create mode 100755 public/build/fonts/Roboto-normal-100.woff create mode 100755 public/build/fonts/Roboto-normal-300.woff create mode 100755 public/build/fonts/Roboto-normal-400.woff create mode 100755 public/build/fonts/Roboto-normal-500.woff create mode 100755 public/build/fonts/Roboto-normal-700.woff create mode 100755 public/build/fonts/Roboto-normal-900.woff create mode 100755 public/build/fonts/Roboto_Condensed-normal-300.woff create mode 100755 public/build/fonts/Roboto_Condensed-normal-400.woff create mode 100755 public/build/fonts/Roboto_Condensed-normal-700.woff create mode 100755 public/build/fonts/Roboto_Mono-normal-400.woff create mode 100755 public/build/fonts/fonts.css create mode 100755 public/build/fonts/fujicons.css create mode 100755 public/build/fonts/fujicons.ttf create mode 100755 public/build/fonts/test.html create mode 100755 public/build/fonts/weather-icons.css create mode 100755 public/build/fonts/weathericons-regular-webfont.eot create mode 100755 public/build/fonts/weathericons-regular-webfont.svg create mode 100755 public/build/fonts/weathericons-regular-webfont.ttf create mode 100755 public/build/fonts/weathericons-regular-webfont.woff create mode 100755 public/build/fonts/weathericons-regular-webfont.woff2 create mode 100755 public/build/public/build/bundle.css create mode 100755 public/build/public/build/bundle.css.map mode change 100644 => 100755 public/favicon.png mode change 100644 => 100755 public/fonts/Roboto-italic-400.woff mode change 100644 => 100755 public/fonts/Roboto-italic-700.woff mode change 100644 => 100755 public/fonts/Roboto-normal-100.woff mode change 100644 => 100755 public/fonts/Roboto-normal-300.woff mode change 100644 => 100755 public/fonts/Roboto-normal-400.woff mode change 100644 => 100755 public/fonts/Roboto-normal-500.woff mode change 100644 => 100755 public/fonts/Roboto-normal-700.woff mode change 100644 => 100755 public/fonts/Roboto-normal-900.woff mode change 100644 => 100755 public/fonts/Roboto_Condensed-normal-300.woff mode change 100644 => 100755 public/fonts/Roboto_Condensed-normal-400.woff mode change 100644 => 100755 public/fonts/Roboto_Condensed-normal-700.woff mode change 100644 => 100755 public/fonts/Roboto_Mono-normal-400.woff mode change 100644 => 100755 public/fonts/fonts.css mode change 100644 => 100755 public/fonts/fujicons.css mode change 100644 => 100755 public/fonts/gotham.css mode change 100644 => 100755 public/fonts/test.html mode change 100644 => 100755 public/fonts/weather-icons.css mode change 100644 => 100755 public/gfx/stars_00.png mode change 100644 => 100755 public/gfx/stars_10.png mode change 100644 => 100755 public/gfx/stars_15.png mode change 100644 => 100755 public/gfx/stars_20.png mode change 100644 => 100755 public/gfx/stars_25.png mode change 100644 => 100755 public/gfx/stars_30.png mode change 100644 => 100755 public/gfx/stars_35.png mode change 100644 => 100755 public/gfx/stars_40.png mode change 100644 => 100755 public/gfx/stars_45.png mode change 100644 => 100755 public/gfx/stars_50.png mode change 100644 => 100755 public/gfx/yelp_logo.jpg mode change 100644 => 100755 public/global.css mode change 100644 => 100755 public/img/android-chrome-192x192.png mode change 100644 => 100755 public/img/android-chrome-512x512.png mode change 100644 => 100755 public/img/apple-touch-icon.png mode change 100644 => 100755 public/img/browserconfig.xml mode change 100644 => 100755 public/img/favicon-16x16.png mode change 100644 => 100755 public/img/favicon-32x32.png mode change 100644 => 100755 public/img/favicon.ico mode change 100644 => 100755 public/img/mstile-150x150.png mode change 100644 => 100755 public/img/safari-pinned-tab.svg mode change 100644 => 100755 public/index.html mode change 100644 => 100755 public/manifest.json mode change 100644 => 100755 public/service-worker.js mode change 100644 => 100755 rollup.config.js mode change 100644 => 100755 src/App.svelte mode change 100644 => 100755 src/components/Agenda.svelte mode change 100644 => 100755 src/components/AroundMe.svelte mode change 100644 => 100755 src/components/ByMe.svelte mode change 100644 => 100755 src/components/ClosestItem.svelte mode change 100644 => 100755 src/components/Debug.svelte mode change 100644 => 100755 src/components/Greeter.svelte mode change 100644 => 100755 src/components/Header.svelte mode change 100644 => 100755 src/components/LatestNews.svelte mode change 100644 => 100755 src/components/LineLoader.svelte mode change 100644 => 100755 src/components/NearbyPlaces.svelte mode change 100644 => 100755 src/components/NewsCard.svelte mode change 100644 => 100755 src/components/NewsItem.svelte mode change 100644 => 100755 src/components/Spinner.svelte mode change 100644 => 100755 src/components/Traffic.svelte mode change 100644 => 100755 src/components/UpcomingEvents.svelte mode change 100644 => 100755 src/components/Weather.svelte mode change 100644 => 100755 src/components/WeatherAlert.svelte mode change 100644 => 100755 src/components/forecast/Currently.svelte mode change 100644 => 100755 src/components/forecast/Daylight.svelte mode change 100644 => 100755 src/components/forecast/ForecastDetails.svelte mode change 100644 => 100755 src/components/forecast/TodaysForecast.svelte mode change 100644 => 100755 src/components/venue/VenueMap.svelte mode change 100644 => 100755 src/css/bronze.scss mode change 100644 => 100755 src/css/bronze/_small.scss mode change 100644 => 100755 src/css/bronze/_xlarge.scss mode change 100644 => 100755 src/css/bronze/base.scss mode change 100644 => 100755 src/css/bronze/button.scss mode change 100644 => 100755 src/css/bronze/cards.scss mode change 100644 => 100755 src/css/bronze/custom.scss mode change 100644 => 100755 src/css/bronze/dropdown.scss mode change 100644 => 100755 src/css/bronze/forms.scss mode change 100644 => 100755 src/css/bronze/grid.scss mode change 100644 => 100755 src/css/bronze/list.scss mode change 100644 => 100755 src/css/bronze/margin.scss mode change 100644 => 100755 src/css/bronze/modal.scss mode change 100644 => 100755 src/css/bronze/mouse.scss mode change 100644 => 100755 src/css/bronze/navbar.scss mode change 100644 => 100755 src/css/bronze/padding.scss mode change 100644 => 100755 src/css/bronze/panel.scss mode change 100644 => 100755 src/css/bronze/table.scss mode change 100644 => 100755 src/css/bronze/text.scss mode change 100644 => 100755 src/css/common.css mode change 100644 => 100755 src/css/global-navbar.scss mode change 100644 => 100755 src/css/global.scss mode change 100644 => 100755 src/css/horscroll.scss mode change 100644 => 100755 src/css/jubilee.scss mode change 100644 => 100755 src/css/lineloader.scss mode change 100644 => 100755 src/css/nord.scss mode change 100644 => 100755 src/css/spinner.scss mode change 100644 => 100755 src/css/temprature.scss mode change 100644 => 100755 src/css/viewport.scss mode change 100644 => 100755 src/css/weather.scss mode change 100644 => 100755 src/fonts/fonts.css mode change 100644 => 100755 src/fonts/fujicons.css mode change 100644 => 100755 src/fonts/weather-icons.css mode change 100644 => 100755 src/lib/location.js mode change 100644 => 100755 src/lib/reducers.js mode change 100644 => 100755 src/lib/utils.js mode change 100644 => 100755 src/main.js mode change 100644 => 100755 src/pages/Home.svelte mode change 100644 => 100755 src/pages/NearbyLocationsPage.svelte mode change 100644 => 100755 src/pages/NewsItemPage.svelte mode change 100644 => 100755 src/pages/NotFound.svelte mode change 100644 => 100755 src/pages/VenueDetailsPage.svelte mode change 100644 => 100755 src/pages/WeatherPage.svelte mode change 100644 => 100755 src/pages/test.svelte mode change 100644 => 100755 src/routes.js mode change 100644 => 100755 src/store/globalState.js mode change 100644 => 100755 src/tempPages/Home.Old.svelte mode change 100644 => 100755 src/tempPages/NewsListPage.svelte create mode 100755 sunlight-opt.svg create mode 100755 sunlight.svg diff --git a/.eslintrc.json b/.eslintrc.json old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index da93220..0978884 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,10 @@ /node_modules/ -/public/build/ +# /public/build/ .DS_Store + +.idea/ +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries diff --git a/.idea/.gitignore b/.idea/.gitignore old mode 100644 new mode 100755 diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml old mode 100644 new mode 100755 diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml old mode 100644 new mode 100755 diff --git a/.idea/misc.xml b/.idea/misc.xml old mode 100644 new mode 100755 diff --git a/.idea/modules.xml b/.idea/modules.xml old mode 100644 new mode 100755 diff --git a/.idea/svelte-jubilee.iml b/.idea/svelte-jubilee.iml old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/favicon.png b/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..de31afd48b525d5d90034aad1832c1a9c9861f1b GIT binary patch literal 367054 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

w|+cgIg78_7c8^4 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 rx6LW3TptlDAx`W+ScfyVkDxtWz@E1}nI!iGv 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

$u<` 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.5 0", - "rimraf": "2" - } - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -1422,12 +1548,12 @@ } }, "globule": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", - "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "requires": { "glob": "~7.1.1", - "lodash": "~4.17.12", + "lodash": "~4.17.10", "minimatch": "~3.0.2" } }, @@ -1436,18 +1562,43 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } }, "has-ansi": { @@ -1468,7 +1619,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-unicode": { "version": "2.0.1", @@ -1523,6 +1675,11 @@ "zero-fill": "^2.2.3" } }, + "highlight.js": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.3.2.tgz", + "integrity": "sha512-3jRT7OUYsVsKvukNKZCtnvRcFyCJqSEIuIMsEybAXRiFSwpt65qjPd/Pr+UOdYt7WJlt+lj3+ypUsHiySBp/Jw==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -1570,9 +1727,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1585,11 +1742,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" - }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -1618,87 +1770,10 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "is": { "version": "0.2.7", @@ -1732,9 +1807,9 @@ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { @@ -1765,12 +1840,12 @@ "dev": true }, "is-reference": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", - "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { - "@types/estree": "0.0.39" + "@types/estree": "*" } }, "is-stream": { @@ -1804,6 +1879,15 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", @@ -1819,30 +1903,37 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "js-base64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", - "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" }, "js-tokens": { "version": "4.0.0", @@ -1850,9 +1941,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1909,6 +2000,11 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "leaflet": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.7.1.tgz", + "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" + }, "level-blobs": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", @@ -2111,13 +2207,23 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "dev": true, + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" } }, "livereload": { @@ -2133,9 +2239,9 @@ } }, "livereload-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", - "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz", + "integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==", "dev": true }, "load-json-file": { @@ -2151,17 +2257,24 @@ } }, "local-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", - "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", + "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==" }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } } }, "lodash": { @@ -2169,10 +2282,15 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "log4js": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.2.1.tgz", - "integrity": "sha512-7n+Oqxxz7VcQJhIlqhcYZBTpbcQ7XsR0MUIfJkx/n3VUjkAS4iUr+4UJlhxf28RvP9PMGQXbgTUhLApnu0XXgA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "requires": { "date-format": "^3.0.0", "debug": "^4.1.1", @@ -2198,21 +2316,17 @@ "signal-exit": "^3.0.0" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", "dev": true }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -2226,6 +2340,16 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" + }, + "marked": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.4.tgz", + "integrity": "sha512-6x5TFGCTKSQBLTZtOburGxCxFEBJEGYVLwCMTBCxzvyuisGcC20UNzDSJhCr/cJ/Kmh6ulfJm10g6WWEAJ3kvg==" + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -2271,9 +2395,9 @@ } }, "mime": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", - "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "mime-db": { "version": "1.44.0", @@ -2288,17 +2412,16 @@ "mime-db": "1.44.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, - "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", - "dev": true + "mingo": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/mingo/-/mingo-1.3.3.tgz", + "integrity": "sha1-aSLE0Ufvx3GgFCWixMj3eER4xUY=" }, "minimalistic-assert": { "version": "1.0.1", @@ -2325,6 +2448,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -2334,9 +2474,9 @@ } }, "mri": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", - "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==" }, "ms": { "version": "2.1.2", @@ -2351,16 +2491,16 @@ "react-addons-shallow-compare": "^15.6.2" } }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanoid": { + "version": "3.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.16.tgz", + "integrity": "sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==", + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -2368,11 +2508,10 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node-fetch": { "version": "1.7.3", @@ -2384,53 +2523,66 @@ } }, "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" }, "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } } } }, "node-releases": { - "version": "1.1.54", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.54.tgz", - "integrity": "sha512-tLzytKpgwKQr37yw9CEODjNM9lnmsNxzlv575GzOZ16AgMvPcJis/DgrJX4UEV1KIYoXk6XoVfY6YaMOPJESAQ==" + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" }, "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz", + "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", + "cross-spawn": "^7.0.3", "gaze": "^1.0.0", "get-stdin": "^4.0.1", "glob": "^7.0.3", - "in-publish": "^2.0.0", "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", "nan": "^2.13.2", - "node-gyp": "^3.8.0", + "node-gyp": "^7.1.0", "npmlog": "^4.0.0", "request": "^2.88.0", "sass-graph": "2.2.5", @@ -2461,14 +2613,33 @@ } }, "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2481,13 +2652,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } } } }, "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { "abbrev": "1" } @@ -2577,74 +2756,46 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "opts": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", - "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -2678,9 +2829,12 @@ } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } }, "path-is-absolute": { "version": "1.0.1", @@ -2688,9 +2842,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -2708,6 +2862,14 @@ "pinkie-promise": "^2.0.0" } }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -2750,32 +2912,16 @@ "pinkie": "^2.0.0" } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" - } - }, "postcss": { - "version": "7.0.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.29.tgz", - "integrity": "sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==", + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.7.tgz", + "integrity": "sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ==", + "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.16", + "source-map": "^0.6.1" } }, "postcss-value-parser": { @@ -2784,11 +2930,16 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==" + }, "process-es6": { "version": "0.11.6", "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", @@ -2803,8 +2954,7 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "7.3.1", @@ -2820,11 +2970,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -2899,25 +3044,6 @@ "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - } } }, "readable-stream": { @@ -2935,18 +3061,26 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "redaxios": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/redaxios/-/redaxios-0.2.0.tgz", - "integrity": "sha512-lrDld2bVWIBrW+S1HPMyP8OvEtpHPIfmXyW7T7xTox1SM4/M3aC5X55xa2vRR3LZHwCvpMQAgCye8IyICzkKpA==" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/redaxios/-/redaxios-0.3.0.tgz", + "integrity": "sha512-9C4Wvdp/jn4wwBCGMntqu0JCAw+Kfr/uGfMR+JwC0Bg94ORTRzo2dPdHSIPxwSE9/4ORYKmOjhH28mHiuzZSJA==" }, "redent": { "version": "1.0.0", @@ -2973,9 +3107,9 @@ "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==" }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "repeating": { @@ -3050,16 +3184,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "rfdc": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", @@ -3069,6 +3193,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -3084,20 +3209,18 @@ } }, "rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "version": "2.33.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.33.2.tgz", + "integrity": "sha512-QPQ6/fWCrzHtSXkI269rhKaC7qXGghYBwXU04b1JsDZ6ibZa3DJ9D1SFAYRMgx1inDg0DaTbb3N4Z1NK/r3fhw==", "dev": true, "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" + "fsevents": "~2.1.2" } }, "rollup-plugin-livereload": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz", - "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", + "integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==", "dev": true, "requires": { "livereload": "^0.9.1" @@ -3162,9 +3285,9 @@ } }, "rollup-plugin-svelte": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.1.tgz", - "integrity": "sha512-wc93cN66sRpX6uFljVFqvWT6NU3V5ab/uLXKt2UiARuexFU/ctolzkmdXM7WM5iKdTX9scToS9sabJTJV4DUMA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz", + "integrity": "sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==", "dev": true, "requires": { "require-relative": "^0.8.7", @@ -3173,16 +3296,15 @@ } }, "rollup-plugin-terser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", - "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", - "serialize-javascript": "^2.1.2", - "terser": "^4.6.2" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" } }, "rollup-pluginutils": { @@ -3193,25 +3315,10 @@ "estree-walker": "^0.6.1" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "sade": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz", - "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", "requires": { "mri": "^1.1.0" } @@ -3237,6 +3344,17 @@ "yargs": "^13.3.2" } }, + "save": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/save/-/save-2.4.0.tgz", + "integrity": "sha512-wd5L2uVnsKYkIUaK6i8Ie66IOHaI328gMF0MPuTJtYOjXgUolC33LSIk7Qr8WVA55QHaGwfiVS8a7EFIeGOR3w==", + "requires": { + "async": "^2.6.2", + "event-stream": "^4.0.1", + "lodash.assign": "^4.2.0", + "mingo": "1" + } + }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", @@ -3256,17 +3374,24 @@ } } }, + "semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "set-blocking": { "version": "2.0.0", @@ -3289,45 +3414,57 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "sirv": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.2.tgz", - "integrity": "sha512-dQbZnsMaIiTQPZmbGmktz+c74zt/hyrJEB4tdp2Jj0RNv9J6B/OWR5RyrZEvIn9fyh9Zlg2OlE2XzKz6wMKGAw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.7.tgz", + "integrity": "sha512-QMT2OTD3CTr8de9VByPmvSEeyt6k8/Cxg0J2kQJ5HNhIWfhFg9ypcIWWzez9rPWnGj+WtJ7AZD/MdT/vdilV/A==", "requires": { - "@polka/url": "^0.5.0", - "mime": "^2.3.1" + "@polka/url": "^1.0.0-next.9", + "mime": "^2.3.1", + "totalist": "^1.0.0" } }, "sirv-cli": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.5.tgz", - "integrity": "sha512-Fl6icSm0EwPrXSGid2xphMp//WNTSX2yENRAGnJuuZNmdc8LvE/BtdZD3MPn28ifAfDqTMwbB3dpcZojAIOiBg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.8.tgz", + "integrity": "sha512-bJI+kkzQvMKfAOfgLzv09kWsdymLm39LgKmGjacB19GHIAQLCvXXg8e8HzcofTjDZlA8zVv4dQjU9SWkNzkJhw==", "requires": { "console-clear": "^1.1.0", "get-port": "^3.2.0", "kleur": "^3.0.0", "local-access": "^1.0.1", - "sade": "^1.4.0", - "sirv": "^0.4.2", + "sade": "^1.6.0", + "semiver": "^1.0.0", + "sirv": "^1.0.7", "tinydate": "^1.0.0" } }, @@ -3340,14 +3477,6 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } } }, "source-map": { @@ -3371,9 +3500,9 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3385,18 +3514,26 @@ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } }, "sprintf-js": { "version": "1.0.3", @@ -3428,6 +3565,15 @@ "readable-stream": "^2.0.1" } }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "streamroller": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", @@ -3452,25 +3598,14 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "string_decoder": { @@ -3514,29 +3649,30 @@ } }, "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } }, "svelte": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.22.2.tgz", - "integrity": "sha512-DxumO0+vvHA6NSc2jtVty08I8lFI43q8P2zX6JxZL8J1kqK5NVjad6TRM/twhnWXC+QScnwkZ15O6X1aTsEKTA==", + "version": "3.29.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.29.7.tgz", + "integrity": "sha512-rx0g311kBODvEWUU01DFBUl3MJuJven04bvTVFUG/w0On/wuj0PajQY/QlXcJndFxG+W1s8iXKaB418tdHWc3A==", "dev": true }, "svelte-preprocess": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-3.7.4.tgz", - "integrity": "sha512-0nW7TIjbav2nmw1Y7EAFRRkhNVwJ3zKN85/eITLQMkPuhqHO2i2IK0O3y4YXsSXlc0VGI5jQDVXkcXpga6zzew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.6.0.tgz", + "integrity": "sha512-kJwcU71+yw3KKMgGu9eHZMJVBSkW4VfGJ5LSMgFQP/XcwvY2QUV6JcyBoQTjJm+h1KRlo/WGDo6A7+7e+B8B4A==", "dev": true, "requires": { "@types/pug": "^2.0.4", @@ -3546,9 +3682,9 @@ } }, "svelte-spa-router": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-2.1.0.tgz", - "integrity": "sha512-9bcQPTQ6A+Z92Z+NirVVusa/Sw6nqzKwZAKfu1Cl6+XjStf12hfIcPoMfTutEBoX0Ik+z7gJbJ934PKk94BvCg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-3.0.5.tgz", + "integrity": "sha512-MewNP2IoKcnFBZ5Ni1Ntrow+Enx2rS2lY9hGOWE0ZIHGf/8AhUhpoHQ7a5iv0cAIEUxYVJ480X9GIEURsjfDGA==", "requires": { "regexparam": "1.3.0" } @@ -3563,52 +3699,45 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } } }, "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } } }, "terser": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.13.tgz", - "integrity": "sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.4.0.tgz", + "integrity": "sha512-3dZunFLbCJis9TAF2VnX+VrQLctRUmt1p3W2kCsJuZE4ZgWqh//+1MZ62EanewrqKoUf4zIaDGZAvml4UDc0OQ==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, "text-table": { @@ -3620,22 +3749,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tinydate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz", - "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==" }, "to-regex-range": { "version": "5.0.1", @@ -3646,6 +3765,11 @@ "is-number": "^7.0.0" } }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -3668,12 +3792,6 @@ "glob": "^7.1.2" } }, - "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3688,12 +3806,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { @@ -3714,11 +3832,79 @@ "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", "dev": true }, + "typedoc": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.19.2.tgz", + "integrity": "sha512-oDEg1BLEzi1qvgdQXc658EYgJ5qJLVSeZ0hQ57Eq4JXy6Vj2VX4RVo18qYxRWz75ifAaYuYNBUCnbhjd37TfOg==", + "requires": { + "fs-extra": "^9.0.1", + "handlebars": "^4.7.6", + "highlight.js": "^10.2.0", + "lodash": "^4.17.20", + "lunr": "^2.3.9", + "marked": "^1.1.1", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "semver": "^7.3.2", + "shelljs": "^0.8.4", + "typedoc-default-themes": "^0.11.4" + }, + "dependencies": { + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + } + } + }, + "typedoc-default-themes": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.11.4.tgz", + "integrity": "sha512-Y4Lf+qIb9NTydrexlazAM46SSLrmrQRqWiD52593g53SsmUFioAsMWt8m834J6qsp+7wHRjxCXSZeiiW5cMUdw==" + }, "ua-parser-js": { "version": "0.7.21", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" }, + "uglify-js": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.6.tgz", + "integrity": "sha512-oASI1FOJ7BBFkSCNDZ446EgkSuHkOZBuqRFrwXIKWCoXw8ZXQETooTQjkAcBS03Acab7ubCKsXnwuV2svy061g==", + "optional": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -3743,9 +3929,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "validate-npm-package-license": { @@ -3779,9 +3965,10 @@ "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -3834,6 +4021,11 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -3901,9 +4093,9 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "13.3.2", @@ -3940,36 +4132,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json old mode 100644 new mode 100755 index f9d5cf2..6488eb5 --- a/package.json +++ b/package.json @@ -7,31 +7,35 @@ "start": "sirv public" }, "devDependencies": { - "@rollup/plugin-commonjs": "^11.0.0", - "@rollup/plugin-node-resolve": "^7.0.0", - "eslint": "^6.8.0", + "@rollup/plugin-commonjs": "^16.0.0", + "@rollup/plugin-node-resolve": "^10.0.0", + "eslint": "^7.13.0", "eslint-plugin-svelte3": "^2.7.3", - "rollup": "^1.20.0", - "rollup-plugin-livereload": "^1.0.0", + "postcss": "^8.1.7", + "rollup": "^2.33.2", + "rollup-plugin-livereload": "^2.0.0", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-svelte": "^5.0.3", - "rollup-plugin-terser": "^5.1.2", - "svelte": "^3.0.0", - "svelte-preprocess": "^3.7.1" + "rollup-plugin-svelte": "^6.1.1", + "rollup-plugin-terser": "^7.0.2", + "svelte": "^3.29.7", + "svelte-preprocess": "^4.6.0" }, "dependencies": { - "autoprefixer": "^9.7.6", + "@rakh/utils": "^2.0.3", + "autoprefixer": "^10.0.2", "fecha": "^4.2.0", "hh-mm-ss": "^1.2.0", - "log4js": "^6.2.1", + "leaflet": "^1.7.1", + "log4js": "^6.3.0", "ms": "^2.1.2", "muicss": "^0.10.2", - "node-sass": "^4.14.1", + "node-sass": "^5.0.0", + "prettier": "^2.2.1", "qs": "^6.9.4", - "redaxios": "^0.2.0", + "redaxios": "^0.3.0", "rollup-plugin-replace": "^2.2.0", - "sirv-cli": "^0.4.4", - "svelte-spa-router": "^2.1.0" + "sirv-cli": "^1.0.8", + "svelte-spa-router": "^3.0.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100755 index 0000000..83fc7d1 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3484 @@ +dependencies: + '@rakh/utils': 2.0.3 + autoprefixer: 10.2.5_postcss@8.2.8 + fecha: 4.2.0 + hh-mm-ss: 1.2.0 + leaflet: 1.7.1 + log4js: 6.3.0 + ms: 2.1.3 + muicss: 0.10.3 + node-sass: 5.0.0 + prettier: 2.2.1 + qs: 6.10.1 + redaxios: 0.3.0 + rollup-plugin-replace: 2.2.0 + sirv-cli: 1.0.11 + svelte-spa-router: 3.1.0 +devDependencies: + '@rollup/plugin-commonjs': 16.0.0_rollup@2.42.2 + '@rollup/plugin-node-resolve': 10.0.0_rollup@2.42.2 + eslint: 7.22.0 + eslint-plugin-svelte3: 2.7.3_eslint@7.22.0+svelte@3.35.0 + postcss: 8.2.8 + rollup: 2.42.2 + rollup-plugin-livereload: 2.0.0 + rollup-plugin-node-builtins: 2.1.2 + rollup-plugin-node-globals: 1.4.0 + rollup-plugin-svelte: 6.1.1_rollup@2.42.2+svelte@3.35.0 + rollup-plugin-terser: 7.0.2_rollup@2.42.2 + svelte: 3.35.0 + svelte-preprocess: 4.6.9_770ff7fe4725c5f4aff9c89b5e091175 +lockfileVersion: 5.2 +packages: + /@babel/code-frame/7.12.11: + dependencies: + '@babel/highlight': 7.13.10 + dev: true + resolution: + integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + /@babel/code-frame/7.12.13: + dependencies: + '@babel/highlight': 7.13.10 + dev: true + resolution: + integrity: sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + /@babel/helper-validator-identifier/7.12.11: + dev: true + resolution: + integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + /@babel/highlight/7.13.10: + dependencies: + '@babel/helper-validator-identifier': 7.12.11 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + resolution: + integrity: sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + /@eslint/eslintrc/0.4.0: + dependencies: + ajv: 6.12.6 + debug: 4.3.1 + espree: 7.3.1 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + /@polka/url/1.0.0-next.11: + dev: false + resolution: + integrity: sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA== + /@rakh/utils/2.0.3: + dependencies: + save: 2.4.0 + typedoc: 0.19.2 + dev: false + resolution: + integrity: sha512-UJgNFi3Xwu6Zw8vpBmvuwWsf2iL0TyKWG3zNOS0FacgjNkrRV4TA2lWDOZiBSl9vkcs3xS/kuReuHGum5ZQZ7A== + /@rollup/plugin-commonjs/16.0.0_rollup@2.42.2: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.2 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.1.6 + is-reference: 1.2.1 + magic-string: 0.25.7 + resolve: 1.20.0 + rollup: 2.42.2 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^2.30.0 + resolution: + integrity: sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== + /@rollup/plugin-node-resolve/10.0.0_rollup@2.42.2: + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.42.2 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.42.2 + dev: true + engines: + node: '>= 10.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A== + /@rollup/pluginutils/3.1.0_rollup@2.42.2: + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.2.2 + rollup: 2.42.2 + dev: true + engines: + node: '>= 8.0.0' + peerDependencies: + rollup: ^1.20.0||^2.0.0 + resolution: + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + /@types/estree/0.0.39: + dev: true + resolution: + integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + /@types/estree/0.0.46: + dev: true + resolution: + integrity: sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + /@types/node/14.14.35: + dev: true + resolution: + integrity: sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== + /@types/pug/2.0.4: + dev: true + resolution: + integrity: sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI= + /@types/resolve/1.17.1: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + /@types/sass/1.16.0: + dependencies: + '@types/node': 14.14.35 + dev: true + resolution: + integrity: sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== + /abbrev/1.1.1: + dev: false + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /abstract-leveldown/0.12.4: + dependencies: + xtend: 3.0.0 + dev: true + resolution: + integrity: sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA= + /acorn-jsx/5.3.1_acorn@7.4.1: + dependencies: + acorn: 7.4.1 + dev: true + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + resolution: + integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + /acorn/5.7.4: + dev: true + engines: + node: '>=0.4.0' + hasBin: true + resolution: + integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + /acorn/7.4.1: + dev: true + engines: + node: '>=0.4.0' + hasBin: true + resolution: + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + /ajv/6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + resolution: + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + /ajv/7.2.3: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + resolution: + integrity: sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw== + /amdefine/1.0.1: + dev: false + engines: + node: '>=0.4.2' + resolution: + integrity: sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + /ansi-colors/4.1.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + /ansi-regex/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + /ansi-regex/4.1.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + /ansi-regex/5.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + /ansi-styles/2.2.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /ansi-styles/4.3.0: + dependencies: + color-convert: 2.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + /anymatch/3.1.1: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.2.2 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + /aproba/1.2.0: + dev: false + resolution: + integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + /are-we-there-yet/1.1.5: + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.7 + dev: false + resolution: + integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + /argparse/1.0.10: + dependencies: + sprintf-js: 1.0.3 + dev: true + resolution: + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + /array-find-index/1.0.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + /asn1.js/5.4.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + resolution: + integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + /asn1/0.2.4: + dependencies: + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /astral-regex/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + /async-foreach/0.1.3: + dev: false + resolution: + integrity: sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + /async/2.6.3: + dependencies: + lodash: 4.17.21 + dev: false + resolution: + integrity: sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /at-least-node/1.0.0: + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + /autoprefixer/10.2.5_postcss@8.2.8: + dependencies: + browserslist: 4.16.3 + caniuse-lite: 1.0.30001204 + colorette: 1.2.2 + fraction.js: 4.0.13 + normalize-range: 0.1.2 + postcss: 8.2.8 + postcss-value-parser: 4.1.0 + dev: false + engines: + node: ^10 || ^12 || >=14 + hasBin: true + peerDependencies: + postcss: ^8.1.0 + resolution: + integrity: sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA== + /aws-sign2/0.7.0: + dev: false + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.11.0: + dev: false + resolution: + integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + /balanced-match/1.0.0: + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + resolution: + integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /binary-extensions/2.2.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + /bl/0.8.2: + dependencies: + readable-stream: 1.0.34 + dev: true + resolution: + integrity: sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4= + /bn.js/4.12.0: + dev: true + resolution: + integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + /bn.js/5.2.0: + dev: true + resolution: + integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/3.0.2: + dependencies: + fill-range: 7.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + /brorand/1.1.0: + dev: true + resolution: + integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + /browserify-aes/1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + /browserify-cipher/1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + resolution: + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + /browserify-des/1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.0.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + /browserify-fs/1.0.0: + dependencies: + level-filesystem: 1.2.0 + level-js: 2.2.4 + levelup: 0.18.6 + dev: true + resolution: + integrity: sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8= + /browserify-rsa/4.1.0: + dependencies: + bn.js: 5.2.0 + randombytes: 2.1.0 + dev: true + resolution: + integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + /browserify-sign/4.2.1: + dependencies: + bn.js: 5.2.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + /browserslist/4.16.3: + dependencies: + caniuse-lite: 1.0.30001204 + colorette: 1.2.2 + electron-to-chromium: 1.3.693 + escalade: 3.1.1 + node-releases: 1.1.71 + dev: false + engines: + node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 + hasBin: true + resolution: + integrity: sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + /buffer-es6/4.9.3: + dev: true + resolution: + integrity: sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ= + /buffer-from/1.1.1: + dev: true + resolution: + integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + /buffer-xor/1.0.3: + dev: true + resolution: + integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + /builtin-modules/3.2.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== + /call-bind/1.0.2: + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + resolution: + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + /callsites/3.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + /camelcase-keys/2.1.0: + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + /camelcase/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + /camelcase/5.3.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + /caniuse-lite/1.0.30001204: + dev: false + resolution: + integrity: sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + /caseless/0.12.0: + dev: false + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chalk/1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chalk/4.1.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + /chokidar/3.5.1: + dependencies: + anymatch: 3.1.1 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.5.0 + dev: true + engines: + node: '>= 8.10.0' + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + /chownr/2.0.0: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + /cipher-base/1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + /cliui/5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: false + resolution: + integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + /clone/0.1.19: + dev: true + resolution: + integrity: sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU= + /code-point-at/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-convert/2.0.1: + dependencies: + color-name: 1.1.4 + dev: true + engines: + node: '>=7.0.0' + resolution: + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + /color-name/1.1.3: + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /color-name/1.1.4: + dev: true + resolution: + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + /colorette/1.2.2: + resolution: + integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /commander/2.20.3: + dev: true + resolution: + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + /commondir/1.0.1: + dev: true + resolution: + integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + /concat-map/0.0.1: + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /concat-stream/1.6.2: + dependencies: + buffer-from: 1.1.1 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: true + engines: + '0': node >= 0.8 + resolution: + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + /console-clear/1.1.1: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ== + /console-control-strings/1.1.0: + dev: false + resolution: + integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + /core-util-is/1.0.2: + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /create-ecdh/4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + resolution: + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + /create-hash/1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + resolution: + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + /create-hmac/1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + resolution: + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + /cross-spawn/7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + engines: + node: '>= 8' + resolution: + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + /crypto-browserify/3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.1 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.1 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + resolution: + integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + /currently-unhandled/0.4.1: + dependencies: + array-find-index: 1.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-mI3zP+qxke95mmE2nddsF635V+o= + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /date-format/2.1.0: + dev: false + engines: + node: '>=4.0' + resolution: + integrity: sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + /date-format/3.0.0: + dev: false + engines: + node: '>=4.0' + resolution: + integrity: sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + /debug/4.3.1: + dependencies: + ms: 2.1.2 + engines: + node: '>=6.0' + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + resolution: + integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + /decamelize/1.2.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + /deep-is/0.1.3: + dev: true + resolution: + integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + /deepmerge/4.2.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + /deferred-leveldown/0.2.0: + dependencies: + abstract-leveldown: 0.12.4 + dev: true + resolution: + integrity: sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ= + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + dev: false + resolution: + integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + /des.js/1.0.1: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + resolution: + integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + /detect-indent/6.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + /diffie-hellman/5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + resolution: + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + /doctrine/3.0.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + /duplexer/0.1.2: + dev: false + resolution: + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /electron-to-chromium/1.3.693: + dev: false + resolution: + integrity: sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag== + /elliptic/6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + resolution: + integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + /emoji-regex/7.0.3: + dev: false + resolution: + integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + /emoji-regex/8.0.0: + dev: true + resolution: + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + /enquirer/2.3.6: + dependencies: + ansi-colors: 4.1.1 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + /env-paths/2.2.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + /errno/0.1.8: + dependencies: + prr: 1.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + /error-ex/1.3.2: + dependencies: + is-arrayish: 0.2.1 + dev: false + resolution: + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + /escalade/3.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + /escape-string-regexp/1.0.5: + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /eslint-plugin-svelte3/2.7.3_eslint@7.22.0+svelte@3.35.0: + dependencies: + eslint: 7.22.0 + svelte: 3.35.0 + dev: true + peerDependencies: + eslint: '>=6.0.0' + svelte: ^3.2.0 + resolution: + integrity: sha512-p6HhxyICX9x/x+8WSy6AVk2bmv9ayoznoTSyCvK47th/k/07ksuJixMwbGX9qxJVAmPBaYMjEIMSEZtJHPIN7w== + /eslint-scope/5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + /eslint-utils/2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + /eslint-visitor-keys/1.3.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + /eslint-visitor-keys/2.0.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + /eslint/7.22.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.0 + ajv: 6.12.6 + chalk: 4.1.0 + cross-spawn: 7.0.3 + debug: 4.3.1 + doctrine: 3.0.0 + enquirer: 2.3.6 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.0.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.7.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.1 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash: 4.17.21 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.1.0 + semver: 7.3.4 + strip-ansi: 6.0.0 + strip-json-comments: 3.1.1 + table: 6.0.7 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + hasBin: true + resolution: + integrity: sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg== + /espree/7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.1_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + /esprima/4.0.1: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + /esquery/1.4.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + /esrecurse/4.3.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + /estraverse/4.3.0: + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + /estraverse/5.2.0: + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + /estree-walker/0.5.2: + dev: true + resolution: + integrity: sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== + /estree-walker/0.6.1: + resolution: + integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + /estree-walker/1.0.1: + dev: true + resolution: + integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + /estree-walker/2.0.2: + dev: true + resolution: + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + /esutils/2.0.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + /event-stream/4.0.1: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.0.7 + pause-stream: 0.0.11 + split: 1.0.1 + stream-combiner: 0.2.2 + through: 2.3.8 + dev: false + resolution: + integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA== + /evp_bytestokey/1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + /extend/3.0.2: + dev: false + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /fast-deep-equal/3.1.3: + resolution: + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + /fast-json-stable-stringify/2.1.0: + resolution: + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /fast-levenshtein/2.0.6: + dev: true + resolution: + integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + /fecha/4.2.0: + dev: false + resolution: + integrity: sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== + /file-entry-cache/6.0.1: + dependencies: + flat-cache: 3.0.4 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + /fill-range/7.0.1: + dependencies: + to-regex-range: 5.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + /find-up/1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + /find-up/3.0.0: + dependencies: + locate-path: 3.0.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + /flat-cache/3.0.4: + dependencies: + flatted: 3.1.1 + rimraf: 3.0.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + /flatted/2.0.2: + dev: false + resolution: + integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + /flatted/3.1.1: + dev: true + resolution: + integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + /foreach/2.0.5: + dev: true + resolution: + integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k= + /forever-agent/0.6.1: + dev: false + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.29 + dev: false + engines: + node: '>= 0.12' + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /fraction.js/4.0.13: + dev: false + resolution: + integrity: sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA== + /from/0.1.7: + dev: false + resolution: + integrity: sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= + /fs-extra/8.1.0: + dependencies: + graceful-fs: 4.2.6 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + engines: + node: '>=6 <7 || >=8' + resolution: + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + /fs-extra/9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.6 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + /fs-minipass/2.1.0: + dependencies: + minipass: 3.1.3 + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + /fs.realpath/1.0.0: + resolution: + integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + /fsevents/2.3.2: + dev: true + engines: + node: ^8.16.0 || ^10.6.0 || >=11.0.0 + optional: true + os: + - darwin + resolution: + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + /function-bind/1.1.1: + resolution: + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /functional-red-black-tree/1.0.1: + dev: true + resolution: + integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + /fwd-stream/1.0.4: + dependencies: + readable-stream: 1.0.34 + dev: true + resolution: + integrity: sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo= + /gauge/2.7.4: + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.3 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.3 + dev: false + resolution: + integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + /gaze/1.1.3: + dependencies: + globule: 1.3.2 + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + /get-caller-file/2.0.5: + dev: false + engines: + node: 6.* || 8.* || >= 10.* + resolution: + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + /get-intrinsic/1.1.1: + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.2 + dev: false + resolution: + integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + /get-port/3.2.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + /get-stdin/4.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /glob-parent/5.1.2: + dependencies: + is-glob: 4.0.1 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + /glob/7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + resolution: + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + /globals/12.4.0: + dependencies: + type-fest: 0.8.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + /globals/13.7.0: + dependencies: + type-fest: 0.20.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA== + /globule/1.3.2: + dependencies: + glob: 7.1.6 + lodash: 4.17.21 + minimatch: 3.0.4 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== + /graceful-fs/4.2.6: + dev: false + resolution: + integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + /handlebars/4.7.7: + dependencies: + minimist: 1.2.5 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + dev: false + engines: + node: '>=0.4.7' + hasBin: true + optionalDependencies: + uglify-js: 3.13.2 + resolution: + integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + deprecated: this library is no longer supported + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + /has-ansi/2.0.0: + dependencies: + ansi-regex: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + /has-flag/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-flag/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + /has-symbols/1.0.2: + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + /has-unicode/2.0.1: + dev: false + resolution: + integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + /has/1.0.3: + dependencies: + function-bind: 1.1.1 + engines: + node: '>= 0.4.0' + resolution: + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + /hash-base/3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.0 + safe-buffer: 5.2.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + /hash.js/1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + resolution: + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + /hh-mm-ss/1.2.0: + dependencies: + zero-fill: 2.2.4 + dev: false + resolution: + integrity: sha512-f4I9Hz1dLpX/3mrEs7yq30+FiuO3tt5NWAqAGeBTaoeoBfB8vhcQ3BphuDc5DjZb/K809agqrAaFlP0jhEU/8w== + /highlight.js/10.7.1: + dev: false + resolution: + integrity: sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA== + /hmac-drbg/1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + resolution: + integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + /hosted-git-info/2.8.8: + dev: false + resolution: + integrity: sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /idb-wrapper/1.7.2: + dev: true + resolution: + integrity: sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg== + /ignore/4.0.6: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + /import-fresh/3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + /imurmurhash/0.1.4: + dev: true + engines: + node: '>=0.8.19' + resolution: + integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /indent-string/2.1.0: + dependencies: + repeating: 2.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + /indexof/0.0.1: + dev: true + resolution: + integrity: sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + resolution: + integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.4: + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /interpret/1.4.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + /is-arrayish/0.2.1: + dev: false + resolution: + integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + /is-binary-path/2.1.0: + dependencies: + binary-extensions: 2.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + /is-core-module/2.2.0: + dependencies: + has: 1.0.3 + resolution: + integrity: sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + /is-extglob/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + /is-finite/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + /is-fullwidth-code-point/1.0.0: + dependencies: + number-is-nan: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + /is-fullwidth-code-point/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + /is-fullwidth-code-point/3.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + /is-glob/4.0.1: + dependencies: + is-extglob: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + /is-module/1.0.0: + dev: true + resolution: + integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + /is-number/7.0.0: + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + /is-object/0.1.2: + dev: true + resolution: + integrity: sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc= + /is-reference/1.2.1: + dependencies: + '@types/estree': 0.0.46 + dev: true + resolution: + integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + /is-typedarray/1.0.0: + dev: false + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-utf8/0.2.1: + dev: false + resolution: + integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + /is/0.2.7: + dev: true + resolution: + integrity: sha1-OzSixI81mXLzUEKEkZOucmS2NWI= + /isarray/0.0.1: + dev: true + resolution: + integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + /isarray/1.0.0: + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isbuffer/0.0.0: + dev: true + resolution: + integrity: sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s= + /isexe/2.0.0: + resolution: + integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isstream/0.1.2: + dev: false + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /jest-worker/26.6.2: + dependencies: + '@types/node': 14.14.35 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + engines: + node: '>= 10.13.0' + resolution: + integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + /js-base64/2.6.4: + dev: false + resolution: + integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + /js-tokens/4.0.0: + dev: true + resolution: + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + /js-yaml/3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + /jsbn/0.1.1: + dev: false + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /json-schema-traverse/0.4.1: + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema-traverse/1.0.0: + dev: true + resolution: + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + /json-schema/0.2.3: + dev: false + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stable-stringify-without-jsonify/1.0.1: + dev: true + resolution: + integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + /json-stringify-safe/5.0.1: + dev: false + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /jsonfile/4.0.0: + dev: false + optionalDependencies: + graceful-fs: 4.2.6 + resolution: + integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + /jsonfile/6.1.0: + dependencies: + universalify: 2.0.0 + dev: false + optionalDependencies: + graceful-fs: 4.2.6 + resolution: + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /kleur/3.0.3: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + /leaflet/1.7.1: + dev: false + resolution: + integrity: sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw== + /level-blobs/0.1.7: + dependencies: + level-peek: 1.0.6 + once: 1.4.0 + readable-stream: 1.1.14 + dev: true + resolution: + integrity: sha1-mrm5e7mfHtv594o0M+Ie1WOGva8= + /level-filesystem/1.2.0: + dependencies: + concat-stream: 1.6.2 + errno: 0.1.8 + fwd-stream: 1.0.4 + level-blobs: 0.1.7 + level-peek: 1.0.6 + level-sublevel: 5.2.3 + octal: 1.0.0 + once: 1.4.0 + xtend: 2.2.0 + dev: true + resolution: + integrity: sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M= + /level-fix-range/1.0.2: + dev: true + resolution: + integrity: sha1-vxW5Fa422EcMgh6IPd95zRZCCCg= + /level-fix-range/2.0.0: + dependencies: + clone: 0.1.19 + dev: true + resolution: + integrity: sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug= + /level-hooks/4.5.0: + dependencies: + string-range: 1.2.2 + dev: true + resolution: + integrity: sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM= + /level-js/2.2.4: + dependencies: + abstract-leveldown: 0.12.4 + idb-wrapper: 1.7.2 + isbuffer: 0.0.0 + ltgt: 2.2.1 + typedarray-to-buffer: 1.0.4 + xtend: 2.1.2 + dev: true + resolution: + integrity: sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc= + /level-peek/1.0.6: + dependencies: + level-fix-range: 1.0.2 + dev: true + resolution: + integrity: sha1-vsUccqgu5GTTNkNMfIdsP8vM538= + /level-sublevel/5.2.3: + dependencies: + level-fix-range: 2.0.0 + level-hooks: 4.5.0 + string-range: 1.2.2 + xtend: 2.0.6 + dev: true + resolution: + integrity: sha1-dEwSxy0ucr543eO5tc2E1iGRQTo= + /levelup/0.18.6: + dependencies: + bl: 0.8.2 + deferred-leveldown: 0.2.0 + errno: 0.1.8 + prr: 0.0.0 + readable-stream: 1.0.34 + semver: 2.3.2 + xtend: 3.0.0 + dev: true + resolution: + integrity: sha1-5qAcsIlhbI7MApHCqb0/DETj5es= + /levn/0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + /livereload-js/3.3.2: + dev: true + resolution: + integrity: sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA== + /livereload/0.9.3: + dependencies: + chokidar: 3.5.1 + livereload-js: 3.3.2 + opts: 2.0.2 + ws: 7.4.4 + dev: true + engines: + node: '>=8.0.0' + hasBin: true + resolution: + integrity: sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== + /load-json-file/1.1.0: + dependencies: + graceful-fs: 4.2.6 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + /local-access/1.1.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw== + /locate-path/3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + /lodash.assign/4.2.0: + dev: false + resolution: + integrity: sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + /lodash/4.17.21: + resolution: + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + /log4js/6.3.0: + dependencies: + date-format: 3.0.0 + debug: 4.3.1 + flatted: 2.0.2 + rfdc: 1.3.0 + streamroller: 2.2.4 + dev: false + engines: + node: '>=8.0' + resolution: + integrity: sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + /loud-rejection/1.6.0: + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.3 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + /lru-cache/6.0.0: + dependencies: + yallist: 4.0.0 + engines: + node: '>=10' + resolution: + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + /ltgt/2.2.1: + dev: true + resolution: + integrity: sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + /lunr/2.3.9: + dev: false + resolution: + integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + /magic-string/0.22.5: + dependencies: + vlq: 0.2.3 + dev: true + resolution: + integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + /magic-string/0.25.7: + dependencies: + sourcemap-codec: 1.4.8 + resolution: + integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + /map-obj/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + /map-stream/0.0.7: + dev: false + resolution: + integrity: sha1-ih8HiW2CsQkmvTdEokIACfiJdKg= + /marked/1.2.9: + dev: false + engines: + node: '>= 8.16.2' + hasBin: true + resolution: + integrity: sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw== + /md5.js/1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + /meow/3.7.0: + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.5 + normalize-package-data: 2.5.0 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + /merge-stream/2.0.0: + dev: true + resolution: + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + /miller-rabin/4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + hasBin: true + resolution: + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + /mime-db/1.46.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + /mime-types/2.1.29: + dependencies: + mime-db: 1.46.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + /mime/2.5.2: + dev: false + engines: + node: '>=4.0.0' + hasBin: true + resolution: + integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + /min-indent/1.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + /mingo/1.3.3: + dev: false + resolution: + integrity: sha1-aSLE0Ufvx3GgFCWixMj3eER4xUY= + /minimalistic-assert/1.0.1: + dev: true + resolution: + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + /minimalistic-crypto-utils/1.0.1: + dev: true + resolution: + integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /minimist/1.2.5: + dev: false + resolution: + integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + /minipass/3.1.3: + dependencies: + yallist: 4.0.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + /minizlib/2.1.2: + dependencies: + minipass: 3.1.3 + yallist: 4.0.0 + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + /mkdirp/0.5.5: + dependencies: + minimist: 1.2.5 + dev: false + hasBin: true + resolution: + integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + /mkdirp/1.0.4: + dev: false + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + /mri/1.1.6: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ== + /ms/2.1.2: + resolution: + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /ms/2.1.3: + dev: false + resolution: + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + /muicss/0.10.3: + dependencies: + react-addons-shallow-compare: 15.6.3 + dev: false + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0 + resolution: + integrity: sha512-CuVrxnns64RZogHhrAxpMw2BF74Mably9KGUwk5LxHkG1yXUGArf8ZWP8jYd1ueNplqIwgrRdkau8GgrmXTMUQ== + /nan/2.14.2: + dev: false + resolution: + integrity: sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + /nanoid/3.1.22: + dev: true + engines: + node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 + hasBin: true + resolution: + integrity: sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== + /natural-compare/1.4.0: + dev: true + resolution: + integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + /neo-async/2.6.2: + dev: false + resolution: + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + /node-gyp/7.1.2: + dependencies: + env-paths: 2.2.1 + glob: 7.1.6 + graceful-fs: 4.2.6 + nopt: 5.0.0 + npmlog: 4.1.2 + request: 2.88.2 + rimraf: 3.0.2 + semver: 7.3.4 + tar: 6.1.0 + which: 2.0.2 + dev: false + engines: + node: '>= 10.12.0' + hasBin: true + resolution: + integrity: sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + /node-releases/1.1.71: + dev: false + resolution: + integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + /node-sass/5.0.0: + dependencies: + async-foreach: 0.1.3 + chalk: 1.1.3 + cross-spawn: 7.0.3 + gaze: 1.1.3 + get-stdin: 4.0.1 + glob: 7.1.6 + lodash: 4.17.21 + meow: 3.7.0 + mkdirp: 0.5.5 + nan: 2.14.2 + node-gyp: 7.1.2 + npmlog: 4.1.2 + request: 2.88.2 + sass-graph: 2.2.5 + stdout-stream: 1.4.1 + true-case-path: 1.0.3 + dev: false + engines: + node: '>=10' + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw== + /nopt/5.0.0: + dependencies: + abbrev: 1.1.1 + dev: false + engines: + node: '>=6' + hasBin: true + resolution: + integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + /normalize-package-data/2.5.0: + dependencies: + hosted-git-info: 2.8.8 + resolve: 1.20.0 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: false + resolution: + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + /normalize-path/3.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /normalize-range/0.1.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + /npmlog/4.1.2: + dependencies: + are-we-there-yet: 1.1.5 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: false + resolution: + integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + /number-is-nan/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + /oauth-sign/0.9.0: + dev: false + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /object-inspect/1.9.0: + dev: false + resolution: + integrity: sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + /object-keys/0.2.0: + dependencies: + foreach: 2.0.5 + indexof: 0.0.1 + is: 0.2.7 + deprecated: Please update to the latest object-keys + dev: true + resolution: + integrity: sha1-zd7AKZiwkb5CvxA1rjLknxy26mc= + /object-keys/0.4.0: + dev: true + resolution: + integrity: sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + /octal/1.0.0: + dev: true + resolution: + integrity: sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws= + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + /optionator/0.9.1: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + /opts/2.0.2: + dev: true + resolution: + integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== + /p-limit/2.3.0: + dependencies: + p-try: 2.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + /p-locate/3.0.0: + dependencies: + p-limit: 2.3.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + /p-try/2.2.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + /parent-module/1.0.1: + dependencies: + callsites: 3.1.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + /parse-asn1/5.1.6: + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.1 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + /parse-json/2.2.0: + dependencies: + error-ex: 1.3.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + /path-exists/2.1.0: + dependencies: + pinkie-promise: 2.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + /path-exists/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + /path-is-absolute/1.0.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-key/3.1.1: + engines: + node: '>=8' + resolution: + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + /path-parse/1.0.6: + resolution: + integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + /path-type/1.1.0: + dependencies: + graceful-fs: 4.2.6 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + /pause-stream/0.0.11: + dependencies: + through: 2.3.8 + dev: false + resolution: + integrity: sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= + /pbkdf2/3.1.1: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + engines: + node: '>=0.12' + resolution: + integrity: sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + /performance-now/2.1.0: + dev: false + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /picomatch/2.2.2: + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + /pify/2.3.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + /pinkie-promise/2.0.1: + dependencies: + pinkie: 2.0.4 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o= + /pinkie/2.0.4: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + /postcss-value-parser/4.1.0: + dev: false + resolution: + integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + /postcss/8.2.8: + dependencies: + colorette: 1.2.2 + nanoid: 3.1.22 + source-map: 0.6.1 + dev: true + engines: + node: ^10 || ^12 || >=14 + resolution: + integrity: sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw== + /prelude-ls/1.2.1: + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + /prettier/2.2.1: + dev: false + engines: + node: '>=10.13.0' + hasBin: true + resolution: + integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + /process-es6/0.11.6: + dev: true + resolution: + integrity: sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g= + /process-nextick-args/2.0.1: + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /progress/2.0.3: + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + /prr/0.0.0: + dev: true + resolution: + integrity: sha1-GoS4WQgyVQFBGFPQCB7j+obikmo= + /prr/1.0.1: + dev: true + resolution: + integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY= + /psl/1.8.0: + dev: false + resolution: + integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + /public-encrypt/4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + /punycode/2.1.1: + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /qs/6.10.1: + dependencies: + side-channel: 1.0.4 + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + /qs/6.5.2: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /randombytes/2.1.0: + dependencies: + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + /randomfill/1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + /react-addons-shallow-compare/15.6.3: + dependencies: + object-assign: 4.1.1 + dev: false + resolution: + integrity: sha512-EDJbgKTtGRLhr3wiGDXK/+AEJ59yqGS+tKE6mue0aNXT6ZMR7VJbbzIiT6akotmHg1BLj46ElJSb+NBMp80XBg== + /read-pkg-up/1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + /read-pkg/1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + /readable-stream/1.0.34: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + resolution: + integrity: sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + /readable-stream/1.1.14: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: true + resolution: + integrity: sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + /readable-stream/2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + resolution: + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /readable-stream/3.6.0: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + /readdirp/3.5.0: + dependencies: + picomatch: 2.2.2 + dev: true + engines: + node: '>=8.10.0' + resolution: + integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + /rechoir/0.6.2: + dependencies: + resolve: 1.20.0 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + /redaxios/0.3.0: + dev: false + resolution: + integrity: sha512-9C4Wvdp/jn4wwBCGMntqu0JCAw+Kfr/uGfMR+JwC0Bg94ORTRzo2dPdHSIPxwSE9/4ORYKmOjhH28mHiuzZSJA== + /redent/1.0.0: + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + /regexparam/1.3.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g== + /regexpp/3.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + /repeating/2.0.1: + dependencies: + is-finite: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + /request/2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.29 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + /require-directory/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + /require-from-string/2.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + /require-main-filename/2.0.0: + dev: false + resolution: + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + /require-relative/0.8.7: + dev: true + resolution: + integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + /resolve-from/4.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + /resolve/1.20.0: + dependencies: + is-core-module: 2.2.0 + path-parse: 1.0.6 + resolution: + integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + /rfdc/1.3.0: + dev: false + resolution: + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + /rimraf/3.0.2: + dependencies: + glob: 7.1.6 + hasBin: true + resolution: + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + /ripemd160/2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + resolution: + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + /rollup-plugin-livereload/2.0.0: + dependencies: + livereload: 0.9.3 + dev: true + engines: + node: '>=8.3' + resolution: + integrity: sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A== + /rollup-plugin-node-builtins/2.1.2: + dependencies: + browserify-fs: 1.0.0 + buffer-es6: 4.9.3 + crypto-browserify: 3.12.0 + process-es6: 0.11.6 + dev: true + resolution: + integrity: sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k= + /rollup-plugin-node-globals/1.4.0: + dependencies: + acorn: 5.7.4 + buffer-es6: 4.9.3 + estree-walker: 0.5.2 + magic-string: 0.22.5 + process-es6: 0.11.6 + rollup-pluginutils: 2.8.2 + dev: true + resolution: + integrity: sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g== + /rollup-plugin-replace/2.2.0: + dependencies: + magic-string: 0.25.7 + rollup-pluginutils: 2.8.2 + deprecated: This module has moved and is now available at @rollup/plugin-replace. Please update your dependencies. This version is no longer maintained. + dev: false + resolution: + integrity: sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + /rollup-plugin-svelte/6.1.1_rollup@2.42.2+svelte@3.35.0: + dependencies: + require-relative: 0.8.7 + rollup: 2.42.2 + rollup-pluginutils: 2.8.2 + sourcemap-codec: 1.4.8 + svelte: 3.35.0 + dev: true + peerDependencies: + rollup: '>=1.19.2' + svelte: '*' + resolution: + integrity: sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow== + /rollup-plugin-terser/7.0.2_rollup@2.42.2: + dependencies: + '@babel/code-frame': 7.12.13 + jest-worker: 26.6.2 + rollup: 2.42.2 + serialize-javascript: 4.0.0 + terser: 5.6.1 + dev: true + peerDependencies: + rollup: ^2.0.0 + resolution: + integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + /rollup-pluginutils/2.8.2: + dependencies: + estree-walker: 0.6.1 + resolution: + integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + /rollup/2.42.2: + dev: true + engines: + node: '>=10.0.0' + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-o34Ar4rf01ky4EV1RFlTPd+tXICDz13a2o1PARLPFBxighJoPsxvliJTrULqjmIVpZP+JPm499ZPkvnPzRxUYA== + /sade/1.7.4: + dependencies: + mri: 1.1.6 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA== + /safe-buffer/5.1.2: + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.1: + resolution: + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + /safer-buffer/2.1.2: + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /sass-graph/2.2.5: + dependencies: + glob: 7.1.6 + lodash: 4.17.21 + scss-tokenizer: 0.2.3 + yargs: 13.3.2 + dev: false + hasBin: true + resolution: + integrity: sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + /save/2.4.0: + dependencies: + async: 2.6.3 + event-stream: 4.0.1 + lodash.assign: 4.2.0 + mingo: 1.3.3 + dev: false + resolution: + integrity: sha512-wd5L2uVnsKYkIUaK6i8Ie66IOHaI328gMF0MPuTJtYOjXgUolC33LSIk7Qr8WVA55QHaGwfiVS8a7EFIeGOR3w== + /scss-tokenizer/0.2.3: + dependencies: + js-base64: 2.6.4 + source-map: 0.4.4 + dev: false + resolution: + integrity: sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + /semiver/1.1.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg== + /semver/2.3.2: + dev: true + hasBin: true + resolution: + integrity: sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI= + /semver/5.7.1: + dev: false + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /semver/7.3.4: + dependencies: + lru-cache: 6.0.0 + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + /serialize-javascript/4.0.0: + dependencies: + randombytes: 2.1.0 + dev: true + resolution: + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + /set-blocking/2.0.0: + dev: false + resolution: + integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + /sha.js/2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + hasBin: true + resolution: + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + /shebang-command/2.0.0: + dependencies: + shebang-regex: 3.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + /shebang-regex/3.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + /shelljs/0.8.4: + dependencies: + glob: 7.1.6 + interpret: 1.4.0 + rechoir: 0.6.2 + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + /side-channel/1.0.4: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.9.0 + dev: false + resolution: + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + /signal-exit/3.0.3: + dev: false + resolution: + integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + /sirv-cli/1.0.11: + dependencies: + console-clear: 1.1.1 + get-port: 3.2.0 + kleur: 3.0.3 + local-access: 1.1.0 + sade: 1.7.4 + semiver: 1.1.0 + sirv: 1.0.11 + tinydate: 1.3.0 + dev: false + engines: + node: '>= 10' + hasBin: true + resolution: + integrity: sha512-L8NILoRSBd38VcfFcERYCaVCnWPBLo9G6u/a37UJ8Ysv4DfjizMbFBcM+SswNnndJienhR6qy8KFuAEaeL4g8Q== + /sirv/1.0.11: + dependencies: + '@polka/url': 1.0.0-next.11 + mime: 2.5.2 + totalist: 1.1.0 + dev: false + engines: + node: '>= 10' + resolution: + integrity: sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg== + /slice-ansi/4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + /source-map-support/0.5.19: + dependencies: + buffer-from: 1.1.1 + source-map: 0.6.1 + dev: true + resolution: + integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + /source-map/0.4.4: + dependencies: + amdefine: 1.0.1 + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-66T12pwNyZneaAMti092FzZSA2s= + /source-map/0.6.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /source-map/0.7.3: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + /sourcemap-codec/1.4.8: + resolution: + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + /spdx-correct/3.1.1: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.7 + dev: false + resolution: + integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + /spdx-exceptions/2.3.0: + dev: false + resolution: + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + /spdx-expression-parse/3.0.1: + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.7 + dev: false + resolution: + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + /spdx-license-ids/3.0.7: + dev: false + resolution: + integrity: sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + /split/1.0.1: + dependencies: + through: 2.3.8 + dev: false + resolution: + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + /sprintf-js/1.0.3: + dev: true + resolution: + integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + /sshpk/1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /stdout-stream/1.4.1: + dependencies: + readable-stream: 2.3.7 + dev: false + resolution: + integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + /stream-combiner/0.2.2: + dependencies: + duplexer: 0.1.2 + through: 2.3.8 + dev: false + resolution: + integrity: sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= + /streamroller/2.2.4: + dependencies: + date-format: 2.1.0 + debug: 4.3.1 + fs-extra: 8.1.0 + dev: false + engines: + node: '>=8.0' + resolution: + integrity: sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + /string-range/1.2.2: + dev: true + resolution: + integrity: sha1-qJPtNH5yKZvIO++78qaSqNI51d0= + /string-width/1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + /string-width/3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + /string-width/4.2.2: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + /string_decoder/0.10.31: + dev: true + resolution: + integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /string_decoder/1.3.0: + dependencies: + safe-buffer: 5.2.1 + dev: true + resolution: + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + /strip-ansi/5.2.0: + dependencies: + ansi-regex: 4.1.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + /strip-ansi/6.0.0: + dependencies: + ansi-regex: 5.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + /strip-bom/2.0.0: + dependencies: + is-utf8: 0.2.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + /strip-indent/1.0.1: + dependencies: + get-stdin: 4.0.1 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + /strip-indent/3.0.0: + dependencies: + min-indent: 1.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + /strip-json-comments/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + /supports-color/2.0.0: + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/7.2.0: + dependencies: + has-flag: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + /svelte-preprocess/4.6.9_770ff7fe4725c5f4aff9c89b5e091175: + dependencies: + '@types/pug': 2.0.4 + '@types/sass': 1.16.0 + detect-indent: 6.0.0 + node-sass: 5.0.0 + postcss: 8.2.8 + strip-indent: 3.0.0 + svelte: 3.35.0 + dev: true + engines: + node: '>= 9.11.2' + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.54.7 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + requiresBuild: true + resolution: + integrity: sha512-SROWH0rB0DJ+0Ii264cprmNu/NJyZacs5wFD71ya93Cg/oA2lKHgQm4F6j0EWA4ktFMzeuJJm/eX6fka39hEHA== + /svelte-spa-router/3.1.0: + dependencies: + regexparam: 1.3.0 + dev: false + resolution: + integrity: sha512-jlM/xwjn57mylr+pzHYCOOy+IPQauT46gOucNGTBu6jHcFXu3F+oaojN4PXC1LYizRGxFB6QA0qnYbZnRfX7Sg== + /svelte/3.35.0: + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g== + /table/6.0.7: + dependencies: + ajv: 7.2.3 + lodash: 4.17.21 + slice-ansi: 4.0.0 + string-width: 4.2.2 + dev: true + engines: + node: '>=10.0.0' + resolution: + integrity: sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + /tar/6.1.0: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.3 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + engines: + node: '>= 10' + resolution: + integrity: sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + /terser/5.6.1: + dependencies: + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.19 + dev: true + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== + /text-table/0.2.0: + dev: true + resolution: + integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + /through/2.3.8: + dev: false + resolution: + integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + /tinydate/1.3.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w== + /to-regex-range/5.0.1: + dependencies: + is-number: 7.0.0 + dev: true + engines: + node: '>=8.0' + resolution: + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + /totalist/1.1.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + /tough-cookie/2.5.0: + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /trim-newlines/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-WIeWa7WCpFA6QetST301ARgVphM= + /true-case-path/1.0.3: + dependencies: + glob: 7.1.6 + dev: false + resolution: + integrity: sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: false + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /type-check/0.4.0: + dependencies: + prelude-ls: 1.2.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + /type-fest/0.20.2: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + /type-fest/0.8.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + /typedarray-to-buffer/1.0.4: + dev: true + resolution: + integrity: sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw= + /typedarray/0.0.6: + dev: true + resolution: + integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + /typedoc-default-themes/0.11.4: + dev: false + engines: + node: '>= 8' + resolution: + integrity: sha512-Y4Lf+qIb9NTydrexlazAM46SSLrmrQRqWiD52593g53SsmUFioAsMWt8m834J6qsp+7wHRjxCXSZeiiW5cMUdw== + /typedoc/0.19.2: + dependencies: + fs-extra: 9.1.0 + handlebars: 4.7.7 + highlight.js: 10.7.1 + lodash: 4.17.21 + lunr: 2.3.9 + marked: 1.2.9 + minimatch: 3.0.4 + progress: 2.0.3 + semver: 7.3.4 + shelljs: 0.8.4 + typedoc-default-themes: 0.11.4 + dev: false + engines: + node: '>= 10.0.0' + hasBin: true + peerDependencies: + typescript: 3.9.x || 4.0.x + resolution: + integrity: sha512-oDEg1BLEzi1qvgdQXc658EYgJ5qJLVSeZ0hQ57Eq4JXy6Vj2VX4RVo18qYxRWz75ifAaYuYNBUCnbhjd37TfOg== + /uglify-js/3.13.2: + dev: false + engines: + node: '>=0.8.0' + hasBin: true + optional: true + resolution: + integrity: sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw== + /universalify/0.1.2: + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + /universalify/2.0.0: + dev: false + engines: + node: '>= 10.0.0' + resolution: + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + /uri-js/4.4.1: + dependencies: + punycode: 2.1.1 + resolution: + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + /util-deprecate/1.0.2: + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /uuid/3.4.0: + dev: false + hasBin: true + resolution: + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + /v8-compile-cache/2.3.0: + dev: true + resolution: + integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + /validate-npm-package-license/3.0.4: + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: false + resolution: + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /vlq/0.2.3: + dev: true + resolution: + integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + /which-module/2.0.0: + dev: false + resolution: + integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + /which/2.0.2: + dependencies: + isexe: 2.0.0 + engines: + node: '>= 8' + hasBin: true + resolution: + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + /wide-align/1.1.3: + dependencies: + string-width: 1.0.2 + dev: false + resolution: + integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + /word-wrap/1.2.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + /wordwrap/1.0.0: + dev: false + resolution: + integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + /wrap-ansi/5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + /wrappy/1.0.2: + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /ws/7.4.4: + dev: true + engines: + node: '>=8.3.0' + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + resolution: + integrity: sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + /xtend/2.0.6: + dependencies: + is-object: 0.1.2 + object-keys: 0.2.0 + dev: true + engines: + node: '>=0.4' + resolution: + integrity: sha1-XqZXptukRwacLlnFihE4ywxebO4= + /xtend/2.1.2: + dependencies: + object-keys: 0.4.0 + dev: true + engines: + node: '>=0.4' + resolution: + integrity: sha1-bv7MKk2tjmlixJAbM3znuoe10os= + /xtend/2.2.0: + dev: true + engines: + node: '>=0.4' + resolution: + integrity: sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + /xtend/3.0.0: + dev: true + engines: + node: '>=0.4' + resolution: + integrity: sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= + /y18n/4.0.1: + dev: false + resolution: + integrity: sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + /yallist/4.0.0: + resolution: + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + /yargs-parser/13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + resolution: + integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + /yargs/13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.1 + yargs-parser: 13.1.2 + dev: false + resolution: + integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + /zero-fill/2.2.4: + dev: false + resolution: + integrity: sha512-/N5GEDauLHz2uGnuJXWO1Wfib4EC+q4yp9C1jojM7RubwEKADqIqMcYpETMm1lRop403fi3v1qTOdgDE8DIOdw== +specifiers: + '@rakh/utils': ^2.0.3 + '@rollup/plugin-commonjs': ^16.0.0 + '@rollup/plugin-node-resolve': ^10.0.0 + autoprefixer: ^10.0.2 + eslint: ^7.13.0 + eslint-plugin-svelte3: ^2.7.3 + fecha: ^4.2.0 + hh-mm-ss: ^1.2.0 + leaflet: ^1.7.1 + log4js: ^6.3.0 + ms: ^2.1.2 + muicss: ^0.10.2 + node-sass: ^5.0.0 + postcss: ^8.1.7 + prettier: ^2.2.1 + qs: ^6.9.4 + redaxios: ^0.3.0 + rollup: ^2.33.2 + rollup-plugin-livereload: ^2.0.0 + rollup-plugin-node-builtins: ^2.1.2 + rollup-plugin-node-globals: ^1.4.0 + rollup-plugin-replace: ^2.2.0 + rollup-plugin-svelte: ^6.1.1 + rollup-plugin-terser: ^7.0.2 + sirv-cli: ^1.0.8 + svelte: ^3.29.7 + svelte-preprocess: ^4.6.0 + svelte-spa-router: ^3.0.5 diff --git a/public/browserconfig.xml b/public/browserconfig.xml old mode 100644 new mode 100755 diff --git a/public/build/bundle.css b/public/build/bundle.css new file mode 100755 index 0000000..11281e6 --- /dev/null +++ b/public/build/bundle.css @@ -0,0 +1,14 @@ +@charset "UTF-8";@import url(./fonts/fujicons.css);@import url(./fonts/fonts.css);@import url(./fonts/weather-icons.css);:root{--primary-color:mui-color('yellow', '500');--dark-color:#294c5d;--light-color:#CFD8DC;--danger-color:#dc3545;--success-color:#28a745;--highlight-color:#dcc894;--highlight-color2:#dca394;--navbar-height:4rem}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}html{-webkit-tap-highlight-color:rgba(0, 0, 0, 0)}body{font-family:"Roboto", "Helvetica Neue", Helvetica, Arial, Verdana, "Trebuchet MS";font-size:14px;font-weight:400;line-height:1.429;color:rgba(0, 0, 0, 0.87);background-color:#FFF}a{color:#F57F17;text-decoration:none}a:hover,a:focus{text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}p{margin:0 0 10px}ul,ol{margin-top:0;margin-bottom:10px}hr{margin-top:20px;margin-bottom:20px;border:0;height:1px;background-color:rgba(0, 0, 0, 0.12)}strong{font-weight:700}abbr[title]{cursor:help;-webkit-text-decoration-color:#FFEB3B;text-decoration-color:#FFEB3B}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}.mui--appbar-height{height:56px}.mui--appbar-min-height,.mui-appbar{min-height:56px}.mui--appbar-line-height{line-height:56px}.mui--appbar-top{top:56px}@media(orientation: landscape) and (max-height: 480px){.mui--appbar-height{height:48px}.mui--appbar-min-height,.mui-appbar{min-height:48px}.mui--appbar-line-height{line-height:48px}.mui--appbar-top{top:48px}}@media(min-width: 480px){.mui--appbar-height{height:64px}.mui--appbar-min-height,.mui-appbar{min-height:64px}.mui--appbar-line-height{line-height:64px}.mui--appbar-top{top:64px}}.mui-appbar{background-color:#FFEB3B;color:#000}.mui-btn{font-weight:500;font-size:14px;line-height:18px;text-transform:uppercase;color:rgba(0, 0, 0, 0.87);background-color:#FFF;transition:all 0.2s ease-in-out;display:inline-block;height:36px;padding:0 26px;margin:6px 0;border:none;border-radius:2px;cursor:pointer;touch-action:manipulation;background-image:none;text-align:center;line-height:36px;vertical-align:middle;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px;font-family:inherit;letter-spacing:0.03em;position:relative;overflow:hidden}.mui-btn:hover,.mui-btn:focus,.mui-btn:active{color:rgba(0, 0, 0, 0.87);background-color:white}.mui-btn[disabled]:hover,.mui-btn[disabled]:focus,.mui-btn[disabled]:active{color:rgba(0, 0, 0, 0.87);background-color:#FFF}.mui-btn.mui-btn--flat{color:rgba(0, 0, 0, 0.87);background-color:transparent}.mui-btn.mui-btn--flat:hover,.mui-btn.mui-btn--flat:focus,.mui-btn.mui-btn--flat:active{color:rgba(0, 0, 0, 0.87);background-color:#f2f2f2}.mui-btn.mui-btn--flat[disabled]:hover,.mui-btn.mui-btn--flat[disabled]:focus,.mui-btn.mui-btn--flat[disabled]:active{color:rgba(0, 0, 0, 0.87);background-color:transparent}.mui-btn:hover,.mui-btn:focus,.mui-btn:active{outline:0;text-decoration:none;color:rgba(0, 0, 0, 0.87)}.mui-btn:hover,.mui-btn:focus{box-shadow:0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-btn:hover,.mui-btn:focus{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}}@supports (-ms-ime-align: auto){.mui-btn:hover,.mui-btn:focus{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}}.mui-btn:active:hover{box-shadow:0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-btn:active:hover{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}}@supports (-ms-ime-align: auto){.mui-btn:active:hover{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}}.mui-btn:disabled,.mui-btn.mui--is-disabled{cursor:not-allowed;pointer-events:none;opacity:0.60;box-shadow:none}.mui-btn + .mui-btn{margin-left:8px}.mui-btn--flat{background-color:transparent}.mui-btn--flat:hover,.mui-btn--flat:focus,.mui-btn--flat:active,.mui-btn--flat:active:hover{box-shadow:none;background-color:#f2f2f2}.mui-btn--raised,.mui-btn--fab{box-shadow:0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-btn--raised,.mui-btn--fab{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}}@supports (-ms-ime-align: auto){.mui-btn--raised,.mui-btn--fab{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 2px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.2)}}.mui-btn--raised:active,.mui-btn--fab:active{box-shadow:0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-btn--raised:active,.mui-btn--fab:active{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}}@supports (-ms-ime-align: auto){.mui-btn--raised:active,.mui-btn--fab:active{box-shadow:0 -1px 2px rgba(0, 0, 0, 0.12), -1px 0px 2px rgba(0, 0, 0, 0.12), 0 0px 4px rgba(0, 0, 0, 0.12), 1px 3px 4px rgba(0, 0, 0, 0.2)}}.mui-btn--fab{position:relative;padding:0;width:55px;height:55px;line-height:55px;border-radius:50%;z-index:1}.mui-btn--primary{color:#FFF;background-color:#FFEB3B}.mui-btn--primary:hover,.mui-btn--primary:focus,.mui-btn--primary:active{color:#FFF;background-color:#ffee55}.mui-btn--primary[disabled]:hover,.mui-btn--primary[disabled]:focus,.mui-btn--primary[disabled]:active{color:#FFF;background-color:#FFEB3B}.mui-btn--primary.mui-btn--flat{color:#FFEB3B;background-color:transparent}.mui-btn--primary.mui-btn--flat:hover,.mui-btn--primary.mui-btn--flat:focus,.mui-btn--primary.mui-btn--flat:active{color:#FFEB3B;background-color:#f2f2f2}.mui-btn--primary.mui-btn--flat[disabled]:hover,.mui-btn--primary.mui-btn--flat[disabled]:focus,.mui-btn--primary.mui-btn--flat[disabled]:active{color:#FFEB3B;background-color:transparent}.mui-btn--dark{color:#FFF;background-color:#424242}.mui-btn--dark:hover,.mui-btn--dark:focus,.mui-btn--dark:active{color:#FFF;background-color:#4f4f4f}.mui-btn--dark[disabled]:hover,.mui-btn--dark[disabled]:focus,.mui-btn--dark[disabled]:active{color:#FFF;background-color:#424242}.mui-btn--dark.mui-btn--flat{color:#424242;background-color:transparent}.mui-btn--dark.mui-btn--flat:hover,.mui-btn--dark.mui-btn--flat:focus,.mui-btn--dark.mui-btn--flat:active{color:#424242;background-color:#f2f2f2}.mui-btn--dark.mui-btn--flat[disabled]:hover,.mui-btn--dark.mui-btn--flat[disabled]:focus,.mui-btn--dark.mui-btn--flat[disabled]:active{color:#424242;background-color:transparent}.mui-btn--danger{color:#FFF;background-color:#F44336}.mui-btn--danger:hover,.mui-btn--danger:focus,.mui-btn--danger:active{color:#FFF;background-color:#f55a4e}.mui-btn--danger[disabled]:hover,.mui-btn--danger[disabled]:focus,.mui-btn--danger[disabled]:active{color:#FFF;background-color:#F44336}.mui-btn--danger.mui-btn--flat{color:#F44336;background-color:transparent}.mui-btn--danger.mui-btn--flat:hover,.mui-btn--danger.mui-btn--flat:focus,.mui-btn--danger.mui-btn--flat:active{color:#F44336;background-color:#f2f2f2}.mui-btn--danger.mui-btn--flat[disabled]:hover,.mui-btn--danger.mui-btn--flat[disabled]:focus,.mui-btn--danger.mui-btn--flat[disabled]:active{color:#F44336;background-color:transparent}.mui-btn--accent{color:#FFF;background-color:#311B92}.mui-btn--accent:hover,.mui-btn--accent:focus,.mui-btn--accent:active{color:#FFF;background-color:#381fa8}.mui-btn--accent[disabled]:hover,.mui-btn--accent[disabled]:focus,.mui-btn--accent[disabled]:active{color:#FFF;background-color:#311B92}.mui-btn--accent.mui-btn--flat{color:#311B92;background-color:transparent}.mui-btn--accent.mui-btn--flat:hover,.mui-btn--accent.mui-btn--flat:focus,.mui-btn--accent.mui-btn--flat:active{color:#311B92;background-color:#f2f2f2}.mui-btn--accent.mui-btn--flat[disabled]:hover,.mui-btn--accent.mui-btn--flat[disabled]:focus,.mui-btn--accent.mui-btn--flat[disabled]:active{color:#311B92;background-color:transparent}.mui-btn--small{height:30.6px;line-height:30.6px;padding:0 16px;font-size:13px}.mui-btn--large{height:54px;line-height:54px;padding:0 26px;font-size:14px}.mui-btn--fab.mui-btn--small{width:44px;height:44px;line-height:44px}.mui-btn--fab.mui-btn--large{width:75px;height:75px;line-height:75px}.mui-radio,.mui-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.mui-radio > label,.mui-checkbox > label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.mui-radio input:disabled,.mui-checkbox input:disabled{cursor:not-allowed}.mui-radio input:focus,.mui-checkbox input:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.mui-radio > label > input[type="radio"],.mui-radio--inline > label > input[type="radio"],.mui-checkbox > label > input[type="checkbox"],.mui-checkbox--inline > label > input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px}.mui-radio + .mui-radio,.mui-checkbox + .mui-checkbox{margin-top:-5px}.mui-radio--inline,.mui-checkbox--inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.mui-radio--inline > input[type="radio"],.mui-radio--inline > input[type="checkbox"],.mui-radio--inline > label > input[type="radio"],.mui-radio--inline > label > input[type="checkbox"],.mui-checkbox--inline > input[type="radio"],.mui-checkbox--inline > input[type="checkbox"],.mui-checkbox--inline > label > input[type="radio"],.mui-checkbox--inline > label > input[type="checkbox"]{margin:4px 0 0;line-height:normal}.mui-radio--inline + .mui-radio--inline,.mui-checkbox--inline + .mui-checkbox--inline{margin-top:0;margin-left:10px}.mui-container{box-sizing:border-box;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.mui-container:before,.mui-container:after{content:" ";display:table}.mui-container:after{clear:both}@media(min-width: 544px){.mui-container{max-width:570px}}@media(min-width: 768px){.mui-container{max-width:740px}}@media(min-width: 992px){.mui-container{max-width:960px}}@media(min-width: 1200px){.mui-container{max-width:1170px}}.mui-container-fluid{box-sizing:border-box;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.mui-container-fluid:before,.mui-container-fluid:after{content:" ";display:table}.mui-container-fluid:after{clear:both}.mui-divider{display:block;height:1px;background-color:rgba(0, 0, 0, 0.12)}.mui--divider-top{border-top:1px solid rgba(0, 0, 0, 0.12)}.mui--divider-bottom{border-bottom:1px solid rgba(0, 0, 0, 0.12)}.mui--divider-left{border-left:1px solid rgba(0, 0, 0, 0.12)}.mui--divider-right{border-right:1px solid rgba(0, 0, 0, 0.12)}.mui-dropdown{display:inline-block;position:relative}[data-mui-toggle="dropdown"]{outline:0}.mui-dropdown__menu{position:absolute;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#FFF;border-radius:2px;z-index:1;background-clip:padding-box}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-dropdown__menu{border-top:1px solid rgba(0, 0, 0, 0.12);border-left:1px solid rgba(0, 0, 0, 0.12)}}@supports (-ms-ime-align: auto){.mui-dropdown__menu{border-top:1px solid rgba(0, 0, 0, 0.12);border-left:1px solid rgba(0, 0, 0, 0.12)}}.mui-dropdown__menu.mui--is-open{display:block}.mui-dropdown__menu > li > a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.429;color:rgba(0, 0, 0, 0.87);text-decoration:none;white-space:nowrap}.mui-dropdown__menu > li > a:hover,.mui-dropdown__menu > li > a:focus{text-decoration:none;color:rgba(0, 0, 0, 0.87);background-color:#EEEEEE}.mui-dropdown__menu > .mui--is-disabled > a,.mui-dropdown__menu > .mui--is-disabled > a:hover,.mui-dropdown__menu > .mui--is-disabled > a:focus{color:#EEEEEE}.mui-dropdown__menu > .mui--is-disabled > a:hover,.mui-dropdown__menu > .mui--is-disabled > a:focus{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.mui-dropdown__menu--right{left:auto;right:0}.mui-dropdown--up > .mui-dropdown__menu{margin:0 0 2px}.mui-dropdown--right > .mui-dropdown__menu{margin:0 0 0 2px}.mui-dropdown--left > .mui-dropdown__menu{margin:0 2px 0 0}.mui-form legend{display:block;width:100%;padding:0;margin-bottom:10px;font-size:21px;color:rgba(0, 0, 0, 0.87);line-height:inherit;border:0}.mui-form fieldset{border:0;padding:0;margin:0 0 20px 0}@media(min-width: 544px){.mui-form--inline .mui-textfield{display:inline-block;vertical-align:bottom;margin-bottom:0}.mui-form--inline .mui-radio,.mui-form--inline .mui-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.mui-form--inline .mui-radio > label,.mui-form--inline .mui-checkbox > label{padding-left:0}.mui-form--inline .mui-radio > label > input[type="radio"],.mui-form--inline .mui-checkbox > label > input[type="checkbox"]{position:relative;margin-left:0}.mui-form--inline .mui-select{display:inline-block;vertical-align:bottom;margin-bottom:0}.mui-form--inline .mui-btn{margin-bottom:0;margin-top:0;vertical-align:bottom}}.mui-row{margin-left:-15px;margin-right:-15px}.mui-row:before,.mui-row:after{content:" ";display:table}.mui-row:after{clear:both}.mui-col-xs-1,.mui-col-sm-1,.mui-col-md-1,.mui-col-lg-1,.mui-col-xs-2,.mui-col-sm-2,.mui-col-md-2,.mui-col-lg-2,.mui-col-xs-3,.mui-col-sm-3,.mui-col-md-3,.mui-col-lg-3,.mui-col-xs-4,.mui-col-sm-4,.mui-col-md-4,.mui-col-lg-4,.mui-col-xs-5,.mui-col-sm-5,.mui-col-md-5,.mui-col-lg-5,.mui-col-xs-6,.mui-col-sm-6,.mui-col-md-6,.mui-col-lg-6,.mui-col-xs-7,.mui-col-sm-7,.mui-col-md-7,.mui-col-lg-7,.mui-col-xs-8,.mui-col-sm-8,.mui-col-md-8,.mui-col-lg-8,.mui-col-xs-9,.mui-col-sm-9,.mui-col-md-9,.mui-col-lg-9,.mui-col-xs-10,.mui-col-sm-10,.mui-col-md-10,.mui-col-lg-10,.mui-col-xs-11,.mui-col-sm-11,.mui-col-md-11,.mui-col-lg-11,.mui-col-xs-12,.mui-col-sm-12,.mui-col-md-12,.mui-col-lg-12{box-sizing:border-box;min-height:1px;padding-left:15px;padding-right:15px}.mui-col-xs-1,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12{float:left}.mui-col-xs-1{width:8.33333%}.mui-col-xs-2{width:16.66667%}.mui-col-xs-3{width:25%}.mui-col-xs-4{width:33.33333%}.mui-col-xs-5{width:41.66667%}.mui-col-xs-6{width:50%}.mui-col-xs-7{width:58.33333%}.mui-col-xs-8{width:66.66667%}.mui-col-xs-9{width:75%}.mui-col-xs-10{width:83.33333%}.mui-col-xs-11{width:91.66667%}.mui-col-xs-12{width:100%}.mui-col-xs-offset-0{margin-left:0%}.mui-col-xs-offset-1{margin-left:8.33333%}.mui-col-xs-offset-2{margin-left:16.66667%}.mui-col-xs-offset-3{margin-left:25%}.mui-col-xs-offset-4{margin-left:33.33333%}.mui-col-xs-offset-5{margin-left:41.66667%}.mui-col-xs-offset-6{margin-left:50%}.mui-col-xs-offset-7{margin-left:58.33333%}.mui-col-xs-offset-8{margin-left:66.66667%}.mui-col-xs-offset-9{margin-left:75%}.mui-col-xs-offset-10{margin-left:83.33333%}.mui-col-xs-offset-11{margin-left:91.66667%}.mui-col-xs-offset-12{margin-left:100%}@media(min-width: 544px){.mui-col-sm-1,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12{float:left}.mui-col-sm-1{width:8.33333%}.mui-col-sm-2{width:16.66667%}.mui-col-sm-3{width:25%}.mui-col-sm-4{width:33.33333%}.mui-col-sm-5{width:41.66667%}.mui-col-sm-6{width:50%}.mui-col-sm-7{width:58.33333%}.mui-col-sm-8{width:66.66667%}.mui-col-sm-9{width:75%}.mui-col-sm-10{width:83.33333%}.mui-col-sm-11{width:91.66667%}.mui-col-sm-12{width:100%}.mui-col-sm-offset-0{margin-left:0%}.mui-col-sm-offset-1{margin-left:8.33333%}.mui-col-sm-offset-2{margin-left:16.66667%}.mui-col-sm-offset-3{margin-left:25%}.mui-col-sm-offset-4{margin-left:33.33333%}.mui-col-sm-offset-5{margin-left:41.66667%}.mui-col-sm-offset-6{margin-left:50%}.mui-col-sm-offset-7{margin-left:58.33333%}.mui-col-sm-offset-8{margin-left:66.66667%}.mui-col-sm-offset-9{margin-left:75%}.mui-col-sm-offset-10{margin-left:83.33333%}.mui-col-sm-offset-11{margin-left:91.66667%}.mui-col-sm-offset-12{margin-left:100%}}@media(min-width: 768px){.mui-col-md-1,.mui-col-md-2,.mui-col-md-3,.mui-col-md-4,.mui-col-md-5,.mui-col-md-6,.mui-col-md-7,.mui-col-md-8,.mui-col-md-9,.mui-col-md-10,.mui-col-md-11,.mui-col-md-12{float:left}.mui-col-md-1{width:8.33333%}.mui-col-md-2{width:16.66667%}.mui-col-md-3{width:25%}.mui-col-md-4{width:33.33333%}.mui-col-md-5{width:41.66667%}.mui-col-md-6{width:50%}.mui-col-md-7{width:58.33333%}.mui-col-md-8{width:66.66667%}.mui-col-md-9{width:75%}.mui-col-md-10{width:83.33333%}.mui-col-md-11{width:91.66667%}.mui-col-md-12{width:100%}.mui-col-md-offset-0{margin-left:0%}.mui-col-md-offset-1{margin-left:8.33333%}.mui-col-md-offset-2{margin-left:16.66667%}.mui-col-md-offset-3{margin-left:25%}.mui-col-md-offset-4{margin-left:33.33333%}.mui-col-md-offset-5{margin-left:41.66667%}.mui-col-md-offset-6{margin-left:50%}.mui-col-md-offset-7{margin-left:58.33333%}.mui-col-md-offset-8{margin-left:66.66667%}.mui-col-md-offset-9{margin-left:75%}.mui-col-md-offset-10{margin-left:83.33333%}.mui-col-md-offset-11{margin-left:91.66667%}.mui-col-md-offset-12{margin-left:100%}}@media(min-width: 992px){.mui-col-lg-1,.mui-col-lg-2,.mui-col-lg-3,.mui-col-lg-4,.mui-col-lg-5,.mui-col-lg-6,.mui-col-lg-7,.mui-col-lg-8,.mui-col-lg-9,.mui-col-lg-10,.mui-col-lg-11,.mui-col-lg-12{float:left}.mui-col-lg-1{width:8.33333%}.mui-col-lg-2{width:16.66667%}.mui-col-lg-3{width:25%}.mui-col-lg-4{width:33.33333%}.mui-col-lg-5{width:41.66667%}.mui-col-lg-6{width:50%}.mui-col-lg-7{width:58.33333%}.mui-col-lg-8{width:66.66667%}.mui-col-lg-9{width:75%}.mui-col-lg-10{width:83.33333%}.mui-col-lg-11{width:91.66667%}.mui-col-lg-12{width:100%}.mui-col-lg-offset-0{margin-left:0%}.mui-col-lg-offset-1{margin-left:8.33333%}.mui-col-lg-offset-2{margin-left:16.66667%}.mui-col-lg-offset-3{margin-left:25%}.mui-col-lg-offset-4{margin-left:33.33333%}.mui-col-lg-offset-5{margin-left:41.66667%}.mui-col-lg-offset-6{margin-left:50%}.mui-col-lg-offset-7{margin-left:58.33333%}.mui-col-lg-offset-8{margin-left:66.66667%}.mui-col-lg-offset-9{margin-left:75%}.mui-col-lg-offset-10{margin-left:83.33333%}.mui-col-lg-offset-11{margin-left:91.66667%}.mui-col-lg-offset-12{margin-left:100%}}@media(min-width: 1200px){.mui-col-xl-1,.mui-col-xl-2,.mui-col-xl-3,.mui-col-xl-4,.mui-col-xl-5,.mui-col-xl-6,.mui-col-xl-7,.mui-col-xl-8,.mui-col-xl-9,.mui-col-xl-10,.mui-col-xl-11,.mui-col-xl-12{float:left}.mui-col-xl-1{width:8.33333%}.mui-col-xl-2{width:16.66667%}.mui-col-xl-3{width:25%}.mui-col-xl-4{width:33.33333%}.mui-col-xl-5{width:41.66667%}.mui-col-xl-6{width:50%}.mui-col-xl-7{width:58.33333%}.mui-col-xl-8{width:66.66667%}.mui-col-xl-9{width:75%}.mui-col-xl-10{width:83.33333%}.mui-col-xl-11{width:91.66667%}.mui-col-xl-12{width:100%}.mui-col-xl-offset-0{margin-left:0%}.mui-col-xl-offset-1{margin-left:8.33333%}.mui-col-xl-offset-2{margin-left:16.66667%}.mui-col-xl-offset-3{margin-left:25%}.mui-col-xl-offset-4{margin-left:33.33333%}.mui-col-xl-offset-5{margin-left:41.66667%}.mui-col-xl-offset-6{margin-left:50%}.mui-col-xl-offset-7{margin-left:58.33333%}.mui-col-xl-offset-8{margin-left:66.66667%}.mui-col-xl-offset-9{margin-left:75%}.mui-col-xl-offset-10{margin-left:83.33333%}.mui-col-xl-offset-11{margin-left:91.66667%}.mui-col-xl-offset-12{margin-left:100%}}.mui-panel{padding:15px;margin-bottom:20px;border-radius:0;background-color:#FFF;box-shadow:0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0px 2px 0 rgba(0, 0, 0, 0.12)}.mui-panel:before,.mui-panel:after{content:" ";display:table}.mui-panel:after{clear:both}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-panel{box-shadow:0 -1px 2px 0 rgba(0, 0, 0, 0.12), -1px 0px 2px 0 rgba(0, 0, 0, 0.12), 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0px 2px 0 rgba(0, 0, 0, 0.12)}}@supports (-ms-ime-align: auto){.mui-panel{box-shadow:0 -1px 2px 0 rgba(0, 0, 0, 0.12), -1px 0px 2px 0 rgba(0, 0, 0, 0.12), 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0px 2px 0 rgba(0, 0, 0, 0.12)}}.mui-select{display:block;padding-top:15px;margin-bottom:20px;position:relative}.mui-select:focus{outline:0}.mui-select:focus > select{height:calc(32px + 1px);margin-bottom:-1px;border-color:#FFEB3B;border-width:2px}.mui-select > select{display:block;height:32px;width:100%;appearance:none;-webkit-appearance:none;-moz-appearance:none;outline:none;border:none;border-bottom:1px solid rgba(0, 0, 0, 0.26);border-radius:0px;box-shadow:none;background-color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNiIgd2lkdGg9IjEwIj48cG9seWdvbiBwb2ludHM9IjAsMCAxMCwwIDUsNiIgc3R5bGU9ImZpbGw6cmdiYSgwLDAsMCwuMjQpOyIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:right center;cursor:pointer;color:rgba(0, 0, 0, 0.87);font-size:16px;font-family:inherit;line-height:inherit;padding:0 25px 0 0}.mui-select > select::-ms-expand{display:none}.mui-select > select:focus{outline:0;height:calc(32px + 1px);margin-bottom:-1px;border-color:#FFEB3B;border-width:2px}.mui-select > select:disabled{color:rgba(0, 0, 0, 0.38);cursor:not-allowed;background-color:transparent;opacity:1}.mui-select > select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.mui-select > select:focus::-ms-value{background:none;color:rgba(0, 0, 0, 0.87)}.mui-select > select.mui--text-placeholder{color:rgba(0, 0, 0, 0.26)}.mui-select > label{position:absolute;top:0;display:block;width:100%;color:rgba(0, 0, 0, 0.54);font-size:12px;font-weight:400;line-height:15px;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.mui-select:focus > label,.mui-select > select:focus ~ label{color:#FFEB3B}.mui-select__menu{position:absolute;z-index:2;min-width:100%;overflow-y:auto;padding:8px 0;box-sizing:border-box;background-color:#FFF;font-size:16px}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-select__menu{border-left:1px solid rgba(0, 0, 0, 0.12);border-top:1px solid rgba(0, 0, 0, 0.12)}}@supports (-ms-ime-align: auto){.mui-select__menu{border-left:1px solid rgba(0, 0, 0, 0.12);border-top:1px solid rgba(0, 0, 0, 0.12)}}.mui-select__menu > div{padding:0 22px;height:42px;line-height:42px;cursor:pointer;white-space:nowrap}.mui-select__menu > div.mui--is-selected{background-color:#EEEEEE}.mui-select__menu > div.mui--is-disabled{color:rgba(0, 0, 0, 0.38);cursor:not-allowed}.mui-select__menu > div:not(.mui-optgroup__label):not(.mui--is-disabled):hover{background-color:#E0E0E0}.mui-optgroup__option{text-indent:1em}.mui-optgroup__label{color:rgba(0, 0, 0, 0.54);font-size:0.9em}.mui-table{width:100%;max-width:100%;margin-bottom:20px}.mui-table > thead > tr > th,.mui-table > tbody > tr > th,.mui-table > tfoot > tr > th{text-align:left}.mui-table > thead > tr > th,.mui-table > thead > tr > td,.mui-table > tbody > tr > th,.mui-table > tbody > tr > td,.mui-table > tfoot > tr > th,.mui-table > tfoot > tr > td{padding:10px;line-height:1.429}.mui-table > thead > tr > th{border-bottom:2px solid rgba(0, 0, 0, 0.12);font-weight:700}.mui-table > tbody + tbody{border-top:2px solid rgba(0, 0, 0, 0.12)}.mui-table.mui-table--bordered > tbody > tr > td{border-bottom:1px solid rgba(0, 0, 0, 0.12)}.mui-tabs__bar{list-style:none;padding-left:0;margin-bottom:0;background-color:transparent;white-space:nowrap;overflow-x:auto}.mui-tabs__bar > li{display:inline-block}.mui-tabs__bar > li > a{display:block;white-space:nowrap;text-transform:uppercase;font-weight:500;font-size:14px;color:rgba(0, 0, 0, 0.87);cursor:default;height:48px;line-height:48px;padding-left:24px;padding-right:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mui-tabs__bar > li > a:hover{text-decoration:none}.mui-tabs__bar > li.mui--is-active{border-bottom:2px solid #FFEB3B}.mui-tabs__bar > li.mui--is-active > a{color:#FFEB3B}.mui-tabs__bar.mui-tabs__bar--justified{display:table;width:100%;table-layout:fixed}.mui-tabs__bar.mui-tabs__bar--justified > li{display:table-cell}.mui-tabs__bar.mui-tabs__bar--justified > li > a{text-align:center;padding-left:0px;padding-right:0px}.mui-tabs__pane{display:none}.mui-tabs__pane.mui--is-active{display:block}.mui-textfield{display:block;padding-top:15px;margin-bottom:20px;position:relative}.mui-textfield > label{position:absolute;top:0;display:block;width:100%;color:rgba(0, 0, 0, 0.54);font-size:12px;font-weight:400;line-height:15px;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.mui-textfield > textarea{padding-top:5px}.mui-textfield > input:focus ~ label,.mui-textfield > textarea:focus ~ label{color:#FFEB3B}.mui-textfield--float-label > label{position:absolute;transform:translate(0px, 15px);font-size:16px;line-height:32px;color:rgba(0, 0, 0, 0.26);text-overflow:clip;cursor:text;pointer-events:none}.mui-textfield--float-label > input:-webkit-autofill ~ label,.mui-textfield--float-label > textarea:-webkit-autofill ~ label{transform:translate(0px, 0px);font-size:12px;line-height:15px;text-overflow:ellipsis}.mui-textfield--float-label > input:focus ~ label,.mui-textfield--float-label > textarea:focus ~ label{transform:translate(0px, 0px);font-size:12px;line-height:15px;text-overflow:ellipsis}.mui-textfield--float-label > input:not(:focus).mui--is-not-empty ~ label,.mui-textfield--float-label > input:not(:focus)[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield--float-label > input:not(:focus):not(:empty):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield--float-label > textarea:not(:focus).mui--is-not-empty ~ label,.mui-textfield--float-label > textarea:not(:focus)[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield--float-label > textarea:not(:focus):not(:empty):not(.mui--is-empty):not(.mui--is-not-empty) ~ label{color:rgba(0, 0, 0, 0.54);font-size:12px;line-height:15px;transform:translate(0px, 0px);text-overflow:ellipsis}.mui-textfield--wrap-label{display:table;width:100%;padding-top:0px}.mui-textfield--wrap-label:not(.mui-textfield--float-label) > label{display:table-header-group;position:static;white-space:normal;overflow-x:visible}.mui-textfield > input,.mui-textfield > textarea{box-sizing:border-box;display:block;background-color:transparent;color:rgba(0, 0, 0, 0.87);border:none;border-bottom:1px solid rgba(0, 0, 0, 0.26);outline:none;width:100%;padding:0;box-shadow:none;border-radius:0px;font-size:16px;font-family:inherit;line-height:inherit;background-image:none}.mui-textfield > input:focus,.mui-textfield > textarea:focus{border-color:#FFEB3B;border-width:2px}.mui-textfield > input:-moz-read-only,.mui-textfield > textarea:-moz-read-only{cursor:not-allowed;background-color:transparent;opacity:1}.mui-textfield > input:disabled,.mui-textfield > input:read-only,.mui-textfield > textarea:disabled,.mui-textfield > textarea:read-only{cursor:not-allowed;background-color:transparent;opacity:1}.mui-textfield > input::-moz-placeholder,.mui-textfield > textarea::-moz-placeholder{color:rgba(0, 0, 0, 0.26);opacity:1}.mui-textfield > input:-ms-input-placeholder,.mui-textfield > textarea:-ms-input-placeholder{color:rgba(0, 0, 0, 0.26);opacity:1}.mui-textfield > input::placeholder,.mui-textfield > textarea::placeholder{color:rgba(0, 0, 0, 0.26);opacity:1}.mui-textfield > input{height:32px}.mui-textfield > input:focus{height:calc(32px + 1px);margin-bottom:-1px}.mui-textfield > textarea{min-height:64px}.mui-textfield > textarea[rows]:not([rows="2"]):focus{margin-bottom:-1px}.mui-textfield > input:focus{height:calc(32px + 1px);margin-bottom:-1px}.mui-textfield > input:invalid:not(:focus):not(:required),.mui-textfield > input:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield > input:invalid:not(:focus):required.mui--is-empty.mui--is-touched,.mui-textfield > input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > textarea:invalid:not(:focus):not(:required),.mui-textfield > textarea:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield > textarea:invalid:not(:focus):required.mui--is-empty.mui--is-touched,.mui-textfield > textarea:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > textarea:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:not(:focus).mui--is-invalid:not(:required),.mui-textfield > input:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield > input:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-touched,.mui-textfield > input:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > textarea:not(:focus).mui--is-invalid:not(:required),.mui-textfield > textarea:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield > textarea:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-touched,.mui-textfield > textarea:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > textarea:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty){border-color:#F44336;border-width:2px}.mui-textfield > input:invalid:not(:focus):not(:required),.mui-textfield > input:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield > input:invalid:not(:focus):required.mui--is-empty.mui--is-touched,.mui-textfield > input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:not(:focus).mui--is-invalid:not(:required),.mui-textfield > input:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield > input:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-touched,.mui-textfield > input:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield > input:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty){height:calc(32px + 1px);margin-bottom:-1px}.mui-textfield.mui-textfield--float-label > input:invalid:not(:focus):not(:required) ~ label,.mui-textfield.mui-textfield--float-label > input:invalid:not(:focus):required.mui--is-not-empty ~ label,.mui-textfield.mui-textfield--float-label > input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield.mui-textfield--float-label > input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield.mui-textfield--float-label > textarea:invalid:not(:focus):not(:required) ~ label,.mui-textfield.mui-textfield--float-label > textarea:invalid:not(:focus):required.mui--is-not-empty ~ label,.mui-textfield.mui-textfield--float-label > textarea:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty) ~ label,.mui-textfield.mui-textfield--float-label > textarea:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty) ~ label{color:#F44336}.mui-textfield:not(.mui-textfield--float-label) > input:invalid:not(:focus):not(:required) ~ label,.mui-textfield:not(.mui-textfield--float-label) > input:invalid:not(:focus):required.mui--is-empty.mui--is-touched ~ label,.mui-textfield:not(.mui-textfield--float-label) > input:invalid:not(:focus):required.mui--is-not-empty ~ label,.mui-textfield:not(.mui-textfield--float-label) > textarea:invalid:not(:focus):not(:required) ~ label,.mui-textfield:not(.mui-textfield--float-label) > textarea:invalid:not(:focus):required.mui--is-empty.mui--is-touched ~ label,.mui-textfield:not(.mui-textfield--float-label) > textarea:invalid:not(:focus):required.mui--is-not-empty ~ label{color:#F44336}.mui-textfield.mui-textfield--float-label > .mui--is-invalid.mui--is-not-empty:not(:focus) ~ label{color:#F44336}.mui-textfield:not(.mui-textfield--float-label) > .mui--is-invalid:not(:focus) ~ label{color:#F44336}.mui--no-transition{transition:none !important}.mui--no-user-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mui-caret{display:inline-block;width:0;height:0;margin:0 0 0 2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.mui-caret.mui-caret--up{transform:rotate(180deg);margin:0 0 2px 2px}.mui-caret.mui-caret--right{transform:rotate(-90deg);margin:0 0 2px 2px}.mui-caret.mui-caret--left{transform:rotate(90deg);margin:0 2px 2px 0}.mui--text-left{text-align:left !important}.mui--text-right{text-align:right !important}.mui--text-center{text-align:center !important}.mui--text-justify{text-align:justify !important}.mui--text-nowrap{white-space:nowrap !important}.mui--align-baseline{vertical-align:baseline !important}.mui--align-top{vertical-align:top !important}.mui--align-middle{vertical-align:middle !important}.mui--align-bottom{vertical-align:bottom !important}.mui--text-dark{color:rgba(0, 0, 0, 0.87)}.mui--text-dark-secondary{color:rgba(0, 0, 0, 0.54)}.mui--text-dark-hint{color:rgba(0, 0, 0, 0.38)}.mui--text-light{color:#FFF}.mui--text-light-secondary{color:rgba(255, 255, 255, 0.7)}.mui--text-light-hint{color:rgba(255, 255, 255, 0.3)}.mui--text-accent{color:rgba(49, 27, 146, 0.87)}.mui--text-accent-secondary{color:rgba(49, 27, 146, 0.54)}.mui--text-accent-hint{color:rgba(49, 27, 146, 0.38)}.mui--text-black{color:#000}.mui--text-white{color:#FFF}.mui--text-danger{color:#F44336}.mui--text-placeholder{color:rgba(0, 0, 0, 0.26)}.mui--bg-primary{background-color:#FFEB3B}.mui--bg-primary-dark{background-color:#455A64}.mui--bg-primary-light{background-color:#CFD8DC}.mui--bg-accent{background-color:#311B92}.mui--bg-accent-dark{background-color:#8C9EFF}.mui--bg-accent-light{background-color:#3D5AFE}.mui--bg-danger{background-color:#F44336}.mui-list--unstyled{padding-left:0;list-style:none}.mui-list--inline{padding-left:0;list-style:none;margin-left:-5px}.mui-list--inline > li{display:inline-block;padding-left:5px;padding-right:5px}.mui--z1,.mui-dropdown__menu,.mui-select__menu{box-shadow:0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24)}.mui--z2{box-shadow:0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23)}.mui--z3{box-shadow:0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23)}.mui--z4{box-shadow:0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22)}.mui--z5{box-shadow:0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22)}.mui--clearfix:before,.mui--clearfix:after{content:" ";display:table}.mui--clearfix:after{clear:both}.mui--pull-right{float:right !important}.mui--pull-left{float:left !important}.mui--hide{display:none !important}.mui--show{display:block !important}.mui--invisible{visibility:hidden}.mui--overflow-hidden{overflow:hidden !important}.mui--overflow-hidden-x{overflow-x:hidden !important}.mui--overflow-hidden-y{overflow-y:hidden !important}.mui--visible-xs-block,.mui--visible-xs-inline,.mui--visible-xs-inline-block,.mui--visible-sm-block,.mui--visible-sm-inline,.mui--visible-sm-inline-block,.mui--visible-md-block,.mui--visible-md-inline,.mui--visible-md-inline-block,.mui--visible-lg-block,.mui--visible-lg-inline,.mui--visible-lg-inline-block,.mui--visible-xl-block,.mui--visible-xl-inline,.mui--visible-xl-inline-block{display:none !important}@media(max-width: 543px){.mui-visible-xs{display:block !important}table.mui-visible-xs{display:table}tr.mui-visible-xs{display:table-row !important}th.mui-visible-xs,td.mui-visible-xs{display:table-cell !important}.mui--visible-xs-block{display:block !important}.mui--visible-xs-inline{display:inline !important}.mui--visible-xs-inline-block{display:inline-block !important}}@media(min-width: 544px) and (max-width: 767px){.mui-visible-sm{display:block !important}table.mui-visible-sm{display:table}tr.mui-visible-sm{display:table-row !important}th.mui-visible-sm,td.mui-visible-sm{display:table-cell !important}.mui--visible-sm-block{display:block !important}.mui--visible-sm-inline{display:inline !important}.mui--visible-sm-inline-block{display:inline-block !important}}@media(min-width: 768px) and (max-width: 991px){.mui-visible-md{display:block !important}table.mui-visible-md{display:table}tr.mui-visible-md{display:table-row !important}th.mui-visible-md,td.mui-visible-md{display:table-cell !important}.mui--visible-md-block{display:block !important}.mui--visible-md-inline{display:inline !important}.mui--visible-md-inline-block{display:inline-block !important}}@media(min-width: 992px) and (max-width: 1199px){.mui-visible-lg{display:block !important}table.mui-visible-lg{display:table}tr.mui-visible-lg{display:table-row !important}th.mui-visible-lg,td.mui-visible-lg{display:table-cell !important}.mui--visible-lg-block{display:block !important}.mui--visible-lg-inline{display:inline !important}.mui--visible-lg-inline-block{display:inline-block !important}}@media(min-width: 1200px){.mui-visible-xl{display:block !important}table.mui-visible-xl{display:table}tr.mui-visible-xl{display:table-row !important}th.mui-visible-xl,td.mui-visible-xl{display:table-cell !important}.mui--visible-xl-block{display:block !important}.mui--visible-xl-inline{display:inline !important}.mui--visible-xl-inline-block{display:inline-block !important}}@media(max-width: 543px){.mui--hidden-xs{display:none !important}}@media(min-width: 544px) and (max-width: 767px){.mui--hidden-sm{display:none !important}}@media(min-width: 768px) and (max-width: 991px){.mui--hidden-md{display:none !important}}@media(min-width: 992px) and (max-width: 1199px){.mui--hidden-lg{display:none !important}}@media(min-width: 1200px){.mui--hidden-xl{display:none !important}}.mui-scrlock--showbar-y{overflow-y:scroll !important}.mui-scrlock--showbar-x{overflow-x:scroll !important}#mui-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99999999;background-color:rgba(0, 0, 0, 0.2);overflow:auto}.mui-btn__ripple-container{position:absolute;top:0;left:0;display:block;height:100%;width:100%;overflow:hidden;z-index:0;pointer-events:none}.mui-ripple{position:absolute;top:0;left:0;border-radius:50%;opacity:0;pointer-events:none;transform:scale(0.0001, 0.0001)}.mui-ripple.mui--is-animating{transform:none;transition:transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.3s cubic-bezier(0, 0, 0.2, 1)}.mui-ripple.mui--is-visible{opacity:0.3}.mui-btn .mui-ripple{background-color:#a6a6a6}.mui-btn--primary .mui-ripple{background-color:#FFF}.mui-btn--dark .mui-ripple{background-color:#FFF}.mui-btn--danger .mui-ripple{background-color:#FFF}.mui-btn--accent .mui-ripple{background-color:#FFF}.mui-btn--flat .mui-ripple{background-color:#a6a6a6}.mui--text-display4{font-weight:300;font-size:112px;line-height:112px}.mui--text-display3{font-weight:400;font-size:56px;line-height:56px}.mui--text-display2{font-weight:400;font-size:45px;line-height:48px}.mui--text-display1,h1{font-weight:400;font-size:34px;line-height:40px}.mui--text-headline,h2{font-weight:400;font-size:24px;line-height:32px}.mui--text-title,h3{font-weight:400;font-size:20px;line-height:28px}.mui--text-subhead,h4{font-weight:400;font-size:16px;line-height:24px}.mui--text-body2,h5{font-weight:500;font-size:14px;line-height:24px}.mui--text-body1{font-weight:400;font-size:14px;line-height:20px}.mui--text-caption{font-weight:400;font-size:12px;line-height:16px}.mui--text-menu{font-weight:500;font-size:13px;line-height:17px}.mui--text-button{font-weight:500;font-size:14px;line-height:18px;text-transform:uppercase}.viewport{width:100%;height:100%;margin:0}.vbox{display:-webkit-box;display:-moz-box;display:box;-ms-box-orient:vertical;box-orient:vertical;display:-moz-flex;display:-ms-flex;display:flex;-moz-flex-direction:column;flex-direction:column}.gradient{background:#ebf1f6;background:linear-gradient(to bottom, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0)}.backgroundImage{background-image:url(http://via.placeholder.com/411x823)}.appPanel{-ms-box-flex:1;box-flex:1;-moz-flex:1;flex:1;height:100vh;width:100vw;overflow-y:auto}.scrolling-wrapper-flexbox{display:flex;flex-wrap:nowrap;overflow-x:auto}.scrolling-wrapper-flexbox .scrollCard,.scrolling-wrapper-flexbox .scrollCardHalf,.scrolling-wrapper-flexbox .imageCard,.scrolling-wrapper-flexbox .hourlyCard{flex:0 0 auto;margin-right:11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.scrollCard,.scrollCardHalf,.hourlyCard{width:250px;height:175px;overflow-y:hidden;border-radius:3px;background-color:#f5f5f5;padding:5px;box-shadow:0 2px 2px 0 rgba(0, 0, 0, 0.05), 0 2px 1px -2px rgba(0, 0, 0, 0.05), 0 1px 5px 0 rgba(0, 0, 0, 0.05)}.scrollCardHalf{height:85px}.hourlyCard{width:42px;height:70px;background:transparent}.imageCard{height:175px;overflow-y:hidden}.imageCard img{max-height:100%;max-width:100%}.scrolling-wrapper,.scrolling-wrapper-flexbox{height:75px;width:100%;-webkit-overflow-scrolling:touch}.scrolling-wrapper::-webkit-scrollbar,.scrolling-wrapper-flexbox::-webkit-scrollbar{display:none}body{background-color:#eee}.showbox{position:absolute;top:40vh;bottom:60vh;left:0;right:0;padding:5%}.loader{position:relative;margin:0 auto;width:100px}.loader:before{content:'';display:block;padding-top:100%}.circular{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;height:100%;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.path{stroke-dasharray:1, 200;stroke-dashoffset:0;-webkit-animation:dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;stroke-linecap:round}@-webkit-keyframes rotate{:global(100%){transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{:global(0%){stroke-dasharray:1, 200;stroke-dashoffset:0}:global(50%){stroke-dasharray:89, 200;stroke-dashoffset:-35px}:global(100%){stroke-dasharray:89, 200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35px}100%{stroke-dasharray:89, 200;stroke-dashoffset:-124px}}@-webkit-keyframes color{:global(100%),:global(0%){stroke:#dc4f43}:global(40%){stroke:#ffbe39}:global(66%){stroke:#0fa3ef}:global(80%),:global(90%){stroke:#301010}}@keyframes color{100%,0%{stroke:#dc4f43}40%{stroke:#ffbe39}66%{stroke:#0fa3ef}80%,90%{stroke:#301010}}body{background-color:#F5F5F5}#header{position:fixed;top:0;right:0;left:0;z-index:2;transition:left 0.2s}ul{margin:0;padding:0}li{display:inline;margin:0;padding:0 4px 0 0}.dates{padding:2px;border:solid 1px #80007e;background-color:#ffffff}#btc,#fx,#trend{font-size:85%}.up,.ontime,.trendUp{color:#4CAF50 !important}.down,.delayed,.trendDown{color:#F44336 !important}.nochange{color:#000000}.password{border:1px solid #BDBDBD;background-color:#EEEEEE;font-family:monospace;white-space:pre}.trendUp:before{content:"▲"}.trendDown:before{content:'▼'}.card{position:relative;background-color:#fff;min-height:48px;margin:8px;border-bottom-color:#666666;box-shadow:0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12)}.itemRow{background-color:#fff;min-height:48px;border-bottom-color:#EEEEEE;border-bottom-width:1px;border-bottom-style:solid;line-height:48px}.cardTitle{border-bottom-color:#EEEEEE;border-bottom-width:1px;border-bottom-style:solid}.entry{height:36px;margin:6px 0;vertical-align:middle}.time{font-family:'Roboto'}.titleBar{font-family:'Gotham Light';font-size:125%}#trains,#trainResults{overflow-y:auto;transition:all 0.5s;-webkit-transition:all 0.5s}.tableBody{transition:all 0.5s;-webkit-transition:all 0.5s}.unsliced{height:455px}.sliced{height:300px}#snackbar{visibility:hidden;min-width:250px;margin-left:-125px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:16px;position:fixed;z-index:1;left:50%;bottom:30px}#snackbar.show{visibility:visible;-webkit-animation:fadein 0.5s;animation:fadein 0.5s}@-webkit-keyframes fadein{:global(from){bottom:0;opacity:0}:global(to){bottom:30px;opacity:1}}@keyframes fadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@-webkit-keyframes fadeout{:global(from){bottom:30px;opacity:1}:global(to){bottom:0;opacity:0}}@keyframes fadeout{from{bottom:30px;opacity:1}to{bottom:0;opacity:0}}.temp0,.temp1,.temp2,.temp3,.temp4,.temp5{color:#50b5dd}.temp6{color:#4eb2ce}.temp7{color:#4cb0be}.temp8{color:#49adaf}.temp9{color:#48ab9f}.temp10{color:#46a88e}.temp11{color:#44a67d}.temp12{color:#42a46c}.temp13{color:#66ad5e}.temp14{color:#87be40}.temp15{color:#b3cc1a}.temp16{color:#d6d51c}.temp17{color:#f9ca03}.temp18{color:#f6b503}.temp19{color:#f4961a}.temp20{color:#ec6e05}.temp21{color:#ea5a24}.temp22{color:#e4572b}.temp23{color:#e14a29}.temp24{color:#e04127}.temp25{color:#d9372b}.temp26{color:#d63129}.temp27{color:#d12b2b}.temp28{color:#cd282f}.temp29{color:#c82432}.temp30{color:#c32334}.temp31{color:#be2138}.temp32,.temp33,.temp34,.temp35{color:#b9203b}.day{font-family:"Roboto Slab", "Helvetica Neue", Helvetica, Arial, sans-serif;text-transform:uppercase}.summary::first-letter{text-transform:capitalize}#weather{margin-top:15px;transition:all 0.5s;-webkit-transition:all 0.5s}#newsShell{}#news{height:200px;margin-top:15px;-ms-overflow-style:-ms-autohiding-scrollbar}#byme,#bymeYelp{margin-top:5px}#bymeYelp img{max-height:100%;max-width:100%}.stop-scrolling{height:100%;overflow:hidden}.fullscreen{position:absolute;z-index:5000;top:0;left:0;height:100vh;width:100vw;background-color:#E0E0E0;background-repeat:no-repeat;background-position:center top}.fillpanel{width:100%;height:100%;background-color:#FFF8E1}.fullscreen .header{position:-webkit-sticky;position:sticky}.box{display:flex;flex-flow:column;height:100%}.box .headerSpacer{flex:0 1 66px}.box .content{flex:1 1 auto;background-color:#FFF;overflow:auto;margin-bottom:15px}.newsarticle img{max-height:100%;max-width:100%}.newsarticle h1,.newsarticle h3,.newsarticle h3,.newsarticle h4{font-family:"Roboto Condensed", "Helvetica Neue", Helvetica, Arial, sans-serif;font-weight:700}.tiny{font-size:1rem}.small{font-size:2rem}.medium{font-size:4rem}.large{font-size:6rem}.cardLink{color:#2196F3;margin-top:10px}.endbumper{height:66px}.seemore{font-size:14px;font-weight:500}#connectionStatus{margin-top:15px;margin-bottom:15px}.trafficHeavy{color:#fa4a50}.trafficLight{color:#fdbd15}.trafficMedium{color:#fba010}#map{height:180px}#bymeImages{margin-bottom:3px}.separate{border-bottom:1px solid #EEEEEE;margin-bottom:5px}.navbar{position:fixed;display:flex;justify-content:space-between;align-items:center;padding:0.7rem 0rem;z-index:2;width:100%;opacity:0.9;margin-bottom:1rem;min-height:var(--navbar-height)}.navbar ul{display:flex}.navbar a{color:#fff;padding:0.45rem;margin:0 0.25rem}.navbar a:hover{color:var(--light-color)}.navbar .welcome span{margin-right:0.6rem}.navbar .navbar-section{align-items:center;display:flex;display:-ms-flexbox;flex:1 0 0;-ms-flex-align:center}.navbar .navbar-section:not(:first-child):last-child{justify-content:flex-end}.navbar .navbar-brand{font-size:125%;font-weight:bold}header + div.container{position:relative;top:var(--navbar-height);min-height:calc(100vh - var(--navbar-height))}#weatherP{background-size:cover;color:white;font-family:'Roboto';font-weight:200}.hourly{-ms-overflow-style:-ms-autohiding-scrollbar}.weatherDay{background-image:url(../gfx/bg_morning.jpg)}.weatherEvening{background-image:url(../gfx/bg_evening.jpg)}.cloudy_n{background-image:url(../gfx/cloudy_n.jpg)}.cloudy_d{background-image:url(../gfx/cloudy_d.jpg)}.clear_d{background-image:url(../gfx/clear_d.jpg)}.clear_n{background-image:url(../gfx/clear_n.jpg)}.foggy_d{background-image:url(../gfx/foggy_d.jpg)}.foggy_n{background-image:url(../gfx/foggy_n.jpg)}.rain_d{background-image:url(../gfx/rain_d.jpg)}.rain_n{background-image:url(../gfx/rain_n.jpg)}.snow_d{background-image:url(../gfx/snow_d.jpg)}.snow_n{background-image:url(../gfx/snow_n.jpg)}.storm_d{background-image:url(../gfx/storm_d.jpg)}.storm_n{background-image:url(../gfx/storm_n.jpg)}.glassy{background-color:rgba(31, 28, 23, 0.6);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(2px)}.animTrans{transition:all 1s linear;-moz-transition:all 1s linear;-webkit-transition:all 1s linear;-o-transition:all 1s linear}.normalWeight{font-weight:400}.temp0,.temp1,.temp2,.temp3,.temp4,.temp5{color:#50b5dd}.temp6{color:#4eb2ce}.temp7{color:#4cb0be}.temp8{color:#49adaf}.temp9{color:#48ab9f}.temp10{color:#46a88e}.temp11{color:#44a67d}.temp12{color:#42a46c}.temp13{color:#66ad5e}.temp14{color:#87be40}.temp15{color:#b3cc1a}.temp16{color:#d6d51c}.temp17{color:#f9ca03}.temp18{color:#f6b503}.temp19{color:#f4961a}.temp20{color:#ec6e05}.temp21{color:#ea5a24}.temp22{color:#e4572b}.temp23{color:#e14a29}.temp24{color:#e04127}.temp25{color:#d9372b}.temp26{color:#d63129}.temp27{color:#d12b2b}.temp28{color:#cd282f}.temp29{color:#c82432}.temp30{color:#c32334}.temp31{color:#be2138}.temp32,.temp33,.temp34,.temp35{color:#b9203b}.viewport{width:100%;height:100%;margin:0}.vbox{display:-webkit-box;display:-moz-box;display:box;-ms-box-orient:vertical;box-orient:vertical;display:-moz-flex;display:-ms-flex;display:flex;-moz-flex-direction:column;flex-direction:column}.gradient{background:#ebf1f6;background:linear-gradient(to bottom, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0)}.backgroundImage{background-image:url(http://via.placeholder.com/411x823)}.appPanel{-ms-box-flex:1;box-flex:1;-moz-flex:1;flex:1;height:100vh;width:100vw;overflow-y:auto}:root{} +.greetPanel.svelte-q4or77{} +#news.svelte-pkay8a{min-height:175px} +:root{--green:#008744;--blue:#0fa3ef;--red:#dc4f43;--yellow:#ffbe39;--white:#eee;--black:#301010;--width:100 px}@-webkit-keyframes svelte-1hzodbx-loader-animation{0%{left:-100%;background-color:var(--green)}49%{left:100%;background-color:var(--yellow)}50%{left:100%;background-color:var(--red)}100%{left:-100%;background-color:var(--blue)}}@keyframes svelte-1hzodbx-loader-animation{0%{left:-100%;background-color:var(--green)}49%{left:100%;background-color:var(--yellow)}50%{left:100%;background-color:var(--red)}100%{left:-100%;background-color:var(--blue)}}.loader.svelte-1hzodbx.svelte-1hzodbx{height:5px;width:100%;overflow:hidden}.loader.svelte-1hzodbx.svelte-1hzodbx:before{content:'';padding-top:100%;display:inline}.loader.svelte-1hzodbx .bar.svelte-1hzodbx{position:relative;height:5px;width:100%;background-color:blueviolet;-webkit-animation-name:svelte-1hzodbx-loader-animation;animation-name:svelte-1hzodbx-loader-animation;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} +:root{--green:#008744;--blue:#0fa3ef;--red:#dc4f43;--yellow:#ffbe39;--white:#eee;--black:#301010;--width:100 px}.showbox.svelte-74beg3{position:absolute;top:40vh;bottom:60vh;left:0;right:0;padding:5%}.loader.svelte-74beg3{position:relative;margin:0 auto;width:var(--width)}.circular.svelte-74beg3{-webkit-animation:svelte-74beg3-rotate 2s linear infinite;animation:svelte-74beg3-rotate 2s linear infinite;height:100%;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.path.svelte-74beg3{stroke-dasharray:1, 200;stroke-dashoffset:0;-webkit-animation:svelte-74beg3-dash 1.5s ease-in-out infinite, svelte-74beg3-color 6s ease-in-out infinite;animation:svelte-74beg3-dash 1.5s ease-in-out infinite, svelte-74beg3-color 6s ease-in-out infinite;stroke-linecap:round}@-webkit-keyframes svelte-74beg3-rotate{100%{transform:rotate(360deg)}}@keyframes svelte-74beg3-rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes svelte-74beg3-dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35px}100%{stroke-dasharray:89, 200;stroke-dashoffset:-124px}}@keyframes svelte-74beg3-dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35px}100%{stroke-dasharray:89, 200;stroke-dashoffset:-124px}}@-webkit-keyframes svelte-74beg3-color{100%,0%{stroke:var(--red)}40%{stroke:var(--yellow)}66%{stroke:var(--blue)}80%,90%{stroke:var(--black)}}@keyframes svelte-74beg3-color{100%,0%{stroke:var(--red)}40%{stroke:var(--yellow)}66%{stroke:var(--blue)}80%,90%{stroke:var(--black)}} +#weather.svelte-1w5pbzu{margin-top:15px;transition:all 0.5s;-webkit-transition:all 0.5s} +.sunlight.svelte-1lazfyc.svelte-1lazfyc{width:100%}.sunlight.svelte-1lazfyc svg.svelte-1lazfyc{width:100%} +.smallText.svelte-1q30wn7{font-size:10px} +.map.svelte-10ona71{height:180px;background-color:blueviolet} +.container.svelte-1sc5u33{padding-top:4px}.img.svelte-1sc5u33{max-width:93vw} +.svelte-1py2nd3{background:#f55a4e;padding:3px} +#weatherP.svelte-137idtq{background-size:cover;color:white;font-family:'Roboto';font-weight:200}.weatherDay.svelte-137idtq{background-image:url(../gfx/bg_morning.jpg)}.weatherEvening.svelte-137idtq{background-image:url(../gfx/bg_evening.jpg)}.cloudy_n.svelte-137idtq{background-image:url(../gfx/cloudy_n.jpg)}.cloudy_d.svelte-137idtq{background-image:url(../gfx/cloudy_d.jpg)}.clear_d.svelte-137idtq{background-image:url(../gfx/clear_d.jpg)}.clear_n.svelte-137idtq{background-image:url(../gfx/clear_n.jpg)}.foggy_d.svelte-137idtq{background-image:url(../gfx/foggy_d.jpg)}.foggy_n.svelte-137idtq{background-image:url(../gfx/foggy_n.jpg)}.rain_d.svelte-137idtq{background-image:url(../gfx/rain_d.jpg)}.rain_n.svelte-137idtq{background-image:url(../gfx/rain_n.jpg)}.snow_d.svelte-137idtq{background-image:url(../gfx/snow_d.jpg)}.snow_n.svelte-137idtq{background-image:url(../gfx/snow_n.jpg)}.storm_d.svelte-137idtq{background-image:url(../gfx/storm_d.jpg)}.storm_n.svelte-137idtq{background-image:url(../gfx/storm_n.jpg)}.glassy.svelte-137idtq{background-color:rgba(31, 28, 23, 0.6);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(2px)}.animTrans.svelte-137idtq{transition:all 1s linear;-moz-transition:all 1s linear;-webkit-transition:all 1s linear;-o-transition:all 1s linear}.normalWeight.svelte-137idtq{font-weight:400} + +/*# sourceMappingURL=bundle.css.map */ \ No newline at end of file diff --git a/public/build/bundle.css.map b/public/build/bundle.css.map new file mode 100755 index 0000000..3accf4c --- /dev/null +++ b/public/build/bundle.css.map @@ -0,0 +1,34 @@ +{ + "version": 3, + "file": "bundle.css", + "sources": [ + "../../App.svelte", + "../../Greeter.svelte", + "../../LatestNews.svelte", + "../../LineLoader.svelte", + "../../Spinner.svelte", + "../../Weather.svelte", + "../../Daylight.svelte", + "../../TodaysForecast.svelte", + "../../VenueMap.svelte", + "../../NewsItemPage.svelte", + "../../NotFound.svelte", + "../../WeatherPage.svelte" + ], + "sourcesContent": [ + "\n\n\n\n

\n", + "\n\n\n\n
\n

{todaySegment}

\n
{@html icon} {place}
\n
\n", + "\n\n\n\n{#if doRender}\n
\n
Latest News
\n
\n {#each list as item, i}\n \n {/each}\n
\n
\n More news\n
\n
\n{/if}\n\n", + "\n
\n
\n
\n", + "\n\n\n\n
\n
\n \n \n \n
\n
\n", + "\n\n\n\n\n{#if doRender}\n
\n
Weather
\n
\n\n
\n
\n
{weatherData.temp}°
\n
\n
\n \n
\n
\n
\n
{weatherData.summary}
\n {weatherData.tempHigh}° /\n {weatherData.tempLow}°
\n\n
\n
\n
\n For {weatherData.city} to {weatherData.readdate}\n
\n
\n See forecast\n
\n\n\n
\n
\n\n\n\n\n\n{/if}\n", + "\n\n\n\n{#if currently > 0}\n
\n \n \n \n \n \n \n \n
\n{/if}\n", + "\n\n\n\n{#if visible}\n
\n

Forecast

\n
\n {#each today as i}\n
\n
{i.time}
\n
\n
{~~(i.temp)}°
\n
\n {/each}\n
\n\n
\n
\n {#each daily as i}\n
\n
{i.time}
\n
\n
{~~(i.tempHigh)}°
\n
{~~(i.tempLow)}°
\n
\n {/each}\n
\n\n
\n
\n{/if}\n", + "\n\n\n\n\n
\n
\n\n\n\n", + "\n\n\n\n\n
\n{#await promise}\n \n{:then}\n {#if newsItemLoaded}\n
\n
{newsItem.title}
\n
\n

{newsItem.title}

\n
{@html newsItem.html}
\n
\n
\n {/if}\n\n{:catch error}\n

Something went wrong: {error.message}

\n{/await}\n
\n\n\n\n", + "\n\n\n\n

NotFound

\n\n

Oops, this route doesn't exist!

\n", + "\n\n\n\n
\n {#if !loaded}\n \n {:else}\n \n \n \n\n\n {/if}\n
\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/public/build/bundle.js b/public/build/bundle.js new file mode 100755 index 0000000..badaa8d --- /dev/null +++ b/public/build/bundle.js @@ -0,0 +1,23837 @@ + +(function(l, r) { if (l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (window.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(window.document); +var app = (function () { + 'use strict'; + + function noop() { } + function assign(tar, src) { + // @ts-ignore + for (const k in src) + tar[k] = src[k]; + return tar; + } + function is_promise(value) { + return value && typeof value === 'object' && typeof value.then === 'function'; + } + function add_location(element, file, line, column, char) { + element.__svelte_meta = { + loc: { file, line, column, char } + }; + } + function run(fn) { + return fn(); + } + function blank_object() { + return Object.create(null); + } + function run_all(fns) { + fns.forEach(run); + } + function is_function(thing) { + return typeof thing === 'function'; + } + function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); + } + function is_empty(obj) { + return Object.keys(obj).length === 0; + } + function validate_store(store, name) { + if (store != null && typeof store.subscribe !== 'function') { + throw new Error(`'${name}' is not a store with a 'subscribe' method`); + } + } + function subscribe(store, ...callbacks) { + if (store == null) { + return noop; + } + const unsub = store.subscribe(...callbacks); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; + } + function get_store_value(store) { + let value; + subscribe(store, _ => value = _)(); + return value; + } + function component_subscribe(component, store, callback) { + component.$$.on_destroy.push(subscribe(store, callback)); + } + + function append(target, node) { + target.appendChild(node); + } + function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); + } + function detach(node) { + node.parentNode.removeChild(node); + } + function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } + } + function element(name) { + return document.createElement(name); + } + function svg_element(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); + } + function text(data) { + return document.createTextNode(data); + } + function space() { + return text(' '); + } + function empty() { + return text(''); + } + function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); + } + function prevent_default(fn) { + return function (event) { + event.preventDefault(); + // @ts-ignore + return fn.call(this, event); + }; + } + function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); + } + function children(element) { + return Array.from(element.childNodes); + } + function set_style(node, key, value, important) { + node.style.setProperty(key, value, important ? 'important' : ''); + } + function custom_event(type, detail) { + const e = document.createEvent('CustomEvent'); + e.initCustomEvent(type, false, false, detail); + return e; + } + class HtmlTag { + constructor(anchor = null) { + this.a = anchor; + this.e = this.n = null; + } + m(html, target, anchor = null) { + if (!this.e) { + this.e = element(target.nodeName); + this.t = target; + this.h(html); + } + this.i(anchor); + } + h(html) { + this.e.innerHTML = html; + this.n = Array.from(this.e.childNodes); + } + i(anchor) { + for (let i = 0; i < this.n.length; i += 1) { + insert(this.t, this.n[i], anchor); + } + } + p(html) { + this.d(); + this.h(html); + this.i(this.a); + } + d() { + this.n.forEach(detach); + } + } + + let current_component; + function set_current_component(component) { + current_component = component; + } + function get_current_component() { + if (!current_component) + throw new Error('Function called outside component initialization'); + return current_component; + } + function onMount(fn) { + get_current_component().$$.on_mount.push(fn); + } + function afterUpdate(fn) { + get_current_component().$$.after_update.push(fn); + } + function onDestroy(fn) { + get_current_component().$$.on_destroy.push(fn); + } + function createEventDispatcher() { + const component = get_current_component(); + return (type, detail) => { + const callbacks = component.$$.callbacks[type]; + if (callbacks) { + // TODO are there situations where events could be dispatched + // in a server (non-DOM) environment? + const event = custom_event(type, detail); + callbacks.slice().forEach(fn => { + fn.call(component, event); + }); + } + }; + } + // TODO figure out if we still want to support + // shorthand events, or if we want to implement + // a real bubbling mechanism + function bubble(component, event) { + const callbacks = component.$$.callbacks[event.type]; + if (callbacks) { + callbacks.slice().forEach(fn => fn(event)); + } + } + + const dirty_components = []; + const binding_callbacks = []; + const render_callbacks = []; + const flush_callbacks = []; + const resolved_promise = Promise.resolve(); + let update_scheduled = false; + function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } + } + function tick() { + schedule_update(); + return resolved_promise; + } + function add_render_callback(fn) { + render_callbacks.push(fn); + } + function add_flush_callback(fn) { + flush_callbacks.push(fn); + } + let flushing = false; + const seen_callbacks = new Set(); + function flush() { + if (flushing) + return; + flushing = true; + do { + // first, call beforeUpdate functions + // and update components + for (let i = 0; i < dirty_components.length; i += 1) { + const component = dirty_components[i]; + set_current_component(component); + update(component.$$); + } + set_current_component(null); + dirty_components.length = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + flushing = false; + seen_callbacks.clear(); + } + function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } + } + const outroing = new Set(); + let outros; + function group_outros() { + outros = { + r: 0, + c: [], + p: outros // parent group + }; + } + function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; + } + function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } + } + function transition_out(block, local, detach, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) + block.d(1); + callback(); + } + }); + block.o(local); + } + } + + function handle_promise(promise, info) { + const token = info.token = {}; + function update(type, index, key, value) { + if (info.token !== token) + return; + info.resolved = value; + let child_ctx = info.ctx; + if (key !== undefined) { + child_ctx = child_ctx.slice(); + child_ctx[key] = value; + } + const block = type && (info.current = type)(child_ctx); + let needs_flush = false; + if (info.block) { + if (info.blocks) { + info.blocks.forEach((block, i) => { + if (i !== index && block) { + group_outros(); + transition_out(block, 1, 1, () => { + info.blocks[i] = null; + }); + check_outros(); + } + }); + } + else { + info.block.d(1); + } + block.c(); + transition_in(block, 1); + block.m(info.mount(), info.anchor); + needs_flush = true; + } + info.block = block; + if (info.blocks) + info.blocks[index] = block; + if (needs_flush) { + flush(); + } + } + if (is_promise(promise)) { + const current_component = get_current_component(); + promise.then(value => { + set_current_component(current_component); + update(info.then, 1, info.value, value); + set_current_component(null); + }, error => { + set_current_component(current_component); + update(info.catch, 2, info.error, error); + set_current_component(null); + if (!info.hasCatch) { + throw error; + } + }); + // if we previously had a then/catch block, destroy it + if (info.current !== info.pending) { + update(info.pending, 0); + return true; + } + } + else { + if (info.current !== info.then) { + update(info.then, 1, info.value, promise); + return true; + } + info.resolved = promise; + } + } + + const globals = (typeof window !== 'undefined' + ? window + : typeof globalThis !== 'undefined' + ? globalThis + : global); + + function get_spread_update(levels, updates) { + const update = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i = levels.length; + while (i--) { + const o = levels[i]; + const n = updates[i]; + if (n) { + for (const key in o) { + if (!(key in n)) + to_null_out[key] = 1; + } + for (const key in n) { + if (!accounted_for[key]) { + update[key] = n[key]; + accounted_for[key] = 1; + } + } + levels[i] = n; + } + else { + for (const key in o) { + accounted_for[key] = 1; + } + } + } + for (const key in to_null_out) { + if (!(key in update)) + update[key] = undefined; + } + return update; + } + function get_spread_object(spread_props) { + return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; + } + + function bind(component, name, callback) { + const index = component.$$.props[name]; + if (index !== undefined) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } + } + function create_component(block) { + block && block.c(); + } + function mount_component(component, target, anchor) { + const { fragment, on_mount, on_destroy, after_update } = component.$$; + fragment && fragment.m(target, anchor); + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = on_mount.map(run).filter(is_function); + if (on_destroy) { + on_destroy.push(...new_on_destroy); + } + else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + after_update.forEach(add_render_callback); + } + function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } + } + function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); + } + function init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const prop_values = options.props || {}; + const $$ = component.$$ = { + fragment: null, + ctx: null, + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + before_update: [], + after_update: [], + context: new Map(parent_component ? parent_component.$$.context : []), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false + }; + let ready = false; + $$.ctx = instance + ? instance(component, prop_values, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } + else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor); + flush(); + } + set_current_component(parent_component); + } + class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + } + + function dispatch_dev(type, detail) { + document.dispatchEvent(custom_event(type, Object.assign({ version: '3.29.7' }, detail))); + } + function append_dev(target, node) { + dispatch_dev('SvelteDOMInsert', { target, node }); + append(target, node); + } + function insert_dev(target, node, anchor) { + dispatch_dev('SvelteDOMInsert', { target, node, anchor }); + insert(target, node, anchor); + } + function detach_dev(node) { + dispatch_dev('SvelteDOMRemove', { node }); + detach(node); + } + function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) { + const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : []; + if (has_prevent_default) + modifiers.push('preventDefault'); + if (has_stop_propagation) + modifiers.push('stopPropagation'); + dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers }); + const dispose = listen(node, event, handler, options); + return () => { + dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers }); + dispose(); + }; + } + function attr_dev(node, attribute, value) { + attr(node, attribute, value); + if (value == null) + dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute }); + else + dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value }); + } + function set_data_dev(text, data) { + data = '' + data; + if (text.wholeText === data) + return; + dispatch_dev('SvelteDOMSetData', { node: text, data }); + text.data = data; + } + function validate_each_argument(arg) { + if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) { + let msg = '{#each} only iterates over array-like objects.'; + if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) { + msg += ' You can use a spread to convert this iterable into an array.'; + } + throw new Error(msg); + } + } + function validate_slots(name, slot, keys) { + for (const slot_key of Object.keys(slot)) { + if (!~keys.indexOf(slot_key)) { + console.warn(`<${name}> received an unexpected slot "${slot_key}".`); + } + } + } + class SvelteComponentDev extends SvelteComponent { + constructor(options) { + if (!options || (!options.target && !options.$$inline)) { + throw new Error("'target' is a required option"); + } + super(); + } + $destroy() { + super.$destroy(); + this.$destroy = () => { + console.warn('Component was already destroyed'); // eslint-disable-line no-console + }; + } + $capture_state() { } + $inject_state() { } + } + + /** + * @typedef {Object} WrappedComponent Object returned by the `wrap` method + * @property {SvelteComponent} component - Component to load (this is always asynchronous) + * @property {RoutePrecondition[]} [conditions] - Route pre-conditions to validate + * @property {Object} [props] - Optional dictionary of static props + * @property {Object} [userData] - Optional user data dictionary + * @property {bool} _sveltesparouter - Internal flag; always set to true + */ + + /** + * @callback AsyncSvelteComponent + * @returns {Promise} Returns a Promise that resolves with a Svelte component + */ + + /** + * @callback RoutePrecondition + * @param {RouteDetail} detail - Route detail object + * @returns {boolean|Promise} If the callback returns a false-y value, it's interpreted as the precondition failed, so it aborts loading the component (and won't process other pre-condition callbacks) + */ + + /** + * @typedef {Object} WrapOptions Options object for the call to `wrap` + * @property {SvelteComponent} [component] - Svelte component to load (this is incompatible with `asyncComponent`) + * @property {AsyncSvelteComponent} [asyncComponent] - Function that returns a Promise that fulfills with a Svelte component (e.g. `{asyncComponent: () => import('Foo.svelte')}`) + * @property {SvelteComponent} [loadingComponent] - Svelte component to be displayed while the async route is loading (as a placeholder); when unset or false-y, no component is shown while component + * @property {object} [loadingParams] - Optional dictionary passed to the `loadingComponent` component as params (for an exported prop called `params`) + * @property {object} [userData] - Optional object that will be passed to events such as `routeLoading`, `routeLoaded`, `conditionsFailed` + * @property {object} [props] - Optional key-value dictionary of static props that will be passed to the component. The props are expanded with {...props}, so the key in the dictionary becomes the name of the prop. + * @property {RoutePrecondition[]|RoutePrecondition} [conditions] - Route pre-conditions to add, which will be executed in order + */ + + /** + * Wraps a component to enable multiple capabilities: + * 1. Using dynamically-imported component, with (e.g. `{asyncComponent: () => import('Foo.svelte')}`), which also allows bundlers to do code-splitting. + * 2. Adding route pre-conditions (e.g. `{conditions: [...]}`) + * 3. Adding static props that are passed to the component + * 4. Adding custom userData, which is passed to route events (e.g. route loaded events) or to route pre-conditions (e.g. `{userData: {foo: 'bar}}`) + * + * @param {WrapOptions} args - Arguments object + * @returns {WrappedComponent} Wrapped component + */ + function wrap(args) { + if (!args) { + throw Error('Parameter args is required') + } + + // We need to have one and only one of component and asyncComponent + // This does a "XNOR" + if (!args.component == !args.asyncComponent) { + throw Error('One and only one of component and asyncComponent is required') + } + + // If the component is not async, wrap it into a function returning a Promise + if (args.component) { + args.asyncComponent = () => Promise.resolve(args.component); + } + + // Parameter asyncComponent and each item of conditions must be functions + if (typeof args.asyncComponent != 'function') { + throw Error('Parameter asyncComponent must be a function') + } + if (args.conditions) { + // Ensure it's an array + if (!Array.isArray(args.conditions)) { + args.conditions = [args.conditions]; + } + for (let i = 0; i < args.conditions.length; i++) { + if (!args.conditions[i] || typeof args.conditions[i] != 'function') { + throw Error('Invalid parameter conditions[' + i + ']') + } + } + } + + // Check if we have a placeholder component + if (args.loadingComponent) { + args.asyncComponent.loading = args.loadingComponent; + args.asyncComponent.loadingParams = args.loadingParams || undefined; + } + + // Returns an object that contains all the functions to execute too + // The _sveltesparouter flag is to confirm the object was created by this router + const obj = { + component: args.asyncComponent, + userData: args.userData, + conditions: (args.conditions && args.conditions.length) ? args.conditions : undefined, + props: (args.props && Object.keys(args.props).length) ? args.props : {}, + _sveltesparouter: true + }; + + return obj + } + + const subscriber_queue = []; + /** + * Creates a `Readable` store that allows reading by subscription. + * @param value initial value + * @param {StartStopNotifier}start start and stop notifications for subscriptions + */ + function readable(value, start) { + return { + subscribe: writable(value, start).subscribe + }; + } + /** + * Create a `Writable` store that allows both updating and reading by subscription. + * @param {*=}value initial value + * @param {StartStopNotifier=}start start and stop notifications for subscriptions + */ + function writable(value, start = noop) { + let stop; + const subscribers = []; + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { // store is ready + const run_queue = !subscriber_queue.length; + for (let i = 0; i < subscribers.length; i += 1) { + const s = subscribers[i]; + s[1](); + subscriber_queue.push(s, value); + } + if (run_queue) { + for (let i = 0; i < subscriber_queue.length; i += 2) { + subscriber_queue[i][0](subscriber_queue[i + 1]); + } + subscriber_queue.length = 0; + } + } + } + } + function update(fn) { + set(fn(value)); + } + function subscribe(run, invalidate = noop) { + const subscriber = [run, invalidate]; + subscribers.push(subscriber); + if (subscribers.length === 1) { + stop = start(set) || noop; + } + run(value); + return () => { + const index = subscribers.indexOf(subscriber); + if (index !== -1) { + subscribers.splice(index, 1); + } + if (subscribers.length === 0) { + stop(); + stop = null; + } + }; + } + return { set, update, subscribe }; + } + function derived(stores, fn, initial_value) { + const single = !Array.isArray(stores); + const stores_array = single + ? [stores] + : stores; + const auto = fn.length < 2; + return readable(initial_value, (set) => { + let inited = false; + const values = []; + let pending = 0; + let cleanup = noop; + const sync = () => { + if (pending) { + return; + } + cleanup(); + const result = fn(single ? values[0] : values, set); + if (auto) { + set(result); + } + else { + cleanup = is_function(result) ? result : noop; + } + }; + const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => { + values[i] = value; + pending &= ~(1 << i); + if (inited) { + sync(); + } + }, () => { + pending |= (1 << i); + })); + inited = true; + sync(); + return function stop() { + run_all(unsubscribers); + cleanup(); + }; + }); + } + + function regexparam (str, loose) { + if (str instanceof RegExp) return { keys:false, pattern:str }; + var c, o, tmp, ext, keys=[], pattern='', arr = str.split('/'); + arr[0] || arr.shift(); + + while (tmp = arr.shift()) { + c = tmp[0]; + if (c === '*') { + keys.push('wild'); + pattern += '/(.*)'; + } else if (c === ':') { + o = tmp.indexOf('?', 1); + ext = tmp.indexOf('.', 1); + keys.push( tmp.substring(1, !!~o ? o : !!~ext ? ext : tmp.length) ); + pattern += !!~o && !~ext ? '(?:/([^/]+?))?' : '/([^/]+?)'; + if (!!~ext) pattern += (!!~o ? '?' : '') + '\\' + tmp.substring(ext); + } else { + pattern += '/' + tmp; + } + } + + return { + keys: keys, + pattern: new RegExp('^' + pattern + (loose ? '(?=$|\/)' : '\/?$'), 'i') + }; + } + + /* node_modules/svelte-spa-router/Router.svelte generated by Svelte v3.29.7 */ + + const { Error: Error_1, Object: Object_1, console: console_1 } = globals; + + // (209:0) {:else} + function create_else_block(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + const switch_instance_spread_levels = [/*props*/ ctx[2]]; + var switch_value = /*component*/ ctx[0]; + + function switch_props(ctx) { + let switch_instance_props = {}; + + for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { + switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); + } + + return { + props: switch_instance_props, + $$inline: true + }; + } + + if (switch_value) { + switch_instance = new switch_value(switch_props()); + switch_instance.$on("routeEvent", /*routeEvent_handler_1*/ ctx[7]); + } + + const block = { + c: function create() { + if (switch_instance) create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + m: function mount(target, anchor) { + if (switch_instance) { + mount_component(switch_instance, target, anchor); + } + + insert_dev(target, switch_instance_anchor, anchor); + current = true; + }, + p: function update(ctx, dirty) { + const switch_instance_changes = (dirty & /*props*/ 4) + ? get_spread_update(switch_instance_spread_levels, [get_spread_object(/*props*/ ctx[2])]) + : {}; + + if (switch_value !== (switch_value = /*component*/ ctx[0])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + + check_outros(); + } + + if (switch_value) { + switch_instance = new switch_value(switch_props()); + switch_instance.$on("routeEvent", /*routeEvent_handler_1*/ ctx[7]); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(switch_instance_anchor); + if (switch_instance) destroy_component(switch_instance, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block.name, + type: "else", + source: "(209:0) {:else}", + ctx + }); + + return block; + } + + // (202:0) {#if componentParams} + function create_if_block(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + const switch_instance_spread_levels = [{ params: /*componentParams*/ ctx[1] }, /*props*/ ctx[2]]; + var switch_value = /*component*/ ctx[0]; + + function switch_props(ctx) { + let switch_instance_props = {}; + + for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { + switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); + } + + return { + props: switch_instance_props, + $$inline: true + }; + } + + if (switch_value) { + switch_instance = new switch_value(switch_props()); + switch_instance.$on("routeEvent", /*routeEvent_handler*/ ctx[6]); + } + + const block = { + c: function create() { + if (switch_instance) create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + m: function mount(target, anchor) { + if (switch_instance) { + mount_component(switch_instance, target, anchor); + } + + insert_dev(target, switch_instance_anchor, anchor); + current = true; + }, + p: function update(ctx, dirty) { + const switch_instance_changes = (dirty & /*componentParams, props*/ 6) + ? get_spread_update(switch_instance_spread_levels, [ + dirty & /*componentParams*/ 2 && { params: /*componentParams*/ ctx[1] }, + dirty & /*props*/ 4 && get_spread_object(/*props*/ ctx[2]) + ]) + : {}; + + if (switch_value !== (switch_value = /*component*/ ctx[0])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + + check_outros(); + } + + if (switch_value) { + switch_instance = new switch_value(switch_props()); + switch_instance.$on("routeEvent", /*routeEvent_handler*/ ctx[6]); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(switch_instance_anchor); + if (switch_instance) destroy_component(switch_instance, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block.name, + type: "if", + source: "(202:0) {#if componentParams}", + ctx + }); + + return block; + } + + function create_fragment(ctx) { + let current_block_type_index; + let if_block; + let if_block_anchor; + let current; + const if_block_creators = [create_if_block, create_else_block]; + const if_blocks = []; + + function select_block_type(ctx, dirty) { + if (/*componentParams*/ ctx[1]) return 0; + return 1; + } + + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + + const block = { + c: function create() { + if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error_1("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if_blocks[current_block_type_index].m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); + + if (current_block_type_index === previous_block_index) { + if_blocks[current_block_type_index].p(ctx, dirty); + } else { + group_outros(); + + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + + check_outros(); + if_block = if_blocks[current_block_type_index]; + + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } else { + if_block.p(ctx, dirty); + } + + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if_blocks[current_block_type_index].d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function wrap$1(component, userData, ...conditions) { + // Use the new wrap method and show a deprecation warning + // eslint-disable-next-line no-console + console.warn("Method `wrap` from `svelte-spa-router` is deprecated and will be removed in a future version. Please use `svelte-spa-router/wrap` instead. See http://bit.ly/svelte-spa-router-upgrading"); + + return wrap({ component, userData, conditions }); + } + + /** + * @typedef {Object} Location + * @property {string} location - Location (page/view), for example `/book` + * @property {string} [querystring] - Querystring from the hash, as a string not parsed + */ + /** + * Returns the current location from the hash. + * + * @returns {Location} Location object + * @private + */ + function getLocation() { + const hashPosition = window.location.href.indexOf("#/"); + + let location = hashPosition > -1 + ? window.location.href.substr(hashPosition + 1) + : "/"; + + // Check if there's a querystring + const qsPosition = location.indexOf("?"); + + let querystring = ""; + + if (qsPosition > -1) { + querystring = location.substr(qsPosition + 1); + location = location.substr(0, qsPosition); + } + + return { location, querystring }; + } + + const loc = readable(null, // eslint-disable-next-line prefer-arrow-callback + function start(set) { + set(getLocation()); + + const update = () => { + set(getLocation()); + }; + + window.addEventListener("hashchange", update, false); + + return function stop() { + window.removeEventListener("hashchange", update, false); + }; + }); + + const location = derived(loc, $loc => $loc.location); + const querystring = derived(loc, $loc => $loc.querystring); + + async function push(location) { + if (!location || location.length < 1 || location.charAt(0) != "/" && location.indexOf("#/") !== 0) { + throw Error("Invalid parameter location"); + } + + // Execute this code when the current call stack is complete + await tick(); + + // Note: this will include scroll state in history even when restoreScrollState is false + history.replaceState( + { + scrollX: window.scrollX, + scrollY: window.scrollY + }, + undefined, + undefined + ); + + window.location.hash = (location.charAt(0) == "#" ? "" : "#") + location; + } + + async function pop() { + // Execute this code when the current call stack is complete + await tick(); + + window.history.back(); + } + + async function replace(location) { + if (!location || location.length < 1 || location.charAt(0) != "/" && location.indexOf("#/") !== 0) { + throw Error("Invalid parameter location"); + } + + // Execute this code when the current call stack is complete + await tick(); + + const dest = (location.charAt(0) == "#" ? "" : "#") + location; + + try { + window.history.replaceState(undefined, undefined, dest); + } catch(e) { + // eslint-disable-next-line no-console + console.warn("Caught exception while replacing the current page. If you're running this in the Svelte REPL, please note that the `replace` method might not work in this environment."); + } + + // The method above doesn't trigger the hashchange event, so let's do that manually + window.dispatchEvent(new Event("hashchange")); + } + + function link(node, hrefVar) { + // Only apply to
tags + if (!node || !node.tagName || node.tagName.toLowerCase() != "a") { + throw Error("Action \"link\" can only be used with tags"); + } + + updateLink(node, hrefVar || node.getAttribute("href")); + + return { + update(updated) { + updateLink(node, updated); + } + }; + } + + // Internal function used by the link function + function updateLink(node, href) { + // Destination must start with '/' + if (!href || href.length < 1 || href.charAt(0) != "/") { + throw Error("Invalid value for \"href\" attribute: " + href); + } + + // Add # to the href attribute + node.setAttribute("href", "#" + href); + + node.addEventListener("click", scrollstateHistoryHandler); + } + + /** + * The handler attached to an anchor tag responsible for updating the + * current history state with the current scroll state + * + * @param {HTMLElementEventMap} event - an onclick event attached to an anchor tag + */ + function scrollstateHistoryHandler(event) { + // Prevent default anchor onclick behaviour + event.preventDefault(); + + const href = event.currentTarget.getAttribute("href"); + + // Setting the url (3rd arg) to href will break clicking for reasons, so don't try to do that + history.replaceState( + { + scrollX: window.scrollX, + scrollY: window.scrollY + }, + undefined, + undefined + ); + + // This will force an update as desired, but this time our scroll state will be attached + window.location.hash = href; + } + + function instance($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Router", slots, []); + let { routes = {} } = $$props; + let { prefix = "" } = $$props; + let { restoreScrollState = false } = $$props; + + /** + * Container for a route: path, component + */ + class RouteItem { + /** + * Initializes the object and creates a regular expression from the path, using regexparam. + * + * @param {string} path - Path to the route (must start with '/' or '*') + * @param {SvelteComponent|WrappedComponent} component - Svelte component for the route, optionally wrapped + */ + constructor(path, component) { + if (!component || typeof component != "function" && (typeof component != "object" || component._sveltesparouter !== true)) { + throw Error("Invalid component object"); + } + + // Path must be a regular or expression, or a string starting with '/' or '*' + if (!path || typeof path == "string" && (path.length < 1 || path.charAt(0) != "/" && path.charAt(0) != "*") || typeof path == "object" && !(path instanceof RegExp)) { + throw Error("Invalid value for \"path\" argument"); + } + + const { pattern, keys } = regexparam(path); + this.path = path; + + // Check if the component is wrapped and we have conditions + if (typeof component == "object" && component._sveltesparouter === true) { + this.component = component.component; + this.conditions = component.conditions || []; + this.userData = component.userData; + this.props = component.props || {}; + } else { + // Convert the component to a function that returns a Promise, to normalize it + this.component = () => Promise.resolve(component); + + this.conditions = []; + this.props = {}; + } + + this._pattern = pattern; + this._keys = keys; + } + + /** + * Checks if `path` matches the current route. + * If there's a match, will return the list of parameters from the URL (if any). + * In case of no match, the method will return `null`. + * + * @param {string} path - Path to test + * @returns {null|Object.} List of paramters from the URL if there's a match, or `null` otherwise. + */ + match(path) { + // If there's a prefix, remove it before we run the matching + if (prefix) { + if (typeof prefix == "string" && path.startsWith(prefix)) { + path = path.substr(prefix.length) || "/"; + } else if (prefix instanceof RegExp) { + const match = path.match(prefix); + + if (match && match[0]) { + path = path.substr(match[0].length) || "/"; + } + } + } + + // Check if the pattern matches + const matches = this._pattern.exec(path); + + if (matches === null) { + return null; + } + + // If the input was a regular expression, this._keys would be false, so return matches as is + if (this._keys === false) { + return matches; + } + + const out = {}; + let i = 0; + + while (i < this._keys.length) { + // In the match parameters, URL-decode all values + try { + out[this._keys[i]] = decodeURIComponent(matches[i + 1] || "") || null; + } catch(e) { + out[this._keys[i]] = null; + } + + i++; + } + + return out; + } + + /** + * Dictionary with route details passed to the pre-conditions functions, as well as the `routeLoading`, `routeLoaded` and `conditionsFailed` events + * @typedef {Object} RouteDetail + * @property {string|RegExp} route - Route matched as defined in the route definition (could be a string or a reguar expression object) + * @property {string} location - Location path + * @property {string} querystring - Querystring from the hash + * @property {object} [userData] - Custom data passed by the user + * @property {SvelteComponent} [component] - Svelte component (only in `routeLoaded` events) + * @property {string} [name] - Name of the Svelte component (only in `routeLoaded` events) + */ + /** + * Executes all conditions (if any) to control whether the route can be shown. Conditions are executed in the order they are defined, and if a condition fails, the following ones aren't executed. + * + * @param {RouteDetail} detail - Route detail + * @returns {bool} Returns true if all the conditions succeeded + */ + async checkConditions(detail) { + for (let i = 0; i < this.conditions.length; i++) { + if (!await this.conditions[i](detail)) { + return false; + } + } + + return true; + } + } + + // Set up all routes + const routesList = []; + + if (routes instanceof Map) { + // If it's a map, iterate on it right away + routes.forEach((route, path) => { + routesList.push(new RouteItem(path, route)); + }); + } else { + // We have an object, so iterate on its own properties + Object.keys(routes).forEach(path => { + routesList.push(new RouteItem(path, routes[path])); + }); + } + + // Props for the component to render + let component = null; + + let componentParams = null; + let props = {}; + + // Event dispatcher from Svelte + const dispatch = createEventDispatcher(); + + // Just like dispatch, but executes on the next iteration of the event loop + async function dispatchNextTick(name, detail) { + // Execute this code when the current call stack is complete + await tick(); + + dispatch(name, detail); + } + + // If this is set, then that means we have popped into this var the state of our last scroll position + let previousScrollState = null; + + if (restoreScrollState) { + window.addEventListener("popstate", event => { + // If this event was from our history.replaceState, event.state will contain + // our scroll history. Otherwise, event.state will be null (like on forward + // navigation) + if (event.state && event.state.scrollY) { + previousScrollState = event.state; + } else { + previousScrollState = null; + } + }); + + afterUpdate(() => { + // If this exists, then this is a back navigation: restore the scroll position + if (previousScrollState) { + window.scrollTo(previousScrollState.scrollX, previousScrollState.scrollY); + } else { + // Otherwise this is a forward navigation: scroll to top + window.scrollTo(0, 0); + } + }); + } + + // Always have the latest value of loc + let lastLoc = null; + + // Current object of the component loaded + let componentObj = null; + + // Handle hash change events + // Listen to changes in the $loc store and update the page + // Do not use the $: syntax because it gets triggered by too many things + loc.subscribe(async newLoc => { + lastLoc = newLoc; + + // Find a route matching the location + let i = 0; + + while (i < routesList.length) { + const match = routesList[i].match(newLoc.location); + + if (!match) { + i++; + continue; + } + + const detail = { + route: routesList[i].path, + location: newLoc.location, + querystring: newLoc.querystring, + userData: routesList[i].userData + }; + + // Check if the route can be loaded - if all conditions succeed + if (!await routesList[i].checkConditions(detail)) { + // Don't display anything + $$invalidate(0, component = null); + + componentObj = null; + + // Trigger an event to notify the user, then exit + dispatchNextTick("conditionsFailed", detail); + + return; + } + + // Trigger an event to alert that we're loading the route + // We need to clone the object on every event invocation so we don't risk the object to be modified in the next tick + dispatchNextTick("routeLoading", Object.assign({}, detail)); + + // If there's a component to show while we're loading the route, display it + const obj = routesList[i].component; + + // Do not replace the component if we're loading the same one as before, to avoid the route being unmounted and re-mounted + if (componentObj != obj) { + if (obj.loading) { + $$invalidate(0, component = obj.loading); + componentObj = obj; + $$invalidate(1, componentParams = obj.loadingParams); + $$invalidate(2, props = {}); + + // Trigger the routeLoaded event for the loading component + // Create a copy of detail so we don't modify the object for the dynamic route (and the dynamic route doesn't modify our object too) + dispatchNextTick("routeLoaded", Object.assign({}, detail, { component, name: component.name })); + } else { + $$invalidate(0, component = null); + componentObj = null; + } + + // Invoke the Promise + const loaded = await obj(); + + // Now that we're here, after the promise resolved, check if we still want this component, as the user might have navigated to another page in the meanwhile + if (newLoc != lastLoc) { + // Don't update the component, just exit + return; + } + + // If there is a "default" property, which is used by async routes, then pick that + $$invalidate(0, component = loaded && loaded.default || loaded); + + componentObj = obj; + } + + // Set componentParams only if we have a match, to avoid a warning similar to ` was created with unknown prop 'params'` + // Of course, this assumes that developers always add a "params" prop when they are expecting parameters + if (match && typeof match == "object" && Object.keys(match).length) { + $$invalidate(1, componentParams = match); + } else { + $$invalidate(1, componentParams = null); + } + + // Set static props, if any + $$invalidate(2, props = routesList[i].props); + + // Dispatch the routeLoaded event then exit + // We need to clone the object on every event invocation so we don't risk the object to be modified in the next tick + dispatchNextTick("routeLoaded", Object.assign({}, detail, { component, name: component.name })); + + return; + } + + // If we're still here, there was no match, so show the empty component + $$invalidate(0, component = null); + + componentObj = null; + }); + + const writable_props = ["routes", "prefix", "restoreScrollState"]; + + Object_1.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); + }); + + function routeEvent_handler(event) { + bubble($$self, event); + } + + function routeEvent_handler_1(event) { + bubble($$self, event); + } + + $$self.$$set = $$props => { + if ("routes" in $$props) $$invalidate(3, routes = $$props.routes); + if ("prefix" in $$props) $$invalidate(4, prefix = $$props.prefix); + if ("restoreScrollState" in $$props) $$invalidate(5, restoreScrollState = $$props.restoreScrollState); + }; + + $$self.$capture_state = () => ({ + readable, + derived, + tick, + _wrap: wrap, + wrap: wrap$1, + getLocation, + loc, + location, + querystring, + push, + pop, + replace, + link, + updateLink, + scrollstateHistoryHandler, + createEventDispatcher, + afterUpdate, + regexparam, + routes, + prefix, + restoreScrollState, + RouteItem, + routesList, + component, + componentParams, + props, + dispatch, + dispatchNextTick, + previousScrollState, + lastLoc, + componentObj + }); + + $$self.$inject_state = $$props => { + if ("routes" in $$props) $$invalidate(3, routes = $$props.routes); + if ("prefix" in $$props) $$invalidate(4, prefix = $$props.prefix); + if ("restoreScrollState" in $$props) $$invalidate(5, restoreScrollState = $$props.restoreScrollState); + if ("component" in $$props) $$invalidate(0, component = $$props.component); + if ("componentParams" in $$props) $$invalidate(1, componentParams = $$props.componentParams); + if ("props" in $$props) $$invalidate(2, props = $$props.props); + if ("previousScrollState" in $$props) previousScrollState = $$props.previousScrollState; + if ("lastLoc" in $$props) lastLoc = $$props.lastLoc; + if ("componentObj" in $$props) componentObj = $$props.componentObj; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*restoreScrollState*/ 32) { + // Update history.scrollRestoration depending on restoreScrollState + history.scrollRestoration = restoreScrollState ? "manual" : "auto"; + } + }; + + return [ + component, + componentParams, + props, + routes, + prefix, + restoreScrollState, + routeEvent_handler, + routeEvent_handler_1 + ]; + } + + class Router extends SvelteComponentDev { + constructor(options) { + super(options); + + init(this, options, instance, create_fragment, safe_not_equal, { + routes: 3, + prefix: 4, + restoreScrollState: 5 + }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Router", + options, + id: create_fragment.name + }); + } + + get routes() { + throw new Error_1(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set routes(value) { + throw new Error_1(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + + get prefix() { + throw new Error_1(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set prefix(value) { + throw new Error_1(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + + get restoreScrollState() { + throw new Error_1(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set restoreScrollState(value) { + throw new Error_1(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + var token = /d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g; + var twoDigitsOptional = "[1-9]\\d?"; + var twoDigits = "\\d\\d"; + var threeDigits = "\\d{3}"; + var fourDigits = "\\d{4}"; + var word = "[^\\s]+"; + var literal = /\[([^]*?)\]/gm; + function shorten(arr, sLen) { + var newArr = []; + for (var i = 0, len = arr.length; i < len; i++) { + newArr.push(arr[i].substr(0, sLen)); + } + return newArr; + } + var monthUpdate = function (arrName) { return function (v, i18n) { + var lowerCaseArr = i18n[arrName].map(function (v) { return v.toLowerCase(); }); + var index = lowerCaseArr.indexOf(v.toLowerCase()); + if (index > -1) { + return index; + } + return null; + }; }; + function assign$1(origObj) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + for (var _a = 0, args_1 = args; _a < args_1.length; _a++) { + var obj = args_1[_a]; + for (var key in obj) { + // @ts-ignore ex + origObj[key] = obj[key]; + } + } + return origObj; + } + var dayNames = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ]; + var monthNames = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ]; + var monthNamesShort = shorten(monthNames, 3); + var dayNamesShort = shorten(dayNames, 3); + var defaultI18n = { + dayNamesShort: dayNamesShort, + dayNames: dayNames, + monthNamesShort: monthNamesShort, + monthNames: monthNames, + amPm: ["am", "pm"], + DoFn: function (dayOfMonth) { + return (dayOfMonth + + ["th", "st", "nd", "rd"][dayOfMonth % 10 > 3 + ? 0 + : ((dayOfMonth - (dayOfMonth % 10) !== 10 ? 1 : 0) * dayOfMonth) % 10]); + } + }; + var globalI18n = assign$1({}, defaultI18n); + var setGlobalDateI18n = function (i18n) { + return (globalI18n = assign$1(globalI18n, i18n)); + }; + var regexEscape = function (str) { + return str.replace(/[|\\{()[^$+*?.-]/g, "\\$&"); + }; + var pad = function (val, len) { + if (len === void 0) { len = 2; } + val = String(val); + while (val.length < len) { + val = "0" + val; + } + return val; + }; + var formatFlags = { + D: function (dateObj) { return String(dateObj.getDate()); }, + DD: function (dateObj) { return pad(dateObj.getDate()); }, + Do: function (dateObj, i18n) { + return i18n.DoFn(dateObj.getDate()); + }, + d: function (dateObj) { return String(dateObj.getDay()); }, + dd: function (dateObj) { return pad(dateObj.getDay()); }, + ddd: function (dateObj, i18n) { + return i18n.dayNamesShort[dateObj.getDay()]; + }, + dddd: function (dateObj, i18n) { + return i18n.dayNames[dateObj.getDay()]; + }, + M: function (dateObj) { return String(dateObj.getMonth() + 1); }, + MM: function (dateObj) { return pad(dateObj.getMonth() + 1); }, + MMM: function (dateObj, i18n) { + return i18n.monthNamesShort[dateObj.getMonth()]; + }, + MMMM: function (dateObj, i18n) { + return i18n.monthNames[dateObj.getMonth()]; + }, + YY: function (dateObj) { + return pad(String(dateObj.getFullYear()), 4).substr(2); + }, + YYYY: function (dateObj) { return pad(dateObj.getFullYear(), 4); }, + h: function (dateObj) { return String(dateObj.getHours() % 12 || 12); }, + hh: function (dateObj) { return pad(dateObj.getHours() % 12 || 12); }, + H: function (dateObj) { return String(dateObj.getHours()); }, + HH: function (dateObj) { return pad(dateObj.getHours()); }, + m: function (dateObj) { return String(dateObj.getMinutes()); }, + mm: function (dateObj) { return pad(dateObj.getMinutes()); }, + s: function (dateObj) { return String(dateObj.getSeconds()); }, + ss: function (dateObj) { return pad(dateObj.getSeconds()); }, + S: function (dateObj) { + return String(Math.round(dateObj.getMilliseconds() / 100)); + }, + SS: function (dateObj) { + return pad(Math.round(dateObj.getMilliseconds() / 10), 2); + }, + SSS: function (dateObj) { return pad(dateObj.getMilliseconds(), 3); }, + a: function (dateObj, i18n) { + return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1]; + }, + A: function (dateObj, i18n) { + return dateObj.getHours() < 12 + ? i18n.amPm[0].toUpperCase() + : i18n.amPm[1].toUpperCase(); + }, + ZZ: function (dateObj) { + var offset = dateObj.getTimezoneOffset(); + return ((offset > 0 ? "-" : "+") + + pad(Math.floor(Math.abs(offset) / 60) * 100 + (Math.abs(offset) % 60), 4)); + }, + Z: function (dateObj) { + var offset = dateObj.getTimezoneOffset(); + return ((offset > 0 ? "-" : "+") + + pad(Math.floor(Math.abs(offset) / 60), 2) + + ":" + + pad(Math.abs(offset) % 60, 2)); + } + }; + var monthParse = function (v) { return +v - 1; }; + var emptyDigits = [null, twoDigitsOptional]; + var emptyWord = [null, word]; + var amPm = [ + "isPm", + word, + function (v, i18n) { + var val = v.toLowerCase(); + if (val === i18n.amPm[0]) { + return 0; + } + else if (val === i18n.amPm[1]) { + return 1; + } + return null; + } + ]; + var timezoneOffset = [ + "timezoneOffset", + "[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z?", + function (v) { + var parts = (v + "").match(/([+-]|\d\d)/gi); + if (parts) { + var minutes = +parts[1] * 60 + parseInt(parts[2], 10); + return parts[0] === "+" ? minutes : -minutes; + } + return 0; + } + ]; + var parseFlags = { + D: ["day", twoDigitsOptional], + DD: ["day", twoDigits], + Do: ["day", twoDigitsOptional + word, function (v) { return parseInt(v, 10); }], + M: ["month", twoDigitsOptional, monthParse], + MM: ["month", twoDigits, monthParse], + YY: [ + "year", + twoDigits, + function (v) { + var now = new Date(); + var cent = +("" + now.getFullYear()).substr(0, 2); + return +("" + (+v > 68 ? cent - 1 : cent) + v); + } + ], + h: ["hour", twoDigitsOptional, undefined, "isPm"], + hh: ["hour", twoDigits, undefined, "isPm"], + H: ["hour", twoDigitsOptional], + HH: ["hour", twoDigits], + m: ["minute", twoDigitsOptional], + mm: ["minute", twoDigits], + s: ["second", twoDigitsOptional], + ss: ["second", twoDigits], + YYYY: ["year", fourDigits], + S: ["millisecond", "\\d", function (v) { return +v * 100; }], + SS: ["millisecond", twoDigits, function (v) { return +v * 10; }], + SSS: ["millisecond", threeDigits], + d: emptyDigits, + dd: emptyDigits, + ddd: emptyWord, + dddd: emptyWord, + MMM: ["month", word, monthUpdate("monthNamesShort")], + MMMM: ["month", word, monthUpdate("monthNames")], + a: amPm, + A: amPm, + ZZ: timezoneOffset, + Z: timezoneOffset + }; + // Some common format strings + var globalMasks = { + default: "ddd MMM DD YYYY HH:mm:ss", + shortDate: "M/D/YY", + mediumDate: "MMM D, YYYY", + longDate: "MMMM D, YYYY", + fullDate: "dddd, MMMM D, YYYY", + isoDate: "YYYY-MM-DD", + isoDateTime: "YYYY-MM-DDTHH:mm:ssZ", + shortTime: "HH:mm", + mediumTime: "HH:mm:ss", + longTime: "HH:mm:ss.SSS" + }; + var setGlobalDateMasks = function (masks) { return assign$1(globalMasks, masks); }; + /*** + * Format a date + * @method format + * @param {Date|number} dateObj + * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate' + * @returns {string} Formatted date string + */ + var format = function (dateObj, mask, i18n) { + if (mask === void 0) { mask = globalMasks["default"]; } + if (i18n === void 0) { i18n = {}; } + if (typeof dateObj === "number") { + dateObj = new Date(dateObj); + } + if (Object.prototype.toString.call(dateObj) !== "[object Date]" || + isNaN(dateObj.getTime())) { + throw new Error("Invalid Date pass to format"); + } + mask = globalMasks[mask] || mask; + var literals = []; + // Make literals inactive by replacing them with @@@ + mask = mask.replace(literal, function ($0, $1) { + literals.push($1); + return "@@@"; + }); + var combinedI18nSettings = assign$1(assign$1({}, globalI18n), i18n); + // Apply formatting rules + mask = mask.replace(token, function ($0) { + return formatFlags[$0](dateObj, combinedI18nSettings); + }); + // Inline literal values back into the formatted value + return mask.replace(/@@@/g, function () { return literals.shift(); }); + }; + /** + * Parse a date string into a Javascript Date object / + * @method parse + * @param {string} dateStr Date string + * @param {string} format Date parse format + * @param {i18n} I18nSettingsOptional Full or subset of I18N settings + * @returns {Date|null} Returns Date object. Returns null what date string is invalid or doesn't match format + */ + function parse(dateStr, format, i18n) { + if (i18n === void 0) { i18n = {}; } + if (typeof format !== "string") { + throw new Error("Invalid format in fecha parse"); + } + // Check to see if the format is actually a mask + format = globalMasks[format] || format; + // Avoid regular expression denial of service, fail early for really long strings + // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS + if (dateStr.length > 1000) { + return null; + } + // Default to the beginning of the year. + var today = new Date(); + var dateInfo = { + year: today.getFullYear(), + month: 0, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + isPm: null, + timezoneOffset: null + }; + var parseInfo = []; + var literals = []; + // Replace all the literals with @@@. Hopefully a string that won't exist in the format + var newFormat = format.replace(literal, function ($0, $1) { + literals.push(regexEscape($1)); + return "@@@"; + }); + var specifiedFields = {}; + var requiredFields = {}; + // Change every token that we find into the correct regex + newFormat = regexEscape(newFormat).replace(token, function ($0) { + var info = parseFlags[$0]; + var field = info[0], regex = info[1], requiredField = info[3]; + // Check if the person has specified the same field twice. This will lead to confusing results. + if (specifiedFields[field]) { + throw new Error("Invalid format. " + field + " specified twice in format"); + } + specifiedFields[field] = true; + // Check if there are any required fields. For instance, 12 hour time requires AM/PM specified + if (requiredField) { + requiredFields[requiredField] = true; + } + parseInfo.push(info); + return "(" + regex + ")"; + }); + // Check all the required fields are present + Object.keys(requiredFields).forEach(function (field) { + if (!specifiedFields[field]) { + throw new Error("Invalid format. " + field + " is required in specified format"); + } + }); + // Add back all the literals after + newFormat = newFormat.replace(/@@@/g, function () { return literals.shift(); }); + // Check if the date string matches the format. If it doesn't return null + var matches = dateStr.match(new RegExp(newFormat, "i")); + if (!matches) { + return null; + } + var combinedI18nSettings = assign$1(assign$1({}, globalI18n), i18n); + // For each match, call the parser function for that date part + for (var i = 1; i < matches.length; i++) { + var _a = parseInfo[i - 1], field = _a[0], parser = _a[2]; + var value = parser + ? parser(matches[i], combinedI18nSettings) + : +matches[i]; + // If the parser can't make sense of the value, return null + if (value == null) { + return null; + } + dateInfo[field] = value; + } + if (dateInfo.isPm === 1 && dateInfo.hour != null && +dateInfo.hour !== 12) { + dateInfo.hour = +dateInfo.hour + 12; + } + else if (dateInfo.isPm === 0 && +dateInfo.hour === 12) { + dateInfo.hour = 0; + } + var dateWithoutTZ = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond); + var validateFields = [ + ["month", "getMonth"], + ["day", "getDate"], + ["hour", "getHours"], + ["minute", "getMinutes"], + ["second", "getSeconds"] + ]; + for (var i = 0, len = validateFields.length; i < len; i++) { + // Check to make sure the date field is within the allowed range. Javascript dates allows values + // outside the allowed range. If the values don't match the value was invalid + if (specifiedFields[validateFields[i][0]] && + dateInfo[validateFields[i][0]] !== dateWithoutTZ[validateFields[i][1]]()) { + return null; + } + } + if (dateInfo.timezoneOffset == null) { + return dateWithoutTZ; + } + return new Date(Date.UTC(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute - dateInfo.timezoneOffset, dateInfo.second, dateInfo.millisecond)); + } + var fecha = { + format: format, + parse: parse, + defaultI18n: defaultI18n, + setGlobalDateI18n: setGlobalDateI18n, + setGlobalDateMasks: setGlobalDateMasks + }; + + function supportsLocalStorage() { + try { + if (!localStorage) + return false; + else + return true; + // May only need the above simple test + // - old versions of firefox may cause problem? + // return 'localStorage' in window && window['localStorage']!==null; + } + catch (e) { + return false; + } + } + if (supportsLocalStorage()) + ; + + /** + * Extract an object from another object using specific fields + * @param jsonObj The source object + * @param wantedFields The required fields + * @signature + * U.extractFromObj(jsonObj, wantedFields) + * + * @example + * U.extractFromObj({ a: 1, b: 2 }, ['a']) // => { a: 1 } + * + */ + function extractFromObj(jsonObj, wantedFields) { + return Object.keys(jsonObj).reduce(function (obj, key) { + if (wantedFields.includes(key)) { + var value = Object.getOwnPropertyDescriptor(jsonObj, key).value; + Object.defineProperty(obj, key, { + value: value, + writable: true, + enumerable: true, + configurable: true + }); + } + return obj; + }, {}); + } + + /** + * Get the value of an item inside an object + * @param obj The source object + * @param path The path to the object + * @param defaultValue A default value to be returned + * + * @example + * U.get({ a: 1, b: 2 }, 'b') // => 2 + */ + function get(obj, path, defaultValue) { + if (defaultValue === void 0) { defaultValue = undefined; } + var travel = function (regexp) { + return String.prototype.split + .call(path, regexp) + .filter(Boolean) + .reduce(function (res, key) { + if (res !== null && res !== undefined && res.hasOwnProperty(key)) { + var value = Object.getOwnPropertyDescriptor(res, key).value; + return value; + } + else { + return res; + } + }, obj); + }; + var result = travel(/[,[\].]+?/); + return result === undefined || result === obj ? defaultValue : result; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + /** + * Check if an object has an property + * @param obj The source object + * @param prop The required property + * @returns {boolean} + * + * @example + * U.hasOwn({bob:'1'}, 'bob') // => true + */ + function hasOwn(obj, prop) { + return hasOwnProperty.call(obj, prop); + } + + /** + * Get the hour floor as a Base 32 string + * @param timestamp The timestamp as a number + * @returns {string} + * + * @example + * U.hourFloor(1605532173) // => '1fnp540' + */ + function hourFloor(timestamp) { + return (Math.floor(timestamp / 3600000) * 3600000).toString(32); + } + + /** + * Check if an object is empty + * @param obj The object being checked + * + * @example + * U.isEmpty({}) // => true + * U.isEmpty({ bob: true }) // => false + */ + function isEmpty(obj) { + // @ts-ignore + return [Object, Array].includes((obj || {}).constructor) && !Object.entries(obj || {}).length; + } + + /** + * Get a string phrase for the current time of day + * @param timeString + * @param today + * + * @signature + * U.partOfDay(timeString, today) + * @example + * U.partOfDay('13:00') // => 'Afternoon' + */ + function partOfDay(timeString, today) { + if (today === void 0) { today = false; } + if (timeString === undefined || timeString === null) + timeString = new Date().getHours().toString(); + if (today === undefined) + today = false; + var hours = parseInt(timeString.substring(0, 2), 10); + var dayBit; + if (hours >= 0 && hours < 4) + dayBit = 'Late Night'; + else if (hours >= 4 && hours < 7) + dayBit = 'Early Morning'; + else if (hours >= 7 && hours < 12) + dayBit = 'Morning'; + else if (hours >= 12 && hours < 17) + dayBit = 'Afternoon'; + else if (hours < 21) + dayBit = 'Evening'; + else + dayBit = 'Night'; + if (today) + dayBit = dayBit === 'night' ? 'tonight' : "this " + dayBit; + return dayBit; + } + + /** + * Return the number of Milliseconds to the hour for the supplied timestamp + * @param currentTimsestamp + * @param extra + * @returns {number} + * * + * @signature + * U.toHour(currentTimsestamp, extra) + * @example + * U.toHour('13:00') // => 1605532173 + */ + function toHour(currentTimsestamp, extra) { + if (extra === void 0) { extra = 0; } + return 3600000 - (currentTimsestamp % 3600000) + extra; + } + + function reduceOpenWeather(item, city) { + // Openweather returns timestamps in seconds. Moment requires them in milliseconds. + // Replaced Moment with Fecha. + // Too many issues trying to get Moment packaged into the bundle. + + if (!item || item === null) return {}; + const fts = new Date(item.dt * 1000); + const weatherBlock = item.weather[0]; + + return { + 'timestamp': item.dt, + 'icon': `wi-owm-${weatherBlock.id}`, + 'summary': weatherBlock.description, + 'temp': parseInt(item.main.temp, 10), + 'tempHigh': parseFloat(item.main.temp_max, 10), + 'tempLow': parseFloat(item.main.temp_min, 10), + 'datelong': fecha.format(fts, 'YYYY-MM-DDTHH:mm:ss.SSSZZ'), + 'readdate': fecha.format(fts, 'default'), + 'time': item.dt, + 'date': fecha.format(fts, 'D/M'), + 'day': fecha.format(fts, 'ddd'), + 'city': city + + }; + } + + function reduceNearby(item) { + const obj = {}; + const categories = get(item, 'venue.categories'); + obj.id = get(item, 'venue.id', ''); + obj.name = get(item, 'venue.name', ''); + obj.category = get(categories[0], 'name', ''); + obj.icon = `${get(categories[0], 'icon.prefix', '')}32${get(categories[0], 'icon.suffix', '')}`; + + obj.distance = (get(item, 'venue.location.distance', 0) / 1000).toFixed(2); + + return obj; + } + + /* + const pubdateSrc = fecha.parse(item.pubdate, 'ddd, DD MMM YYYY HH:mm:SS ZZ'); + const pubdate = fecha.format(pubdateSrc, 'dddd MMMM Do, YYYY'); + const description = item.description.replace(/()|()|()|(<\/?(\s|\S)*?>)/g, ''); + this.data = ``; + */ + + // module.exports = { reduceOpenWeather, reduceNearby, reduceEuronews, reduceDarksky }; + + var axios = (function t(e){function r(t,e,n){var a,o={};if(Array.isArray(t))return t.concat(e);for(a in t)o[n?a.toLowerCase():a]=t[a];for(a in e){var i=n?a.toLowerCase():a,u=e[a];o[i]=i in o&&"object"==typeof u?r(o[i],u,"headers"===i):u;}return o}function n(t,n,a,o){"string"!=typeof t&&(t=(n=t).url);var i={config:n},u=r(e,n),s={},c=o||u.data;(u.transformRequest||[]).map(function(t){c=t(c,u.headers)||c;}),c&&"object"==typeof c&&"function"!=typeof c.append&&(c=JSON.stringify(c),s["content-type"]="application/json");var f=document.cookie.match(RegExp("(^|; )"+u.xsrfCookieName+"=([^;]*)"));if(f&&(s[u.xsrfHeaderName]=f[2]),u.auth&&(s.authorization=u.auth),u.baseURL&&(t=new URL(t,u.baseURL)+""),u.params){var p=~t.indexOf("?")?"&":"?";t+=p+(u.paramsSerializer?u.paramsSerializer(u.params):new URLSearchParams(u.params));}return (u.fetch||fetch)(t,{method:a||u.method,body:c,headers:r(u.headers,s,!0),credentials:u.withCredentials?"include":void 0}).then(function(t){for(var e in t)"function"!=typeof t[e]&&(i[e]=t[e]);return (u.validateStatus?u.validateStatus(t.status):t.ok)?"stream"==u.responseType?(i.data=t.body,i):t[u.responseType||"text"]().then(function(t){i.data=t,i.data=JSON.parse(t);}).catch(Object).then(function(){return i}):Promise.reject(i)})}return e=e||{},n.request=n,n.get=function(t,e){return n(t,e,"get")},n.delete=function(t,e){return n(t,e,"delete")},n.options=function(t,e){return n(t,e,"options")},n.post=function(t,e,r){return n(t,r,"post",e)},n.put=function(t,e,r){return n(t,r,"put",e)},n.patch=function(t,e,r){return n(t,r,"patch",e)},n.all=Promise.all,n.spread=function(t){return function(e){return t.apply(this,e)}},n.CancelToken="function"==typeof AbortController?AbortController:Object,n.defaults=e,n.create=t,n}()); + + /** + * Given a number, return a zero-filled string. + * From http://stackoverflow.com/questions/1267283/ + * @param {number} width + * @param {number} number + * @return {string} + */ + var zeroFill = function zeroFill (width, number, pad) { + if (number === undefined) { + return function (number, pad) { + return zeroFill(width, number, pad) + } + } + if (pad === undefined) pad = '0'; + width -= number.toString().length; + if (width > 0) return new Array(width + (/\./.test(number) ? 2 : 1)).join(pad) + number + return number + '' + }; + + var hhMmSs = { + fromMs, + fromS, + toMs, + toS + }; + + + + // Time units with their corresponding values in miliseconds + const HOUR = 3600000; + const MINUTE = 60000; + const SECOND = 1000; + + const TIME_FORMAT_ERRMSG = 'Time format error'; + + // ============================================================================= + // Export functions + // ============================================================================= + + function fromMs (ms, format = 'mm:ss') { + if (typeof ms !== 'number' || Number.isNaN(ms)) { + throw new Error('NaN error') + } + + let absMs = Math.abs(ms); + + let negative = (ms < 0); + let hours = Math.floor(absMs / HOUR); + let minutes = Math.floor(absMs % HOUR / MINUTE); + let seconds = Math.floor(absMs % MINUTE / SECOND); + let miliseconds = Math.floor(absMs % SECOND); + + return formatTime({ + negative, hours, minutes, seconds, miliseconds + }, format) + } + + function fromS (s, format = 'mm:ss') { + if (typeof s !== 'number' || Number.isNaN(s)) { + throw new Error('NaN error') + } + + let ms = s * SECOND; + + return fromMs(ms, format) + } + + function toMs (time, format = 'mm:ss') { + let re; + + if (['mm:ss', 'mm:ss.sss', 'hh:mm:ss', 'hh:mm:ss.sss'].includes(format)) { + re = /^(-)?(?:(\d\d+):)?(\d\d):(\d\d)(\.\d+)?$/; + } else if (format === 'hh:mm') { + re = /^(-)?(\d\d):(\d\d)(?::(\d\d)(?:(\.\d+))?)?$/; + } else { + throw new Error(TIME_FORMAT_ERRMSG) + } + + let result = re.exec(time); + if (!result) throw new Error() + + let negative = result[1] === '-'; + let hours = result[2] | 0; + let minutes = result[3] | 0; + let seconds = result[4] | 0; + let miliseconds = Math.floor(1000 * result[5] | 0); + + if (minutes > 60 || seconds > 60) { + throw new Error() + } + + return (negative ? -1 : 1) * ( + hours * HOUR + minutes * MINUTE + seconds * SECOND + miliseconds + ) + } + + function toS (time, format = 'mm:ss') { + let ms = toMs(time, format); + return Math.floor(ms / SECOND) + } + + // ============================================================================= + // Utility functions + // ============================================================================= + + function formatTime (time, format) { + let showMs; + let showSc; + let showHr; + + switch (format.toLowerCase()) { + case 'hh:mm:ss.sss': + showMs = true; + showSc = true; + showHr = true; + break + case 'hh:mm:ss': + showMs = !(!time.miliseconds); + showSc = true; + showHr = true; + break + case 'hh:mm': + showMs = !(!time.miliseconds); + showSc = showMs || !(!time.seconds); + showHr = true; + break + case 'mm:ss': + showMs = !(!time.miliseconds); + showSc = true; + showHr = !(!time.hours); + break + case 'mm:ss.sss': + showMs = true; + showSc = true; + showHr = !(!time.hours); + break + default: + throw new Error(TIME_FORMAT_ERRMSG) + } + + let hh = zeroFill(2, time.hours); + let mm = zeroFill(2, time.minutes); + let ss = zeroFill(2, time.seconds); + let sss = zeroFill(3, time.miliseconds); + + return (time.negative ? '-' : '') + (showHr ? ( + showMs ? `${hh}:${mm}:${ss}.${sss}` : showSc ? `${hh}:${mm}:${ss}` : `${hh}:${mm}` + ) : ( + showMs ? `${mm}:${ss}.${sss}` : `${mm}:${ss}` + )) + } + + /** + * Helpers. + */ + + var s = 1000; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + + /** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + + var ms = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse$1(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); + }; + + /** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + + function parse$1(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } + } + + /** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; + } + + /** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; + } + + /** + * Pluralization helper. + */ + + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); + } + + var has = Object.prototype.hasOwnProperty; + var isArray = Array.isArray; + + var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; + }()); + + var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + }; + + var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; + }; + + var merge = function merge(target, source, options) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); + }; + + var assign$2 = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); + }; + + var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } + }; + + var encode = function encode(str, defaultEncoder, charset) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); + } + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; + }; + + var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; + }; + + var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; + }; + + var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); + }; + + var combine = function combine(a, b) { + return [].concat(a, b); + }; + + var maybeMap = function maybeMap(val, fn) { + if (isArray(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); + }; + + var utils = { + arrayToObject: arrayToObject, + assign: assign$2, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge + }; + + var replace$1 = String.prototype.replace; + var percentTwenties = /%20/g; + + + + var Format = { + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' + }; + + var formats = utils.assign( + { + 'default': Format.RFC3986, + formatters: { + RFC1738: function (value) { + return replace$1.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + } + }, + Format + ); + + var has$1 = Object.prototype.hasOwnProperty; + + var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } + }; + + var isArray$1 = Array.isArray; + var push$1 = Array.prototype.push; + var pushToArray = function (arr, valueOrArray) { + push$1.apply(arr, isArray$1(valueOrArray) ? valueOrArray : [valueOrArray]); + }; + + var toISO = Date.prototype.toISOString; + + var defaultFormat = formats['default']; + var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false + }; + + var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; + }; + + var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + ) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray$1(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }).join(','); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key') : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key'); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value'))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (isArray$1(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + var value = obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var keyPrefix = isArray$1(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix + : prefix + (allowDots ? '.' + key : '[' + key + ']'); + + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } + + return values; + }; + + var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has$1.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray$1(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; + }; + + var stringify_1 = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray$1(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.formatter, + options.encodeValuesOnly, + options.charset + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; + }; + + var has$2 = Object.prototype.hasOwnProperty; + var isArray$2 = Array.isArray; + + var defaults$1 = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false + }; + + var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); + }; + + var parseArrayValue = function (val, options) { + if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { + return val.split(','); + } + + return val; + }; + + // This is what browsers will submit when the ✓ character occurs in an + // application/x-www-form-urlencoded body and the encoding of the page containing + // the form is iso-8859-1, or when the submitted form has an accept-charset + // attribute of iso-8859-1. Presumably also with other charsets that do not contain + // the ✓ character, such as us-ascii. + var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + + // These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. + var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + + var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults$1.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults$1.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults$1.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray$2(val) ? [val] : val; + } + + if (has$2.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; + }; + + var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; // eslint-disable-line no-param-reassign + } + + return leaf; + }; + + var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = options.depth > 0 && brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has$2.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has$2.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options, valuesParsed); + }; + + var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults$1; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults$1.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults$1.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults$1.allowPrototypes, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults$1.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$1.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults$1.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults$1.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults$1.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults$1.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults$1.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults$1.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults$1.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$1.strictNullHandling + }; + }; + + var parse$2 = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); + }; + + var lib = { + formats: formats, + parse: parse$2, + stringify: stringify_1 + }; + + /** + * Created by WebStorm. + * User: martin + * Date: 12/04/2020 + * Time: 18:04 + + */ + + const prefix = '[Actions]'; + + const baseUrl = 'http://localhost:8110'; + + const Location = writable({}); + const NewsList = writable({}); + const Weather = writable({}); + const Forecast = writable({}); + const NearbyList = writable({}); + + const Venue = writable({}); + + const LLFixed = derived(Location, $Location => $Location.slug || {}); + + const Store = new Map(); + + function urlBuilder(destination, q) { + const reqUrl = new URL(destination, baseUrl); + + for (const key in q) + if (q.hasOwnProperty(key)) + reqUrl.searchParams.append(key, q[key]); + + return reqUrl; + } + + const actions = { + set(i, v) { + Store.set(i, v); + + return v; + }, + get(i) { + return Store.get(i); + }, + has(i) { + return Store.has(i); + }, + async getNewsList() { + console.log(`${prefix} getNewsList`); + + const options = { + 'w' : hourFloor(Date.now()) + }; + + const newsListUrl = `${baseUrl}/news?${lib.stringify(options)}`; + console.log(prefix, newsListUrl); + + await axios.get(newsListUrl) + .then((d) => { + // console.log('>> retrieved', d); + if (d.status === 200) { + // const data = JSON.parse(d.data); + const data = d.data; + console.log(data); + NewsList.set(data); + } + else + console.error(`${prefix} getNewsList error: ${d.status} - ${d.statusText}`); + }).catch((err) => { + console.error(`${prefix} getNewsList error: `, err); + }); + }, + getArticleGuid(id) { + console.log(`${prefix} getArticleGuid ${id}`); + const list = get_store_value(NewsList); + if (!isEmpty(list)) { + console.log(list); + const item = list.items[id]; + console.log(item); + if (item !== null && hasOwn(item, 'guid')) + return item.guid.text; + } + + return null; + }, + async fetchWeather(llFixed) { + console.log(`${prefix} fetchWeather`, llFixed); + if (!llFixed) return {}; + const reqUrl = new URL('/weather', baseUrl); + reqUrl.searchParams.append('ll', llFixed); + reqUrl.searchParams.append('w', hourFloor()); + + const res = await fetch(reqUrl.href); + + return res.json(); + }, + async fetchForecast(llFixed) { + console.log(`${prefix} fetchForecast`, llFixed); + if (!llFixed) return {}; + const reqUrl = new URL('/forecast', baseUrl); + reqUrl.searchParams.append('ll', llFixed); + reqUrl.searchParams.append('w', hourFloor()); + + const res = await fetch(reqUrl.href); + + return res.json(); + }, + async fetchNearbyLocations(q) { + console.log(`${prefix} fetchNearbyLocations`, q); + + if (!q) return {}; + const reqUrl = new URL('/fsexplore', baseUrl); + + for (const key in q) + if (q.hasOwnProperty(key)) + reqUrl.searchParams.append(key, q[key]); + + const res = await fetch(reqUrl.href); + + return res.json(); + }, + async getWeather(llFixed) { + console.log(`${prefix} >> getWeather`); + console.log(prefix, llFixed); + + await this.fetchWeather(llFixed).then((body) => { + const city = body.city.name || ''; + const list = body.list || []; + const newItems = []; + for (const item of list) + newItems.push(reduceOpenWeather(item, city)); + + Weather.set(newItems); + }) + .catch((err) => { + console.error(err); + }); + }, + fetchVenue(q) { + + /* , + 'credentials': 'include' + */ + + if (!q) return {}; + const reqUrl = urlBuilder('/nearbydetail', q); + + fetch(reqUrl.href, { + 'method': 'GET' + + }).then((d) => { + console.log(d); + + return d.json(); + }).then((res) => { + console.log(res); + this.set(res.id, res); + Venue.set(res); + }).catch((e) => { + console.log('error', e); + }); + }, + + getForecast(llFixed) { + console.log(`${prefix} >> getForecast`); + console.log(prefix, llFixed); + this.fetchForecast(llFixed).then((body) => { + console.log(prefix, body); + Forecast.set(body); + }) + .catch((err) => { + console.error(err); + }); + }, + processNearbyLocations(j) { + const newItems = []; + console.log(prefix, 'ProcessNearbylocations...'); + const groups = get(j, 'response.groups'); + const items = groups[0].items; + const totalResults = get(j, 'response.totalResults'); + const fullLocation = get(j, 'response.headerFullLocation'); + + for(const item of items) + newItems.push(reduceNearby(item)); + + return { totalResults, fullLocation, newItems }; + }, + getNearbyLocations(q) { + console.log(`${prefix} >> getNearbyLocations`); + console.log(prefix, q); + this.fetchNearbyLocations(q).then((body) => { + NearbyList.set(this.processNearbyLocations(body)); + }) + .catch((err) => { + console.error(err); + }); + }, + + getBaseUrl() { + return baseUrl; + }, + getVenue(q) { + console.log(`${prefix} >> getVenue`); + console.log(prefix, q); + + if (this.has(q.id)) { + console.log(prefix, 'Retrieving from store...'); + Venue.set(this.get(q.id)); + } + else + this.fetchVenue(q); + }, + clearVenue() { + Venue.set({}); + } + }; + + function setTimers() { + console.log(`${prefix} Starting timers...`); + setInterval(() => { + actions.getNewsList(); + }, ms('1h')); + } + + (async function() { + await actions.getNewsList(); + + setTimers(); + })(); + + /* src/components/Greeter.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$1 } = globals; + const file = "src/components/Greeter.svelte"; + + function create_fragment$1(ctx) { + let div1; + let h2; + let t0; + let t1; + let div0; + let html_tag; + let t2; + let t3; + + const block = { + c: function create() { + div1 = element("div"); + h2 = element("h2"); + t0 = text(/*todaySegment*/ ctx[0]); + t1 = space(); + div0 = element("div"); + t2 = space(); + t3 = text(/*place*/ ctx[2]); + add_location(h2, file, 77, 4, 1599); + html_tag = new HtmlTag(t2); + add_location(div0, file, 78, 4, 1627); + attr_dev(div1, "class", "mui-panel greetPanel mui--text-center svelte-1pwyheg"); + add_location(div1, file, 76, 0, 1543); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div1, anchor); + append_dev(div1, h2); + append_dev(h2, t0); + append_dev(div1, t1); + append_dev(div1, div0); + html_tag.m(/*icon*/ ctx[1], div0); + append_dev(div0, t2); + append_dev(div0, t3); + }, + p: function update(ctx, [dirty]) { + if (dirty & /*todaySegment*/ 1) set_data_dev(t0, /*todaySegment*/ ctx[0]); + if (dirty & /*icon*/ 2) html_tag.p(/*icon*/ ctx[1]); + if (dirty & /*place*/ 4) set_data_dev(t3, /*place*/ ctx[2]); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div1); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$1.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefx = "[Greeter:Comp]"; + + function instance$1($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Greeter", slots, []); + let date = new Date(); + let todaySegment = partOfDay(); + let icon = ""; + let place = ""; + let atHome = false; + let atWork = false; + let locationName = ""; + let homeIcon = "🏠"; + let workIcon = "🏢"; + let greeterTimerId = setTimeout(() => greeterTick(), toHour()); + + function greeterTick() { + date = new Date(); + $$invalidate(0, todaySegment = partOfDay()); + console.log("Date", date); + greeterTimerId = setTimeout(() => greeterTick(), toHour(Date.now())); + } + + const unsubLocation = Location.subscribe(async v => { + console.log(`${prefx} :Location changed`); + + if (v.hasOwnProperty("atHome")) { + $$invalidate(4, atHome = v.atHome); + $$invalidate(5, atWork = v.atWork); + $$invalidate(6, locationName = v.city); + } else { + console.log(`${prefx} :No location yet`); + } + }); + + onDestroy(() => { + unsubLocation(); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$1.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + prefx, + onDestroy, + Location, + partOfDay, + toHour, + date, + todaySegment, + icon, + place, + atHome, + atWork, + locationName, + homeIcon, + workIcon, + greeterTimerId, + greeterTick, + unsubLocation + }); + + $$self.$inject_state = $$props => { + if ("date" in $$props) date = $$props.date; + if ("todaySegment" in $$props) $$invalidate(0, todaySegment = $$props.todaySegment); + if ("icon" in $$props) $$invalidate(1, icon = $$props.icon); + if ("place" in $$props) $$invalidate(2, place = $$props.place); + if ("atHome" in $$props) $$invalidate(4, atHome = $$props.atHome); + if ("atWork" in $$props) $$invalidate(5, atWork = $$props.atWork); + if ("locationName" in $$props) $$invalidate(6, locationName = $$props.locationName); + if ("homeIcon" in $$props) $$invalidate(8, homeIcon = $$props.homeIcon); + if ("workIcon" in $$props) $$invalidate(9, workIcon = $$props.workIcon); + if ("greeterTimerId" in $$props) greeterTimerId = $$props.greeterTimerId; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*atHome, atWork, locationName*/ 112) { + { + console.log(`${prefx} Reactive!`); + let prefix = ""; + + if (atHome) { + $$invalidate(1, icon = homeIcon); + prefix = "At home, "; + } else if (atWork) { + $$invalidate(1, icon = workIcon); + prefix = "At work, "; + } else $$invalidate(1, icon = ""); + + if (locationName !== "") $$invalidate(2, place = `${prefix}${locationName}`); + } + } + }; + + return [todaySegment, icon, place]; + } + + class Greeter extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$1, create_fragment$1, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Greeter", + options, + id: create_fragment$1.name + }); + } + } + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; + } + + function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var utils$1 = createCommonjsModule(function (module, exports) { + function partOfDay(timeString, today) { + console.log(new Date()); + if (timeString === undefined || timeString === null) + timeString = (new Date()).getHours().toString(); + + if (today === undefined) + today = false; + + const hours = timeString.substring(0, 2); + let dayBit = ''; + + console.log('Hours', hours); + + if (hours >= 0 && hours < 4) + dayBit = 'Late Night'; + + else if (hours >= 4 && hours < 7) + dayBit = 'Early Morning'; + + else if (hours >= 7 && hours < 12) + dayBit = 'Morning'; + + else if (hours >= 12 && hours < 17) + dayBit = 'Afternoon'; + + else if (hours < 21) + dayBit = 'Evening'; + + else + dayBit = 'Night'; + + if (today) + if (dayBit === 'night') { + dayBit = 'tonight'; + } + else { + dayBit = `this ${ dayBit}`; + } + + console.log('partOfDay', dayBit); + + return dayBit; + } + + function toHour(extra = 0) { + const now = new Date(); + + return (3600000 - (now.getTime() % 3600000)) + extra; + } + + function hourFloor() { + const now = new Date(); + + return parseInt(~~(now.getTime() / 3600000) * 3600000, 10).toString(32); + } + + function distance(lat1, lon1, lat2, lon2) { + const p = 0.017453292519943295; // Math.PI / 180 + const c = Math.cos; + const a = 0.5 - c((lat2 - lat1) * p) / 2 + + c(lat1 * p) * c(lat2 * p) * + (1 - c((lon2 - lon1) * p)) / 2; + + return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km + } + + const maybePluralize = (count, noun, suffix = 's') => + `${count} ${noun}${count !== 1 ? suffix : ''}`; + + /** + * + * @param fn + * @param time + * @returns {Function} + * @private + */ + function debounce(fn, time) { + let timeout; + + return function (...args) { // <-- not an arrow function + const functionCall = () => fn.apply(this, args); + + clearTimeout(timeout); + timeout = setTimeout(functionCall, time); + }; + } + + /** + * + * @param callback + * @param limit + * @returns {Function} + * @private + */ + function throttle (callback, limit) { + var wait = false; + + return function () { + if (!wait) { + callback.apply(null, arguments); + wait = true; + setTimeout(function () { + wait = false; + }, limit); + } + }; + } + + /** + * + * @param func + * @returns {function(): *} + * @private + */ + + function once(func) { + var alreadyCalled = false; + var result; + + return function() { + if (!alreadyCalled) { + result = func.apply(this, arguments); + alreadyCalled = true; + } + + return result; + }; + } + /* function isEmpty(obj) { + for(const key in obj) + if(obj.hasOwnProperty(key)) return false; + + return true; + }*/ + + const isEmpty = obj => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length; + + const hasOwnProperty = Object.prototype.hasOwnProperty; + + function hasOwn(obj, prop) { + return hasOwnProperty.call(obj, prop); + } + + const Logger = class { + constructor(prefix) { + this.prefix = prefix; + } + + log() { + const pre = `[DEBUG] ${this.prefix} -`; + const _args = [...arguments]; + _args.unshift(pre); + console.log(..._args); + } + }; + + const get = (obj, path, defaultValue = undefined) => { + const travel = regexp => + String.prototype.split + .call(path, regexp) + .filter(Boolean) + .reduce((res, key) => (res !== null && res !== undefined ? res[key] : res), obj); + const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/); + + return result === undefined || result === obj ? defaultValue : result; + }; + + function supportsLocalStorage() { + try { + if (!localStorage)return false; + else return true; + // May only need the above simple test + // - old versions of firefox may cause problem? + // return 'localStorage' in window && window['localStorage']!==null; + } + catch(e) { + return false; + } + } + + let LocalStorage = {}; + + if (supportsLocalStorage()) + LocalStorage = { + 'set':function ( i, v ) { + if (typeof v === 'object' || typeof v === 'array') + localStorage[i] = JSON.stringify(v); + else + localStorage[i] = v; + }, + 'get':function ( i ) { + return localStorage[i]; + }, + 'exists':function(i) { + return !(typeof(localStorage[i]) === 'undefined'); + } + }; + else + LocalStorage = { + 'save':function ( i, v ) { + document.cookie = `${i }=${ encodeURIComponent(v)}`; + }, + 'load':function ( i ) { + var s = `; ${ document.cookie };`, + p = s.indexOf(`; ${ i }=`); + if (p < 0)return ''; + p = p + i.length + 3; + var p2 = s.indexOf(';', p + 1); + + return decodeURIComponent(s.substring(p, p2)); + } + }; + + exports = { + 'LocalStorage': LocalStorage, + 'partOfDay' : partOfDay, + 'toHour': toHour, + 'hourFloor': hourFloor, + 'distance': distance, + 'maybePluralize': maybePluralize, + 'debounce': debounce, + 'throttle': throttle, + 'once': once, + 'isEmpty': isEmpty, + 'hasOwn': hasOwn, + 'get': get, + 'Logger': Logger + }; + + module.exports = { partOfDay, toHour, hourFloor, distance, maybePluralize, debounce, throttle, once, isEmpty, hasOwn, get, Logger, LocalStorage }; + + module.exports = exports; + }); + + /* src/components/Weather.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$2 } = globals; + const file$1 = "src/components/Weather.svelte"; + + // (142:0) {#if doRender} + function create_if_block$1(ctx) { + let div11; + let div0; + let t1; + let div10; + let div7; + let div2; + let div1; + let t2_value = /*weatherData*/ ctx[0].temp + ""; + let t2; + let t3; + let div1_class_value; + let t4; + let div3; + let i0; + let i0_class_value; + let t5; + let div6; + let div5; + let div4; + let t6_value = /*weatherData*/ ctx[0].summary + ""; + let t6; + let t7; + let span0; + let t8_value = /*weatherData*/ ctx[0].tempHigh + ""; + let t8; + let t9; + let span0_class_value; + let t10; + let span1; + let t11_value = /*weatherData*/ ctx[0].tempLow + ""; + let t11; + let t12; + let span1_class_value; + let t13; + let div8; + let t14; + let t15_value = /*weatherData*/ ctx[0].city + ""; + let t15; + let t16; + let t17_value = /*weatherData*/ ctx[0].readdate + ""; + let t17; + let t18; + let div9; + let i1; + let t19; + let span2; + let mounted; + let dispose; + + const block = { + c: function create() { + div11 = element("div"); + div0 = element("div"); + div0.textContent = "Weather"; + t1 = space(); + div10 = element("div"); + div7 = element("div"); + div2 = element("div"); + div1 = element("div"); + t2 = text(t2_value); + t3 = text("°"); + t4 = space(); + div3 = element("div"); + i0 = element("i"); + t5 = space(); + div6 = element("div"); + div5 = element("div"); + div4 = element("div"); + t6 = text(t6_value); + t7 = space(); + span0 = element("span"); + t8 = text(t8_value); + t9 = text("°"); + t10 = text(" /\n "); + span1 = element("span"); + t11 = text(t11_value); + t12 = text("°"); + t13 = space(); + div8 = element("div"); + t14 = text("For "); + t15 = text(t15_value); + t16 = text(" to "); + t17 = text(t17_value); + t18 = space(); + div9 = element("div"); + i1 = element("i"); + t19 = space(); + span2 = element("span"); + span2.textContent = "See forecast"; + attr_dev(div0, "class", "mui--text-title cardTitle"); + add_location(div0, file$1, 143, 8, 3909); + attr_dev(div1, "class", div1_class_value = "mui--text-display1 mui--text-center " + /*weatherData*/ ctx[0].tempClass); + add_location(div1, file$1, 148, 20, 4084); + attr_dev(div2, "class", "mui-col-md-4 mui-col-xs-4"); + add_location(div2, file$1, 147, 16, 4024); + attr_dev(i0, "class", i0_class_value = "mui--text-display1 wi " + /*weatherData*/ ctx[0].icon); + add_location(i0, file$1, 151, 20, 4299); + attr_dev(div3, "class", "mui-col-md-4 mui-col-xs-4 mui--text-center"); + add_location(div3, file$1, 150, 16, 4222); + attr_dev(div4, "class", "mui--text-subhead summary"); + add_location(div4, file$1, 155, 24, 4485); + attr_dev(span0, "class", span0_class_value = "mui--text-body2 " + /*weatherData*/ ctx[0].tempHighClass); + add_location(span0, file$1, 156, 24, 4576); + attr_dev(span1, "class", span1_class_value = "mui--text-body " + /*weatherData*/ ctx[0].tempLowClass); + add_location(span1, file$1, 157, 24, 4691); + add_location(div5, file$1, 154, 20, 4455); + attr_dev(div6, "class", "mui-col-md-4 mui-col-xs-4"); + add_location(div6, file$1, 153, 16, 4395); + add_location(div7, file$1, 146, 12, 4002); + attr_dev(div8, "class", "mui--text-dark-secondary mui--text-caption mui--text-right"); + add_location(div8, file$1, 161, 12, 4838); + attr_dev(i1, "class", "seemore fa fa-forward mui--align-middle "); + add_location(i1, file$1, 165, 16, 5061); + attr_dev(span2, "class", "seemore mui--align-middle"); + add_location(span2, file$1, 165, 73, 5118); + attr_dev(div9, "id", "wForecast"); + attr_dev(div9, "class", "cardLink"); + add_location(div9, file$1, 164, 12, 5007); + attr_dev(div10, "id", "weather"); + attr_dev(div10, "class", "svelte-qsj87u"); + add_location(div10, file$1, 144, 8, 3970); + attr_dev(div11, "id", "weatherShell"); + attr_dev(div11, "class", "mui-panel"); + add_location(div11, file$1, 142, 4, 3859); + }, + m: function mount(target, anchor) { + insert_dev(target, div11, anchor); + append_dev(div11, div0); + append_dev(div11, t1); + append_dev(div11, div10); + append_dev(div10, div7); + append_dev(div7, div2); + append_dev(div2, div1); + append_dev(div1, t2); + append_dev(div1, t3); + append_dev(div7, t4); + append_dev(div7, div3); + append_dev(div3, i0); + append_dev(div7, t5); + append_dev(div7, div6); + append_dev(div6, div5); + append_dev(div5, div4); + append_dev(div4, t6); + append_dev(div5, t7); + append_dev(div5, span0); + append_dev(span0, t8); + append_dev(span0, t9); + append_dev(div5, t10); + append_dev(div5, span1); + append_dev(span1, t11); + append_dev(span1, t12); + append_dev(div10, t13); + append_dev(div10, div8); + append_dev(div8, t14); + append_dev(div8, t15); + append_dev(div8, t16); + append_dev(div8, t17); + append_dev(div10, t18); + append_dev(div10, div9); + append_dev(div9, i1); + append_dev(div9, t19); + append_dev(div9, span2); + + if (!mounted) { + dispose = listen_dev(span2, "click", /*viewForecast*/ ctx[2], false, false, false); + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (dirty & /*weatherData*/ 1 && t2_value !== (t2_value = /*weatherData*/ ctx[0].temp + "")) set_data_dev(t2, t2_value); + + if (dirty & /*weatherData*/ 1 && div1_class_value !== (div1_class_value = "mui--text-display1 mui--text-center " + /*weatherData*/ ctx[0].tempClass)) { + attr_dev(div1, "class", div1_class_value); + } + + if (dirty & /*weatherData*/ 1 && i0_class_value !== (i0_class_value = "mui--text-display1 wi " + /*weatherData*/ ctx[0].icon)) { + attr_dev(i0, "class", i0_class_value); + } + + if (dirty & /*weatherData*/ 1 && t6_value !== (t6_value = /*weatherData*/ ctx[0].summary + "")) set_data_dev(t6, t6_value); + if (dirty & /*weatherData*/ 1 && t8_value !== (t8_value = /*weatherData*/ ctx[0].tempHigh + "")) set_data_dev(t8, t8_value); + + if (dirty & /*weatherData*/ 1 && span0_class_value !== (span0_class_value = "mui--text-body2 " + /*weatherData*/ ctx[0].tempHighClass)) { + attr_dev(span0, "class", span0_class_value); + } + + if (dirty & /*weatherData*/ 1 && t11_value !== (t11_value = /*weatherData*/ ctx[0].tempLow + "")) set_data_dev(t11, t11_value); + + if (dirty & /*weatherData*/ 1 && span1_class_value !== (span1_class_value = "mui--text-body " + /*weatherData*/ ctx[0].tempLowClass)) { + attr_dev(span1, "class", span1_class_value); + } + + if (dirty & /*weatherData*/ 1 && t15_value !== (t15_value = /*weatherData*/ ctx[0].city + "")) set_data_dev(t15, t15_value); + if (dirty & /*weatherData*/ 1 && t17_value !== (t17_value = /*weatherData*/ ctx[0].readdate + "")) set_data_dev(t17, t17_value); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div11); + mounted = false; + dispose(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$1.name, + type: "if", + source: "(142:0) {#if doRender}", + ctx + }); + + return block; + } + + function create_fragment$2(ctx) { + let if_block_anchor; + let if_block = /*doRender*/ ctx[1] && create_if_block$1(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, [dirty]) { + if (/*doRender*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$1(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$2.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$1 = "[Weather:Comp]️"; + + function makeRenderable(data) { + const outObj = { ...data }; + outObj.tempClass = `temp${data.temp}`; + outObj.tempHighClass = `temp${~~data.tempHigh}`; + outObj.tempLowClass = `temp${~~data.tempLow}`; + return outObj; + } + + function instance$2($$self, $$props, $$invalidate) { + let $LLFixed; + validate_store(LLFixed, "LLFixed"); + component_subscribe($$self, LLFixed, $$value => $$invalidate(7, $LLFixed = $$value)); + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Weather", slots, []); + let log = null; + let llFixed = actions.get("llFixed"); + let slug = actions.get("weatherSlug"); + let weatherData = actions.get("weatherData") || {}; + let doRender = false; + let timerID = 0; + + onMount(() => { + const _slug = actions.get("weatherSlug"); + console.log(`${prefix$1} - old slug`, _slug); + }); + + const unsubWeather = Weather.subscribe(async v => { + console.log(`${prefix$1} Weathersub: Current slug`, slug); + + if (!utils$1.isEmpty(v)) { + console.log(`${prefix$1} >> Weather: Changed`); + + // weatherData = makeRenderable(v[0]); + $$invalidate(0, weatherData = actions.set("weatherData", makeRenderable(v[0]))); + + // console.log(v); + $$invalidate(1, doRender = true); + } + }); + + const unsubLLFixed = LLFixed.subscribe(async v => { + console.log(`${prefix$1} >> Weather:LLFixed changed`, v); + + if (!utils$1.isEmpty(v)) { + if (!utils$1.isEmpty(slug)) { + console.log(`${prefix$1} old vs new slug timestamps`, new Date(slug.timestamp), new Date(v.timestamp)); + } + + if (v.llFixed !== llFixed) { + console.log(`${prefix$1} v.llFixed !== llFixed !!!!!`); + llFixed = actions.set("llFixed", v.llFixed); + slug = actions.set("weatherSlug", { ...v }); + onChange(); + } + + timerID = setTimeout(() => onChange(true), ms("15m")); + } else { + console.log(`${prefix$1} >> Weather:No LLFixed yet`); + } + }); + + onDestroy(() => { + clearTimeout(timerID); + timerID = 0; + unsubLLFixed(); + unsubWeather(); + }); + + async function onChange(byTimer = false) { + console.warn(`${prefix$1} >> onChange`, byTimer, new Date()); + let doGetWeather = false; + clearTimeout(timerID); + + if (!log) { + console.info(`${prefix$1} First run`); + doGetWeather = true; + } else { + console.log(prefix$1, log); + const now = new Date().getTime(); + console.log(`${prefix$1} >> Now`, now); + const timeDiff = now - log.timestamp; + const dist = utils$1.distance(log.lat, log.lon, slug.lat, slug.lon); + console.log(`${prefix$1} Weather distance:`, dist, timeDiff); + + if (dist > 5 && timeDiff > ms("30m")) { + console.log(`${prefix$1} Weather - moved greater than 5km`); + doGetWeather = true; + } else if (timeDiff > ms("60m")) { + console.log(`${prefix$1} Weather hourly update`); + doGetWeather = true; + } + } + + if (doGetWeather) { + actions.getWeather(llFixed); + } + + timerID = setTimeout(() => onChange(true), ms("15m")); + } + + function logUpdate() { + const timestamp = { timestamp: new Date().getTime() }; + log = { ...$LLFixed, ...timestamp }; + } + + function viewForecast() { + push("/forecast"); + } + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$2.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + push, + actions, + Weather, + LLFixed, + distance: utils$1.distance, + hourFloor: utils$1.hourFloor, + isEmpty: utils$1.isEmpty, + onMount, + onDestroy, + ms, + log, + llFixed, + slug, + weatherData, + doRender, + timerID, + prefix: prefix$1, + unsubWeather, + unsubLLFixed, + makeRenderable, + onChange, + logUpdate, + viewForecast, + $LLFixed + }); + + $$self.$inject_state = $$props => { + if ("log" in $$props) log = $$props.log; + if ("llFixed" in $$props) llFixed = $$props.llFixed; + if ("slug" in $$props) slug = $$props.slug; + if ("weatherData" in $$props) $$invalidate(0, weatherData = $$props.weatherData); + if ("doRender" in $$props) $$invalidate(1, doRender = $$props.doRender); + if ("timerID" in $$props) timerID = $$props.timerID; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [weatherData, doRender, viewForecast]; + } + + class Weather_1 extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$2, create_fragment$2, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Weather_1", + options, + id: create_fragment$2.name + }); + } + } + + /* src/components/NewsCard.svelte generated by Svelte v3.29.7 */ + const file$2 = "src/components/NewsCard.svelte"; + + function create_fragment$3(ctx) { + let div2; + let div0; + let t0_value = /*item*/ ctx[0].title + ""; + let t0; + let t1; + let div1; + let t2_value = /*item*/ ctx[0].pubdate + ""; + let t2; + let t3; + let p; + let t4_value = /*item*/ ctx[0].description + ""; + let t4; + let mounted; + let dispose; + + const block = { + c: function create() { + div2 = element("div"); + div0 = element("div"); + t0 = text(t0_value); + t1 = space(); + div1 = element("div"); + t2 = text(t2_value); + t3 = space(); + p = element("p"); + t4 = text(t4_value); + attr_dev(div0, "class", "mui--text-subhead mui--text-accent"); + add_location(div0, file$2, 13, 4, 216); + attr_dev(div1, "class", "published mui--text-dark-secondary mui--text-caption"); + add_location(div1, file$2, 14, 4, 311); + attr_dev(p, "class", "mui--text-body1"); + add_location(p, file$2, 16, 4, 403); + attr_dev(div2, "class", "scrollCard"); + add_location(div2, file$2, 12, 0, 187); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div2, anchor); + append_dev(div2, div0); + append_dev(div0, t0); + append_dev(div2, t1); + append_dev(div2, div1); + append_dev(div1, t2); + append_dev(div2, t3); + append_dev(div2, p); + append_dev(p, t4); + + if (!mounted) { + dispose = listen_dev(div0, "click", /*clickHandler*/ ctx[1], false, false, false); + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*item*/ 1 && t0_value !== (t0_value = /*item*/ ctx[0].title + "")) set_data_dev(t0, t0_value); + if (dirty & /*item*/ 1 && t2_value !== (t2_value = /*item*/ ctx[0].pubdate + "")) set_data_dev(t2, t2_value); + if (dirty & /*item*/ 1 && t4_value !== (t4_value = /*item*/ ctx[0].description + "")) set_data_dev(t4, t4_value); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div2); + mounted = false; + dispose(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$3.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$3($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("NewsCard", slots, []); + let { item } = $$props; + let { id } = $$props; + + function clickHandler() { + push(`/news/${id}`); + } + + const writable_props = ["item", "id"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("item" in $$props) $$invalidate(0, item = $$props.item); + if ("id" in $$props) $$invalidate(2, id = $$props.id); + }; + + $$self.$capture_state = () => ({ push, item, id, clickHandler }); + + $$self.$inject_state = $$props => { + if ("item" in $$props) $$invalidate(0, item = $$props.item); + if ("id" in $$props) $$invalidate(2, id = $$props.id); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [item, clickHandler, id]; + } + + class NewsCard extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { item: 0, id: 2 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "NewsCard", + options, + id: create_fragment$3.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*item*/ ctx[0] === undefined && !("item" in props)) { + console.warn(" was created without expected prop 'item'"); + } + + if (/*id*/ ctx[2] === undefined && !("id" in props)) { + console.warn(" was created without expected prop 'id'"); + } + } + + get item() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set item(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + + get id() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set id(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/components/LatestNews.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$3 } = globals; + const file$3 = "src/components/LatestNews.svelte"; + + function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[4] = list[i]; + child_ctx[6] = i; + return child_ctx; + } + + // (46:0) {#if doRender} + function create_if_block$2(ctx) { + let div3; + let div0; + let t1; + let div1; + let t2; + let div2; + let i; + let t3; + let span; + let current; + let each_value = /*list*/ ctx[1]; + validate_each_argument(each_value); + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); + } + + const out = i => transition_out(each_blocks[i], 1, 1, () => { + each_blocks[i] = null; + }); + + const block = { + c: function create() { + div3 = element("div"); + div0 = element("div"); + div0.textContent = "Latest News"; + t1 = space(); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t2 = space(); + div2 = element("div"); + i = element("i"); + t3 = space(); + span = element("span"); + span.textContent = "More news"; + attr_dev(div0, "class", "mui--text-title cardTitle"); + add_location(div0, file$3, 47, 8, 1230); + attr_dev(div1, "id", "news"); + attr_dev(div1, "class", "scrolling-wrapper-flexbox svelte-zqt8u1"); + add_location(div1, file$3, 48, 8, 1295); + attr_dev(i, "class", "seemore fa fa-forward mui--align-middle "); + add_location(i, file$3, 54, 12, 1515); + attr_dev(span, "class", "seemore align-middle"); + add_location(span, file$3, 54, 70, 1573); + attr_dev(div2, "id", "newsMore"); + attr_dev(div2, "class", "cardLink"); + add_location(div2, file$3, 53, 8, 1466); + attr_dev(div3, "id", "newsShell"); + attr_dev(div3, "class", "mui-panel"); + add_location(div3, file$3, 46, 4, 1183); + }, + m: function mount(target, anchor) { + insert_dev(target, div3, anchor); + append_dev(div3, div0); + append_dev(div3, t1); + append_dev(div3, div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + + append_dev(div3, t2); + append_dev(div3, div2); + append_dev(div2, i); + append_dev(div2, t3); + append_dev(div2, span); + current = true; + }, + p: function update(ctx, dirty) { + if (dirty & /*list*/ 2) { + each_value = /*list*/ ctx[1]; + validate_each_argument(each_value); + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + transition_in(each_blocks[i], 1); + } else { + each_blocks[i] = create_each_block(child_ctx); + each_blocks[i].c(); + transition_in(each_blocks[i], 1); + each_blocks[i].m(div1, null); + } + } + + group_outros(); + + for (i = each_value.length; i < each_blocks.length; i += 1) { + out(i); + } + + check_outros(); + } + }, + i: function intro(local) { + if (current) return; + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o: function outro(local) { + each_blocks = each_blocks.filter(Boolean); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div3); + destroy_each(each_blocks, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$2.name, + type: "if", + source: "(46:0) {#if doRender}", + ctx + }); + + return block; + } + + // (50:12) {#each list as item, i} + function create_each_block(ctx) { + let newscard; + let current; + + newscard = new NewsCard({ + props: { item: /*item*/ ctx[4], id: /*i*/ ctx[6] }, + $$inline: true + }); + + const block = { + c: function create() { + create_component(newscard.$$.fragment); + }, + m: function mount(target, anchor) { + mount_component(newscard, target, anchor); + current = true; + }, + p: function update(ctx, dirty) { + const newscard_changes = {}; + if (dirty & /*list*/ 2) newscard_changes.item = /*item*/ ctx[4]; + newscard.$set(newscard_changes); + }, + i: function intro(local) { + if (current) return; + transition_in(newscard.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(newscard.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + destroy_component(newscard, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block.name, + type: "each", + source: "(50:12) {#each list as item, i}", + ctx + }); + + return block; + } + + function create_fragment$4(ctx) { + let if_block_anchor; + let current; + let if_block = /*doRender*/ ctx[0] && create_if_block$2(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + if (/*doRender*/ ctx[0]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*doRender*/ 1) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block$2(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$4.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$2 = "[LatestNews:Comp]️"; + const imgStripper = /<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>/ig; + + function instance$4($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("LatestNews", slots, []); + let doRender = true; + let list; + let listData; + + const unsubNewsList = NewsList.subscribe(async v => { + if (!utils$1.isEmpty(v)) { + console.log(`${prefix$2} LatestNews:newsList: Changed`); + const worklist = v.items.slice(0, 10); + + // sanitise the items.. + $$invalidate(1, list = worklist.map(item => { + const tempItem = item; + tempItem.description = tempItem.description.replace(imgStripper, ""); + tempItem.description = tempItem.description === "1" ? "" : tempItem.description; + return tempItem; + })); + + $$invalidate(0, doRender = true); + } else { + $$invalidate(0, doRender = false); + } + }); + + onDestroy(() => { + unsubNewsList(); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$3.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onDestroy, + NewsList, + isEmpty: utils$1.isEmpty, + NewsCard, + prefix: prefix$2, + imgStripper, + doRender, + list, + listData, + unsubNewsList + }); + + $$self.$inject_state = $$props => { + if ("doRender" in $$props) $$invalidate(0, doRender = $$props.doRender); + if ("list" in $$props) $$invalidate(1, list = $$props.list); + if ("listData" in $$props) listData = $$props.listData; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [doRender, list]; + } + + class LatestNews extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$4, create_fragment$4, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "LatestNews", + options, + id: create_fragment$4.name + }); + } + } + + /* src/components/NearbyPlaces.svelte generated by Svelte v3.29.7 */ + + const { Object: Object_1$1, console: console_1$4 } = globals; + const file$4 = "src/components/NearbyPlaces.svelte"; + + function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[5] = list[i]; + child_ctx[7] = i; + return child_ctx; + } + + // (52:0) {#if loaded === true} + function create_if_block$3(ctx) { + let div2; + let div0; + let t1; + let div1; + let each_value = /*list*/ ctx[1]; + validate_each_argument(each_value); + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + } + + const block = { + c: function create() { + div2 = element("div"); + div0 = element("div"); + div0.textContent = "Nearby places"; + t1 = space(); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr_dev(div0, "class", "text-title cardTitle"); + add_location(div0, file$4, 53, 8, 1887); + attr_dev(div1, "id", "nearbyPlaces"); + add_location(div1, file$4, 54, 8, 1949); + attr_dev(div2, "id", "nearbyShell"); + attr_dev(div2, "class", "mui-panel"); + add_location(div2, file$4, 52, 4, 1838); + }, + m: function mount(target, anchor) { + insert_dev(target, div2, anchor); + append_dev(div2, div0); + append_dev(div2, t1); + append_dev(div2, div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p: function update(ctx, dirty) { + if (dirty & /*list, clickHandler*/ 6) { + each_value = /*list*/ ctx[1]; + validate_each_argument(each_value); + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$1(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$1(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div1, null); + } + } + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value.length; + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div2); + destroy_each(each_blocks, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$3.name, + type: "if", + source: "(52:0) {#if loaded === true}", + ctx + }); + + return block; + } + + // (56:12) {#each list as item, section} + function create_each_block$1(ctx) { + let div; + let img; + let img_src_value; + let t0; + let span; + let t1_value = /*item*/ ctx[5].title + ""; + let t1; + let t2; + let div_data_section_value; + let div_data_query_value; + let mounted; + let dispose; + + const block = { + c: function create() { + div = element("div"); + img = element("img"); + t0 = space(); + span = element("span"); + t1 = text(t1_value); + t2 = space(); + attr_dev(img, "class", "mui--align-middle"); + if (img.src !== (img_src_value = /*item*/ ctx[5].icon)) attr_dev(img, "src", img_src_value); + attr_dev(img, "width", "32px"); + attr_dev(img, "height", "32px"); + set_style(img, "-webkit-filter", "invert(100%)"); + add_location(img, file$4, 58, 20, 2202); + attr_dev(span, "class", "mui--text-dark mui--text-subhead"); + add_location(span, file$4, 59, 20, 2338); + attr_dev(div, "class", "itemRow align-middle"); + attr_dev(div, "data-section", div_data_section_value = /*item*/ ctx[5].section); + attr_dev(div, "data-query", div_data_query_value = /*item*/ ctx[5].query); + add_location(div, file$4, 56, 16, 2031); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + append_dev(div, img); + append_dev(div, t0); + append_dev(div, span); + append_dev(span, t1); + append_dev(div, t2); + + if (!mounted) { + dispose = listen_dev(div, "click", prevent_default(/*clickHandler*/ ctx[2]), false, true, false); + mounted = true; + } + }, + p: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + mounted = false; + dispose(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$1.name, + type: "each", + source: "(56:12) {#each list as item, section}", + ctx + }); + + return block; + } + + function create_fragment$5(ctx) { + let if_block_anchor; + let if_block = /*loaded*/ ctx[0] === true && create_if_block$3(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, [dirty]) { + if (/*loaded*/ ctx[0] === true) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$3(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$5.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$3 = "[NearbyPlaces]"; + + function instance$5($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("NearbyPlaces", slots, []); + let unsubLLFixed; + let loaded; + let llFixed; + + const list = [ + { + "icon": "https://ss3.4sqi.net/img/categories_v2/food/default_32.png", + "title": "Restaurants", + "section": "food" + }, + { + "icon": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_32.png", + "title": "Cafes", + "section": "coffee" + }, + { + "icon": "https://ss3.4sqi.net/img/categories_v2/nightlife/default_32.png", + "title": "Bars", + "section": "drinks" + }, + { + "icon": "https://ss3.4sqi.net/img/categories_v2/food/diner_32.png", + "title": "Diner", + "query": "Diner" + }, + { + "icon": "https://ss3.4sqi.net/img/categories_v2/food/mexican_32.png", + "title": "Mexican Restaurant", + "query": "Mexican" + }, + { + "icon": "https://ss3.4sqi.net/img/categories_v2/food/deli_32.png", + "title": "Subways", + "query": "subway" + } + ]; + + onMount(() => { + console.log(prefix$3, "Mounted"); + + unsubLLFixed = LLFixed.subscribe(v => { + $$invalidate(0, loaded = !isEmpty(v)); + if (!isEmpty(v)) llFixed = v.llFixed; + console.log(prefix$3, v); + }); + }); + + onDestroy(() => { + unsubLLFixed(); + }); + + function clickHandler(e) { + console.log(e); + const target = e.target.nodeName === "DIV" ? e.target : e.path[1]; + console.log(prefix$3, target.dataset); + + const _dataset = { + "ll": llFixed, + "section": "", + "query": "", + "limit": 30 + }; + + const dataset = Object.assign(_dataset, target.dataset); + console.log(prefix$3, lib.stringify(dataset)); + push(`/nearbylocations?${lib.stringify(dataset)}`); + } + + const writable_props = []; + + Object_1$1.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$4.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onMount, + onDestroy, + push, + qs: lib, + LLFixed, + isEmpty, + unsubLLFixed, + loaded, + llFixed, + prefix: prefix$3, + list, + clickHandler + }); + + $$self.$inject_state = $$props => { + if ("unsubLLFixed" in $$props) unsubLLFixed = $$props.unsubLLFixed; + if ("loaded" in $$props) $$invalidate(0, loaded = $$props.loaded); + if ("llFixed" in $$props) llFixed = $$props.llFixed; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [loaded, list, clickHandler]; + } + + class NearbyPlaces extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$5, create_fragment$5, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "NearbyPlaces", + options, + id: create_fragment$5.name + }); + } + } + + /* src/pages/Home.svelte generated by Svelte v3.29.7 */ + const file$5 = "src/pages/Home.svelte"; + + function create_fragment$6(ctx) { + let div0; + let greeter; + let t0; + let div1; + let nearbyplaces; + let t1; + let latestnews; + let t2; + let weather; + let current; + greeter = new Greeter({ $$inline: true }); + nearbyplaces = new NearbyPlaces({ $$inline: true }); + latestnews = new LatestNews({ $$inline: true }); + weather = new Weather_1({ $$inline: true }); + + const block = { + c: function create() { + div0 = element("div"); + create_component(greeter.$$.fragment); + t0 = space(); + div1 = element("div"); + create_component(nearbyplaces.$$.fragment); + t1 = space(); + create_component(latestnews.$$.fragment); + t2 = space(); + create_component(weather.$$.fragment); + attr_dev(div0, "class", "mui-container"); + add_location(div0, file$5, 14, 0, 365); + attr_dev(div1, "class", "container pad"); + attr_dev(div1, "id", "viewFrame"); + add_location(div1, file$5, 17, 0, 415); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div0, anchor); + mount_component(greeter, div0, null); + insert_dev(target, t0, anchor); + insert_dev(target, div1, anchor); + mount_component(nearbyplaces, div1, null); + append_dev(div1, t1); + mount_component(latestnews, div1, null); + append_dev(div1, t2); + mount_component(weather, div1, null); + current = true; + }, + p: noop, + i: function intro(local) { + if (current) return; + transition_in(greeter.$$.fragment, local); + transition_in(nearbyplaces.$$.fragment, local); + transition_in(latestnews.$$.fragment, local); + transition_in(weather.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(greeter.$$.fragment, local); + transition_out(nearbyplaces.$$.fragment, local); + transition_out(latestnews.$$.fragment, local); + transition_out(weather.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div0); + destroy_component(greeter); + if (detaching) detach_dev(t0); + if (detaching) detach_dev(div1); + destroy_component(nearbyplaces); + destroy_component(latestnews); + destroy_component(weather); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$6.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$6($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Home", slots, []); + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + Greeter, + Weather: Weather_1, + LatestNews, + NearbyPlaces + }); + + return []; + } + + class Home extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$6, create_fragment$6, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Home", + options, + id: create_fragment$6.name + }); + } + } + + /* src/components/LineLoader.svelte generated by Svelte v3.29.7 */ + + const file$6 = "src/components/LineLoader.svelte"; + + function create_fragment$7(ctx) { + let div1; + let div0; + + const block = { + c: function create() { + div1 = element("div"); + div0 = element("div"); + attr_dev(div0, "class", "bar svelte-l0ab3y"); + add_location(div0, file$6, 88, 4, 1933); + attr_dev(div1, "class", "loader svelte-l0ab3y"); + add_location(div1, file$6, 87, 0, 1908); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div1, anchor); + append_dev(div1, div0); + }, + p: noop, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div1); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$7.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$7($$self, $$props) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("LineLoader", slots, []); + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + return []; + } + + class LineLoader extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$7, create_fragment$7, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "LineLoader", + options, + id: create_fragment$7.name + }); + } + } + + /* src/components/Spinner.svelte generated by Svelte v3.29.7 */ + + const file$7 = "src/components/Spinner.svelte"; + + function create_fragment$8(ctx) { + let div1; + let div0; + let svg; + let circle; + + const block = { + c: function create() { + div1 = element("div"); + div0 = element("div"); + svg = svg_element("svg"); + circle = svg_element("circle"); + attr_dev(circle, "class", "path svelte-1hflp4w"); + attr_dev(circle, "cx", "50"); + attr_dev(circle, "cy", "50"); + attr_dev(circle, "r", "20"); + attr_dev(circle, "fill", "none"); + attr_dev(circle, "stroke-width", "2"); + attr_dev(circle, "stroke-miterlimit", "10"); + add_location(circle, file$7, 147, 12, 2824); + attr_dev(svg, "class", "circular svelte-1hflp4w"); + attr_dev(svg, "viewBox", "25 25 50 50"); + add_location(svg, file$7, 146, 8, 2767); + attr_dev(div0, "class", "loader svelte-1hflp4w"); + add_location(div0, file$7, 145, 4, 2738); + attr_dev(div1, "class", "showbox svelte-1hflp4w"); + add_location(div1, file$7, 144, 0, 2712); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div1, anchor); + append_dev(div1, div0); + append_dev(div0, svg); + append_dev(svg, circle); + }, + p: noop, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div1); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$8.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + function instance$8($$self, $$props) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Spinner", slots, []); + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + return []; + } + + class Spinner extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$8, create_fragment$8, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Spinner", + options, + id: create_fragment$8.name + }); + } + } + + /* src/pages/NewsItemPage.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$5 } = globals; + const file$8 = "src/pages/NewsItemPage.svelte"; + + // (130:0) {:catch error} + function create_catch_block(ctx) { + let p; + let t0; + let t1_value = /*error*/ ctx[11].message + ""; + let t1; + + const block = { + c: function create() { + p = element("p"); + t0 = text("Something went wrong: "); + t1 = text(t1_value); + add_location(p, file$8, 130, 4, 3024); + }, + m: function mount(target, anchor) { + insert_dev(target, p, anchor); + append_dev(p, t0); + append_dev(p, t1); + }, + p: function update(ctx, dirty) { + if (dirty & /*promise*/ 1 && t1_value !== (t1_value = /*error*/ ctx[11].message + "")) set_data_dev(t1, t1_value); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(p); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_catch_block.name, + type: "catch", + source: "(130:0) {:catch error}", + ctx + }); + + return block; + } + + // (119:0) {:then} + function create_then_block(ctx) { + let if_block_anchor; + let if_block = /*newsItemLoaded*/ ctx[2] && create_if_block$4(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, dirty) { + if (/*newsItemLoaded*/ ctx[2]) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$4(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_then_block.name, + type: "then", + source: "(119:0) {:then}", + ctx + }); + + return block; + } + + // (120:4) {#if newsItemLoaded} + function create_if_block$4(ctx) { + let div4; + let div0; + let img; + let img_src_value; + let img_alt_value; + let t0; + let div3; + let div1; + let h1; + let t1_value = /*newsItem*/ ctx[1].title + ""; + let t1; + let t2; + let div2; + let raw_value = /*newsItem*/ ctx[1].html + ""; + + const block = { + c: function create() { + div4 = element("div"); + div0 = element("div"); + img = element("img"); + t0 = space(); + div3 = element("div"); + div1 = element("div"); + h1 = element("h1"); + t1 = text(t1_value); + t2 = space(); + div2 = element("div"); + attr_dev(img, "class", "img svelte-zziljk"); + if (img.src !== (img_src_value = /*newsItem*/ ctx[1].image)) attr_dev(img, "src", img_src_value); + attr_dev(img, "alt", img_alt_value = /*newsItem*/ ctx[1].title); + add_location(img, file$8, 121, 45, 2705); + set_style(div0, "text-align", "center"); + add_location(div0, file$8, 121, 12, 2672); + add_location(h1, file$8, 123, 21, 2862); + add_location(div1, file$8, 123, 16, 2857); + attr_dev(div2, "id", "newscontent"); + add_location(div2, file$8, 124, 16, 2910); + attr_dev(div3, "class", "mui-container"); + set_style(div3, "margin-bottom", "50px"); + add_location(div3, file$8, 122, 12, 2783); + attr_dev(div4, "class", "newsarticle"); + add_location(div4, file$8, 120, 8, 2634); + }, + m: function mount(target, anchor) { + insert_dev(target, div4, anchor); + append_dev(div4, div0); + append_dev(div0, img); + append_dev(div4, t0); + append_dev(div4, div3); + append_dev(div3, div1); + append_dev(div1, h1); + append_dev(h1, t1); + append_dev(div3, t2); + append_dev(div3, div2); + div2.innerHTML = raw_value; + }, + p: function update(ctx, dirty) { + if (dirty & /*newsItem*/ 2 && img.src !== (img_src_value = /*newsItem*/ ctx[1].image)) { + attr_dev(img, "src", img_src_value); + } + + if (dirty & /*newsItem*/ 2 && img_alt_value !== (img_alt_value = /*newsItem*/ ctx[1].title)) { + attr_dev(img, "alt", img_alt_value); + } + + if (dirty & /*newsItem*/ 2 && t1_value !== (t1_value = /*newsItem*/ ctx[1].title + "")) set_data_dev(t1, t1_value); + if (dirty & /*newsItem*/ 2 && raw_value !== (raw_value = /*newsItem*/ ctx[1].html + "")) div2.innerHTML = raw_value; }, + d: function destroy(detaching) { + if (detaching) detach_dev(div4); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$4.name, + type: "if", + source: "(120:4) {#if newsItemLoaded}", + ctx + }); + + return block; + } + + // (117:16) {:then} + function create_pending_block(ctx) { + let lineloader; + let current; + lineloader = new LineLoader({ $$inline: true }); + + const block = { + c: function create() { + create_component(lineloader.$$.fragment); + }, + m: function mount(target, anchor) { + mount_component(lineloader, target, anchor); + current = true; + }, + p: noop, + i: function intro(local) { + if (current) return; + transition_in(lineloader.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(lineloader.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + destroy_component(lineloader, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_pending_block.name, + type: "pending", + source: "(117:16) {:then}", + ctx + }); + + return block; + } + + function create_fragment$9(ctx) { + let div; + let promise_1; + let current; + + let info = { + ctx, + current: null, + token: null, + hasCatch: true, + pending: create_pending_block, + then: create_then_block, + catch: create_catch_block, + error: 11, + blocks: [,,,] + }; + + handle_promise(promise_1 = /*promise*/ ctx[0], info); + + const block = { + c: function create() { + div = element("div"); + info.block.c(); + attr_dev(div, "class", "container svelte-zziljk"); + add_location(div, file$8, 115, 0, 2534); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + info.block.m(div, info.anchor = null); + info.mount = () => div; + info.anchor = null; + current = true; + }, + p: function update(new_ctx, [dirty]) { + ctx = new_ctx; + info.ctx = ctx; + + if (dirty & /*promise*/ 1 && promise_1 !== (promise_1 = /*promise*/ ctx[0]) && handle_promise(promise_1, info)) ; else { + const child_ctx = ctx.slice(); + child_ctx[11] = info.resolved; + info.block.p(child_ctx, dirty); + } + }, + i: function intro(local) { + if (current) return; + transition_in(info.block); + current = true; + }, + o: function outro(local) { + for (let i = 0; i < 3; i += 1) { + const block = info.blocks[i]; + transition_out(block); + } + + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + info.block.d(); + info.token = null; + info = null; + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$9.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$4 = "[NewsItemPage]️"; + + function instance$9($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("NewsItemPage", slots, []); + const logger = new utils$1.Logger("📄️ NewsItemPage"); + let promise; + let { params = {} } = $$props; + let id; + let listLoaded = false; + let newsItem = {}; + let newsItemLoaded = false; + const baseUrl = actions.getBaseUrl(); + let timerID = 0; + + onMount(() => { + logger.log(`${prefix$4} mounted...`); + stateCheck(); + }); + + onDestroy(() => { + clearTimeout(timerID); + }); + + NewsList.subscribe(v => { + logger.log(`${prefix$4} NewsList.subscribe empty?`, utils$1.isEmpty(v)); + if (!utils$1.isEmpty(v)) listLoaded = true; + }); + + function stateCheck() { + logger.log(`${prefix$4} stateCheck:listloaded?`, listLoaded); + + if (listLoaded) { + clearTimeout(timerID); + getPage(); + } else { + logger.log(`${prefix$4} nothing yet...`); + + timerID = setTimeout( + () => { + stateCheck(); + }, + 500 + ); + } + } + + async function getPage() { + let guid; + + if (utils$1.hasOwn(params, "id") && listLoaded) { + id = params.id; + guid = actions.getArticleGuid(id); + } else { + logger.log("!! nope"); + return; + } + + const options = { guid, "w": utils$1.hourFloor() }; + const newsItemUrl = `${baseUrl}/article?${lib.stringify(options)}`; + logger.log(newsItemUrl); + + // await axios.get(newsItemUrl) + $$invalidate(0, promise = axios.get(newsItemUrl).then(d => { + logger.log(`${prefix$4} >> retrieved`, d); + + if (d.status === 200) { + const data = JSON.parse(d.data); + logger.log(data); + $$invalidate(1, newsItem = data); + $$invalidate(2, newsItemLoaded = true); + return newsItem; + } else console.error(`${prefix$4} getPage error: ${d.status} - ${d.statusText}`); + }).catch(err => { + console.error(`${prefix$4} getPage error: `, err); + })); + } + + const writable_props = ["params"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$5.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("params" in $$props) $$invalidate(3, params = $$props.params); + }; + + $$self.$capture_state = () => ({ + onMount, + onDestroy, + NewsList, + actions, + hasOwn: utils$1.hasOwn, + hourFloor: utils$1.hourFloor, + isEmpty: utils$1.isEmpty, + Logger: utils$1.Logger, + qs: lib, + axios, + LineLoader, + Spinner, + logger, + promise, + params, + id, + listLoaded, + newsItem, + newsItemLoaded, + prefix: prefix$4, + baseUrl, + timerID, + stateCheck, + getPage + }); + + $$self.$inject_state = $$props => { + if ("promise" in $$props) $$invalidate(0, promise = $$props.promise); + if ("params" in $$props) $$invalidate(3, params = $$props.params); + if ("id" in $$props) id = $$props.id; + if ("listLoaded" in $$props) listLoaded = $$props.listLoaded; + if ("newsItem" in $$props) $$invalidate(1, newsItem = $$props.newsItem); + if ("newsItemLoaded" in $$props) $$invalidate(2, newsItemLoaded = $$props.newsItemLoaded); + if ("timerID" in $$props) timerID = $$props.timerID; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*params*/ 8) { + { + // logger.debug( params); + logger.log(`${prefix$4} hasOwn(id)`, utils$1.hasOwn(params, "id")); + + logger.log(`${prefix$4} bNewsItemPage hasOwn(id)`, utils$1.hasOwn(params, "id")); + } + } + }; + + return [promise, newsItem, newsItemLoaded, params]; + } + + class NewsItemPage extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$9, create_fragment$9, safe_not_equal, { params: 3 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "NewsItemPage", + options, + id: create_fragment$9.name + }); + } + + get params() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set params(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/components/forecast/Currently.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$6 } = globals; + const file$9 = "src/components/forecast/Currently.svelte"; + + // (38:0) {#if visible === true} + function create_if_block$5(ctx) { + let div3; + let div0; + let i0; + let i0_class_value; + let t0_value = /*currently*/ ctx[0].summary + ""; + let t0; + let t1; + let div1; + let i1; + let t2_value = /*currently*/ ctx[0].tempMax + ""; + let t2; + let t3; + let i2; + let t4_value = /*currently*/ ctx[0].tempMin + ""; + let t4; + let t5; + let t6; + let div2; + let t7_value = /*currently*/ ctx[0].temperature + ""; + let t7; + let t8; + let div2_class_value; + + const block = { + c: function create() { + div3 = element("div"); + div0 = element("div"); + i0 = element("i"); + t0 = text(t0_value); + t1 = space(); + div1 = element("div"); + i1 = element("i"); + t2 = text(t2_value); + t3 = text("°\n "); + i2 = element("i"); + t4 = text(t4_value); + t5 = text("°"); + t6 = space(); + div2 = element("div"); + t7 = text(t7_value); + t8 = text("°"); + attr_dev(i0, "class", i0_class_value = "medium wi " + /*weatherIcon*/ ctx[2]); + add_location(i0, file$9, 39, 37, 876); + attr_dev(div0, "class", "mui--text-title"); + add_location(div0, file$9, 39, 8, 847); + attr_dev(i1, "class", "small fa fa-up mui--align-middle "); + add_location(i1, file$9, 41, 12, 967); + attr_dev(i2, "class", "small fa fa-down mui--align-middle "); + add_location(i2, file$9, 42, 12, 1049); + add_location(div1, file$9, 40, 8, 949); + attr_dev(div2, "class", div2_class_value = "large " + /*tempClass*/ ctx[1]); + add_location(div2, file$9, 44, 8, 1144); + attr_dev(div3, "class", "forecastCurrently mui-panel glassy"); + add_location(div3, file$9, 38, 4, 790); + }, + m: function mount(target, anchor) { + insert_dev(target, div3, anchor); + append_dev(div3, div0); + append_dev(div0, i0); + append_dev(div0, t0); + append_dev(div3, t1); + append_dev(div3, div1); + append_dev(div1, i1); + append_dev(div1, t2); + append_dev(div1, t3); + append_dev(div1, i2); + append_dev(div1, t4); + append_dev(div1, t5); + append_dev(div3, t6); + append_dev(div3, div2); + append_dev(div2, t7); + append_dev(div2, t8); + }, + p: function update(ctx, dirty) { + if (dirty & /*weatherIcon*/ 4 && i0_class_value !== (i0_class_value = "medium wi " + /*weatherIcon*/ ctx[2])) { + attr_dev(i0, "class", i0_class_value); + } + + if (dirty & /*currently*/ 1 && t0_value !== (t0_value = /*currently*/ ctx[0].summary + "")) set_data_dev(t0, t0_value); + if (dirty & /*currently*/ 1 && t2_value !== (t2_value = /*currently*/ ctx[0].tempMax + "")) set_data_dev(t2, t2_value); + if (dirty & /*currently*/ 1 && t4_value !== (t4_value = /*currently*/ ctx[0].tempMin + "")) set_data_dev(t4, t4_value); + if (dirty & /*currently*/ 1 && t7_value !== (t7_value = /*currently*/ ctx[0].temperature + "")) set_data_dev(t7, t7_value); + + if (dirty & /*tempClass*/ 2 && div2_class_value !== (div2_class_value = "large " + /*tempClass*/ ctx[1])) { + attr_dev(div2, "class", div2_class_value); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div3); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$5.name, + type: "if", + source: "(38:0) {#if visible === true}", + ctx + }); + + return block; + } + + function create_fragment$a(ctx) { + let if_block_anchor; + let if_block = /*visible*/ ctx[3] === true && create_if_block$5(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, [dirty]) { + if (/*visible*/ ctx[3] === true) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$5(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$a.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$5 = "[Currently]️"; + + function instance$a($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Currently", slots, []); + let currently; + let tempClass; + let weatherIcon; + let visible = false; + let unsubForecast; + + onMount(() => { + console.log(prefix$5, "Mounted"); + + unsubForecast = Forecast.subscribe(v => { + $$invalidate(0, currently = { ...v.currently }); + $$invalidate(3, visible = !isEmpty(v)); + }); + }); + + onDestroy(() => { + unsubForecast(); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$6.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onDestroy, + onMount, + Forecast, + actions, + isEmpty, + prefix: prefix$5, + currently, + tempClass, + weatherIcon, + visible, + unsubForecast + }); + + $$self.$inject_state = $$props => { + if ("currently" in $$props) $$invalidate(0, currently = $$props.currently); + if ("tempClass" in $$props) $$invalidate(1, tempClass = $$props.tempClass); + if ("weatherIcon" in $$props) $$invalidate(2, weatherIcon = $$props.weatherIcon); + if ("visible" in $$props) $$invalidate(3, visible = $$props.visible); + if ("unsubForecast" in $$props) unsubForecast = $$props.unsubForecast; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*currently*/ 1) { + { + $$invalidate(1, tempClass = currently ? `temp${~~currently.temperature}` : ""); + $$invalidate(2, weatherIcon = currently ? `wi-forecast-io-${currently.icon}` : ""); + } + } + }; + + return [currently, tempClass, weatherIcon, visible]; + } + + class Currently extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$a, create_fragment$a, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Currently", + options, + id: create_fragment$a.name + }); + } + } + + /* src/components/forecast/Daylight.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$7 } = globals; + const file$a = "src/components/forecast/Daylight.svelte"; + + // (98:0) {#if currently > 0} + function create_if_block$6(ctx) { + let div; + let svg; + let rect0; + let rect1; + let rect2; + let rect3; + let rect4; + + const block = { + c: function create() { + div = element("div"); + svg = svg_element("svg"); + rect0 = svg_element("rect"); + rect1 = svg_element("rect"); + rect2 = svg_element("rect"); + rect3 = svg_element("rect"); + rect4 = svg_element("rect"); + attr_dev(rect0, "id", "day"); + attr_dev(rect0, "y", "12"); + attr_dev(rect0, "width", "432"); + attr_dev(rect0, "height", "8"); + set_style(rect0, "fill", "#b3b3b3"); + add_location(rect0, file$a, 100, 8, 2212); + attr_dev(rect1, "id", "daylight"); + attr_dev(rect1, "x", /*dSunrise*/ ctx[1]); + attr_dev(rect1, "y", "8"); + attr_dev(rect1, "width", /*dSunlength*/ ctx[2]); + attr_dev(rect1, "height", "16"); + set_style(rect1, "fill", "#ead87c"); + set_style(rect1, "stroke-width", ".70687"); + add_location(rect1, file$a, 101, 8, 2288); + attr_dev(rect2, "id", "sunrise"); + attr_dev(rect2, "x", /*dSunrise*/ ctx[1]); + attr_dev(rect2, "y", "8"); + attr_dev(rect2, "width", "4"); + attr_dev(rect2, "height", "24"); + set_style(rect2, "fill", "#eaab7c"); + set_style(rect2, "stroke-width", ".95084"); + add_location(rect2, file$a, 102, 8, 2409); + attr_dev(rect3, "id", "sunset"); + attr_dev(rect3, "x", /*dSunset*/ ctx[3]); + attr_dev(rect3, "y", "8"); + attr_dev(rect3, "width", "4"); + attr_dev(rect3, "height", "24"); + set_style(rect3, "fill", "#eaab7c"); + set_style(rect3, "stroke-width", ".95084"); + add_location(rect3, file$a, 103, 8, 2520); + attr_dev(rect4, "id", "now"); + attr_dev(rect4, "x", /*currently*/ ctx[0]); + attr_dev(rect4, "width", "4"); + attr_dev(rect4, "height", "24"); + set_style(rect4, "fill", "#b72bee"); + set_style(rect4, "stroke-width", ".95084"); + add_location(rect4, file$a, 104, 8, 2629); + attr_dev(svg, "id", "sunlightSvg"); + attr_dev(svg, "width", "100%"); + attr_dev(svg, "height", "32"); + attr_dev(svg, "viewBox", "0,0,432,32"); + attr_dev(svg, "class", "svelte-1mhhc57"); + add_location(svg, file$a, 99, 4, 2134); + attr_dev(div, "id", "sunlight"); + attr_dev(div, "class", "sunlight svelte-1mhhc57"); + add_location(div, file$a, 98, 0, 2093); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + append_dev(div, svg); + append_dev(svg, rect0); + append_dev(svg, rect1); + append_dev(svg, rect2); + append_dev(svg, rect3); + append_dev(svg, rect4); + }, + p: function update(ctx, dirty) { + if (dirty & /*dSunrise*/ 2) { + attr_dev(rect1, "x", /*dSunrise*/ ctx[1]); + } + + if (dirty & /*dSunlength*/ 4) { + attr_dev(rect1, "width", /*dSunlength*/ ctx[2]); + } + + if (dirty & /*dSunrise*/ 2) { + attr_dev(rect2, "x", /*dSunrise*/ ctx[1]); + } + + if (dirty & /*dSunset*/ 8) { + attr_dev(rect3, "x", /*dSunset*/ ctx[3]); + } + + if (dirty & /*currently*/ 1) { + attr_dev(rect4, "x", /*currently*/ ctx[0]); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$6.name, + type: "if", + source: "(98:0) {#if currently > 0}", + ctx + }); + + return block; + } + + function create_fragment$b(ctx) { + let if_block_anchor; + let if_block = /*currently*/ ctx[0] > 0 && create_if_block$6(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, [dirty]) { + if (/*currently*/ ctx[0] > 0) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$6(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$b.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$6 = "[Daylight]️"; + const day = 86400000; + const hour = 3600000; + const minute = 60000; + const divider = 200000; + + function dayRebuilder(v) { + const d = v.split(":"); + return parseInt(d[0], 10) * hour + parseInt(d[1], 10) * minute; + } + + function toMinute(currentTimsestamp, extra = 0) { + return 60000 - currentTimsestamp % 60000 + extra; + } + + function instance$b($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Daylight", slots, []); + let { sunrise } = $$props; + let { sunset } = $$props; + let currently = 0; + let dSunrise = 0; + let dSunlength = 0; + let dSunset = 432; + let sunlightTimerID = 0; + let startOfDay; + const Currently = writable(0); + + onMount(() => { + console.log(prefix$6, "Mounted"); + + // sunlightTimerID = setTimeout(()=> recalcTick(), toMinute(Date.now())); + recalcTick(); + }); + + const unsubCurrently = Currently.subscribe(async v => { + $$invalidate(0, currently = v); + }); + + onDestroy(() => { + clearTimeout(sunlightTimerID); + unsubCurrently(); + }); + + function recalcTick() { + const now = new Date(); + const c = Math.floor(dayRebuilder(now.toLocaleString("en-GB", { "timeStyle": "short" })) / divider); + Currently.set(c); + console.log("sunlightTimer", c); + sunlightTimerID = setTimeout(() => recalcTick(), toMinute(Date.now())); + } + + const writable_props = ["sunrise", "sunset"]; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$7.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("sunrise" in $$props) $$invalidate(4, sunrise = $$props.sunrise); + if ("sunset" in $$props) $$invalidate(5, sunset = $$props.sunset); + }; + + $$self.$capture_state = () => ({ + onDestroy, + onMount, + writable, + get: get_store_value, + derived, + actions, + Weather, + isEmpty: utils$1.isEmpty, + prefix: prefix$6, + sunrise, + sunset, + day, + hour, + minute, + divider, + currently, + dSunrise, + dSunlength, + dSunset, + sunlightTimerID, + startOfDay, + Currently, + dayRebuilder, + unsubCurrently, + toMinute, + recalcTick + }); + + $$self.$inject_state = $$props => { + if ("sunrise" in $$props) $$invalidate(4, sunrise = $$props.sunrise); + if ("sunset" in $$props) $$invalidate(5, sunset = $$props.sunset); + if ("currently" in $$props) $$invalidate(0, currently = $$props.currently); + if ("dSunrise" in $$props) $$invalidate(1, dSunrise = $$props.dSunrise); + if ("dSunlength" in $$props) $$invalidate(2, dSunlength = $$props.dSunlength); + if ("dSunset" in $$props) $$invalidate(3, dSunset = $$props.dSunset); + if ("sunlightTimerID" in $$props) sunlightTimerID = $$props.sunlightTimerID; + if ("startOfDay" in $$props) startOfDay = $$props.startOfDay; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*currently*/ 1) { + { + console.log("$currently", currently); + } + } + + if ($$self.$$.dirty & /*sunrise, sunset*/ 48) { + { + const now = new Date(); + const c = Math.floor(dayRebuilder(now.toLocaleString("en-GB", { "timeStyle": "short" })) / divider); + Currently.set(c); + + if (sunrise && sunset) { + $$invalidate(1, dSunrise = dayRebuilder(sunrise) / divider); + $$invalidate(3, dSunset = dayRebuilder(sunset) / divider); + $$invalidate(2, dSunlength = (dayRebuilder(sunset) - dayRebuilder(sunrise)) / divider); + } + } + } + }; + + startOfDay = ~~(Date.now() / day) * day; + return [currently, dSunrise, dSunlength, dSunset, sunrise, sunset]; + } + + class Daylight extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$b, create_fragment$b, safe_not_equal, { sunrise: 4, sunset: 5 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Daylight", + options, + id: create_fragment$b.name + }); + + const { ctx } = this.$$; + const props = options.props || {}; + + if (/*sunrise*/ ctx[4] === undefined && !("sunrise" in props)) { + console_1$7.warn(" was created without expected prop 'sunrise'"); + } + + if (/*sunset*/ ctx[5] === undefined && !("sunset" in props)) { + console_1$7.warn(" was created without expected prop 'sunset'"); + } + } + + get sunrise() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set sunrise(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + + get sunset() { + throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); + } + + set sunset(value) { + throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); + } + } + + /* src/components/forecast/ForecastDetails.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$8 } = globals; + const file$b = "src/components/forecast/ForecastDetails.svelte"; + + // (32:0) {#if visible} + function create_if_block$7(ctx) { + let div24; + let h30; + let t1; + let div1; + let div0; + let t2_value = /*details*/ ctx[0].summary + ""; + let t2; + let t3; + let div4; + let div2; + let t5; + let div3; + let t6_value = ~~(/*details*/ ctx[0].humidity * 100) + ""; + let t6; + let t7; + let t8; + let div7; + let div5; + let t10; + let div6; + let t11_value = /*details*/ ctx[0].visibility + ""; + let t11; + let span0; + let t13; + let div10; + let div8; + let t15; + let div9; + let t16_value = /*details*/ ctx[0].uvIndex + ""; + let t16; + let t17; + let h31; + let t19; + let div15; + let div11; + let t21; + let div12; + let t22_value = /*details*/ ctx[0].windSpeed + ""; + let t22; + let span1; + let t24; + let div13; + let t26; + let div14; + let t27_value = /*details*/ ctx[0].pressure + ""; + let t27; + let span2; + let t29; + let h32; + let t31; + let div21; + let div16; + let daylight; + let t32; + let div17; + let t34; + let div18; + let t35_value = /*details*/ ctx[0].sunriseTime + ""; + let t35; + let t36; + let div19; + let t38; + let div20; + let t39_value = /*details*/ ctx[0].sunsetTime + ""; + let t39; + let t40; + let div23; + let div22; + let t41_value = /*details*/ ctx[0].moonphase + ""; + let t41; + let current; + + daylight = new Daylight({ + props: { + sunrise: /*details*/ ctx[0].sunriseTime, + sunset: /*details*/ ctx[0].sunsetTime + }, + $$inline: true + }); + + const block = { + c: function create() { + div24 = element("div"); + h30 = element("h3"); + h30.textContent = "Details"; + t1 = space(); + div1 = element("div"); + div0 = element("div"); + t2 = text(t2_value); + t3 = space(); + div4 = element("div"); + div2 = element("div"); + div2.textContent = "Humidity"; + t5 = space(); + div3 = element("div"); + t6 = text(t6_value); + t7 = text("%"); + t8 = space(); + div7 = element("div"); + div5 = element("div"); + div5.textContent = "Visibility"; + t10 = space(); + div6 = element("div"); + t11 = text(t11_value); + span0 = element("span"); + span0.textContent = "km"; + t13 = space(); + div10 = element("div"); + div8 = element("div"); + div8.textContent = "UV Index"; + t15 = space(); + div9 = element("div"); + t16 = text(t16_value); + t17 = space(); + h31 = element("h3"); + h31.textContent = "Wind & Pressure"; + t19 = space(); + div15 = element("div"); + div11 = element("div"); + div11.textContent = "Wind"; + t21 = space(); + div12 = element("div"); + t22 = text(t22_value); + span1 = element("span"); + span1.textContent = "km/h"; + t24 = space(); + div13 = element("div"); + div13.textContent = "Barometer"; + t26 = space(); + div14 = element("div"); + t27 = text(t27_value); + span2 = element("span"); + span2.textContent = "mBar"; + t29 = space(); + h32 = element("h3"); + h32.textContent = "Sun & Moon"; + t31 = space(); + div21 = element("div"); + div16 = element("div"); + create_component(daylight.$$.fragment); + t32 = space(); + div17 = element("div"); + div17.textContent = "Sunrise"; + t34 = space(); + div18 = element("div"); + t35 = text(t35_value); + t36 = space(); + div19 = element("div"); + div19.textContent = "Sunset"; + t38 = space(); + div20 = element("div"); + t39 = text(t39_value); + t40 = space(); + div23 = element("div"); + div22 = element("div"); + t41 = text(t41_value); + add_location(h30, file$b, 33, 4, 654); + attr_dev(div0, "class", "mui-col-xs-12 mui--text-left mui--text-body1"); + add_location(div0, file$b, 35, 8, 705); + attr_dev(div1, "class", "mui-row"); + add_location(div1, file$b, 34, 4, 675); + attr_dev(div2, "class", "mui-col-xs-6 mui--text-left mui--text-body2"); + add_location(div2, file$b, 39, 8, 833); + attr_dev(div3, "class", "mui-col-xs-6 mui--text-right mui--text-title"); + add_location(div3, file$b, 40, 8, 913); + attr_dev(div4, "class", "mui-row"); + add_location(div4, file$b, 38, 4, 803); + attr_dev(div5, "class", "mui-col-xs-6 mui--text-left mui--text-body2"); + add_location(div5, file$b, 43, 8, 1052); + attr_dev(span0, "class", "text-body1"); + add_location(span0, file$b, 44, 86, 1212); + attr_dev(div6, "class", "mui-col-xs-6 mui--text-right mui--text-title"); + add_location(div6, file$b, 44, 8, 1134); + attr_dev(div7, "class", "mui-row"); + add_location(div7, file$b, 42, 4, 1022); + attr_dev(div8, "class", "mui-col-xs-6 mui--text-left mui--text-body2"); + add_location(div8, file$b, 47, 8, 1298); + attr_dev(div9, "class", "mui-col-xs-6 mui--text-right mui--text-title"); + add_location(div9, file$b, 48, 8, 1378); + attr_dev(div10, "class", "mui-row"); + add_location(div10, file$b, 46, 4, 1268); + add_location(h31, file$b, 50, 4, 1475); + attr_dev(div11, "class", "mui-col-xs-6 mui-col-md-3 mui--text-left mui--text-body2"); + add_location(div11, file$b, 52, 8, 1534); + attr_dev(span1, "class", "text-body1"); + add_location(span1, file$b, 53, 98, 1713); + attr_dev(div12, "class", "mui-col-xs-6 mui-col-md-3 mui--text-right mui--text-title"); + add_location(div12, file$b, 53, 8, 1623); + attr_dev(div13, "class", "mui-col-xs-6 mui-col-md-3 mui--text-left mui--text-body2"); + add_location(div13, file$b, 54, 8, 1764); + attr_dev(span2, "class", "text-body1"); + add_location(span2, file$b, 55, 97, 1947); + attr_dev(div14, "class", "mui-col-xs-6 mui-col-md-3 mui--text-right mui--text-title"); + add_location(div14, file$b, 55, 8, 1858); + attr_dev(div15, "class", "mui-row"); + add_location(div15, file$b, 51, 4, 1504); + add_location(h32, file$b, 58, 4, 2006); + attr_dev(div16, "class", "mui-col-xs-12"); + attr_dev(div16, "width", "100%"); + add_location(div16, file$b, 61, 8, 2061); + attr_dev(div17, "class", "mui-col-xs-3 mui--text-left mui--text-body2"); + add_location(div17, file$b, 64, 8, 2207); + attr_dev(div18, "class", "mui-col-xs-3 mui--text-right mui--text-title"); + add_location(div18, file$b, 65, 8, 2286); + attr_dev(div19, "class", "mui-col-xs-3 mui--text-left mui--text-body2"); + add_location(div19, file$b, 66, 8, 2380); + attr_dev(div20, "class", "mui-col-xs-3 mui--text-right mui--text-title"); + add_location(div20, file$b, 67, 8, 2458); + attr_dev(div21, "class", "mui-row"); + add_location(div21, file$b, 60, 4, 2031); + attr_dev(div22, "class", "mui-col-xs-12 mui--text-right mui--text-title"); + add_location(div22, file$b, 71, 8, 2589); + attr_dev(div23, "class", "mui-row"); + add_location(div23, file$b, 70, 4, 2559); + attr_dev(div24, "class", "forecastDetails mui-panel glassy"); + add_location(div24, file$b, 32, 0, 603); + }, + m: function mount(target, anchor) { + insert_dev(target, div24, anchor); + append_dev(div24, h30); + append_dev(div24, t1); + append_dev(div24, div1); + append_dev(div1, div0); + append_dev(div0, t2); + append_dev(div24, t3); + append_dev(div24, div4); + append_dev(div4, div2); + append_dev(div4, t5); + append_dev(div4, div3); + append_dev(div3, t6); + append_dev(div3, t7); + append_dev(div24, t8); + append_dev(div24, div7); + append_dev(div7, div5); + append_dev(div7, t10); + append_dev(div7, div6); + append_dev(div6, t11); + append_dev(div6, span0); + append_dev(div24, t13); + append_dev(div24, div10); + append_dev(div10, div8); + append_dev(div10, t15); + append_dev(div10, div9); + append_dev(div9, t16); + append_dev(div24, t17); + append_dev(div24, h31); + append_dev(div24, t19); + append_dev(div24, div15); + append_dev(div15, div11); + append_dev(div15, t21); + append_dev(div15, div12); + append_dev(div12, t22); + append_dev(div12, span1); + append_dev(div15, t24); + append_dev(div15, div13); + append_dev(div15, t26); + append_dev(div15, div14); + append_dev(div14, t27); + append_dev(div14, span2); + append_dev(div24, t29); + append_dev(div24, h32); + append_dev(div24, t31); + append_dev(div24, div21); + append_dev(div21, div16); + mount_component(daylight, div16, null); + append_dev(div21, t32); + append_dev(div21, div17); + append_dev(div21, t34); + append_dev(div21, div18); + append_dev(div18, t35); + append_dev(div21, t36); + append_dev(div21, div19); + append_dev(div21, t38); + append_dev(div21, div20); + append_dev(div20, t39); + append_dev(div24, t40); + append_dev(div24, div23); + append_dev(div23, div22); + append_dev(div22, t41); + current = true; + }, + p: function update(ctx, dirty) { + if ((!current || dirty & /*details*/ 1) && t2_value !== (t2_value = /*details*/ ctx[0].summary + "")) set_data_dev(t2, t2_value); + if ((!current || dirty & /*details*/ 1) && t6_value !== (t6_value = ~~(/*details*/ ctx[0].humidity * 100) + "")) set_data_dev(t6, t6_value); + if ((!current || dirty & /*details*/ 1) && t11_value !== (t11_value = /*details*/ ctx[0].visibility + "")) set_data_dev(t11, t11_value); + if ((!current || dirty & /*details*/ 1) && t16_value !== (t16_value = /*details*/ ctx[0].uvIndex + "")) set_data_dev(t16, t16_value); + if ((!current || dirty & /*details*/ 1) && t22_value !== (t22_value = /*details*/ ctx[0].windSpeed + "")) set_data_dev(t22, t22_value); + if ((!current || dirty & /*details*/ 1) && t27_value !== (t27_value = /*details*/ ctx[0].pressure + "")) set_data_dev(t27, t27_value); + const daylight_changes = {}; + if (dirty & /*details*/ 1) daylight_changes.sunrise = /*details*/ ctx[0].sunriseTime; + if (dirty & /*details*/ 1) daylight_changes.sunset = /*details*/ ctx[0].sunsetTime; + daylight.$set(daylight_changes); + if ((!current || dirty & /*details*/ 1) && t35_value !== (t35_value = /*details*/ ctx[0].sunriseTime + "")) set_data_dev(t35, t35_value); + if ((!current || dirty & /*details*/ 1) && t39_value !== (t39_value = /*details*/ ctx[0].sunsetTime + "")) set_data_dev(t39, t39_value); + if ((!current || dirty & /*details*/ 1) && t41_value !== (t41_value = /*details*/ ctx[0].moonphase + "")) set_data_dev(t41, t41_value); + }, + i: function intro(local) { + if (current) return; + transition_in(daylight.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(daylight.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div24); + destroy_component(daylight); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$7.name, + type: "if", + source: "(32:0) {#if visible}", + ctx + }); + + return block; + } + + function create_fragment$c(ctx) { + let if_block_anchor; + let current; + let if_block = /*visible*/ ctx[1] && create_if_block$7(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + if (/*visible*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*visible*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block$7(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$c.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$7 = "[ForecastDetails]️"; + + function instance$c($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("ForecastDetails", slots, []); + let details; + let tempClass; + let weatherIcon; + let visible = false; + let unsubForecast; + + onMount(() => { + console.log(prefix$7, "Mounted"); + + unsubForecast = Forecast.subscribe(v => { + $$invalidate(0, details = { ...v.details }); + $$invalidate(1, visible = !isEmpty(v)); + }); + }); + + onDestroy(() => { + unsubForecast(); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$8.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onDestroy, + onMount, + Forecast, + actions, + isEmpty, + Daylight, + prefix: prefix$7, + details, + tempClass, + weatherIcon, + visible, + unsubForecast + }); + + $$self.$inject_state = $$props => { + if ("details" in $$props) $$invalidate(0, details = $$props.details); + if ("tempClass" in $$props) tempClass = $$props.tempClass; + if ("weatherIcon" in $$props) weatherIcon = $$props.weatherIcon; + if ("visible" in $$props) $$invalidate(1, visible = $$props.visible); + if ("unsubForecast" in $$props) unsubForecast = $$props.unsubForecast; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [details, visible]; + } + + class ForecastDetails extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$c, create_fragment$c, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "ForecastDetails", + options, + id: create_fragment$c.name + }); + } + } + + /* src/components/forecast/TodaysForecast.svelte generated by Svelte v3.29.7 */ + + const { Object: Object_1$2, console: console_1$9 } = globals; + const file$c = "src/components/forecast/TodaysForecast.svelte"; + + function get_each_context$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[6] = list[i]; + return child_ctx; + } + + function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[6] = list[i]; + return child_ctx; + } + + // (54:0) {#if visible} + function create_if_block$8(ctx) { + let div3; + let h3; + let t1; + let div0; + let t2; + let div2; + let div1; + let each_value_1 = /*today*/ ctx[0]; + validate_each_argument(each_value_1); + let each_blocks_1 = []; + + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks_1[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); + } + + let each_value = /*daily*/ ctx[1]; + validate_each_argument(each_value); + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); + } + + const block = { + c: function create() { + div3 = element("div"); + h3 = element("h3"); + h3.textContent = "Forecast"; + t1 = space(); + div0 = element("div"); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } + + t2 = space(); + div2 = element("div"); + div1 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + add_location(h3, file$c, 55, 4, 1363); + attr_dev(div0, "class", "scrolling-wrapper-flexbox hourly"); + set_style(div0, "height", "100px"); + add_location(div0, file$c, 56, 4, 1385); + attr_dev(div1, "class", "dailyCard"); + add_location(div1, file$c, 67, 8, 1870); + add_location(div2, file$c, 66, 4, 1856); + attr_dev(div3, "class", "forecastToday mui-panel glassy"); + add_location(div3, file$c, 54, 0, 1314); + }, + m: function mount(target, anchor) { + insert_dev(target, div3, anchor); + append_dev(div3, h3); + append_dev(div3, t1); + append_dev(div3, div0); + + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(div0, null); + } + + append_dev(div3, t2); + append_dev(div3, div2); + append_dev(div2, div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } + }, + p: function update(ctx, dirty) { + if (dirty & /*today*/ 1) { + each_value_1 = /*today*/ ctx[0]; + validate_each_argument(each_value_1); + let i; + + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1(ctx, each_value_1, i); + + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_1(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(div0, null); + } + } + + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } + + each_blocks_1.length = each_value_1.length; + } + + if (dirty & /*daily*/ 2) { + each_value = /*daily*/ ctx[1]; + validate_each_argument(each_value); + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$2(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$2(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div1, null); + } + } + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value.length; + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div3); + destroy_each(each_blocks_1, detaching); + destroy_each(each_blocks, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$8.name, + type: "if", + source: "(54:0) {#if visible}", + ctx + }); + + return block; + } + + // (58:12) {#each today as i} + function create_each_block_1(ctx) { + let div3; + let div0; + let t0_value = /*i*/ ctx[6].time + ""; + let t0; + let t1; + let div1; + let i; + let i_class_value; + let t2; + let div2; + let t3_value = ~~/*i*/ ctx[6].temp + ""; + let t3; + let t4; + let div2_class_value; + let t5; + + const block = { + c: function create() { + div3 = element("div"); + div0 = element("div"); + t0 = text(t0_value); + t1 = space(); + div1 = element("div"); + i = element("i"); + t2 = space(); + div2 = element("div"); + t3 = text(t3_value); + t4 = text("°"); + t5 = space(); + attr_dev(div0, "class", "mui--text-center smallText svelte-1rrxtpm"); + add_location(div0, file$c, 59, 20, 1548); + attr_dev(i, "class", i_class_value = "small wi " + /*i*/ ctx[6].forcastIcon + " svelte-1rrxtpm"); + add_location(i, file$c, 60, 50, 1653); + attr_dev(div1, "class", "mui--text-center"); + add_location(div1, file$c, 60, 20, 1623); + attr_dev(div2, "class", div2_class_value = "mui--text-center " + /*i*/ ctx[6].tempClass + " normalWeight" + " svelte-1rrxtpm"); + add_location(div2, file$c, 61, 20, 1720); + attr_dev(div3, "class", "hourlyCard"); + add_location(div3, file$c, 58, 16, 1503); + }, + m: function mount(target, anchor) { + insert_dev(target, div3, anchor); + append_dev(div3, div0); + append_dev(div0, t0); + append_dev(div3, t1); + append_dev(div3, div1); + append_dev(div1, i); + append_dev(div3, t2); + append_dev(div3, div2); + append_dev(div2, t3); + append_dev(div2, t4); + append_dev(div3, t5); + }, + p: function update(ctx, dirty) { + if (dirty & /*today*/ 1 && t0_value !== (t0_value = /*i*/ ctx[6].time + "")) set_data_dev(t0, t0_value); + + if (dirty & /*today*/ 1 && i_class_value !== (i_class_value = "small wi " + /*i*/ ctx[6].forcastIcon + " svelte-1rrxtpm")) { + attr_dev(i, "class", i_class_value); + } + + if (dirty & /*today*/ 1 && t3_value !== (t3_value = ~~/*i*/ ctx[6].temp + "")) set_data_dev(t3, t3_value); + + if (dirty & /*today*/ 1 && div2_class_value !== (div2_class_value = "mui--text-center " + /*i*/ ctx[6].tempClass + " normalWeight" + " svelte-1rrxtpm")) { + attr_dev(div2, "class", div2_class_value); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div3); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block_1.name, + type: "each", + source: "(58:12) {#each today as i}", + ctx + }); + + return block; + } + + // (69:12) {#each daily as i} + function create_each_block$2(ctx) { + let div4; + let div0; + let t0_value = /*i*/ ctx[6].time + ""; + let t0; + let t1; + let div1; + let i; + let i_class_value; + let t2; + let div2; + let t3_value = ~~/*i*/ ctx[6].tempHigh + ""; + let t3; + let t4; + let div2_class_value; + let t5; + let div3; + let t6_value = ~~/*i*/ ctx[6].tempLow + ""; + let t6; + let t7; + let div3_class_value; + let t8; + + const block = { + c: function create() { + div4 = element("div"); + div0 = element("div"); + t0 = text(t0_value); + t1 = space(); + div1 = element("div"); + i = element("i"); + t2 = space(); + div2 = element("div"); + t3 = text(t3_value); + t4 = text("°"); + t5 = space(); + div3 = element("div"); + t6 = text(t6_value); + t7 = text("°"); + t8 = space(); + attr_dev(div0, "class", "mui-col-xs-6 mui--text-left mui--text-title"); + add_location(div0, file$c, 70, 16, 1972); + attr_dev(i, "class", i_class_value = "mui--text-title wi " + /*i*/ ctx[6].forcastIcon + " svelte-1rrxtpm"); + add_location(i, file$c, 71, 59, 2103); + attr_dev(div1, "class", "mui-col-xs-2 mui--text-center"); + add_location(div1, file$c, 71, 16, 2060); + attr_dev(div2, "class", div2_class_value = "mui-col-xs-2 mui--text-center " + /*i*/ ctx[6].tempHighClass + " mui--text-title " + " svelte-1rrxtpm"); + add_location(div2, file$c, 72, 16, 2176); + attr_dev(div3, "class", div3_class_value = "mui-col-xs-2 mui--text-center " + /*i*/ ctx[6].tempLowClass + " mui--text-title" + " svelte-1rrxtpm"); + add_location(div3, file$c, 73, 16, 2294); + attr_dev(div4, "class", "grid"); + add_location(div4, file$c, 69, 12, 1937); + }, + m: function mount(target, anchor) { + insert_dev(target, div4, anchor); + append_dev(div4, div0); + append_dev(div0, t0); + append_dev(div4, t1); + append_dev(div4, div1); + append_dev(div1, i); + append_dev(div4, t2); + append_dev(div4, div2); + append_dev(div2, t3); + append_dev(div2, t4); + append_dev(div4, t5); + append_dev(div4, div3); + append_dev(div3, t6); + append_dev(div3, t7); + append_dev(div4, t8); + }, + p: function update(ctx, dirty) { + if (dirty & /*daily*/ 2 && t0_value !== (t0_value = /*i*/ ctx[6].time + "")) set_data_dev(t0, t0_value); + + if (dirty & /*daily*/ 2 && i_class_value !== (i_class_value = "mui--text-title wi " + /*i*/ ctx[6].forcastIcon + " svelte-1rrxtpm")) { + attr_dev(i, "class", i_class_value); + } + + if (dirty & /*daily*/ 2 && t3_value !== (t3_value = ~~/*i*/ ctx[6].tempHigh + "")) set_data_dev(t3, t3_value); + + if (dirty & /*daily*/ 2 && div2_class_value !== (div2_class_value = "mui-col-xs-2 mui--text-center " + /*i*/ ctx[6].tempHighClass + " mui--text-title " + " svelte-1rrxtpm")) { + attr_dev(div2, "class", div2_class_value); + } + + if (dirty & /*daily*/ 2 && t6_value !== (t6_value = ~~/*i*/ ctx[6].tempLow + "")) set_data_dev(t6, t6_value); + + if (dirty & /*daily*/ 2 && div3_class_value !== (div3_class_value = "mui-col-xs-2 mui--text-center " + /*i*/ ctx[6].tempLowClass + " mui--text-title" + " svelte-1rrxtpm")) { + attr_dev(div3, "class", div3_class_value); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div4); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$2.name, + type: "each", + source: "(69:12) {#each daily as i}", + ctx + }); + + return block; + } + + function create_fragment$d(ctx) { + let if_block_anchor; + let if_block = /*visible*/ ctx[2] && create_if_block$8(ctx); + + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, [dirty]) { + if (/*visible*/ ctx[2]) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$8(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$d.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$8 = "[TodaysForecast]️"; + + function instance$d($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("TodaysForecast", slots, []); + let today; + let daily; + let tempClass; + let weatherIcon; + let visible = false; + let unsubForecast; + + onMount(() => { + console.log(prefix$8, "Mounted"); + + unsubForecast = Forecast.subscribe(v => { + const _today = { ...v.forcastToday }; + const _daily = { ...v.dailyForecast }; + $$invalidate(0, today = Object.keys(_today).map(key => _today[key])); + $$invalidate(1, daily = Object.keys(_daily).map(key => _daily[key])); + + $$invalidate(0, today = today.map(v => { + v.forcastIcon = `wi-forecast-io-${v.icon}`; + v.tempClass = `temp${~~v.temp}`; + return v; + })); + + $$invalidate(1, daily = daily.map(v => { + v.forcastIcon = `wi-forecast-io-${v.icon}`; + v.tempHighClass = `temp${~~v.tempHigh}`; + v.tempLowClass = `temp${~~v.tempLow}`; + return v; + })); + + $$invalidate(2, visible = !isEmpty(v)); + }); + }); + + onDestroy(() => { + unsubForecast(); + }); + + const writable_props = []; + + Object_1$2.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$9.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onDestroy, + onMount, + Forecast, + actions, + isEmpty, + prefix: prefix$8, + today, + daily, + tempClass, + weatherIcon, + visible, + unsubForecast + }); + + $$self.$inject_state = $$props => { + if ("today" in $$props) $$invalidate(0, today = $$props.today); + if ("daily" in $$props) $$invalidate(1, daily = $$props.daily); + if ("tempClass" in $$props) tempClass = $$props.tempClass; + if ("weatherIcon" in $$props) weatherIcon = $$props.weatherIcon; + if ("visible" in $$props) $$invalidate(2, visible = $$props.visible); + if ("unsubForecast" in $$props) unsubForecast = $$props.unsubForecast; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [today, daily, visible]; + } + + class TodaysForecast extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$d, create_fragment$d, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "TodaysForecast", + options, + id: create_fragment$d.name + }); + } + } + + /* src/pages/WeatherPage.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$a } = globals; + const file$d = "src/pages/WeatherPage.svelte"; + + // (197:4) {:else} + function create_else_block$1(ctx) { + let currently; + let t0; + let todaysforecast; + let t1; + let forecastdetails; + let current; + currently = new Currently({ $$inline: true }); + todaysforecast = new TodaysForecast({ $$inline: true }); + forecastdetails = new ForecastDetails({ $$inline: true }); + + const block = { + c: function create() { + create_component(currently.$$.fragment); + t0 = space(); + create_component(todaysforecast.$$.fragment); + t1 = space(); + create_component(forecastdetails.$$.fragment); + }, + m: function mount(target, anchor) { + mount_component(currently, target, anchor); + insert_dev(target, t0, anchor); + mount_component(todaysforecast, target, anchor); + insert_dev(target, t1, anchor); + mount_component(forecastdetails, target, anchor); + current = true; + }, + i: function intro(local) { + if (current) return; + transition_in(currently.$$.fragment, local); + transition_in(todaysforecast.$$.fragment, local); + transition_in(forecastdetails.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(currently.$$.fragment, local); + transition_out(todaysforecast.$$.fragment, local); + transition_out(forecastdetails.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + destroy_component(currently, detaching); + if (detaching) detach_dev(t0); + destroy_component(todaysforecast, detaching); + if (detaching) detach_dev(t1); + destroy_component(forecastdetails, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block$1.name, + type: "else", + source: "(197:4) {:else}", + ctx + }); + + return block; + } + + // (195:4) {#if !loaded} + function create_if_block$9(ctx) { + let lineloader; + let current; + lineloader = new LineLoader({ $$inline: true }); + + const block = { + c: function create() { + create_component(lineloader.$$.fragment); + }, + m: function mount(target, anchor) { + mount_component(lineloader, target, anchor); + current = true; + }, + i: function intro(local) { + if (current) return; + transition_in(lineloader.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(lineloader.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + destroy_component(lineloader, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$9.name, + type: "if", + source: "(195:4) {#if !loaded}", + ctx + }); + + return block; + } + + function create_fragment$e(ctx) { + let div; + let current_block_type_index; + let if_block; + let div_class_value; + let current; + const if_block_creators = [create_if_block$9, create_else_block$1]; + const if_blocks = []; + + function select_block_type(ctx, dirty) { + if (!/*loaded*/ ctx[1]) return 0; + return 1; + } + + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + + const block = { + c: function create() { + div = element("div"); + if_block.c(); + attr_dev(div, "id", "weatherP"); + attr_dev(div, "class", div_class_value = "container content mui-panel animTrans " + /*background*/ ctx[0] + " svelte-1v2rqd5"); + add_location(div, file$d, 193, 0, 4453); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + if_blocks[current_block_type_index].m(div, null); + current = true; + }, + p: function update(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); + + if (current_block_type_index !== previous_block_index) { + group_outros(); + + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + + check_outros(); + if_block = if_blocks[current_block_type_index]; + + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } else { + if_block.p(ctx, dirty); + } + + transition_in(if_block, 1); + if_block.m(div, null); + } + + if (!current || dirty & /*background*/ 1 && div_class_value !== (div_class_value = "container content mui-panel animTrans " + /*background*/ ctx[0] + " svelte-1v2rqd5")) { + attr_dev(div, "class", div_class_value); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if_blocks[current_block_type_index].d(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$e.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$9 = "[WeatherPage]️"; + + function regenBackground(icon) { + const hour = new Date().getHours(); + const suffix = hour >= 6 && hour < 18 ? "_d" : "_n"; + let output = hour >= 6 && hour < 18 ? "weatherDay" : "weatherEvening"; + + switch (icon) { + case "clear": + output = `clear${suffix}`; + break; + case "clear-day": + output = "clear_d"; + break; + case "clear-night": + output = "clear_n"; + break; + case "rain": + output = `rain${suffix}`; + break; + case "snow": + case "sleet": + case "hail": + output = `snow${suffix}`; + break; + case "fog": + output = `foggy${suffix}`; + break; + case "wind": + case "cloudy": + output = `cloudy${suffix}`; + break; + case "partly-cloudy-day": + output = "cloudy_d"; + break; + case "partly-cloudy-night": + output = "cloudy_n"; + break; + case "thunderstorm": + case "tornado": + output = `storm${suffix}`; + break; + default: + console.log(`Sorry, we are out of ${icon}.`); + } + + console.log(prefix$9, "regenBackground", output); + return output; + } + + function instance$e($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("WeatherPage", slots, []); + let unsubLLFixed; + let unsubForecast; + let hour = new Date().getHours(); + let background = hour >= 6 && hour < 18 ? "weatherDay" : "weatherEvening"; + let loaded = false; + let timerId = 0; + let llFixed; + let lastUpdate = actions.get("lastForecast") || 0; + + onMount(() => { + console.log(prefix$9, "Mounted"); + clearTimeout(timerId); + timerId = 0; + + unsubLLFixed = LLFixed.subscribe(v => { + const now = new Date().getTime(); + + if (hasOwn(v, "llFixed")) { + llFixed = v.llFixed; + } + + if (!isEmpty(v) && now - lastUpdate >= ms("30m")) { + actions.getForecast(v.llFixed); + } + }); + + unsubForecast = Forecast.subscribe(v => { + $$invalidate(1, loaded = !isEmpty(v)); + + if (loaded) { + lastUpdate = actions.set("lastForecast", new Date().getTime()); + $$invalidate(0, background = regenBackground(v.currently.icon)); + + timerId = setTimeout( + () => { + console.log(prefix$9, ">> Timeout Triggered"); + actions.getForecast(llFixed); + }, + ms("30m") + ); + } + }); + }); + + onDestroy(() => { + // clearTimeout(timerID); + unsubForecast(); + + unsubLLFixed(); + clearTimeout(timerId); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$a.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + onMount, + onDestroy, + Forecast, + LLFixed, + actions, + isEmpty, + hasOwn, + ms, + Currently, + ForecastDetails, + TodaysForecast, + LineLoader, + unsubLLFixed, + unsubForecast, + prefix: prefix$9, + hour, + background, + loaded, + timerId, + llFixed, + lastUpdate, + regenBackground + }); + + $$self.$inject_state = $$props => { + if ("unsubLLFixed" in $$props) unsubLLFixed = $$props.unsubLLFixed; + if ("unsubForecast" in $$props) unsubForecast = $$props.unsubForecast; + if ("hour" in $$props) hour = $$props.hour; + if ("background" in $$props) $$invalidate(0, background = $$props.background); + if ("loaded" in $$props) $$invalidate(1, loaded = $$props.loaded); + if ("timerId" in $$props) timerId = $$props.timerId; + if ("llFixed" in $$props) llFixed = $$props.llFixed; + if ("lastUpdate" in $$props) lastUpdate = $$props.lastUpdate; + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [background, loaded]; + } + + class WeatherPage extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$e, create_fragment$e, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "WeatherPage", + options, + id: create_fragment$e.name + }); + } + } + + /* src/pages/NearbyLocationsPage.svelte generated by Svelte v3.29.7 */ + + const { console: console_1$b } = globals; + const file$e = "src/pages/NearbyLocationsPage.svelte"; + + function get_each_context$3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[8] = list[i]; + return child_ctx; + } + + // (54:4) {:else} + function create_else_block$2(ctx) { + let div; + let t0; + let t1; + let t2; + let if_block_anchor; + + function select_block_type_1(ctx, dirty) { + if (/*totalResults*/ ctx[3] === 0) return create_if_block_1; + return create_else_block_1; + } + + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); + + const block = { + c: function create() { + div = element("div"); + t0 = text("Near "); + t1 = text(/*fullLocation*/ ctx[2]); + t2 = space(); + if_block.c(); + if_block_anchor = empty(); + attr_dev(div, "class", "mui--text-subhead mui--text-accent"); + add_location(div, file$e, 54, 8, 1317); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + append_dev(div, t0); + append_dev(div, t1); + insert_dev(target, t2, anchor); + if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + }, + p: function update(ctx, dirty) { + if (dirty & /*fullLocation*/ 4) set_data_dev(t1, /*fullLocation*/ ctx[2]); + + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); + + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (detaching) detach_dev(t2); + if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block$2.name, + type: "else", + source: "(54:4) {:else}", + ctx + }); + + return block; + } + + // (52:4) {#if !loaded} + function create_if_block$a(ctx) { + let lineloader; + let current; + lineloader = new LineLoader({ $$inline: true }); + + const block = { + c: function create() { + create_component(lineloader.$$.fragment); + }, + m: function mount(target, anchor) { + mount_component(lineloader, target, anchor); + current = true; + }, + p: noop, + i: function intro(local) { + if (current) return; + transition_in(lineloader.$$.fragment, local); + current = true; + }, + o: function outro(local) { + transition_out(lineloader.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + destroy_component(lineloader, detaching); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$a.name, + type: "if", + source: "(52:4) {#if !loaded}", + ctx + }); + + return block; + } + + // (61:8) {:else} + function create_else_block_1(ctx) { + let each_1_anchor; + let each_value = /*list*/ ctx[0]; + validate_each_argument(each_value); + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); + } + + const block = { + c: function create() { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + each_1_anchor = empty(); + }, + m: function mount(target, anchor) { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(target, anchor); + } + + insert_dev(target, each_1_anchor, anchor); + }, + p: function update(ctx, dirty) { + if (dirty & /*list, selectVenue*/ 17) { + each_value = /*list*/ ctx[0]; + validate_each_argument(each_value); + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$3(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); + } + } + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value.length; + } + }, + d: function destroy(detaching) { + destroy_each(each_blocks, detaching); + if (detaching) detach_dev(each_1_anchor); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block_1.name, + type: "else", + source: "(61:8) {:else}", + ctx + }); + + return block; + } + + // (57:8) {#if totalResults === 0} + function create_if_block_1(ctx) { + let div; + + const block = { + c: function create() { + div = element("div"); + div.textContent = "Nothing found"; + add_location(div, file$e, 57, 12, 1437); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + }, + p: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_1.name, + type: "if", + source: "(57:8) {#if totalResults === 0}", + ctx + }); + + return block; + } + + // (62:12) {#each list as item} + function create_each_block$3(ctx) { + let div; + let img; + let img_src_value; + let t0; + let span0; + let t1_value = /*item*/ ctx[8].name + ""; + let t1; + let t2; + let span1; + let t3; + let t4_value = /*item*/ ctx[8].distance + ""; + let t4; + let t5; + let t6; + let span2; + let t7_value = /*item*/ ctx[8].category + ""; + let t7; + let t8; + let div_data_id_value; + let mounted; + let dispose; + + const block = { + c: function create() { + div = element("div"); + img = element("img"); + t0 = space(); + span0 = element("span"); + t1 = text(t1_value); + t2 = space(); + span1 = element("span"); + t3 = text("("); + t4 = text(t4_value); + t5 = text("km)"); + t6 = space(); + span2 = element("span"); + t7 = text(t7_value); + t8 = space(); + attr_dev(img, "class", "align-middle"); + if (img.src !== (img_src_value = /*item*/ ctx[8].icon)) attr_dev(img, "src", img_src_value); + attr_dev(img, "width", "32px"); + attr_dev(img, "height", "32px"); + set_style(img, "-webkit-filter", "invert(100%)"); + add_location(img, file$e, 63, 20, 1664); + attr_dev(span0, "class", "text-dark text-subhead"); + add_location(span0, file$e, 64, 20, 1795); + attr_dev(span1, "class", "text-caption text-dark-secondary"); + add_location(span1, file$e, 65, 20, 1871); + attr_dev(span2, "class", "text-caption text-dark-secondary"); + add_location(span2, file$e, 66, 20, 1965); + attr_dev(div, "class", "itemRow align-middle"); + attr_dev(div, "data-id", div_data_id_value = /*item*/ ctx[8].id); + add_location(div, file$e, 62, 16, 1557); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + append_dev(div, img); + append_dev(div, t0); + append_dev(div, span0); + append_dev(span0, t1); + append_dev(div, t2); + append_dev(div, span1); + append_dev(span1, t3); + append_dev(span1, t4); + append_dev(span1, t5); + append_dev(div, t6); + append_dev(div, span2); + append_dev(span2, t7); + append_dev(div, t8); + + if (!mounted) { + dispose = listen_dev( + div, + "click", + function () { + if (is_function(/*selectVenue*/ ctx[4](/*item*/ ctx[8].id))) /*selectVenue*/ ctx[4](/*item*/ ctx[8].id).apply(this, arguments); + }, + false, + false, + false + ); + + mounted = true; + } + }, + p: function update(new_ctx, dirty) { + ctx = new_ctx; + + if (dirty & /*list*/ 1 && img.src !== (img_src_value = /*item*/ ctx[8].icon)) { + attr_dev(img, "src", img_src_value); + } + + if (dirty & /*list*/ 1 && t1_value !== (t1_value = /*item*/ ctx[8].name + "")) set_data_dev(t1, t1_value); + if (dirty & /*list*/ 1 && t4_value !== (t4_value = /*item*/ ctx[8].distance + "")) set_data_dev(t4, t4_value); + if (dirty & /*list*/ 1 && t7_value !== (t7_value = /*item*/ ctx[8].category + "")) set_data_dev(t7, t7_value); + + if (dirty & /*list*/ 1 && div_data_id_value !== (div_data_id_value = /*item*/ ctx[8].id)) { + attr_dev(div, "data-id", div_data_id_value); + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + mounted = false; + dispose(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$3.name, + type: "each", + source: "(62:12) {#each list as item}", + ctx + }); + + return block; + } + + function create_fragment$f(ctx) { + let div; + let current_block_type_index; + let if_block; + let current; + const if_block_creators = [create_if_block$a, create_else_block$2]; + const if_blocks = []; + + function select_block_type(ctx, dirty) { + if (!/*loaded*/ ctx[1]) return 0; + return 1; + } + + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + + const block = { + c: function create() { + div = element("div"); + if_block.c(); + attr_dev(div, "id", "nearbyLocations"); + attr_dev(div, "class", "container content mui-panel "); + add_location(div, file$e, 50, 0, 1193); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + if_blocks[current_block_type_index].m(div, null); + current = true; + }, + p: function update(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); + + if (current_block_type_index === previous_block_index) { + if_blocks[current_block_type_index].p(ctx, dirty); + } else { + group_outros(); + + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + + check_outros(); + if_block = if_blocks[current_block_type_index]; + + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } else { + if_block.p(ctx, dirty); + } + + transition_in(if_block, 1); + if_block.m(div, null); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if_blocks[current_block_type_index].d(); + } + }; + + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$f.name, + type: "component", + source: "", + ctx + }); + + return block; + } + + const prefix$a = "[NearbyLocations]️"; + + function instance$f($$self, $$props, $$invalidate) { + let $querystring; + validate_store(querystring, "querystring"); + component_subscribe($$self, querystring, $$value => $$invalidate(6, $querystring = $$value)); + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("NearbyLocationsPage", slots, []); + let _qs; + let list; + let loaded = false; + let fullLocation; + let totalResults = 0; + + const unsubNearbyList = NearbyList.subscribe(v => { + console.log(v); + + if (!isEmpty(v)) { + console.log(prefix$a, v); + $$invalidate(2, fullLocation = v.fullLocation); + $$invalidate(0, list = [...v.newItems]); + $$invalidate(1, loaded = true); + $$invalidate(3, totalResults = v.totalResults); + } + }); + + onMount(() => { + _qs = lib.parse($querystring); + _qs.w = hourFloor(); + actions.getNearbyLocations(_qs); + }); + + function selectVenue(id) { + console.log(id); + const _dataset = { id }; + push(`/venuedetails?${lib.stringify(_dataset)}`); + } + + onDestroy(() => { + // clearTimeout(timerID); + unsubNearbyList(); + }); + + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1$b.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$capture_state = () => ({ + location, + querystring, + push, + onMount, + onDestroy, + NearbyList, + actions, + isEmpty, + hourFloor, + qs: lib, + LineLoader, + prefix: prefix$a, + _qs, + list, + loaded, + fullLocation, + totalResults, + unsubNearbyList, + selectVenue, + $querystring + }); + + $$self.$inject_state = $$props => { + if ("_qs" in $$props) _qs = $$props._qs; + if ("list" in $$props) $$invalidate(0, list = $$props.list); + if ("loaded" in $$props) $$invalidate(1, loaded = $$props.loaded); + if ("fullLocation" in $$props) $$invalidate(2, fullLocation = $$props.fullLocation); + if ("totalResults" in $$props) $$invalidate(3, totalResults = $$props.totalResults); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [list, loaded, fullLocation, totalResults, selectVenue]; + } + + class NearbyLocationsPage extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$f, create_fragment$f, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "NearbyLocationsPage", + options, + id: create_fragment$f.name + }); + } + } + + var leafletSrc = createCommonjsModule(function (module, exports) { + /* @preserve + * Leaflet 1.7.1, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ + + (function (global, factory) { + factory(exports) ; + }(commonjsGlobal, (function (exports) { + var version = "1.7.1"; + + /* + * @namespace Util + * + * Various utility functions, used by Leaflet internally. + */ + + // @function extend(dest: Object, src?: Object): Object + // Merges the properties of the `src` object (or multiple objects) into `dest` object and returns the latter. Has an `L.extend` shortcut. + function extend(dest) { + var i, j, len, src; + + for (j = 1, len = arguments.length; j < len; j++) { + src = arguments[j]; + for (i in src) { + dest[i] = src[i]; + } + } + return dest; + } + + // @function create(proto: Object, properties?: Object): Object + // Compatibility polyfill for [Object.create](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/create) + var create = Object.create || (function () { + function F() {} + return function (proto) { + F.prototype = proto; + return new F(); + }; + })(); + + // @function bind(fn: Function, …): Function + // Returns a new function bound to the arguments passed, like [Function.prototype.bind](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Function/bind). + // Has a `L.bind()` shortcut. + function bind(fn, obj) { + var slice = Array.prototype.slice; + + if (fn.bind) { + return fn.bind.apply(fn, slice.call(arguments, 1)); + } + + var args = slice.call(arguments, 2); + + return function () { + return fn.apply(obj, args.length ? args.concat(slice.call(arguments)) : arguments); + }; + } + + // @property lastId: Number + // Last unique ID used by [`stamp()`](#util-stamp) + var lastId = 0; + + // @function stamp(obj: Object): Number + // Returns the unique ID of an object, assigning it one if it doesn't have it. + function stamp(obj) { + /*eslint-disable */ + obj._leaflet_id = obj._leaflet_id || ++lastId; + return obj._leaflet_id; + /* eslint-enable */ + } + + // @function throttle(fn: Function, time: Number, context: Object): Function + // Returns a function which executes function `fn` with the given scope `context` + // (so that the `this` keyword refers to `context` inside `fn`'s code). The function + // `fn` will be called no more than one time per given amount of `time`. The arguments + // received by the bound function will be any arguments passed when binding the + // function, followed by any arguments passed when invoking the bound function. + // Has an `L.throttle` shortcut. + function throttle(fn, time, context) { + var lock, args, wrapperFn, later; + + later = function () { + // reset lock and call if queued + lock = false; + if (args) { + wrapperFn.apply(context, args); + args = false; + } + }; + + wrapperFn = function () { + if (lock) { + // called too soon, queue to call later + args = arguments; + + } else { + // call and lock until later + fn.apply(context, arguments); + setTimeout(later, time); + lock = true; + } + }; + + return wrapperFn; + } + + // @function wrapNum(num: Number, range: Number[], includeMax?: Boolean): Number + // Returns the number `num` modulo `range` in such a way so it lies within + // `range[0]` and `range[1]`. The returned value will be always smaller than + // `range[1]` unless `includeMax` is set to `true`. + function wrapNum(x, range, includeMax) { + var max = range[1], + min = range[0], + d = max - min; + return x === max && includeMax ? x : ((x - min) % d + d) % d + min; + } + + // @function falseFn(): Function + // Returns a function which always returns `false`. + function falseFn() { return false; } + + // @function formatNum(num: Number, digits?: Number): Number + // Returns the number `num` rounded to `digits` decimals, or to 6 decimals by default. + function formatNum(num, digits) { + var pow = Math.pow(10, (digits === undefined ? 6 : digits)); + return Math.round(num * pow) / pow; + } + + // @function trim(str: String): String + // Compatibility polyfill for [String.prototype.trim](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) + function trim(str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); + } + + // @function splitWords(str: String): String[] + // Trims and splits the string on whitespace and returns the array of parts. + function splitWords(str) { + return trim(str).split(/\s+/); + } + + // @function setOptions(obj: Object, options: Object): Object + // Merges the given properties to the `options` of the `obj` object, returning the resulting options. See `Class options`. Has an `L.setOptions` shortcut. + function setOptions(obj, options) { + if (!Object.prototype.hasOwnProperty.call(obj, 'options')) { + obj.options = obj.options ? create(obj.options) : {}; + } + for (var i in options) { + obj.options[i] = options[i]; + } + return obj.options; + } + + // @function getParamString(obj: Object, existingUrl?: String, uppercase?: Boolean): String + // Converts an object into a parameter URL string, e.g. `{a: "foo", b: "bar"}` + // translates to `'?a=foo&b=bar'`. If `existingUrl` is set, the parameters will + // be appended at the end. If `uppercase` is `true`, the parameter names will + // be uppercased (e.g. `'?A=foo&B=bar'`) + function getParamString(obj, existingUrl, uppercase) { + var params = []; + for (var i in obj) { + params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i])); + } + return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&'); + } + + var templateRe = /\{ *([\w_-]+) *\}/g; + + // @function template(str: String, data: Object): String + // Simple templating facility, accepts a template string of the form `'Hello {a}, {b}'` + // and a data object like `{a: 'foo', b: 'bar'}`, returns evaluated string + // `('Hello foo, bar')`. You can also specify functions instead of strings for + // data values — they will be evaluated passing `data` as an argument. + function template(str, data) { + return str.replace(templateRe, function (str, key) { + var value = data[key]; + + if (value === undefined) { + throw new Error('No value provided for variable ' + str); + + } else if (typeof value === 'function') { + value = value(data); + } + return value; + }); + } + + // @function isArray(obj): Boolean + // Compatibility polyfill for [Array.isArray](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) + var isArray = Array.isArray || function (obj) { + return (Object.prototype.toString.call(obj) === '[object Array]'); + }; + + // @function indexOf(array: Array, el: Object): Number + // Compatibility polyfill for [Array.prototype.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) + function indexOf(array, el) { + for (var i = 0; i < array.length; i++) { + if (array[i] === el) { return i; } + } + return -1; + } + + // @property emptyImageUrl: String + // Data URI string containing a base64-encoded empty GIF image. + // Used as a hack to free memory from unused images on WebKit-powered + // mobile devices (by setting image `src` to this string). + var emptyImageUrl = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; + + // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + + function getPrefixed(name) { + return window['webkit' + name] || window['moz' + name] || window['ms' + name]; + } + + var lastTime = 0; + + // fallback for IE 7-8 + function timeoutDefer(fn) { + var time = +new Date(), + timeToCall = Math.max(0, 16 - (time - lastTime)); + + lastTime = time + timeToCall; + return window.setTimeout(fn, timeToCall); + } + + var requestFn = window.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || timeoutDefer; + var cancelFn = window.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || + getPrefixed('CancelRequestAnimationFrame') || function (id) { window.clearTimeout(id); }; + + // @function requestAnimFrame(fn: Function, context?: Object, immediate?: Boolean): Number + // Schedules `fn` to be executed when the browser repaints. `fn` is bound to + // `context` if given. When `immediate` is set, `fn` is called immediately if + // the browser doesn't have native support for + // [`window.requestAnimationFrame`](https://developer.mozilla.org/docs/Web/API/window/requestAnimationFrame), + // otherwise it's delayed. Returns a request ID that can be used to cancel the request. + function requestAnimFrame(fn, context, immediate) { + if (immediate && requestFn === timeoutDefer) { + fn.call(context); + } else { + return requestFn.call(window, bind(fn, context)); + } + } + + // @function cancelAnimFrame(id: Number): undefined + // Cancels a previous `requestAnimFrame`. See also [window.cancelAnimationFrame](https://developer.mozilla.org/docs/Web/API/window/cancelAnimationFrame). + function cancelAnimFrame(id) { + if (id) { + cancelFn.call(window, id); + } + } + + var Util = ({ + extend: extend, + create: create, + bind: bind, + lastId: lastId, + stamp: stamp, + throttle: throttle, + wrapNum: wrapNum, + falseFn: falseFn, + formatNum: formatNum, + trim: trim, + splitWords: splitWords, + setOptions: setOptions, + getParamString: getParamString, + template: template, + isArray: isArray, + indexOf: indexOf, + emptyImageUrl: emptyImageUrl, + requestFn: requestFn, + cancelFn: cancelFn, + requestAnimFrame: requestAnimFrame, + cancelAnimFrame: cancelAnimFrame + }); + + // @class Class + // @aka L.Class + + // @section + // @uninheritable + + // Thanks to John Resig and Dean Edwards for inspiration! + + function Class() {} + + Class.extend = function (props) { + + // @function extend(props: Object): Function + // [Extends the current class](#class-inheritance) given the properties to be included. + // Returns a Javascript function that is a class constructor (to be called with `new`). + var NewClass = function () { + + // call the constructor + if (this.initialize) { + this.initialize.apply(this, arguments); + } + + // call all constructor hooks + this.callInitHooks(); + }; + + var parentProto = NewClass.__super__ = this.prototype; + + var proto = create(parentProto); + proto.constructor = NewClass; + + NewClass.prototype = proto; + + // inherit parent's statics + for (var i in this) { + if (Object.prototype.hasOwnProperty.call(this, i) && i !== 'prototype' && i !== '__super__') { + NewClass[i] = this[i]; + } + } + + // mix static properties into the class + if (props.statics) { + extend(NewClass, props.statics); + delete props.statics; + } + + // mix includes into the prototype + if (props.includes) { + checkDeprecatedMixinEvents(props.includes); + extend.apply(null, [proto].concat(props.includes)); + delete props.includes; + } + + // merge options + if (proto.options) { + props.options = extend(create(proto.options), props.options); + } + + // mix given properties into the prototype + extend(proto, props); + + proto._initHooks = []; + + // add method for calling all hooks + proto.callInitHooks = function () { + + if (this._initHooksCalled) { return; } + + if (parentProto.callInitHooks) { + parentProto.callInitHooks.call(this); + } + + this._initHooksCalled = true; + + for (var i = 0, len = proto._initHooks.length; i < len; i++) { + proto._initHooks[i].call(this); + } + }; + + return NewClass; + }; + + + // @function include(properties: Object): this + // [Includes a mixin](#class-includes) into the current class. + Class.include = function (props) { + extend(this.prototype, props); + return this; + }; + + // @function mergeOptions(options: Object): this + // [Merges `options`](#class-options) into the defaults of the class. + Class.mergeOptions = function (options) { + extend(this.prototype.options, options); + return this; + }; + + // @function addInitHook(fn: Function): this + // Adds a [constructor hook](#class-constructor-hooks) to the class. + Class.addInitHook = function (fn) { // (Function) || (String, args...) + var args = Array.prototype.slice.call(arguments, 1); + + var init = typeof fn === 'function' ? fn : function () { + this[fn].apply(this, args); + }; + + this.prototype._initHooks = this.prototype._initHooks || []; + this.prototype._initHooks.push(init); + return this; + }; + + function checkDeprecatedMixinEvents(includes) { + if (typeof L === 'undefined' || !L || !L.Mixin) { return; } + + includes = isArray(includes) ? includes : [includes]; + + for (var i = 0; i < includes.length; i++) { + if (includes[i] === L.Mixin.Events) { + console.warn('Deprecated include of L.Mixin.Events: ' + + 'this property will be removed in future releases, ' + + 'please inherit from L.Evented instead.', new Error().stack); + } + } + } + + /* + * @class Evented + * @aka L.Evented + * @inherits Class + * + * A set of methods shared between event-powered classes (like `Map` and `Marker`). Generally, events allow you to execute some function when something happens with an object (e.g. the user clicks on the map, causing the map to fire `'click'` event). + * + * @example + * + * ```js + * map.on('click', function(e) { + * alert(e.latlng); + * } ); + * ``` + * + * Leaflet deals with event listeners by reference, so if you want to add a listener and then remove it, define it as a function: + * + * ```js + * function onClick(e) { ... } + * + * map.on('click', onClick); + * map.off('click', onClick); + * ``` + */ + + var Events = { + /* @method on(type: String, fn: Function, context?: Object): this + * Adds a listener function (`fn`) to a particular event type of the object. You can optionally specify the context of the listener (object the this keyword will point to). You can also pass several space-separated types (e.g. `'click dblclick'`). + * + * @alternative + * @method on(eventMap: Object): this + * Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + */ + on: function (types, fn, context) { + + // types can be a map of types/handlers + if (typeof types === 'object') { + for (var type in types) { + // we don't process space-separated events here for performance; + // it's a hot path since Layer uses the on(obj) syntax + this._on(type, types[type], fn); + } + + } else { + // types can be a string of space-separated words + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._on(types[i], fn, context); + } + } + + return this; + }, + + /* @method off(type: String, fn?: Function, context?: Object): this + * Removes a previously added listener function. If no function is specified, it will remove all the listeners of that particular event from the object. Note that if you passed a custom context to `on`, you must pass the same context to `off` in order to remove the listener. + * + * @alternative + * @method off(eventMap: Object): this + * Removes a set of type/listener pairs. + * + * @alternative + * @method off: this + * Removes all listeners to all events on the object. This includes implicitly attached events. + */ + off: function (types, fn, context) { + + if (!types) { + // clear all listeners if called without arguments + delete this._events; + + } else if (typeof types === 'object') { + for (var type in types) { + this._off(type, types[type], fn); + } + + } else { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + this._off(types[i], fn, context); + } + } + + return this; + }, + + // attach listener (without syntactic sugar now) + _on: function (type, fn, context) { + this._events = this._events || {}; + + /* get/init listeners for type */ + var typeListeners = this._events[type]; + if (!typeListeners) { + typeListeners = []; + this._events[type] = typeListeners; + } + + if (context === this) { + // Less memory footprint. + context = undefined; + } + var newListener = {fn: fn, ctx: context}, + listeners = typeListeners; + + // check if fn already there + for (var i = 0, len = listeners.length; i < len; i++) { + if (listeners[i].fn === fn && listeners[i].ctx === context) { + return; + } + } + + listeners.push(newListener); + }, + + _off: function (type, fn, context) { + var listeners, + i, + len; + + if (!this._events) { return; } + + listeners = this._events[type]; + + if (!listeners) { + return; + } + + if (!fn) { + // Set all removed listeners to noop so they are not called if remove happens in fire + for (i = 0, len = listeners.length; i < len; i++) { + listeners[i].fn = falseFn; + } + // clear all listeners for a type if function isn't specified + delete this._events[type]; + return; + } + + if (context === this) { + context = undefined; + } + + if (listeners) { + + // find fn and remove it + for (i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + if (l.ctx !== context) { continue; } + if (l.fn === fn) { + + // set the removed listener to noop so that's not called if remove happens in fire + l.fn = falseFn; + + if (this._firingCount) { + /* copy array in case events are being fired */ + this._events[type] = listeners = listeners.slice(); + } + listeners.splice(i, 1); + + return; + } + } + } + }, + + // @method fire(type: String, data?: Object, propagate?: Boolean): this + // Fires an event of the specified type. You can optionally provide an data + // object — the first argument of the listener function will contain its + // properties. The event can optionally be propagated to event parents. + fire: function (type, data, propagate) { + if (!this.listens(type, propagate)) { return this; } + + var event = extend({}, data, { + type: type, + target: this, + sourceTarget: data && data.sourceTarget || this + }); + + if (this._events) { + var listeners = this._events[type]; + + if (listeners) { + this._firingCount = (this._firingCount + 1) || 1; + for (var i = 0, len = listeners.length; i < len; i++) { + var l = listeners[i]; + l.fn.call(l.ctx || this, event); + } + + this._firingCount--; + } + } + + if (propagate) { + // propagate the event to parents (set with addEventParent) + this._propagateEvent(event); + } + + return this; + }, + + // @method listens(type: String): Boolean + // Returns `true` if a particular event type has any listeners attached to it. + listens: function (type, propagate) { + var listeners = this._events && this._events[type]; + if (listeners && listeners.length) { return true; } + + if (propagate) { + // also check parents for listeners if event propagates + for (var id in this._eventParents) { + if (this._eventParents[id].listens(type, propagate)) { return true; } + } + } + return false; + }, + + // @method once(…): this + // Behaves as [`on(…)`](#evented-on), except the listener will only get fired once and then removed. + once: function (types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + this.once(type, types[type], fn); + } + return this; + } + + var handler = bind(function () { + this + .off(types, fn, context) + .off(types, handler, context); + }, this); + + // add a listener that's executed once and removed after that + return this + .on(types, fn, context) + .on(types, handler, context); + }, + + // @method addEventParent(obj: Evented): this + // Adds an event parent - an `Evented` that will receive propagated events + addEventParent: function (obj) { + this._eventParents = this._eventParents || {}; + this._eventParents[stamp(obj)] = obj; + return this; + }, + + // @method removeEventParent(obj: Evented): this + // Removes an event parent, so it will stop receiving propagated events + removeEventParent: function (obj) { + if (this._eventParents) { + delete this._eventParents[stamp(obj)]; + } + return this; + }, + + _propagateEvent: function (e) { + for (var id in this._eventParents) { + this._eventParents[id].fire(e.type, extend({ + layer: e.target, + propagatedFrom: e.target + }, e), true); + } + } + }; + + // aliases; we should ditch those eventually + + // @method addEventListener(…): this + // Alias to [`on(…)`](#evented-on) + Events.addEventListener = Events.on; + + // @method removeEventListener(…): this + // Alias to [`off(…)`](#evented-off) + + // @method clearAllEventListeners(…): this + // Alias to [`off()`](#evented-off) + Events.removeEventListener = Events.clearAllEventListeners = Events.off; + + // @method addOneTimeEventListener(…): this + // Alias to [`once(…)`](#evented-once) + Events.addOneTimeEventListener = Events.once; + + // @method fireEvent(…): this + // Alias to [`fire(…)`](#evented-fire) + Events.fireEvent = Events.fire; + + // @method hasEventListeners(…): Boolean + // Alias to [`listens(…)`](#evented-listens) + Events.hasEventListeners = Events.listens; + + var Evented = Class.extend(Events); + + /* + * @class Point + * @aka L.Point + * + * Represents a point with `x` and `y` coordinates in pixels. + * + * @example + * + * ```js + * var point = L.point(200, 300); + * ``` + * + * All Leaflet methods and options that accept `Point` objects also accept them in a simple Array form (unless noted otherwise), so these lines are equivalent: + * + * ```js + * map.panBy([200, 300]); + * map.panBy(L.point(200, 300)); + * ``` + * + * Note that `Point` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + + function Point(x, y, round) { + // @property x: Number; The `x` coordinate of the point + this.x = (round ? Math.round(x) : x); + // @property y: Number; The `y` coordinate of the point + this.y = (round ? Math.round(y) : y); + } + + var trunc = Math.trunc || function (v) { + return v > 0 ? Math.floor(v) : Math.ceil(v); + }; + + Point.prototype = { + + // @method clone(): Point + // Returns a copy of the current point. + clone: function () { + return new Point(this.x, this.y); + }, + + // @method add(otherPoint: Point): Point + // Returns the result of addition of the current and the given points. + add: function (point) { + // non-destructive, returns a new point + return this.clone()._add(toPoint(point)); + }, + + _add: function (point) { + // destructive, used directly for performance in situations where it's safe to modify existing point + this.x += point.x; + this.y += point.y; + return this; + }, + + // @method subtract(otherPoint: Point): Point + // Returns the result of subtraction of the given point from the current. + subtract: function (point) { + return this.clone()._subtract(toPoint(point)); + }, + + _subtract: function (point) { + this.x -= point.x; + this.y -= point.y; + return this; + }, + + // @method divideBy(num: Number): Point + // Returns the result of division of the current point by the given number. + divideBy: function (num) { + return this.clone()._divideBy(num); + }, + + _divideBy: function (num) { + this.x /= num; + this.y /= num; + return this; + }, + + // @method multiplyBy(num: Number): Point + // Returns the result of multiplication of the current point by the given number. + multiplyBy: function (num) { + return this.clone()._multiplyBy(num); + }, + + _multiplyBy: function (num) { + this.x *= num; + this.y *= num; + return this; + }, + + // @method scaleBy(scale: Point): Point + // Multiply each coordinate of the current point by each coordinate of + // `scale`. In linear algebra terms, multiply the point by the + // [scaling matrix](https://en.wikipedia.org/wiki/Scaling_%28geometry%29#Matrix_representation) + // defined by `scale`. + scaleBy: function (point) { + return new Point(this.x * point.x, this.y * point.y); + }, + + // @method unscaleBy(scale: Point): Point + // Inverse of `scaleBy`. Divide each coordinate of the current point by + // each coordinate of `scale`. + unscaleBy: function (point) { + return new Point(this.x / point.x, this.y / point.y); + }, + + // @method round(): Point + // Returns a copy of the current point with rounded coordinates. + round: function () { + return this.clone()._round(); + }, + + _round: function () { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + }, + + // @method floor(): Point + // Returns a copy of the current point with floored coordinates (rounded down). + floor: function () { + return this.clone()._floor(); + }, + + _floor: function () { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + return this; + }, + + // @method ceil(): Point + // Returns a copy of the current point with ceiled coordinates (rounded up). + ceil: function () { + return this.clone()._ceil(); + }, + + _ceil: function () { + this.x = Math.ceil(this.x); + this.y = Math.ceil(this.y); + return this; + }, + + // @method trunc(): Point + // Returns a copy of the current point with truncated coordinates (rounded towards zero). + trunc: function () { + return this.clone()._trunc(); + }, + + _trunc: function () { + this.x = trunc(this.x); + this.y = trunc(this.y); + return this; + }, + + // @method distanceTo(otherPoint: Point): Number + // Returns the cartesian distance between the current and the given points. + distanceTo: function (point) { + point = toPoint(point); + + var x = point.x - this.x, + y = point.y - this.y; + + return Math.sqrt(x * x + y * y); + }, + + // @method equals(otherPoint: Point): Boolean + // Returns `true` if the given point has the same coordinates. + equals: function (point) { + point = toPoint(point); + + return point.x === this.x && + point.y === this.y; + }, + + // @method contains(otherPoint: Point): Boolean + // Returns `true` if both coordinates of the given point are less than the corresponding current point coordinates (in absolute values). + contains: function (point) { + point = toPoint(point); + + return Math.abs(point.x) <= Math.abs(this.x) && + Math.abs(point.y) <= Math.abs(this.y); + }, + + // @method toString(): String + // Returns a string representation of the point for debugging purposes. + toString: function () { + return 'Point(' + + formatNum(this.x) + ', ' + + formatNum(this.y) + ')'; + } + }; + + // @factory L.point(x: Number, y: Number, round?: Boolean) + // Creates a Point object with the given `x` and `y` coordinates. If optional `round` is set to true, rounds the `x` and `y` values. + + // @alternative + // @factory L.point(coords: Number[]) + // Expects an array of the form `[x, y]` instead. + + // @alternative + // @factory L.point(coords: Object) + // Expects a plain object of the form `{x: Number, y: Number}` instead. + function toPoint(x, y, round) { + if (x instanceof Point) { + return x; + } + if (isArray(x)) { + return new Point(x[0], x[1]); + } + if (x === undefined || x === null) { + return x; + } + if (typeof x === 'object' && 'x' in x && 'y' in x) { + return new Point(x.x, x.y); + } + return new Point(x, y, round); + } + + /* + * @class Bounds + * @aka L.Bounds + * + * Represents a rectangular area in pixel coordinates. + * + * @example + * + * ```js + * var p1 = L.point(10, 10), + * p2 = L.point(40, 60), + * bounds = L.bounds(p1, p2); + * ``` + * + * All Leaflet methods that accept `Bounds` objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * otherBounds.intersects([[10, 10], [40, 60]]); + * ``` + * + * Note that `Bounds` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + + function Bounds(a, b) { + if (!a) { return; } + + var points = b ? [a, b] : a; + + for (var i = 0, len = points.length; i < len; i++) { + this.extend(points[i]); + } + } + + Bounds.prototype = { + // @method extend(point: Point): this + // Extends the bounds to contain the given point. + extend: function (point) { // (Point) + point = toPoint(point); + + // @property min: Point + // The top left corner of the rectangle. + // @property max: Point + // The bottom right corner of the rectangle. + if (!this.min && !this.max) { + this.min = point.clone(); + this.max = point.clone(); + } else { + this.min.x = Math.min(point.x, this.min.x); + this.max.x = Math.max(point.x, this.max.x); + this.min.y = Math.min(point.y, this.min.y); + this.max.y = Math.max(point.y, this.max.y); + } + return this; + }, + + // @method getCenter(round?: Boolean): Point + // Returns the center point of the bounds. + getCenter: function (round) { + return new Point( + (this.min.x + this.max.x) / 2, + (this.min.y + this.max.y) / 2, round); + }, + + // @method getBottomLeft(): Point + // Returns the bottom-left point of the bounds. + getBottomLeft: function () { + return new Point(this.min.x, this.max.y); + }, + + // @method getTopRight(): Point + // Returns the top-right point of the bounds. + getTopRight: function () { // -> Point + return new Point(this.max.x, this.min.y); + }, + + // @method getTopLeft(): Point + // Returns the top-left point of the bounds (i.e. [`this.min`](#bounds-min)). + getTopLeft: function () { + return this.min; // left, top + }, + + // @method getBottomRight(): Point + // Returns the bottom-right point of the bounds (i.e. [`this.max`](#bounds-max)). + getBottomRight: function () { + return this.max; // right, bottom + }, + + // @method getSize(): Point + // Returns the size of the given bounds + getSize: function () { + return this.max.subtract(this.min); + }, + + // @method contains(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle contains the given one. + // @alternative + // @method contains(point: Point): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { + var min, max; + + if (typeof obj[0] === 'number' || obj instanceof Point) { + obj = toPoint(obj); + } else { + obj = toBounds(obj); + } + + if (obj instanceof Bounds) { + min = obj.min; + max = obj.max; + } else { + min = max = obj; + } + + return (min.x >= this.min.x) && + (max.x <= this.max.x) && + (min.y >= this.min.y) && + (max.y <= this.max.y); + }, + + // @method intersects(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds + // intersect if they have at least one point in common. + intersects: function (bounds) { // (Bounds) -> Boolean + bounds = toBounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xIntersects = (max2.x >= min.x) && (min2.x <= max.x), + yIntersects = (max2.y >= min.y) && (min2.y <= max.y); + + return xIntersects && yIntersects; + }, + + // @method overlaps(otherBounds: Bounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds + // overlap if their intersection is an area. + overlaps: function (bounds) { // (Bounds) -> Boolean + bounds = toBounds(bounds); + + var min = this.min, + max = this.max, + min2 = bounds.min, + max2 = bounds.max, + xOverlaps = (max2.x > min.x) && (min2.x < max.x), + yOverlaps = (max2.y > min.y) && (min2.y < max.y); + + return xOverlaps && yOverlaps; + }, + + isValid: function () { + return !!(this.min && this.max); + } + }; + + + // @factory L.bounds(corner1: Point, corner2: Point) + // Creates a Bounds object from two corners coordinate pairs. + // @alternative + // @factory L.bounds(points: Point[]) + // Creates a Bounds object from the given array of points. + function toBounds(a, b) { + if (!a || a instanceof Bounds) { + return a; + } + return new Bounds(a, b); + } + + /* + * @class LatLngBounds + * @aka L.LatLngBounds + * + * Represents a rectangular geographical area on a map. + * + * @example + * + * ```js + * var corner1 = L.latLng(40.712, -74.227), + * corner2 = L.latLng(40.774, -74.125), + * bounds = L.latLngBounds(corner1, corner2); + * ``` + * + * All Leaflet methods that accept LatLngBounds objects also accept them in a simple Array form (unless noted otherwise), so the bounds example above can be passed like this: + * + * ```js + * map.fitBounds([ + * [40.712, -74.227], + * [40.774, -74.125] + * ]); + * ``` + * + * Caution: if the area crosses the antimeridian (often confused with the International Date Line), you must specify corners _outside_ the [-180, 180] degrees longitude range. + * + * Note that `LatLngBounds` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + + function LatLngBounds(corner1, corner2) { // (LatLng, LatLng) or (LatLng[]) + if (!corner1) { return; } + + var latlngs = corner2 ? [corner1, corner2] : corner1; + + for (var i = 0, len = latlngs.length; i < len; i++) { + this.extend(latlngs[i]); + } + } + + LatLngBounds.prototype = { + + // @method extend(latlng: LatLng): this + // Extend the bounds to contain the given point + + // @alternative + // @method extend(otherBounds: LatLngBounds): this + // Extend the bounds to contain the given bounds + extend: function (obj) { + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof LatLng) { + sw2 = obj; + ne2 = obj; + + } else if (obj instanceof LatLngBounds) { + sw2 = obj._southWest; + ne2 = obj._northEast; + + if (!sw2 || !ne2) { return this; } + + } else { + return obj ? this.extend(toLatLng(obj) || toLatLngBounds(obj)) : this; + } + + if (!sw && !ne) { + this._southWest = new LatLng(sw2.lat, sw2.lng); + this._northEast = new LatLng(ne2.lat, ne2.lng); + } else { + sw.lat = Math.min(sw2.lat, sw.lat); + sw.lng = Math.min(sw2.lng, sw.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + } + + return this; + }, + + // @method pad(bufferRatio: Number): LatLngBounds + // Returns bounds created by extending or retracting the current bounds by a given ratio in each direction. + // For example, a ratio of 0.5 extends the bounds by 50% in each direction. + // Negative values will retract the bounds. + pad: function (bufferRatio) { + var sw = this._southWest, + ne = this._northEast, + heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio, + widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio; + + return new LatLngBounds( + new LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer), + new LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer)); + }, + + // @method getCenter(): LatLng + // Returns the center point of the bounds. + getCenter: function () { + return new LatLng( + (this._southWest.lat + this._northEast.lat) / 2, + (this._southWest.lng + this._northEast.lng) / 2); + }, + + // @method getSouthWest(): LatLng + // Returns the south-west point of the bounds. + getSouthWest: function () { + return this._southWest; + }, + + // @method getNorthEast(): LatLng + // Returns the north-east point of the bounds. + getNorthEast: function () { + return this._northEast; + }, + + // @method getNorthWest(): LatLng + // Returns the north-west point of the bounds. + getNorthWest: function () { + return new LatLng(this.getNorth(), this.getWest()); + }, + + // @method getSouthEast(): LatLng + // Returns the south-east point of the bounds. + getSouthEast: function () { + return new LatLng(this.getSouth(), this.getEast()); + }, + + // @method getWest(): Number + // Returns the west longitude of the bounds + getWest: function () { + return this._southWest.lng; + }, + + // @method getSouth(): Number + // Returns the south latitude of the bounds + getSouth: function () { + return this._southWest.lat; + }, + + // @method getEast(): Number + // Returns the east longitude of the bounds + getEast: function () { + return this._northEast.lng; + }, + + // @method getNorth(): Number + // Returns the north latitude of the bounds + getNorth: function () { + return this._northEast.lat; + }, + + // @method contains(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle contains the given one. + + // @alternative + // @method contains (latlng: LatLng): Boolean + // Returns `true` if the rectangle contains the given point. + contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean + if (typeof obj[0] === 'number' || obj instanceof LatLng || 'lat' in obj) { + obj = toLatLng(obj); + } else { + obj = toLatLngBounds(obj); + } + + var sw = this._southWest, + ne = this._northEast, + sw2, ne2; + + if (obj instanceof LatLngBounds) { + sw2 = obj.getSouthWest(); + ne2 = obj.getNorthEast(); + } else { + sw2 = ne2 = obj; + } + + return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) && + (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng); + }, + + // @method intersects(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle intersects the given bounds. Two bounds intersect if they have at least one point in common. + intersects: function (bounds) { + bounds = toLatLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat), + lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng); + + return latIntersects && lngIntersects; + }, + + // @method overlaps(otherBounds: LatLngBounds): Boolean + // Returns `true` if the rectangle overlaps the given bounds. Two bounds overlap if their intersection is an area. + overlaps: function (bounds) { + bounds = toLatLngBounds(bounds); + + var sw = this._southWest, + ne = this._northEast, + sw2 = bounds.getSouthWest(), + ne2 = bounds.getNorthEast(), + + latOverlaps = (ne2.lat > sw.lat) && (sw2.lat < ne.lat), + lngOverlaps = (ne2.lng > sw.lng) && (sw2.lng < ne.lng); + + return latOverlaps && lngOverlaps; + }, + + // @method toBBoxString(): String + // Returns a string with bounding box coordinates in a 'southwest_lng,southwest_lat,northeast_lng,northeast_lat' format. Useful for sending requests to web services that return geo data. + toBBoxString: function () { + return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(','); + }, + + // @method equals(otherBounds: LatLngBounds, maxMargin?: Number): Boolean + // Returns `true` if the rectangle is equivalent (within a small margin of error) to the given bounds. The margin of error can be overridden by setting `maxMargin` to a small number. + equals: function (bounds, maxMargin) { + if (!bounds) { return false; } + + bounds = toLatLngBounds(bounds); + + return this._southWest.equals(bounds.getSouthWest(), maxMargin) && + this._northEast.equals(bounds.getNorthEast(), maxMargin); + }, + + // @method isValid(): Boolean + // Returns `true` if the bounds are properly initialized. + isValid: function () { + return !!(this._southWest && this._northEast); + } + }; + + // TODO International date line? + + // @factory L.latLngBounds(corner1: LatLng, corner2: LatLng) + // Creates a `LatLngBounds` object by defining two diagonally opposite corners of the rectangle. + + // @alternative + // @factory L.latLngBounds(latlngs: LatLng[]) + // Creates a `LatLngBounds` object defined by the geographical points it contains. Very useful for zooming the map to fit a particular set of locations with [`fitBounds`](#map-fitbounds). + function toLatLngBounds(a, b) { + if (a instanceof LatLngBounds) { + return a; + } + return new LatLngBounds(a, b); + } + + /* @class LatLng + * @aka L.LatLng + * + * Represents a geographical point with a certain latitude and longitude. + * + * @example + * + * ``` + * var latlng = L.latLng(50.5, 30.5); + * ``` + * + * All Leaflet methods that accept LatLng objects also accept them in a simple Array form and simple object form (unless noted otherwise), so these lines are equivalent: + * + * ``` + * map.panTo([50, 30]); + * map.panTo({lon: 30, lat: 50}); + * map.panTo({lat: 50, lng: 30}); + * map.panTo(L.latLng(50, 30)); + * ``` + * + * Note that `LatLng` does not inherit from Leaflet's `Class` object, + * which means new classes can't inherit from it, and new methods + * can't be added to it with the `include` function. + */ + + function LatLng(lat, lng, alt) { + if (isNaN(lat) || isNaN(lng)) { + throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')'); + } + + // @property lat: Number + // Latitude in degrees + this.lat = +lat; + + // @property lng: Number + // Longitude in degrees + this.lng = +lng; + + // @property alt: Number + // Altitude in meters (optional) + if (alt !== undefined) { + this.alt = +alt; + } + } + + LatLng.prototype = { + // @method equals(otherLatLng: LatLng, maxMargin?: Number): Boolean + // Returns `true` if the given `LatLng` point is at the same position (within a small margin of error). The margin of error can be overridden by setting `maxMargin` to a small number. + equals: function (obj, maxMargin) { + if (!obj) { return false; } + + obj = toLatLng(obj); + + var margin = Math.max( + Math.abs(this.lat - obj.lat), + Math.abs(this.lng - obj.lng)); + + return margin <= (maxMargin === undefined ? 1.0E-9 : maxMargin); + }, + + // @method toString(): String + // Returns a string representation of the point (for debugging purposes). + toString: function (precision) { + return 'LatLng(' + + formatNum(this.lat, precision) + ', ' + + formatNum(this.lng, precision) + ')'; + }, + + // @method distanceTo(otherLatLng: LatLng): Number + // Returns the distance (in meters) to the given `LatLng` calculated using the [Spherical Law of Cosines](https://en.wikipedia.org/wiki/Spherical_law_of_cosines). + distanceTo: function (other) { + return Earth.distance(this, toLatLng(other)); + }, + + // @method wrap(): LatLng + // Returns a new `LatLng` object with the longitude wrapped so it's always between -180 and +180 degrees. + wrap: function () { + return Earth.wrapLatLng(this); + }, + + // @method toBounds(sizeInMeters: Number): LatLngBounds + // Returns a new `LatLngBounds` object in which each boundary is `sizeInMeters/2` meters apart from the `LatLng`. + toBounds: function (sizeInMeters) { + var latAccuracy = 180 * sizeInMeters / 40075017, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); + + return toLatLngBounds( + [this.lat - latAccuracy, this.lng - lngAccuracy], + [this.lat + latAccuracy, this.lng + lngAccuracy]); + }, + + clone: function () { + return new LatLng(this.lat, this.lng, this.alt); + } + }; + + + + // @factory L.latLng(latitude: Number, longitude: Number, altitude?: Number): LatLng + // Creates an object representing a geographical point with the given latitude and longitude (and optionally altitude). + + // @alternative + // @factory L.latLng(coords: Array): LatLng + // Expects an array of the form `[Number, Number]` or `[Number, Number, Number]` instead. + + // @alternative + // @factory L.latLng(coords: Object): LatLng + // Expects an plain object of the form `{lat: Number, lng: Number}` or `{lat: Number, lng: Number, alt: Number}` instead. + + function toLatLng(a, b, c) { + if (a instanceof LatLng) { + return a; + } + if (isArray(a) && typeof a[0] !== 'object') { + if (a.length === 3) { + return new LatLng(a[0], a[1], a[2]); + } + if (a.length === 2) { + return new LatLng(a[0], a[1]); + } + return null; + } + if (a === undefined || a === null) { + return a; + } + if (typeof a === 'object' && 'lat' in a) { + return new LatLng(a.lat, 'lng' in a ? a.lng : a.lon, a.alt); + } + if (b === undefined) { + return null; + } + return new LatLng(a, b, c); + } + + /* + * @namespace CRS + * @crs L.CRS.Base + * Object that defines coordinate reference systems for projecting + * geographical points into pixel (screen) coordinates and back (and to + * coordinates in other units for [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services). See + * [spatial reference system](http://en.wikipedia.org/wiki/Coordinate_reference_system). + * + * Leaflet defines the most usual CRSs by default. If you want to use a + * CRS not defined by default, take a look at the + * [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. + * + * Note that the CRS instances do not inherit from Leaflet's `Class` object, + * and can't be instantiated. Also, new classes can't inherit from them, + * and methods can't be added to them with the `include` function. + */ + + var CRS = { + // @method latLngToPoint(latlng: LatLng, zoom: Number): Point + // Projects geographical coordinates into pixel coordinates for a given zoom. + latLngToPoint: function (latlng, zoom) { + var projectedPoint = this.projection.project(latlng), + scale = this.scale(zoom); + + return this.transformation._transform(projectedPoint, scale); + }, + + // @method pointToLatLng(point: Point, zoom: Number): LatLng + // The inverse of `latLngToPoint`. Projects pixel coordinates on a given + // zoom into geographical coordinates. + pointToLatLng: function (point, zoom) { + var scale = this.scale(zoom), + untransformedPoint = this.transformation.untransform(point, scale); + + return this.projection.unproject(untransformedPoint); + }, + + // @method project(latlng: LatLng): Point + // Projects geographical coordinates into coordinates in units accepted for + // this CRS (e.g. meters for EPSG:3857, for passing it to WMS services). + project: function (latlng) { + return this.projection.project(latlng); + }, + + // @method unproject(point: Point): LatLng + // Given a projected coordinate returns the corresponding LatLng. + // The inverse of `project`. + unproject: function (point) { + return this.projection.unproject(point); + }, + + // @method scale(zoom: Number): Number + // Returns the scale used when transforming projected coordinates into + // pixel coordinates for a particular zoom. For example, it returns + // `256 * 2^zoom` for Mercator-based CRS. + scale: function (zoom) { + return 256 * Math.pow(2, zoom); + }, + + // @method zoom(scale: Number): Number + // Inverse of `scale()`, returns the zoom level corresponding to a scale + // factor of `scale`. + zoom: function (scale) { + return Math.log(scale / 256) / Math.LN2; + }, + + // @method getProjectedBounds(zoom: Number): Bounds + // Returns the projection's bounds scaled and transformed for the provided `zoom`. + getProjectedBounds: function (zoom) { + if (this.infinite) { return null; } + + var b = this.projection.bounds, + s = this.scale(zoom), + min = this.transformation.transform(b.min, s), + max = this.transformation.transform(b.max, s); + + return new Bounds(min, max); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates. + + // @property code: String + // Standard code name of the CRS passed into WMS services (e.g. `'EPSG:3857'`) + // + // @property wrapLng: Number[] + // An array of two numbers defining whether the longitude (horizontal) coordinate + // axis wraps around a given range and how. Defaults to `[-180, 180]` in most + // geographical CRSs. If `undefined`, the longitude axis does not wrap around. + // + // @property wrapLat: Number[] + // Like `wrapLng`, but for the latitude (vertical) axis. + + // wrapLng: [min, max], + // wrapLat: [min, max], + + // @property infinite: Boolean + // If true, the coordinate space will be unbounded (infinite in both axes) + infinite: false, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where lat and lng has been wrapped according to the + // CRS's `wrapLat` and `wrapLng` properties, if they are outside the CRS's bounds. + wrapLatLng: function (latlng) { + var lng = this.wrapLng ? wrapNum(latlng.lng, this.wrapLng, true) : latlng.lng, + lat = this.wrapLat ? wrapNum(latlng.lat, this.wrapLat, true) : latlng.lat, + alt = latlng.alt; + + return new LatLng(lat, lng, alt); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring + // that its center is within the CRS's bounds. + // Only accepts actual `L.LatLngBounds` instances, not arrays. + wrapLatLngBounds: function (bounds) { + var center = bounds.getCenter(), + newCenter = this.wrapLatLng(center), + latShift = center.lat - newCenter.lat, + lngShift = center.lng - newCenter.lng; + + if (latShift === 0 && lngShift === 0) { + return bounds; + } + + var sw = bounds.getSouthWest(), + ne = bounds.getNorthEast(), + newSw = new LatLng(sw.lat - latShift, sw.lng - lngShift), + newNe = new LatLng(ne.lat - latShift, ne.lng - lngShift); + + return new LatLngBounds(newSw, newNe); + } + }; + + /* + * @namespace CRS + * @crs L.CRS.Earth + * + * Serves as the base for CRS that are global such that they cover the earth. + * Can only be used as the base for other CRS and cannot be used directly, + * since it does not have a `code`, `projection` or `transformation`. `distance()` returns + * meters. + */ + + var Earth = extend({}, CRS, { + wrapLng: [-180, 180], + + // Mean Earth Radius, as recommended for use by + // the International Union of Geodesy and Geophysics, + // see http://rosettacode.org/wiki/Haversine_formula + R: 6371000, + + // distance between two geographical points using spherical law of cosines approximation + distance: function (latlng1, latlng2) { + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + sinDLat = Math.sin((latlng2.lat - latlng1.lat) * rad / 2), + sinDLon = Math.sin((latlng2.lng - latlng1.lng) * rad / 2), + a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon, + c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return this.R * c; + } + }); + + /* + * @namespace Projection + * @projection L.Projection.SphericalMercator + * + * Spherical Mercator projection — the most common projection for online maps, + * used by almost all free and commercial tile providers. Assumes that Earth is + * a sphere. Used by the `EPSG:3857` CRS. + */ + + var earthRadius = 6378137; + + var SphericalMercator = { + + R: earthRadius, + MAX_LATITUDE: 85.0511287798, + + project: function (latlng) { + var d = Math.PI / 180, + max = this.MAX_LATITUDE, + lat = Math.max(Math.min(max, latlng.lat), -max), + sin = Math.sin(lat * d); + + return new Point( + this.R * latlng.lng * d, + this.R * Math.log((1 + sin) / (1 - sin)) / 2); + }, + + unproject: function (point) { + var d = 180 / Math.PI; + + return new LatLng( + (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d, + point.x * d / this.R); + }, + + bounds: (function () { + var d = earthRadius * Math.PI; + return new Bounds([-d, -d], [d, d]); + })() + }; + + /* + * @class Transformation + * @aka L.Transformation + * + * Represents an affine transformation: a set of coefficients `a`, `b`, `c`, `d` + * for transforming a point of a form `(x, y)` into `(a*x + b, c*y + d)` and doing + * the reverse. Used by Leaflet in its projections code. + * + * @example + * + * ```js + * var transformation = L.transformation(2, 5, -1, 10), + * p = L.point(1, 2), + * p2 = transformation.transform(p), // L.point(7, 8) + * p3 = transformation.untransform(p2); // L.point(1, 2) + * ``` + */ + + + // factory new L.Transformation(a: Number, b: Number, c: Number, d: Number) + // Creates a `Transformation` object with the given coefficients. + function Transformation(a, b, c, d) { + if (isArray(a)) { + // use array properties + this._a = a[0]; + this._b = a[1]; + this._c = a[2]; + this._d = a[3]; + return; + } + this._a = a; + this._b = b; + this._c = c; + this._d = d; + } + + Transformation.prototype = { + // @method transform(point: Point, scale?: Number): Point + // Returns a transformed point, optionally multiplied by the given scale. + // Only accepts actual `L.Point` instances, not arrays. + transform: function (point, scale) { // (Point, Number) -> Point + return this._transform(point.clone(), scale); + }, + + // destructive transform (faster) + _transform: function (point, scale) { + scale = scale || 1; + point.x = scale * (this._a * point.x + this._b); + point.y = scale * (this._c * point.y + this._d); + return point; + }, + + // @method untransform(point: Point, scale?: Number): Point + // Returns the reverse transformation of the given point, optionally divided + // by the given scale. Only accepts actual `L.Point` instances, not arrays. + untransform: function (point, scale) { + scale = scale || 1; + return new Point( + (point.x / scale - this._b) / this._a, + (point.y / scale - this._d) / this._c); + } + }; + + // factory L.transformation(a: Number, b: Number, c: Number, d: Number) + + // @factory L.transformation(a: Number, b: Number, c: Number, d: Number) + // Instantiates a Transformation object with the given coefficients. + + // @alternative + // @factory L.transformation(coefficients: Array): Transformation + // Expects an coefficients array of the form + // `[a: Number, b: Number, c: Number, d: Number]`. + + function toTransformation(a, b, c, d) { + return new Transformation(a, b, c, d); + } + + /* + * @namespace CRS + * @crs L.CRS.EPSG3857 + * + * The most common CRS for online maps, used by almost all free and commercial + * tile providers. Uses Spherical Mercator projection. Set in by default in + * Map's `crs` option. + */ + + var EPSG3857 = extend({}, Earth, { + code: 'EPSG:3857', + projection: SphericalMercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * SphericalMercator.R); + return toTransformation(scale, 0.5, -scale, 0.5); + }()) + }); + + var EPSG900913 = extend({}, EPSG3857, { + code: 'EPSG:900913' + }); + + // @namespace SVG; @section + // There are several static functions which can be called without instantiating L.SVG: + + // @function create(name: String): SVGElement + // Returns a instance of [SVGElement](https://developer.mozilla.org/docs/Web/API/SVGElement), + // corresponding to the class name passed. For example, using 'line' will return + // an instance of [SVGLineElement](https://developer.mozilla.org/docs/Web/API/SVGLineElement). + function svgCreate(name) { + return document.createElementNS('http://www.w3.org/2000/svg', name); + } + + // @function pointsToPath(rings: Point[], closed: Boolean): String + // Generates a SVG path string for multiple rings, with each ring turning + // into "M..L..L.." instructions + function pointsToPath(rings, closed) { + var str = '', + i, j, len, len2, points, p; + + for (i = 0, len = rings.length; i < len; i++) { + points = rings[i]; + + for (j = 0, len2 = points.length; j < len2; j++) { + p = points[j]; + str += (j ? 'L' : 'M') + p.x + ' ' + p.y; + } + + // closes the ring for polygons; "x" is VML syntax + str += closed ? (svg ? 'z' : 'x') : ''; + } + + // SVG complains about empty path strings + return str || 'M0 0'; + } + + /* + * @namespace Browser + * @aka L.Browser + * + * A namespace with static properties for browser/feature detection used by Leaflet internally. + * + * @example + * + * ```js + * if (L.Browser.ielt9) { + * alert('Upgrade your browser, dude!'); + * } + * ``` + */ + + var style$1 = document.documentElement.style; + + // @property ie: Boolean; `true` for all Internet Explorer versions (not Edge). + var ie = 'ActiveXObject' in window; + + // @property ielt9: Boolean; `true` for Internet Explorer versions less than 9. + var ielt9 = ie && !document.addEventListener; + + // @property edge: Boolean; `true` for the Edge web browser. + var edge = 'msLaunchUri' in navigator && !('documentMode' in document); + + // @property webkit: Boolean; + // `true` for webkit-based browsers like Chrome and Safari (including mobile versions). + var webkit = userAgentContains('webkit'); + + // @property android: Boolean + // `true` for any browser running on an Android platform. + var android = userAgentContains('android'); + + // @property android23: Boolean; `true` for browsers running on Android 2 or Android 3. + var android23 = userAgentContains('android 2') || userAgentContains('android 3'); + + /* See https://stackoverflow.com/a/17961266 for details on detecting stock Android */ + var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1], 10); // also matches AppleWebKit + // @property androidStock: Boolean; `true` for the Android stock browser (i.e. not Chrome) + var androidStock = android && userAgentContains('Google') && webkitVer < 537 && !('AudioNode' in window); + + // @property opera: Boolean; `true` for the Opera browser + var opera = !!window.opera; + + // @property chrome: Boolean; `true` for the Chrome browser. + var chrome = !edge && userAgentContains('chrome'); + + // @property gecko: Boolean; `true` for gecko-based browsers like Firefox. + var gecko = userAgentContains('gecko') && !webkit && !opera && !ie; + + // @property safari: Boolean; `true` for the Safari browser. + var safari = !chrome && userAgentContains('safari'); + + var phantom = userAgentContains('phantom'); + + // @property opera12: Boolean + // `true` for the Opera browser supporting CSS transforms (version 12 or later). + var opera12 = 'OTransition' in style$1; + + // @property win: Boolean; `true` when the browser is running in a Windows platform + var win = navigator.platform.indexOf('Win') === 0; + + // @property ie3d: Boolean; `true` for all Internet Explorer versions supporting CSS transforms. + var ie3d = ie && ('transition' in style$1); + + // @property webkit3d: Boolean; `true` for webkit-based browsers supporting CSS transforms. + var webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23; + + // @property gecko3d: Boolean; `true` for gecko-based browsers supporting CSS transforms. + var gecko3d = 'MozPerspective' in style$1; + + // @property any3d: Boolean + // `true` for all browsers supporting CSS transforms. + var any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d) && !opera12 && !phantom; + + // @property mobile: Boolean; `true` for all browsers running in a mobile device. + var mobile = typeof orientation !== 'undefined' || userAgentContains('mobile'); + + // @property mobileWebkit: Boolean; `true` for all webkit-based browsers in a mobile device. + var mobileWebkit = mobile && webkit; + + // @property mobileWebkit3d: Boolean + // `true` for all webkit-based browsers in a mobile device supporting CSS transforms. + var mobileWebkit3d = mobile && webkit3d; + + // @property msPointer: Boolean + // `true` for browsers implementing the Microsoft touch events model (notably IE10). + var msPointer = !window.PointerEvent && window.MSPointerEvent; + + // @property pointer: Boolean + // `true` for all browsers supporting [pointer events](https://msdn.microsoft.com/en-us/library/dn433244%28v=vs.85%29.aspx). + var pointer = !!(window.PointerEvent || msPointer); + + // @property touch: Boolean + // `true` for all browsers supporting [touch events](https://developer.mozilla.org/docs/Web/API/Touch_events). + // This does not necessarily mean that the browser is running in a computer with + // a touchscreen, it only means that the browser is capable of understanding + // touch events. + var touch = !window.L_NO_TOUCH && (pointer || 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch)); + + // @property mobileOpera: Boolean; `true` for the Opera browser in a mobile device. + var mobileOpera = mobile && opera; + + // @property mobileGecko: Boolean + // `true` for gecko-based browsers running in a mobile device. + var mobileGecko = mobile && gecko; + + // @property retina: Boolean + // `true` for browsers on a high-resolution "retina" screen or on any screen when browser's display zoom is more than 100%. + var retina = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1; + + // @property passiveEvents: Boolean + // `true` for browsers that support passive events. + var passiveEvents = (function () { + var supportsPassiveOption = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function () { // eslint-disable-line getter-return + supportsPassiveOption = true; + } + }); + window.addEventListener('testPassiveEventSupport', falseFn, opts); + window.removeEventListener('testPassiveEventSupport', falseFn, opts); + } catch (e) { + // Errors can safely be ignored since this is only a browser support test. + } + return supportsPassiveOption; + }()); + + // @property canvas: Boolean + // `true` when the browser supports [``](https://developer.mozilla.org/docs/Web/API/Canvas_API). + var canvas = (function () { + return !!document.createElement('canvas').getContext; + }()); + + // @property svg: Boolean + // `true` when the browser supports [SVG](https://developer.mozilla.org/docs/Web/SVG). + var svg = !!(document.createElementNS && svgCreate('svg').createSVGRect); + + // @property vml: Boolean + // `true` if the browser supports [VML](https://en.wikipedia.org/wiki/Vector_Markup_Language). + var vml = !svg && (function () { + try { + var div = document.createElement('div'); + div.innerHTML = ''; + + var shape = div.firstChild; + shape.style.behavior = 'url(#default#VML)'; + + return shape && (typeof shape.adj === 'object'); + + } catch (e) { + return false; + } + }()); + + + function userAgentContains(str) { + return navigator.userAgent.toLowerCase().indexOf(str) >= 0; + } + + var Browser = ({ + ie: ie, + ielt9: ielt9, + edge: edge, + webkit: webkit, + android: android, + android23: android23, + androidStock: androidStock, + opera: opera, + chrome: chrome, + gecko: gecko, + safari: safari, + phantom: phantom, + opera12: opera12, + win: win, + ie3d: ie3d, + webkit3d: webkit3d, + gecko3d: gecko3d, + any3d: any3d, + mobile: mobile, + mobileWebkit: mobileWebkit, + mobileWebkit3d: mobileWebkit3d, + msPointer: msPointer, + pointer: pointer, + touch: touch, + mobileOpera: mobileOpera, + mobileGecko: mobileGecko, + retina: retina, + passiveEvents: passiveEvents, + canvas: canvas, + svg: svg, + vml: vml + }); + + /* + * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices. + */ + + + var POINTER_DOWN = msPointer ? 'MSPointerDown' : 'pointerdown'; + var POINTER_MOVE = msPointer ? 'MSPointerMove' : 'pointermove'; + var POINTER_UP = msPointer ? 'MSPointerUp' : 'pointerup'; + var POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel'; + + var _pointers = {}; + var _pointerDocListener = false; + + // Provides a touch events wrapper for (ms)pointer events. + // ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890 + + function addPointerListener(obj, type, handler, id) { + if (type === 'touchstart') { + _addPointerStart(obj, handler, id); + + } else if (type === 'touchmove') { + _addPointerMove(obj, handler, id); + + } else if (type === 'touchend') { + _addPointerEnd(obj, handler, id); + } + + return this; + } + + function removePointerListener(obj, type, id) { + var handler = obj['_leaflet_' + type + id]; + + if (type === 'touchstart') { + obj.removeEventListener(POINTER_DOWN, handler, false); + + } else if (type === 'touchmove') { + obj.removeEventListener(POINTER_MOVE, handler, false); + + } else if (type === 'touchend') { + obj.removeEventListener(POINTER_UP, handler, false); + obj.removeEventListener(POINTER_CANCEL, handler, false); + } + + return this; + } + + function _addPointerStart(obj, handler, id) { + var onDown = bind(function (e) { + // IE10 specific: MsTouch needs preventDefault. See #2000 + if (e.MSPOINTER_TYPE_TOUCH && e.pointerType === e.MSPOINTER_TYPE_TOUCH) { + preventDefault(e); + } + + _handlePointer(e, handler); + }); + + obj['_leaflet_touchstart' + id] = onDown; + obj.addEventListener(POINTER_DOWN, onDown, false); + + // need to keep track of what pointers and how many are active to provide e.touches emulation + if (!_pointerDocListener) { + // we listen document as any drags that end by moving the touch off the screen get fired there + document.addEventListener(POINTER_DOWN, _globalPointerDown, true); + document.addEventListener(POINTER_MOVE, _globalPointerMove, true); + document.addEventListener(POINTER_UP, _globalPointerUp, true); + document.addEventListener(POINTER_CANCEL, _globalPointerUp, true); + + _pointerDocListener = true; + } + } + + function _globalPointerDown(e) { + _pointers[e.pointerId] = e; + } + + function _globalPointerMove(e) { + if (_pointers[e.pointerId]) { + _pointers[e.pointerId] = e; + } + } + + function _globalPointerUp(e) { + delete _pointers[e.pointerId]; + } + + function _handlePointer(e, handler) { + e.touches = []; + for (var i in _pointers) { + e.touches.push(_pointers[i]); + } + e.changedTouches = [e]; + + handler(e); + } + + function _addPointerMove(obj, handler, id) { + var onMove = function (e) { + // don't fire touch moves when mouse isn't down + if ((e.pointerType === (e.MSPOINTER_TYPE_MOUSE || 'mouse')) && e.buttons === 0) { + return; + } + + _handlePointer(e, handler); + }; + + obj['_leaflet_touchmove' + id] = onMove; + obj.addEventListener(POINTER_MOVE, onMove, false); + } + + function _addPointerEnd(obj, handler, id) { + var onUp = function (e) { + _handlePointer(e, handler); + }; + + obj['_leaflet_touchend' + id] = onUp; + obj.addEventListener(POINTER_UP, onUp, false); + obj.addEventListener(POINTER_CANCEL, onUp, false); + } + + /* + * Extends the event handling code with double tap support for mobile browsers. + */ + + var _touchstart = msPointer ? 'MSPointerDown' : pointer ? 'pointerdown' : 'touchstart'; + var _touchend = msPointer ? 'MSPointerUp' : pointer ? 'pointerup' : 'touchend'; + var _pre = '_leaflet_'; + + // inspired by Zepto touch code by Thomas Fuchs + function addDoubleTapListener(obj, handler, id) { + var last, touch$$1, + doubleTap = false, + delay = 250; + + function onTouchStart(e) { + + if (pointer) { + if (!e.isPrimary) { return; } + if (e.pointerType === 'mouse') { return; } // mouse fires native dblclick + } else if (e.touches.length > 1) { + return; + } + + var now = Date.now(), + delta = now - (last || now); + + touch$$1 = e.touches ? e.touches[0] : e; + doubleTap = (delta > 0 && delta <= delay); + last = now; + } + + function onTouchEnd(e) { + if (doubleTap && !touch$$1.cancelBubble) { + if (pointer) { + if (e.pointerType === 'mouse') { return; } + // work around .type being readonly with MSPointer* events + var newTouch = {}, + prop, i; + + for (i in touch$$1) { + prop = touch$$1[i]; + newTouch[i] = prop && prop.bind ? prop.bind(touch$$1) : prop; + } + touch$$1 = newTouch; + } + touch$$1.type = 'dblclick'; + touch$$1.button = 0; + handler(touch$$1); + last = null; + } + } + + obj[_pre + _touchstart + id] = onTouchStart; + obj[_pre + _touchend + id] = onTouchEnd; + obj[_pre + 'dblclick' + id] = handler; + + obj.addEventListener(_touchstart, onTouchStart, passiveEvents ? {passive: false} : false); + obj.addEventListener(_touchend, onTouchEnd, passiveEvents ? {passive: false} : false); + + // On some platforms (notably, chrome<55 on win10 + touchscreen + mouse), + // the browser doesn't fire touchend/pointerup events but does fire + // native dblclicks. See #4127. + // Edge 14 also fires native dblclicks, but only for pointerType mouse, see #5180. + obj.addEventListener('dblclick', handler, false); + + return this; + } + + function removeDoubleTapListener(obj, id) { + var touchstart = obj[_pre + _touchstart + id], + touchend = obj[_pre + _touchend + id], + dblclick = obj[_pre + 'dblclick' + id]; + + obj.removeEventListener(_touchstart, touchstart, passiveEvents ? {passive: false} : false); + obj.removeEventListener(_touchend, touchend, passiveEvents ? {passive: false} : false); + obj.removeEventListener('dblclick', dblclick, false); + + return this; + } + + /* + * @namespace DomUtil + * + * Utility functions to work with the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) + * tree, used by Leaflet internally. + * + * Most functions expecting or returning a `HTMLElement` also work for + * SVG elements. The only difference is that classes refer to CSS classes + * in HTML and SVG classes in SVG. + */ + + + // @property TRANSFORM: String + // Vendor-prefixed transform style name (e.g. `'webkitTransform'` for WebKit). + var TRANSFORM = testProp( + ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']); + + // webkitTransition comes first because some browser versions that drop vendor prefix don't do + // the same for the transitionend event, in particular the Android 4.1 stock browser + + // @property TRANSITION: String + // Vendor-prefixed transition style name. + var TRANSITION = testProp( + ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']); + + // @property TRANSITION_END: String + // Vendor-prefixed transitionend event name. + var TRANSITION_END = + TRANSITION === 'webkitTransition' || TRANSITION === 'OTransition' ? TRANSITION + 'End' : 'transitionend'; + + + // @function get(id: String|HTMLElement): HTMLElement + // Returns an element given its DOM id, or returns the element itself + // if it was passed directly. + function get(id) { + return typeof id === 'string' ? document.getElementById(id) : id; + } + + // @function getStyle(el: HTMLElement, styleAttrib: String): String + // Returns the value for a certain style attribute on an element, + // including computed values or values set through CSS. + function getStyle(el, style) { + var value = el.style[style] || (el.currentStyle && el.currentStyle[style]); + + if ((!value || value === 'auto') && document.defaultView) { + var css = document.defaultView.getComputedStyle(el, null); + value = css ? css[style] : null; + } + return value === 'auto' ? null : value; + } + + // @function create(tagName: String, className?: String, container?: HTMLElement): HTMLElement + // Creates an HTML element with `tagName`, sets its class to `className`, and optionally appends it to `container` element. + function create$1(tagName, className, container) { + var el = document.createElement(tagName); + el.className = className || ''; + + if (container) { + container.appendChild(el); + } + return el; + } + + // @function remove(el: HTMLElement) + // Removes `el` from its parent element + function remove(el) { + var parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } + } + + // @function empty(el: HTMLElement) + // Removes all of `el`'s children elements from `el` + function empty(el) { + while (el.firstChild) { + el.removeChild(el.firstChild); + } + } + + // @function toFront(el: HTMLElement) + // Makes `el` the last child of its parent, so it renders in front of the other children. + function toFront(el) { + var parent = el.parentNode; + if (parent && parent.lastChild !== el) { + parent.appendChild(el); + } + } + + // @function toBack(el: HTMLElement) + // Makes `el` the first child of its parent, so it renders behind the other children. + function toBack(el) { + var parent = el.parentNode; + if (parent && parent.firstChild !== el) { + parent.insertBefore(el, parent.firstChild); + } + } + + // @function hasClass(el: HTMLElement, name: String): Boolean + // Returns `true` if the element's class attribute contains `name`. + function hasClass(el, name) { + if (el.classList !== undefined) { + return el.classList.contains(name); + } + var className = getClass(el); + return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); + } + + // @function addClass(el: HTMLElement, name: String) + // Adds `name` to the element's class attribute. + function addClass(el, name) { + if (el.classList !== undefined) { + var classes = splitWords(name); + for (var i = 0, len = classes.length; i < len; i++) { + el.classList.add(classes[i]); + } + } else if (!hasClass(el, name)) { + var className = getClass(el); + setClass(el, (className ? className + ' ' : '') + name); + } + } + + // @function removeClass(el: HTMLElement, name: String) + // Removes `name` from the element's class attribute. + function removeClass(el, name) { + if (el.classList !== undefined) { + el.classList.remove(name); + } else { + setClass(el, trim((' ' + getClass(el) + ' ').replace(' ' + name + ' ', ' '))); + } + } + + // @function setClass(el: HTMLElement, name: String) + // Sets the element's class. + function setClass(el, name) { + if (el.className.baseVal === undefined) { + el.className = name; + } else { + // in case of SVG element + el.className.baseVal = name; + } + } + + // @function getClass(el: HTMLElement): String + // Returns the element's class. + function getClass(el) { + // Check if the element is an SVGElementInstance and use the correspondingElement instead + // (Required for linked SVG elements in IE11.) + if (el.correspondingElement) { + el = el.correspondingElement; + } + return el.className.baseVal === undefined ? el.className : el.className.baseVal; + } + + // @function setOpacity(el: HTMLElement, opacity: Number) + // Set the opacity of an element (including old IE support). + // `opacity` must be a number from `0` to `1`. + function setOpacity(el, value) { + if ('opacity' in el.style) { + el.style.opacity = value; + } else if ('filter' in el.style) { + _setOpacityIE(el, value); + } + } + + function _setOpacityIE(el, value) { + var filter = false, + filterName = 'DXImageTransform.Microsoft.Alpha'; + + // filters collection throws an error if we try to retrieve a filter that doesn't exist + try { + filter = el.filters.item(filterName); + } catch (e) { + // don't set opacity to 1 if we haven't already set an opacity, + // it isn't needed and breaks transparent pngs. + if (value === 1) { return; } + } + + value = Math.round(value * 100); + + if (filter) { + filter.Enabled = (value !== 100); + filter.Opacity = value; + } else { + el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')'; + } + } + + // @function testProp(props: String[]): String|false + // Goes through the array of style names and returns the first name + // that is a valid style name for an element. If no such name is found, + // it returns false. Useful for vendor-prefixed styles like `transform`. + function testProp(props) { + var style = document.documentElement.style; + + for (var i = 0; i < props.length; i++) { + if (props[i] in style) { + return props[i]; + } + } + return false; + } + + // @function setTransform(el: HTMLElement, offset: Point, scale?: Number) + // Resets the 3D CSS transform of `el` so it is translated by `offset` pixels + // and optionally scaled by `scale`. Does not have an effect if the + // browser doesn't support 3D CSS transforms. + function setTransform(el, offset, scale) { + var pos = offset || new Point(0, 0); + + el.style[TRANSFORM] = + (ie3d ? + 'translate(' + pos.x + 'px,' + pos.y + 'px)' : + 'translate3d(' + pos.x + 'px,' + pos.y + 'px,0)') + + (scale ? ' scale(' + scale + ')' : ''); + } + + // @function setPosition(el: HTMLElement, position: Point) + // Sets the position of `el` to coordinates specified by `position`, + // using CSS translate or top/left positioning depending on the browser + // (used by Leaflet internally to position its layers). + function setPosition(el, point) { + + /*eslint-disable */ + el._leaflet_pos = point; + /* eslint-enable */ + + if (any3d) { + setTransform(el, point); + } else { + el.style.left = point.x + 'px'; + el.style.top = point.y + 'px'; + } + } + + // @function getPosition(el: HTMLElement): Point + // Returns the coordinates of an element previously positioned with setPosition. + function getPosition(el) { + // this method is only used for elements previously positioned using setPosition, + // so it's safe to cache the position for performance + + return el._leaflet_pos || new Point(0, 0); + } + + // @function disableTextSelection() + // Prevents the user from generating `selectstart` DOM events, usually generated + // when the user drags the mouse through a page with text. Used internally + // by Leaflet to override the behaviour of any click-and-drag interaction on + // the map. Affects drag interactions on the whole document. + + // @function enableTextSelection() + // Cancels the effects of a previous [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection). + var disableTextSelection; + var enableTextSelection; + var _userSelect; + if ('onselectstart' in document) { + disableTextSelection = function () { + on(window, 'selectstart', preventDefault); + }; + enableTextSelection = function () { + off(window, 'selectstart', preventDefault); + }; + } else { + var userSelectProperty = testProp( + ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']); + + disableTextSelection = function () { + if (userSelectProperty) { + var style = document.documentElement.style; + _userSelect = style[userSelectProperty]; + style[userSelectProperty] = 'none'; + } + }; + enableTextSelection = function () { + if (userSelectProperty) { + document.documentElement.style[userSelectProperty] = _userSelect; + _userSelect = undefined; + } + }; + } + + // @function disableImageDrag() + // As [`L.DomUtil.disableTextSelection`](#domutil-disabletextselection), but + // for `dragstart` DOM events, usually generated when the user drags an image. + function disableImageDrag() { + on(window, 'dragstart', preventDefault); + } + + // @function enableImageDrag() + // Cancels the effects of a previous [`L.DomUtil.disableImageDrag`](#domutil-disabletextselection). + function enableImageDrag() { + off(window, 'dragstart', preventDefault); + } + + var _outlineElement, _outlineStyle; + // @function preventOutline(el: HTMLElement) + // Makes the [outline](https://developer.mozilla.org/docs/Web/CSS/outline) + // of the element `el` invisible. Used internally by Leaflet to prevent + // focusable elements from displaying an outline when the user performs a + // drag interaction on them. + function preventOutline(element) { + while (element.tabIndex === -1) { + element = element.parentNode; + } + if (!element.style) { return; } + restoreOutline(); + _outlineElement = element; + _outlineStyle = element.style.outline; + element.style.outline = 'none'; + on(window, 'keydown', restoreOutline); + } + + // @function restoreOutline() + // Cancels the effects of a previous [`L.DomUtil.preventOutline`](). + function restoreOutline() { + if (!_outlineElement) { return; } + _outlineElement.style.outline = _outlineStyle; + _outlineElement = undefined; + _outlineStyle = undefined; + off(window, 'keydown', restoreOutline); + } + + // @function getSizedParentNode(el: HTMLElement): HTMLElement + // Finds the closest parent node which size (width and height) is not null. + function getSizedParentNode(element) { + do { + element = element.parentNode; + } while ((!element.offsetWidth || !element.offsetHeight) && element !== document.body); + return element; + } + + // @function getScale(el: HTMLElement): Object + // Computes the CSS scale currently applied on the element. + // Returns an object with `x` and `y` members as horizontal and vertical scales respectively, + // and `boundingClientRect` as the result of [`getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). + function getScale(element) { + var rect = element.getBoundingClientRect(); // Read-only in old browsers. + + return { + x: rect.width / element.offsetWidth || 1, + y: rect.height / element.offsetHeight || 1, + boundingClientRect: rect + }; + } + + var DomUtil = ({ + TRANSFORM: TRANSFORM, + TRANSITION: TRANSITION, + TRANSITION_END: TRANSITION_END, + get: get, + getStyle: getStyle, + create: create$1, + remove: remove, + empty: empty, + toFront: toFront, + toBack: toBack, + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + setClass: setClass, + getClass: getClass, + setOpacity: setOpacity, + testProp: testProp, + setTransform: setTransform, + setPosition: setPosition, + getPosition: getPosition, + disableTextSelection: disableTextSelection, + enableTextSelection: enableTextSelection, + disableImageDrag: disableImageDrag, + enableImageDrag: enableImageDrag, + preventOutline: preventOutline, + restoreOutline: restoreOutline, + getSizedParentNode: getSizedParentNode, + getScale: getScale + }); + + /* + * @namespace DomEvent + * Utility functions to work with the [DOM events](https://developer.mozilla.org/docs/Web/API/Event), used by Leaflet internally. + */ + + // Inspired by John Resig, Dean Edwards and YUI addEvent implementations. + + // @function on(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Adds a listener function (`fn`) to a particular DOM event type of the + // element `el`. You can optionally specify the context of the listener + // (object the `this` keyword will point to). You can also pass several + // space-separated types (e.g. `'click dblclick'`). + + // @alternative + // @function on(el: HTMLElement, eventMap: Object, context?: Object): this + // Adds a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + function on(obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + addOne(obj, type, types[type], fn); + } + } else { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + addOne(obj, types[i], fn, context); + } + } + + return this; + } + + var eventsKey = '_leaflet_events'; + + // @function off(el: HTMLElement, types: String, fn: Function, context?: Object): this + // Removes a previously added listener function. + // Note that if you passed a custom context to on, you must pass the same + // context to `off` in order to remove the listener. + + // @alternative + // @function off(el: HTMLElement, eventMap: Object, context?: Object): this + // Removes a set of type/listener pairs, e.g. `{click: onClick, mousemove: onMouseMove}` + function off(obj, types, fn, context) { + + if (typeof types === 'object') { + for (var type in types) { + removeOne(obj, type, types[type], fn); + } + } else if (types) { + types = splitWords(types); + + for (var i = 0, len = types.length; i < len; i++) { + removeOne(obj, types[i], fn, context); + } + } else { + for (var j in obj[eventsKey]) { + removeOne(obj, j, obj[eventsKey][j]); + } + delete obj[eventsKey]; + } + + return this; + } + + function browserFiresNativeDblClick() { + // See https://github.com/w3c/pointerevents/issues/171 + if (pointer) { + return !(edge || safari); + } + } + + var mouseSubst = { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + wheel: !('onwheel' in window) && 'mousewheel' + }; + + function addOne(obj, type, fn, context) { + var id = type + stamp(fn) + (context ? '_' + stamp(context) : ''); + + if (obj[eventsKey] && obj[eventsKey][id]) { return this; } + + var handler = function (e) { + return fn.call(context || obj, e || window.event); + }; + + var originalHandler = handler; + + if (pointer && type.indexOf('touch') === 0) { + // Needs DomEvent.Pointer.js + addPointerListener(obj, type, handler, id); + + } else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { + addDoubleTapListener(obj, handler, id); + + } else if ('addEventListener' in obj) { + + if (type === 'touchstart' || type === 'touchmove' || type === 'wheel' || type === 'mousewheel') { + obj.addEventListener(mouseSubst[type] || type, handler, passiveEvents ? {passive: false} : false); + + } else if (type === 'mouseenter' || type === 'mouseleave') { + handler = function (e) { + e = e || window.event; + if (isExternalTarget(obj, e)) { + originalHandler(e); + } + }; + obj.addEventListener(mouseSubst[type], handler, false); + + } else { + obj.addEventListener(type, originalHandler, false); + } + + } else if ('attachEvent' in obj) { + obj.attachEvent('on' + type, handler); + } + + obj[eventsKey] = obj[eventsKey] || {}; + obj[eventsKey][id] = handler; + } + + function removeOne(obj, type, fn, context) { + + var id = type + stamp(fn) + (context ? '_' + stamp(context) : ''), + handler = obj[eventsKey] && obj[eventsKey][id]; + + if (!handler) { return this; } + + if (pointer && type.indexOf('touch') === 0) { + removePointerListener(obj, type, id); + + } else if (touch && (type === 'dblclick') && !browserFiresNativeDblClick()) { + removeDoubleTapListener(obj, id); + + } else if ('removeEventListener' in obj) { + + obj.removeEventListener(mouseSubst[type] || type, handler, false); + + } else if ('detachEvent' in obj) { + obj.detachEvent('on' + type, handler); + } + + obj[eventsKey][id] = null; + } + + // @function stopPropagation(ev: DOMEvent): this + // Stop the given event from propagation to parent elements. Used inside the listener functions: + // ```js + // L.DomEvent.on(div, 'click', function (ev) { + // L.DomEvent.stopPropagation(ev); + // }); + // ``` + function stopPropagation(e) { + + if (e.stopPropagation) { + e.stopPropagation(); + } else if (e.originalEvent) { // In case of Leaflet event. + e.originalEvent._stopped = true; + } else { + e.cancelBubble = true; + } + skipped(e); + + return this; + } + + // @function disableScrollPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'wheel'` events (plus browser variants). + function disableScrollPropagation(el) { + addOne(el, 'wheel', stopPropagation); + return this; + } + + // @function disableClickPropagation(el: HTMLElement): this + // Adds `stopPropagation` to the element's `'click'`, `'doubleclick'`, + // `'mousedown'` and `'touchstart'` events (plus browser variants). + function disableClickPropagation(el) { + on(el, 'mousedown touchstart dblclick', stopPropagation); + addOne(el, 'click', fakeStop); + return this; + } + + // @function preventDefault(ev: DOMEvent): this + // Prevents the default action of the DOM Event `ev` from happening (such as + // following a link in the href of the a element, or doing a POST request + // with page reload when a `
` is submitted). + // Use it inside listener functions. + function preventDefault(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + return this; + } + + // @function stop(ev: DOMEvent): this + // Does `stopPropagation` and `preventDefault` at the same time. + function stop(e) { + preventDefault(e); + stopPropagation(e); + return this; + } + + // @function getMousePosition(ev: DOMEvent, container?: HTMLElement): Point + // Gets normalized mouse position from a DOM event relative to the + // `container` (border excluded) or to the whole page if not specified. + function getMousePosition(e, container) { + if (!container) { + return new Point(e.clientX, e.clientY); + } + + var scale = getScale(container), + offset = scale.boundingClientRect; // left and top values are in page scale (like the event clientX/Y) + + return new Point( + // offset.left/top values are in page scale (like clientX/Y), + // whereas clientLeft/Top (border width) values are the original values (before CSS scale applies). + (e.clientX - offset.left) / scale.x - container.clientLeft, + (e.clientY - offset.top) / scale.y - container.clientTop + ); + } + + // Chrome on Win scrolls double the pixels as in other platforms (see #4538), + // and Firefox scrolls device pixels, not CSS pixels + var wheelPxFactor = + (win && chrome) ? 2 * window.devicePixelRatio : + gecko ? window.devicePixelRatio : 1; + + // @function getWheelDelta(ev: DOMEvent): Number + // Gets normalized wheel delta from a wheel DOM event, in vertical + // pixels scrolled (negative if scrolling down). + // Events from pointing devices without precise scrolling are mapped to + // a best guess of 60 pixels. + function getWheelDelta(e) { + return (edge) ? e.wheelDeltaY / 2 : // Don't trust window-geometry-based delta + (e.deltaY && e.deltaMode === 0) ? -e.deltaY / wheelPxFactor : // Pixels + (e.deltaY && e.deltaMode === 1) ? -e.deltaY * 20 : // Lines + (e.deltaY && e.deltaMode === 2) ? -e.deltaY * 60 : // Pages + (e.deltaX || e.deltaZ) ? 0 : // Skip horizontal/depth wheel events + e.wheelDelta ? (e.wheelDeltaY || e.wheelDelta) / 2 : // Legacy IE pixels + (e.detail && Math.abs(e.detail) < 32765) ? -e.detail * 20 : // Legacy Moz lines + e.detail ? e.detail / -32765 * 60 : // Legacy Moz pages + 0; + } + + var skipEvents = {}; + + function fakeStop(e) { + // fakes stopPropagation by setting a special event flag, checked/reset with skipped(e) + skipEvents[e.type] = true; + } + + function skipped(e) { + var events = skipEvents[e.type]; + // reset when checking, as it's only used in map container and propagates outside of the map + skipEvents[e.type] = false; + return events; + } + + // check if element really left/entered the event target (for mouseenter/mouseleave) + function isExternalTarget(el, e) { + + var related = e.relatedTarget; + + if (!related) { return true; } + + try { + while (related && (related !== el)) { + related = related.parentNode; + } + } catch (err) { + return false; + } + return (related !== el); + } + + var DomEvent = ({ + on: on, + off: off, + stopPropagation: stopPropagation, + disableScrollPropagation: disableScrollPropagation, + disableClickPropagation: disableClickPropagation, + preventDefault: preventDefault, + stop: stop, + getMousePosition: getMousePosition, + getWheelDelta: getWheelDelta, + fakeStop: fakeStop, + skipped: skipped, + isExternalTarget: isExternalTarget, + addListener: on, + removeListener: off + }); + + /* + * @class PosAnimation + * @aka L.PosAnimation + * @inherits Evented + * Used internally for panning animations, utilizing CSS3 Transitions for modern browsers and a timer fallback for IE6-9. + * + * @example + * ```js + * var fx = new L.PosAnimation(); + * fx.run(el, [300, 500], 0.5); + * ``` + * + * @constructor L.PosAnimation() + * Creates a `PosAnimation` object. + * + */ + + var PosAnimation = Evented.extend({ + + // @method run(el: HTMLElement, newPos: Point, duration?: Number, easeLinearity?: Number) + // Run an animation of a given element to a new position, optionally setting + // duration in seconds (`0.25` by default) and easing linearity factor (3rd + // argument of the [cubic bezier curve](http://cubic-bezier.com/#0,0,.5,1), + // `0.5` by default). + run: function (el, newPos, duration, easeLinearity) { + this.stop(); + + this._el = el; + this._inProgress = true; + this._duration = duration || 0.25; + this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2); + + this._startPos = getPosition(el); + this._offset = newPos.subtract(this._startPos); + this._startTime = +new Date(); + + // @event start: Event + // Fired when the animation starts + this.fire('start'); + + this._animate(); + }, + + // @method stop() + // Stops the animation (if currently running). + stop: function () { + if (!this._inProgress) { return; } + + this._step(true); + this._complete(); + }, + + _animate: function () { + // animation loop + this._animId = requestAnimFrame(this._animate, this); + this._step(); + }, + + _step: function (round) { + var elapsed = (+new Date()) - this._startTime, + duration = this._duration * 1000; + + if (elapsed < duration) { + this._runFrame(this._easeOut(elapsed / duration), round); + } else { + this._runFrame(1); + this._complete(); + } + }, + + _runFrame: function (progress, round) { + var pos = this._startPos.add(this._offset.multiplyBy(progress)); + if (round) { + pos._round(); + } + setPosition(this._el, pos); + + // @event step: Event + // Fired continuously during the animation. + this.fire('step'); + }, + + _complete: function () { + cancelAnimFrame(this._animId); + + this._inProgress = false; + // @event end: Event + // Fired when the animation ends. + this.fire('end'); + }, + + _easeOut: function (t) { + return 1 - Math.pow(1 - t, this._easeOutPower); + } + }); + + /* + * @class Map + * @aka L.Map + * @inherits Evented + * + * The central class of the API — it is used to create a map on a page and manipulate it. + * + * @example + * + * ```js + * // initialize the map on the "map" div with a given center and zoom + * var map = L.map('map', { + * center: [51.505, -0.09], + * zoom: 13 + * }); + * ``` + * + */ + + var Map = Evented.extend({ + + options: { + // @section Map State Options + // @option crs: CRS = L.CRS.EPSG3857 + // The [Coordinate Reference System](#crs) to use. Don't change this if you're not + // sure what it means. + crs: EPSG3857, + + // @option center: LatLng = undefined + // Initial geographic center of the map + center: undefined, + + // @option zoom: Number = undefined + // Initial map zoom level + zoom: undefined, + + // @option minZoom: Number = * + // Minimum zoom level of the map. + // If not specified and at least one `GridLayer` or `TileLayer` is in the map, + // the lowest of their `minZoom` options will be used instead. + minZoom: undefined, + + // @option maxZoom: Number = * + // Maximum zoom level of the map. + // If not specified and at least one `GridLayer` or `TileLayer` is in the map, + // the highest of their `maxZoom` options will be used instead. + maxZoom: undefined, + + // @option layers: Layer[] = [] + // Array of layers that will be added to the map initially + layers: [], + + // @option maxBounds: LatLngBounds = null + // When this option is set, the map restricts the view to the given + // geographical bounds, bouncing the user back if the user tries to pan + // outside the view. To set the restriction dynamically, use + // [`setMaxBounds`](#map-setmaxbounds) method. + maxBounds: undefined, + + // @option renderer: Renderer = * + // The default method for drawing vector layers on the map. `L.SVG` + // or `L.Canvas` by default depending on browser support. + renderer: undefined, + + + // @section Animation Options + // @option zoomAnimation: Boolean = true + // Whether the map zoom animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + zoomAnimation: true, + + // @option zoomAnimationThreshold: Number = 4 + // Won't animate zoom if the zoom difference exceeds this value. + zoomAnimationThreshold: 4, + + // @option fadeAnimation: Boolean = true + // Whether the tile fade animation is enabled. By default it's enabled + // in all browsers that support CSS3 Transitions except Android. + fadeAnimation: true, + + // @option markerZoomAnimation: Boolean = true + // Whether markers animate their zoom with the zoom animation, if disabled + // they will disappear for the length of the animation. By default it's + // enabled in all browsers that support CSS3 Transitions except Android. + markerZoomAnimation: true, + + // @option transform3DLimit: Number = 2^23 + // Defines the maximum size of a CSS translation transform. The default + // value should not be changed unless a web browser positions layers in + // the wrong place after doing a large `panBy`. + transform3DLimit: 8388608, // Precision limit of a 32-bit float + + // @section Interaction Options + // @option zoomSnap: Number = 1 + // Forces the map's zoom level to always be a multiple of this, particularly + // right after a [`fitBounds()`](#map-fitbounds) or a pinch-zoom. + // By default, the zoom level snaps to the nearest integer; lower values + // (e.g. `0.5` or `0.1`) allow for greater granularity. A value of `0` + // means the zoom level will not be snapped after `fitBounds` or a pinch-zoom. + zoomSnap: 1, + + // @option zoomDelta: Number = 1 + // Controls how much the map's zoom level will change after a + // [`zoomIn()`](#map-zoomin), [`zoomOut()`](#map-zoomout), pressing `+` + // or `-` on the keyboard, or using the [zoom controls](#control-zoom). + // Values smaller than `1` (e.g. `0.5`) allow for greater granularity. + zoomDelta: 1, + + // @option trackResize: Boolean = true + // Whether the map automatically handles browser window resize to update itself. + trackResize: true + }, + + initialize: function (id, options) { // (HTMLElement or String, Object) + options = setOptions(this, options); + + // Make sure to assign internal flags at the beginning, + // to avoid inconsistent state in some edge cases. + this._handlers = []; + this._layers = {}; + this._zoomBoundLayers = {}; + this._sizeChanged = true; + + this._initContainer(id); + this._initLayout(); + + // hack for https://github.com/Leaflet/Leaflet/issues/1980 + this._onResize = bind(this._onResize, this); + + this._initEvents(); + + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + + if (options.zoom !== undefined) { + this._zoom = this._limitZoom(options.zoom); + } + + if (options.center && options.zoom !== undefined) { + this.setView(toLatLng(options.center), options.zoom, {reset: true}); + } + + this.callInitHooks(); + + // don't animate on browsers without hardware-accelerated transitions or old Android/Opera + this._zoomAnimated = TRANSITION && any3d && !mobileOpera && + this.options.zoomAnimation; + + // zoom transitions run with the same duration for all layers, so if one of transitionend events + // happens after starting zoom animation (propagating to the map pane), we know that it ended globally + if (this._zoomAnimated) { + this._createAnimProxy(); + on(this._proxy, TRANSITION_END, this._catchTransitionEnd, this); + } + + this._addLayers(this.options.layers); + }, + + + // @section Methods for modifying map state + + // @method setView(center: LatLng, zoom: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) with the given + // animation options. + setView: function (center, zoom, options) { + + zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom); + center = this._limitCenter(toLatLng(center), zoom, this.options.maxBounds); + options = options || {}; + + this._stop(); + + if (this._loaded && !options.reset && options !== true) { + + if (options.animate !== undefined) { + options.zoom = extend({animate: options.animate}, options.zoom); + options.pan = extend({animate: options.animate, duration: options.duration}, options.pan); + } + + // try animating pan or zoom + var moved = (this._zoom !== zoom) ? + this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) : + this._tryAnimatedPan(center, options.pan); + + if (moved) { + // prevent resize handler call, the view will refresh after animation anyway + clearTimeout(this._sizeTimer); + return this; + } + } + + // animation didn't start, just reset the map view + this._resetView(center, zoom); + + return this; + }, + + // @method setZoom(zoom: Number, options?: Zoom/pan options): this + // Sets the zoom of the map. + setZoom: function (zoom, options) { + if (!this._loaded) { + this._zoom = zoom; + return this; + } + return this.setView(this.getCenter(), zoom, {zoom: options}); + }, + + // @method zoomIn(delta?: Number, options?: Zoom options): this + // Increases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomIn: function (delta, options) { + delta = delta || (any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom + delta, options); + }, + + // @method zoomOut(delta?: Number, options?: Zoom options): this + // Decreases the zoom of the map by `delta` ([`zoomDelta`](#map-zoomdelta) by default). + zoomOut: function (delta, options) { + delta = delta || (any3d ? this.options.zoomDelta : 1); + return this.setZoom(this._zoom - delta, options); + }, + + // @method setZoomAround(latlng: LatLng, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified geographical point on the map + // stationary (e.g. used internally for scroll zoom and double-click zoom). + // @alternative + // @method setZoomAround(offset: Point, zoom: Number, options: Zoom options): this + // Zooms the map while keeping a specified pixel on the map (relative to the top-left corner) stationary. + setZoomAround: function (latlng, zoom, options) { + var scale = this.getZoomScale(zoom), + viewHalf = this.getSize().divideBy(2), + containerPoint = latlng instanceof Point ? latlng : this.latLngToContainerPoint(latlng), + + centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale), + newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset)); + + return this.setView(newCenter, zoom, {zoom: options}); + }, + + _getBoundsCenterZoom: function (bounds, options) { + + options = options || {}; + bounds = bounds.getBounds ? bounds.getBounds() : toLatLngBounds(bounds); + + var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]), + + zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR)); + + zoom = (typeof options.maxZoom === 'number') ? Math.min(options.maxZoom, zoom) : zoom; + + if (zoom === Infinity) { + return { + center: bounds.getCenter(), + zoom: zoom + }; + } + + var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2), + + swPoint = this.project(bounds.getSouthWest(), zoom), + nePoint = this.project(bounds.getNorthEast(), zoom), + center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom); + + return { + center: center, + zoom: zoom + }; + }, + + // @method fitBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets a map view that contains the given geographical bounds with the + // maximum zoom level possible. + fitBounds: function (bounds, options) { + + bounds = toLatLngBounds(bounds); + + if (!bounds.isValid()) { + throw new Error('Bounds are not valid.'); + } + + var target = this._getBoundsCenterZoom(bounds, options); + return this.setView(target.center, target.zoom, options); + }, + + // @method fitWorld(options?: fitBounds options): this + // Sets a map view that mostly contains the whole world with the maximum + // zoom level possible. + fitWorld: function (options) { + return this.fitBounds([[-90, -180], [90, 180]], options); + }, + + // @method panTo(latlng: LatLng, options?: Pan options): this + // Pans the map to a given center. + panTo: function (center, options) { // (LatLng) + return this.setView(center, this._zoom, {pan: options}); + }, + + // @method panBy(offset: Point, options?: Pan options): this + // Pans the map by a given number of pixels (animated). + panBy: function (offset, options) { + offset = toPoint(offset).round(); + options = options || {}; + + if (!offset.x && !offset.y) { + return this.fire('moveend'); + } + // If we pan too far, Chrome gets issues with tiles + // and makes them disappear or appear in the wrong place (slightly offset) #2602 + if (options.animate !== true && !this.getSize().contains(offset)) { + this._resetView(this.unproject(this.project(this.getCenter()).add(offset)), this.getZoom()); + return this; + } + + if (!this._panAnim) { + this._panAnim = new PosAnimation(); + + this._panAnim.on({ + 'step': this._onPanTransitionStep, + 'end': this._onPanTransitionEnd + }, this); + } + + // don't fire movestart if animating inertia + if (!options.noMoveStart) { + this.fire('movestart'); + } + + // animate pan unless animate: false specified + if (options.animate !== false) { + addClass(this._mapPane, 'leaflet-pan-anim'); + + var newPos = this._getMapPanePos().subtract(offset).round(); + this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity); + } else { + this._rawPanBy(offset); + this.fire('move').fire('moveend'); + } + + return this; + }, + + // @method flyTo(latlng: LatLng, zoom?: Number, options?: Zoom/pan options): this + // Sets the view of the map (geographical center and zoom) performing a smooth + // pan-zoom animation. + flyTo: function (targetCenter, targetZoom, options) { + + options = options || {}; + if (options.animate === false || !any3d) { + return this.setView(targetCenter, targetZoom, options); + } + + this._stop(); + + var from = this.project(this.getCenter()), + to = this.project(targetCenter), + size = this.getSize(), + startZoom = this._zoom; + + targetCenter = toLatLng(targetCenter); + targetZoom = targetZoom === undefined ? startZoom : targetZoom; + + var w0 = Math.max(size.x, size.y), + w1 = w0 * this.getZoomScale(startZoom, targetZoom), + u1 = (to.distanceTo(from)) || 1, + rho = 1.42, + rho2 = rho * rho; + + function r(i) { + var s1 = i ? -1 : 1, + s2 = i ? w1 : w0, + t1 = w1 * w1 - w0 * w0 + s1 * rho2 * rho2 * u1 * u1, + b1 = 2 * s2 * rho2 * u1, + b = t1 / b1, + sq = Math.sqrt(b * b + 1) - b; + + // workaround for floating point precision bug when sq = 0, log = -Infinite, + // thus triggering an infinite loop in flyTo + var log = sq < 0.000000001 ? -18 : Math.log(sq); + + return log; + } + + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + var r0 = r(0); + + function w(s) { return w0 * (cosh(r0) / cosh(r0 + rho * s)); } + function u(s) { return w0 * (cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2; } + + function easeOut(t) { return 1 - Math.pow(1 - t, 1.5); } + + var start = Date.now(), + S = (r(1) - r0) / rho, + duration = options.duration ? 1000 * options.duration : 1000 * S * 0.8; + + function frame() { + var t = (Date.now() - start) / duration, + s = easeOut(t) * S; + + if (t <= 1) { + this._flyToFrame = requestAnimFrame(frame, this); + + this._move( + this.unproject(from.add(to.subtract(from).multiplyBy(u(s) / u1)), startZoom), + this.getScaleZoom(w0 / w(s), startZoom), + {flyTo: true}); + + } else { + this + ._move(targetCenter, targetZoom) + ._moveEnd(true); + } + } + + this._moveStart(true, options.noMoveStart); + + frame.call(this); + return this; + }, + + // @method flyToBounds(bounds: LatLngBounds, options?: fitBounds options): this + // Sets the view of the map with a smooth animation like [`flyTo`](#map-flyto), + // but takes a bounds parameter like [`fitBounds`](#map-fitbounds). + flyToBounds: function (bounds, options) { + var target = this._getBoundsCenterZoom(bounds, options); + return this.flyTo(target.center, target.zoom, options); + }, + + // @method setMaxBounds(bounds: LatLngBounds): this + // Restricts the map view to the given bounds (see the [maxBounds](#map-maxbounds) option). + setMaxBounds: function (bounds) { + bounds = toLatLngBounds(bounds); + + if (!bounds.isValid()) { + this.options.maxBounds = null; + return this.off('moveend', this._panInsideMaxBounds); + } else if (this.options.maxBounds) { + this.off('moveend', this._panInsideMaxBounds); + } + + this.options.maxBounds = bounds; + + if (this._loaded) { + this._panInsideMaxBounds(); + } + + return this.on('moveend', this._panInsideMaxBounds); + }, + + // @method setMinZoom(zoom: Number): this + // Sets the lower limit for the available zoom levels (see the [minZoom](#map-minzoom) option). + setMinZoom: function (zoom) { + var oldZoom = this.options.minZoom; + this.options.minZoom = zoom; + + if (this._loaded && oldZoom !== zoom) { + this.fire('zoomlevelschange'); + + if (this.getZoom() < this.options.minZoom) { + return this.setZoom(zoom); + } + } + + return this; + }, + + // @method setMaxZoom(zoom: Number): this + // Sets the upper limit for the available zoom levels (see the [maxZoom](#map-maxzoom) option). + setMaxZoom: function (zoom) { + var oldZoom = this.options.maxZoom; + this.options.maxZoom = zoom; + + if (this._loaded && oldZoom !== zoom) { + this.fire('zoomlevelschange'); + + if (this.getZoom() > this.options.maxZoom) { + return this.setZoom(zoom); + } + } + + return this; + }, + + // @method panInsideBounds(bounds: LatLngBounds, options?: Pan options): this + // Pans the map to the closest view that would lie inside the given bounds (if it's not already), controlling the animation using the options specific, if any. + panInsideBounds: function (bounds, options) { + this._enforcingBounds = true; + var center = this.getCenter(), + newCenter = this._limitCenter(center, this._zoom, toLatLngBounds(bounds)); + + if (!center.equals(newCenter)) { + this.panTo(newCenter, options); + } + + this._enforcingBounds = false; + return this; + }, + + // @method panInside(latlng: LatLng, options?: options): this + // Pans the map the minimum amount to make the `latlng` visible. Use + // `padding`, `paddingTopLeft` and `paddingTopRight` options to fit + // the display to more restricted bounds, like [`fitBounds`](#map-fitbounds). + // If `latlng` is already within the (optionally padded) display bounds, + // the map will not be panned. + panInside: function (latlng, options) { + options = options || {}; + + var paddingTL = toPoint(options.paddingTopLeft || options.padding || [0, 0]), + paddingBR = toPoint(options.paddingBottomRight || options.padding || [0, 0]), + center = this.getCenter(), + pixelCenter = this.project(center), + pixelPoint = this.project(latlng), + pixelBounds = this.getPixelBounds(), + halfPixelBounds = pixelBounds.getSize().divideBy(2), + paddedBounds = toBounds([pixelBounds.min.add(paddingTL), pixelBounds.max.subtract(paddingBR)]); + + if (!paddedBounds.contains(pixelPoint)) { + this._enforcingBounds = true; + var diff = pixelCenter.subtract(pixelPoint), + newCenter = toPoint(pixelPoint.x + diff.x, pixelPoint.y + diff.y); + + if (pixelPoint.x < paddedBounds.min.x || pixelPoint.x > paddedBounds.max.x) { + newCenter.x = pixelCenter.x - diff.x; + if (diff.x > 0) { + newCenter.x += halfPixelBounds.x - paddingTL.x; + } else { + newCenter.x -= halfPixelBounds.x - paddingBR.x; + } + } + if (pixelPoint.y < paddedBounds.min.y || pixelPoint.y > paddedBounds.max.y) { + newCenter.y = pixelCenter.y - diff.y; + if (diff.y > 0) { + newCenter.y += halfPixelBounds.y - paddingTL.y; + } else { + newCenter.y -= halfPixelBounds.y - paddingBR.y; + } + } + this.panTo(this.unproject(newCenter), options); + this._enforcingBounds = false; + } + return this; + }, + + // @method invalidateSize(options: Zoom/pan options): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. If `options.pan` is `false`, panning will not occur. + // If `options.debounceMoveend` is `true`, it will delay `moveend` event so + // that it doesn't happen often even if the method is called many + // times in a row. + + // @alternative + // @method invalidateSize(animate: Boolean): this + // Checks if the map container size changed and updates the map if so — + // call it after you've changed the map size dynamically, also animating + // pan by default. + invalidateSize: function (options) { + if (!this._loaded) { return this; } + + options = extend({ + animate: false, + pan: true + }, options === true ? {animate: true} : options); + + var oldSize = this.getSize(); + this._sizeChanged = true; + this._lastCenter = null; + + var newSize = this.getSize(), + oldCenter = oldSize.divideBy(2).round(), + newCenter = newSize.divideBy(2).round(), + offset = oldCenter.subtract(newCenter); + + if (!offset.x && !offset.y) { return this; } + + if (options.animate && options.pan) { + this.panBy(offset); + + } else { + if (options.pan) { + this._rawPanBy(offset); + } + + this.fire('move'); + + if (options.debounceMoveend) { + clearTimeout(this._sizeTimer); + this._sizeTimer = setTimeout(bind(this.fire, this, 'moveend'), 200); + } else { + this.fire('moveend'); + } + } + + // @section Map state change events + // @event resize: ResizeEvent + // Fired when the map is resized. + return this.fire('resize', { + oldSize: oldSize, + newSize: newSize + }); + }, + + // @section Methods for modifying map state + // @method stop(): this + // Stops the currently running `panTo` or `flyTo` animation, if any. + stop: function () { + this.setZoom(this._limitZoom(this._zoom)); + if (!this.options.zoomSnap) { + this.fire('viewreset'); + } + return this._stop(); + }, + + // @section Geolocation methods + // @method locate(options?: Locate options): this + // Tries to locate the user using the Geolocation API, firing a [`locationfound`](#map-locationfound) + // event with location data on success or a [`locationerror`](#map-locationerror) event on failure, + // and optionally sets the map view to the user's location with respect to + // detection accuracy (or to the world view if geolocation failed). + // Note that, if your page doesn't use HTTPS, this method will fail in + // modern browsers ([Chrome 50 and newer](https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins)) + // See `Locate options` for more details. + locate: function (options) { + + options = this._locateOptions = extend({ + timeout: 10000, + watch: false + // setView: false + // maxZoom: + // maximumAge: 0 + // enableHighAccuracy: false + }, options); + + if (!('geolocation' in navigator)) { + this._handleGeolocationError({ + code: 0, + message: 'Geolocation not supported.' + }); + return this; + } + + var onResponse = bind(this._handleGeolocationResponse, this), + onError = bind(this._handleGeolocationError, this); + + if (options.watch) { + this._locationWatchId = + navigator.geolocation.watchPosition(onResponse, onError, options); + } else { + navigator.geolocation.getCurrentPosition(onResponse, onError, options); + } + return this; + }, + + // @method stopLocate(): this + // Stops watching location previously initiated by `map.locate({watch: true})` + // and aborts resetting the map view if map.locate was called with + // `{setView: true}`. + stopLocate: function () { + if (navigator.geolocation && navigator.geolocation.clearWatch) { + navigator.geolocation.clearWatch(this._locationWatchId); + } + if (this._locateOptions) { + this._locateOptions.setView = false; + } + return this; + }, + + _handleGeolocationError: function (error) { + var c = error.code, + message = error.message || + (c === 1 ? 'permission denied' : + (c === 2 ? 'position unavailable' : 'timeout')); + + if (this._locateOptions.setView && !this._loaded) { + this.fitWorld(); + } + + // @section Location events + // @event locationerror: ErrorEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) failed. + this.fire('locationerror', { + code: c, + message: 'Geolocation error: ' + message + '.' + }); + }, + + _handleGeolocationResponse: function (pos) { + var lat = pos.coords.latitude, + lng = pos.coords.longitude, + latlng = new LatLng(lat, lng), + bounds = latlng.toBounds(pos.coords.accuracy * 2), + options = this._locateOptions; + + if (options.setView) { + var zoom = this.getBoundsZoom(bounds); + this.setView(latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom); + } + + var data = { + latlng: latlng, + bounds: bounds, + timestamp: pos.timestamp + }; + + for (var i in pos.coords) { + if (typeof pos.coords[i] === 'number') { + data[i] = pos.coords[i]; + } + } + + // @event locationfound: LocationEvent + // Fired when geolocation (using the [`locate`](#map-locate) method) + // went successfully. + this.fire('locationfound', data); + }, + + // TODO Appropriate docs section? + // @section Other Methods + // @method addHandler(name: String, HandlerClass: Function): this + // Adds a new `Handler` to the map, given its name and constructor function. + addHandler: function (name, HandlerClass) { + if (!HandlerClass) { return this; } + + var handler = this[name] = new HandlerClass(this); + + this._handlers.push(handler); + + if (this.options[name]) { + handler.enable(); + } + + return this; + }, + + // @method remove(): this + // Destroys the map and clears all related event listeners. + remove: function () { + + this._initEvents(true); + this.off('moveend', this._panInsideMaxBounds); + + if (this._containerId !== this._container._leaflet_id) { + throw new Error('Map container is being reused by another instance'); + } + + try { + // throws error in IE6-8 + delete this._container._leaflet_id; + delete this._containerId; + } catch (e) { + /*eslint-disable */ + this._container._leaflet_id = undefined; + /* eslint-enable */ + this._containerId = undefined; + } + + if (this._locationWatchId !== undefined) { + this.stopLocate(); + } + + this._stop(); + + remove(this._mapPane); + + if (this._clearControlPos) { + this._clearControlPos(); + } + if (this._resizeRequest) { + cancelAnimFrame(this._resizeRequest); + this._resizeRequest = null; + } + + this._clearHandlers(); + + if (this._loaded) { + // @section Map state change events + // @event unload: Event + // Fired when the map is destroyed with [remove](#map-remove) method. + this.fire('unload'); + } + + var i; + for (i in this._layers) { + this._layers[i].remove(); + } + for (i in this._panes) { + remove(this._panes[i]); + } + + this._layers = []; + this._panes = []; + delete this._mapPane; + delete this._renderer; + + return this; + }, + + // @section Other Methods + // @method createPane(name: String, container?: HTMLElement): HTMLElement + // Creates a new [map pane](#map-pane) with the given name if it doesn't exist already, + // then returns it. The pane is created as a child of `container`, or + // as a child of the main map pane if not set. + createPane: function (name, container) { + var className = 'leaflet-pane' + (name ? ' leaflet-' + name.replace('Pane', '') + '-pane' : ''), + pane = create$1('div', className, container || this._mapPane); + + if (name) { + this._panes[name] = pane; + } + return pane; + }, + + // @section Methods for Getting Map State + + // @method getCenter(): LatLng + // Returns the geographical center of the map view + getCenter: function () { + this._checkIfLoaded(); + + if (this._lastCenter && !this._moved()) { + return this._lastCenter; + } + return this.layerPointToLatLng(this._getCenterLayerPoint()); + }, + + // @method getZoom(): Number + // Returns the current zoom level of the map view + getZoom: function () { + return this._zoom; + }, + + // @method getBounds(): LatLngBounds + // Returns the geographical bounds visible in the current map view + getBounds: function () { + var bounds = this.getPixelBounds(), + sw = this.unproject(bounds.getBottomLeft()), + ne = this.unproject(bounds.getTopRight()); + + return new LatLngBounds(sw, ne); + }, + + // @method getMinZoom(): Number + // Returns the minimum zoom level of the map (if set in the `minZoom` option of the map or of any layers), or `0` by default. + getMinZoom: function () { + return this.options.minZoom === undefined ? this._layersMinZoom || 0 : this.options.minZoom; + }, + + // @method getMaxZoom(): Number + // Returns the maximum zoom level of the map (if set in the `maxZoom` option of the map or of any layers). + getMaxZoom: function () { + return this.options.maxZoom === undefined ? + (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) : + this.options.maxZoom; + }, + + // @method getBoundsZoom(bounds: LatLngBounds, inside?: Boolean, padding?: Point): Number + // Returns the maximum zoom level on which the given bounds fit to the map + // view in its entirety. If `inside` (optional) is set to `true`, the method + // instead returns the minimum zoom level on which the map view fits into + // the given bounds in its entirety. + getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number + bounds = toLatLngBounds(bounds); + padding = toPoint(padding || [0, 0]); + + var zoom = this.getZoom() || 0, + min = this.getMinZoom(), + max = this.getMaxZoom(), + nw = bounds.getNorthWest(), + se = bounds.getSouthEast(), + size = this.getSize().subtract(padding), + boundsSize = toBounds(this.project(se, zoom), this.project(nw, zoom)).getSize(), + snap = any3d ? this.options.zoomSnap : 1, + scalex = size.x / boundsSize.x, + scaley = size.y / boundsSize.y, + scale = inside ? Math.max(scalex, scaley) : Math.min(scalex, scaley); + + zoom = this.getScaleZoom(scale, zoom); + + if (snap) { + zoom = Math.round(zoom / (snap / 100)) * (snap / 100); // don't jump if within 1% of a snap level + zoom = inside ? Math.ceil(zoom / snap) * snap : Math.floor(zoom / snap) * snap; + } + + return Math.max(min, Math.min(max, zoom)); + }, + + // @method getSize(): Point + // Returns the current size of the map container (in pixels). + getSize: function () { + if (!this._size || this._sizeChanged) { + this._size = new Point( + this._container.clientWidth || 0, + this._container.clientHeight || 0); + + this._sizeChanged = false; + } + return this._size.clone(); + }, + + // @method getPixelBounds(): Bounds + // Returns the bounds of the current map view in projected pixel + // coordinates (sometimes useful in layer and overlay implementations). + getPixelBounds: function (center, zoom) { + var topLeftPoint = this._getTopLeftPoint(center, zoom); + return new Bounds(topLeftPoint, topLeftPoint.add(this.getSize())); + }, + + // TODO: Check semantics - isn't the pixel origin the 0,0 coord relative to + // the map pane? "left point of the map layer" can be confusing, specially + // since there can be negative offsets. + // @method getPixelOrigin(): Point + // Returns the projected pixel coordinates of the top left point of + // the map layer (useful in custom layer and overlay implementations). + getPixelOrigin: function () { + this._checkIfLoaded(); + return this._pixelOrigin; + }, + + // @method getPixelWorldBounds(zoom?: Number): Bounds + // Returns the world's bounds in pixel coordinates for zoom level `zoom`. + // If `zoom` is omitted, the map's current zoom level is used. + getPixelWorldBounds: function (zoom) { + return this.options.crs.getProjectedBounds(zoom === undefined ? this.getZoom() : zoom); + }, + + // @section Other Methods + + // @method getPane(pane: String|HTMLElement): HTMLElement + // Returns a [map pane](#map-pane), given its name or its HTML element (its identity). + getPane: function (pane) { + return typeof pane === 'string' ? this._panes[pane] : pane; + }, + + // @method getPanes(): Object + // Returns a plain object containing the names of all [panes](#map-pane) as keys and + // the panes as values. + getPanes: function () { + return this._panes; + }, + + // @method getContainer: HTMLElement + // Returns the HTML element that contains the map. + getContainer: function () { + return this._container; + }, + + + // @section Conversion Methods + + // @method getZoomScale(toZoom: Number, fromZoom: Number): Number + // Returns the scale factor to be applied to a map transition from zoom level + // `fromZoom` to `toZoom`. Used internally to help with zoom animations. + getZoomScale: function (toZoom, fromZoom) { + // TODO replace with universal implementation after refactoring projections + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + return crs.scale(toZoom) / crs.scale(fromZoom); + }, + + // @method getScaleZoom(scale: Number, fromZoom: Number): Number + // Returns the zoom level that the map would end up at, if it is at `fromZoom` + // level and everything is scaled by a factor of `scale`. Inverse of + // [`getZoomScale`](#map-getZoomScale). + getScaleZoom: function (scale, fromZoom) { + var crs = this.options.crs; + fromZoom = fromZoom === undefined ? this._zoom : fromZoom; + var zoom = crs.zoom(scale * crs.scale(fromZoom)); + return isNaN(zoom) ? Infinity : zoom; + }, + + // @method project(latlng: LatLng, zoom: Number): Point + // Projects a geographical coordinate `LatLng` according to the projection + // of the map's CRS, then scales it according to `zoom` and the CRS's + // `Transformation`. The result is pixel coordinate relative to + // the CRS origin. + project: function (latlng, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.latLngToPoint(toLatLng(latlng), zoom); + }, + + // @method unproject(point: Point, zoom: Number): LatLng + // Inverse of [`project`](#map-project). + unproject: function (point, zoom) { + zoom = zoom === undefined ? this._zoom : zoom; + return this.options.crs.pointToLatLng(toPoint(point), zoom); + }, + + // @method layerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding geographical coordinate (for the current zoom level). + layerPointToLatLng: function (point) { + var projectedPoint = toPoint(point).add(this.getPixelOrigin()); + return this.unproject(projectedPoint); + }, + + // @method latLngToLayerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the [origin pixel](#map-getpixelorigin). + latLngToLayerPoint: function (latlng) { + var projectedPoint = this.project(toLatLng(latlng))._round(); + return projectedPoint._subtract(this.getPixelOrigin()); + }, + + // @method wrapLatLng(latlng: LatLng): LatLng + // Returns a `LatLng` where `lat` and `lng` has been wrapped according to the + // map's CRS's `wrapLat` and `wrapLng` properties, if they are outside the + // CRS's bounds. + // By default this means longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees. + wrapLatLng: function (latlng) { + return this.options.crs.wrapLatLng(toLatLng(latlng)); + }, + + // @method wrapLatLngBounds(bounds: LatLngBounds): LatLngBounds + // Returns a `LatLngBounds` with the same size as the given one, ensuring that + // its center is within the CRS's bounds. + // By default this means the center longitude is wrapped around the dateline so its + // value is between -180 and +180 degrees, and the majority of the bounds + // overlaps the CRS's bounds. + wrapLatLngBounds: function (latlng) { + return this.options.crs.wrapLatLngBounds(toLatLngBounds(latlng)); + }, + + // @method distance(latlng1: LatLng, latlng2: LatLng): Number + // Returns the distance between two geographical coordinates according to + // the map's CRS. By default this measures distance in meters. + distance: function (latlng1, latlng2) { + return this.options.crs.distance(toLatLng(latlng1), toLatLng(latlng2)); + }, + + // @method containerPointToLayerPoint(point: Point): Point + // Given a pixel coordinate relative to the map container, returns the corresponding + // pixel coordinate relative to the [origin pixel](#map-getpixelorigin). + containerPointToLayerPoint: function (point) { // (Point) + return toPoint(point).subtract(this._getMapPanePos()); + }, + + // @method layerPointToContainerPoint(point: Point): Point + // Given a pixel coordinate relative to the [origin pixel](#map-getpixelorigin), + // returns the corresponding pixel coordinate relative to the map container. + layerPointToContainerPoint: function (point) { // (Point) + return toPoint(point).add(this._getMapPanePos()); + }, + + // @method containerPointToLatLng(point: Point): LatLng + // Given a pixel coordinate relative to the map container, returns + // the corresponding geographical coordinate (for the current zoom level). + containerPointToLatLng: function (point) { + var layerPoint = this.containerPointToLayerPoint(toPoint(point)); + return this.layerPointToLatLng(layerPoint); + }, + + // @method latLngToContainerPoint(latlng: LatLng): Point + // Given a geographical coordinate, returns the corresponding pixel coordinate + // relative to the map container. + latLngToContainerPoint: function (latlng) { + return this.layerPointToContainerPoint(this.latLngToLayerPoint(toLatLng(latlng))); + }, + + // @method mouseEventToContainerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to the + // map container where the event took place. + mouseEventToContainerPoint: function (e) { + return getMousePosition(e, this._container); + }, + + // @method mouseEventToLayerPoint(ev: MouseEvent): Point + // Given a MouseEvent object, returns the pixel coordinate relative to + // the [origin pixel](#map-getpixelorigin) where the event took place. + mouseEventToLayerPoint: function (e) { + return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e)); + }, + + // @method mouseEventToLatLng(ev: MouseEvent): LatLng + // Given a MouseEvent object, returns geographical coordinate where the + // event took place. + mouseEventToLatLng: function (e) { // (MouseEvent) + return this.layerPointToLatLng(this.mouseEventToLayerPoint(e)); + }, + + + // map initialization methods + + _initContainer: function (id) { + var container = this._container = get(id); + + if (!container) { + throw new Error('Map container not found.'); + } else if (container._leaflet_id) { + throw new Error('Map container is already initialized.'); + } + + on(container, 'scroll', this._onScroll, this); + this._containerId = stamp(container); + }, + + _initLayout: function () { + var container = this._container; + + this._fadeAnimated = this.options.fadeAnimation && any3d; + + addClass(container, 'leaflet-container' + + (touch ? ' leaflet-touch' : '') + + (retina ? ' leaflet-retina' : '') + + (ielt9 ? ' leaflet-oldie' : '') + + (safari ? ' leaflet-safari' : '') + + (this._fadeAnimated ? ' leaflet-fade-anim' : '')); + + var position = getStyle(container, 'position'); + + if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') { + container.style.position = 'relative'; + } + + this._initPanes(); + + if (this._initControlPos) { + this._initControlPos(); + } + }, + + _initPanes: function () { + var panes = this._panes = {}; + this._paneRenderers = {}; + + // @section + // + // Panes are DOM elements used to control the ordering of layers on the map. You + // can access panes with [`map.getPane`](#map-getpane) or + // [`map.getPanes`](#map-getpanes) methods. New panes can be created with the + // [`map.createPane`](#map-createpane) method. + // + // Every map has the following default panes that differ only in zIndex. + // + // @pane mapPane: HTMLElement = 'auto' + // Pane that contains all other map panes + + this._mapPane = this.createPane('mapPane', this._container); + setPosition(this._mapPane, new Point(0, 0)); + + // @pane tilePane: HTMLElement = 200 + // Pane for `GridLayer`s and `TileLayer`s + this.createPane('tilePane'); + // @pane overlayPane: HTMLElement = 400 + // Pane for overlay shadows (e.g. `Marker` shadows) + this.createPane('shadowPane'); + // @pane shadowPane: HTMLElement = 500 + // Pane for vectors (`Path`s, like `Polyline`s and `Polygon`s), `ImageOverlay`s and `VideoOverlay`s + this.createPane('overlayPane'); + // @pane markerPane: HTMLElement = 600 + // Pane for `Icon`s of `Marker`s + this.createPane('markerPane'); + // @pane tooltipPane: HTMLElement = 650 + // Pane for `Tooltip`s. + this.createPane('tooltipPane'); + // @pane popupPane: HTMLElement = 700 + // Pane for `Popup`s. + this.createPane('popupPane'); + + if (!this.options.markerZoomAnimation) { + addClass(panes.markerPane, 'leaflet-zoom-hide'); + addClass(panes.shadowPane, 'leaflet-zoom-hide'); + } + }, + + + // private methods that modify map state + + // @section Map state change events + _resetView: function (center, zoom) { + setPosition(this._mapPane, new Point(0, 0)); + + var loading = !this._loaded; + this._loaded = true; + zoom = this._limitZoom(zoom); + + this.fire('viewprereset'); + + var zoomChanged = this._zoom !== zoom; + this + ._moveStart(zoomChanged, false) + ._move(center, zoom) + ._moveEnd(zoomChanged); + + // @event viewreset: Event + // Fired when the map needs to redraw its content (this usually happens + // on map zoom or load). Very useful for creating custom overlays. + this.fire('viewreset'); + + // @event load: Event + // Fired when the map is initialized (when its center and zoom are set + // for the first time). + if (loading) { + this.fire('load'); + } + }, + + _moveStart: function (zoomChanged, noMoveStart) { + // @event zoomstart: Event + // Fired when the map zoom is about to change (e.g. before zoom animation). + // @event movestart: Event + // Fired when the view of the map starts changing (e.g. user starts dragging the map). + if (zoomChanged) { + this.fire('zoomstart'); + } + if (!noMoveStart) { + this.fire('movestart'); + } + return this; + }, + + _move: function (center, zoom, data) { + if (zoom === undefined) { + zoom = this._zoom; + } + var zoomChanged = this._zoom !== zoom; + + this._zoom = zoom; + this._lastCenter = center; + this._pixelOrigin = this._getNewPixelOrigin(center); + + // @event zoom: Event + // Fired repeatedly during any change in zoom level, including zoom + // and fly animations. + if (zoomChanged || (data && data.pinch)) { // Always fire 'zoom' if pinching because #3530 + this.fire('zoom', data); + } + + // @event move: Event + // Fired repeatedly during any movement of the map, including pan and + // fly animations. + return this.fire('move', data); + }, + + _moveEnd: function (zoomChanged) { + // @event zoomend: Event + // Fired when the map has changed, after any animations. + if (zoomChanged) { + this.fire('zoomend'); + } + + // @event moveend: Event + // Fired when the center of the map stops changing (e.g. user stopped + // dragging the map). + return this.fire('moveend'); + }, + + _stop: function () { + cancelAnimFrame(this._flyToFrame); + if (this._panAnim) { + this._panAnim.stop(); + } + return this; + }, + + _rawPanBy: function (offset) { + setPosition(this._mapPane, this._getMapPanePos().subtract(offset)); + }, + + _getZoomSpan: function () { + return this.getMaxZoom() - this.getMinZoom(); + }, + + _panInsideMaxBounds: function () { + if (!this._enforcingBounds) { + this.panInsideBounds(this.options.maxBounds); + } + }, + + _checkIfLoaded: function () { + if (!this._loaded) { + throw new Error('Set map center and zoom first.'); + } + }, + + // DOM event handling + + // @section Interaction events + _initEvents: function (remove$$1) { + this._targets = {}; + this._targets[stamp(this._container)] = this; + + var onOff = remove$$1 ? off : on; + + // @event click: MouseEvent + // Fired when the user clicks (or taps) the map. + // @event dblclick: MouseEvent + // Fired when the user double-clicks (or double-taps) the map. + // @event mousedown: MouseEvent + // Fired when the user pushes the mouse button on the map. + // @event mouseup: MouseEvent + // Fired when the user releases the mouse button on the map. + // @event mouseover: MouseEvent + // Fired when the mouse enters the map. + // @event mouseout: MouseEvent + // Fired when the mouse leaves the map. + // @event mousemove: MouseEvent + // Fired while the mouse moves over the map. + // @event contextmenu: MouseEvent + // Fired when the user pushes the right mouse button on the map, prevents + // default browser context menu from showing if there are listeners on + // this event. Also fired on mobile when the user holds a single touch + // for a second (also called long press). + // @event keypress: KeyboardEvent + // Fired when the user presses a key from the keyboard that produces a character value while the map is focused. + // @event keydown: KeyboardEvent + // Fired when the user presses a key from the keyboard while the map is focused. Unlike the `keypress` event, + // the `keydown` event is fired for keys that produce a character value and for keys + // that do not produce a character value. + // @event keyup: KeyboardEvent + // Fired when the user releases a key from the keyboard while the map is focused. + onOff(this._container, 'click dblclick mousedown mouseup ' + + 'mouseover mouseout mousemove contextmenu keypress keydown keyup', this._handleDOMEvent, this); + + if (this.options.trackResize) { + onOff(window, 'resize', this._onResize, this); + } + + if (any3d && this.options.transform3DLimit) { + (remove$$1 ? this.off : this.on).call(this, 'moveend', this._onMoveEnd); + } + }, + + _onResize: function () { + cancelAnimFrame(this._resizeRequest); + this._resizeRequest = requestAnimFrame( + function () { this.invalidateSize({debounceMoveend: true}); }, this); + }, + + _onScroll: function () { + this._container.scrollTop = 0; + this._container.scrollLeft = 0; + }, + + _onMoveEnd: function () { + var pos = this._getMapPanePos(); + if (Math.max(Math.abs(pos.x), Math.abs(pos.y)) >= this.options.transform3DLimit) { + // https://bugzilla.mozilla.org/show_bug.cgi?id=1203873 but Webkit also have + // a pixel offset on very high values, see: http://jsfiddle.net/dg6r5hhb/ + this._resetView(this.getCenter(), this.getZoom()); + } + }, + + _findEventTargets: function (e, type) { + var targets = [], + target, + isHover = type === 'mouseout' || type === 'mouseover', + src = e.target || e.srcElement, + dragging = false; + + while (src) { + target = this._targets[stamp(src)]; + if (target && (type === 'click' || type === 'preclick') && !e._simulated && this._draggableMoved(target)) { + // Prevent firing click after you just dragged an object. + dragging = true; + break; + } + if (target && target.listens(type, true)) { + if (isHover && !isExternalTarget(src, e)) { break; } + targets.push(target); + if (isHover) { break; } + } + if (src === this._container) { break; } + src = src.parentNode; + } + if (!targets.length && !dragging && !isHover && isExternalTarget(src, e)) { + targets = [this]; + } + return targets; + }, + + _handleDOMEvent: function (e) { + if (!this._loaded || skipped(e)) { return; } + + var type = e.type; + + if (type === 'mousedown' || type === 'keypress' || type === 'keyup' || type === 'keydown') { + // prevents outline when clicking on keyboard-focusable element + preventOutline(e.target || e.srcElement); + } + + this._fireDOMEvent(e, type); + }, + + _mouseEvents: ['click', 'dblclick', 'mouseover', 'mouseout', 'contextmenu'], + + _fireDOMEvent: function (e, type, targets) { + + if (e.type === 'click') { + // Fire a synthetic 'preclick' event which propagates up (mainly for closing popups). + // @event preclick: MouseEvent + // Fired before mouse click on the map (sometimes useful when you + // want something to happen on click before any existing click + // handlers start running). + var synth = extend({}, e); + synth.type = 'preclick'; + this._fireDOMEvent(synth, synth.type, targets); + } + + if (e._stopped) { return; } + + // Find the layer the event is propagating from and its parents. + targets = (targets || []).concat(this._findEventTargets(e, type)); + + if (!targets.length) { return; } + + var target = targets[0]; + if (type === 'contextmenu' && target.listens(type, true)) { + preventDefault(e); + } + + var data = { + originalEvent: e + }; + + if (e.type !== 'keypress' && e.type !== 'keydown' && e.type !== 'keyup') { + var isMarker = target.getLatLng && (!target._radius || target._radius <= 10); + data.containerPoint = isMarker ? + this.latLngToContainerPoint(target.getLatLng()) : this.mouseEventToContainerPoint(e); + data.layerPoint = this.containerPointToLayerPoint(data.containerPoint); + data.latlng = isMarker ? target.getLatLng() : this.layerPointToLatLng(data.layerPoint); + } + + for (var i = 0; i < targets.length; i++) { + targets[i].fire(type, data, true); + if (data.originalEvent._stopped || + (targets[i].options.bubblingMouseEvents === false && indexOf(this._mouseEvents, type) !== -1)) { return; } + } + }, + + _draggableMoved: function (obj) { + obj = obj.dragging && obj.dragging.enabled() ? obj : this; + return (obj.dragging && obj.dragging.moved()) || (this.boxZoom && this.boxZoom.moved()); + }, + + _clearHandlers: function () { + for (var i = 0, len = this._handlers.length; i < len; i++) { + this._handlers[i].disable(); + } + }, + + // @section Other Methods + + // @method whenReady(fn: Function, context?: Object): this + // Runs the given function `fn` when the map gets initialized with + // a view (center and zoom) and at least one layer, or immediately + // if it's already initialized, optionally passing a function context. + whenReady: function (callback, context) { + if (this._loaded) { + callback.call(context || this, {target: this}); + } else { + this.on('load', callback, context); + } + return this; + }, + + + // private methods for getting map state + + _getMapPanePos: function () { + return getPosition(this._mapPane) || new Point(0, 0); + }, + + _moved: function () { + var pos = this._getMapPanePos(); + return pos && !pos.equals([0, 0]); + }, + + _getTopLeftPoint: function (center, zoom) { + var pixelOrigin = center && zoom !== undefined ? + this._getNewPixelOrigin(center, zoom) : + this.getPixelOrigin(); + return pixelOrigin.subtract(this._getMapPanePos()); + }, + + _getNewPixelOrigin: function (center, zoom) { + var viewHalf = this.getSize()._divideBy(2); + return this.project(center, zoom)._subtract(viewHalf)._add(this._getMapPanePos())._round(); + }, + + _latLngToNewLayerPoint: function (latlng, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return this.project(latlng, zoom)._subtract(topLeft); + }, + + _latLngBoundsToNewLayerBounds: function (latLngBounds, zoom, center) { + var topLeft = this._getNewPixelOrigin(center, zoom); + return toBounds([ + this.project(latLngBounds.getSouthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthWest(), zoom)._subtract(topLeft), + this.project(latLngBounds.getSouthEast(), zoom)._subtract(topLeft), + this.project(latLngBounds.getNorthEast(), zoom)._subtract(topLeft) + ]); + }, + + // layer point of the current center + _getCenterLayerPoint: function () { + return this.containerPointToLayerPoint(this.getSize()._divideBy(2)); + }, + + // offset of the specified place to the current center in pixels + _getCenterOffset: function (latlng) { + return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint()); + }, + + // adjust center for view to get inside bounds + _limitCenter: function (center, zoom, bounds) { + + if (!bounds) { return center; } + + var centerPoint = this.project(center, zoom), + viewHalf = this.getSize().divideBy(2), + viewBounds = new Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)), + offset = this._getBoundsOffset(viewBounds, bounds, zoom); + + // If offset is less than a pixel, ignore. + // This prevents unstable projections from getting into + // an infinite loop of tiny offsets. + if (offset.round().equals([0, 0])) { + return center; + } + + return this.unproject(centerPoint.add(offset), zoom); + }, + + // adjust offset for view to get inside bounds + _limitOffset: function (offset, bounds) { + if (!bounds) { return offset; } + + var viewBounds = this.getPixelBounds(), + newBounds = new Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset)); + + return offset.add(this._getBoundsOffset(newBounds, bounds)); + }, + + // returns offset needed for pxBounds to get inside maxBounds at a specified zoom + _getBoundsOffset: function (pxBounds, maxBounds, zoom) { + var projectedMaxBounds = toBounds( + this.project(maxBounds.getNorthEast(), zoom), + this.project(maxBounds.getSouthWest(), zoom) + ), + minOffset = projectedMaxBounds.min.subtract(pxBounds.min), + maxOffset = projectedMaxBounds.max.subtract(pxBounds.max), + + dx = this._rebound(minOffset.x, -maxOffset.x), + dy = this._rebound(minOffset.y, -maxOffset.y); + + return new Point(dx, dy); + }, + + _rebound: function (left, right) { + return left + right > 0 ? + Math.round(left - right) / 2 : + Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right)); + }, + + _limitZoom: function (zoom) { + var min = this.getMinZoom(), + max = this.getMaxZoom(), + snap = any3d ? this.options.zoomSnap : 1; + if (snap) { + zoom = Math.round(zoom / snap) * snap; + } + return Math.max(min, Math.min(max, zoom)); + }, + + _onPanTransitionStep: function () { + this.fire('move'); + }, + + _onPanTransitionEnd: function () { + removeClass(this._mapPane, 'leaflet-pan-anim'); + this.fire('moveend'); + }, + + _tryAnimatedPan: function (center, options) { + // difference between the new and current centers in pixels + var offset = this._getCenterOffset(center)._trunc(); + + // don't animate too far unless animate: true specified in options + if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; } + + this.panBy(offset, options); + + return true; + }, + + _createAnimProxy: function () { + + var proxy = this._proxy = create$1('div', 'leaflet-proxy leaflet-zoom-animated'); + this._panes.mapPane.appendChild(proxy); + + this.on('zoomanim', function (e) { + var prop = TRANSFORM, + transform = this._proxy.style[prop]; + + setTransform(this._proxy, this.project(e.center, e.zoom), this.getZoomScale(e.zoom, 1)); + + // workaround for case when transform is the same and so transitionend event is not fired + if (transform === this._proxy.style[prop] && this._animatingZoom) { + this._onZoomTransitionEnd(); + } + }, this); + + this.on('load moveend', this._animMoveEnd, this); + + this._on('unload', this._destroyAnimProxy, this); + }, + + _destroyAnimProxy: function () { + remove(this._proxy); + this.off('load moveend', this._animMoveEnd, this); + delete this._proxy; + }, + + _animMoveEnd: function () { + var c = this.getCenter(), + z = this.getZoom(); + setTransform(this._proxy, this.project(c, z), this.getZoomScale(z, 1)); + }, + + _catchTransitionEnd: function (e) { + if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) { + this._onZoomTransitionEnd(); + } + }, + + _nothingToAnimate: function () { + return !this._container.getElementsByClassName('leaflet-zoom-animated').length; + }, + + _tryAnimatedZoom: function (center, zoom, options) { + + if (this._animatingZoom) { return true; } + + options = options || {}; + + // don't animate if disabled, not supported or zoom difference is too large + if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() || + Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; } + + // offset is the pixel coords of the zoom origin relative to the current center + var scale = this.getZoomScale(zoom), + offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale); + + // don't animate if the zoom origin isn't within one screen from the current center, unless forced + if (options.animate !== true && !this.getSize().contains(offset)) { return false; } + + requestAnimFrame(function () { + this + ._moveStart(true, false) + ._animateZoom(center, zoom, true); + }, this); + + return true; + }, + + _animateZoom: function (center, zoom, startAnim, noUpdate) { + if (!this._mapPane) { return; } + + if (startAnim) { + this._animatingZoom = true; + + // remember what center/zoom to set after animation + this._animateToCenter = center; + this._animateToZoom = zoom; + + addClass(this._mapPane, 'leaflet-zoom-anim'); + } + + // @section Other Events + // @event zoomanim: ZoomAnimEvent + // Fired at least once per zoom animation. For continuous zoom, like pinch zooming, fired once per frame during zoom. + this.fire('zoomanim', { + center: center, + zoom: zoom, + noUpdate: noUpdate + }); + + // Work around webkit not firing 'transitionend', see https://github.com/Leaflet/Leaflet/issues/3689, 2693 + setTimeout(bind(this._onZoomTransitionEnd, this), 250); + }, + + _onZoomTransitionEnd: function () { + if (!this._animatingZoom) { return; } + + if (this._mapPane) { + removeClass(this._mapPane, 'leaflet-zoom-anim'); + } + + this._animatingZoom = false; + + this._move(this._animateToCenter, this._animateToZoom); + + // This anim frame should prevent an obscure iOS webkit tile loading race condition. + requestAnimFrame(function () { + this._moveEnd(true); + }, this); + } + }); + + // @section + + // @factory L.map(id: String, options?: Map options) + // Instantiates a map object given the DOM ID of a `
` element + // and optionally an object literal with `Map options`. + // + // @alternative + // @factory L.map(el: HTMLElement, options?: Map options) + // Instantiates a map object given an instance of a `
` HTML element + // and optionally an object literal with `Map options`. + function createMap(id, options) { + return new Map(id, options); + } + + /* + * @class Control + * @aka L.Control + * @inherits Class + * + * L.Control is a base class for implementing map controls. Handles positioning. + * All other controls extend from this class. + */ + + var Control = Class.extend({ + // @section + // @aka Control options + options: { + // @option position: String = 'topright' + // The position of the control (one of the map corners). Possible values are `'topleft'`, + // `'topright'`, `'bottomleft'` or `'bottomright'` + position: 'topright' + }, + + initialize: function (options) { + setOptions(this, options); + }, + + /* @section + * Classes extending L.Control will inherit the following methods: + * + * @method getPosition: string + * Returns the position of the control. + */ + getPosition: function () { + return this.options.position; + }, + + // @method setPosition(position: string): this + // Sets the position of the control. + setPosition: function (position) { + var map = this._map; + + if (map) { + map.removeControl(this); + } + + this.options.position = position; + + if (map) { + map.addControl(this); + } + + return this; + }, + + // @method getContainer: HTMLElement + // Returns the HTMLElement that contains the control. + getContainer: function () { + return this._container; + }, + + // @method addTo(map: Map): this + // Adds the control to the given map. + addTo: function (map) { + this.remove(); + this._map = map; + + var container = this._container = this.onAdd(map), + pos = this.getPosition(), + corner = map._controlCorners[pos]; + + addClass(container, 'leaflet-control'); + + if (pos.indexOf('bottom') !== -1) { + corner.insertBefore(container, corner.firstChild); + } else { + corner.appendChild(container); + } + + this._map.on('unload', this.remove, this); + + return this; + }, + + // @method remove: this + // Removes the control from the map it is currently active on. + remove: function () { + if (!this._map) { + return this; + } + + remove(this._container); + + if (this.onRemove) { + this.onRemove(this._map); + } + + this._map.off('unload', this.remove, this); + this._map = null; + + return this; + }, + + _refocusOnMap: function (e) { + // if map exists and event is not a keyboard event + if (this._map && e && e.screenX > 0 && e.screenY > 0) { + this._map.getContainer().focus(); + } + } + }); + + var control = function (options) { + return new Control(options); + }; + + /* @section Extension methods + * @uninheritable + * + * Every control should extend from `L.Control` and (re-)implement the following methods. + * + * @method onAdd(map: Map): HTMLElement + * Should return the container DOM element for the control and add listeners on relevant map events. Called on [`control.addTo(map)`](#control-addTo). + * + * @method onRemove(map: Map) + * Optional method. Should contain all clean up code that removes the listeners previously added in [`onAdd`](#control-onadd). Called on [`control.remove()`](#control-remove). + */ + + /* @namespace Map + * @section Methods for Layers and Controls + */ + Map.include({ + // @method addControl(control: Control): this + // Adds the given control to the map + addControl: function (control) { + control.addTo(this); + return this; + }, + + // @method removeControl(control: Control): this + // Removes the given control from the map + removeControl: function (control) { + control.remove(); + return this; + }, + + _initControlPos: function () { + var corners = this._controlCorners = {}, + l = 'leaflet-', + container = this._controlContainer = + create$1('div', l + 'control-container', this._container); + + function createCorner(vSide, hSide) { + var className = l + vSide + ' ' + l + hSide; + + corners[vSide + hSide] = create$1('div', className, container); + } + + createCorner('top', 'left'); + createCorner('top', 'right'); + createCorner('bottom', 'left'); + createCorner('bottom', 'right'); + }, + + _clearControlPos: function () { + for (var i in this._controlCorners) { + remove(this._controlCorners[i]); + } + remove(this._controlContainer); + delete this._controlCorners; + delete this._controlContainer; + } + }); + + /* + * @class Control.Layers + * @aka L.Control.Layers + * @inherits Control + * + * The layers control gives users the ability to switch between different base layers and switch overlays on/off (check out the [detailed example](http://leafletjs.com/examples/layers-control/)). Extends `Control`. + * + * @example + * + * ```js + * var baseLayers = { + * "Mapbox": mapbox, + * "OpenStreetMap": osm + * }; + * + * var overlays = { + * "Marker": marker, + * "Roads": roadsLayer + * }; + * + * L.control.layers(baseLayers, overlays).addTo(map); + * ``` + * + * The `baseLayers` and `overlays` parameters are object literals with layer names as keys and `Layer` objects as values: + * + * ```js + * { + * "": layer1, + * "": layer2 + * } + * ``` + * + * The layer names can contain HTML, which allows you to add additional styling to the items: + * + * ```js + * {" My Layer": myLayer} + * ``` + */ + + var Layers = Control.extend({ + // @section + // @aka Control.Layers options + options: { + // @option collapsed: Boolean = true + // If `true`, the control will be collapsed into an icon and expanded on mouse hover or touch. + collapsed: true, + position: 'topright', + + // @option autoZIndex: Boolean = true + // If `true`, the control will assign zIndexes in increasing order to all of its layers so that the order is preserved when switching them on/off. + autoZIndex: true, + + // @option hideSingleBase: Boolean = false + // If `true`, the base layers in the control will be hidden when there is only one. + hideSingleBase: false, + + // @option sortLayers: Boolean = false + // Whether to sort the layers. When `false`, layers will keep the order + // in which they were added to the control. + sortLayers: false, + + // @option sortFunction: Function = * + // A [compare function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) + // that will be used for sorting the layers, when `sortLayers` is `true`. + // The function receives both the `L.Layer` instances and their names, as in + // `sortFunction(layerA, layerB, nameA, nameB)`. + // By default, it sorts layers alphabetically by their name. + sortFunction: function (layerA, layerB, nameA, nameB) { + return nameA < nameB ? -1 : (nameB < nameA ? 1 : 0); + } + }, + + initialize: function (baseLayers, overlays, options) { + setOptions(this, options); + + this._layerControlInputs = []; + this._layers = []; + this._lastZIndex = 0; + this._handlingClick = false; + + for (var i in baseLayers) { + this._addLayer(baseLayers[i], i); + } + + for (i in overlays) { + this._addLayer(overlays[i], i, true); + } + }, + + onAdd: function (map) { + this._initLayout(); + this._update(); + + this._map = map; + map.on('zoomend', this._checkDisabledLayers, this); + + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.on('add remove', this._onLayerChange, this); + } + + return this._container; + }, + + addTo: function (map) { + Control.prototype.addTo.call(this, map); + // Trigger expand after Layers Control has been inserted into DOM so that is now has an actual height. + return this._expandIfNotCollapsed(); + }, + + onRemove: function () { + this._map.off('zoomend', this._checkDisabledLayers, this); + + for (var i = 0; i < this._layers.length; i++) { + this._layers[i].layer.off('add remove', this._onLayerChange, this); + } + }, + + // @method addBaseLayer(layer: Layer, name: String): this + // Adds a base layer (radio button entry) with the given name to the control. + addBaseLayer: function (layer, name) { + this._addLayer(layer, name); + return (this._map) ? this._update() : this; + }, + + // @method addOverlay(layer: Layer, name: String): this + // Adds an overlay (checkbox entry) with the given name to the control. + addOverlay: function (layer, name) { + this._addLayer(layer, name, true); + return (this._map) ? this._update() : this; + }, + + // @method removeLayer(layer: Layer): this + // Remove the given layer from the control. + removeLayer: function (layer) { + layer.off('add remove', this._onLayerChange, this); + + var obj = this._getLayer(stamp(layer)); + if (obj) { + this._layers.splice(this._layers.indexOf(obj), 1); + } + return (this._map) ? this._update() : this; + }, + + // @method expand(): this + // Expand the control container if collapsed. + expand: function () { + addClass(this._container, 'leaflet-control-layers-expanded'); + this._section.style.height = null; + var acceptableHeight = this._map.getSize().y - (this._container.offsetTop + 50); + if (acceptableHeight < this._section.clientHeight) { + addClass(this._section, 'leaflet-control-layers-scrollbar'); + this._section.style.height = acceptableHeight + 'px'; + } else { + removeClass(this._section, 'leaflet-control-layers-scrollbar'); + } + this._checkDisabledLayers(); + return this; + }, + + // @method collapse(): this + // Collapse the control container if expanded. + collapse: function () { + removeClass(this._container, 'leaflet-control-layers-expanded'); + return this; + }, + + _initLayout: function () { + var className = 'leaflet-control-layers', + container = this._container = create$1('div', className), + collapsed = this.options.collapsed; + + // makes this work on IE touch devices by stopping it from firing a mouseout event when the touch is released + container.setAttribute('aria-haspopup', true); + + disableClickPropagation(container); + disableScrollPropagation(container); + + var section = this._section = create$1('section', className + '-list'); + + if (collapsed) { + this._map.on('click', this.collapse, this); + + if (!android) { + on(container, { + mouseenter: this.expand, + mouseleave: this.collapse + }, this); + } + } + + var link = this._layersLink = create$1('a', className + '-toggle', container); + link.href = '#'; + link.title = 'Layers'; + + if (touch) { + on(link, 'click', stop); + on(link, 'click', this.expand, this); + } else { + on(link, 'focus', this.expand, this); + } + + if (!collapsed) { + this.expand(); + } + + this._baseLayersList = create$1('div', className + '-base', section); + this._separator = create$1('div', className + '-separator', section); + this._overlaysList = create$1('div', className + '-overlays', section); + + container.appendChild(section); + }, + + _getLayer: function (id) { + for (var i = 0; i < this._layers.length; i++) { + + if (this._layers[i] && stamp(this._layers[i].layer) === id) { + return this._layers[i]; + } + } + }, + + _addLayer: function (layer, name, overlay) { + if (this._map) { + layer.on('add remove', this._onLayerChange, this); + } + + this._layers.push({ + layer: layer, + name: name, + overlay: overlay + }); + + if (this.options.sortLayers) { + this._layers.sort(bind(function (a, b) { + return this.options.sortFunction(a.layer, b.layer, a.name, b.name); + }, this)); + } + + if (this.options.autoZIndex && layer.setZIndex) { + this._lastZIndex++; + layer.setZIndex(this._lastZIndex); + } + + this._expandIfNotCollapsed(); + }, + + _update: function () { + if (!this._container) { return this; } + + empty(this._baseLayersList); + empty(this._overlaysList); + + this._layerControlInputs = []; + var baseLayersPresent, overlaysPresent, i, obj, baseLayersCount = 0; + + for (i = 0; i < this._layers.length; i++) { + obj = this._layers[i]; + this._addItem(obj); + overlaysPresent = overlaysPresent || obj.overlay; + baseLayersPresent = baseLayersPresent || !obj.overlay; + baseLayersCount += !obj.overlay ? 1 : 0; + } + + // Hide base layers section if there's only one layer. + if (this.options.hideSingleBase) { + baseLayersPresent = baseLayersPresent && baseLayersCount > 1; + this._baseLayersList.style.display = baseLayersPresent ? '' : 'none'; + } + + this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none'; + + return this; + }, + + _onLayerChange: function (e) { + if (!this._handlingClick) { + this._update(); + } + + var obj = this._getLayer(stamp(e.target)); + + // @namespace Map + // @section Layer events + // @event baselayerchange: LayersControlEvent + // Fired when the base layer is changed through the [layers control](#control-layers). + // @event overlayadd: LayersControlEvent + // Fired when an overlay is selected through the [layers control](#control-layers). + // @event overlayremove: LayersControlEvent + // Fired when an overlay is deselected through the [layers control](#control-layers). + // @namespace Control.Layers + var type = obj.overlay ? + (e.type === 'add' ? 'overlayadd' : 'overlayremove') : + (e.type === 'add' ? 'baselayerchange' : null); + + if (type) { + this._map.fire(type, obj); + } + }, + + // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe) + _createRadioElement: function (name, checked) { + + var radioHtml = ''; + + var radioFragment = document.createElement('div'); + radioFragment.innerHTML = radioHtml; + + return radioFragment.firstChild; + }, + + _addItem: function (obj) { + var label = document.createElement('label'), + checked = this._map.hasLayer(obj.layer), + input; + + if (obj.overlay) { + input = document.createElement('input'); + input.type = 'checkbox'; + input.className = 'leaflet-control-layers-selector'; + input.defaultChecked = checked; + } else { + input = this._createRadioElement('leaflet-base-layers_' + stamp(this), checked); + } + + this._layerControlInputs.push(input); + input.layerId = stamp(obj.layer); + + on(input, 'click', this._onInputClick, this); + + var name = document.createElement('span'); + name.innerHTML = ' ' + obj.name; + + // Helps from preventing layer control flicker when checkboxes are disabled + // https://github.com/Leaflet/Leaflet/issues/2771 + var holder = document.createElement('div'); + + label.appendChild(holder); + holder.appendChild(input); + holder.appendChild(name); + + var container = obj.overlay ? this._overlaysList : this._baseLayersList; + container.appendChild(label); + + this._checkDisabledLayers(); + return label; + }, + + _onInputClick: function () { + var inputs = this._layerControlInputs, + input, layer; + var addedLayers = [], + removedLayers = []; + + this._handlingClick = true; + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + + if (input.checked) { + addedLayers.push(layer); + } else if (!input.checked) { + removedLayers.push(layer); + } + } + + // Bugfix issue 2318: Should remove all old layers before readding new ones + for (i = 0; i < removedLayers.length; i++) { + if (this._map.hasLayer(removedLayers[i])) { + this._map.removeLayer(removedLayers[i]); + } + } + for (i = 0; i < addedLayers.length; i++) { + if (!this._map.hasLayer(addedLayers[i])) { + this._map.addLayer(addedLayers[i]); + } + } + + this._handlingClick = false; + + this._refocusOnMap(); + }, + + _checkDisabledLayers: function () { + var inputs = this._layerControlInputs, + input, + layer, + zoom = this._map.getZoom(); + + for (var i = inputs.length - 1; i >= 0; i--) { + input = inputs[i]; + layer = this._getLayer(input.layerId).layer; + input.disabled = (layer.options.minZoom !== undefined && zoom < layer.options.minZoom) || + (layer.options.maxZoom !== undefined && zoom > layer.options.maxZoom); + + } + }, + + _expandIfNotCollapsed: function () { + if (this._map && !this.options.collapsed) { + this.expand(); + } + return this; + }, + + _expand: function () { + // Backward compatibility, remove me in 1.1. + return this.expand(); + }, + + _collapse: function () { + // Backward compatibility, remove me in 1.1. + return this.collapse(); + } + + }); + + + // @factory L.control.layers(baselayers?: Object, overlays?: Object, options?: Control.Layers options) + // Creates a layers control with the given layers. Base layers will be switched with radio buttons, while overlays will be switched with checkboxes. Note that all base layers should be passed in the base layers object, but only one should be added to the map during map instantiation. + var layers = function (baseLayers, overlays, options) { + return new Layers(baseLayers, overlays, options); + }; + + /* + * @class Control.Zoom + * @aka L.Control.Zoom + * @inherits Control + * + * A basic zoom control with two buttons (zoom in and zoom out). It is put on the map by default unless you set its [`zoomControl` option](#map-zoomcontrol) to `false`. Extends `Control`. + */ + + var Zoom = Control.extend({ + // @section + // @aka Control.Zoom options + options: { + position: 'topleft', + + // @option zoomInText: String = '+' + // The text set on the 'zoom in' button. + zoomInText: '+', + + // @option zoomInTitle: String = 'Zoom in' + // The title set on the 'zoom in' button. + zoomInTitle: 'Zoom in', + + // @option zoomOutText: String = '−' + // The text set on the 'zoom out' button. + zoomOutText: '−', + + // @option zoomOutTitle: String = 'Zoom out' + // The title set on the 'zoom out' button. + zoomOutTitle: 'Zoom out' + }, + + onAdd: function (map) { + var zoomName = 'leaflet-control-zoom', + container = create$1('div', zoomName + ' leaflet-bar'), + options = this.options; + + this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, + zoomName + '-in', container, this._zoomIn); + this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, + zoomName + '-out', container, this._zoomOut); + + this._updateDisabled(); + map.on('zoomend zoomlevelschange', this._updateDisabled, this); + + return container; + }, + + onRemove: function (map) { + map.off('zoomend zoomlevelschange', this._updateDisabled, this); + }, + + disable: function () { + this._disabled = true; + this._updateDisabled(); + return this; + }, + + enable: function () { + this._disabled = false; + this._updateDisabled(); + return this; + }, + + _zoomIn: function (e) { + if (!this._disabled && this._map._zoom < this._map.getMaxZoom()) { + this._map.zoomIn(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _zoomOut: function (e) { + if (!this._disabled && this._map._zoom > this._map.getMinZoom()) { + this._map.zoomOut(this._map.options.zoomDelta * (e.shiftKey ? 3 : 1)); + } + }, + + _createButton: function (html, title, className, container, fn) { + var link = create$1('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; + + /* + * Will force screen readers like VoiceOver to read this as "Zoom in - button" + */ + link.setAttribute('role', 'button'); + link.setAttribute('aria-label', title); + + disableClickPropagation(link); + on(link, 'click', stop); + on(link, 'click', fn, this); + on(link, 'click', this._refocusOnMap, this); + + return link; + }, + + _updateDisabled: function () { + var map = this._map, + className = 'leaflet-disabled'; + + removeClass(this._zoomInButton, className); + removeClass(this._zoomOutButton, className); + + if (this._disabled || map._zoom === map.getMinZoom()) { + addClass(this._zoomOutButton, className); + } + if (this._disabled || map._zoom === map.getMaxZoom()) { + addClass(this._zoomInButton, className); + } + } + }); + + // @namespace Map + // @section Control options + // @option zoomControl: Boolean = true + // Whether a [zoom control](#control-zoom) is added to the map by default. + Map.mergeOptions({ + zoomControl: true + }); + + Map.addInitHook(function () { + if (this.options.zoomControl) { + // @section Controls + // @property zoomControl: Control.Zoom + // The default zoom control (only available if the + // [`zoomControl` option](#map-zoomcontrol) was `true` when creating the map). + this.zoomControl = new Zoom(); + this.addControl(this.zoomControl); + } + }); + + // @namespace Control.Zoom + // @factory L.control.zoom(options: Control.Zoom options) + // Creates a zoom control + var zoom = function (options) { + return new Zoom(options); + }; + + /* + * @class Control.Scale + * @aka L.Control.Scale + * @inherits Control + * + * A simple scale control that shows the scale of the current center of screen in metric (m/km) and imperial (mi/ft) systems. Extends `Control`. + * + * @example + * + * ```js + * L.control.scale().addTo(map); + * ``` + */ + + var Scale = Control.extend({ + // @section + // @aka Control.Scale options + options: { + position: 'bottomleft', + + // @option maxWidth: Number = 100 + // Maximum width of the control in pixels. The width is set dynamically to show round values (e.g. 100, 200, 500). + maxWidth: 100, + + // @option metric: Boolean = True + // Whether to show the metric scale line (m/km). + metric: true, + + // @option imperial: Boolean = True + // Whether to show the imperial scale line (mi/ft). + imperial: true + + // @option updateWhenIdle: Boolean = false + // If `true`, the control is updated on [`moveend`](#map-moveend), otherwise it's always up-to-date (updated on [`move`](#map-move)). + }, + + onAdd: function (map) { + var className = 'leaflet-control-scale', + container = create$1('div', className), + options = this.options; + + this._addScales(options, className + '-line', container); + + map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + map.whenReady(this._update, this); + + return container; + }, + + onRemove: function (map) { + map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this); + }, + + _addScales: function (options, className, container) { + if (options.metric) { + this._mScale = create$1('div', className, container); + } + if (options.imperial) { + this._iScale = create$1('div', className, container); + } + }, + + _update: function () { + var map = this._map, + y = map.getSize().y / 2; + + var maxMeters = map.distance( + map.containerPointToLatLng([0, y]), + map.containerPointToLatLng([this.options.maxWidth, y])); + + this._updateScales(maxMeters); + }, + + _updateScales: function (maxMeters) { + if (this.options.metric && maxMeters) { + this._updateMetric(maxMeters); + } + if (this.options.imperial && maxMeters) { + this._updateImperial(maxMeters); + } + }, + + _updateMetric: function (maxMeters) { + var meters = this._getRoundNum(maxMeters), + label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km'; + + this._updateScale(this._mScale, label, meters / maxMeters); + }, + + _updateImperial: function (maxMeters) { + var maxFeet = maxMeters * 3.2808399, + maxMiles, miles, feet; + + if (maxFeet > 5280) { + maxMiles = maxFeet / 5280; + miles = this._getRoundNum(maxMiles); + this._updateScale(this._iScale, miles + ' mi', miles / maxMiles); + + } else { + feet = this._getRoundNum(maxFeet); + this._updateScale(this._iScale, feet + ' ft', feet / maxFeet); + } + }, + + _updateScale: function (scale, text, ratio) { + scale.style.width = Math.round(this.options.maxWidth * ratio) + 'px'; + scale.innerHTML = text; + }, + + _getRoundNum: function (num) { + var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1), + d = num / pow10; + + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; + + return pow10 * d; + } + }); + + + // @factory L.control.scale(options?: Control.Scale options) + // Creates an scale control with the given options. + var scale = function (options) { + return new Scale(options); + }; + + /* + * @class Control.Attribution + * @aka L.Control.Attribution + * @inherits Control + * + * The attribution control allows you to display attribution data in a small text box on a map. It is put on the map by default unless you set its [`attributionControl` option](#map-attributioncontrol) to `false`, and it fetches attribution texts from layers with the [`getAttribution` method](#layer-getattribution) automatically. Extends Control. + */ + + var Attribution = Control.extend({ + // @section + // @aka Control.Attribution options + options: { + position: 'bottomright', + + // @option prefix: String = 'Leaflet' + // The HTML text shown before the attributions. Pass `false` to disable. + prefix: 'Leaflet' + }, + + initialize: function (options) { + setOptions(this, options); + + this._attributions = {}; + }, + + onAdd: function (map) { + map.attributionControl = this; + this._container = create$1('div', 'leaflet-control-attribution'); + disableClickPropagation(this._container); + + // TODO ugly, refactor + for (var i in map._layers) { + if (map._layers[i].getAttribution) { + this.addAttribution(map._layers[i].getAttribution()); + } + } + + this._update(); + + return this._container; + }, + + // @method setPrefix(prefix: String): this + // Sets the text before the attributions. + setPrefix: function (prefix) { + this.options.prefix = prefix; + this._update(); + return this; + }, + + // @method addAttribution(text: String): this + // Adds an attribution text (e.g. `'Vector data © Mapbox'`). + addAttribution: function (text) { + if (!text) { return this; } + + if (!this._attributions[text]) { + this._attributions[text] = 0; + } + this._attributions[text]++; + + this._update(); + + return this; + }, + + // @method removeAttribution(text: String): this + // Removes an attribution text. + removeAttribution: function (text) { + if (!text) { return this; } + + if (this._attributions[text]) { + this._attributions[text]--; + this._update(); + } + + return this; + }, + + _update: function () { + if (!this._map) { return; } + + var attribs = []; + + for (var i in this._attributions) { + if (this._attributions[i]) { + attribs.push(i); + } + } + + var prefixAndAttribs = []; + + if (this.options.prefix) { + prefixAndAttribs.push(this.options.prefix); + } + if (attribs.length) { + prefixAndAttribs.push(attribs.join(', ')); + } + + this._container.innerHTML = prefixAndAttribs.join(' | '); + } + }); + + // @namespace Map + // @section Control options + // @option attributionControl: Boolean = true + // Whether a [attribution control](#control-attribution) is added to the map by default. + Map.mergeOptions({ + attributionControl: true + }); + + Map.addInitHook(function () { + if (this.options.attributionControl) { + new Attribution().addTo(this); + } + }); + + // @namespace Control.Attribution + // @factory L.control.attribution(options: Control.Attribution options) + // Creates an attribution control. + var attribution = function (options) { + return new Attribution(options); + }; + + Control.Layers = Layers; + Control.Zoom = Zoom; + Control.Scale = Scale; + Control.Attribution = Attribution; + + control.layers = layers; + control.zoom = zoom; + control.scale = scale; + control.attribution = attribution; + + /* + L.Handler is a base class for handler classes that are used internally to inject + interaction features like dragging to classes like Map and Marker. + */ + + // @class Handler + // @aka L.Handler + // Abstract class for map interaction handlers + + var Handler = Class.extend({ + initialize: function (map) { + this._map = map; + }, + + // @method enable(): this + // Enables the handler + enable: function () { + if (this._enabled) { return this; } + + this._enabled = true; + this.addHooks(); + return this; + }, + + // @method disable(): this + // Disables the handler + disable: function () { + if (!this._enabled) { return this; } + + this._enabled = false; + this.removeHooks(); + return this; + }, + + // @method enabled(): Boolean + // Returns `true` if the handler is enabled + enabled: function () { + return !!this._enabled; + } + + // @section Extension methods + // Classes inheriting from `Handler` must implement the two following methods: + // @method addHooks() + // Called when the handler is enabled, should add event hooks. + // @method removeHooks() + // Called when the handler is disabled, should remove the event hooks added previously. + }); + + // @section There is static function which can be called without instantiating L.Handler: + // @function addTo(map: Map, name: String): this + // Adds a new Handler to the given map with the given name. + Handler.addTo = function (map, name) { + map.addHandler(name, this); + return this; + }; + + var Mixin = {Events: Events}; + + /* + * @class Draggable + * @aka L.Draggable + * @inherits Evented + * + * A class for making DOM elements draggable (including touch support). + * Used internally for map and marker dragging. Only works for elements + * that were positioned with [`L.DomUtil.setPosition`](#domutil-setposition). + * + * @example + * ```js + * var draggable = new L.Draggable(elementToDrag); + * draggable.enable(); + * ``` + */ + + var START = touch ? 'touchstart mousedown' : 'mousedown'; + var END = { + mousedown: 'mouseup', + touchstart: 'touchend', + pointerdown: 'touchend', + MSPointerDown: 'touchend' + }; + var MOVE = { + mousedown: 'mousemove', + touchstart: 'touchmove', + pointerdown: 'touchmove', + MSPointerDown: 'touchmove' + }; + + + var Draggable = Evented.extend({ + + options: { + // @section + // @aka Draggable options + // @option clickTolerance: Number = 3 + // The max number of pixels a user can shift the mouse pointer during a click + // for it to be considered a valid click (as opposed to a mouse drag). + clickTolerance: 3 + }, + + // @constructor L.Draggable(el: HTMLElement, dragHandle?: HTMLElement, preventOutline?: Boolean, options?: Draggable options) + // Creates a `Draggable` object for moving `el` when you start dragging the `dragHandle` element (equals `el` itself by default). + initialize: function (element, dragStartTarget, preventOutline$$1, options) { + setOptions(this, options); + + this._element = element; + this._dragStartTarget = dragStartTarget || element; + this._preventOutline = preventOutline$$1; + }, + + // @method enable() + // Enables the dragging ability + enable: function () { + if (this._enabled) { return; } + + on(this._dragStartTarget, START, this._onDown, this); + + this._enabled = true; + }, + + // @method disable() + // Disables the dragging ability + disable: function () { + if (!this._enabled) { return; } + + // If we're currently dragging this draggable, + // disabling it counts as first ending the drag. + if (Draggable._dragging === this) { + this.finishDrag(); + } + + off(this._dragStartTarget, START, this._onDown, this); + + this._enabled = false; + this._moved = false; + }, + + _onDown: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + this._moved = false; + + if (hasClass(this._element, 'leaflet-zoom-anim')) { return; } + + if (Draggable._dragging || e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; } + Draggable._dragging = this; // Prevent dragging multiple objects at once. + + if (this._preventOutline) { + preventOutline(this._element); + } + + disableImageDrag(); + disableTextSelection(); + + if (this._moving) { return; } + + // @event down: Event + // Fired when a drag is about to start. + this.fire('down'); + + var first = e.touches ? e.touches[0] : e, + sizedParent = getSizedParentNode(this._element); + + this._startPoint = new Point(first.clientX, first.clientY); + + // Cache the scale, so that we can continuously compensate for it during drag (_onMove). + this._parentScale = getScale(sizedParent); + + on(document, MOVE[e.type], this._onMove, this); + on(document, END[e.type], this._onUp, this); + }, + + _onMove: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + + if (e.touches && e.touches.length > 1) { + this._moved = true; + return; + } + + var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e), + offset = new Point(first.clientX, first.clientY)._subtract(this._startPoint); + + if (!offset.x && !offset.y) { return; } + if (Math.abs(offset.x) + Math.abs(offset.y) < this.options.clickTolerance) { return; } + + // We assume that the parent container's position, border and scale do not change for the duration of the drag. + // Therefore there is no need to account for the position and border (they are eliminated by the subtraction) + // and we can use the cached value for the scale. + offset.x /= this._parentScale.x; + offset.y /= this._parentScale.y; + + preventDefault(e); + + if (!this._moved) { + // @event dragstart: Event + // Fired when a drag starts + this.fire('dragstart'); + + this._moved = true; + this._startPos = getPosition(this._element).subtract(offset); + + addClass(document.body, 'leaflet-dragging'); + + this._lastTarget = e.target || e.srcElement; + // IE and Edge do not give the element, so fetch it + // if necessary + if (window.SVGElementInstance && this._lastTarget instanceof window.SVGElementInstance) { + this._lastTarget = this._lastTarget.correspondingUseElement; + } + addClass(this._lastTarget, 'leaflet-drag-target'); + } + + this._newPos = this._startPos.add(offset); + this._moving = true; + + cancelAnimFrame(this._animRequest); + this._lastEvent = e; + this._animRequest = requestAnimFrame(this._updatePosition, this, true); + }, + + _updatePosition: function () { + var e = {originalEvent: this._lastEvent}; + + // @event predrag: Event + // Fired continuously during dragging *before* each corresponding + // update of the element's position. + this.fire('predrag', e); + setPosition(this._element, this._newPos); + + // @event drag: Event + // Fired continuously during dragging. + this.fire('drag', e); + }, + + _onUp: function (e) { + // Ignore simulated events, since we handle both touch and + // mouse explicitly; otherwise we risk getting duplicates of + // touch events, see #4315. + // Also ignore the event if disabled; this happens in IE11 + // under some circumstances, see #3666. + if (e._simulated || !this._enabled) { return; } + this.finishDrag(); + }, + + finishDrag: function () { + removeClass(document.body, 'leaflet-dragging'); + + if (this._lastTarget) { + removeClass(this._lastTarget, 'leaflet-drag-target'); + this._lastTarget = null; + } + + for (var i in MOVE) { + off(document, MOVE[i], this._onMove, this); + off(document, END[i], this._onUp, this); + } + + enableImageDrag(); + enableTextSelection(); + + if (this._moved && this._moving) { + // ensure drag is not fired after dragend + cancelAnimFrame(this._animRequest); + + // @event dragend: DragEndEvent + // Fired when the drag ends. + this.fire('dragend', { + distance: this._newPos.distanceTo(this._startPos) + }); + } + + this._moving = false; + Draggable._dragging = false; + } + + }); + + /* + * @namespace LineUtil + * + * Various utility functions for polyline points processing, used by Leaflet internally to make polylines lightning-fast. + */ + + // Simplify polyline with vertex reduction and Douglas-Peucker simplification. + // Improves rendering performance dramatically by lessening the number of points to draw. + + // @function simplify(points: Point[], tolerance: Number): Point[] + // Dramatically reduces the number of points in a polyline while retaining + // its shape and returns a new array of simplified points, using the + // [Douglas-Peucker algorithm](http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm). + // Used for a huge performance boost when processing/displaying Leaflet polylines for + // each zoom level and also reducing visual noise. tolerance affects the amount of + // simplification (lesser value means higher quality but slower and with more points). + // Also released as a separated micro-library [Simplify.js](http://mourner.github.com/simplify-js/). + function simplify(points, tolerance) { + if (!tolerance || !points.length) { + return points.slice(); + } + + var sqTolerance = tolerance * tolerance; + + // stage 1: vertex reduction + points = _reducePoints(points, sqTolerance); + + // stage 2: Douglas-Peucker simplification + points = _simplifyDP(points, sqTolerance); + + return points; + } + + // @function pointToSegmentDistance(p: Point, p1: Point, p2: Point): Number + // Returns the distance between point `p` and segment `p1` to `p2`. + function pointToSegmentDistance(p, p1, p2) { + return Math.sqrt(_sqClosestPointOnSegment(p, p1, p2, true)); + } + + // @function closestPointOnSegment(p: Point, p1: Point, p2: Point): Number + // Returns the closest point from a point `p` on a segment `p1` to `p2`. + function closestPointOnSegment(p, p1, p2) { + return _sqClosestPointOnSegment(p, p1, p2); + } + + // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm + function _simplifyDP(points, sqTolerance) { + + var len = points.length, + ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array, + markers = new ArrayConstructor(len); + + markers[0] = markers[len - 1] = 1; + + _simplifyDPStep(points, markers, sqTolerance, 0, len - 1); + + var i, + newPoints = []; + + for (i = 0; i < len; i++) { + if (markers[i]) { + newPoints.push(points[i]); + } + } + + return newPoints; + } + + function _simplifyDPStep(points, markers, sqTolerance, first, last) { + + var maxSqDist = 0, + index, i, sqDist; + + for (i = first + 1; i <= last - 1; i++) { + sqDist = _sqClosestPointOnSegment(points[i], points[first], points[last], true); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + markers[index] = 1; + + _simplifyDPStep(points, markers, sqTolerance, first, index); + _simplifyDPStep(points, markers, sqTolerance, index, last); + } + } + + // reduce points that are too close to each other to a single point + function _reducePoints(points, sqTolerance) { + var reducedPoints = [points[0]]; + + for (var i = 1, prev = 0, len = points.length; i < len; i++) { + if (_sqDist(points[i], points[prev]) > sqTolerance) { + reducedPoints.push(points[i]); + prev = i; + } + } + if (prev < len - 1) { + reducedPoints.push(points[len - 1]); + } + return reducedPoints; + } + + var _lastCode; + + // @function clipSegment(a: Point, b: Point, bounds: Bounds, useLastCode?: Boolean, round?: Boolean): Point[]|Boolean + // Clips the segment a to b by rectangular bounds with the + // [Cohen-Sutherland algorithm](https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm) + // (modifying the segment points directly!). Used by Leaflet to only show polyline + // points that are on the screen or near, increasing performance. + function clipSegment(a, b, bounds, useLastCode, round) { + var codeA = useLastCode ? _lastCode : _getBitCode(a, bounds), + codeB = _getBitCode(b, bounds), + + codeOut, p, newCode; + + // save 2nd code to avoid calculating it on the next segment + _lastCode = codeB; + + while (true) { + // if a,b is inside the clip window (trivial accept) + if (!(codeA | codeB)) { + return [a, b]; + } + + // if a,b is outside the clip window (trivial reject) + if (codeA & codeB) { + return false; + } + + // other cases + codeOut = codeA || codeB; + p = _getEdgeIntersection(a, b, codeOut, bounds, round); + newCode = _getBitCode(p, bounds); + + if (codeOut === codeA) { + a = p; + codeA = newCode; + } else { + b = p; + codeB = newCode; + } + } + } + + function _getEdgeIntersection(a, b, code, bounds, round) { + var dx = b.x - a.x, + dy = b.y - a.y, + min = bounds.min, + max = bounds.max, + x, y; + + if (code & 8) { // top + x = a.x + dx * (max.y - a.y) / dy; + y = max.y; + + } else if (code & 4) { // bottom + x = a.x + dx * (min.y - a.y) / dy; + y = min.y; + + } else if (code & 2) { // right + x = max.x; + y = a.y + dy * (max.x - a.x) / dx; + + } else if (code & 1) { // left + x = min.x; + y = a.y + dy * (min.x - a.x) / dx; + } + + return new Point(x, y, round); + } + + function _getBitCode(p, bounds) { + var code = 0; + + if (p.x < bounds.min.x) { // left + code |= 1; + } else if (p.x > bounds.max.x) { // right + code |= 2; + } + + if (p.y < bounds.min.y) { // bottom + code |= 4; + } else if (p.y > bounds.max.y) { // top + code |= 8; + } + + return code; + } + + // square distance (to avoid unnecessary Math.sqrt calls) + function _sqDist(p1, p2) { + var dx = p2.x - p1.x, + dy = p2.y - p1.y; + return dx * dx + dy * dy; + } + + // return closest point on segment or distance to that point + function _sqClosestPointOnSegment(p, p1, p2, sqDist) { + var x = p1.x, + y = p1.y, + dx = p2.x - x, + dy = p2.y - y, + dot = dx * dx + dy * dy, + t; + + if (dot > 0) { + t = ((p.x - x) * dx + (p.y - y) * dy) / dot; + + if (t > 1) { + x = p2.x; + y = p2.y; + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return sqDist ? dx * dx + dy * dy : new Point(x, y); + } + + + // @function isFlat(latlngs: LatLng[]): Boolean + // Returns true if `latlngs` is a flat array, false is nested. + function isFlat(latlngs) { + return !isArray(latlngs[0]) || (typeof latlngs[0][0] !== 'object' && typeof latlngs[0][0] !== 'undefined'); + } + + function _flat(latlngs) { + console.warn('Deprecated use of _flat, please use L.LineUtil.isFlat instead.'); + return isFlat(latlngs); + } + + var LineUtil = ({ + simplify: simplify, + pointToSegmentDistance: pointToSegmentDistance, + closestPointOnSegment: closestPointOnSegment, + clipSegment: clipSegment, + _getEdgeIntersection: _getEdgeIntersection, + _getBitCode: _getBitCode, + _sqClosestPointOnSegment: _sqClosestPointOnSegment, + isFlat: isFlat, + _flat: _flat + }); + + /* + * @namespace PolyUtil + * Various utility functions for polygon geometries. + */ + + /* @function clipPolygon(points: Point[], bounds: Bounds, round?: Boolean): Point[] + * Clips the polygon geometry defined by the given `points` by the given bounds (using the [Sutherland-Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm)). + * Used by Leaflet to only show polygon points that are on the screen or near, increasing + * performance. Note that polygon points needs different algorithm for clipping + * than polyline, so there's a separate method for it. + */ + function clipPolygon(points, bounds, round) { + var clippedPoints, + edges = [1, 4, 2, 8], + i, j, k, + a, b, + len, edge, p; + + for (i = 0, len = points.length; i < len; i++) { + points[i]._code = _getBitCode(points[i], bounds); + } + + // for each edge (left, bottom, right, top) + for (k = 0; k < 4; k++) { + edge = edges[k]; + clippedPoints = []; + + for (i = 0, len = points.length, j = len - 1; i < len; j = i++) { + a = points[i]; + b = points[j]; + + // if a is inside the clip window + if (!(a._code & edge)) { + // if b is outside the clip window (a->b goes out of screen) + if (b._code & edge) { + p = _getEdgeIntersection(b, a, edge, bounds, round); + p._code = _getBitCode(p, bounds); + clippedPoints.push(p); + } + clippedPoints.push(a); + + // else if b is inside the clip window (a->b enters the screen) + } else if (!(b._code & edge)) { + p = _getEdgeIntersection(b, a, edge, bounds, round); + p._code = _getBitCode(p, bounds); + clippedPoints.push(p); + } + } + points = clippedPoints; + } + + return points; + } + + var PolyUtil = ({ + clipPolygon: clipPolygon + }); + + /* + * @namespace Projection + * @section + * Leaflet comes with a set of already defined Projections out of the box: + * + * @projection L.Projection.LonLat + * + * Equirectangular, or Plate Carree projection — the most simple projection, + * mostly used by GIS enthusiasts. Directly maps `x` as longitude, and `y` as + * latitude. Also suitable for flat worlds, e.g. game maps. Used by the + * `EPSG:4326` and `Simple` CRS. + */ + + var LonLat = { + project: function (latlng) { + return new Point(latlng.lng, latlng.lat); + }, + + unproject: function (point) { + return new LatLng(point.y, point.x); + }, + + bounds: new Bounds([-180, -90], [180, 90]) + }; + + /* + * @namespace Projection + * @projection L.Projection.Mercator + * + * Elliptical Mercator projection — more complex than Spherical Mercator. Assumes that Earth is an ellipsoid. Used by the EPSG:3395 CRS. + */ + + var Mercator = { + R: 6378137, + R_MINOR: 6356752.314245179, + + bounds: new Bounds([-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]), + + project: function (latlng) { + var d = Math.PI / 180, + r = this.R, + y = latlng.lat * d, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + con = e * Math.sin(y); + + var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2); + y = -r * Math.log(Math.max(ts, 1E-10)); + + return new Point(latlng.lng * d * r, y); + }, + + unproject: function (point) { + var d = 180 / Math.PI, + r = this.R, + tmp = this.R_MINOR / r, + e = Math.sqrt(1 - tmp * tmp), + ts = Math.exp(-point.y / r), + phi = Math.PI / 2 - 2 * Math.atan(ts); + + for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) { + con = e * Math.sin(phi); + con = Math.pow((1 - con) / (1 + con), e / 2); + dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi; + phi += dphi; + } + + return new LatLng(phi * d, point.x * d / r); + } + }; + + /* + * @class Projection + + * An object with methods for projecting geographical coordinates of the world onto + * a flat surface (and back). See [Map projection](http://en.wikipedia.org/wiki/Map_projection). + + * @property bounds: Bounds + * The bounds (specified in CRS units) where the projection is valid + + * @method project(latlng: LatLng): Point + * Projects geographical coordinates into a 2D point. + * Only accepts actual `L.LatLng` instances, not arrays. + + * @method unproject(point: Point): LatLng + * The inverse of `project`. Projects a 2D point into a geographical location. + * Only accepts actual `L.Point` instances, not arrays. + + * Note that the projection instances do not inherit from Leaflet's `Class` object, + * and can't be instantiated. Also, new classes can't inherit from them, + * and methods can't be added to them with the `include` function. + + */ + + var index = ({ + LonLat: LonLat, + Mercator: Mercator, + SphericalMercator: SphericalMercator + }); + + /* + * @namespace CRS + * @crs L.CRS.EPSG3395 + * + * Rarely used by some commercial tile providers. Uses Elliptical Mercator projection. + */ + var EPSG3395 = extend({}, Earth, { + code: 'EPSG:3395', + projection: Mercator, + + transformation: (function () { + var scale = 0.5 / (Math.PI * Mercator.R); + return toTransformation(scale, 0.5, -scale, 0.5); + }()) + }); + + /* + * @namespace CRS + * @crs L.CRS.EPSG4326 + * + * A common CRS among GIS enthusiasts. Uses simple Equirectangular projection. + * + * Leaflet 1.0.x complies with the [TMS coordinate scheme for EPSG:4326](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#global-geodetic), + * which is a breaking change from 0.7.x behaviour. If you are using a `TileLayer` + * with this CRS, ensure that there are two 256x256 pixel tiles covering the + * whole earth at zoom level zero, and that the tile coordinate origin is (-180,+90), + * or (-180,-90) for `TileLayer`s with [the `tms` option](#tilelayer-tms) set. + */ + + var EPSG4326 = extend({}, Earth, { + code: 'EPSG:4326', + projection: LonLat, + transformation: toTransformation(1 / 180, 1, -1 / 180, 0.5) + }); + + /* + * @namespace CRS + * @crs L.CRS.Simple + * + * A simple CRS that maps longitude and latitude into `x` and `y` directly. + * May be used for maps of flat surfaces (e.g. game maps). Note that the `y` + * axis should still be inverted (going from bottom to top). `distance()` returns + * simple euclidean distance. + */ + + var Simple = extend({}, CRS, { + projection: LonLat, + transformation: toTransformation(1, 0, -1, 0), + + scale: function (zoom) { + return Math.pow(2, zoom); + }, + + zoom: function (scale) { + return Math.log(scale) / Math.LN2; + }, + + distance: function (latlng1, latlng2) { + var dx = latlng2.lng - latlng1.lng, + dy = latlng2.lat - latlng1.lat; + + return Math.sqrt(dx * dx + dy * dy); + }, + + infinite: true + }); + + CRS.Earth = Earth; + CRS.EPSG3395 = EPSG3395; + CRS.EPSG3857 = EPSG3857; + CRS.EPSG900913 = EPSG900913; + CRS.EPSG4326 = EPSG4326; + CRS.Simple = Simple; + + /* + * @class Layer + * @inherits Evented + * @aka L.Layer + * @aka ILayer + * + * A set of methods from the Layer base class that all Leaflet layers use. + * Inherits all methods, options and events from `L.Evented`. + * + * @example + * + * ```js + * var layer = L.marker(latlng).addTo(map); + * layer.addTo(map); + * layer.remove(); + * ``` + * + * @event add: Event + * Fired after the layer is added to a map + * + * @event remove: Event + * Fired after the layer is removed from a map + */ + + + var Layer = Evented.extend({ + + // Classes extending `L.Layer` will inherit the following options: + options: { + // @option pane: String = 'overlayPane' + // By default the layer will be added to the map's [overlay pane](#map-overlaypane). Overriding this option will cause the layer to be placed on another pane by default. + pane: 'overlayPane', + + // @option attribution: String = null + // String to be shown in the attribution control, e.g. "© OpenStreetMap contributors". It describes the layer data and is often a legal obligation towards copyright holders and tile providers. + attribution: null, + + bubblingMouseEvents: true + }, + + /* @section + * Classes extending `L.Layer` will inherit the following methods: + * + * @method addTo(map: Map|LayerGroup): this + * Adds the layer to the given map or layer group. + */ + addTo: function (map) { + map.addLayer(this); + return this; + }, + + // @method remove: this + // Removes the layer from the map it is currently active on. + remove: function () { + return this.removeFrom(this._map || this._mapToAdd); + }, + + // @method removeFrom(map: Map): this + // Removes the layer from the given map + // + // @alternative + // @method removeFrom(group: LayerGroup): this + // Removes the layer from the given `LayerGroup` + removeFrom: function (obj) { + if (obj) { + obj.removeLayer(this); + } + return this; + }, + + // @method getPane(name? : String): HTMLElement + // Returns the `HTMLElement` representing the named pane on the map. If `name` is omitted, returns the pane for this layer. + getPane: function (name) { + return this._map.getPane(name ? (this.options[name] || name) : this.options.pane); + }, + + addInteractiveTarget: function (targetEl) { + this._map._targets[stamp(targetEl)] = this; + return this; + }, + + removeInteractiveTarget: function (targetEl) { + delete this._map._targets[stamp(targetEl)]; + return this; + }, + + // @method getAttribution: String + // Used by the `attribution control`, returns the [attribution option](#gridlayer-attribution). + getAttribution: function () { + return this.options.attribution; + }, + + _layerAdd: function (e) { + var map = e.target; + + // check in case layer gets added and then removed before the map is ready + if (!map.hasLayer(this)) { return; } + + this._map = map; + this._zoomAnimated = map._zoomAnimated; + + if (this.getEvents) { + var events = this.getEvents(); + map.on(events, this); + this.once('remove', function () { + map.off(events, this); + }, this); + } + + this.onAdd(map); + + if (this.getAttribution && map.attributionControl) { + map.attributionControl.addAttribution(this.getAttribution()); + } + + this.fire('add'); + map.fire('layeradd', {layer: this}); + } + }); + + /* @section Extension methods + * @uninheritable + * + * Every layer should extend from `L.Layer` and (re-)implement the following methods. + * + * @method onAdd(map: Map): this + * Should contain code that creates DOM elements for the layer, adds them to `map panes` where they should belong and puts listeners on relevant map events. Called on [`map.addLayer(layer)`](#map-addlayer). + * + * @method onRemove(map: Map): this + * Should contain all clean up code that removes the layer's elements from the DOM and removes listeners previously added in [`onAdd`](#layer-onadd). Called on [`map.removeLayer(layer)`](#map-removelayer). + * + * @method getEvents(): Object + * This optional method should return an object like `{ viewreset: this._reset }` for [`addEventListener`](#evented-addeventlistener). The event handlers in this object will be automatically added and removed from the map with your layer. + * + * @method getAttribution(): String + * This optional method should return a string containing HTML to be shown on the `Attribution control` whenever the layer is visible. + * + * @method beforeAdd(map: Map): this + * Optional method. Called on [`map.addLayer(layer)`](#map-addlayer), before the layer is added to the map, before events are initialized, without waiting until the map is in a usable state. Use for early initialization only. + */ + + + /* @namespace Map + * @section Layer events + * + * @event layeradd: LayerEvent + * Fired when a new layer is added to the map. + * + * @event layerremove: LayerEvent + * Fired when some layer is removed from the map + * + * @section Methods for Layers and Controls + */ + Map.include({ + // @method addLayer(layer: Layer): this + // Adds the given layer to the map + addLayer: function (layer) { + if (!layer._layerAdd) { + throw new Error('The provided object is not a Layer.'); + } + + var id = stamp(layer); + if (this._layers[id]) { return this; } + this._layers[id] = layer; + + layer._mapToAdd = this; + + if (layer.beforeAdd) { + layer.beforeAdd(this); + } + + this.whenReady(layer._layerAdd, layer); + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the map. + removeLayer: function (layer) { + var id = stamp(layer); + + if (!this._layers[id]) { return this; } + + if (this._loaded) { + layer.onRemove(this); + } + + if (layer.getAttribution && this.attributionControl) { + this.attributionControl.removeAttribution(layer.getAttribution()); + } + + delete this._layers[id]; + + if (this._loaded) { + this.fire('layerremove', {layer: layer}); + layer.fire('remove'); + } + + layer._map = layer._mapToAdd = null; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the map + hasLayer: function (layer) { + return !!layer && (stamp(layer) in this._layers); + }, + + /* @method eachLayer(fn: Function, context?: Object): this + * Iterates over the layers of the map, optionally specifying context of the iterator function. + * ``` + * map.eachLayer(function(layer){ + * layer.bindPopup('Hello'); + * }); + * ``` + */ + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + _addLayers: function (layers) { + layers = layers ? (isArray(layers) ? layers : [layers]) : []; + + for (var i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + }, + + _addZoomLimit: function (layer) { + if (isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom)) { + this._zoomBoundLayers[stamp(layer)] = layer; + this._updateZoomLevels(); + } + }, + + _removeZoomLimit: function (layer) { + var id = stamp(layer); + + if (this._zoomBoundLayers[id]) { + delete this._zoomBoundLayers[id]; + this._updateZoomLevels(); + } + }, + + _updateZoomLevels: function () { + var minZoom = Infinity, + maxZoom = -Infinity, + oldZoomSpan = this._getZoomSpan(); + + for (var i in this._zoomBoundLayers) { + var options = this._zoomBoundLayers[i].options; + + minZoom = options.minZoom === undefined ? minZoom : Math.min(minZoom, options.minZoom); + maxZoom = options.maxZoom === undefined ? maxZoom : Math.max(maxZoom, options.maxZoom); + } + + this._layersMaxZoom = maxZoom === -Infinity ? undefined : maxZoom; + this._layersMinZoom = minZoom === Infinity ? undefined : minZoom; + + // @section Map state change events + // @event zoomlevelschange: Event + // Fired when the number of zoomlevels on the map is changed due + // to adding or removing a layer. + if (oldZoomSpan !== this._getZoomSpan()) { + this.fire('zoomlevelschange'); + } + + if (this.options.maxZoom === undefined && this._layersMaxZoom && this.getZoom() > this._layersMaxZoom) { + this.setZoom(this._layersMaxZoom); + } + if (this.options.minZoom === undefined && this._layersMinZoom && this.getZoom() < this._layersMinZoom) { + this.setZoom(this._layersMinZoom); + } + } + }); + + /* + * @class LayerGroup + * @aka L.LayerGroup + * @inherits Layer + * + * Used to group several layers and handle them as one. If you add it to the map, + * any layers added or removed from the group will be added/removed on the map as + * well. Extends `Layer`. + * + * @example + * + * ```js + * L.layerGroup([marker1, marker2]) + * .addLayer(polyline) + * .addTo(map); + * ``` + */ + + var LayerGroup = Layer.extend({ + + initialize: function (layers, options) { + setOptions(this, options); + + this._layers = {}; + + var i, len; + + if (layers) { + for (i = 0, len = layers.length; i < len; i++) { + this.addLayer(layers[i]); + } + } + }, + + // @method addLayer(layer: Layer): this + // Adds the given layer to the group. + addLayer: function (layer) { + var id = this.getLayerId(layer); + + this._layers[id] = layer; + + if (this._map) { + this._map.addLayer(layer); + } + + return this; + }, + + // @method removeLayer(layer: Layer): this + // Removes the given layer from the group. + // @alternative + // @method removeLayer(id: Number): this + // Removes the layer with the given internal ID from the group. + removeLayer: function (layer) { + var id = layer in this._layers ? layer : this.getLayerId(layer); + + if (this._map && this._layers[id]) { + this._map.removeLayer(this._layers[id]); + } + + delete this._layers[id]; + + return this; + }, + + // @method hasLayer(layer: Layer): Boolean + // Returns `true` if the given layer is currently added to the group. + // @alternative + // @method hasLayer(id: Number): Boolean + // Returns `true` if the given internal ID is currently added to the group. + hasLayer: function (layer) { + if (!layer) { return false; } + var layerId = typeof layer === 'number' ? layer : this.getLayerId(layer); + return layerId in this._layers; + }, + + // @method clearLayers(): this + // Removes all the layers from the group. + clearLayers: function () { + return this.eachLayer(this.removeLayer, this); + }, + + // @method invoke(methodName: String, …): this + // Calls `methodName` on every layer contained in this group, passing any + // additional parameters. Has no effect if the layers contained do not + // implement `methodName`. + invoke: function (methodName) { + var args = Array.prototype.slice.call(arguments, 1), + i, layer; + + for (i in this._layers) { + layer = this._layers[i]; + + if (layer[methodName]) { + layer[methodName].apply(layer, args); + } + } + + return this; + }, + + onAdd: function (map) { + this.eachLayer(map.addLayer, map); + }, + + onRemove: function (map) { + this.eachLayer(map.removeLayer, map); + }, + + // @method eachLayer(fn: Function, context?: Object): this + // Iterates over the layers of the group, optionally specifying context of the iterator function. + // ```js + // group.eachLayer(function (layer) { + // layer.bindPopup('Hello'); + // }); + // ``` + eachLayer: function (method, context) { + for (var i in this._layers) { + method.call(context, this._layers[i]); + } + return this; + }, + + // @method getLayer(id: Number): Layer + // Returns the layer with the given internal ID. + getLayer: function (id) { + return this._layers[id]; + }, + + // @method getLayers(): Layer[] + // Returns an array of all the layers added to the group. + getLayers: function () { + var layers = []; + this.eachLayer(layers.push, layers); + return layers; + }, + + // @method setZIndex(zIndex: Number): this + // Calls `setZIndex` on every layer contained in this group, passing the z-index. + setZIndex: function (zIndex) { + return this.invoke('setZIndex', zIndex); + }, + + // @method getLayerId(layer: Layer): Number + // Returns the internal ID for a layer + getLayerId: function (layer) { + return stamp(layer); + } + }); + + + // @factory L.layerGroup(layers?: Layer[], options?: Object) + // Create a layer group, optionally given an initial set of layers and an `options` object. + var layerGroup = function (layers, options) { + return new LayerGroup(layers, options); + }; + + /* + * @class FeatureGroup + * @aka L.FeatureGroup + * @inherits LayerGroup + * + * Extended `LayerGroup` that makes it easier to do the same thing to all its member layers: + * * [`bindPopup`](#layer-bindpopup) binds a popup to all of the layers at once (likewise with [`bindTooltip`](#layer-bindtooltip)) + * * Events are propagated to the `FeatureGroup`, so if the group has an event + * handler, it will handle events from any of the layers. This includes mouse events + * and custom events. + * * Has `layeradd` and `layerremove` events + * + * @example + * + * ```js + * L.featureGroup([marker1, marker2, polyline]) + * .bindPopup('Hello world!') + * .on('click', function() { alert('Clicked on a member of the group!'); }) + * .addTo(map); + * ``` + */ + + var FeatureGroup = LayerGroup.extend({ + + addLayer: function (layer) { + if (this.hasLayer(layer)) { + return this; + } + + layer.addEventParent(this); + + LayerGroup.prototype.addLayer.call(this, layer); + + // @event layeradd: LayerEvent + // Fired when a layer is added to this `FeatureGroup` + return this.fire('layeradd', {layer: layer}); + }, + + removeLayer: function (layer) { + if (!this.hasLayer(layer)) { + return this; + } + if (layer in this._layers) { + layer = this._layers[layer]; + } + + layer.removeEventParent(this); + + LayerGroup.prototype.removeLayer.call(this, layer); + + // @event layerremove: LayerEvent + // Fired when a layer is removed from this `FeatureGroup` + return this.fire('layerremove', {layer: layer}); + }, + + // @method setStyle(style: Path options): this + // Sets the given path options to each layer of the group that has a `setStyle` method. + setStyle: function (style) { + return this.invoke('setStyle', style); + }, + + // @method bringToFront(): this + // Brings the layer group to the top of all other layers + bringToFront: function () { + return this.invoke('bringToFront'); + }, + + // @method bringToBack(): this + // Brings the layer group to the back of all other layers + bringToBack: function () { + return this.invoke('bringToBack'); + }, + + // @method getBounds(): LatLngBounds + // Returns the LatLngBounds of the Feature Group (created from bounds and coordinates of its children). + getBounds: function () { + var bounds = new LatLngBounds(); + + for (var id in this._layers) { + var layer = this._layers[id]; + bounds.extend(layer.getBounds ? layer.getBounds() : layer.getLatLng()); + } + return bounds; + } + }); + + // @factory L.featureGroup(layers?: Layer[], options?: Object) + // Create a feature group, optionally given an initial set of layers and an `options` object. + var featureGroup = function (layers, options) { + return new FeatureGroup(layers, options); + }; + + /* + * @class Icon + * @aka L.Icon + * + * Represents an icon to provide when creating a marker. + * + * @example + * + * ```js + * var myIcon = L.icon({ + * iconUrl: 'my-icon.png', + * iconRetinaUrl: 'my-icon@2x.png', + * iconSize: [38, 95], + * iconAnchor: [22, 94], + * popupAnchor: [-3, -76], + * shadowUrl: 'my-icon-shadow.png', + * shadowRetinaUrl: 'my-icon-shadow@2x.png', + * shadowSize: [68, 95], + * shadowAnchor: [22, 94] + * }); + * + * L.marker([50.505, 30.57], {icon: myIcon}).addTo(map); + * ``` + * + * `L.Icon.Default` extends `L.Icon` and is the blue icon Leaflet uses for markers by default. + * + */ + + var Icon = Class.extend({ + + /* @section + * @aka Icon options + * + * @option iconUrl: String = null + * **(required)** The URL to the icon image (absolute or relative to your script path). + * + * @option iconRetinaUrl: String = null + * The URL to a retina sized version of the icon image (absolute or relative to your + * script path). Used for Retina screen devices. + * + * @option iconSize: Point = null + * Size of the icon image in pixels. + * + * @option iconAnchor: Point = null + * The coordinates of the "tip" of the icon (relative to its top left corner). The icon + * will be aligned so that this point is at the marker's geographical location. Centered + * by default if size is specified, also can be set in CSS with negative margins. + * + * @option popupAnchor: Point = [0, 0] + * The coordinates of the point from which popups will "open", relative to the icon anchor. + * + * @option tooltipAnchor: Point = [0, 0] + * The coordinates of the point from which tooltips will "open", relative to the icon anchor. + * + * @option shadowUrl: String = null + * The URL to the icon shadow image. If not specified, no shadow image will be created. + * + * @option shadowRetinaUrl: String = null + * + * @option shadowSize: Point = null + * Size of the shadow image in pixels. + * + * @option shadowAnchor: Point = null + * The coordinates of the "tip" of the shadow (relative to its top left corner) (the same + * as iconAnchor if not specified). + * + * @option className: String = '' + * A custom class name to assign to both icon and shadow images. Empty by default. + */ + + options: { + popupAnchor: [0, 0], + tooltipAnchor: [0, 0] + }, + + initialize: function (options) { + setOptions(this, options); + }, + + // @method createIcon(oldIcon?: HTMLElement): HTMLElement + // Called internally when the icon has to be shown, returns a `` HTML element + // styled according to the options. + createIcon: function (oldIcon) { + return this._createIcon('icon', oldIcon); + }, + + // @method createShadow(oldIcon?: HTMLElement): HTMLElement + // As `createIcon`, but for the shadow beneath it. + createShadow: function (oldIcon) { + return this._createIcon('shadow', oldIcon); + }, + + _createIcon: function (name, oldIcon) { + var src = this._getIconUrl(name); + + if (!src) { + if (name === 'icon') { + throw new Error('iconUrl not set in Icon options (see the docs).'); + } + return null; + } + + var img = this._createImg(src, oldIcon && oldIcon.tagName === 'IMG' ? oldIcon : null); + this._setIconStyles(img, name); + + return img; + }, + + _setIconStyles: function (img, name) { + var options = this.options; + var sizeOption = options[name + 'Size']; + + if (typeof sizeOption === 'number') { + sizeOption = [sizeOption, sizeOption]; + } + + var size = toPoint(sizeOption), + anchor = toPoint(name === 'shadow' && options.shadowAnchor || options.iconAnchor || + size && size.divideBy(2, true)); + + img.className = 'leaflet-marker-' + name + ' ' + (options.className || ''); + + if (anchor) { + img.style.marginLeft = (-anchor.x) + 'px'; + img.style.marginTop = (-anchor.y) + 'px'; + } + + if (size) { + img.style.width = size.x + 'px'; + img.style.height = size.y + 'px'; + } + }, + + _createImg: function (src, el) { + el = el || document.createElement('img'); + el.src = src; + return el; + }, + + _getIconUrl: function (name) { + return retina && this.options[name + 'RetinaUrl'] || this.options[name + 'Url']; + } + }); + + + // @factory L.icon(options: Icon options) + // Creates an icon instance with the given options. + function icon(options) { + return new Icon(options); + } + + /* + * @miniclass Icon.Default (Icon) + * @aka L.Icon.Default + * @section + * + * A trivial subclass of `Icon`, represents the icon to use in `Marker`s when + * no icon is specified. Points to the blue marker image distributed with Leaflet + * releases. + * + * In order to customize the default icon, just change the properties of `L.Icon.Default.prototype.options` + * (which is a set of `Icon options`). + * + * If you want to _completely_ replace the default icon, override the + * `L.Marker.prototype.options.icon` with your own icon instead. + */ + + var IconDefault = Icon.extend({ + + options: { + iconUrl: 'marker-icon.png', + iconRetinaUrl: 'marker-icon-2x.png', + shadowUrl: 'marker-shadow.png', + iconSize: [25, 41], + iconAnchor: [12, 41], + popupAnchor: [1, -34], + tooltipAnchor: [16, -28], + shadowSize: [41, 41] + }, + + _getIconUrl: function (name) { + if (!IconDefault.imagePath) { // Deprecated, backwards-compatibility only + IconDefault.imagePath = this._detectIconPath(); + } + + // @option imagePath: String + // `Icon.Default` will try to auto-detect the location of the + // blue icon images. If you are placing these images in a non-standard + // way, set this option to point to the right path. + return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name); + }, + + _detectIconPath: function () { + var el = create$1('div', 'leaflet-default-icon-path', document.body); + var path = getStyle(el, 'background-image') || + getStyle(el, 'backgroundImage'); // IE8 + + document.body.removeChild(el); + + if (path === null || path.indexOf('url') !== 0) { + path = ''; + } else { + path = path.replace(/^url\(["']?/, '').replace(/marker-icon\.png["']?\)$/, ''); + } + + return path; + } + }); + + /* + * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable. + */ + + + /* @namespace Marker + * @section Interaction handlers + * + * Interaction handlers are properties of a marker instance that allow you to control interaction behavior in runtime, enabling or disabling certain features such as dragging (see `Handler` methods). Example: + * + * ```js + * marker.dragging.disable(); + * ``` + * + * @property dragging: Handler + * Marker dragging handler (by both mouse and touch). Only valid when the marker is on the map (Otherwise set [`marker.options.draggable`](#marker-draggable)). + */ + + var MarkerDrag = Handler.extend({ + initialize: function (marker) { + this._marker = marker; + }, + + addHooks: function () { + var icon = this._marker._icon; + + if (!this._draggable) { + this._draggable = new Draggable(icon, icon, true); + } + + this._draggable.on({ + dragstart: this._onDragStart, + predrag: this._onPreDrag, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).enable(); + + addClass(icon, 'leaflet-marker-draggable'); + }, + + removeHooks: function () { + this._draggable.off({ + dragstart: this._onDragStart, + predrag: this._onPreDrag, + drag: this._onDrag, + dragend: this._onDragEnd + }, this).disable(); + + if (this._marker._icon) { + removeClass(this._marker._icon, 'leaflet-marker-draggable'); + } + }, + + moved: function () { + return this._draggable && this._draggable._moved; + }, + + _adjustPan: function (e) { + var marker = this._marker, + map = marker._map, + speed = this._marker.options.autoPanSpeed, + padding = this._marker.options.autoPanPadding, + iconPos = getPosition(marker._icon), + bounds = map.getPixelBounds(), + origin = map.getPixelOrigin(); + + var panBounds = toBounds( + bounds.min._subtract(origin).add(padding), + bounds.max._subtract(origin).subtract(padding) + ); + + if (!panBounds.contains(iconPos)) { + // Compute incremental movement + var movement = toPoint( + (Math.max(panBounds.max.x, iconPos.x) - panBounds.max.x) / (bounds.max.x - panBounds.max.x) - + (Math.min(panBounds.min.x, iconPos.x) - panBounds.min.x) / (bounds.min.x - panBounds.min.x), + + (Math.max(panBounds.max.y, iconPos.y) - panBounds.max.y) / (bounds.max.y - panBounds.max.y) - + (Math.min(panBounds.min.y, iconPos.y) - panBounds.min.y) / (bounds.min.y - panBounds.min.y) + ).multiplyBy(speed); + + map.panBy(movement, {animate: false}); + + this._draggable._newPos._add(movement); + this._draggable._startPos._add(movement); + + setPosition(marker._icon, this._draggable._newPos); + this._onDrag(e); + + this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e)); + } + }, + + _onDragStart: function () { + // @section Dragging events + // @event dragstart: Event + // Fired when the user starts dragging the marker. + + // @event movestart: Event + // Fired when the marker starts moving (because of dragging). + + this._oldLatLng = this._marker.getLatLng(); + + // When using ES6 imports it could not be set when `Popup` was not imported as well + this._marker.closePopup && this._marker.closePopup(); + + this._marker + .fire('movestart') + .fire('dragstart'); + }, + + _onPreDrag: function (e) { + if (this._marker.options.autoPan) { + cancelAnimFrame(this._panRequest); + this._panRequest = requestAnimFrame(this._adjustPan.bind(this, e)); + } + }, + + _onDrag: function (e) { + var marker = this._marker, + shadow = marker._shadow, + iconPos = getPosition(marker._icon), + latlng = marker._map.layerPointToLatLng(iconPos); + + // update shadow position + if (shadow) { + setPosition(shadow, iconPos); + } + + marker._latlng = latlng; + e.latlng = latlng; + e.oldLatLng = this._oldLatLng; + + // @event drag: Event + // Fired repeatedly while the user drags the marker. + marker + .fire('move', e) + .fire('drag', e); + }, + + _onDragEnd: function (e) { + // @event dragend: DragEndEvent + // Fired when the user stops dragging the marker. + + cancelAnimFrame(this._panRequest); + + // @event moveend: Event + // Fired when the marker stops moving (because of dragging). + delete this._oldLatLng; + this._marker + .fire('moveend') + .fire('dragend', e); + } + }); + + /* + * @class Marker + * @inherits Interactive layer + * @aka L.Marker + * L.Marker is used to display clickable/draggable icons on the map. Extends `Layer`. + * + * @example + * + * ```js + * L.marker([50.5, 30.5]).addTo(map); + * ``` + */ + + var Marker = Layer.extend({ + + // @section + // @aka Marker options + options: { + // @option icon: Icon = * + // Icon instance to use for rendering the marker. + // See [Icon documentation](#L.Icon) for details on how to customize the marker icon. + // If not specified, a common instance of `L.Icon.Default` is used. + icon: new IconDefault(), + + // Option inherited from "Interactive layer" abstract class + interactive: true, + + // @option keyboard: Boolean = true + // Whether the marker can be tabbed to with a keyboard and clicked by pressing enter. + keyboard: true, + + // @option title: String = '' + // Text for the browser tooltip that appear on marker hover (no tooltip by default). + title: '', + + // @option alt: String = '' + // Text for the `alt` attribute of the icon image (useful for accessibility). + alt: '', + + // @option zIndexOffset: Number = 0 + // By default, marker images zIndex is set automatically based on its latitude. Use this option if you want to put the marker on top of all others (or below), specifying a high value like `1000` (or high negative value, respectively). + zIndexOffset: 0, + + // @option opacity: Number = 1.0 + // The opacity of the marker. + opacity: 1, + + // @option riseOnHover: Boolean = false + // If `true`, the marker will get on top of others when you hover the mouse over it. + riseOnHover: false, + + // @option riseOffset: Number = 250 + // The z-index offset used for the `riseOnHover` feature. + riseOffset: 250, + + // @option pane: String = 'markerPane' + // `Map pane` where the markers icon will be added. + pane: 'markerPane', + + // @option shadowPane: String = 'shadowPane' + // `Map pane` where the markers shadow will be added. + shadowPane: 'shadowPane', + + // @option bubblingMouseEvents: Boolean = false + // When `true`, a mouse event on this marker will trigger the same event on the map + // (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used). + bubblingMouseEvents: false, + + // @section Draggable marker options + // @option draggable: Boolean = false + // Whether the marker is draggable with mouse/touch or not. + draggable: false, + + // @option autoPan: Boolean = false + // Whether to pan the map when dragging this marker near its edge or not. + autoPan: false, + + // @option autoPanPadding: Point = Point(50, 50) + // Distance (in pixels to the left/right and to the top/bottom) of the + // map edge to start panning the map. + autoPanPadding: [50, 50], + + // @option autoPanSpeed: Number = 10 + // Number of pixels the map should pan by. + autoPanSpeed: 10 + }, + + /* @section + * + * In addition to [shared layer methods](#Layer) like `addTo()` and `remove()` and [popup methods](#Popup) like bindPopup() you can also use the following methods: + */ + + initialize: function (latlng, options) { + setOptions(this, options); + this._latlng = toLatLng(latlng); + }, + + onAdd: function (map) { + this._zoomAnimated = this._zoomAnimated && map.options.markerZoomAnimation; + + if (this._zoomAnimated) { + map.on('zoomanim', this._animateZoom, this); + } + + this._initIcon(); + this.update(); + }, + + onRemove: function (map) { + if (this.dragging && this.dragging.enabled()) { + this.options.draggable = true; + this.dragging.removeHooks(); + } + delete this.dragging; + + if (this._zoomAnimated) { + map.off('zoomanim', this._animateZoom, this); + } + + this._removeIcon(); + this._removeShadow(); + }, + + getEvents: function () { + return { + zoom: this.update, + viewreset: this.update + }; + }, + + // @method getLatLng: LatLng + // Returns the current geographical position of the marker. + getLatLng: function () { + return this._latlng; + }, + + // @method setLatLng(latlng: LatLng): this + // Changes the marker position to the given point. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = toLatLng(latlng); + this.update(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#marker-setlatlng) or by [dragging](#marker-dragging). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); + }, + + // @method setZIndexOffset(offset: Number): this + // Changes the [zIndex offset](#marker-zindexoffset) of the marker. + setZIndexOffset: function (offset) { + this.options.zIndexOffset = offset; + return this.update(); + }, + + // @method getIcon: Icon + // Returns the current icon used by the marker + getIcon: function () { + return this.options.icon; + }, + + // @method setIcon(icon: Icon): this + // Changes the marker icon. + setIcon: function (icon) { + + this.options.icon = icon; + + if (this._map) { + this._initIcon(); + this.update(); + } + + if (this._popup) { + this.bindPopup(this._popup, this._popup.options); + } + + return this; + }, + + getElement: function () { + return this._icon; + }, + + update: function () { + + if (this._icon && this._map) { + var pos = this._map.latLngToLayerPoint(this._latlng).round(); + this._setPos(pos); + } + + return this; + }, + + _initIcon: function () { + var options = this.options, + classToAdd = 'leaflet-zoom-' + (this._zoomAnimated ? 'animated' : 'hide'); + + var icon = options.icon.createIcon(this._icon), + addIcon = false; + + // if we're not reusing the icon, remove the old one and init new one + if (icon !== this._icon) { + if (this._icon) { + this._removeIcon(); + } + addIcon = true; + + if (options.title) { + icon.title = options.title; + } + + if (icon.tagName === 'IMG') { + icon.alt = options.alt || ''; + } + } + + addClass(icon, classToAdd); + + if (options.keyboard) { + icon.tabIndex = '0'; + } + + this._icon = icon; + + if (options.riseOnHover) { + this.on({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + var newShadow = options.icon.createShadow(this._shadow), + addShadow = false; + + if (newShadow !== this._shadow) { + this._removeShadow(); + addShadow = true; + } + + if (newShadow) { + addClass(newShadow, classToAdd); + newShadow.alt = ''; + } + this._shadow = newShadow; + + + if (options.opacity < 1) { + this._updateOpacity(); + } + + + if (addIcon) { + this.getPane().appendChild(this._icon); + } + this._initInteraction(); + if (newShadow && addShadow) { + this.getPane(options.shadowPane).appendChild(this._shadow); + } + }, + + _removeIcon: function () { + if (this.options.riseOnHover) { + this.off({ + mouseover: this._bringToFront, + mouseout: this._resetZIndex + }); + } + + remove(this._icon); + this.removeInteractiveTarget(this._icon); + + this._icon = null; + }, + + _removeShadow: function () { + if (this._shadow) { + remove(this._shadow); + } + this._shadow = null; + }, + + _setPos: function (pos) { + + if (this._icon) { + setPosition(this._icon, pos); + } + + if (this._shadow) { + setPosition(this._shadow, pos); + } + + this._zIndex = pos.y + this.options.zIndexOffset; + + this._resetZIndex(); + }, + + _updateZIndex: function (offset) { + if (this._icon) { + this._icon.style.zIndex = this._zIndex + offset; + } + }, + + _animateZoom: function (opt) { + var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round(); + + this._setPos(pos); + }, + + _initInteraction: function () { + + if (!this.options.interactive) { return; } + + addClass(this._icon, 'leaflet-interactive'); + + this.addInteractiveTarget(this._icon); + + if (MarkerDrag) { + var draggable = this.options.draggable; + if (this.dragging) { + draggable = this.dragging.enabled(); + this.dragging.disable(); + } + + this.dragging = new MarkerDrag(this); + + if (draggable) { + this.dragging.enable(); + } + } + }, + + // @method setOpacity(opacity: Number): this + // Changes the opacity of the marker. + setOpacity: function (opacity) { + this.options.opacity = opacity; + if (this._map) { + this._updateOpacity(); + } + + return this; + }, + + _updateOpacity: function () { + var opacity = this.options.opacity; + + if (this._icon) { + setOpacity(this._icon, opacity); + } + + if (this._shadow) { + setOpacity(this._shadow, opacity); + } + }, + + _bringToFront: function () { + this._updateZIndex(this.options.riseOffset); + }, + + _resetZIndex: function () { + this._updateZIndex(0); + }, + + _getPopupAnchor: function () { + return this.options.icon.options.popupAnchor; + }, + + _getTooltipAnchor: function () { + return this.options.icon.options.tooltipAnchor; + } + }); + + + // factory L.marker(latlng: LatLng, options? : Marker options) + + // @factory L.marker(latlng: LatLng, options? : Marker options) + // Instantiates a Marker object given a geographical point and optionally an options object. + function marker(latlng, options) { + return new Marker(latlng, options); + } + + /* + * @class Path + * @aka L.Path + * @inherits Interactive layer + * + * An abstract class that contains options and constants shared between vector + * overlays (Polygon, Polyline, Circle). Do not use it directly. Extends `Layer`. + */ + + var Path = Layer.extend({ + + // @section + // @aka Path options + options: { + // @option stroke: Boolean = true + // Whether to draw stroke along the path. Set it to `false` to disable borders on polygons or circles. + stroke: true, + + // @option color: String = '#3388ff' + // Stroke color + color: '#3388ff', + + // @option weight: Number = 3 + // Stroke width in pixels + weight: 3, + + // @option opacity: Number = 1.0 + // Stroke opacity + opacity: 1, + + // @option lineCap: String= 'round' + // A string that defines [shape to be used at the end](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linecap) of the stroke. + lineCap: 'round', + + // @option lineJoin: String = 'round' + // A string that defines [shape to be used at the corners](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-linejoin) of the stroke. + lineJoin: 'round', + + // @option dashArray: String = null + // A string that defines the stroke [dash pattern](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dasharray). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashArray: null, + + // @option dashOffset: String = null + // A string that defines the [distance into the dash pattern to start the dash](https://developer.mozilla.org/docs/Web/SVG/Attribute/stroke-dashoffset). Doesn't work on `Canvas`-powered layers in [some old browsers](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash#Browser_compatibility). + dashOffset: null, + + // @option fill: Boolean = depends + // Whether to fill the path with color. Set it to `false` to disable filling on polygons or circles. + fill: false, + + // @option fillColor: String = * + // Fill color. Defaults to the value of the [`color`](#path-color) option + fillColor: null, + + // @option fillOpacity: Number = 0.2 + // Fill opacity. + fillOpacity: 0.2, + + // @option fillRule: String = 'evenodd' + // A string that defines [how the inside of a shape](https://developer.mozilla.org/docs/Web/SVG/Attribute/fill-rule) is determined. + fillRule: 'evenodd', + + // className: '', + + // Option inherited from "Interactive layer" abstract class + interactive: true, + + // @option bubblingMouseEvents: Boolean = true + // When `true`, a mouse event on this path will trigger the same event on the map + // (unless [`L.DomEvent.stopPropagation`](#domevent-stoppropagation) is used). + bubblingMouseEvents: true + }, + + beforeAdd: function (map) { + // Renderer is set here because we need to call renderer.getEvents + // before this.getEvents. + this._renderer = map.getRenderer(this); + }, + + onAdd: function () { + this._renderer._initPath(this); + this._reset(); + this._renderer._addPath(this); + }, + + onRemove: function () { + this._renderer._removePath(this); + }, + + // @method redraw(): this + // Redraws the layer. Sometimes useful after you changed the coordinates that the path uses. + redraw: function () { + if (this._map) { + this._renderer._updatePath(this); + } + return this; + }, + + // @method setStyle(style: Path options): this + // Changes the appearance of a Path based on the options in the `Path options` object. + setStyle: function (style) { + setOptions(this, style); + if (this._renderer) { + this._renderer._updateStyle(this); + if (this.options.stroke && style && Object.prototype.hasOwnProperty.call(style, 'weight')) { + this._updateBounds(); + } + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all path layers. + bringToFront: function () { + if (this._renderer) { + this._renderer._bringToFront(this); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all path layers. + bringToBack: function () { + if (this._renderer) { + this._renderer._bringToBack(this); + } + return this; + }, + + getElement: function () { + return this._path; + }, + + _reset: function () { + // defined in child classes + this._project(); + this._update(); + }, + + _clickTolerance: function () { + // used when doing hit detection for Canvas layers + return (this.options.stroke ? this.options.weight / 2 : 0) + this._renderer.options.tolerance; + } + }); + + /* + * @class CircleMarker + * @aka L.CircleMarker + * @inherits Path + * + * A circle of a fixed size with radius specified in pixels. Extends `Path`. + */ + + var CircleMarker = Path.extend({ + + // @section + // @aka CircleMarker options + options: { + fill: true, + + // @option radius: Number = 10 + // Radius of the circle marker, in pixels + radius: 10 + }, + + initialize: function (latlng, options) { + setOptions(this, options); + this._latlng = toLatLng(latlng); + this._radius = this.options.radius; + }, + + // @method setLatLng(latLng: LatLng): this + // Sets the position of a circle marker to a new location. + setLatLng: function (latlng) { + var oldLatLng = this._latlng; + this._latlng = toLatLng(latlng); + this.redraw(); + + // @event move: Event + // Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. + return this.fire('move', {oldLatLng: oldLatLng, latlng: this._latlng}); + }, + + // @method getLatLng(): LatLng + // Returns the current geographical position of the circle marker + getLatLng: function () { + return this._latlng; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle marker. Units are in pixels. + setRadius: function (radius) { + this.options.radius = this._radius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of the circle + getRadius: function () { + return this._radius; + }, + + setStyle : function (options) { + var radius = options && options.radius || this._radius; + Path.prototype.setStyle.call(this, options); + this.setRadius(radius); + return this; + }, + + _project: function () { + this._point = this._map.latLngToLayerPoint(this._latlng); + this._updateBounds(); + }, + + _updateBounds: function () { + var r = this._radius, + r2 = this._radiusY || r, + w = this._clickTolerance(), + p = [r + w, r2 + w]; + this._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p)); + }, + + _update: function () { + if (this._map) { + this._updatePath(); + } + }, + + _updatePath: function () { + this._renderer._updateCircle(this); + }, + + _empty: function () { + return this._radius && !this._renderer._bounds.intersects(this._pxBounds); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p) { + return p.distanceTo(this._point) <= this._radius + this._clickTolerance(); + } + }); + + + // @factory L.circleMarker(latlng: LatLng, options?: CircleMarker options) + // Instantiates a circle marker object given a geographical point, and an optional options object. + function circleMarker(latlng, options) { + return new CircleMarker(latlng, options); + } + + /* + * @class Circle + * @aka L.Circle + * @inherits CircleMarker + * + * A class for drawing circle overlays on a map. Extends `CircleMarker`. + * + * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion). + * + * @example + * + * ```js + * L.circle([50.5, 30.5], {radius: 200}).addTo(map); + * ``` + */ + + var Circle = CircleMarker.extend({ + + initialize: function (latlng, options, legacyOptions) { + if (typeof options === 'number') { + // Backwards compatibility with 0.7.x factory (latlng, radius, options?) + options = extend({}, legacyOptions, {radius: options}); + } + setOptions(this, options); + this._latlng = toLatLng(latlng); + + if (isNaN(this.options.radius)) { throw new Error('Circle radius cannot be NaN'); } + + // @section + // @aka Circle options + // @option radius: Number; Radius of the circle, in meters. + this._mRadius = this.options.radius; + }, + + // @method setRadius(radius: Number): this + // Sets the radius of a circle. Units are in meters. + setRadius: function (radius) { + this._mRadius = radius; + return this.redraw(); + }, + + // @method getRadius(): Number + // Returns the current radius of a circle. Units are in meters. + getRadius: function () { + return this._mRadius; + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + var half = [this._radius, this._radiusY || this._radius]; + + return new LatLngBounds( + this._map.layerPointToLatLng(this._point.subtract(half)), + this._map.layerPointToLatLng(this._point.add(half))); + }, + + setStyle: Path.prototype.setStyle, + + _project: function () { + + var lng = this._latlng.lng, + lat = this._latlng.lat, + map = this._map, + crs = map.options.crs; + + if (crs.distance === Earth.distance) { + var d = Math.PI / 180, + latR = (this._mRadius / Earth.R) / d, + top = map.project([lat + latR, lng]), + bottom = map.project([lat - latR, lng]), + p = top.add(bottom).divideBy(2), + lat2 = map.unproject(p).lat, + lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / + (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; + + if (isNaN(lngR) || lngR === 0) { + lngR = latR / Math.cos(Math.PI / 180 * lat); // Fallback for edge case, #2425 + } + + this._point = p.subtract(map.getPixelOrigin()); + this._radius = isNaN(lngR) ? 0 : p.x - map.project([lat2, lng - lngR]).x; + this._radiusY = p.y - top.y; + + } else { + var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0])); + + this._point = map.latLngToLayerPoint(this._latlng); + this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x; + } + + this._updateBounds(); + } + }); + + // @factory L.circle(latlng: LatLng, options?: Circle options) + // Instantiates a circle object given a geographical point, and an options object + // which contains the circle radius. + // @alternative + // @factory L.circle(latlng: LatLng, radius: Number, options?: Circle options) + // Obsolete way of instantiating a circle, for compatibility with 0.7.x code. + // Do not use in new applications or plugins. + function circle(latlng, options, legacyOptions) { + return new Circle(latlng, options, legacyOptions); + } + + /* + * @class Polyline + * @aka L.Polyline + * @inherits Path + * + * A class for drawing polyline overlays on a map. Extends `Path`. + * + * @example + * + * ```js + * // create a red polyline from an array of LatLng points + * var latlngs = [ + * [45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2] + * ]; + * + * var polyline = L.polyline(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polyline + * map.fitBounds(polyline.getBounds()); + * ``` + * + * You can also pass a multi-dimensional array to represent a `MultiPolyline` shape: + * + * ```js + * // create a red polyline from an array of arrays of LatLng points + * var latlngs = [ + * [[45.51, -122.68], + * [37.77, -122.43], + * [34.04, -118.2]], + * [[40.78, -73.91], + * [41.83, -87.62], + * [32.76, -96.72]] + * ]; + * ``` + */ + + + var Polyline = Path.extend({ + + // @section + // @aka Polyline options + options: { + // @option smoothFactor: Number = 1.0 + // How much to simplify the polyline on each zoom level. More means + // better performance and smoother look, and less means more accurate representation. + smoothFactor: 1.0, + + // @option noClip: Boolean = false + // Disable polyline clipping. + noClip: false + }, + + initialize: function (latlngs, options) { + setOptions(this, options); + this._setLatLngs(latlngs); + }, + + // @method getLatLngs(): LatLng[] + // Returns an array of the points in the path, or nested arrays of points in case of multi-polyline. + getLatLngs: function () { + return this._latlngs; + }, + + // @method setLatLngs(latlngs: LatLng[]): this + // Replaces all the points in the polyline with the given array of geographical points. + setLatLngs: function (latlngs) { + this._setLatLngs(latlngs); + return this.redraw(); + }, + + // @method isEmpty(): Boolean + // Returns `true` if the Polyline has no LatLngs. + isEmpty: function () { + return !this._latlngs.length; + }, + + // @method closestLayerPoint(p: Point): Point + // Returns the point closest to `p` on the Polyline. + closestLayerPoint: function (p) { + var minDistance = Infinity, + minPoint = null, + closest = _sqClosestPointOnSegment, + p1, p2; + + for (var j = 0, jLen = this._parts.length; j < jLen; j++) { + var points = this._parts[j]; + + for (var i = 1, len = points.length; i < len; i++) { + p1 = points[i - 1]; + p2 = points[i]; + + var sqDist = closest(p, p1, p2, true); + + if (sqDist < minDistance) { + minDistance = sqDist; + minPoint = closest(p, p1, p2); + } + } + } + if (minPoint) { + minPoint.distance = Math.sqrt(minDistance); + } + return minPoint; + }, + + // @method getCenter(): LatLng + // Returns the center ([centroid](http://en.wikipedia.org/wiki/Centroid)) of the polyline. + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, halfDist, segDist, dist, p1, p2, ratio, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polyline centroid algorithm; only uses the first ring if there are multiple + + for (i = 0, halfDist = 0; i < len - 1; i++) { + halfDist += points[i].distanceTo(points[i + 1]) / 2; + } + + // The line is so small in the current view that all points are on the same pixel. + if (halfDist === 0) { + return this._map.layerPointToLatLng(points[0]); + } + + for (i = 0, dist = 0; i < len - 1; i++) { + p1 = points[i]; + p2 = points[i + 1]; + segDist = p1.distanceTo(p2); + dist += segDist; + + if (dist > halfDist) { + ratio = (dist - halfDist) / segDist; + return this._map.layerPointToLatLng([ + p2.x - ratio * (p2.x - p1.x), + p2.y - ratio * (p2.y - p1.y) + ]); + } + } + }, + + // @method getBounds(): LatLngBounds + // Returns the `LatLngBounds` of the path. + getBounds: function () { + return this._bounds; + }, + + // @method addLatLng(latlng: LatLng, latlngs?: LatLng[]): this + // Adds a given point to the polyline. By default, adds to the first ring of + // the polyline in case of a multi-polyline, but can be overridden by passing + // a specific ring as a LatLng array (that you can earlier access with [`getLatLngs`](#polyline-getlatlngs)). + addLatLng: function (latlng, latlngs) { + latlngs = latlngs || this._defaultShape(); + latlng = toLatLng(latlng); + latlngs.push(latlng); + this._bounds.extend(latlng); + return this.redraw(); + }, + + _setLatLngs: function (latlngs) { + this._bounds = new LatLngBounds(); + this._latlngs = this._convertLatLngs(latlngs); + }, + + _defaultShape: function () { + return isFlat(this._latlngs) ? this._latlngs : this._latlngs[0]; + }, + + // recursively convert latlngs input into actual LatLng instances; calculate bounds along the way + _convertLatLngs: function (latlngs) { + var result = [], + flat = isFlat(latlngs); + + for (var i = 0, len = latlngs.length; i < len; i++) { + if (flat) { + result[i] = toLatLng(latlngs[i]); + this._bounds.extend(result[i]); + } else { + result[i] = this._convertLatLngs(latlngs[i]); + } + } + + return result; + }, + + _project: function () { + var pxBounds = new Bounds(); + this._rings = []; + this._projectLatlngs(this._latlngs, this._rings, pxBounds); + + if (this._bounds.isValid() && pxBounds.isValid()) { + this._rawPxBounds = pxBounds; + this._updateBounds(); + } + }, + + _updateBounds: function () { + var w = this._clickTolerance(), + p = new Point(w, w); + this._pxBounds = new Bounds([ + this._rawPxBounds.min.subtract(p), + this._rawPxBounds.max.add(p) + ]); + }, + + // recursively turns latlngs into a set of rings with projected coordinates + _projectLatlngs: function (latlngs, result, projectedBounds) { + var flat = latlngs[0] instanceof LatLng, + len = latlngs.length, + i, ring; + + if (flat) { + ring = []; + for (i = 0; i < len; i++) { + ring[i] = this._map.latLngToLayerPoint(latlngs[i]); + projectedBounds.extend(ring[i]); + } + result.push(ring); + } else { + for (i = 0; i < len; i++) { + this._projectLatlngs(latlngs[i], result, projectedBounds); + } + } + }, + + // clip polyline by renderer bounds so that we have less to render for performance + _clipPoints: function () { + var bounds = this._renderer._bounds; + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + var parts = this._parts, + i, j, k, len, len2, segment, points; + + for (i = 0, k = 0, len = this._rings.length; i < len; i++) { + points = this._rings[i]; + + for (j = 0, len2 = points.length; j < len2 - 1; j++) { + segment = clipSegment(points[j], points[j + 1], bounds, j, true); + + if (!segment) { continue; } + + parts[k] = parts[k] || []; + parts[k].push(segment[0]); + + // if segment goes out of screen, or it's the last one, it's the end of the line part + if ((segment[1] !== points[j + 1]) || (j === len2 - 2)) { + parts[k].push(segment[1]); + k++; + } + } + } + }, + + // simplify each clipped part of the polyline for performance + _simplifyPoints: function () { + var parts = this._parts, + tolerance = this.options.smoothFactor; + + for (var i = 0, len = parts.length; i < len; i++) { + parts[i] = simplify(parts[i], tolerance); + } + }, + + _update: function () { + if (!this._map) { return; } + + this._clipPoints(); + this._simplifyPoints(); + this._updatePath(); + }, + + _updatePath: function () { + this._renderer._updatePoly(this); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p, closed) { + var i, j, k, len, len2, part, + w = this._clickTolerance(); + + if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; } + + // hit detection for polylines + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + if (!closed && (j === 0)) { continue; } + + if (pointToSegmentDistance(p, part[k], part[j]) <= w) { + return true; + } + } + } + return false; + } + }); + + // @factory L.polyline(latlngs: LatLng[], options?: Polyline options) + // Instantiates a polyline object given an array of geographical points and + // optionally an options object. You can create a `Polyline` object with + // multiple separate lines (`MultiPolyline`) by passing an array of arrays + // of geographic points. + function polyline(latlngs, options) { + return new Polyline(latlngs, options); + } + + // Retrocompat. Allow plugins to support Leaflet versions before and after 1.1. + Polyline._flat = _flat; + + /* + * @class Polygon + * @aka L.Polygon + * @inherits Polyline + * + * A class for drawing polygon overlays on a map. Extends `Polyline`. + * + * Note that points you pass when creating a polygon shouldn't have an additional last point equal to the first one — it's better to filter out such points. + * + * + * @example + * + * ```js + * // create a red polygon from an array of LatLng points + * var latlngs = [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]]; + * + * var polygon = L.polygon(latlngs, {color: 'red'}).addTo(map); + * + * // zoom the map to the polygon + * map.fitBounds(polygon.getBounds()); + * ``` + * + * You can also pass an array of arrays of latlngs, with the first array representing the outer shape and the other arrays representing holes in the outer shape: + * + * ```js + * var latlngs = [ + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ]; + * ``` + * + * Additionally, you can pass a multi-dimensional array to represent a MultiPolygon shape. + * + * ```js + * var latlngs = [ + * [ // first polygon + * [[37, -109.05],[41, -109.03],[41, -102.05],[37, -102.04]], // outer ring + * [[37.29, -108.58],[40.71, -108.58],[40.71, -102.50],[37.29, -102.50]] // hole + * ], + * [ // second polygon + * [[41, -111.03],[45, -111.04],[45, -104.05],[41, -104.05]] + * ] + * ]; + * ``` + */ + + var Polygon = Polyline.extend({ + + options: { + fill: true + }, + + isEmpty: function () { + return !this._latlngs.length || !this._latlngs[0].length; + }, + + getCenter: function () { + // throws error when not yet added to map as this center calculation requires projected coordinates + if (!this._map) { + throw new Error('Must add layer to map before using getCenter()'); + } + + var i, j, p1, p2, f, area, x, y, center, + points = this._rings[0], + len = points.length; + + if (!len) { return null; } + + // polygon centroid algorithm; only uses the first ring if there are multiple + + area = x = y = 0; + + for (i = 0, j = len - 1; i < len; j = i++) { + p1 = points[i]; + p2 = points[j]; + + f = p1.y * p2.x - p2.y * p1.x; + x += (p1.x + p2.x) * f; + y += (p1.y + p2.y) * f; + area += f * 3; + } + + if (area === 0) { + // Polygon is so small that all points are on same pixel. + center = points[0]; + } else { + center = [x / area, y / area]; + } + return this._map.layerPointToLatLng(center); + }, + + _convertLatLngs: function (latlngs) { + var result = Polyline.prototype._convertLatLngs.call(this, latlngs), + len = result.length; + + // remove last point if it equals first one + if (len >= 2 && result[0] instanceof LatLng && result[0].equals(result[len - 1])) { + result.pop(); + } + return result; + }, + + _setLatLngs: function (latlngs) { + Polyline.prototype._setLatLngs.call(this, latlngs); + if (isFlat(this._latlngs)) { + this._latlngs = [this._latlngs]; + } + }, + + _defaultShape: function () { + return isFlat(this._latlngs[0]) ? this._latlngs[0] : this._latlngs[0][0]; + }, + + _clipPoints: function () { + // polygons need a different clipping algorithm so we redefine that + + var bounds = this._renderer._bounds, + w = this.options.weight, + p = new Point(w, w); + + // increase clip padding by stroke width to avoid stroke on clip edges + bounds = new Bounds(bounds.min.subtract(p), bounds.max.add(p)); + + this._parts = []; + if (!this._pxBounds || !this._pxBounds.intersects(bounds)) { + return; + } + + if (this.options.noClip) { + this._parts = this._rings; + return; + } + + for (var i = 0, len = this._rings.length, clipped; i < len; i++) { + clipped = clipPolygon(this._rings[i], bounds, true); + if (clipped.length) { + this._parts.push(clipped); + } + } + }, + + _updatePath: function () { + this._renderer._updatePoly(this, true); + }, + + // Needed by the `Canvas` renderer for interactivity + _containsPoint: function (p) { + var inside = false, + part, p1, p2, i, j, k, len, len2; + + if (!this._pxBounds || !this._pxBounds.contains(p)) { return false; } + + // ray casting algorithm for detecting if point is in polygon + for (i = 0, len = this._parts.length; i < len; i++) { + part = this._parts[i]; + + for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) { + p1 = part[j]; + p2 = part[k]; + + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + inside = !inside; + } + } + } + + // also check if it's on polygon stroke + return inside || Polyline.prototype._containsPoint.call(this, p, true); + } + + }); + + + // @factory L.polygon(latlngs: LatLng[], options?: Polyline options) + function polygon(latlngs, options) { + return new Polygon(latlngs, options); + } + + /* + * @class GeoJSON + * @aka L.GeoJSON + * @inherits FeatureGroup + * + * Represents a GeoJSON object or an array of GeoJSON objects. Allows you to parse + * GeoJSON data and display it on the map. Extends `FeatureGroup`. + * + * @example + * + * ```js + * L.geoJSON(data, { + * style: function (feature) { + * return {color: feature.properties.color}; + * } + * }).bindPopup(function (layer) { + * return layer.feature.properties.description; + * }).addTo(map); + * ``` + */ + + var GeoJSON = FeatureGroup.extend({ + + /* @section + * @aka GeoJSON options + * + * @option pointToLayer: Function = * + * A `Function` defining how GeoJSON points spawn Leaflet layers. It is internally + * called when data is added, passing the GeoJSON point feature and its `LatLng`. + * The default is to spawn a default `Marker`: + * ```js + * function(geoJsonPoint, latlng) { + * return L.marker(latlng); + * } + * ``` + * + * @option style: Function = * + * A `Function` defining the `Path options` for styling GeoJSON lines and polygons, + * called internally when data is added. + * The default value is to not override any defaults: + * ```js + * function (geoJsonFeature) { + * return {} + * } + * ``` + * + * @option onEachFeature: Function = * + * A `Function` that will be called once for each created `Feature`, after it has + * been created and styled. Useful for attaching events and popups to features. + * The default is to do nothing with the newly created layers: + * ```js + * function (feature, layer) {} + * ``` + * + * @option filter: Function = * + * A `Function` that will be used to decide whether to include a feature or not. + * The default is to include all features: + * ```js + * function (geoJsonFeature) { + * return true; + * } + * ``` + * Note: dynamically changing the `filter` option will have effect only on newly + * added data. It will _not_ re-evaluate already included features. + * + * @option coordsToLatLng: Function = * + * A `Function` that will be used for converting GeoJSON coordinates to `LatLng`s. + * The default is the `coordsToLatLng` static method. + * + * @option markersInheritOptions: Boolean = false + * Whether default Markers for "Point" type Features inherit from group options. + */ + + initialize: function (geojson, options) { + setOptions(this, options); + + this._layers = {}; + + if (geojson) { + this.addData(geojson); + } + }, + + // @method addData( data ): this + // Adds a GeoJSON object to the layer. + addData: function (geojson) { + var features = isArray(geojson) ? geojson : geojson.features, + i, len, feature; + + if (features) { + for (i = 0, len = features.length; i < len; i++) { + // only add this if geometry or geometries are set and not null + feature = features[i]; + if (feature.geometries || feature.geometry || feature.features || feature.coordinates) { + this.addData(feature); + } + } + return this; + } + + var options = this.options; + + if (options.filter && !options.filter(geojson)) { return this; } + + var layer = geometryToLayer(geojson, options); + if (!layer) { + return this; + } + layer.feature = asFeature(geojson); + + layer.defaultOptions = layer.options; + this.resetStyle(layer); + + if (options.onEachFeature) { + options.onEachFeature(geojson, layer); + } + + return this.addLayer(layer); + }, + + // @method resetStyle( layer? ): this + // Resets the given vector layer's style to the original GeoJSON style, useful for resetting style after hover events. + // If `layer` is omitted, the style of all features in the current layer is reset. + resetStyle: function (layer) { + if (layer === undefined) { + return this.eachLayer(this.resetStyle, this); + } + // reset any custom styles + layer.options = extend({}, layer.defaultOptions); + this._setLayerStyle(layer, this.options.style); + return this; + }, + + // @method setStyle( style ): this + // Changes styles of GeoJSON vector layers with the given style function. + setStyle: function (style) { + return this.eachLayer(function (layer) { + this._setLayerStyle(layer, style); + }, this); + }, + + _setLayerStyle: function (layer, style) { + if (layer.setStyle) { + if (typeof style === 'function') { + style = style(layer.feature); + } + layer.setStyle(style); + } + } + }); + + // @section + // There are several static functions which can be called without instantiating L.GeoJSON: + + // @function geometryToLayer(featureData: Object, options?: GeoJSON options): Layer + // Creates a `Layer` from a given GeoJSON feature. Can use a custom + // [`pointToLayer`](#geojson-pointtolayer) and/or [`coordsToLatLng`](#geojson-coordstolatlng) + // functions if provided as options. + function geometryToLayer(geojson, options) { + + var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson, + coords = geometry ? geometry.coordinates : null, + layers = [], + pointToLayer = options && options.pointToLayer, + _coordsToLatLng = options && options.coordsToLatLng || coordsToLatLng, + latlng, latlngs, i, len; + + if (!coords && !geometry) { + return null; + } + + switch (geometry.type) { + case 'Point': + latlng = _coordsToLatLng(coords); + return _pointToLayer(pointToLayer, geojson, latlng, options); + + case 'MultiPoint': + for (i = 0, len = coords.length; i < len; i++) { + latlng = _coordsToLatLng(coords[i]); + layers.push(_pointToLayer(pointToLayer, geojson, latlng, options)); + } + return new FeatureGroup(layers); + + case 'LineString': + case 'MultiLineString': + latlngs = coordsToLatLngs(coords, geometry.type === 'LineString' ? 0 : 1, _coordsToLatLng); + return new Polyline(latlngs, options); + + case 'Polygon': + case 'MultiPolygon': + latlngs = coordsToLatLngs(coords, geometry.type === 'Polygon' ? 1 : 2, _coordsToLatLng); + return new Polygon(latlngs, options); + + case 'GeometryCollection': + for (i = 0, len = geometry.geometries.length; i < len; i++) { + var layer = geometryToLayer({ + geometry: geometry.geometries[i], + type: 'Feature', + properties: geojson.properties + }, options); + + if (layer) { + layers.push(layer); + } + } + return new FeatureGroup(layers); + + default: + throw new Error('Invalid GeoJSON object.'); + } + } + + function _pointToLayer(pointToLayerFn, geojson, latlng, options) { + return pointToLayerFn ? + pointToLayerFn(geojson, latlng) : + new Marker(latlng, options && options.markersInheritOptions && options); + } + + // @function coordsToLatLng(coords: Array): LatLng + // Creates a `LatLng` object from an array of 2 numbers (longitude, latitude) + // or 3 numbers (longitude, latitude, altitude) used in GeoJSON for points. + function coordsToLatLng(coords) { + return new LatLng(coords[1], coords[0], coords[2]); + } + + // @function coordsToLatLngs(coords: Array, levelsDeep?: Number, coordsToLatLng?: Function): Array + // Creates a multidimensional array of `LatLng`s from a GeoJSON coordinates array. + // `levelsDeep` specifies the nesting level (0 is for an array of points, 1 for an array of arrays of points, etc., 0 by default). + // Can use a custom [`coordsToLatLng`](#geojson-coordstolatlng) function. + function coordsToLatLngs(coords, levelsDeep, _coordsToLatLng) { + var latlngs = []; + + for (var i = 0, len = coords.length, latlng; i < len; i++) { + latlng = levelsDeep ? + coordsToLatLngs(coords[i], levelsDeep - 1, _coordsToLatLng) : + (_coordsToLatLng || coordsToLatLng)(coords[i]); + + latlngs.push(latlng); + } + + return latlngs; + } + + // @function latLngToCoords(latlng: LatLng, precision?: Number): Array + // Reverse of [`coordsToLatLng`](#geojson-coordstolatlng) + function latLngToCoords(latlng, precision) { + precision = typeof precision === 'number' ? precision : 6; + return latlng.alt !== undefined ? + [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision), formatNum(latlng.alt, precision)] : + [formatNum(latlng.lng, precision), formatNum(latlng.lat, precision)]; + } + + // @function latLngsToCoords(latlngs: Array, levelsDeep?: Number, closed?: Boolean): Array + // Reverse of [`coordsToLatLngs`](#geojson-coordstolatlngs) + // `closed` determines whether the first point should be appended to the end of the array to close the feature, only used when `levelsDeep` is 0. False by default. + function latLngsToCoords(latlngs, levelsDeep, closed, precision) { + var coords = []; + + for (var i = 0, len = latlngs.length; i < len; i++) { + coords.push(levelsDeep ? + latLngsToCoords(latlngs[i], levelsDeep - 1, closed, precision) : + latLngToCoords(latlngs[i], precision)); + } + + if (!levelsDeep && closed) { + coords.push(coords[0]); + } + + return coords; + } + + function getFeature(layer, newGeometry) { + return layer.feature ? + extend({}, layer.feature, {geometry: newGeometry}) : + asFeature(newGeometry); + } + + // @function asFeature(geojson: Object): Object + // Normalize GeoJSON geometries/features into GeoJSON features. + function asFeature(geojson) { + if (geojson.type === 'Feature' || geojson.type === 'FeatureCollection') { + return geojson; + } + + return { + type: 'Feature', + properties: {}, + geometry: geojson + }; + } + + var PointToGeoJSON = { + toGeoJSON: function (precision) { + return getFeature(this, { + type: 'Point', + coordinates: latLngToCoords(this.getLatLng(), precision) + }); + } + }; + + // @namespace Marker + // @section Other methods + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the marker (as a GeoJSON `Point` Feature). + Marker.include(PointToGeoJSON); + + // @namespace CircleMarker + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the circle marker (as a GeoJSON `Point` Feature). + Circle.include(PointToGeoJSON); + CircleMarker.include(PointToGeoJSON); + + + // @namespace Polyline + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polyline (as a GeoJSON `LineString` or `MultiLineString` Feature). + Polyline.include({ + toGeoJSON: function (precision) { + var multi = !isFlat(this._latlngs); + + var coords = latLngsToCoords(this._latlngs, multi ? 1 : 0, false, precision); + + return getFeature(this, { + type: (multi ? 'Multi' : '') + 'LineString', + coordinates: coords + }); + } + }); + + // @namespace Polygon + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the polygon (as a GeoJSON `Polygon` or `MultiPolygon` Feature). + Polygon.include({ + toGeoJSON: function (precision) { + var holes = !isFlat(this._latlngs), + multi = holes && !isFlat(this._latlngs[0]); + + var coords = latLngsToCoords(this._latlngs, multi ? 2 : holes ? 1 : 0, true, precision); + + if (!holes) { + coords = [coords]; + } + + return getFeature(this, { + type: (multi ? 'Multi' : '') + 'Polygon', + coordinates: coords + }); + } + }); + + + // @namespace LayerGroup + LayerGroup.include({ + toMultiPoint: function (precision) { + var coords = []; + + this.eachLayer(function (layer) { + coords.push(layer.toGeoJSON(precision).geometry.coordinates); + }); + + return getFeature(this, { + type: 'MultiPoint', + coordinates: coords + }); + }, + + // @method toGeoJSON(precision?: Number): Object + // `precision` is the number of decimal places for coordinates. + // The default value is 6 places. + // Returns a [`GeoJSON`](http://en.wikipedia.org/wiki/GeoJSON) representation of the layer group (as a GeoJSON `FeatureCollection`, `GeometryCollection`, or `MultiPoint`). + toGeoJSON: function (precision) { + + var type = this.feature && this.feature.geometry && this.feature.geometry.type; + + if (type === 'MultiPoint') { + return this.toMultiPoint(precision); + } + + var isGeometryCollection = type === 'GeometryCollection', + jsons = []; + + this.eachLayer(function (layer) { + if (layer.toGeoJSON) { + var json = layer.toGeoJSON(precision); + if (isGeometryCollection) { + jsons.push(json.geometry); + } else { + var feature = asFeature(json); + // Squash nested feature collections + if (feature.type === 'FeatureCollection') { + jsons.push.apply(jsons, feature.features); + } else { + jsons.push(feature); + } + } + } + }); + + if (isGeometryCollection) { + return getFeature(this, { + geometries: jsons, + type: 'GeometryCollection' + }); + } + + return { + type: 'FeatureCollection', + features: jsons + }; + } + }); + + // @namespace GeoJSON + // @factory L.geoJSON(geojson?: Object, options?: GeoJSON options) + // Creates a GeoJSON layer. Optionally accepts an object in + // [GeoJSON format](https://tools.ietf.org/html/rfc7946) to display on the map + // (you can alternatively add it later with `addData` method) and an `options` object. + function geoJSON(geojson, options) { + return new GeoJSON(geojson, options); + } + + // Backward compatibility. + var geoJson = geoJSON; + + /* + * @class ImageOverlay + * @aka L.ImageOverlay + * @inherits Interactive layer + * + * Used to load and display a single image over specific bounds of the map. Extends `Layer`. + * + * @example + * + * ```js + * var imageUrl = 'http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg', + * imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]]; + * L.imageOverlay(imageUrl, imageBounds).addTo(map); + * ``` + */ + + var ImageOverlay = Layer.extend({ + + // @section + // @aka ImageOverlay options + options: { + // @option opacity: Number = 1.0 + // The opacity of the image overlay. + opacity: 1, + + // @option alt: String = '' + // Text for the `alt` attribute of the image (useful for accessibility). + alt: '', + + // @option interactive: Boolean = false + // If `true`, the image overlay will emit [mouse events](#interactive-layer) when clicked or hovered. + interactive: false, + + // @option crossOrigin: Boolean|String = false + // Whether the crossOrigin attribute will be added to the image. + // If a String is provided, the image will have its crossOrigin attribute set to the String provided. This is needed if you want to access image pixel data. + // Refer to [CORS Settings](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for valid String values. + crossOrigin: false, + + // @option errorOverlayUrl: String = '' + // URL to the overlay image to show in place of the overlay that failed to load. + errorOverlayUrl: '', + + // @option zIndex: Number = 1 + // The explicit [zIndex](https://developer.mozilla.org/docs/Web/CSS/CSS_Positioning/Understanding_z_index) of the overlay layer. + zIndex: 1, + + // @option className: String = '' + // A custom class name to assign to the image. Empty by default. + className: '' + }, + + initialize: function (url, bounds, options) { // (String, LatLngBounds, Object) + this._url = url; + this._bounds = toLatLngBounds(bounds); + + setOptions(this, options); + }, + + onAdd: function () { + if (!this._image) { + this._initImage(); + + if (this.options.opacity < 1) { + this._updateOpacity(); + } + } + + if (this.options.interactive) { + addClass(this._image, 'leaflet-interactive'); + this.addInteractiveTarget(this._image); + } + + this.getPane().appendChild(this._image); + this._reset(); + }, + + onRemove: function () { + remove(this._image); + if (this.options.interactive) { + this.removeInteractiveTarget(this._image); + } + }, + + // @method setOpacity(opacity: Number): this + // Sets the opacity of the overlay. + setOpacity: function (opacity) { + this.options.opacity = opacity; + + if (this._image) { + this._updateOpacity(); + } + return this; + }, + + setStyle: function (styleOpts) { + if (styleOpts.opacity) { + this.setOpacity(styleOpts.opacity); + } + return this; + }, + + // @method bringToFront(): this + // Brings the layer to the top of all overlays. + bringToFront: function () { + if (this._map) { + toFront(this._image); + } + return this; + }, + + // @method bringToBack(): this + // Brings the layer to the bottom of all overlays. + bringToBack: function () { + if (this._map) { + toBack(this._image); + } + return this; + }, + + // @method setUrl(url: String): this + // Changes the URL of the image. + setUrl: function (url) { + this._url = url; + + if (this._image) { + this._image.src = url; + } + return this; + }, + + // @method setBounds(bounds: LatLngBounds): this + // Update the bounds that this ImageOverlay covers + setBounds: function (bounds) { + this._bounds = toLatLngBounds(bounds); + + if (this._map) { + this._reset(); + } + return this; + }, + + getEvents: function () { + var events = { + zoom: this._reset, + viewreset: this._reset + }; + + if (this._zoomAnimated) { + events.zoomanim = this._animateZoom; + } + + return events; + }, + + // @method setZIndex(value: Number): this + // Changes the [zIndex](#imageoverlay-zindex) of the image overlay. + setZIndex: function (value) { + this.options.zIndex = value; + this._updateZIndex(); + return this; + }, + + // @method getBounds(): LatLngBounds + // Get the bounds that this ImageOverlay covers + getBounds: function () { + return this._bounds; + }, + + // @method getElement(): HTMLElement + // Returns the instance of [`HTMLImageElement`](https://developer.mozilla.org/docs/Web/API/HTMLImageElement) + // used by this overlay. + getElement: function () { + return this._image; + }, + + _initImage: function () { + var wasElementSupplied = this._url.tagName === 'IMG'; + var img = this._image = wasElementSupplied ? this._url : create$1('img'); + + addClass(img, 'leaflet-image-layer'); + if (this._zoomAnimated) { addClass(img, 'leaflet-zoom-animated'); } + if (this.options.className) { addClass(img, this.options.className); } + + img.onselectstart = falseFn; + img.onmousemove = falseFn; + + // @event load: Event + // Fired when the ImageOverlay layer has loaded its image + img.onload = bind(this.fire, this, 'load'); + img.onerror = bind(this._overlayOnError, this, 'error'); + + if (this.options.crossOrigin || this.options.crossOrigin === '') { + img.crossOrigin = this.options.crossOrigin === true ? '' : this.options.crossOrigin; + } + + if (this.options.zIndex) { + this._updateZIndex(); + } + + if (wasElementSupplied) { + this._url = img.src; + return; + } + + img.src = this._url; + img.alt = this.options.alt; + }, + + _animateZoom: function (e) { + var scale = this._map.getZoomScale(e.zoom), + offset = this._map._latLngBoundsToNewLayerBounds(this._bounds, e.zoom, e.center).min; + + setTransform(this._image, offset, scale); + }, + + _reset: function () { + var image = this._image, + bounds = new Bounds( + this._map.latLngToLayerPoint(this._bounds.getNorthWest()), + this._map.latLngToLayerPoint(this._bounds.getSouthEast())), + size = bounds.getSize(); + + setPosition(image, bounds.min); + + image.style.width = size.x + 'px'; + image.style.height = size.y + 'px'; + }, + + _updateOpacity: function () { + setOpacity(this._image, this.options.opacity); + }, + + _updateZIndex: function () { + if (this._image && this.options.zIndex !== undefined && this.options.zIndex !== null) { + this._image.style.zIndex = this.options.zIndex; + } + }, + + _overlayOnError: function () { + // @event error: Event + // Fired when the ImageOverlay layer fails to load its image + this.fire('error'); + + var errorUrl = this.options.errorOverlayUrl; + if (errorUrl && this._url !== errorUrl) { + this._url = errorUrl; + this._image.src = errorUrl; + } + } + }); + + // @factory L.imageOverlay(imageUrl: String, bounds: LatLngBounds, options?: ImageOverlay options) + // Instantiates an image overlay object given the URL of the image and the + // geographical bounds it is tied to. + var imageOverlay = function (url, bounds, options) { + return new ImageOverlay(url, bounds, options); + }; + + /* + * @class VideoOverlay + * @aka L.VideoOverlay + * @inherits ImageOverlay + * + * Used to load and display a video player over specific bounds of the map. Extends `ImageOverlay`. + * + * A video overlay uses the [`