From 7432ea5cc7e82563ff633a752a474ebeb2ebbf98 Mon Sep 17 00:00:00 2001 From: lordwilbur Date: Fri, 18 May 2018 10:51:01 +0200 Subject: [PATCH] rebuilt assets --- public/assets/admin/css/vendor.css | 12 +- public/assets/admin/css/vendor.min.css | 12 +- public/assets/admin/js/app.js | 22 +- public/assets/admin/js/vendor.js | 8793 ++++++++++----------- public/assets/frontend/css/now-ui-kit.css | 190 +- public/assets/frontend/js/app.js | 22 +- public/assets/installer/css/vendor.css | 190 +- public/assets/installer/js/app.js | 6 +- public/mix-manifest.json | 16 +- 9 files changed, 4629 insertions(+), 4634 deletions(-) diff --git a/public/assets/admin/css/vendor.css b/public/assets/admin/css/vendor.css index 535bbe1f..00ab1f8e 100644 --- a/public/assets/admin/css/vendor.css +++ b/public/assets/admin/css/vendor.css @@ -15926,8 +15926,8 @@ fieldset[disabled] .card .btn-neutral.active { } .navbar-nav > li > .dropdown-menu:before { border-bottom: 11px solid #F1EAE0; - border-left: 11px solid transparent; - border-right: 11px solid transparent; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); content: ""; display: inline-block; position: absolute; @@ -15936,8 +15936,8 @@ fieldset[disabled] .card .btn-neutral.active { } .navbar-nav > li > .dropdown-menu:after { border-bottom: 11px solid #FFFCF5; - border-left: 11px solid transparent; - border-right: 11px solid transparent; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); content: ""; display: inline-block; position: absolute; @@ -16101,8 +16101,8 @@ fieldset[disabled] .card .btn-neutral.active { width: 100%; position: absolute; background-color: #ebeff2; - background-image: -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(60%, rgba(112, 112, 112, 0)), to(rgba(186, 186, 186, 0.15))); - background-image: linear-gradient(to bottom, transparent 0%, rgba(112, 112, 112, 0) 60%, rgba(186, 186, 186, 0.15) 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), color-stop(60%, rgba(112, 112, 112, 0)), to(rgba(186, 186, 186, 0.15))); + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(112, 112, 112, 0) 60%, rgba(186, 186, 186, 0.15) 100%); display: block; content: ""; z-index: 1; diff --git a/public/assets/admin/css/vendor.min.css b/public/assets/admin/css/vendor.min.css index b876a1cd..34c2740b 100644 --- a/public/assets/admin/css/vendor.min.css +++ b/public/assets/admin/css/vendor.min.css @@ -3807,8 +3807,8 @@ fieldset[disabled] .card .btn-neutral.active { } .navbar-nav > li > .dropdown-menu:before { border-bottom: 11px solid #F1EAE0; - border-left: 11px solid transparent; - border-right: 11px solid transparent; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); content: ""; display: inline-block; position: absolute; @@ -3817,8 +3817,8 @@ fieldset[disabled] .card .btn-neutral.active { } .navbar-nav > li > .dropdown-menu:after { border-bottom: 11px solid #FFFCF5; - border-left: 11px solid transparent; - border-right: 11px solid transparent; + border-left: 11px solid rgba(0, 0, 0, 0); + border-right: 11px solid rgba(0, 0, 0, 0); content: ""; display: inline-block; position: absolute; @@ -3982,8 +3982,8 @@ fieldset[disabled] .card .btn-neutral.active { width: 100%; position: absolute; background-color: #ebeff2; - background-image: -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(60%, rgba(112, 112, 112, 0)), to(rgba(186, 186, 186, 0.15))); - background-image: linear-gradient(to bottom, transparent 0%, rgba(112, 112, 112, 0) 60%, rgba(186, 186, 186, 0.15) 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), color-stop(60%, rgba(112, 112, 112, 0)), to(rgba(186, 186, 186, 0.15))); + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(112, 112, 112, 0) 60%, rgba(186, 186, 186, 0.15) 100%); display: block; content: ""; z-index: 1; diff --git a/public/assets/admin/js/app.js b/public/assets/admin/js/app.js index 24fc4437..c7272292 100644 --- a/public/assets/admin/js/app.js +++ b/public/assets/admin/js/app.js @@ -69,7 +69,7 @@ /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\n// This file is part of Leaflet.Geodesic.\n// Copyright (C) 2017 Henry Thasler\n// based on code by Chris Veness Copyright (C) 2014 https://github.com/chrisveness/geodesy\n//\n// Leaflet.Geodesic is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Leaflet.Geodesic is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Leaflet.Geodesic. If not, see .\n\n\n/** Extend Number object with method to convert numeric degrees to radians */\nif (typeof Number.prototype.toRadians === \"undefined\") {\n Number.prototype.toRadians = function() {\n return this * Math.PI / 180;\n };\n}\n\n/** Extend Number object with method to convert radians to numeric (signed) degrees */\nif (typeof Number.prototype.toDegrees === \"undefined\") {\n Number.prototype.toDegrees = function() {\n return this * 180 / Math.PI;\n };\n}\n\nvar INTERSECT_LNG = 179.999; // Lng used for intersection and wrap around on map edges\n\nL.Geodesic = L.Polyline.extend({\n options: {\n color: \"blue\",\n steps: 10,\n dash: 1,\n wrap: true\n },\n\n initialize: function(latlngs, options) {\n this.options = this._merge_options(this.options, options);\n this.options.dash = Math.max(1e-3, Math.min(1, parseFloat(this.options.dash) || 1));\n this.datum = {};\n this.datum.ellipsoid = {\n a: 6378137,\n b: 6356752.3142,\n f: 1 / 298.257223563\n }; // WGS-84\n this._latlngs = this._generate_Geodesic(latlngs);\n L.Polyline.prototype.initialize.call(this, this._latlngs, this.options);\n },\n\n setLatLngs: function(latlngs) {\n this._latlngs = this._generate_Geodesic(latlngs);\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Calculates some statistic values of current geodesic multipolyline\n * @returns (Object} Object with several properties (e.g. overall distance)\n */\n getStats: function() {\n let obj = {\n distance: 0,\n points: 0,\n polygons: this._latlngs.length\n }, poly, points;\n\n for (poly = 0; poly < this._latlngs.length; poly++) {\n obj.points += this._latlngs[poly].length;\n for (points = 0; points < (this._latlngs[poly].length - 1); points++) {\n obj.distance += this._vincenty_inverse(this._latlngs[poly][points],\n this._latlngs[poly][points + 1]).distance;\n }\n }\n return obj;\n },\n\n\n /**\n * Creates geodesic lines from geoJson. Replaces all current features of this instance.\n * Supports LineString, MultiLineString and Polygon\n * @param {Object} geojson - geosjon as object.\n */\n geoJson: function(geojson) {\n\n let normalized = L.GeoJSON.asFeature(geojson);\n let features = normalized.type === \"FeatureCollection\" ? normalized.features : [\n normalized\n ];\n this._latlngs = [];\n for (let feature of features) {\n let geometry = feature.type === \"Feature\" ? feature.geometry :\n feature,\n coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"LineString\":\n this._latlngs.push(this._generate_Geodesic([L.GeoJSON.coordsToLatLngs(\n coords, 0)]));\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n this._latlngs.push(this._generate_Geodesic(L.GeoJSON.coordsToLatLngs(\n coords, 1)));\n break;\n case \"Point\":\n case \"MultiPoint\":\n console.log(\"Dude, points can't be drawn as geodesic lines...\");\n break;\n default:\n console.log(\"Drawing \" + geometry.type +\n \" as a geodesic is not supported. Skipping...\");\n }\n }\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Creates a great circle. Replaces all current lines.\n * @param {Object} center - geographic position\n * @param {number} radius - radius of the circle in metres\n */\n createCircle: function(center, radius) {\n let polylineIndex = 0;\n let prev = {\n lat: 0,\n lng: 0,\n brg: 0\n };\n let step;\n\n this._latlngs = [];\n this._latlngs[polylineIndex] = [];\n\n let direct = this._vincenty_direct(L.latLng(center), 0, radius, this.options\n .wrap);\n prev = L.latLng(direct.lat, direct.lng);\n this._latlngs[polylineIndex].push(prev);\n for (step = 1; step <= this.options.steps;) {\n direct = this._vincenty_direct(L.latLng(center), 360 / this.options\n .steps * step, radius, this.options.wrap);\n let gp = L.latLng(direct.lat, direct.lng);\n if (Math.abs(gp.lng - prev.lng) > 180) {\n let inverse = this._vincenty_inverse(prev, gp);\n let sec = this._intersection(prev, inverse.initialBearing, {\n lat: -89,\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\n }, 0);\n if (sec) {\n this._latlngs[polylineIndex].push(L.latLng(sec.lat, sec.lng));\n polylineIndex++;\n this._latlngs[polylineIndex] = [];\n prev = L.latLng(sec.lat, -sec.lng);\n this._latlngs[polylineIndex].push(prev);\n } else {\n polylineIndex++;\n this._latlngs[polylineIndex] = [];\n this._latlngs[polylineIndex].push(gp);\n prev = gp;\n step++;\n }\n } else {\n this._latlngs[polylineIndex].push(gp);\n prev = gp;\n step++;\n }\n }\n\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Creates a geodesic Polyline from given coordinates\n * Note: dashed lines are under work\n * @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline\n * @returns (Object} An array of arrays of geographical points.\n */\n _generate_Geodesic: function(latlngs) {\n let _geo = [], _geocnt = 0;\n\n for (let poly = 0; poly < latlngs.length; poly++) {\n _geo[_geocnt] = [];\n let prev = L.latLng(latlngs[poly][0]);\n for (let points = 0; points < (latlngs[poly].length - 1); points++) {\n // use prev, so that wrapping behaves correctly\n let pointA = prev;\n let pointB = L.latLng(latlngs[poly][points + 1]);\n if (pointA.equals(pointB)) {\n continue;\n }\n let inverse = this._vincenty_inverse(pointA, pointB);\n _geo[_geocnt].push(prev);\n for (let s = 1; s <= this.options.steps;) {\n let distance = inverse.distance / this.options.steps;\n // dashed lines don't go the full distance between the points\n let dist_mult = s - 1 + this.options.dash;\n let direct = this._vincenty_direct(pointA, inverse.initialBearing, distance*dist_mult, this.options.wrap);\n let gp = L.latLng(direct.lat, direct.lng);\n if (Math.abs(gp.lng - prev.lng) > 180) {\n let sec = this._intersection(pointA, inverse.initialBearing, {\n lat: -89,\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\n }, 0);\n if (sec) {\n _geo[_geocnt].push(L.latLng(sec.lat, sec.lng));\n _geocnt++;\n _geo[_geocnt] = [];\n prev = L.latLng(sec.lat, -sec.lng);\n _geo[_geocnt].push(prev);\n } else {\n _geocnt++;\n _geo[_geocnt] = [];\n _geo[_geocnt].push(gp);\n prev = gp;\n s++;\n } \n } else {\n _geo[_geocnt].push(gp);\n // Dashed lines start a new line\n if (this.options.dash < 1){\n _geocnt++;\n // go full distance this time, to get starting point for next line\n let direct_full = this._vincenty_direct(pointA, inverse.initialBearing, distance*s, this.options.wrap);\n _geo[_geocnt] = [];\n prev = L.latLng(direct_full.lat, direct_full.lng);\n _geo[_geocnt].push(prev);\n }\n else prev = gp;\n s++;\n }\n }\n }\n _geocnt++;\n }\n return _geo;\n },\n\n /**\n * Vincenty direct calculation.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @private\n * @param {number} initialBearing - Initial bearing in degrees from north.\n * @param {number} distance - Distance along bearing in metres.\n * @returns (Object} Object including point (destination point), finalBearing.\n */\n\n _vincenty_direct: function(p1, initialBearing, distance, wrap) {\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var α1 = initialBearing.toRadians();\n var s = distance;\n\n var a = this.datum.ellipsoid.a,\n b = this.datum.ellipsoid.b,\n f = this.datum.ellipsoid.f;\n\n var sinα1 = Math.sin(α1);\n var cosα1 = Math.cos(α1);\n\n var tanU1 = (1 - f) * Math.tan(φ1),\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\n sinU1 = tanU1 * cosU1;\n var σ1 = Math.atan2(tanU1, cosα1);\n var sinα = cosU1 * sinα1;\n var cosSqα = 1 - sinα * sinα;\n var uSq = cosSqα * (a * a - b * b) / (b * b);\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\n uSq)));\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n\n var σ = s / (b * A),\n σʹ, iterations = 0;\n var sinσ, cosσ;\n var cos2σM;\n do {\n cos2σM = Math.cos(2 * σ1 + σ);\n sinσ = Math.sin(σ);\n cosσ = Math.cos(σ);\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\n cos2σM) -\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\n cos2σM)));\n σʹ = σ;\n σ = s / (b * A) + Δσ;\n } while (Math.abs(σ - σʹ) > 1e-12 && ++iterations);\n\n var x = sinU1 * sinσ - cosU1 * cosσ * cosα1;\n var φ2 = Math.atan2(sinU1 * cosσ + cosU1 * sinσ * cosα1, (1 - f) *\n Math.sqrt(sinα * sinα + x * x));\n var λ = Math.atan2(sinσ * sinα1, cosU1 * cosσ - sinU1 * sinσ * cosα1);\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\n var L = λ - (1 - C) * f * sinα *\n (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));\n\n var λ2;\n if (wrap) {\n λ2 = (λ1 + L + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180...+180\n } else {\n λ2 = (λ1 + L); // do not normalize\n }\n\n var revAz = Math.atan2(sinα, -x);\n\n return {\n lat: φ2.toDegrees(),\n lng: λ2.toDegrees(),\n finalBearing: revAz.toDegrees()\n };\n },\n\n /**\n * Vincenty inverse calculation.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @private\n * @param {LatLng} p1 - Latitude/longitude of start point.\n * @param {LatLng} p2 - Latitude/longitude of destination point.\n * @returns {Object} Object including distance, initialBearing, finalBearing.\n * @throws {Error} If formula failed to converge.\n */\n _vincenty_inverse: function(p1, p2) {\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var φ2 = p2.lat.toRadians(),\n λ2 = p2.lng.toRadians();\n\n var a = this.datum.ellipsoid.a,\n b = this.datum.ellipsoid.b,\n f = this.datum.ellipsoid.f;\n\n var L = λ2 - λ1;\n var tanU1 = (1 - f) * Math.tan(φ1),\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\n sinU1 = tanU1 * cosU1;\n var tanU2 = (1 - f) * Math.tan(φ2),\n cosU2 = 1 / Math.sqrt((1 + tanU2 * tanU2)),\n sinU2 = tanU2 * cosU2;\n\n var λ = L,\n λʹ, iterations = 0;\n var cosSqα, sinσ, cos2σM, cosσ, σ, sinλ, cosλ;\n do {\n sinλ = Math.sin(λ);\n cosλ = Math.cos(λ);\n var sinSqσ = (cosU2 * sinλ) * (cosU2 * sinλ) + (cosU1 * sinU2 -\n sinU1 * cosU2 * cosλ) * (cosU1 * sinU2 - sinU1 * cosU2 * cosλ);\n sinσ = Math.sqrt(sinSqσ);\n if (sinσ == 0) return 0; // co-incident points\n cosσ = sinU1 * sinU2 + cosU1 * cosU2 * cosλ;\n σ = Math.atan2(sinσ, cosσ);\n var sinα = cosU1 * cosU2 * sinλ / sinσ;\n cosSqα = 1 - sinα * sinα;\n cos2σM = cosσ - 2 * sinU1 * sinU2 / cosSqα;\n if (isNaN(cos2σM)) cos2σM = 0; // equatorial line: cosSqα=0 (§6)\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\n λʹ = λ;\n λ = L + (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-\n 1 + 2 * cos2σM * cos2σM)));\n } while (Math.abs(λ - λʹ) > 1e-12 && ++iterations < 100);\n if (iterations >= 100) {\n console.log(\"Formula failed to converge. Altering target position.\");\n return this._vincenty_inverse(p1, {\n lat: p2.lat,\n lng: p2.lng - 0.01\n });\n // throw new Error('Formula failed to converge');\n }\n\n var uSq = cosSqα * (a * a - b * b) / (b * b);\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\n uSq)));\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\n cos2σM) -\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\n cos2σM)));\n\n var s = b * A * (σ - Δσ);\n\n var fwdAz = Math.atan2(cosU2 * sinλ, cosU1 * sinU2 - sinU1 * cosU2 *\n cosλ);\n var revAz = Math.atan2(cosU1 * sinλ, -sinU1 * cosU2 + cosU1 * sinU2 *\n cosλ);\n\n s = Number(s.toFixed(3)); // round to 1mm precision\n return {\n distance: s,\n initialBearing: fwdAz.toDegrees(),\n finalBearing: revAz.toDegrees()\n };\n },\n\n\n /**\n * Returns the point of intersection of two paths defined by point and bearing.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @param {LatLon} p1 - First point.\n * @param {number} brng1 - Initial bearing from first point.\n * @param {LatLon} p2 - Second point.\n * @param {number} brng2 - Initial bearing from second point.\n * @returns {Object} containing lat/lng information of intersection.\n *\n * @example\n * var p1 = LatLon(51.8853, 0.2545), brng1 = 108.55;\n * var p2 = LatLon(49.0034, 2.5735), brng2 = 32.44;\n * var pInt = LatLon.intersection(p1, brng1, p2, brng2); // pInt.toString(): 50.9078°N, 4.5084°E\n */\n _intersection: function(p1, brng1, p2, brng2) {\n // see http://williams.best.vwh.net/avform.htm#Intersection\n\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var φ2 = p2.lat.toRadians(),\n λ2 = p2.lng.toRadians();\n var θ13 = Number(brng1).toRadians(),\n θ23 = Number(brng2).toRadians();\n var Δφ = φ2 - φ1,\n Δλ = λ2 - λ1;\n\n var δ12 = 2 * Math.asin(Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ /\n 2)));\n if (δ12 == 0) return null;\n\n // initial/final bearings between points\n var θ1 = Math.acos((Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) /\n (Math.sin(δ12) * Math.cos(φ1)));\n if (isNaN(θ1)) θ1 = 0; // protect against rounding\n var θ2 = Math.acos((Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) /\n (Math.sin(δ12) * Math.cos(φ2)));\n var θ12, θ21;\n if (Math.sin(λ2 - λ1) > 0) {\n θ12 = θ1;\n θ21 = 2 * Math.PI - θ2;\n } else {\n θ12 = 2 * Math.PI - θ1;\n θ21 = θ2;\n }\n\n var α1 = (θ13 - θ12 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 2-1-3\n var α2 = (θ21 - θ23 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 1-2-3\n\n if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections\n if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection\n\n //α1 = Math.abs(α1);\n //α2 = Math.abs(α2);\n // ... Ed Williams takes abs of α1/α2, but seems to break calculation?\n\n var α3 = Math.acos(-Math.cos(α1) * Math.cos(α2) +\n Math.sin(α1) * Math.sin(α2) * Math.cos(δ12));\n var δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2),\n Math.cos(α2) + Math.cos(α1) * Math.cos(α3));\n var φ3 = Math.asin(Math.sin(φ1) * Math.cos(δ13) +\n Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13));\n var Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1),\n Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3));\n var λ3 = λ1 + Δλ13;\n λ3 = (λ3 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º\n\n return {\n lat: φ3.toDegrees(),\n lng: λ3.toDegrees()\n };\n },\n\n /**\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\n * @param obj1\n * @param obj2\n * @returns obj3 a new object based on obj1 and obj2\n */\n _merge_options: function(obj1, obj2) {\n let obj3 = {};\n for (let attrname in obj1) {\n obj3[attrname] = obj1[attrname];\n }\n for (let attrname in obj2) {\n obj3[attrname] = obj2[attrname];\n }\n return obj3;\n }\n});\n\nL.geodesic = function(latlngs, options) {\n return new L.Geodesic(latlngs, options);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzPzU3NGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0Esc0JBQXNCLDJDQUEyQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9MZWFmbGV0Lkdlb2Rlc2ljL0xlYWZsZXQuR2VvZGVzaWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGVhZmxldC5HZW9kZXNpYy5cbi8vIENvcHlyaWdodCAoQykgMjAxNyAgSGVucnkgVGhhc2xlclxuLy8gYmFzZWQgb24gY29kZSBieSBDaHJpcyBWZW5lc3MgQ29weXJpZ2h0IChDKSAyMDE0IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3ZlbmVzcy9nZW9kZXN5XG4vL1xuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3Jcbi8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggTGVhZmxldC5HZW9kZXNpYy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cblxuXG4vKiogRXh0ZW5kIE51bWJlciBvYmplY3Qgd2l0aCBtZXRob2QgdG8gY29udmVydCBudW1lcmljIGRlZ3JlZXMgdG8gcmFkaWFucyAqL1xuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzICogTWF0aC5QSSAvIDE4MDtcbiAgfTtcbn1cblxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgcmFkaWFucyB0byBudW1lcmljIChzaWduZWQpIGRlZ3JlZXMgKi9cbmlmICh0eXBlb2YgTnVtYmVyLnByb3RvdHlwZS50b0RlZ3JlZXMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgTnVtYmVyLnByb3RvdHlwZS50b0RlZ3JlZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcyAqIDE4MCAvIE1hdGguUEk7XG4gIH07XG59XG5cbnZhciBJTlRFUlNFQ1RfTE5HID0gMTc5Ljk5OTsgLy8gTG5nIHVzZWQgZm9yIGludGVyc2VjdGlvbiBhbmQgd3JhcCBhcm91bmQgb24gbWFwIGVkZ2VzXG5cbkwuR2VvZGVzaWMgPSBMLlBvbHlsaW5lLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBjb2xvcjogXCJibHVlXCIsXG4gICAgc3RlcHM6IDEwLFxuICAgIGRhc2g6IDEsXG4gICAgd3JhcDogdHJ1ZVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLl9tZXJnZV9vcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLmRhc2ggPSBNYXRoLm1heCgxZS0zLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHRoaXMub3B0aW9ucy5kYXNoKSB8fCAxKSk7XG4gICAgdGhpcy5kYXR1bSA9IHt9O1xuICAgIHRoaXMuZGF0dW0uZWxsaXBzb2lkID0ge1xuICAgICAgICBhOiA2Mzc4MTM3LFxuICAgICAgICBiOiA2MzU2NzUyLjMxNDIsXG4gICAgICAgIGY6IDEgLyAyOTguMjU3MjIzNTYzXG4gICAgICB9OyAvLyBXR1MtODRcbiAgICB0aGlzLl9sYXRsbmdzID0gdGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMobGF0bG5ncyk7XG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MsIHRoaXMub3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0TGF0TG5nczogZnVuY3Rpb24obGF0bG5ncykge1xuICAgIHRoaXMuX2xhdGxuZ3MgPSB0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhsYXRsbmdzKTtcbiAgICBMLlBvbHlsaW5lLnByb3RvdHlwZS5zZXRMYXRMbmdzLmNhbGwodGhpcywgdGhpcy5fbGF0bG5ncyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgc29tZSBzdGF0aXN0aWMgdmFsdWVzIG9mIGN1cnJlbnQgZ2VvZGVzaWMgbXVsdGlwb2x5bGluZVxuICAgKiBAcmV0dXJucyAoT2JqZWN0fSBPYmplY3Qgd2l0aCBzZXZlcmFsIHByb3BlcnRpZXMgKGUuZy4gb3ZlcmFsbCBkaXN0YW5jZSlcbiAgICovXG4gIGdldFN0YXRzOiBmdW5jdGlvbigpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgcG9pbnRzOiAwLFxuICAgICAgICBwb2x5Z29uczogdGhpcy5fbGF0bG5ncy5sZW5ndGhcbiAgICAgIH0sIHBvbHksIHBvaW50cztcblxuICAgIGZvciAocG9seSA9IDA7IHBvbHkgPCB0aGlzLl9sYXRsbmdzLmxlbmd0aDsgcG9seSsrKSB7XG4gICAgICBvYmoucG9pbnRzICs9IHRoaXMuX2xhdGxuZ3NbcG9seV0ubGVuZ3RoO1xuICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAodGhpcy5fbGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcbiAgICAgICAgb2JqLmRpc3RhbmNlICs9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UodGhpcy5fbGF0bG5nc1twb2x5XVtwb2ludHNdLFxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pLmRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZ2VvZGVzaWMgbGluZXMgZnJvbSBnZW9Kc29uLiBSZXBsYWNlcyBhbGwgY3VycmVudCBmZWF0dXJlcyBvZiB0aGlzIGluc3RhbmNlLlxuICAgKiBTdXBwb3J0cyBMaW5lU3RyaW5nLCBNdWx0aUxpbmVTdHJpbmcgYW5kIFBvbHlnb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGdlb2pzb24gLSBnZW9zam9uIGFzIG9iamVjdC5cbiAgICovXG4gIGdlb0pzb246IGZ1bmN0aW9uKGdlb2pzb24pIHtcblxuICAgIGxldCBub3JtYWxpemVkID0gTC5HZW9KU09OLmFzRmVhdHVyZShnZW9qc29uKTtcbiAgICBsZXQgZmVhdHVyZXMgPSBub3JtYWxpemVkLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIiA/IG5vcm1hbGl6ZWQuZmVhdHVyZXMgOiBbXG4gICAgICBub3JtYWxpemVkXG4gICAgXTtcbiAgICB0aGlzLl9sYXRsbmdzID0gW107XG4gICAgZm9yIChsZXQgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSBcIkZlYXR1cmVcIiA/IGZlYXR1cmUuZ2VvbWV0cnkgOlxuICAgICAgICBmZWF0dXJlLFxuICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcblxuICAgICAgc3dpdGNoIChnZW9tZXRyeS50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICAgICAgdGhpcy5fbGF0bG5ncy5wdXNoKHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKFtMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxuICAgICAgICAgICAgY29vcmRzLCAwKV0pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3MucHVzaCh0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxuICAgICAgICAgICAgY29vcmRzLCAxKSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkR1ZGUsIHBvaW50cyBjYW4ndCBiZSBkcmF3biBhcyBnZW9kZXNpYyBsaW5lcy4uLlwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRyYXdpbmcgXCIgKyBnZW9tZXRyeS50eXBlICtcbiAgICAgICAgICAgIFwiIGFzIGEgZ2VvZGVzaWMgaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcuLi5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGdyZWF0IGNpcmNsZS4gUmVwbGFjZXMgYWxsIGN1cnJlbnQgbGluZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZW50ZXIgLSBnZW9ncmFwaGljIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSByYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiBtZXRyZXNcbiAgICovXG4gIGNyZWF0ZUNpcmNsZTogZnVuY3Rpb24oY2VudGVyLCByYWRpdXMpIHtcbiAgICBsZXQgcG9seWxpbmVJbmRleCA9IDA7XG4gICAgbGV0IHByZXYgPSB7XG4gICAgICBsYXQ6IDAsXG4gICAgICBsbmc6IDAsXG4gICAgICBicmc6IDBcbiAgICB9O1xuICAgIGxldCBzdGVwO1xuXG4gICAgdGhpcy5fbGF0bG5ncyA9IFtdO1xuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcblxuICAgIGxldCBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcoY2VudGVyKSwgMCwgcmFkaXVzLCB0aGlzLm9wdGlvbnNcbiAgICAgIC53cmFwKTtcbiAgICBwcmV2ID0gTC5sYXRMbmcoZGlyZWN0LmxhdCwgZGlyZWN0LmxuZyk7XG4gICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XS5wdXNoKHByZXYpO1xuICAgIGZvciAoc3RlcCA9IDE7IHN0ZXAgPD0gdGhpcy5vcHRpb25zLnN0ZXBzOykge1xuICAgICAgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KEwubGF0TG5nKGNlbnRlciksIDM2MCAvIHRoaXMub3B0aW9uc1xuICAgICAgICAuc3RlcHMgKiBzdGVwLCByYWRpdXMsIHRoaXMub3B0aW9ucy53cmFwKTtcbiAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xuICAgICAgaWYgKE1hdGguYWJzKGdwLmxuZyAtIHByZXYubG5nKSA+IDE4MCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocHJldiwgZ3ApO1xuICAgICAgICBsZXQgc2VjID0gdGhpcy5faW50ZXJzZWN0aW9uKHByZXYsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcbiAgICAgICAgICBsYXQ6IC04OSxcbiAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIGlmIChzZWMpIHtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdID0gW107XG4gICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2gocHJldik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcG9seWxpbmVJbmRleCsrO1xuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2goZ3ApO1xuICAgICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgICBzdGVwKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XG4gICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgc3RlcCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGdlb2Rlc2ljIFBvbHlsaW5lIGZyb20gZ2l2ZW4gY29vcmRpbmF0ZXNcbiAgICogTm90ZTogZGFzaGVkIGxpbmVzIGFyZSB1bmRlciB3b3JrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRsbmdzIC0gT25lIG9yIG1vcmUgcG9seWxpbmVzIGFzIGFuIGFycmF5LiBTZWUgTGVhZmxldCBkb2MgYWJvdXQgUG9seWxpbmVcbiAgICogQHJldHVybnMgKE9iamVjdH0gQW4gYXJyYXkgb2YgYXJyYXlzIG9mIGdlb2dyYXBoaWNhbCBwb2ludHMuXG4gICAqL1xuICBfZ2VuZXJhdGVfR2VvZGVzaWM6IGZ1bmN0aW9uKGxhdGxuZ3MpIHtcbiAgICBsZXQgX2dlbyA9IFtdLCBfZ2VvY250ID0gMDtcblxuICAgIGZvciAobGV0IHBvbHkgPSAwOyBwb2x5IDwgbGF0bG5ncy5sZW5ndGg7IHBvbHkrKykge1xuICAgICAgX2dlb1tfZ2VvY250XSA9IFtdO1xuICAgICAgbGV0IHByZXYgPSBMLmxhdExuZyhsYXRsbmdzW3BvbHldWzBdKTtcbiAgICAgIGZvciAobGV0IHBvaW50cyA9IDA7IHBvaW50cyA8IChsYXRsbmdzW3BvbHldLmxlbmd0aCAtIDEpOyBwb2ludHMrKykge1xuICAgICAgICAvLyB1c2UgcHJldiwgc28gdGhhdCB3cmFwcGluZyBiZWhhdmVzIGNvcnJlY3RseVxuICAgICAgICBsZXQgcG9pbnRBID0gcHJldjtcbiAgICAgICAgbGV0IHBvaW50QiA9IEwubGF0TG5nKGxhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pO1xuICAgICAgICBpZiAocG9pbnRBLmVxdWFscyhwb2ludEIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHBvaW50QSwgcG9pbnRCKTtcbiAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKHByZXYpO1xuICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XG4gICAgICAgICAgbGV0IGRpc3RhbmNlID0gaW52ZXJzZS5kaXN0YW5jZSAvIHRoaXMub3B0aW9ucy5zdGVwcztcbiAgICAgICAgICAvLyBkYXNoZWQgbGluZXMgZG9uJ3QgZ28gdGhlIGZ1bGwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnRzXG4gICAgICAgICAgbGV0IGRpc3RfbXVsdCA9IHMgLSAxICsgdGhpcy5vcHRpb25zLmRhc2g7XG4gICAgICAgICAgbGV0IGRpcmVjdCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKmRpc3RfbXVsdCwgdGhpcy5vcHRpb25zLndyYXApO1xuICAgICAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhncC5sbmcgLSBwcmV2LmxuZykgPiAxODApIHtcbiAgICAgICAgICAgIGxldCBzZWMgPSB0aGlzLl9pbnRlcnNlY3Rpb24ocG9pbnRBLCBpbnZlcnNlLmluaXRpYWxCZWFyaW5nLCB7XG4gICAgICAgICAgICAgIGxhdDogLTg5LFxuICAgICAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgaWYgKHNlYykge1xuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xuICAgICAgICAgICAgICBfZ2VvY250Kys7XG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcbiAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcbiAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKHByZXYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX2dlb2NudCsrO1xuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChncCk7XG4gICAgICAgICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgICAgICAgcysrO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChncCk7XG4gICAgICAgICAgICAvLyBEYXNoZWQgbGluZXMgc3RhcnQgYSBuZXcgbGluZVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXNoIDwgMSl7XG4gICAgICAgICAgICAgICAgX2dlb2NudCsrO1xuICAgICAgICAgICAgICAgIC8vIGdvIGZ1bGwgZGlzdGFuY2UgdGhpcyB0aW1lLCB0byBnZXQgc3RhcnRpbmcgcG9pbnQgZm9yIG5leHQgbGluZVxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3RfZnVsbCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKnMsIHRoaXMub3B0aW9ucy53cmFwKTtcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XG4gICAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKGRpcmVjdF9mdWxsLmxhdCwgZGlyZWN0X2Z1bGwubG5nKTtcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHByZXYgPSBncDtcbiAgICAgICAgICAgIHMrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9nZW9jbnQrKztcbiAgICB9XG4gICAgcmV0dXJuIF9nZW87XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpbmNlbnR5IGRpcmVjdCBjYWxjdWxhdGlvbi5cbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluaXRpYWxCZWFyaW5nIC0gSW5pdGlhbCBiZWFyaW5nIGluIGRlZ3JlZXMgZnJvbSBub3J0aC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gRGlzdGFuY2UgYWxvbmcgYmVhcmluZyBpbiBtZXRyZXMuXG4gICAqIEByZXR1cm5zIChPYmplY3R9IE9iamVjdCBpbmNsdWRpbmcgcG9pbnQgKGRlc3RpbmF0aW9uIHBvaW50KSwgZmluYWxCZWFyaW5nLlxuICAgKi9cblxuICBfdmluY2VudHlfZGlyZWN0OiBmdW5jdGlvbihwMSwgaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlLCB3cmFwKSB7XG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgzrExID0gaW5pdGlhbEJlYXJpbmcudG9SYWRpYW5zKCk7XG4gICAgdmFyIHMgPSBkaXN0YW5jZTtcblxuICAgIHZhciBhID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYSxcbiAgICAgIGIgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5iLFxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XG5cbiAgICB2YXIgc2luzrExID0gTWF0aC5zaW4ozrExKTtcbiAgICB2YXIgY29zzrExID0gTWF0aC5jb3MozrExKTtcblxuICAgIHZhciB0YW5VMSA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjEpLFxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxuICAgICAgc2luVTEgPSB0YW5VMSAqIGNvc1UxO1xuICAgIHZhciDPgzEgPSBNYXRoLmF0YW4yKHRhblUxLCBjb3POsTEpO1xuICAgIHZhciBzaW7OsSA9IGNvc1UxICogc2luzrExO1xuICAgIHZhciBjb3NTcc6xID0gMSAtIHNpbs6xICogc2luzrE7XG4gICAgdmFyIHVTcSA9IGNvc1NxzrEgKiAoYSAqIGEgLSBiICogYikgLyAoYiAqIGIpO1xuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxuICAgICAgdVNxKSkpO1xuICAgIHZhciBCID0gdVNxIC8gMTAyNCAqICgyNTYgKyB1U3EgKiAoLTEyOCArIHVTcSAqICg3NCAtIDQ3ICogdVNxKSkpO1xuXG4gICAgdmFyIM+DID0gcyAvIChiICogQSksXG4gICAgICDPg8q5LCBpdGVyYXRpb25zID0gMDtcbiAgICB2YXIgc2luz4MsIGNvc8+DO1xuICAgIHZhciBjb3Myz4NNO1xuICAgIGRvIHtcbiAgICAgIGNvczLPg00gPSBNYXRoLmNvcygyICogz4MxICsgz4MpO1xuICAgICAgc2luz4MgPSBNYXRoLnNpbijPgyk7XG4gICAgICBjb3PPgyA9IE1hdGguY29zKM+DKTtcbiAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcbiAgICAgICAgICBjb3Myz4NNKSAtXG4gICAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcbiAgICAgICAgICBjb3Myz4NNKSkpO1xuICAgICAgz4PKuSA9IM+DO1xuICAgICAgz4MgPSBzIC8gKGIgKiBBKSArIM6Uz4M7XG4gICAgfSB3aGlsZSAoTWF0aC5hYnMoz4MgLSDPg8q5KSA+IDFlLTEyICYmICsraXRlcmF0aW9ucyk7XG5cbiAgICB2YXIgeCA9IHNpblUxICogc2luz4MgLSBjb3NVMSAqIGNvc8+DICogY29zzrExO1xuICAgIHZhciDPhjIgPSBNYXRoLmF0YW4yKHNpblUxICogY29zz4MgKyBjb3NVMSAqIHNpbs+DICogY29zzrExLCAoMSAtIGYpICpcbiAgICAgIE1hdGguc3FydChzaW7OsSAqIHNpbs6xICsgeCAqIHgpKTtcbiAgICB2YXIgzrsgPSBNYXRoLmF0YW4yKHNpbs+DICogc2luzrExLCBjb3NVMSAqIGNvc8+DIC0gc2luVTEgKiBzaW7PgyAqIGNvc86xMSk7XG4gICAgdmFyIEMgPSBmIC8gMTYgKiBjb3NTcc6xICogKDQgKyBmICogKDQgLSAzICogY29zU3HOsSkpO1xuICAgIHZhciBMID0gzrsgLSAoMSAtIEMpICogZiAqIHNpbs6xICpcbiAgICAgICjPgyArIEMgKiBzaW7PgyAqIChjb3Myz4NNICsgQyAqIGNvc8+DICogKC0xICsgMiAqIGNvczLPg00gKiBjb3Myz4NNKSkpO1xuXG4gICAgdmFyIM67MjtcbiAgICBpZiAod3JhcCkge1xuICAgICAgzrsyID0gKM67MSArIEwgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gbm9ybWFsaXNlIHRvIC0xODAuLi4rMTgwXG4gICAgfSBlbHNlIHtcbiAgICAgIM67MiA9ICjOuzEgKyBMKTsgLy8gZG8gbm90IG5vcm1hbGl6ZVxuICAgIH1cblxuICAgIHZhciByZXZBeiA9IE1hdGguYXRhbjIoc2luzrEsIC14KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYXQ6IM+GMi50b0RlZ3JlZXMoKSxcbiAgICAgIGxuZzogzrsyLnRvRGVncmVlcygpLFxuICAgICAgZmluYWxCZWFyaW5nOiByZXZBei50b0RlZ3JlZXMoKVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpbmNlbnR5IGludmVyc2UgY2FsY3VsYXRpb24uXG4gICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGF0TG5nfSBwMSAtIExhdGl0dWRlL2xvbmdpdHVkZSBvZiBzdGFydCBwb2ludC5cbiAgICogQHBhcmFtIHtMYXRMbmd9IHAyIC0gTGF0aXR1ZGUvbG9uZ2l0dWRlIG9mIGRlc3RpbmF0aW9uIHBvaW50LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgaW5jbHVkaW5nIGRpc3RhbmNlLCBpbml0aWFsQmVhcmluZywgZmluYWxCZWFyaW5nLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZm9ybXVsYSBmYWlsZWQgdG8gY29udmVyZ2UuXG4gICAqL1xuICBfdmluY2VudHlfaW52ZXJzZTogZnVuY3Rpb24ocDEsIHAyKSB7XG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgz4YyID0gcDIubGF0LnRvUmFkaWFucygpLFxuICAgICAgzrsyID0gcDIubG5nLnRvUmFkaWFucygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxuICAgICAgYiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmIsXG4gICAgICBmID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuZjtcblxuICAgIHZhciBMID0gzrsyIC0gzrsxO1xuICAgIHZhciB0YW5VMSA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjEpLFxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxuICAgICAgc2luVTEgPSB0YW5VMSAqIGNvc1UxO1xuICAgIHZhciB0YW5VMiA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjIpLFxuICAgICAgY29zVTIgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTIgKiB0YW5VMikpLFxuICAgICAgc2luVTIgPSB0YW5VMiAqIGNvc1UyO1xuXG4gICAgdmFyIM67ID0gTCxcbiAgICAgIM67yrksIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHZhciBjb3NTcc6xLCBzaW7PgywgY29zMs+DTSwgY29zz4MsIM+DLCBzaW7OuywgY29zzrs7XG4gICAgZG8ge1xuICAgICAgc2luzrsgPSBNYXRoLnNpbijOuyk7XG4gICAgICBjb3POuyA9IE1hdGguY29zKM67KTtcbiAgICAgIHZhciBzaW5Tcc+DID0gKGNvc1UyICogc2luzrspICogKGNvc1UyICogc2luzrspICsgKGNvc1UxICogc2luVTIgLVxuICAgICAgICBzaW5VMSAqIGNvc1UyICogY29zzrspICogKGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICogY29zzrspO1xuICAgICAgc2luz4MgPSBNYXRoLnNxcnQoc2luU3HPgyk7XG4gICAgICBpZiAoc2luz4MgPT0gMCkgcmV0dXJuIDA7IC8vIGNvLWluY2lkZW50IHBvaW50c1xuICAgICAgY29zz4MgPSBzaW5VMSAqIHNpblUyICsgY29zVTEgKiBjb3NVMiAqIGNvc867O1xuICAgICAgz4MgPSBNYXRoLmF0YW4yKHNpbs+DLCBjb3PPgyk7XG4gICAgICB2YXIgc2luzrEgPSBjb3NVMSAqIGNvc1UyICogc2luzrsgLyBzaW7PgztcbiAgICAgIGNvc1NxzrEgPSAxIC0gc2luzrEgKiBzaW7OsTtcbiAgICAgIGNvczLPg00gPSBjb3PPgyAtIDIgKiBzaW5VMSAqIHNpblUyIC8gY29zU3HOsTtcbiAgICAgIGlmIChpc05hTihjb3Myz4NNKSkgY29zMs+DTSA9IDA7IC8vIGVxdWF0b3JpYWwgbGluZTogY29zU3HOsT0wICjCpzYpXG4gICAgICB2YXIgQyA9IGYgLyAxNiAqIGNvc1NxzrEgKiAoNCArIGYgKiAoNCAtIDMgKiBjb3NTcc6xKSk7XG4gICAgICDOu8q5ID0gzrs7XG4gICAgICDOuyA9IEwgKyAoMSAtIEMpICogZiAqIHNpbs6xICogKM+DICsgQyAqIHNpbs+DICogKGNvczLPg00gKyBDICogY29zz4MgKiAoLVxuICAgICAgICAxICsgMiAqIGNvczLPg00gKiBjb3Myz4NNKSkpO1xuICAgIH0gd2hpbGUgKE1hdGguYWJzKM67IC0gzrvKuSkgPiAxZS0xMiAmJiArK2l0ZXJhdGlvbnMgPCAxMDApO1xuICAgIGlmIChpdGVyYXRpb25zID49IDEwMCkge1xuICAgICAgY29uc29sZS5sb2coXCJGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZS4gQWx0ZXJpbmcgdGFyZ2V0IHBvc2l0aW9uLlwiKTtcbiAgICAgIHJldHVybiB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHAxLCB7XG4gICAgICAgICAgbGF0OiBwMi5sYXQsXG4gICAgICAgICAgbG5nOiBwMi5sbmcgLSAwLjAxXG4gICAgICAgIH0pO1xuICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZScpO1xuICAgIH1cblxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcbiAgICB2YXIgQSA9IDEgKyB1U3EgLyAxNjM4NCAqICg0MDk2ICsgdVNxICogKC03NjggKyB1U3EgKiAoMzIwIC0gMTc1ICpcbiAgICAgIHVTcSkpKTtcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcbiAgICB2YXIgzpTPgyA9IEIgKiBzaW7PgyAqIChjb3Myz4NNICsgQiAvIDQgKiAoY29zz4MgKiAoLTEgKyAyICogY29zMs+DTSAqXG4gICAgICAgIGNvczLPg00pIC1cbiAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcbiAgICAgICAgY29zMs+DTSkpKTtcblxuICAgIHZhciBzID0gYiAqIEEgKiAoz4MgLSDOlM+DKTtcblxuICAgIHZhciBmd2RBeiA9IE1hdGguYXRhbjIoY29zVTIgKiBzaW7OuywgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKlxuICAgICAgY29zzrspO1xuICAgIHZhciByZXZBeiA9IE1hdGguYXRhbjIoY29zVTEgKiBzaW7OuywgLXNpblUxICogY29zVTIgKyBjb3NVMSAqIHNpblUyICpcbiAgICAgIGNvc867KTtcblxuICAgIHMgPSBOdW1iZXIocy50b0ZpeGVkKDMpKTsgLy8gcm91bmQgdG8gMW1tIHByZWNpc2lvblxuICAgIHJldHVybiB7XG4gICAgICBkaXN0YW5jZTogcyxcbiAgICAgIGluaXRpYWxCZWFyaW5nOiBmd2RBei50b0RlZ3JlZXMoKSxcbiAgICAgIGZpbmFsQmVhcmluZzogcmV2QXoudG9EZWdyZWVzKClcbiAgICB9O1xuICB9LFxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0d28gcGF0aHMgZGVmaW5lZCBieSBwb2ludCBhbmQgYmVhcmluZy5cbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcbiAgICpcbiAgICogQHBhcmFtIHtMYXRMb259IHAxIC0gRmlyc3QgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMSAtIEluaXRpYWwgYmVhcmluZyBmcm9tIGZpcnN0IHBvaW50LlxuICAgKiBAcGFyYW0ge0xhdExvbn0gcDIgLSBTZWNvbmQgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMiAtIEluaXRpYWwgYmVhcmluZyBmcm9tIHNlY29uZCBwb2ludC5cbiAgICogQHJldHVybnMge09iamVjdH0gY29udGFpbmluZyBsYXQvbG5nIGluZm9ybWF0aW9uIG9mIGludGVyc2VjdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHAxID0gTGF0TG9uKDUxLjg4NTMsIDAuMjU0NSksIGJybmcxID0gMTA4LjU1O1xuICAgKiB2YXIgcDIgPSBMYXRMb24oNDkuMDAzNCwgMi41NzM1KSwgYnJuZzIgPSAzMi40NDtcbiAgICogdmFyIHBJbnQgPSBMYXRMb24uaW50ZXJzZWN0aW9uKHAxLCBicm5nMSwgcDIsIGJybmcyKTsgLy8gcEludC50b1N0cmluZygpOiA1MC45MDc4wrBOLCA0LjUwODTCsEVcbiAgICovXG4gIF9pbnRlcnNlY3Rpb246IGZ1bmN0aW9uKHAxLCBicm5nMSwgcDIsIGJybmcyKSB7XG4gICAgLy8gc2VlIGh0dHA6Ly93aWxsaWFtcy5iZXN0LnZ3aC5uZXQvYXZmb3JtLmh0bSNJbnRlcnNlY3Rpb25cblxuICAgIHZhciDPhjEgPSBwMS5sYXQudG9SYWRpYW5zKCksXG4gICAgICDOuzEgPSBwMS5sbmcudG9SYWRpYW5zKCk7XG4gICAgdmFyIM+GMiA9IHAyLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MiA9IHAyLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgzrgxMyA9IE51bWJlcihicm5nMSkudG9SYWRpYW5zKCksXG4gICAgICDOuDIzID0gTnVtYmVyKGJybmcyKS50b1JhZGlhbnMoKTtcbiAgICB2YXIgzpTPhiA9IM+GMiAtIM+GMSxcbiAgICAgIM6UzrsgPSDOuzIgLSDOuzE7XG5cbiAgICB2YXIgzrQxMiA9IDIgKiBNYXRoLmFzaW4oTWF0aC5zcXJ0KE1hdGguc2luKM6Uz4YgLyAyKSAqIE1hdGguc2luKM6Uz4YgLyAyKSArXG4gICAgICBNYXRoLmNvcyjPhjEpICogTWF0aC5jb3Moz4YyKSAqIE1hdGguc2luKM6UzrsgLyAyKSAqIE1hdGguc2luKM6UzrsgL1xuICAgICAgICAyKSkpO1xuICAgIGlmICjOtDEyID09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gaW5pdGlhbC9maW5hbCBiZWFyaW5ncyBiZXR3ZWVuIHBvaW50c1xuICAgIHZhciDOuDEgPSBNYXRoLmFjb3MoKE1hdGguc2luKM+GMikgLSBNYXRoLnNpbijPhjEpICogTWF0aC5jb3MozrQxMikpIC9cbiAgICAgIChNYXRoLnNpbijOtDEyKSAqIE1hdGguY29zKM+GMSkpKTtcbiAgICBpZiAoaXNOYU4ozrgxKSkgzrgxID0gMDsgLy8gcHJvdGVjdCBhZ2FpbnN0IHJvdW5kaW5nXG4gICAgdmFyIM64MiA9IE1hdGguYWNvcygoTWF0aC5zaW4oz4YxKSAtIE1hdGguc2luKM+GMikgKiBNYXRoLmNvcyjOtDEyKSkgL1xuICAgICAgKE1hdGguc2luKM60MTIpICogTWF0aC5jb3Moz4YyKSkpO1xuICAgIHZhciDOuDEyLCDOuDIxO1xuICAgIGlmIChNYXRoLnNpbijOuzIgLSDOuzEpID4gMCkge1xuICAgICAgzrgxMiA9IM64MTtcbiAgICAgIM64MjEgPSAyICogTWF0aC5QSSAtIM64MjtcbiAgICB9IGVsc2Uge1xuICAgICAgzrgxMiA9IDIgKiBNYXRoLlBJIC0gzrgxO1xuICAgICAgzrgyMSA9IM64MjtcbiAgICB9XG5cbiAgICB2YXIgzrExID0gKM64MTMgLSDOuDEyICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMi0xLTNcbiAgICB2YXIgzrEyID0gKM64MjEgLSDOuDIzICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMS0yLTNcblxuICAgIGlmIChNYXRoLnNpbijOsTEpID09IDAgJiYgTWF0aC5zaW4ozrEyKSA9PSAwKSByZXR1cm4gbnVsbDsgLy8gaW5maW5pdGUgaW50ZXJzZWN0aW9uc1xuICAgIGlmIChNYXRoLnNpbijOsTEpICogTWF0aC5zaW4ozrEyKSA8IDApIHJldHVybiBudWxsOyAvLyBhbWJpZ3VvdXMgaW50ZXJzZWN0aW9uXG5cbiAgICAvL86xMSA9IE1hdGguYWJzKM6xMSk7XG4gICAgLy/OsTIgPSBNYXRoLmFicyjOsTIpO1xuICAgIC8vIC4uLiBFZCBXaWxsaWFtcyB0YWtlcyBhYnMgb2YgzrExL86xMiwgYnV0IHNlZW1zIHRvIGJyZWFrIGNhbGN1bGF0aW9uP1xuXG4gICAgdmFyIM6xMyA9IE1hdGguYWNvcygtTWF0aC5jb3MozrExKSAqIE1hdGguY29zKM6xMikgK1xuICAgICAgTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMikgKiBNYXRoLmNvcyjOtDEyKSk7XG4gICAgdmFyIM60MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM60MTIpICogTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMiksXG4gICAgICBNYXRoLmNvcyjOsTIpICsgTWF0aC5jb3MozrExKSAqIE1hdGguY29zKM6xMykpO1xuICAgIHZhciDPhjMgPSBNYXRoLmFzaW4oTWF0aC5zaW4oz4YxKSAqIE1hdGguY29zKM60MTMpICtcbiAgICAgIE1hdGguY29zKM+GMSkgKiBNYXRoLnNpbijOtDEzKSAqIE1hdGguY29zKM64MTMpKTtcbiAgICB2YXIgzpTOuzEzID0gTWF0aC5hdGFuMihNYXRoLnNpbijOuDEzKSAqIE1hdGguc2luKM60MTMpICogTWF0aC5jb3Moz4YxKSxcbiAgICAgIE1hdGguY29zKM60MTMpIC0gTWF0aC5zaW4oz4YxKSAqIE1hdGguc2luKM+GMykpO1xuICAgIHZhciDOuzMgPSDOuzEgKyDOlM67MTM7XG4gICAgzrszID0gKM67MyArIDMgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBub3JtYWxpc2UgdG8gLTE4MC4uKzE4MMK6XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiDPhjMudG9EZWdyZWVzKCksXG4gICAgICBsbmc6IM67My50b0RlZ3JlZXMoKVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIE92ZXJ3cml0ZXMgb2JqMSdzIHZhbHVlcyB3aXRoIG9iajIncyBhbmQgYWRkcyBvYmoyJ3MgaWYgbm9uIGV4aXN0ZW50IGluIG9iajFcbiAgICogQHBhcmFtIG9iajFcbiAgICogQHBhcmFtIG9iajJcbiAgICogQHJldHVybnMgb2JqMyBhIG5ldyBvYmplY3QgYmFzZWQgb24gb2JqMSBhbmQgb2JqMlxuICAgKi9cbiAgX21lcmdlX29wdGlvbnM6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHtcbiAgICBsZXQgb2JqMyA9IHt9O1xuICAgIGZvciAobGV0IGF0dHJuYW1lIGluIG9iajEpIHtcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMVthdHRybmFtZV07XG4gICAgfVxuICAgIGZvciAobGV0IGF0dHJuYW1lIGluIG9iajIpIHtcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMlthdHRybmFtZV07XG4gICAgfVxuICAgIHJldHVybiBvYmozO1xuICB9XG59KTtcblxuTC5nZW9kZXNpYyA9IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBMLkdlb2Rlc2ljKGxhdGxuZ3MsIG9wdGlvbnMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0xlYWZsZXQuR2VvZGVzaWMvTGVhZmxldC5HZW9kZXNpYy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\n"); +eval("\r\n\r\n// This file is part of Leaflet.Geodesic.\r\n// Copyright (C) 2017 Henry Thasler\r\n// based on code by Chris Veness Copyright (C) 2014 https://github.com/chrisveness/geodesy\r\n//\r\n// Leaflet.Geodesic is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n//\r\n// Leaflet.Geodesic is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with Leaflet.Geodesic. If not, see .\r\n\r\n\r\n/** Extend Number object with method to convert numeric degrees to radians */\r\nif (typeof Number.prototype.toRadians === \"undefined\") {\r\n Number.prototype.toRadians = function() {\r\n return this * Math.PI / 180;\r\n };\r\n}\r\n\r\n/** Extend Number object with method to convert radians to numeric (signed) degrees */\r\nif (typeof Number.prototype.toDegrees === \"undefined\") {\r\n Number.prototype.toDegrees = function() {\r\n return this * 180 / Math.PI;\r\n };\r\n}\r\n\r\nvar INTERSECT_LNG = 179.999; // Lng used for intersection and wrap around on map edges\r\n\r\nL.Geodesic = L.Polyline.extend({\r\n options: {\r\n color: \"blue\",\r\n steps: 10,\r\n dash: 1,\r\n wrap: true\r\n },\r\n\r\n initialize: function(latlngs, options) {\r\n this.options = this._merge_options(this.options, options);\r\n this.options.dash = Math.max(1e-3, Math.min(1, parseFloat(this.options.dash) || 1));\r\n this.datum = {};\r\n this.datum.ellipsoid = {\r\n a: 6378137,\r\n b: 6356752.3142,\r\n f: 1 / 298.257223563\r\n }; // WGS-84\r\n this._latlngs = this._generate_Geodesic(latlngs);\r\n L.Polyline.prototype.initialize.call(this, this._latlngs, this.options);\r\n },\r\n\r\n setLatLngs: function(latlngs) {\r\n this._latlngs = this._generate_Geodesic(latlngs);\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Calculates some statistic values of current geodesic multipolyline\r\n * @returns (Object} Object with several properties (e.g. overall distance)\r\n */\r\n getStats: function() {\r\n let obj = {\r\n distance: 0,\r\n points: 0,\r\n polygons: this._latlngs.length\r\n }, poly, points;\r\n\r\n for (poly = 0; poly < this._latlngs.length; poly++) {\r\n obj.points += this._latlngs[poly].length;\r\n for (points = 0; points < (this._latlngs[poly].length - 1); points++) {\r\n obj.distance += this._vincenty_inverse(this._latlngs[poly][points],\r\n this._latlngs[poly][points + 1]).distance;\r\n }\r\n }\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Creates geodesic lines from geoJson. Replaces all current features of this instance.\r\n * Supports LineString, MultiLineString and Polygon\r\n * @param {Object} geojson - geosjon as object.\r\n */\r\n geoJson: function(geojson) {\r\n\r\n let normalized = L.GeoJSON.asFeature(geojson);\r\n let features = normalized.type === \"FeatureCollection\" ? normalized.features : [\r\n normalized\r\n ];\r\n this._latlngs = [];\r\n for (let feature of features) {\r\n let geometry = feature.type === \"Feature\" ? feature.geometry :\r\n feature,\r\n coords = geometry.coordinates;\r\n\r\n switch (geometry.type) {\r\n case \"LineString\":\r\n this._latlngs.push(this._generate_Geodesic([L.GeoJSON.coordsToLatLngs(\r\n coords, 0)]));\r\n break;\r\n case \"MultiLineString\":\r\n case \"Polygon\":\r\n this._latlngs.push(this._generate_Geodesic(L.GeoJSON.coordsToLatLngs(\r\n coords, 1)));\r\n break;\r\n case \"Point\":\r\n case \"MultiPoint\":\r\n console.log(\"Dude, points can't be drawn as geodesic lines...\");\r\n break;\r\n default:\r\n console.log(\"Drawing \" + geometry.type +\r\n \" as a geodesic is not supported. Skipping...\");\r\n }\r\n }\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Creates a great circle. Replaces all current lines.\r\n * @param {Object} center - geographic position\r\n * @param {number} radius - radius of the circle in metres\r\n */\r\n createCircle: function(center, radius) {\r\n let polylineIndex = 0;\r\n let prev = {\r\n lat: 0,\r\n lng: 0,\r\n brg: 0\r\n };\r\n let step;\r\n\r\n this._latlngs = [];\r\n this._latlngs[polylineIndex] = [];\r\n\r\n let direct = this._vincenty_direct(L.latLng(center), 0, radius, this.options\r\n .wrap);\r\n prev = L.latLng(direct.lat, direct.lng);\r\n this._latlngs[polylineIndex].push(prev);\r\n for (step = 1; step <= this.options.steps;) {\r\n direct = this._vincenty_direct(L.latLng(center), 360 / this.options\r\n .steps * step, radius, this.options.wrap);\r\n let gp = L.latLng(direct.lat, direct.lng);\r\n if (Math.abs(gp.lng - prev.lng) > 180) {\r\n let inverse = this._vincenty_inverse(prev, gp);\r\n let sec = this._intersection(prev, inverse.initialBearing, {\r\n lat: -89,\r\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\r\n }, 0);\r\n if (sec) {\r\n this._latlngs[polylineIndex].push(L.latLng(sec.lat, sec.lng));\r\n polylineIndex++;\r\n this._latlngs[polylineIndex] = [];\r\n prev = L.latLng(sec.lat, -sec.lng);\r\n this._latlngs[polylineIndex].push(prev);\r\n } else {\r\n polylineIndex++;\r\n this._latlngs[polylineIndex] = [];\r\n this._latlngs[polylineIndex].push(gp);\r\n prev = gp;\r\n step++;\r\n }\r\n } else {\r\n this._latlngs[polylineIndex].push(gp);\r\n prev = gp;\r\n step++;\r\n }\r\n }\r\n\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Creates a geodesic Polyline from given coordinates\r\n * Note: dashed lines are under work\r\n * @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline\r\n * @returns (Object} An array of arrays of geographical points.\r\n */\r\n _generate_Geodesic: function(latlngs) {\r\n let _geo = [], _geocnt = 0;\r\n\r\n for (let poly = 0; poly < latlngs.length; poly++) {\r\n _geo[_geocnt] = [];\r\n let prev = L.latLng(latlngs[poly][0]);\r\n for (let points = 0; points < (latlngs[poly].length - 1); points++) {\r\n // use prev, so that wrapping behaves correctly\r\n let pointA = prev;\r\n let pointB = L.latLng(latlngs[poly][points + 1]);\r\n if (pointA.equals(pointB)) {\r\n continue;\r\n }\r\n let inverse = this._vincenty_inverse(pointA, pointB);\r\n _geo[_geocnt].push(prev);\r\n for (let s = 1; s <= this.options.steps;) {\r\n let distance = inverse.distance / this.options.steps;\r\n // dashed lines don't go the full distance between the points\r\n let dist_mult = s - 1 + this.options.dash;\r\n let direct = this._vincenty_direct(pointA, inverse.initialBearing, distance*dist_mult, this.options.wrap);\r\n let gp = L.latLng(direct.lat, direct.lng);\r\n if (Math.abs(gp.lng - prev.lng) > 180) {\r\n let sec = this._intersection(pointA, inverse.initialBearing, {\r\n lat: -89,\r\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\r\n }, 0);\r\n if (sec) {\r\n _geo[_geocnt].push(L.latLng(sec.lat, sec.lng));\r\n _geocnt++;\r\n _geo[_geocnt] = [];\r\n prev = L.latLng(sec.lat, -sec.lng);\r\n _geo[_geocnt].push(prev);\r\n } else {\r\n _geocnt++;\r\n _geo[_geocnt] = [];\r\n _geo[_geocnt].push(gp);\r\n prev = gp;\r\n s++;\r\n } \r\n } else {\r\n _geo[_geocnt].push(gp);\r\n // Dashed lines start a new line\r\n if (this.options.dash < 1){\r\n _geocnt++;\r\n // go full distance this time, to get starting point for next line\r\n let direct_full = this._vincenty_direct(pointA, inverse.initialBearing, distance*s, this.options.wrap);\r\n _geo[_geocnt] = [];\r\n prev = L.latLng(direct_full.lat, direct_full.lng);\r\n _geo[_geocnt].push(prev);\r\n }\r\n else prev = gp;\r\n s++;\r\n }\r\n }\r\n }\r\n _geocnt++;\r\n }\r\n return _geo;\r\n },\r\n\r\n /**\r\n * Vincenty direct calculation.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @private\r\n * @param {number} initialBearing - Initial bearing in degrees from north.\r\n * @param {number} distance - Distance along bearing in metres.\r\n * @returns (Object} Object including point (destination point), finalBearing.\r\n */\r\n\r\n _vincenty_direct: function(p1, initialBearing, distance, wrap) {\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var α1 = initialBearing.toRadians();\r\n var s = distance;\r\n\r\n var a = this.datum.ellipsoid.a,\r\n b = this.datum.ellipsoid.b,\r\n f = this.datum.ellipsoid.f;\r\n\r\n var sinα1 = Math.sin(α1);\r\n var cosα1 = Math.cos(α1);\r\n\r\n var tanU1 = (1 - f) * Math.tan(φ1),\r\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\r\n sinU1 = tanU1 * cosU1;\r\n var σ1 = Math.atan2(tanU1, cosα1);\r\n var sinα = cosU1 * sinα1;\r\n var cosSqα = 1 - sinα * sinα;\r\n var uSq = cosSqα * (a * a - b * b) / (b * b);\r\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\r\n uSq)));\r\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\r\n\r\n var σ = s / (b * A),\r\n σʹ, iterations = 0;\r\n var sinσ, cosσ;\r\n var cos2σM;\r\n do {\r\n cos2σM = Math.cos(2 * σ1 + σ);\r\n sinσ = Math.sin(σ);\r\n cosσ = Math.cos(σ);\r\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\r\n cos2σM) -\r\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\r\n cos2σM)));\r\n σʹ = σ;\r\n σ = s / (b * A) + Δσ;\r\n } while (Math.abs(σ - σʹ) > 1e-12 && ++iterations);\r\n\r\n var x = sinU1 * sinσ - cosU1 * cosσ * cosα1;\r\n var φ2 = Math.atan2(sinU1 * cosσ + cosU1 * sinσ * cosα1, (1 - f) *\r\n Math.sqrt(sinα * sinα + x * x));\r\n var λ = Math.atan2(sinσ * sinα1, cosU1 * cosσ - sinU1 * sinσ * cosα1);\r\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\r\n var L = λ - (1 - C) * f * sinα *\r\n (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));\r\n\r\n var λ2;\r\n if (wrap) {\r\n λ2 = (λ1 + L + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180...+180\r\n } else {\r\n λ2 = (λ1 + L); // do not normalize\r\n }\r\n\r\n var revAz = Math.atan2(sinα, -x);\r\n\r\n return {\r\n lat: φ2.toDegrees(),\r\n lng: λ2.toDegrees(),\r\n finalBearing: revAz.toDegrees()\r\n };\r\n },\r\n\r\n /**\r\n * Vincenty inverse calculation.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @private\r\n * @param {LatLng} p1 - Latitude/longitude of start point.\r\n * @param {LatLng} p2 - Latitude/longitude of destination point.\r\n * @returns {Object} Object including distance, initialBearing, finalBearing.\r\n * @throws {Error} If formula failed to converge.\r\n */\r\n _vincenty_inverse: function(p1, p2) {\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var φ2 = p2.lat.toRadians(),\r\n λ2 = p2.lng.toRadians();\r\n\r\n var a = this.datum.ellipsoid.a,\r\n b = this.datum.ellipsoid.b,\r\n f = this.datum.ellipsoid.f;\r\n\r\n var L = λ2 - λ1;\r\n var tanU1 = (1 - f) * Math.tan(φ1),\r\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\r\n sinU1 = tanU1 * cosU1;\r\n var tanU2 = (1 - f) * Math.tan(φ2),\r\n cosU2 = 1 / Math.sqrt((1 + tanU2 * tanU2)),\r\n sinU2 = tanU2 * cosU2;\r\n\r\n var λ = L,\r\n λʹ, iterations = 0;\r\n var cosSqα, sinσ, cos2σM, cosσ, σ, sinλ, cosλ;\r\n do {\r\n sinλ = Math.sin(λ);\r\n cosλ = Math.cos(λ);\r\n var sinSqσ = (cosU2 * sinλ) * (cosU2 * sinλ) + (cosU1 * sinU2 -\r\n sinU1 * cosU2 * cosλ) * (cosU1 * sinU2 - sinU1 * cosU2 * cosλ);\r\n sinσ = Math.sqrt(sinSqσ);\r\n if (sinσ == 0) return 0; // co-incident points\r\n cosσ = sinU1 * sinU2 + cosU1 * cosU2 * cosλ;\r\n σ = Math.atan2(sinσ, cosσ);\r\n var sinα = cosU1 * cosU2 * sinλ / sinσ;\r\n cosSqα = 1 - sinα * sinα;\r\n cos2σM = cosσ - 2 * sinU1 * sinU2 / cosSqα;\r\n if (isNaN(cos2σM)) cos2σM = 0; // equatorial line: cosSqα=0 (§6)\r\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\r\n λʹ = λ;\r\n λ = L + (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-\r\n 1 + 2 * cos2σM * cos2σM)));\r\n } while (Math.abs(λ - λʹ) > 1e-12 && ++iterations < 100);\r\n if (iterations >= 100) {\r\n console.log(\"Formula failed to converge. Altering target position.\");\r\n return this._vincenty_inverse(p1, {\r\n lat: p2.lat,\r\n lng: p2.lng - 0.01\r\n });\r\n // throw new Error('Formula failed to converge');\r\n }\r\n\r\n var uSq = cosSqα * (a * a - b * b) / (b * b);\r\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\r\n uSq)));\r\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\r\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\r\n cos2σM) -\r\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\r\n cos2σM)));\r\n\r\n var s = b * A * (σ - Δσ);\r\n\r\n var fwdAz = Math.atan2(cosU2 * sinλ, cosU1 * sinU2 - sinU1 * cosU2 *\r\n cosλ);\r\n var revAz = Math.atan2(cosU1 * sinλ, -sinU1 * cosU2 + cosU1 * sinU2 *\r\n cosλ);\r\n\r\n s = Number(s.toFixed(3)); // round to 1mm precision\r\n return {\r\n distance: s,\r\n initialBearing: fwdAz.toDegrees(),\r\n finalBearing: revAz.toDegrees()\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Returns the point of intersection of two paths defined by point and bearing.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @param {LatLon} p1 - First point.\r\n * @param {number} brng1 - Initial bearing from first point.\r\n * @param {LatLon} p2 - Second point.\r\n * @param {number} brng2 - Initial bearing from second point.\r\n * @returns {Object} containing lat/lng information of intersection.\r\n *\r\n * @example\r\n * var p1 = LatLon(51.8853, 0.2545), brng1 = 108.55;\r\n * var p2 = LatLon(49.0034, 2.5735), brng2 = 32.44;\r\n * var pInt = LatLon.intersection(p1, brng1, p2, brng2); // pInt.toString(): 50.9078°N, 4.5084°E\r\n */\r\n _intersection: function(p1, brng1, p2, brng2) {\r\n // see http://williams.best.vwh.net/avform.htm#Intersection\r\n\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var φ2 = p2.lat.toRadians(),\r\n λ2 = p2.lng.toRadians();\r\n var θ13 = Number(brng1).toRadians(),\r\n θ23 = Number(brng2).toRadians();\r\n var Δφ = φ2 - φ1,\r\n Δλ = λ2 - λ1;\r\n\r\n var δ12 = 2 * Math.asin(Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\r\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ /\r\n 2)));\r\n if (δ12 == 0) return null;\r\n\r\n // initial/final bearings between points\r\n var θ1 = Math.acos((Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) /\r\n (Math.sin(δ12) * Math.cos(φ1)));\r\n if (isNaN(θ1)) θ1 = 0; // protect against rounding\r\n var θ2 = Math.acos((Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) /\r\n (Math.sin(δ12) * Math.cos(φ2)));\r\n var θ12, θ21;\r\n if (Math.sin(λ2 - λ1) > 0) {\r\n θ12 = θ1;\r\n θ21 = 2 * Math.PI - θ2;\r\n } else {\r\n θ12 = 2 * Math.PI - θ1;\r\n θ21 = θ2;\r\n }\r\n\r\n var α1 = (θ13 - θ12 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 2-1-3\r\n var α2 = (θ21 - θ23 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 1-2-3\r\n\r\n if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections\r\n if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection\r\n\r\n //α1 = Math.abs(α1);\r\n //α2 = Math.abs(α2);\r\n // ... Ed Williams takes abs of α1/α2, but seems to break calculation?\r\n\r\n var α3 = Math.acos(-Math.cos(α1) * Math.cos(α2) +\r\n Math.sin(α1) * Math.sin(α2) * Math.cos(δ12));\r\n var δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2),\r\n Math.cos(α2) + Math.cos(α1) * Math.cos(α3));\r\n var φ3 = Math.asin(Math.sin(φ1) * Math.cos(δ13) +\r\n Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13));\r\n var Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1),\r\n Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3));\r\n var λ3 = λ1 + Δλ13;\r\n λ3 = (λ3 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º\r\n\r\n return {\r\n lat: φ3.toDegrees(),\r\n lng: λ3.toDegrees()\r\n };\r\n },\r\n\r\n /**\r\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n * @param obj1\r\n * @param obj2\r\n * @returns obj3 a new object based on obj1 and obj2\r\n */\r\n _merge_options: function(obj1, obj2) {\r\n let obj3 = {};\r\n for (let attrname in obj1) {\r\n obj3[attrname] = obj1[attrname];\r\n }\r\n for (let attrname in obj2) {\r\n obj3[attrname] = obj2[attrname];\r\n }\r\n return obj3;\r\n }\r\n});\r\n\r\nL.geodesic = function(latlngs, options) {\r\n return new L.Geodesic(latlngs, options);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzPzU3NGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0Esc0JBQXNCLDJDQUEyQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9MZWFmbGV0Lkdlb2Rlc2ljL0xlYWZsZXQuR2VvZGVzaWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExlYWZsZXQuR2VvZGVzaWMuXHJcbi8vIENvcHlyaWdodCAoQykgMjAxNyAgSGVucnkgVGhhc2xlclxyXG4vLyBiYXNlZCBvbiBjb2RlIGJ5IENocmlzIFZlbmVzcyBDb3B5cmlnaHQgKEMpIDIwMTQgaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3lcclxuLy9cclxuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbi8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbi8vXHJcbi8vIExlYWZsZXQuR2VvZGVzaWMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcclxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcclxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4vLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4vL1xyXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4vLyBhbG9uZyB3aXRoIExlYWZsZXQuR2VvZGVzaWMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXHJcblxyXG5cclxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgbnVtZXJpYyBkZWdyZWVzIHRvIHJhZGlhbnMgKi9cclxuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gIE51bWJlci5wcm90b3R5cGUudG9SYWRpYW5zID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcyAqIE1hdGguUEkgLyAxODA7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgcmFkaWFucyB0byBudW1lcmljIChzaWduZWQpIGRlZ3JlZXMgKi9cclxuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvRGVncmVlcyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gIE51bWJlci5wcm90b3R5cGUudG9EZWdyZWVzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcyAqIDE4MCAvIE1hdGguUEk7XHJcbiAgfTtcclxufVxyXG5cclxudmFyIElOVEVSU0VDVF9MTkcgPSAxNzkuOTk5OyAvLyBMbmcgdXNlZCBmb3IgaW50ZXJzZWN0aW9uIGFuZCB3cmFwIGFyb3VuZCBvbiBtYXAgZWRnZXNcclxuXHJcbkwuR2VvZGVzaWMgPSBMLlBvbHlsaW5lLmV4dGVuZCh7XHJcbiAgb3B0aW9uczoge1xyXG4gICAgY29sb3I6IFwiYmx1ZVwiLFxyXG4gICAgc3RlcHM6IDEwLFxyXG4gICAgZGFzaDogMSxcclxuICAgIHdyYXA6IHRydWVcclxuICB9LFxyXG5cclxuICBpbml0aWFsaXplOiBmdW5jdGlvbihsYXRsbmdzLCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLl9tZXJnZV9vcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMuZGFzaCA9IE1hdGgubWF4KDFlLTMsIE1hdGgubWluKDEsIHBhcnNlRmxvYXQodGhpcy5vcHRpb25zLmRhc2gpIHx8IDEpKTtcclxuICAgIHRoaXMuZGF0dW0gPSB7fTtcclxuICAgIHRoaXMuZGF0dW0uZWxsaXBzb2lkID0ge1xyXG4gICAgICAgIGE6IDYzNzgxMzcsXHJcbiAgICAgICAgYjogNjM1Njc1Mi4zMTQyLFxyXG4gICAgICAgIGY6IDEgLyAyOTguMjU3MjIzNTYzXHJcbiAgICAgIH07IC8vIFdHUy04NFxyXG4gICAgdGhpcy5fbGF0bG5ncyA9IHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKGxhdGxuZ3MpO1xyXG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MsIHRoaXMub3B0aW9ucyk7XHJcbiAgfSxcclxuXHJcbiAgc2V0TGF0TG5nczogZnVuY3Rpb24obGF0bG5ncykge1xyXG4gICAgdGhpcy5fbGF0bG5ncyA9IHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKGxhdGxuZ3MpO1xyXG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuc2V0TGF0TG5ncy5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MpO1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgc29tZSBzdGF0aXN0aWMgdmFsdWVzIG9mIGN1cnJlbnQgZ2VvZGVzaWMgbXVsdGlwb2x5bGluZVxyXG4gICAqIEByZXR1cm5zIChPYmplY3R9IE9iamVjdCB3aXRoIHNldmVyYWwgcHJvcGVydGllcyAoZS5nLiBvdmVyYWxsIGRpc3RhbmNlKVxyXG4gICAqL1xyXG4gIGdldFN0YXRzOiBmdW5jdGlvbigpIHtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgZGlzdGFuY2U6IDAsXHJcbiAgICAgICAgcG9pbnRzOiAwLFxyXG4gICAgICAgIHBvbHlnb25zOiB0aGlzLl9sYXRsbmdzLmxlbmd0aFxyXG4gICAgICB9LCBwb2x5LCBwb2ludHM7XHJcblxyXG4gICAgZm9yIChwb2x5ID0gMDsgcG9seSA8IHRoaXMuX2xhdGxuZ3MubGVuZ3RoOyBwb2x5KyspIHtcclxuICAgICAgb2JqLnBvaW50cyArPSB0aGlzLl9sYXRsbmdzW3BvbHldLmxlbmd0aDtcclxuICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAodGhpcy5fbGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcclxuICAgICAgICBvYmouZGlzdGFuY2UgKz0gdGhpcy5fdmluY2VudHlfaW52ZXJzZSh0aGlzLl9sYXRsbmdzW3BvbHldW3BvaW50c10sXHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHldW3BvaW50cyArIDFdKS5kaXN0YW5jZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9LFxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBnZW9kZXNpYyBsaW5lcyBmcm9tIGdlb0pzb24uIFJlcGxhY2VzIGFsbCBjdXJyZW50IGZlYXR1cmVzIG9mIHRoaXMgaW5zdGFuY2UuXHJcbiAgICogU3VwcG9ydHMgTGluZVN0cmluZywgTXVsdGlMaW5lU3RyaW5nIGFuZCBQb2x5Z29uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IGdlb2pzb24gLSBnZW9zam9uIGFzIG9iamVjdC5cclxuICAgKi9cclxuICBnZW9Kc29uOiBmdW5jdGlvbihnZW9qc29uKSB7XHJcblxyXG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBMLkdlb0pTT04uYXNGZWF0dXJlKGdlb2pzb24pO1xyXG4gICAgbGV0IGZlYXR1cmVzID0gbm9ybWFsaXplZC50eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPyBub3JtYWxpemVkLmZlYXR1cmVzIDogW1xyXG4gICAgICBub3JtYWxpemVkXHJcbiAgICBdO1xyXG4gICAgdGhpcy5fbGF0bG5ncyA9IFtdO1xyXG4gICAgZm9yIChsZXQgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xyXG4gICAgICBsZXQgZ2VvbWV0cnkgPSBmZWF0dXJlLnR5cGUgPT09IFwiRmVhdHVyZVwiID8gZmVhdHVyZS5nZW9tZXRyeSA6XHJcbiAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcclxuXHJcbiAgICAgIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzLnB1c2godGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMoW0wuR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoXHJcbiAgICAgICAgICAgIGNvb3JkcywgMCldKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XHJcbiAgICAgICAgY2FzZSBcIlBvbHlnb25cIjpcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3MucHVzaCh0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxyXG4gICAgICAgICAgICBjb29yZHMsIDEpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcclxuICAgICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJEdWRlLCBwb2ludHMgY2FuJ3QgYmUgZHJhd24gYXMgZ2VvZGVzaWMgbGluZXMuLi5cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJEcmF3aW5nIFwiICsgZ2VvbWV0cnkudHlwZSArXHJcbiAgICAgICAgICAgIFwiIGFzIGEgZ2VvZGVzaWMgaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcuLi5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgZ3JlYXQgY2lyY2xlLiBSZXBsYWNlcyBhbGwgY3VycmVudCBsaW5lcy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2VudGVyIC0gZ2VvZ3JhcGhpYyBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSByYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiBtZXRyZXNcclxuICAgKi9cclxuICBjcmVhdGVDaXJjbGU6IGZ1bmN0aW9uKGNlbnRlciwgcmFkaXVzKSB7XHJcbiAgICBsZXQgcG9seWxpbmVJbmRleCA9IDA7XHJcbiAgICBsZXQgcHJldiA9IHtcclxuICAgICAgbGF0OiAwLFxyXG4gICAgICBsbmc6IDAsXHJcbiAgICAgIGJyZzogMFxyXG4gICAgfTtcclxuICAgIGxldCBzdGVwO1xyXG5cclxuICAgIHRoaXMuX2xhdGxuZ3MgPSBbXTtcclxuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuXHJcbiAgICBsZXQgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KEwubGF0TG5nKGNlbnRlciksIDAsIHJhZGl1cywgdGhpcy5vcHRpb25zXHJcbiAgICAgIC53cmFwKTtcclxuICAgIHByZXYgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKTtcclxuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChwcmV2KTtcclxuICAgIGZvciAoc3RlcCA9IDE7IHN0ZXAgPD0gdGhpcy5vcHRpb25zLnN0ZXBzOykge1xyXG4gICAgICBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcoY2VudGVyKSwgMzYwIC8gdGhpcy5vcHRpb25zXHJcbiAgICAgICAgLnN0ZXBzICogc3RlcCwgcmFkaXVzLCB0aGlzLm9wdGlvbnMud3JhcCk7XHJcbiAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xyXG4gICAgICBpZiAoTWF0aC5hYnMoZ3AubG5nIC0gcHJldi5sbmcpID4gMTgwKSB7XHJcbiAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHByZXYsIGdwKTtcclxuICAgICAgICBsZXQgc2VjID0gdGhpcy5faW50ZXJzZWN0aW9uKHByZXYsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcclxuICAgICAgICAgIGxhdDogLTg5LFxyXG4gICAgICAgICAgbG5nOiAoKGdwLmxuZyAtIHByZXYubG5nKSA+IDApID8gLUlOVEVSU0VDVF9MTkcgOiBJTlRFUlNFQ1RfTE5HXHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgaWYgKHNlYykge1xyXG4gICAgICAgICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XS5wdXNoKEwubGF0TG5nKHNlYy5sYXQsIHNlYy5sbmcpKTtcclxuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuICAgICAgICAgIHByZXYgPSBMLmxhdExuZyhzZWMubGF0LCAtc2VjLmxuZyk7XHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2gocHJldik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XHJcbiAgICAgICAgICBwcmV2ID0gZ3A7XHJcbiAgICAgICAgICBzdGVwKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XHJcbiAgICAgICAgcHJldiA9IGdwO1xyXG4gICAgICAgIHN0ZXArKztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgZ2VvZGVzaWMgUG9seWxpbmUgZnJvbSBnaXZlbiBjb29yZGluYXRlc1xyXG4gICAqIE5vdGU6IGRhc2hlZCBsaW5lcyBhcmUgdW5kZXIgd29ya1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRsbmdzIC0gT25lIG9yIG1vcmUgcG9seWxpbmVzIGFzIGFuIGFycmF5LiBTZWUgTGVhZmxldCBkb2MgYWJvdXQgUG9seWxpbmVcclxuICAgKiBAcmV0dXJucyAoT2JqZWN0fSBBbiBhcnJheSBvZiBhcnJheXMgb2YgZ2VvZ3JhcGhpY2FsIHBvaW50cy5cclxuICAgKi9cclxuICBfZ2VuZXJhdGVfR2VvZGVzaWM6IGZ1bmN0aW9uKGxhdGxuZ3MpIHtcclxuICAgIGxldCBfZ2VvID0gW10sIF9nZW9jbnQgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IHBvbHkgPSAwOyBwb2x5IDwgbGF0bG5ncy5sZW5ndGg7IHBvbHkrKykge1xyXG4gICAgICBfZ2VvW19nZW9jbnRdID0gW107XHJcbiAgICAgIGxldCBwcmV2ID0gTC5sYXRMbmcobGF0bG5nc1twb2x5XVswXSk7XHJcbiAgICAgIGZvciAobGV0IHBvaW50cyA9IDA7IHBvaW50cyA8IChsYXRsbmdzW3BvbHldLmxlbmd0aCAtIDEpOyBwb2ludHMrKykge1xyXG4gICAgICAgIC8vIHVzZSBwcmV2LCBzbyB0aGF0IHdyYXBwaW5nIGJlaGF2ZXMgY29ycmVjdGx5XHJcbiAgICAgICAgbGV0IHBvaW50QSA9IHByZXY7XHJcbiAgICAgICAgbGV0IHBvaW50QiA9IEwubGF0TG5nKGxhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pO1xyXG4gICAgICAgIGlmIChwb2ludEEuZXF1YWxzKHBvaW50QikpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW52ZXJzZSA9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocG9pbnRBLCBwb2ludEIpO1xyXG4gICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChwcmV2KTtcclxuICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XHJcbiAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBpbnZlcnNlLmRpc3RhbmNlIC8gdGhpcy5vcHRpb25zLnN0ZXBzO1xyXG4gICAgICAgICAgLy8gZGFzaGVkIGxpbmVzIGRvbid0IGdvIHRoZSBmdWxsIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xyXG4gICAgICAgICAgbGV0IGRpc3RfbXVsdCA9IHMgLSAxICsgdGhpcy5vcHRpb25zLmRhc2g7XHJcbiAgICAgICAgICBsZXQgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KHBvaW50QSwgaW52ZXJzZS5pbml0aWFsQmVhcmluZywgZGlzdGFuY2UqZGlzdF9tdWx0LCB0aGlzLm9wdGlvbnMud3JhcCk7XHJcbiAgICAgICAgICBsZXQgZ3AgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKTtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhncC5sbmcgLSBwcmV2LmxuZykgPiAxODApIHtcclxuICAgICAgICAgICAgbGV0IHNlYyA9IHRoaXMuX2ludGVyc2VjdGlvbihwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcclxuICAgICAgICAgICAgICBsYXQ6IC04OSxcclxuICAgICAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChzZWMpIHtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xyXG4gICAgICAgICAgICAgIF9nZW9jbnQrKztcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XHJcbiAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgX2dlb2NudCsrO1xyXG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goZ3ApO1xyXG4gICAgICAgICAgICAgIHByZXYgPSBncDtcclxuICAgICAgICAgICAgICBzKys7XHJcbiAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKGdwKTtcclxuICAgICAgICAgICAgLy8gRGFzaGVkIGxpbmVzIHN0YXJ0IGEgbmV3IGxpbmVcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXNoIDwgMSl7XHJcbiAgICAgICAgICAgICAgICBfZ2VvY250Kys7XHJcbiAgICAgICAgICAgICAgICAvLyBnbyBmdWxsIGRpc3RhbmNlIHRoaXMgdGltZSwgdG8gZ2V0IHN0YXJ0aW5nIHBvaW50IGZvciBuZXh0IGxpbmVcclxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3RfZnVsbCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKnMsIHRoaXMub3B0aW9ucy53cmFwKTtcclxuICAgICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByZXYgPSBMLmxhdExuZyhkaXJlY3RfZnVsbC5sYXQsIGRpcmVjdF9mdWxsLmxuZyk7XHJcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBwcmV2ID0gZ3A7XHJcbiAgICAgICAgICAgIHMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgX2dlb2NudCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9nZW87XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogVmluY2VudHkgZGlyZWN0IGNhbGN1bGF0aW9uLlxyXG4gICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbml0aWFsQmVhcmluZyAtIEluaXRpYWwgYmVhcmluZyBpbiBkZWdyZWVzIGZyb20gbm9ydGguXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gRGlzdGFuY2UgYWxvbmcgYmVhcmluZyBpbiBtZXRyZXMuXHJcbiAgICogQHJldHVybnMgKE9iamVjdH0gT2JqZWN0IGluY2x1ZGluZyBwb2ludCAoZGVzdGluYXRpb24gcG9pbnQpLCBmaW5hbEJlYXJpbmcuXHJcbiAgICovXHJcblxyXG4gIF92aW5jZW50eV9kaXJlY3Q6IGZ1bmN0aW9uKHAxLCBpbml0aWFsQmVhcmluZywgZGlzdGFuY2UsIHdyYXApIHtcclxuICAgIHZhciDPhjEgPSBwMS5sYXQudG9SYWRpYW5zKCksXHJcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcclxuICAgIHZhciDOsTEgPSBpbml0aWFsQmVhcmluZy50b1JhZGlhbnMoKTtcclxuICAgIHZhciBzID0gZGlzdGFuY2U7XHJcblxyXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxyXG4gICAgICBiID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYixcclxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XHJcblxyXG4gICAgdmFyIHNpbs6xMSA9IE1hdGguc2luKM6xMSk7XHJcbiAgICB2YXIgY29zzrExID0gTWF0aC5jb3MozrExKTtcclxuXHJcbiAgICB2YXIgdGFuVTEgPSAoMSAtIGYpICogTWF0aC50YW4oz4YxKSxcclxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxyXG4gICAgICBzaW5VMSA9IHRhblUxICogY29zVTE7XHJcbiAgICB2YXIgz4MxID0gTWF0aC5hdGFuMih0YW5VMSwgY29zzrExKTtcclxuICAgIHZhciBzaW7OsSA9IGNvc1UxICogc2luzrExO1xyXG4gICAgdmFyIGNvc1NxzrEgPSAxIC0gc2luzrEgKiBzaW7OsTtcclxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcclxuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxyXG4gICAgICB1U3EpKSk7XHJcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcclxuXHJcbiAgICB2YXIgz4MgPSBzIC8gKGIgKiBBKSxcclxuICAgICAgz4PKuSwgaXRlcmF0aW9ucyA9IDA7XHJcbiAgICB2YXIgc2luz4MsIGNvc8+DO1xyXG4gICAgdmFyIGNvczLPg007XHJcbiAgICBkbyB7XHJcbiAgICAgIGNvczLPg00gPSBNYXRoLmNvcygyICogz4MxICsgz4MpO1xyXG4gICAgICBzaW7PgyA9IE1hdGguc2luKM+DKTtcclxuICAgICAgY29zz4MgPSBNYXRoLmNvcyjPgyk7XHJcbiAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcclxuICAgICAgICAgIGNvczLPg00pIC1cclxuICAgICAgICBCIC8gNiAqIGNvczLPg00gKiAoLTMgKyA0ICogc2luz4MgKiBzaW7PgykgKiAoLTMgKyA0ICogY29zMs+DTSAqXHJcbiAgICAgICAgICBjb3Myz4NNKSkpO1xyXG4gICAgICDPg8q5ID0gz4M7XHJcbiAgICAgIM+DID0gcyAvIChiICogQSkgKyDOlM+DO1xyXG4gICAgfSB3aGlsZSAoTWF0aC5hYnMoz4MgLSDPg8q5KSA+IDFlLTEyICYmICsraXRlcmF0aW9ucyk7XHJcblxyXG4gICAgdmFyIHggPSBzaW5VMSAqIHNpbs+DIC0gY29zVTEgKiBjb3PPgyAqIGNvc86xMTtcclxuICAgIHZhciDPhjIgPSBNYXRoLmF0YW4yKHNpblUxICogY29zz4MgKyBjb3NVMSAqIHNpbs+DICogY29zzrExLCAoMSAtIGYpICpcclxuICAgICAgTWF0aC5zcXJ0KHNpbs6xICogc2luzrEgKyB4ICogeCkpO1xyXG4gICAgdmFyIM67ID0gTWF0aC5hdGFuMihzaW7PgyAqIHNpbs6xMSwgY29zVTEgKiBjb3PPgyAtIHNpblUxICogc2luz4MgKiBjb3POsTEpO1xyXG4gICAgdmFyIEMgPSBmIC8gMTYgKiBjb3NTcc6xICogKDQgKyBmICogKDQgLSAzICogY29zU3HOsSkpO1xyXG4gICAgdmFyIEwgPSDOuyAtICgxIC0gQykgKiBmICogc2luzrEgKlxyXG4gICAgICAoz4MgKyBDICogc2luz4MgKiAoY29zMs+DTSArIEMgKiBjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICogY29zMs+DTSkpKTtcclxuXHJcbiAgICB2YXIgzrsyO1xyXG4gICAgaWYgKHdyYXApIHtcclxuICAgICAgzrsyID0gKM67MSArIEwgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gbm9ybWFsaXNlIHRvIC0xODAuLi4rMTgwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICDOuzIgPSAozrsxICsgTCk7IC8vIGRvIG5vdCBub3JtYWxpemVcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmV2QXogPSBNYXRoLmF0YW4yKHNpbs6xLCAteCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGF0OiDPhjIudG9EZWdyZWVzKCksXHJcbiAgICAgIGxuZzogzrsyLnRvRGVncmVlcygpLFxyXG4gICAgICBmaW5hbEJlYXJpbmc6IHJldkF6LnRvRGVncmVlcygpXHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIFZpbmNlbnR5IGludmVyc2UgY2FsY3VsYXRpb24uXHJcbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHtMYXRMbmd9IHAxIC0gTGF0aXR1ZGUvbG9uZ2l0dWRlIG9mIHN0YXJ0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7TGF0TG5nfSBwMiAtIExhdGl0dWRlL2xvbmdpdHVkZSBvZiBkZXN0aW5hdGlvbiBwb2ludC5cclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgaW5jbHVkaW5nIGRpc3RhbmNlLCBpbml0aWFsQmVhcmluZywgZmluYWxCZWFyaW5nLlxyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBmb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZS5cclxuICAgKi9cclxuICBfdmluY2VudHlfaW52ZXJzZTogZnVuY3Rpb24ocDEsIHAyKSB7XHJcbiAgICB2YXIgz4YxID0gcDEubGF0LnRvUmFkaWFucygpLFxyXG4gICAgICDOuzEgPSBwMS5sbmcudG9SYWRpYW5zKCk7XHJcbiAgICB2YXIgz4YyID0gcDIubGF0LnRvUmFkaWFucygpLFxyXG4gICAgICDOuzIgPSBwMi5sbmcudG9SYWRpYW5zKCk7XHJcblxyXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxyXG4gICAgICBiID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYixcclxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XHJcblxyXG4gICAgdmFyIEwgPSDOuzIgLSDOuzE7XHJcbiAgICB2YXIgdGFuVTEgPSAoMSAtIGYpICogTWF0aC50YW4oz4YxKSxcclxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxyXG4gICAgICBzaW5VMSA9IHRhblUxICogY29zVTE7XHJcbiAgICB2YXIgdGFuVTIgPSAoMSAtIGYpICogTWF0aC50YW4oz4YyKSxcclxuICAgICAgY29zVTIgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTIgKiB0YW5VMikpLFxyXG4gICAgICBzaW5VMiA9IHRhblUyICogY29zVTI7XHJcblxyXG4gICAgdmFyIM67ID0gTCxcclxuICAgICAgzrvKuSwgaXRlcmF0aW9ucyA9IDA7XHJcbiAgICB2YXIgY29zU3HOsSwgc2luz4MsIGNvczLPg00sIGNvc8+DLCDPgywgc2luzrssIGNvc867O1xyXG4gICAgZG8ge1xyXG4gICAgICBzaW7OuyA9IE1hdGguc2luKM67KTtcclxuICAgICAgY29zzrsgPSBNYXRoLmNvcyjOuyk7XHJcbiAgICAgIHZhciBzaW5Tcc+DID0gKGNvc1UyICogc2luzrspICogKGNvc1UyICogc2luzrspICsgKGNvc1UxICogc2luVTIgLVxyXG4gICAgICAgIHNpblUxICogY29zVTIgKiBjb3POuykgKiAoY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3POuyk7XHJcbiAgICAgIHNpbs+DID0gTWF0aC5zcXJ0KHNpblNxz4MpO1xyXG4gICAgICBpZiAoc2luz4MgPT0gMCkgcmV0dXJuIDA7IC8vIGNvLWluY2lkZW50IHBvaW50c1xyXG4gICAgICBjb3PPgyA9IHNpblUxICogc2luVTIgKyBjb3NVMSAqIGNvc1UyICogY29zzrs7XHJcbiAgICAgIM+DID0gTWF0aC5hdGFuMihzaW7PgywgY29zz4MpO1xyXG4gICAgICB2YXIgc2luzrEgPSBjb3NVMSAqIGNvc1UyICogc2luzrsgLyBzaW7PgztcclxuICAgICAgY29zU3HOsSA9IDEgLSBzaW7OsSAqIHNpbs6xO1xyXG4gICAgICBjb3Myz4NNID0gY29zz4MgLSAyICogc2luVTEgKiBzaW5VMiAvIGNvc1NxzrE7XHJcbiAgICAgIGlmIChpc05hTihjb3Myz4NNKSkgY29zMs+DTSA9IDA7IC8vIGVxdWF0b3JpYWwgbGluZTogY29zU3HOsT0wICjCpzYpXHJcbiAgICAgIHZhciBDID0gZiAvIDE2ICogY29zU3HOsSAqICg0ICsgZiAqICg0IC0gMyAqIGNvc1NxzrEpKTtcclxuICAgICAgzrvKuSA9IM67O1xyXG4gICAgICDOuyA9IEwgKyAoMSAtIEMpICogZiAqIHNpbs6xICogKM+DICsgQyAqIHNpbs+DICogKGNvczLPg00gKyBDICogY29zz4MgKiAoLVxyXG4gICAgICAgIDEgKyAyICogY29zMs+DTSAqIGNvczLPg00pKSk7XHJcbiAgICB9IHdoaWxlIChNYXRoLmFicyjOuyAtIM67yrkpID4gMWUtMTIgJiYgKytpdGVyYXRpb25zIDwgMTAwKTtcclxuICAgIGlmIChpdGVyYXRpb25zID49IDEwMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkZvcm11bGEgZmFpbGVkIHRvIGNvbnZlcmdlLiBBbHRlcmluZyB0YXJnZXQgcG9zaXRpb24uXCIpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fdmluY2VudHlfaW52ZXJzZShwMSwge1xyXG4gICAgICAgICAgbGF0OiBwMi5sYXQsXHJcbiAgICAgICAgICBsbmc6IHAyLmxuZyAtIDAuMDFcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcclxuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxyXG4gICAgICB1U3EpKSk7XHJcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcclxuICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcclxuICAgICAgICBjb3Myz4NNKSAtXHJcbiAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcclxuICAgICAgICBjb3Myz4NNKSkpO1xyXG5cclxuICAgIHZhciBzID0gYiAqIEEgKiAoz4MgLSDOlM+DKTtcclxuXHJcbiAgICB2YXIgZndkQXogPSBNYXRoLmF0YW4yKGNvc1UyICogc2luzrssIGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICpcclxuICAgICAgY29zzrspO1xyXG4gICAgdmFyIHJldkF6ID0gTWF0aC5hdGFuMihjb3NVMSAqIHNpbs67LCAtc2luVTEgKiBjb3NVMiArIGNvc1UxICogc2luVTIgKlxyXG4gICAgICBjb3POuyk7XHJcblxyXG4gICAgcyA9IE51bWJlcihzLnRvRml4ZWQoMykpOyAvLyByb3VuZCB0byAxbW0gcHJlY2lzaW9uXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaXN0YW5jZTogcyxcclxuICAgICAgaW5pdGlhbEJlYXJpbmc6IGZ3ZEF6LnRvRGVncmVlcygpLFxyXG4gICAgICBmaW5hbEJlYXJpbmc6IHJldkF6LnRvRGVncmVlcygpXHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gb2YgdHdvIHBhdGhzIGRlZmluZWQgYnkgcG9pbnQgYW5kIGJlYXJpbmcuXHJcbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TGF0TG9ufSBwMSAtIEZpcnN0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMSAtIEluaXRpYWwgYmVhcmluZyBmcm9tIGZpcnN0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7TGF0TG9ufSBwMiAtIFNlY29uZCBwb2ludC5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gYnJuZzIgLSBJbml0aWFsIGJlYXJpbmcgZnJvbSBzZWNvbmQgcG9pbnQuXHJcbiAgICogQHJldHVybnMge09iamVjdH0gY29udGFpbmluZyBsYXQvbG5nIGluZm9ybWF0aW9uIG9mIGludGVyc2VjdGlvbi5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogdmFyIHAxID0gTGF0TG9uKDUxLjg4NTMsIDAuMjU0NSksIGJybmcxID0gMTA4LjU1O1xyXG4gICAqIHZhciBwMiA9IExhdExvbig0OS4wMDM0LCAyLjU3MzUpLCBicm5nMiA9IDMyLjQ0O1xyXG4gICAqIHZhciBwSW50ID0gTGF0TG9uLmludGVyc2VjdGlvbihwMSwgYnJuZzEsIHAyLCBicm5nMik7IC8vIHBJbnQudG9TdHJpbmcoKTogNTAuOTA3OMKwTiwgNC41MDg0wrBFXHJcbiAgICovXHJcbiAgX2ludGVyc2VjdGlvbjogZnVuY3Rpb24ocDEsIGJybmcxLCBwMiwgYnJuZzIpIHtcclxuICAgIC8vIHNlZSBodHRwOi8vd2lsbGlhbXMuYmVzdC52d2gubmV0L2F2Zm9ybS5odG0jSW50ZXJzZWN0aW9uXHJcblxyXG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcclxuICAgICAgzrsxID0gcDEubG5nLnRvUmFkaWFucygpO1xyXG4gICAgdmFyIM+GMiA9IHAyLmxhdC50b1JhZGlhbnMoKSxcclxuICAgICAgzrsyID0gcDIubG5nLnRvUmFkaWFucygpO1xyXG4gICAgdmFyIM64MTMgPSBOdW1iZXIoYnJuZzEpLnRvUmFkaWFucygpLFxyXG4gICAgICDOuDIzID0gTnVtYmVyKGJybmcyKS50b1JhZGlhbnMoKTtcclxuICAgIHZhciDOlM+GID0gz4YyIC0gz4YxLFxyXG4gICAgICDOlM67ID0gzrsyIC0gzrsxO1xyXG5cclxuICAgIHZhciDOtDEyID0gMiAqIE1hdGguYXNpbihNYXRoLnNxcnQoTWF0aC5zaW4ozpTPhiAvIDIpICogTWF0aC5zaW4ozpTPhiAvIDIpICtcclxuICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguY29zKM+GMikgKiBNYXRoLnNpbijOlM67IC8gMikgKiBNYXRoLnNpbijOlM67IC9cclxuICAgICAgICAyKSkpO1xyXG4gICAgaWYgKM60MTIgPT0gMCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gaW5pdGlhbC9maW5hbCBiZWFyaW5ncyBiZXR3ZWVuIHBvaW50c1xyXG4gICAgdmFyIM64MSA9IE1hdGguYWNvcygoTWF0aC5zaW4oz4YyKSAtIE1hdGguc2luKM+GMSkgKiBNYXRoLmNvcyjOtDEyKSkgL1xyXG4gICAgICAoTWF0aC5zaW4ozrQxMikgKiBNYXRoLmNvcyjPhjEpKSk7XHJcbiAgICBpZiAoaXNOYU4ozrgxKSkgzrgxID0gMDsgLy8gcHJvdGVjdCBhZ2FpbnN0IHJvdW5kaW5nXHJcbiAgICB2YXIgzrgyID0gTWF0aC5hY29zKChNYXRoLnNpbijPhjEpIC0gTWF0aC5zaW4oz4YyKSAqIE1hdGguY29zKM60MTIpKSAvXHJcbiAgICAgIChNYXRoLnNpbijOtDEyKSAqIE1hdGguY29zKM+GMikpKTtcclxuICAgIHZhciDOuDEyLCDOuDIxO1xyXG4gICAgaWYgKE1hdGguc2luKM67MiAtIM67MSkgPiAwKSB7XHJcbiAgICAgIM64MTIgPSDOuDE7XHJcbiAgICAgIM64MjEgPSAyICogTWF0aC5QSSAtIM64MjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIM64MTIgPSAyICogTWF0aC5QSSAtIM64MTtcclxuICAgICAgzrgyMSA9IM64MjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgzrExID0gKM64MTMgLSDOuDEyICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMi0xLTNcclxuICAgIHZhciDOsTIgPSAozrgyMSAtIM64MjMgKyBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBhbmdsZSAxLTItM1xyXG5cclxuICAgIGlmIChNYXRoLnNpbijOsTEpID09IDAgJiYgTWF0aC5zaW4ozrEyKSA9PSAwKSByZXR1cm4gbnVsbDsgLy8gaW5maW5pdGUgaW50ZXJzZWN0aW9uc1xyXG4gICAgaWYgKE1hdGguc2luKM6xMSkgKiBNYXRoLnNpbijOsTIpIDwgMCkgcmV0dXJuIG51bGw7IC8vIGFtYmlndW91cyBpbnRlcnNlY3Rpb25cclxuXHJcbiAgICAvL86xMSA9IE1hdGguYWJzKM6xMSk7XHJcbiAgICAvL86xMiA9IE1hdGguYWJzKM6xMik7XHJcbiAgICAvLyAuLi4gRWQgV2lsbGlhbXMgdGFrZXMgYWJzIG9mIM6xMS/OsTIsIGJ1dCBzZWVtcyB0byBicmVhayBjYWxjdWxhdGlvbj9cclxuXHJcbiAgICB2YXIgzrEzID0gTWF0aC5hY29zKC1NYXRoLmNvcyjOsTEpICogTWF0aC5jb3MozrEyKSArXHJcbiAgICAgIE1hdGguc2luKM6xMSkgKiBNYXRoLnNpbijOsTIpICogTWF0aC5jb3MozrQxMikpO1xyXG4gICAgdmFyIM60MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM60MTIpICogTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMiksXHJcbiAgICAgIE1hdGguY29zKM6xMikgKyBNYXRoLmNvcyjOsTEpICogTWF0aC5jb3MozrEzKSk7XHJcbiAgICB2YXIgz4YzID0gTWF0aC5hc2luKE1hdGguc2luKM+GMSkgKiBNYXRoLmNvcyjOtDEzKSArXHJcbiAgICAgIE1hdGguY29zKM+GMSkgKiBNYXRoLnNpbijOtDEzKSAqIE1hdGguY29zKM64MTMpKTtcclxuICAgIHZhciDOlM67MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM64MTMpICogTWF0aC5zaW4ozrQxMykgKiBNYXRoLmNvcyjPhjEpLFxyXG4gICAgICBNYXRoLmNvcyjOtDEzKSAtIE1hdGguc2luKM+GMSkgKiBNYXRoLnNpbijPhjMpKTtcclxuICAgIHZhciDOuzMgPSDOuzEgKyDOlM67MTM7XHJcbiAgICDOuzMgPSAozrszICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEk7IC8vIG5vcm1hbGlzZSB0byAtMTgwLi4rMTgwwrpcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsYXQ6IM+GMy50b0RlZ3JlZXMoKSxcclxuICAgICAgbG5nOiDOuzMudG9EZWdyZWVzKClcclxuICAgIH07XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcndyaXRlcyBvYmoxJ3MgdmFsdWVzIHdpdGggb2JqMidzIGFuZCBhZGRzIG9iajIncyBpZiBub24gZXhpc3RlbnQgaW4gb2JqMVxyXG4gICAqIEBwYXJhbSBvYmoxXHJcbiAgICogQHBhcmFtIG9iajJcclxuICAgKiBAcmV0dXJucyBvYmozIGEgbmV3IG9iamVjdCBiYXNlZCBvbiBvYmoxIGFuZCBvYmoyXHJcbiAgICovXHJcbiAgX21lcmdlX29wdGlvbnM6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHtcclxuICAgIGxldCBvYmozID0ge307XHJcbiAgICBmb3IgKGxldCBhdHRybmFtZSBpbiBvYmoxKSB7XHJcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMVthdHRybmFtZV07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBhdHRybmFtZSBpbiBvYmoyKSB7XHJcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMlthdHRybmFtZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqMztcclxuICB9XHJcbn0pO1xyXG5cclxuTC5nZW9kZXNpYyA9IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcclxuICByZXR1cm4gbmV3IEwuR2VvZGVzaWMobGF0bG5ncywgb3B0aW9ucyk7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0xlYWZsZXQuR2VvZGVzaWMvTGVhZmxldC5HZW9kZXNpYy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\n"); /***/ }), @@ -338,21 +338,21 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ "./resources/js/admin/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQSxtQkFBQUEsQ0FBUSw2QkFBUjs7QUFFQTtBQUNBQyxPQUFPQyxNQUFQLENBQWNDLEdBQWQsR0FBb0IsbUJBQUFILENBQVEsOEJBQVIsQ0FBcEIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZG1pbiBzdHVmZiBuZWVkZWRcbiAqL1xuXG5yZXF1aXJlKCcuLy4uL2Jvb3RzdHJhcCcpO1xuXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cbndpbmRvdy5waHB2bXMubWFwID0gcmVxdWlyZSgnLi4vbWFwcy9pbmRleCcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2FkbWluL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); +eval("/**\r\n * Admin stuff needed\r\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQSxtQkFBQUEsQ0FBUSw2QkFBUjs7QUFFQTtBQUNBQyxPQUFPQyxNQUFQLENBQWNDLEdBQWQsR0FBb0IsbUJBQUFILENBQVEsOEJBQVIsQ0FBcEIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEFkbWluIHN0dWZmIG5lZWRlZFxyXG4gKi9cclxuXHJcbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XHJcblxyXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cclxud2luZG93LnBocHZtcy5tYXAgPSByZXF1aXJlKCcuLi9tYXBzL2luZGV4Jyk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9hcHAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); /***/ }), /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cclxucmVxdWlyZSgnLi9jb21tb24nKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("/**\r\n *\r\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\r\n * Generic formatter to prepend\r\n * @param value\r\n * @param prepend\r\n * @returns {*}\r\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\r\n * Format minutes into HHh MMm\r\n * @param value\r\n * @returns {string}\r\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqXHJcbiAqL1xyXG5cclxuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmb3JtYXR0ZXIgdG8gcHJlcGVuZFxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIHByZXBlbmRcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XHJcbiAgICByZXR1cm4gcHJlcGVuZCArIHZhbHVlXHJcbn07XHJcblxyXG4vKipcclxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XHJcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcclxuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcGFyYW0gbGVuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcclxufTtcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIGxlblxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHtcclxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XHJcbn07XHJcblxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHZhbHVlXHJcbiAqIEBwYXJhbSBsZW5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XHJcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), @@ -360,7 +360,7 @@ eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/d /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZW5kZXIgYSBtYXAgd2l0aCB0aGUgYWlyc3BhY2UsIGV0YyBhcm91bmQgYSBnaXZlbiBzZXQgb2YgY29vcmRzXG4gKiBlLmcsIHRoZSBhaXJwb3J0IG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgcGFyYW1zOiB7fVxuICAgIH0sXG4gIH0sIG9wdHMpO1xuXG4gIGxldCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZihvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcbiAgfVxuXG4gIHJldHVybiBtYXA7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYWlyc3BhY2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render a map with the airspace, etc around a given set of coords\r\n * e.g, the airport map\r\n * @param opts\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHsgYWRkV01TTGF5ZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciBhIG1hcCB3aXRoIHRoZSBhaXJzcGFjZSwgZXRjIGFyb3VuZCBhIGdpdmVuIHNldCBvZiBjb29yZHNcclxuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcclxuICAgIGxhdDogMCxcclxuICAgIGxvbjogMCxcclxuICAgIHpvb206IDEyLFxyXG4gICAgbGF5ZXJzOiBbXSxcclxuICAgIHNldF9tYXJrZXI6IHRydWUsXHJcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxyXG5cclxuICAgIC8vIFBhc3NlZCBmcm9tIHRoZSBjb25maWcvbWFwcy5waHAgZmlsZVxyXG4gICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgdXJsOiAnJyxcclxuICAgICAgICBwYXJhbXM6IHt9XHJcbiAgICB9LFxyXG4gIH0sIG9wdHMpO1xyXG5cclxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcclxuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcclxuICBjb25zb2xlLmxvZygnQXBwbHlpbmcgY29vcmRzJywgY29vcmRzKTtcclxuXHJcbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xyXG4gIGlmIChvcHRzLnNldF9tYXJrZXIgPT09IHRydWUpIHtcclxuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xyXG4gIH1cclxuXHJcbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xyXG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBtYXA7XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -368,7 +368,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLG1CQUFBQSxDQUFRLHVEQUFSOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xuXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxuICAgICAgICB6b29tOiA1LFxuICAgICAgICBtYXhab29tOiAxMCxcbiAgICAgICAgbGF5ZXJzOiBbXSxcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgICAgICBdLFxuICAgICAgICB0aWxlX2xheWVyczogW10sXG4gICAgfSwgb3B0cyk7XG5cbiAgICAvKlxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgICAgXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3dtc1wiLCB7XG4gICAgICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgICAgbGF5ZXJzOiAnb3BlbmFpcF9hcHByb3ZlZF9haXJzcGFjZXNfbGFiZWxzJyxcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgICAgc3ViZG9tYWluczogJzEyJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgLy9sYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxuICAgICAgICB6b29tOiBvcHRzLnpvb20sXG4gICAgICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBmb3IoY29uc3QgaSBpbiBvcHRzLnByb3ZpZGVycykge1xuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\r\n let feature_groups = [];\r\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\r\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\r\n maxZoom: 14,\r\n minZoom: 12,\r\n layers: 'openaip_approved_airspaces_labels',\r\n tileSize: 1024,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\r\n maxZoom: 14,\r\n minZoom: 4,\r\n tms: true,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n feature_groups.push(openaip_cached_basemap);\r\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLG1CQUFBQSxDQUFRLHVEQUFSOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXHJcblxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcclxuXHJcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxyXG4gICAgICAgIHpvb206IDUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTAsXHJcbiAgICAgICAgbGF5ZXJzOiBbXSxcclxuICAgICAgICBzZXRfbWFya2VyOiBmYWxzZSxcclxuICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdGlsZV9sYXllcnM6IFtdLFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgLypcclxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xyXG4gICAgY29uc3Qgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIuV01TKFxyXG4gICAgICAgIFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS93bXNcIiwge1xyXG4gICAgICAgICAgICBtYXhab29tOiAxNCxcclxuICAgICAgICAgICAgbWluWm9vbTogMTIsXHJcbiAgICAgICAgICAgIGxheWVyczogJ29wZW5haXBfYXBwcm92ZWRfYWlyc3BhY2VzX2xhYmVscycsXHJcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxyXG4gICAgICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXHJcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsqL1xyXG5cclxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xyXG4gICAgICAgIG1heFpvb206IDE0LFxyXG4gICAgICAgIG1pblpvb206IDQsXHJcbiAgICAgICAgdG1zOiB0cnVlLFxyXG4gICAgICAgIGRldGVjdFJldGluYTogdHJ1ZSxcclxuICAgICAgICBzdWJkb21haW5zOiAnMTInLFxyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWVcclxuICAgIH0pO1xyXG5cclxuICAgIGZlYXR1cmVfZ3JvdXBzLnB1c2gob3BlbmFpcF9jYWNoZWRfYmFzZW1hcCk7XHJcbiAgICAqL1xyXG5cclxuICAgIGxldCBtYXAgPSBsZWFmbGV0Lm1hcCgnbWFwJywge1xyXG4gICAgICAgIC8vbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcclxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxyXG4gICAgICAgIHpvb206IG9wdHMuem9vbSxcclxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yKGNvbnN0IGkgaW4gb3B0cy5wcm92aWRlcnMpIHtcclxuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFwO1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -376,7 +376,7 @@ eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaf /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XHJcbiAgICBQTEFOX1JPVVRFX0NPTE9SID0gJyMwNDM3NTgnLFxyXG4gICAgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnLFxyXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -384,7 +384,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuXG4gICAgaWYob3B0cy51cmwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgIG1pblpvb206IDQsXG4gICAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gICAgY29uc3QgbWxheWVyID0gbGVhZmxldC50aWxlTGF5ZXIud21zKFxuICAgICAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXNcbiAgICApO1xuXG4gICAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgICByZXR1cm4gbWxheWVyO1xufVxuXG4vKipcbiAqIFNob3cgYSBwb3B1cFxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\r\n * Add a WMS layer to a map. opts must be:\r\n * {\r\n * url: '',\r\n * params: {}\r\n * }\r\n * @param map\r\n * @param opts\r\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\r\n * Show a popup\r\n * @param feature\r\n * @param layer\r\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBXTVMgbGF5ZXIgdG8gYSBtYXAuIG9wdHMgbXVzdCBiZTpcclxuICoge1xyXG4gKiAgdXJsOiAnJyxcclxuICogIHBhcmFtczoge31cclxuICogIH1cclxuICogQHBhcmFtIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xyXG5cclxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgbWluWm9vbTogNCxcclxuICAgIH0sIG9wdHMucGFyYW1zKTtcclxuXHJcbiAgICBjb25zdCBtbGF5ZXIgPSBsZWFmbGV0LnRpbGVMYXllci53bXMoXHJcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXHJcbiAgICApO1xyXG5cclxuICAgIG1sYXllci5hZGRUbyhtYXApO1xyXG5cclxuICAgIHJldHVybiBtbGF5ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaG93IGEgcG9wdXBcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -392,7 +392,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\r\n * All of the functionality required for maps\r\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgZm9yIG1hcHNcclxuICovXHJcblxyXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxucmVxdWlyZSgnTGVhZmxldC5HZW9kZXNpYycpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcclxuXHJcbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJ1xyXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXHJcbmltcG9ydCByZW5kZXJfcm91dGVfbWFwIGZyb20gJy4vcm91dGVfbWFwJ1xyXG5cclxuZXhwb3J0IHtcclxuICByZW5kZXJfYWlyc3BhY2VfbWFwLFxyXG4gIHJlbmRlcl9saXZlX21hcCxcclxuICByZW5kZXJfcm91dGVfbWFwLFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -400,7 +400,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\n * Controller for two-way bindings\n * @type {{focusMarker: focusMarker}}\n */\n var mapController = {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\n html: '
' + rte.airports.d.icao + '
'\n });\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTs7QUFFQSxJQUFNQSxTQUFTLG1CQUFBQyxDQUFRLHNDQUFSLENBQWY7QUFDQSxJQUFNQyxVQUFVLG1CQUFBRCxDQUFRLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBUyxtQkFBQUYsQ0FBUSxzQ0FBUixDQUFmOztBQUVBO0FBQ0E7O0FBRUE7Ozs7O0FBS0EseURBQWUsVUFBQ0csSUFBRCxFQUFVOztBQUVyQkEsV0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ2pCQyxnQkFBUSxDQUFDLFFBQUQsRUFBVyxDQUFDLFFBQVosQ0FEUztBQUVqQkMsY0FBTSxDQUZXO0FBR2pCQyxvQkFBWSxZQUhLO0FBSWpCQyxtQkFBVyxrQkFKTTtBQUtqQkMsd0JBQWdCLGNBTEM7QUFNakJDLG1CQUFXLElBTk07QUFPakJDLHFCQUFhLEtBUEk7QUFRakJDLHVCQUFlLGdDQVJFO0FBU2pCQyxlQUFPO0FBVFUsS0FBZCxFQVVKWCxJQVZJLENBQVA7O0FBWUEsUUFBTVksTUFBTSxrRUFBQUMsQ0FBY2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9CQUFZLENBQUMsRUFBRCxFQUFLLEVBQUw7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LENBQW9CLGtCQUFVO0FBQzFCZix5QkFBYXNDLE1BQWIsQ0FBb0I7QUFDaEJyQyx3QkFBUUEsT0FBT3NDLElBREM7QUFFaEJrQiwwQkFBV3hELE9BQU9zQyxJQUFQLENBQVltQixNQUFaLEdBQXFCO0FBRmhCLGFBQXBCO0FBSUgsU0FMRDtBQU1ILEtBbEVEOztBQW9FQWpCO0FBQ0FrQixnQkFBWWxCLFNBQVosRUFBdUIsS0FBdkI7QUFDSCxDQXpNRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9cblxuY29uc3QgZ2VvbGliID0gcmVxdWlyZSgnZ2VvbGliJyk7XG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IgfSBmcm9tICcuL2NvbmZpZydcblxuLyoqXG4gKiBSZW5kZXIgdGhlIGxpdmUgbWFwXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgICAgIHpvb206IDUsXG4gICAgICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICAgICAgcGlyZXBfdXJpOiAnL2FwaS9waXJlcHMve2lkfScsXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcG9zaXRpb25zOiBudWxsLFxuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxuICAgICAgICB1bml0czogJ25taScsXG4gICAgfSwgb3B0cyk7XG5cbiAgICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICAgIGNvbnN0IGFpcmNyYWZ0SWNvbiA9IGxlYWZsZXQuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgICAgICBpY29uQW5jaG9yOiBbMjEsIDIxXSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEhvbGQgdGhlIG1hcmtlcnNcbiAgICAgKiBAdHlwZSB7e319XG4gICAgICovXG4gICAgbGV0IG1hcmtlcnNfbGlzdCA9IHt9O1xuXG4gICAgbGV0IHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG5cbiAgICBsZXQgbGF5ZXJGbGlnaHRzID0gbnVsbDtcbiAgICBsZXQgbGF5ZXJTZWxGbGlnaHQgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodExheWVyID0gbnVsbDtcbiAgICBsZXQgbGF5ZXJTZWxBcnIgPSBudWxsO1xuICAgIGxldCBsYXllclNlbERlcCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sbGVyIGZvciB0d28td2F5IGJpbmRpbmdzXG4gICAgICogQHR5cGUge3tmb2N1c01hcmtlcjogZm9jdXNNYXJrZXJ9fVxuICAgICAqL1xuICAgIGNvbnN0IG1hcENvbnRyb2xsZXIgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1cyBvbiBhIHNwZWNpZmljIG1hcmtlclxuICAgICAgICAgKiBAcGFyYW0gZVxuICAgICAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzTWFya2VyOiAoZSwgbW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmKCEobW9kZWwucGlyZXAuaWQgaW4gbWFya2Vyc19saXN0KSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXJrZXIgbm90IGZvdW5kIGluIGxpc3QnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XG4gICAgICAgICAgICBvbkZsaWdodENsaWNrKG1hcmtlclswXSwgbWFya2VyWzFdKTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcl9tYXBfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwge3BpcmVwOiB7fSwgY29udHJvbGxlcjogbWFwQ29udHJvbGxlcn0pO1xuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW10sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgICAqIEBwYXJhbSBmZWF0dXJlXG4gICAgICogQHBhcmFtIGxheWVyXG4gICAgICovXG4gICAgY29uc3Qgb25GbGlnaHRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xuICAgICAgICBjb25zdCBnZW9qc29uX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpICsgXCIvYWNhcnMvZ2VvanNvblwiO1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGdlb2pzb25fdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXG4gICAgICAgICQud2hlbihmbGlnaHRfcm91dGUpLmRvbmUoKHJ0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICAgICAgICAgICAgICAvL21hcC5yZW1vdmVMYXllcihsYXllclNlbEFycik7XG4gICAgICAgICAgICAgICAgLy9tYXAucmVtb3ZlTGF5ZXIobGF5ZXJTZWxEZXApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodCA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC45LFxuICAgICAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgICAgICB9KS5hZGRUbyhtYXApO1xuXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJ0ZS5saW5lKTtcbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgICAgICBsYXllclNlbEZsaWdodExheWVyID0gbGF5ZXI7XG5cbiAgICAgICAgICAgIC8qY29uc3QgZHB0SWNvbiA9IGxlYWZsZXQuZGl2SWNvbih7XG4gICAgICAgICAgICAgICAgaHRtbDogJzxkaXYgY2xhc3M9XCJtYXAtaW5mby1sYWJlbFwiPjxoNT4nICsgcnRlLmFpcnBvcnRzLmQuaWNhbyArICc8L2g1PjwvZGl2PidcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsYXllclNlbERlcCA9IGxlYWZsZXQubWFya2VyKFtydGUuYWlycG9ydHMuZC5sYXQsIHJ0ZS5haXJwb3J0cy5kLmxvbl0sIHtpY29uOmRwdEljb259KS5hZGRUbyhtYXApO1xuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gQ2VudGVyIG9uIGl0LCBidXQgb25seSBkbyBpdCBvbmNlLCBpbiBjYXNlIHRoZSBtYXAgaXMgbW92ZWRcbiAgICAgICAgICAgIGlmKCFwYW5uZWRUb0NlbnRlcikge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgY2VudGVyXG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGdlb2xpYi5nZXRDZW50ZXIoW1xuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuYS5sb259LFxuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuZC5sb259LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgLy9tYXAucGFuVG8oe2xhdDogYy5sYXRpdHVkZSwgbG5nOiBjLmxvbmdpdHVkZX0pO1xuICAgICAgICAgICAgICAgIG1hcC5wYW5Ubyh7bGF0OiBydGUucG9zaXRpb24ubGF0LCBsbmc6IHJ0ZS5wb3NpdGlvbi5sb259KTtcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gdGhlIFBJUkVQIGluZm8gaXMgZG9uZSBsb2FkaW5nLCBzaG93IHRoZSBib3R0b20gYmFyXG4gICAgICAgIC8vXG4gICAgICAgICQud2hlbihwaXJlcF9pbmZvKS5kb25lKHBpcmVwID0+IHtcbiAgICAgICAgICAgIHJfbWFwX3ZpZXcudXBkYXRlKHtwaXJlcDpwaXJlcC5kYXRhfSk7XG4gICAgICAgICAgICAkKCcjbWFwLWluZm8tYm94Jykuc2hvdygpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlTWFwID0gKCkgPT4ge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZWxvYWRpbmcgZmxpZ2h0cyBmcm9tIGFjYXJzLi4uJyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFKQVggVVBEQVRFXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBwaXJlcF91cmkgPSBvcHRzLnBpcmVwX3VyaS5yZXBsYWNlKCd7aWR9JywgJycpO1xuICAgICAgICBsZXQgcGlyZXBzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogcGlyZXBfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZmxpZ2h0cyA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IG9wdHMudXBkYXRlX3VyaSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC53aGVuKGZsaWdodHMpLmRvbmUoZmxpZ2h0R2VvSnNvbiA9PiB7XG5cbiAgICAgICAgICAgIGlmIChsYXllckZsaWdodHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xuICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsYXllci5vbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2soZmVhdHVyZSwgbGF5ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgKGZlYXR1cmUucHJvcGVydGllcy5wb3B1cCAhPT0gJycgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJzX2xpc3RbZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkXSA9IFtmZWF0dXJlLCBsYXllcl07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJGbGlnaHRzLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4ocGlyZXBzKS5kb25lKHBpcmVwcyA9PiB7XG4gICAgICAgICAgICByX3RhYmxlX3ZpZXcudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxuICAgICAgICAgICAgICAgIGhhc19kYXRhOiAocGlyZXBzLmRhdGEubGVuZ3RoID4gMCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZU1hcCgpO1xuICAgIHNldEludGVydmFsKHVwZGF0ZU1hcCwgMTAwMDApXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\r\n * Render the live map\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\r\n * Hold the markers\r\n * @type {{}}\r\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\r\n * Controller for two-way bindings\r\n * @type {{focusMarker: focusMarker}}\r\n */\n var mapController = {\n /**\r\n * Focus on a specific marker\r\n * @param e\r\n * @param model\r\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\r\n * When a flight is clicked on, show the path, etc for that flight\r\n * @param feature\r\n * @param layer\r\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\r\n html: '
' + rte.airports.d.icao + '
'\r\n });\r\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\r\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\r\n * AJAX UPDATE\r\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTs7QUFFQSxJQUFNQSxTQUFTLG1CQUFBQyxDQUFRLHNDQUFSLENBQWY7QUFDQSxJQUFNQyxVQUFVLG1CQUFBRCxDQUFRLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBUyxtQkFBQUYsQ0FBUSxzQ0FBUixDQUFmOztBQUVBO0FBQ0E7O0FBRUE7Ozs7O0FBS0EseURBQWUsVUFBQ0csSUFBRCxFQUFVOztBQUVyQkEsV0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ2pCQyxnQkFBUSxDQUFDLFFBQUQsRUFBVyxDQUFDLFFBQVosQ0FEUztBQUVqQkMsY0FBTSxDQUZXO0FBR2pCQyxvQkFBWSxZQUhLO0FBSWpCQyxtQkFBVyxrQkFKTTtBQUtqQkMsd0JBQWdCLGNBTEM7QUFNakJDLG1CQUFXLElBTk07QUFPakJDLHFCQUFhLEtBUEk7QUFRakJDLHVCQUFlLGdDQVJFO0FBU2pCQyxlQUFPO0FBVFUsS0FBZCxFQVVKWCxJQVZJLENBQVA7O0FBWUEsUUFBTVksTUFBTSxrRUFBQUMsQ0FBY2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9CQUFZLENBQUMsRUFBRCxFQUFLLEVBQUw7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LENBQW9CLGtCQUFVO0FBQzFCZix5QkFBYXNDLE1BQWIsQ0FBb0I7QUFDaEJyQyx3QkFBUUEsT0FBT3NDLElBREM7QUFFaEJrQiwwQkFBV3hELE9BQU9zQyxJQUFQLENBQVltQixNQUFaLEdBQXFCO0FBRmhCLGFBQXBCO0FBSUgsU0FMRDtBQU1ILEtBbEVEOztBQW9FQWpCO0FBQ0FrQixnQkFBWWxCLFNBQVosRUFBdUIsS0FBdkI7QUFDSCxDQXpNRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9cclxuXHJcbmNvbnN0IGdlb2xpYiA9IHJlcXVpcmUoJ2dlb2xpYicpO1xyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcclxuXHJcbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXHJcbmltcG9ydCB7IEFDVFVBTF9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgbGl2ZSBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICogQHByaXZhdGVcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcblxyXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxyXG4gICAgICAgIHpvb206IDUsXHJcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxyXG4gICAgICAgIHBpcmVwX3VyaTogJy9hcGkvcGlyZXBzL3tpZH0nLFxyXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcclxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxyXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcclxuICAgIH0sIG9wdHMpO1xyXG5cclxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXHJcbiAgICAgICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhvbGQgdGhlIG1hcmtlcnNcclxuICAgICAqIEB0eXBlIHt7fX1cclxuICAgICAqL1xyXG4gICAgbGV0IG1hcmtlcnNfbGlzdCA9IHt9O1xyXG5cclxuICAgIGxldCBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0ID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsQXJyID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbERlcCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9sbGVyIGZvciB0d28td2F5IGJpbmRpbmdzXHJcbiAgICAgKiBAdHlwZSB7e2ZvY3VzTWFya2VyOiBmb2N1c01hcmtlcn19XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG1hcENvbnRyb2xsZXIgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRm9jdXMgb24gYSBzcGVjaWZpYyBtYXJrZXJcclxuICAgICAgICAgKiBAcGFyYW0gZVxyXG4gICAgICAgICAqIEBwYXJhbSBtb2RlbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvY3VzTWFya2VyOiAoZSwgbW9kZWwpID0+IHtcclxuICAgICAgICAgICAgaWYoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWFya2VyIG5vdCBmb3VuZCBpbiBsaXN0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XHJcbiAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHJfbWFwX3ZpZXcgPSByaXZldHMuYmluZCgkKCcjbWFwLWluZm8tYm94JyksIHtwaXJlcDoge30sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcclxuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW10sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxyXG4gICAgICogQHBhcmFtIGZlYXR1cmVcclxuICAgICAqIEBwYXJhbSBsYXllclxyXG4gICAgICovXHJcbiAgICBjb25zdCBvbkZsaWdodENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xyXG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXHJcbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocnRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcclxuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsQXJyKTtcclxuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRGVwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XHJcblxyXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJ0ZS5saW5lKTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xyXG5cclxuICAgICAgICAgICAgLypjb25zdCBkcHRJY29uID0gbGVhZmxldC5kaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGh0bWw6ICc8ZGl2IGNsYXNzPVwibWFwLWluZm8tbGFiZWxcIj48aDU+JyArIHJ0ZS5haXJwb3J0cy5kLmljYW8gKyAnPC9oNT48L2Rpdj4nXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxEZXAgPSBsZWFmbGV0Lm1hcmtlcihbcnRlLmFpcnBvcnRzLmQubGF0LCBydGUuYWlycG9ydHMuZC5sb25dLCB7aWNvbjpkcHRJY29ufSkuYWRkVG8obWFwKTtcclxuICAgICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgICAgIC8vIENlbnRlciBvbiBpdCwgYnV0IG9ubHkgZG8gaXQgb25jZSwgaW4gY2FzZSB0aGUgbWFwIGlzIG1vdmVkXHJcbiAgICAgICAgICAgIGlmKCFwYW5uZWRUb0NlbnRlcikge1xyXG4gICAgICAgICAgICAgICAgLy8gZmluZCBjZW50ZXJcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZW9saWIuZ2V0Q2VudGVyKFtcclxuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuYS5sb259LFxyXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmQubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxvbn0sXHJcbiAgICAgICAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL21hcC5wYW5Ubyh7bGF0OiBjLmxhdGl0dWRlLCBsbmc6IGMubG9uZ2l0dWRlfSk7XHJcbiAgICAgICAgICAgICAgICBtYXAucGFuVG8oe2xhdDogcnRlLnBvc2l0aW9uLmxhdCwgbG5nOiBydGUucG9zaXRpb24ubG9ufSk7XHJcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXaGVuIHRoZSBQSVJFUCBpbmZvIGlzIGRvbmUgbG9hZGluZywgc2hvdyB0aGUgYm90dG9tIGJhclxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xyXG4gICAgICAgICAgICByX21hcF92aWV3LnVwZGF0ZSh7cGlyZXA6cGlyZXAuZGF0YX0pO1xyXG4gICAgICAgICAgICAkKCcjbWFwLWluZm8tYm94Jykuc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZWxvYWRpbmcgZmxpZ2h0cyBmcm9tIGFjYXJzLi4uJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFKQVggVVBEQVRFXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsICcnKTtcclxuICAgICAgICBsZXQgcGlyZXBzID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZmxpZ2h0cyA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGZsaWdodHMpLmRvbmUoZmxpZ2h0R2VvSnNvbiA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJGbGlnaHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xyXG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIub24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlcnNfbGlzdFtmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWRdID0gW2ZlYXR1cmUsIGxheWVyXTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5hZGRUbyhtYXApO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJTZWxGbGlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQud2hlbihwaXJlcHMpLmRvbmUocGlyZXBzID0+IHtcclxuICAgICAgICAgICAgcl90YWJsZV92aWV3LnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxyXG4gICAgICAgICAgICAgICAgaGFzX2RhdGE6IChwaXJlcHMuZGF0YS5sZW5ndGggPiAwKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZU1hcCgpO1xyXG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -408,7 +408,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\r\n * Show some popup text when a feature is clicked on\r\n * @param feature\r\n * @param layer\r\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\r\n * Show each point as a marker\r\n * @param feature\r\n * @param latlng\r\n * @returns {*}\r\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\r\n *\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\r\n * draw the actual route\r\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\r\n *\r\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcbmltcG9ydCB7QUNUVUFMX1JPVVRFX0NPTE9SLCBDSVJDTEVfQ09MT1IsIFBMQU5fUk9VVEVfQ09MT1J9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFNob3cgc29tZSBwb3B1cCB0ZXh0IHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb25cclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93IGVhY2ggcG9pbnQgYXMgYSBtYXJrZXJcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxhdGxuZ1xyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XHJcbiAgICByZXR1cm4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgcmFkaXVzOiA1LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxyXG4gICAgICAgIGNvbG9yOiAnIzAwMCcsXHJcbiAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuOFxyXG4gICAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xyXG5cclxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcclxuICAgICAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBsaXZlX21hcDogZmFsc2UsXHJcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXHJcbiAgICAgICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgICAgIHVybDogJycsXHJcbiAgICAgICAgICAgIHBhcmFtczoge31cclxuICAgICAgICB9LFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXHJcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xyXG5cclxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XHJcbiAgICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgd2VpZ2h0OiA0LFxyXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcclxuICAgICAgICBjb2xvcjogUExBTl9ST1VURV9DT0xPUixcclxuICAgICAgICBzdGVwczogNTAsXHJcbiAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICB9KS5hZGRUbyhtYXApO1xyXG5cclxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBQTEFOX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXHJcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZ2VvZGVzaWNMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcclxuICAgICAgICAgICAgd2VpZ2h0OiAzLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgIHN0ZXBzOiA1MCxcclxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgfSkuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJvdXRlX3BvaW50cyA9IGxlYWZsZXQuZ2VvSlNPTihvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcclxuICAgICAgICAgICAgICAgICdvcGFjaXR5JzogMC42NSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGxpdmVGbGlnaHQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XHJcbiAgICAgICAgY29uc3QgbGl2ZV9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGxpdmVfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xyXG4gICAgICAgICAgICBsYXllckxpdmVGbGlnaHQgPSBsZWFmbGV0Lmdlb0pTT04ocm91dGVKc29uLCB7XHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodC5hZGRUbyhtYXApXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); /***/ }), diff --git a/public/assets/admin/js/vendor.js b/public/assets/admin/js/vendor.js index 1ee244d1..61bf072d 100644 --- a/public/assets/admin/js/vendor.js +++ b/public/assets/admin/js/vendor.js @@ -27456,4502 +27456,4502 @@ return jQuery; global.moment = factory() }(this, (function () { 'use strict'; -var hookCallback; + var hookCallback; -function hooks () { - return hookCallback.apply(null, arguments); -} + function hooks () { + return hookCallback.apply(null, arguments); + } -// This is done to register the method called with moment() -// without creating circular dependencies. -function setHookCallback (callback) { - hookCallback = callback; -} + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } -function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; -} + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } -function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; -} + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } -function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return (Object.getOwnPropertyNames(obj).length === 0); + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; } else { - var k; - for (k in obj) { - if (obj.hasOwnProperty(k)) { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; + } + + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; return false; } } return true; } -} -function isUndefined(input) { - return input === void 0; -} - -function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; -} - -function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; -} - -function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; -} - -function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); -} - -function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; -} - -function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); -} - -function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null, - rfc2822 : false, - weekdayMismatch : false + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 }; -} -function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; -} - -var some; -if (Array.prototype.some) { - some = Array.prototype.some; -} else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; -} - -function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; -} - -function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; -} - -// Plugins that add properties should also add the key here (null value), -// so we can properly clone ourselves. -var momentProperties = hooks.momentProperties = []; - -function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; -} - -var updateInProgress = false; - -// Moment prototype object -function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } -} - -function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); -} - -function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } -} - -function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; -} - -// compare two arrays, return the number of differences -function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; -} - -function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } -} - -function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); -} - -var deprecations = {}; - -function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } -} - -hooks.suppressDeprecationWarnings = false; -hooks.deprecationHandler = null; - -function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; -} - -function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); -} - -function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; -} - -function Locale(config) { - if (config != null) { - this.set(config); - } -} - -var keys; - -if (Object.keys) { - keys = Object.keys; -} else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; -} - -var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' -}; - -function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; -} - -var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' -}; - -function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; -} - -var defaultInvalidDate = 'Invalid date'; - -function invalidDate () { - return this._invalidDate; -} - -var defaultOrdinal = '%d'; -var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - -function ordinal (number) { - return this._ordinal.replace('%d', number); -} - -var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' -}; - -function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); -} - -function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); -} - -var aliases = {}; - -function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; -} - -function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; -} - -function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; } } - return normalizedInput; -} - -var priorities = {}; - -function addUnitPriority(unit, priority) { - priorities[unit] = priority; -} - -function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; -} - -function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; -} - -var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - -var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - -var formatFunctions = {}; - -var formatTokenFunctions = {}; - -// token: 'M' -// padded: ['MM', 2] -// ordinal: 'Mo' -// callback: function () { this.month() + 1 } -function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } -} - -function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); -} - -function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; -} - -// format date using native date object -function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); -} - -function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; -} - -var match1 = /\d/; // 0 - 9 -var match2 = /\d\d/; // 00 - 99 -var match3 = /\d{3}/; // 000 - 999 -var match4 = /\d{4}/; // 0000 - 9999 -var match6 = /[+-]?\d{6}/; // -999999 - 999999 -var match1to2 = /\d\d?/; // 0 - 99 -var match3to4 = /\d\d\d\d?/; // 999 - 9999 -var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 -var match1to3 = /\d{1,3}/; // 0 - 999 -var match1to4 = /\d{1,4}/; // 0 - 9999 -var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - -var matchUnsigned = /\d+/; // 0 - inf -var matchSigned = /[+-]?\d+/; // -inf - inf - -var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z -var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - -var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - -// any word (or two) characters or numbers including two/three word month in arabic. -// includes scottish gaelic two word and hyphenated months -var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - -var regexes = {}; - -function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; -} - -function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); -} - -// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript -function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); -} - -function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); -} - -var tokens = {}; - -function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } -} - -function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); -} - -function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } -} - -var YEAR = 0; -var MONTH = 1; -var DATE = 2; -var HOUR = 3; -var MINUTE = 4; -var SECOND = 5; -var MILLISECOND = 6; -var WEEK = 7; -var WEEKDAY = 8; - -// FORMATTING - -addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; -}); - -addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; -}); - -addFormatToken(0, ['YYYY', 4], 0, 'year'); -addFormatToken(0, ['YYYYY', 5], 0, 'year'); -addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - -// ALIASES - -addUnitAlias('year', 'y'); - -// PRIORITIES - -addUnitPriority('year', 1); - -// PARSING - -addRegexToken('Y', matchSigned); -addRegexToken('YY', match1to2, match2); -addRegexToken('YYYY', match1to4, match4); -addRegexToken('YYYYY', match1to6, match6); -addRegexToken('YYYYYY', match1to6, match6); - -addParseToken(['YYYYY', 'YYYYYY'], YEAR); -addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); -}); -addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); -}); -addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); -}); - -// HELPERS - -function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; -} - -function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; -} - -// HOOKS - -hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); -}; - -// MOMENTS - -var getSetYear = makeGetSet('FullYear', true); - -function getIsLeapYear () { - return isLeapYear(this.year()); -} - -function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; -} - -function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; -} - -function set$1 (mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); - } - else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } -} - -// MOMENTS - -function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; -} - - -function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; -} - -function mod(n, x) { - return ((n % x) + x) % x; -} - -var indexOf; - -if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; -} else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; -} - -function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; - } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); -} - -// FORMATTING - -addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; -}); - -addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); -}); - -addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); -}); - -// ALIASES - -addUnitAlias('month', 'M'); - -// PRIORITY - -addUnitPriority('month', 8); - -// PARSING - -addRegexToken('M', match1to2); -addRegexToken('MM', match1to2, match2); -addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); -}); -addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); -}); - -addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; -}); - -addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } -}); - -// LOCALES - -var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; -var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); -function localeMonths (m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; -} - -var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); -function localeMonthsShort (m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; -} - -function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } -} - -function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } -} - -// MOMENTS - -function setMonth (mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; -} - -function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } -} - -function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); -} - -var defaultMonthsShortRegex = matchWord; -function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } -} - -var defaultMonthsRegex = matchWord; -function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } -} - -function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); -} - -function createDate (y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date = new Date(y, m, d, h, M, s, ms); - - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; -} - -function createUTCDate (y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; -} - -// start-of-first-week - start-of-year -function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; -} - -// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday -function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; -} - -function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; -} - -function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; -} - -// FORMATTING - -addFormatToken('w', ['ww', 2], 'wo', 'week'); -addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - -// ALIASES - -addUnitAlias('week', 'w'); -addUnitAlias('isoWeek', 'W'); - -// PRIORITIES - -addUnitPriority('week', 5); -addUnitPriority('isoWeek', 5); - -// PARSING - -addRegexToken('w', match1to2); -addRegexToken('ww', match1to2, match2); -addRegexToken('W', match1to2); -addRegexToken('WW', match1to2, match2); - -addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); -}); - -// HELPERS - -// LOCALES - -function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; -} - -var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. -}; - -function localeFirstDayOfWeek () { - return this._week.dow; -} - -function localeFirstDayOfYear () { - return this._week.doy; -} - -// MOMENTS - -function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); -} - -function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); -} - -// FORMATTING - -addFormatToken('d', 0, 'do', 'day'); - -addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); -}); - -addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); -}); - -addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); -}); - -addFormatToken('e', 0, 0, 'weekday'); -addFormatToken('E', 0, 0, 'isoWeekday'); - -// ALIASES - -addUnitAlias('day', 'd'); -addUnitAlias('weekday', 'e'); -addUnitAlias('isoWeekday', 'E'); - -// PRIORITY -addUnitPriority('day', 11); -addUnitPriority('weekday', 11); -addUnitPriority('isoWeekday', 11); - -// PARSING - -addRegexToken('d', match1to2); -addRegexToken('e', match1to2); -addRegexToken('E', match1to2); -addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); -}); -addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); -}); -addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); -}); - -addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } -}); - -addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); -}); - -// HELPERS - -function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; -} - -function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; -} - -// LOCALES - -var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); -function localeWeekdays (m, format) { - if (!m) { - return isArray(this._weekdays) ? this._weekdays : - this._weekdays['standalone']; - } - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; -} - -var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); -function localeWeekdaysShort (m) { - return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; -} - -var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); -function localeWeekdaysMin (m) { - return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; -} - -function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } -} - -function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } -} - -// MOMENTS - -function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } -} - -function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); -} - -function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } -} - -var defaultWeekdaysRegex = matchWord; -function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } -} - -var defaultWeekdaysShortRegex = matchWord; -function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } -} - -var defaultWeekdaysMinRegex = matchWord; -function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } -} - - -function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); -} - -// FORMATTING - -function hFormat() { - return this.hours() % 12 || 12; -} - -function kFormat() { - return this.hours() || 24; -} - -addFormatToken('H', ['HH', 2], 0, 'hour'); -addFormatToken('h', ['hh', 2], 0, hFormat); -addFormatToken('k', ['kk', 2], 0, kFormat); - -addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); -}); - -addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); -}); - -addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); -}); - -addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); -}); - -function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); -} - -meridiem('a', true); -meridiem('A', false); - -// ALIASES - -addUnitAlias('hour', 'h'); - -// PRIORITY -addUnitPriority('hour', 13); - -// PARSING - -function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; -} - -addRegexToken('a', matchMeridiem); -addRegexToken('A', matchMeridiem); -addRegexToken('H', match1to2); -addRegexToken('h', match1to2); -addRegexToken('k', match1to2); -addRegexToken('HH', match1to2, match2); -addRegexToken('hh', match1to2, match2); -addRegexToken('kk', match1to2, match2); - -addRegexToken('hmm', match3to4); -addRegexToken('hmmss', match5to6); -addRegexToken('Hmm', match3to4); -addRegexToken('Hmmss', match5to6); - -addParseToken(['H', 'HH'], HOUR); -addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; -}); -addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; -}); -addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; -}); -addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; -}); -addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; -}); -addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); -}); -addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); -}); - -// LOCALES - -function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); -} - -var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; -function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } -} - - -// MOMENTS - -// Setting the hour should keep the time, because the user explicitly -// specified which hour he wants. So trying to maintain the same hour (in -// a new timezone) makes sense. Adding/subtracting hours does not follow -// this rule. -var getSetHour = makeGetSet('Hours', true); - -var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse -}; - -// internal storage for locale config files -var locales = {}; -var localeFamilies = {}; -var globalLocale; - -function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; -} - -// pick the locale from the array -// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each -// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root -function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; -} - -function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - var aliasedRequire = require; - aliasedRequire('./locale/' + name); - getSetGlobalLocale(oldLocale); - } catch (e) {} - } - return locales[name]; -} - -// This function will load locale and then set the global locale. If -// no arguments are passed in, it will simply return the current global -// locale key. -function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - else { - if ((typeof console !== 'undefined') && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn('Locale ' + key + ' not found. Did you forget to load it?'); - } - } - } - - return globalLocale._abbr; -} - -function defineLocale (name, config) { - if (config !== null) { - var locale, parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } -} - -function updateLocale(name, config) { - if (config != null) { - var locale, tmpLocale, parentConfig = baseConfig; - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; -} - -// returns locale data -function getLocale (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); -} - -function listLocales() { - return keys(locales); -} - -function checkOverflow (m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; -} - -// Pick the first defined of two or three arguments. -function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; -} - -function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; -} - -// convert an array to a date. -// the array should mirror the parameters below -// note: all values past the year are optional and will default to the lowest possible value. -// [year, month, day , hour, minute, second, millisecond] -function configFromArray (config) { - var i, date, input = [], currentDate, expectedWeekday, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); - - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - - // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { - getParsingFlags(config).weekdayMismatch = true; - } -} - -function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - var curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } -} - -// iso 8601 regex -// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) -var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; -var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - -var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - -var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] -]; - -// iso time formats and regexes -var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] -]; - -var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - -// date from iso format -function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { return; } - } - if (!allowTime && timeFormat != null) { + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } -} - -// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 -var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; - -function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10) - ]; - - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - - return result; -} - -function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; -} - -function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); -} - -function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; } } - return true; -} -var obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 -}; + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); -function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10); - var m = hm % 100, h = (hm - m) / 100; - return h * 60 + m; - } -} - -// date and time from ref 2822 format -function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)); - if (match) { - var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); - if (!checkWeekday(match[1], parsedArray, config)) { + if (matched !== null) { + config._d = new Date(+matched[1]); return; } - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); - - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } -} - -// date from iso format or fallback -function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); -} - -hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } -); - -// constant that refers to the ISO standard -hooks.ISO_8601 = function () {}; - -// constant that refers to the RFC 2822 form -hooks.RFC_2822 = function () {}; - -// date from string and format string -function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); -} - - -function meridiemFixWrap (locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } -} - -// date from string and array of format strings -function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; + if (config._isValid === false) { + delete config._isValid; + } else { + return; } - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); -} - -function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); -} - -function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; -} - -function prepareConfig (config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; -} - -function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { + // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } -} -function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); - if (locale === true || locale === false) { - strict = locale; - locale = undefined; + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); } - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - return createFromConfig(c); -} + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; -function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); -} - -var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; } else { - return createInvalid(); + // this is not supposed to happen + return hour; } } -); -var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); } else { - return createInvalid(); + hooks.createFromInputFallback(config); } } -); -// Pick a moment m from moments so that m[fn](other) is true for all -// other. This relies on the function fn to be transitive. -// -// moments should either be an array of moment objects or an array, whose -// first element is an array of moment objects. -function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); } - if (!moments.length) { - return createLocal(); + + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; + } + + function isValid$1() { + return this._isValid; + } + + function createInvalid$1() { + return createDuration(NaN); + } + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); } } - return res; -} -// TODO: Use [].sort instead? -function min () { - var args = [].slice.call(arguments, 0); + // FORMATTING - return pickBy('isBefore', args); -} + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } -function max () { - var args = [].slice.call(arguments, 0); + offset('Z', ':'); + offset('ZZ', ''); - return pickBy('isAfter', args); -} + // PARSING -var now = function () { - return Date.now ? Date.now() : +(new Date()); -}; + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); -var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + // HELPERS -function isDurationValid(m) { - for (var key in m) { - if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { return false; } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; } - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; - } - } + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); } - return true; -} - -function isValid$1() { - return this._isValid; -} - -function createInvalid$1() { - return createDuration(NaN); -} - -function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - this._isValid = isDurationValid(normalizedInput); - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); -} - -function isDuration (obj) { - return obj instanceof Duration; -} - -function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } -} - -// FORMATTING - -function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); -} - -offset('Z', ':'); -offset('ZZ', ''); - -// PARSING - -addRegexToken('Z', matchShortOffset); -addRegexToken('ZZ', matchShortOffset); -addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); -}); - -// HELPERS - -// timezone chunker -// '+10:00' > ['10', '00'] -// '-1530' > ['-15', '30'] -var chunkOffset = /([\+\-]|\d\d)/gi; - -function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - - if (matches === null) { - return null; - } - - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; -} - -// Return a moment from input, that is local/utc/zone equivalent to model. -function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } -} - -function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; -} - -// HOOKS - -// This function will be called whenever a moment is mutated. -// It is intended to keep the offset in sync with the timezone. -hooks.updateOffset = function () {}; - -// MOMENTS - -// keepLocalTime = true means only change the timezone, without -// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> -// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset -// +0200, so we adjust the time as needed, to be valid. -// -// Keeping the time actually adds/subtracts (one hour) -// from the actual represented time. That is why we call updateOffset -// a second time. In case it wants us to change the offset again -// _changeInProgress == true case, then we have to adjust, because -// there is no such time in the given timezone. -function getSetOffset (input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } -} - -function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; } - this.utcOffset(input, keepLocalTime); + var c = {}; - return this; - } else { - return -this.utcOffset(); - } -} + copyConfig(c, this); + c = prepareConfig(c); -function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); -} - -function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; } - } - return this; -} -function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; -} - -function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; -} - -function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); -} - -function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; + function isLocal () { + return this.isValid() ? !this._isUTC : false; } - return this._isDSTShifted; -} + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } -function isLocal () { - return this.isValid() ? !this._isUTC : false; -} + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } -function isUtcOffset () { - return this.isValid() ? this._isUTC : false; -} + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; -function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; -} + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; -// ASP.NET json date format regex -var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; -// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html -// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere -// and further modified to allow for strings containing both week and day -var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); -function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); } else { - duration.milliseconds = input; + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; } - ret = new Duration(duration); + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; -} - -createDuration.fn = Duration.prototype; -createDuration.invalid = createInvalid$1; - -function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; -} - -function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; -} - -function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; -} - -// TODO: remove 'name' arg after deprecation is removed -function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; + if (!mom.isValid()) { + // No op + return; } - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; -} + updateOffset = updateOffset == null ? true : updateOffset; -function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } } - updateOffset = updateOffset == null ? true : updateOffset; + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } -} - -var add = createAdder(1, 'add'); -var subtract = createAdder(-1, 'subtract'); - -function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; -} - -function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); -} - -function clone () { - return new Moment(this); -} - -function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } -} - -function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } -} - -function isBetween (from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); -} - -function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } -} - -function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input,units); -} - -function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input,units); -} - -function diff (input, units, asFloat) { - var that, - zoneDelta, - output; - - if (!this.isValid()) { - return NaN; + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; } - that = cloneWithOffset(input, this); + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; - if (!that.isValid()) { - return NaN; + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); } - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - switch (units) { - case 'year': output = monthDiff(this, that) / 12; break; - case 'month': output = monthDiff(this, that); break; - case 'quarter': output = monthDiff(this, that) / 3; break; - case 'second': output = (this - that) / 1e3; break; // 1000 - case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 - case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 - case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst - case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: output = this - that; + function clone () { + return new Moment(this); } - return asFloat ? output : absFloor(output); -} - -function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; -} - -hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; -hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - -function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); -} - -function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true; - var m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } - return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); -} -/** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ -function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); -} - -function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); -} - -function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } -} - -function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); -} - -function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } -} - -function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); -} - -// If passed a locale key, it will set the locale for this -// instance. Otherwise, it will return the locale configuration -// variables for this instance. -function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; } - return this; - } -} - -var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); } else { - return this.locale(key); + return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } -); -function localeData () { - return this._locale; -} - -function startOf (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); } - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; -} - -function endOf (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); -} - -function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); -} - -function unix () { - return Math.floor(this.valueOf() / 1000); -} - -function toDate () { - return new Date(this.valueOf()); -} - -function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; -} - -function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; -} - -function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; -} - -function isValid$2 () { - return isValid(this); -} - -function parsingFlags () { - return extend({}, getParsingFlags(this)); -} - -function invalidAt () { - return getParsingFlags(this).overflow; -} - -function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; -} - -// FORMATTING - -addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; -}); - -addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; -}); - -function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); -} - -addWeekYearFormatToken('gggg', 'weekYear'); -addWeekYearFormatToken('ggggg', 'weekYear'); -addWeekYearFormatToken('GGGG', 'isoWeekYear'); -addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - -// ALIASES - -addUnitAlias('weekYear', 'gg'); -addUnitAlias('isoWeekYear', 'GG'); - -// PRIORITY - -addUnitPriority('weekYear', 1); -addUnitPriority('isoWeekYear', 1); - - -// PARSING - -addRegexToken('G', matchSigned); -addRegexToken('g', matchSigned); -addRegexToken('GG', match1to2, match2); -addRegexToken('gg', match1to2, match2); -addRegexToken('GGGG', match1to4, match4); -addRegexToken('gggg', match1to4, match4); -addRegexToken('GGGGG', match1to6, match6); -addRegexToken('ggggg', match1to6, match6); - -addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); -}); - -addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); -}); - -// MOMENTS - -function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); -} - -function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); -} - -function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); -} - -function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); -} - -function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } -} - -function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; -} - -// FORMATTING - -addFormatToken('Q', 0, 'Qo', 'quarter'); - -// ALIASES - -addUnitAlias('quarter', 'Q'); - -// PRIORITY - -addUnitPriority('quarter', 7); - -// PARSING - -addRegexToken('Q', match1); -addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; -}); - -// MOMENTS - -function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); -} - -// FORMATTING - -addFormatToken('D', ['DD', 2], 'Do', 'date'); - -// ALIASES - -addUnitAlias('date', 'D'); - -// PRIOROITY -addUnitPriority('date', 9); - -// PARSING - -addRegexToken('D', match1to2); -addRegexToken('DD', match1to2, match2); -addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; -}); - -addParseToken(['D', 'DD'], DATE); -addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); -}); - -// MOMENTS - -var getSetDayOfMonth = makeGetSet('Date', true); - -// FORMATTING - -addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - -// ALIASES - -addUnitAlias('dayOfYear', 'DDD'); - -// PRIORITY -addUnitPriority('dayOfYear', 4); - -// PARSING - -addRegexToken('DDD', match1to3); -addRegexToken('DDDD', match3); -addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); -}); - -// HELPERS - -// MOMENTS - -function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); -} - -// FORMATTING - -addFormatToken('m', ['mm', 2], 0, 'minute'); - -// ALIASES - -addUnitAlias('minute', 'm'); - -// PRIORITY - -addUnitPriority('minute', 14); - -// PARSING - -addRegexToken('m', match1to2); -addRegexToken('mm', match1to2, match2); -addParseToken(['m', 'mm'], MINUTE); - -// MOMENTS - -var getSetMinute = makeGetSet('Minutes', false); - -// FORMATTING - -addFormatToken('s', ['ss', 2], 0, 'second'); - -// ALIASES - -addUnitAlias('second', 's'); - -// PRIORITY - -addUnitPriority('second', 15); - -// PARSING - -addRegexToken('s', match1to2); -addRegexToken('ss', match1to2, match2); -addParseToken(['s', 'ss'], SECOND); - -// MOMENTS - -var getSetSecond = makeGetSet('Seconds', false); - -// FORMATTING - -addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); -}); - -addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); -}); - -addFormatToken(0, ['SSS', 3], 0, 'millisecond'); -addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; -}); -addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; -}); -addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; -}); -addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; -}); -addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; -}); -addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; -}); - - -// ALIASES - -addUnitAlias('millisecond', 'ms'); - -// PRIORITY - -addUnitPriority('millisecond', 16); - -// PARSING - -addRegexToken('S', match1to3, match1); -addRegexToken('SS', match1to3, match2); -addRegexToken('SSS', match1to3, match3); - -var token; -for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); -} - -function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); -} - -for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); -} -// MOMENTS - -var getSetMillisecond = makeGetSet('Milliseconds', false); - -// FORMATTING - -addFormatToken('z', 0, 0, 'zoneAbbr'); -addFormatToken('zz', 0, 0, 'zoneName'); - -// MOMENTS - -function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; -} - -function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; -} - -var proto = Moment.prototype; - -proto.add = add; -proto.calendar = calendar$1; -proto.clone = clone; -proto.diff = diff; -proto.endOf = endOf; -proto.format = format; -proto.from = from; -proto.fromNow = fromNow; -proto.to = to; -proto.toNow = toNow; -proto.get = stringGet; -proto.invalidAt = invalidAt; -proto.isAfter = isAfter; -proto.isBefore = isBefore; -proto.isBetween = isBetween; -proto.isSame = isSame; -proto.isSameOrAfter = isSameOrAfter; -proto.isSameOrBefore = isSameOrBefore; -proto.isValid = isValid$2; -proto.lang = lang; -proto.locale = locale; -proto.localeData = localeData; -proto.max = prototypeMax; -proto.min = prototypeMin; -proto.parsingFlags = parsingFlags; -proto.set = stringSet; -proto.startOf = startOf; -proto.subtract = subtract; -proto.toArray = toArray; -proto.toObject = toObject; -proto.toDate = toDate; -proto.toISOString = toISOString; -proto.inspect = inspect; -proto.toJSON = toJSON; -proto.toString = toString; -proto.unix = unix; -proto.valueOf = valueOf; -proto.creationData = creationData; -proto.year = getSetYear; -proto.isLeapYear = getIsLeapYear; -proto.weekYear = getSetWeekYear; -proto.isoWeekYear = getSetISOWeekYear; -proto.quarter = proto.quarters = getSetQuarter; -proto.month = getSetMonth; -proto.daysInMonth = getDaysInMonth; -proto.week = proto.weeks = getSetWeek; -proto.isoWeek = proto.isoWeeks = getSetISOWeek; -proto.weeksInYear = getWeeksInYear; -proto.isoWeeksInYear = getISOWeeksInYear; -proto.date = getSetDayOfMonth; -proto.day = proto.days = getSetDayOfWeek; -proto.weekday = getSetLocaleDayOfWeek; -proto.isoWeekday = getSetISODayOfWeek; -proto.dayOfYear = getSetDayOfYear; -proto.hour = proto.hours = getSetHour; -proto.minute = proto.minutes = getSetMinute; -proto.second = proto.seconds = getSetSecond; -proto.millisecond = proto.milliseconds = getSetMillisecond; -proto.utcOffset = getSetOffset; -proto.utc = setOffsetToUTC; -proto.local = setOffsetToLocal; -proto.parseZone = setOffsetToParsedOffset; -proto.hasAlignedHourOffset = hasAlignedHourOffset; -proto.isDST = isDaylightSavingTime; -proto.isLocal = isLocal; -proto.isUtcOffset = isUtcOffset; -proto.isUtc = isUtc; -proto.isUTC = isUtc; -proto.zoneAbbr = getZoneAbbr; -proto.zoneName = getZoneName; -proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); -proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); -proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); -proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); -proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); - -function createUnix (input) { - return createLocal(input * 1000); -} - -function createInZone () { - return createLocal.apply(null, arguments).parseZone(); -} - -function preParsePostFormat (string) { - return string; -} - -var proto$1 = Locale.prototype; - -proto$1.calendar = calendar; -proto$1.longDateFormat = longDateFormat; -proto$1.invalidDate = invalidDate; -proto$1.ordinal = ordinal; -proto$1.preparse = preParsePostFormat; -proto$1.postformat = preParsePostFormat; -proto$1.relativeTime = relativeTime; -proto$1.pastFuture = pastFuture; -proto$1.set = set; - -proto$1.months = localeMonths; -proto$1.monthsShort = localeMonthsShort; -proto$1.monthsParse = localeMonthsParse; -proto$1.monthsRegex = monthsRegex; -proto$1.monthsShortRegex = monthsShortRegex; -proto$1.week = localeWeek; -proto$1.firstDayOfYear = localeFirstDayOfYear; -proto$1.firstDayOfWeek = localeFirstDayOfWeek; - -proto$1.weekdays = localeWeekdays; -proto$1.weekdaysMin = localeWeekdaysMin; -proto$1.weekdaysShort = localeWeekdaysShort; -proto$1.weekdaysParse = localeWeekdaysParse; - -proto$1.weekdaysRegex = weekdaysRegex; -proto$1.weekdaysShortRegex = weekdaysShortRegex; -proto$1.weekdaysMinRegex = weekdaysMinRegex; - -proto$1.isPM = localeIsPM; -proto$1.meridiem = localeMeridiem; - -function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); -} - -function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; } - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); } - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); } - return out; -} -// () -// (5) -// (fmt, 5) -// (fmt) -// (true) -// (true, 5) -// (true, fmt, 5) -// (true, fmt) -function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; + + if (!this.isValid()) { + return NaN; } - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; + that = cloneWithOffset(input, this); - if (isNumber(format)) { - index = format; - format = undefined; + if (!that.isValid()) { + return NaN; } - format = format || ''; - } + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; + units = normalizeUnits(units); - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; -} - -function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); -} - -function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); -} - -function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); -} - -function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); -} - -function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); -} - -getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } -}); - -// Side effect imports - -hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); -hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - -var mathAbs = Math.abs; - -function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; -} - -function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); -} - -// supports only 2.0-style add(1, 's') or add(duration) -function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); -} - -// supports only 2.0-style subtract(1, 's') or subtract(duration) -function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); -} - -function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } -} - -function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; -} - -function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; -} - -function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; -} - -function as (units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); } } -} -// TODO: Use this.as('ms')? -function valueOf$1 () { - if (!this.isValid()) { - return NaN; + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } ); -} -function makeAs (alias) { - return function () { - return this.as(alias); - }; -} - -var asMilliseconds = makeAs('ms'); -var asSeconds = makeAs('s'); -var asMinutes = makeAs('m'); -var asHours = makeAs('h'); -var asDays = makeAs('d'); -var asWeeks = makeAs('w'); -var asMonths = makeAs('M'); -var asYears = makeAs('y'); - -function clone$1 () { - return createDuration(this); -} - -function get$2 (units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; -} - -function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; -} - -var milliseconds = makeGetter('milliseconds'); -var seconds = makeGetter('seconds'); -var minutes = makeGetter('minutes'); -var hours = makeGetter('hours'); -var days = makeGetter('days'); -var months = makeGetter('months'); -var years = makeGetter('years'); - -function weeks () { - return absFloor(this.days() / 7); -} - -var round = Math.round; -var thresholds = { - ss: 44, // a few seconds to seconds - s : 45, // seconds to minute - m : 45, // minutes to hour - h : 22, // hours to day - d : 26, // days to month - M : 11 // months to year -}; - -// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize -function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); -} - -function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); -} - -// This function allows you to set the rounding function for relative time strings -function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; + function localeData () { + return this._locale; } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(this.valueOf() / 1000); + } + + function toDate () { + return new Date(this.valueOf()); + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2 () { + return isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); + } + + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat (string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + + var mathAbs = Math.abs; + + function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function clone$1 () { + return createDuration(this); + } + + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } return true; } - return false; -} -// This function allows you to set a threshold for relative time strings -function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; -} + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } -function humanize (withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); } - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); + var abs$1 = Math.abs; - if (withSuffix) { - output = locale.pastFuture(+this, output); + function sign(x) { + return ((x > 0) - (x < 0)) || +x; } - return locale.postformat(output); -} + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } -var abs$1 = Math.abs; + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; -function sign(x) { - return ((x > 0) - (x < 0)) || +x; -} + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; -function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); } - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; + var proto$2 = Duration.prototype; - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - var total = this.asSeconds(); + hooks.version = '2.22.1'; - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } + setHookCallback(createLocal); - var totalSign = total < 0 ? '-' : ''; - var ymSign = sign(this._months) !== sign(total) ? '-' : ''; - var daysSign = sign(this._days) !== sign(total) ? '-' : ''; - var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; - return totalSign + 'P' + - (Y ? ymSign + Y + 'Y' : '') + - (M ? ymSign + M + 'M' : '') + - (D ? daysSign + D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? hmsSign + h + 'H' : '') + - (m ? hmsSign + m + 'M' : '') + - (s ? hmsSign + s + 'S' : ''); -} + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // + }; -var proto$2 = Duration.prototype; - -proto$2.isValid = isValid$1; -proto$2.abs = abs; -proto$2.add = add$1; -proto$2.subtract = subtract$1; -proto$2.as = as; -proto$2.asMilliseconds = asMilliseconds; -proto$2.asSeconds = asSeconds; -proto$2.asMinutes = asMinutes; -proto$2.asHours = asHours; -proto$2.asDays = asDays; -proto$2.asWeeks = asWeeks; -proto$2.asMonths = asMonths; -proto$2.asYears = asYears; -proto$2.valueOf = valueOf$1; -proto$2._bubble = bubble; -proto$2.clone = clone$1; -proto$2.get = get$2; -proto$2.milliseconds = milliseconds; -proto$2.seconds = seconds; -proto$2.minutes = minutes; -proto$2.hours = hours; -proto$2.days = days; -proto$2.weeks = weeks; -proto$2.months = months; -proto$2.years = years; -proto$2.humanize = humanize; -proto$2.toISOString = toISOString$1; -proto$2.toString = toISOString$1; -proto$2.toJSON = toISOString$1; -proto$2.locale = locale; -proto$2.localeData = localeData; - -proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); -proto$2.lang = lang; - -// Side effect imports - -// FORMATTING - -addFormatToken('X', 0, 0, 'unix'); -addFormatToken('x', 0, 0, 'valueOf'); - -// PARSING - -addRegexToken('x', matchSigned); -addRegexToken('X', matchTimestamp); -addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); -}); -addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); -}); - -// Side effect imports - - -hooks.version = '2.21.0'; - -setHookCallback(createLocal); - -hooks.fn = proto; -hooks.min = min; -hooks.max = max; -hooks.now = now; -hooks.utc = createUTC; -hooks.unix = createUnix; -hooks.months = listMonths; -hooks.isDate = isDate; -hooks.locale = getSetGlobalLocale; -hooks.invalid = createInvalid; -hooks.duration = createDuration; -hooks.isMoment = isMoment; -hooks.weekdays = listWeekdays; -hooks.parseZone = createInZone; -hooks.localeData = getLocale; -hooks.isDuration = isDuration; -hooks.monthsShort = listMonthsShort; -hooks.weekdaysMin = listWeekdaysMin; -hooks.defineLocale = defineLocale; -hooks.updateLocale = updateLocale; -hooks.locales = listLocales; -hooks.weekdaysShort = listWeekdaysShort; -hooks.normalizeUnits = normalizeUnits; -hooks.relativeTimeRounding = getSetRelativeTimeRounding; -hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; -hooks.calendarFormat = getCalendarFormat; -hooks.prototype = proto; - -// currently HTML5 input type only supports 24-hour formats -hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'YYYY-[W]WW', // - MONTH: 'YYYY-MM' // -}; - -return hooks; + return hooks; }))); @@ -34593,7 +34593,7 @@ if (typeof jQuery === 'undefined') { /**! * @fileOverview Kickass library to create and place poppers near their reference elements. - * @version 1.14.1 + * @version 1.14.3 * @license * Copyright (c) 2016 Federico Zivolo and contributors * @@ -34622,6 +34622,7 @@ if (typeof jQuery === 'undefined') { }(this, (function () { 'use strict'; var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; + var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; var timeoutDuration = 0; for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { @@ -34748,40 +34749,25 @@ function getScrollParent(element) { return getScrollParent(getParentNode(element)); } +var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); +var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); + /** - * Tells if you are running Internet Explorer + * Determines if the browser is Internet Explorer * @method * @memberof Popper.Utils - * @argument {number} version to check + * @param {Number} version to check * @returns {Boolean} isIE */ -var cache = {}; - -var isIE = function () { - var version = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all'; - - version = version.toString(); - if (cache.hasOwnProperty(version)) { - return cache[version]; +function isIE(version) { + if (version === 11) { + return isIE11; } - switch (version) { - case '11': - cache[version] = navigator.userAgent.indexOf('Trident') !== -1; - break; - case '10': - cache[version] = navigator.appVersion.indexOf('MSIE 10') !== -1; - break; - case 'all': - cache[version] = navigator.userAgent.indexOf('Trident') !== -1 || navigator.userAgent.indexOf('MSIE') !== -1; - break; + if (version === 10) { + return isIE10; } - - //Set IE - cache.all = cache.all || Object.keys(cache).some(function (key) { - return cache[key]; - }); - return cache[version]; -}; + return isIE11 || isIE10; +} /** * Returns the offset parent of the given element @@ -35534,6 +35520,7 @@ function update() { // compute the popper offsets data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); + data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; // run the modifiers @@ -35839,11 +35826,13 @@ function computeStyle(data, options) { position: popper.position }; - // floor sides to avoid blurry text + // Avoid blurry text by using full pixel integers. + // For pixel-perfect positioning, top/bottom prefers rounded + // values, while left/right prefers floored values. var offsets = { left: Math.floor(popper.left), - top: Math.floor(popper.top), - bottom: Math.floor(popper.bottom), + top: Math.round(popper.top), + bottom: Math.round(popper.bottom), right: Math.floor(popper.right) }; @@ -36399,7 +36388,27 @@ function preventOverflow(data, options) { boundariesElement = getOffsetParent(boundariesElement); } + // NOTE: DOM access here + // resets the popper's position so that the document size can be calculated excluding + // the size of the popper element itself + var transformProp = getSupportedPropertyName('transform'); + var popperStyles = data.instance.popper.style; // assignment to help minification + var top = popperStyles.top, + left = popperStyles.left, + transform = popperStyles[transformProp]; + + popperStyles.top = ''; + popperStyles.left = ''; + popperStyles[transformProp] = ''; + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); + + // NOTE: DOM access here + // restores the original style properties after the offsets have been computed + popperStyles.top = top; + popperStyles.left = left; + popperStyles[transformProp] = transform; + options.boundaries = boundaries; var order = options.priority; @@ -37113,7 +37122,7 @@ return Popper; /**! * @fileOverview Kickass library to create and place poppers near their reference elements. - * @version 1.14.1 + * @version 1.14.3 * @license * Copyright (c) 2016 Federico Zivolo and contributors * @@ -37206,40 +37215,27 @@ function getScrollParent(element) { return getScrollParent(getParentNode(element)); } +var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; + +var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); +var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); + /** - * Tells if you are running Internet Explorer + * Determines if the browser is Internet Explorer * @method * @memberof Popper.Utils - * @argument {number} version to check + * @param {Number} version to check * @returns {Boolean} isIE */ -var cache = {}; - -var isIE = function () { - var version = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all'; - - version = version.toString(); - if (cache.hasOwnProperty(version)) { - return cache[version]; +function isIE(version) { + if (version === 11) { + return isIE11; } - switch (version) { - case '11': - cache[version] = navigator.userAgent.indexOf('Trident') !== -1; - break; - case '10': - cache[version] = navigator.appVersion.indexOf('MSIE 10') !== -1; - break; - case 'all': - cache[version] = navigator.userAgent.indexOf('Trident') !== -1 || navigator.userAgent.indexOf('MSIE') !== -1; - break; + if (version === 10) { + return isIE10; } - - //Set IE - cache.all = cache.all || Object.keys(cache).some(function (key) { - return cache[key]; - }); - return cache[version]; -}; + return isIE11 || isIE10; +} /** * Returns the offset parent of the given element @@ -37748,7 +37744,6 @@ function computeAutoPlacement(placement, refRect, popper, reference, boundariesE return computedPlacement + (variation ? '-' + variation : ''); } -var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; var timeoutDuration = 0; for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { diff --git a/public/assets/frontend/css/now-ui-kit.css b/public/assets/frontend/css/now-ui-kit.css index a253d6c9..1472f1af 100644 --- a/public/assets/frontend/css/now-ui-kit.css +++ b/public/assets/frontend/css/now-ui-kit.css @@ -1,28 +1,28 @@ -/*! - - ========================================================= - * Now-ui-kit - v1.0.0 - ========================================================= - - * Product Page: http://www.creative-tim.com/product/now-ui-kit - * Copyright 2017 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) - - * Designed by www.invisionapp.com Coded by www.creative-tim.com - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +/*! + + ========================================================= + * Now-ui-kit - v1.0.0 + ========================================================= + + * Product Page: http://www.creative-tim.com/product/now-ui-kit + * Copyright 2017 Creative Tim (http://www.creative-tim.com) + * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + */ /* brand Colors */ /* light colors */ -/* ======================================================================== - * bootstrap-switch - v3.3.2 - * http://www.bootstrap-switch.org - * ======================================================================== - * Copyright 2012-2013 Mattia Larentis - * http://www.apache.org/licenses/LICENSE-2.0 +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * http://www.apache.org/licenses/LICENSE-2.0 */ .bootstrap-switch { display: inline-block; @@ -293,14 +293,14 @@ } /*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */ -/* Functional styling; - * These styles are required for noUiSlider to function. - * You don't need to change these rules to apply your design. +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. */ .noUi-target, .noUi-target * { -webkit-touch-callout: none; - -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-user-select: none; -ms-touch-action: none; touch-action: none; @@ -353,8 +353,8 @@ cursor: inherit !important; } -/* Painting and performance; - * Browsers can paint handles in their own layer. +/* Painting and performance; + * Browsers can paint handles in their own layer. */ .noUi-base, .noUi-handle { @@ -362,7 +362,7 @@ transform: translate3d(0, 0, 0); } -/* Slider size and handle placement; +/* Slider size and handle placement; */ .noUi-horizontal { height: 1px; @@ -391,7 +391,7 @@ top: -17px; } -/* Styling; +/* Styling; */ .noUi-target { background-color: rgba(182, 182, 182, 0.3); @@ -405,7 +405,7 @@ transition: background 450ms; } -/* Handles and cursors; +/* Handles and cursors; */ .noUi-draggable { cursor: ew-resize; @@ -419,8 +419,8 @@ border-radius: 3px; background: #FFF; cursor: default; - -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; - box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; -webkit-transition: 300ms ease 0s; -moz-transition: 300ms ease 0s; -ms-transition: 300ms ease 0s; @@ -433,7 +433,7 @@ transform: scale3d(1.5, 1.5, 1); } -/* Disabled state; +/* Disabled state; */ [disabled] .noUi-connect { background: #B8B8B8; @@ -445,8 +445,8 @@ cursor: not-allowed; } -/* Base; - * +/* Base; + * */ .noUi-pips, .noUi-pips * { @@ -459,8 +459,8 @@ color: #999; } -/* Values; - * +/* Values; + * */ .noUi-value { position: absolute; @@ -472,8 +472,8 @@ font-size: 10px; } -/* Markings; - * +/* Markings; + * */ .noUi-marker { position: absolute; @@ -488,8 +488,8 @@ background: #AAA; } -/* Horizontal layout; - * +/* Horizontal layout; + * */ .noUi-pips-horizontal { padding: 10px 0; @@ -518,8 +518,8 @@ height: 15px; } -/* Vertical layout; - * +/* Vertical layout; + * */ .noUi-pips-vertical { padding: 0 10px; @@ -645,10 +645,10 @@ background-color: #FF3636; } -/*! - * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) +/*! + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ .datepicker { padding: 8px 6px; @@ -2089,7 +2089,7 @@ fieldset[disabled] .form-group .form-control, .input-group .form-control { - margin-top: 2px; + /*margin-top: 2px;*/ padding: 4px 14px 4px 14px; } @@ -2198,17 +2198,17 @@ fieldset[disabled] background-color: #E3E3E3; } -/*.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-right: 0 none; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-left: 0 none; +/*.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-left: 0 none; }*/ .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #E3E3E3; @@ -3755,12 +3755,12 @@ img { box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); } -/* -------------------------------- - -Nucleo Outline Web Font - nucleoapp.com/ -License - nucleoapp.com/license/ -Created using IcoMoon - icomoon.io - +/* -------------------------------- + +Nucleo Outline Web Font - nucleoapp.com/ +License - nucleoapp.com/license/ +Created using IcoMoon - icomoon.io + -------------------------------- */ @font-face { font-family: 'Nucleo Outline'; @@ -3770,8 +3770,8 @@ Created using IcoMoon - icomoon.io font-style: normal; } -/*------------------------ - base class definition +/*------------------------ + base class definition -------------------------*/ .now-ui-icons { display: inline-block; @@ -3784,11 +3784,11 @@ Created using IcoMoon - icomoon.io -moz-osx-font-smoothing: grayscale; } -/*------------------------ - change icon size +/*------------------------ + change icon size -------------------------*/ -/*---------------------------------- - add a square/circle background +/*---------------------------------- + add a square/circle background -----------------------------------*/ .now-ui-icons.circle { padding: 0.33333333em; @@ -3800,8 +3800,8 @@ Created using IcoMoon - icomoon.io border-radius: 50%; } -/*------------------------ - list icons +/*------------------------ + list icons -------------------------*/ .nc-icon-ul { padding-left: 0; @@ -3825,8 +3825,8 @@ Created using IcoMoon - icomoon.io left: -1.9047619em; } -/*------------------------ - spinning icons +/*------------------------ + spinning icons -------------------------*/ .now-ui-icons.spin { -webkit-animation: nc-icon-spin 2s infinite linear; @@ -3853,11 +3853,11 @@ Created using IcoMoon - icomoon.io } } -/*------------------------ - rotated/flipped icons +/*------------------------ + rotated/flipped icons -------------------------*/ -/*------------------------ - font icons +/*------------------------ + font icons -------------------------*/ .now-ui-icons.ui-1_check:before { content: "\EA22"; @@ -5668,21 +5668,21 @@ Created using IcoMoon - icomoon.io } } -/*.separator{ - content: "Separator"; - color: #FFFFFF; - display: block; - width: 100%; - padding: 20px; -} -.separator-line{ - background-color: #EEE; - height: 1px; - width: 100%; - display: block; -} -.separator.separator-gray{ - background-color: #EEEEEE; +/*.separator{ + content: "Separator"; + color: #FFFFFF; + display: block; + width: 100%; + padding: 20px; +} +.separator-line{ + background-color: #EEE; + height: 1px; + width: 100%; + display: block; +} +.separator.separator-gray{ + background-color: #EEEEEE; }*/ .social-buttons-demo .btn { margin-right: 5px; diff --git a/public/assets/frontend/js/app.js b/public/assets/frontend/js/app.js index dda367f4..622b638f 100644 --- a/public/assets/frontend/js/app.js +++ b/public/assets/frontend/js/app.js @@ -69,7 +69,7 @@ /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\n// This file is part of Leaflet.Geodesic.\n// Copyright (C) 2017 Henry Thasler\n// based on code by Chris Veness Copyright (C) 2014 https://github.com/chrisveness/geodesy\n//\n// Leaflet.Geodesic is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Leaflet.Geodesic is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Leaflet.Geodesic. If not, see .\n\n\n/** Extend Number object with method to convert numeric degrees to radians */\nif (typeof Number.prototype.toRadians === \"undefined\") {\n Number.prototype.toRadians = function() {\n return this * Math.PI / 180;\n };\n}\n\n/** Extend Number object with method to convert radians to numeric (signed) degrees */\nif (typeof Number.prototype.toDegrees === \"undefined\") {\n Number.prototype.toDegrees = function() {\n return this * 180 / Math.PI;\n };\n}\n\nvar INTERSECT_LNG = 179.999; // Lng used for intersection and wrap around on map edges\n\nL.Geodesic = L.Polyline.extend({\n options: {\n color: \"blue\",\n steps: 10,\n dash: 1,\n wrap: true\n },\n\n initialize: function(latlngs, options) {\n this.options = this._merge_options(this.options, options);\n this.options.dash = Math.max(1e-3, Math.min(1, parseFloat(this.options.dash) || 1));\n this.datum = {};\n this.datum.ellipsoid = {\n a: 6378137,\n b: 6356752.3142,\n f: 1 / 298.257223563\n }; // WGS-84\n this._latlngs = this._generate_Geodesic(latlngs);\n L.Polyline.prototype.initialize.call(this, this._latlngs, this.options);\n },\n\n setLatLngs: function(latlngs) {\n this._latlngs = this._generate_Geodesic(latlngs);\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Calculates some statistic values of current geodesic multipolyline\n * @returns (Object} Object with several properties (e.g. overall distance)\n */\n getStats: function() {\n let obj = {\n distance: 0,\n points: 0,\n polygons: this._latlngs.length\n }, poly, points;\n\n for (poly = 0; poly < this._latlngs.length; poly++) {\n obj.points += this._latlngs[poly].length;\n for (points = 0; points < (this._latlngs[poly].length - 1); points++) {\n obj.distance += this._vincenty_inverse(this._latlngs[poly][points],\n this._latlngs[poly][points + 1]).distance;\n }\n }\n return obj;\n },\n\n\n /**\n * Creates geodesic lines from geoJson. Replaces all current features of this instance.\n * Supports LineString, MultiLineString and Polygon\n * @param {Object} geojson - geosjon as object.\n */\n geoJson: function(geojson) {\n\n let normalized = L.GeoJSON.asFeature(geojson);\n let features = normalized.type === \"FeatureCollection\" ? normalized.features : [\n normalized\n ];\n this._latlngs = [];\n for (let feature of features) {\n let geometry = feature.type === \"Feature\" ? feature.geometry :\n feature,\n coords = geometry.coordinates;\n\n switch (geometry.type) {\n case \"LineString\":\n this._latlngs.push(this._generate_Geodesic([L.GeoJSON.coordsToLatLngs(\n coords, 0)]));\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n this._latlngs.push(this._generate_Geodesic(L.GeoJSON.coordsToLatLngs(\n coords, 1)));\n break;\n case \"Point\":\n case \"MultiPoint\":\n console.log(\"Dude, points can't be drawn as geodesic lines...\");\n break;\n default:\n console.log(\"Drawing \" + geometry.type +\n \" as a geodesic is not supported. Skipping...\");\n }\n }\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Creates a great circle. Replaces all current lines.\n * @param {Object} center - geographic position\n * @param {number} radius - radius of the circle in metres\n */\n createCircle: function(center, radius) {\n let polylineIndex = 0;\n let prev = {\n lat: 0,\n lng: 0,\n brg: 0\n };\n let step;\n\n this._latlngs = [];\n this._latlngs[polylineIndex] = [];\n\n let direct = this._vincenty_direct(L.latLng(center), 0, radius, this.options\n .wrap);\n prev = L.latLng(direct.lat, direct.lng);\n this._latlngs[polylineIndex].push(prev);\n for (step = 1; step <= this.options.steps;) {\n direct = this._vincenty_direct(L.latLng(center), 360 / this.options\n .steps * step, radius, this.options.wrap);\n let gp = L.latLng(direct.lat, direct.lng);\n if (Math.abs(gp.lng - prev.lng) > 180) {\n let inverse = this._vincenty_inverse(prev, gp);\n let sec = this._intersection(prev, inverse.initialBearing, {\n lat: -89,\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\n }, 0);\n if (sec) {\n this._latlngs[polylineIndex].push(L.latLng(sec.lat, sec.lng));\n polylineIndex++;\n this._latlngs[polylineIndex] = [];\n prev = L.latLng(sec.lat, -sec.lng);\n this._latlngs[polylineIndex].push(prev);\n } else {\n polylineIndex++;\n this._latlngs[polylineIndex] = [];\n this._latlngs[polylineIndex].push(gp);\n prev = gp;\n step++;\n }\n } else {\n this._latlngs[polylineIndex].push(gp);\n prev = gp;\n step++;\n }\n }\n\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\n },\n\n /**\n * Creates a geodesic Polyline from given coordinates\n * Note: dashed lines are under work\n * @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline\n * @returns (Object} An array of arrays of geographical points.\n */\n _generate_Geodesic: function(latlngs) {\n let _geo = [], _geocnt = 0;\n\n for (let poly = 0; poly < latlngs.length; poly++) {\n _geo[_geocnt] = [];\n let prev = L.latLng(latlngs[poly][0]);\n for (let points = 0; points < (latlngs[poly].length - 1); points++) {\n // use prev, so that wrapping behaves correctly\n let pointA = prev;\n let pointB = L.latLng(latlngs[poly][points + 1]);\n if (pointA.equals(pointB)) {\n continue;\n }\n let inverse = this._vincenty_inverse(pointA, pointB);\n _geo[_geocnt].push(prev);\n for (let s = 1; s <= this.options.steps;) {\n let distance = inverse.distance / this.options.steps;\n // dashed lines don't go the full distance between the points\n let dist_mult = s - 1 + this.options.dash;\n let direct = this._vincenty_direct(pointA, inverse.initialBearing, distance*dist_mult, this.options.wrap);\n let gp = L.latLng(direct.lat, direct.lng);\n if (Math.abs(gp.lng - prev.lng) > 180) {\n let sec = this._intersection(pointA, inverse.initialBearing, {\n lat: -89,\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\n }, 0);\n if (sec) {\n _geo[_geocnt].push(L.latLng(sec.lat, sec.lng));\n _geocnt++;\n _geo[_geocnt] = [];\n prev = L.latLng(sec.lat, -sec.lng);\n _geo[_geocnt].push(prev);\n } else {\n _geocnt++;\n _geo[_geocnt] = [];\n _geo[_geocnt].push(gp);\n prev = gp;\n s++;\n } \n } else {\n _geo[_geocnt].push(gp);\n // Dashed lines start a new line\n if (this.options.dash < 1){\n _geocnt++;\n // go full distance this time, to get starting point for next line\n let direct_full = this._vincenty_direct(pointA, inverse.initialBearing, distance*s, this.options.wrap);\n _geo[_geocnt] = [];\n prev = L.latLng(direct_full.lat, direct_full.lng);\n _geo[_geocnt].push(prev);\n }\n else prev = gp;\n s++;\n }\n }\n }\n _geocnt++;\n }\n return _geo;\n },\n\n /**\n * Vincenty direct calculation.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @private\n * @param {number} initialBearing - Initial bearing in degrees from north.\n * @param {number} distance - Distance along bearing in metres.\n * @returns (Object} Object including point (destination point), finalBearing.\n */\n\n _vincenty_direct: function(p1, initialBearing, distance, wrap) {\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var α1 = initialBearing.toRadians();\n var s = distance;\n\n var a = this.datum.ellipsoid.a,\n b = this.datum.ellipsoid.b,\n f = this.datum.ellipsoid.f;\n\n var sinα1 = Math.sin(α1);\n var cosα1 = Math.cos(α1);\n\n var tanU1 = (1 - f) * Math.tan(φ1),\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\n sinU1 = tanU1 * cosU1;\n var σ1 = Math.atan2(tanU1, cosα1);\n var sinα = cosU1 * sinα1;\n var cosSqα = 1 - sinα * sinα;\n var uSq = cosSqα * (a * a - b * b) / (b * b);\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\n uSq)));\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n\n var σ = s / (b * A),\n σʹ, iterations = 0;\n var sinσ, cosσ;\n var cos2σM;\n do {\n cos2σM = Math.cos(2 * σ1 + σ);\n sinσ = Math.sin(σ);\n cosσ = Math.cos(σ);\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\n cos2σM) -\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\n cos2σM)));\n σʹ = σ;\n σ = s / (b * A) + Δσ;\n } while (Math.abs(σ - σʹ) > 1e-12 && ++iterations);\n\n var x = sinU1 * sinσ - cosU1 * cosσ * cosα1;\n var φ2 = Math.atan2(sinU1 * cosσ + cosU1 * sinσ * cosα1, (1 - f) *\n Math.sqrt(sinα * sinα + x * x));\n var λ = Math.atan2(sinσ * sinα1, cosU1 * cosσ - sinU1 * sinσ * cosα1);\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\n var L = λ - (1 - C) * f * sinα *\n (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));\n\n var λ2;\n if (wrap) {\n λ2 = (λ1 + L + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180...+180\n } else {\n λ2 = (λ1 + L); // do not normalize\n }\n\n var revAz = Math.atan2(sinα, -x);\n\n return {\n lat: φ2.toDegrees(),\n lng: λ2.toDegrees(),\n finalBearing: revAz.toDegrees()\n };\n },\n\n /**\n * Vincenty inverse calculation.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @private\n * @param {LatLng} p1 - Latitude/longitude of start point.\n * @param {LatLng} p2 - Latitude/longitude of destination point.\n * @returns {Object} Object including distance, initialBearing, finalBearing.\n * @throws {Error} If formula failed to converge.\n */\n _vincenty_inverse: function(p1, p2) {\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var φ2 = p2.lat.toRadians(),\n λ2 = p2.lng.toRadians();\n\n var a = this.datum.ellipsoid.a,\n b = this.datum.ellipsoid.b,\n f = this.datum.ellipsoid.f;\n\n var L = λ2 - λ1;\n var tanU1 = (1 - f) * Math.tan(φ1),\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\n sinU1 = tanU1 * cosU1;\n var tanU2 = (1 - f) * Math.tan(φ2),\n cosU2 = 1 / Math.sqrt((1 + tanU2 * tanU2)),\n sinU2 = tanU2 * cosU2;\n\n var λ = L,\n λʹ, iterations = 0;\n var cosSqα, sinσ, cos2σM, cosσ, σ, sinλ, cosλ;\n do {\n sinλ = Math.sin(λ);\n cosλ = Math.cos(λ);\n var sinSqσ = (cosU2 * sinλ) * (cosU2 * sinλ) + (cosU1 * sinU2 -\n sinU1 * cosU2 * cosλ) * (cosU1 * sinU2 - sinU1 * cosU2 * cosλ);\n sinσ = Math.sqrt(sinSqσ);\n if (sinσ == 0) return 0; // co-incident points\n cosσ = sinU1 * sinU2 + cosU1 * cosU2 * cosλ;\n σ = Math.atan2(sinσ, cosσ);\n var sinα = cosU1 * cosU2 * sinλ / sinσ;\n cosSqα = 1 - sinα * sinα;\n cos2σM = cosσ - 2 * sinU1 * sinU2 / cosSqα;\n if (isNaN(cos2σM)) cos2σM = 0; // equatorial line: cosSqα=0 (§6)\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\n λʹ = λ;\n λ = L + (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-\n 1 + 2 * cos2σM * cos2σM)));\n } while (Math.abs(λ - λʹ) > 1e-12 && ++iterations < 100);\n if (iterations >= 100) {\n console.log(\"Formula failed to converge. Altering target position.\");\n return this._vincenty_inverse(p1, {\n lat: p2.lat,\n lng: p2.lng - 0.01\n });\n // throw new Error('Formula failed to converge');\n }\n\n var uSq = cosSqα * (a * a - b * b) / (b * b);\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\n uSq)));\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\n cos2σM) -\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\n cos2σM)));\n\n var s = b * A * (σ - Δσ);\n\n var fwdAz = Math.atan2(cosU2 * sinλ, cosU1 * sinU2 - sinU1 * cosU2 *\n cosλ);\n var revAz = Math.atan2(cosU1 * sinλ, -sinU1 * cosU2 + cosU1 * sinU2 *\n cosλ);\n\n s = Number(s.toFixed(3)); // round to 1mm precision\n return {\n distance: s,\n initialBearing: fwdAz.toDegrees(),\n finalBearing: revAz.toDegrees()\n };\n },\n\n\n /**\n * Returns the point of intersection of two paths defined by point and bearing.\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\n *\n * @param {LatLon} p1 - First point.\n * @param {number} brng1 - Initial bearing from first point.\n * @param {LatLon} p2 - Second point.\n * @param {number} brng2 - Initial bearing from second point.\n * @returns {Object} containing lat/lng information of intersection.\n *\n * @example\n * var p1 = LatLon(51.8853, 0.2545), brng1 = 108.55;\n * var p2 = LatLon(49.0034, 2.5735), brng2 = 32.44;\n * var pInt = LatLon.intersection(p1, brng1, p2, brng2); // pInt.toString(): 50.9078°N, 4.5084°E\n */\n _intersection: function(p1, brng1, p2, brng2) {\n // see http://williams.best.vwh.net/avform.htm#Intersection\n\n var φ1 = p1.lat.toRadians(),\n λ1 = p1.lng.toRadians();\n var φ2 = p2.lat.toRadians(),\n λ2 = p2.lng.toRadians();\n var θ13 = Number(brng1).toRadians(),\n θ23 = Number(brng2).toRadians();\n var Δφ = φ2 - φ1,\n Δλ = λ2 - λ1;\n\n var δ12 = 2 * Math.asin(Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ /\n 2)));\n if (δ12 == 0) return null;\n\n // initial/final bearings between points\n var θ1 = Math.acos((Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) /\n (Math.sin(δ12) * Math.cos(φ1)));\n if (isNaN(θ1)) θ1 = 0; // protect against rounding\n var θ2 = Math.acos((Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) /\n (Math.sin(δ12) * Math.cos(φ2)));\n var θ12, θ21;\n if (Math.sin(λ2 - λ1) > 0) {\n θ12 = θ1;\n θ21 = 2 * Math.PI - θ2;\n } else {\n θ12 = 2 * Math.PI - θ1;\n θ21 = θ2;\n }\n\n var α1 = (θ13 - θ12 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 2-1-3\n var α2 = (θ21 - θ23 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 1-2-3\n\n if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections\n if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection\n\n //α1 = Math.abs(α1);\n //α2 = Math.abs(α2);\n // ... Ed Williams takes abs of α1/α2, but seems to break calculation?\n\n var α3 = Math.acos(-Math.cos(α1) * Math.cos(α2) +\n Math.sin(α1) * Math.sin(α2) * Math.cos(δ12));\n var δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2),\n Math.cos(α2) + Math.cos(α1) * Math.cos(α3));\n var φ3 = Math.asin(Math.sin(φ1) * Math.cos(δ13) +\n Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13));\n var Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1),\n Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3));\n var λ3 = λ1 + Δλ13;\n λ3 = (λ3 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º\n\n return {\n lat: φ3.toDegrees(),\n lng: λ3.toDegrees()\n };\n },\n\n /**\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\n * @param obj1\n * @param obj2\n * @returns obj3 a new object based on obj1 and obj2\n */\n _merge_options: function(obj1, obj2) {\n let obj3 = {};\n for (let attrname in obj1) {\n obj3[attrname] = obj1[attrname];\n }\n for (let attrname in obj2) {\n obj3[attrname] = obj2[attrname];\n }\n return obj3;\n }\n});\n\nL.geodesic = function(latlngs, options) {\n return new L.Geodesic(latlngs, options);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzPzU3NGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0Esc0JBQXNCLDJDQUEyQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9MZWFmbGV0Lkdlb2Rlc2ljL0xlYWZsZXQuR2VvZGVzaWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgTGVhZmxldC5HZW9kZXNpYy5cbi8vIENvcHlyaWdodCAoQykgMjAxNyAgSGVucnkgVGhhc2xlclxuLy8gYmFzZWQgb24gY29kZSBieSBDaHJpcyBWZW5lc3MgQ29weXJpZ2h0IChDKSAyMDE0IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3ZlbmVzcy9nZW9kZXN5XG4vL1xuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3Jcbi8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggTGVhZmxldC5HZW9kZXNpYy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cblxuXG4vKiogRXh0ZW5kIE51bWJlciBvYmplY3Qgd2l0aCBtZXRob2QgdG8gY29udmVydCBudW1lcmljIGRlZ3JlZXMgdG8gcmFkaWFucyAqL1xuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzICogTWF0aC5QSSAvIDE4MDtcbiAgfTtcbn1cblxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgcmFkaWFucyB0byBudW1lcmljIChzaWduZWQpIGRlZ3JlZXMgKi9cbmlmICh0eXBlb2YgTnVtYmVyLnByb3RvdHlwZS50b0RlZ3JlZXMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgTnVtYmVyLnByb3RvdHlwZS50b0RlZ3JlZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcyAqIDE4MCAvIE1hdGguUEk7XG4gIH07XG59XG5cbnZhciBJTlRFUlNFQ1RfTE5HID0gMTc5Ljk5OTsgLy8gTG5nIHVzZWQgZm9yIGludGVyc2VjdGlvbiBhbmQgd3JhcCBhcm91bmQgb24gbWFwIGVkZ2VzXG5cbkwuR2VvZGVzaWMgPSBMLlBvbHlsaW5lLmV4dGVuZCh7XG4gIG9wdGlvbnM6IHtcbiAgICBjb2xvcjogXCJibHVlXCIsXG4gICAgc3RlcHM6IDEwLFxuICAgIGRhc2g6IDEsXG4gICAgd3JhcDogdHJ1ZVxuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLl9tZXJnZV9vcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLmRhc2ggPSBNYXRoLm1heCgxZS0zLCBNYXRoLm1pbigxLCBwYXJzZUZsb2F0KHRoaXMub3B0aW9ucy5kYXNoKSB8fCAxKSk7XG4gICAgdGhpcy5kYXR1bSA9IHt9O1xuICAgIHRoaXMuZGF0dW0uZWxsaXBzb2lkID0ge1xuICAgICAgICBhOiA2Mzc4MTM3LFxuICAgICAgICBiOiA2MzU2NzUyLjMxNDIsXG4gICAgICAgIGY6IDEgLyAyOTguMjU3MjIzNTYzXG4gICAgICB9OyAvLyBXR1MtODRcbiAgICB0aGlzLl9sYXRsbmdzID0gdGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMobGF0bG5ncyk7XG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MsIHRoaXMub3B0aW9ucyk7XG4gIH0sXG5cbiAgc2V0TGF0TG5nczogZnVuY3Rpb24obGF0bG5ncykge1xuICAgIHRoaXMuX2xhdGxuZ3MgPSB0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhsYXRsbmdzKTtcbiAgICBMLlBvbHlsaW5lLnByb3RvdHlwZS5zZXRMYXRMbmdzLmNhbGwodGhpcywgdGhpcy5fbGF0bG5ncyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgc29tZSBzdGF0aXN0aWMgdmFsdWVzIG9mIGN1cnJlbnQgZ2VvZGVzaWMgbXVsdGlwb2x5bGluZVxuICAgKiBAcmV0dXJucyAoT2JqZWN0fSBPYmplY3Qgd2l0aCBzZXZlcmFsIHByb3BlcnRpZXMgKGUuZy4gb3ZlcmFsbCBkaXN0YW5jZSlcbiAgICovXG4gIGdldFN0YXRzOiBmdW5jdGlvbigpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgcG9pbnRzOiAwLFxuICAgICAgICBwb2x5Z29uczogdGhpcy5fbGF0bG5ncy5sZW5ndGhcbiAgICAgIH0sIHBvbHksIHBvaW50cztcblxuICAgIGZvciAocG9seSA9IDA7IHBvbHkgPCB0aGlzLl9sYXRsbmdzLmxlbmd0aDsgcG9seSsrKSB7XG4gICAgICBvYmoucG9pbnRzICs9IHRoaXMuX2xhdGxuZ3NbcG9seV0ubGVuZ3RoO1xuICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAodGhpcy5fbGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcbiAgICAgICAgb2JqLmRpc3RhbmNlICs9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UodGhpcy5fbGF0bG5nc1twb2x5XVtwb2ludHNdLFxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pLmRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LFxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZ2VvZGVzaWMgbGluZXMgZnJvbSBnZW9Kc29uLiBSZXBsYWNlcyBhbGwgY3VycmVudCBmZWF0dXJlcyBvZiB0aGlzIGluc3RhbmNlLlxuICAgKiBTdXBwb3J0cyBMaW5lU3RyaW5nLCBNdWx0aUxpbmVTdHJpbmcgYW5kIFBvbHlnb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGdlb2pzb24gLSBnZW9zam9uIGFzIG9iamVjdC5cbiAgICovXG4gIGdlb0pzb246IGZ1bmN0aW9uKGdlb2pzb24pIHtcblxuICAgIGxldCBub3JtYWxpemVkID0gTC5HZW9KU09OLmFzRmVhdHVyZShnZW9qc29uKTtcbiAgICBsZXQgZmVhdHVyZXMgPSBub3JtYWxpemVkLnR5cGUgPT09IFwiRmVhdHVyZUNvbGxlY3Rpb25cIiA/IG5vcm1hbGl6ZWQuZmVhdHVyZXMgOiBbXG4gICAgICBub3JtYWxpemVkXG4gICAgXTtcbiAgICB0aGlzLl9sYXRsbmdzID0gW107XG4gICAgZm9yIChsZXQgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSBcIkZlYXR1cmVcIiA/IGZlYXR1cmUuZ2VvbWV0cnkgOlxuICAgICAgICBmZWF0dXJlLFxuICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcblxuICAgICAgc3dpdGNoIChnZW9tZXRyeS50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XG4gICAgICAgICAgdGhpcy5fbGF0bG5ncy5wdXNoKHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKFtMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxuICAgICAgICAgICAgY29vcmRzLCAwKV0pKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwiUG9seWdvblwiOlxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3MucHVzaCh0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxuICAgICAgICAgICAgY29vcmRzLCAxKSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcbiAgICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkR1ZGUsIHBvaW50cyBjYW4ndCBiZSBkcmF3biBhcyBnZW9kZXNpYyBsaW5lcy4uLlwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRyYXdpbmcgXCIgKyBnZW9tZXRyeS50eXBlICtcbiAgICAgICAgICAgIFwiIGFzIGEgZ2VvZGVzaWMgaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcuLi5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGdyZWF0IGNpcmNsZS4gUmVwbGFjZXMgYWxsIGN1cnJlbnQgbGluZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZW50ZXIgLSBnZW9ncmFwaGljIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSByYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiBtZXRyZXNcbiAgICovXG4gIGNyZWF0ZUNpcmNsZTogZnVuY3Rpb24oY2VudGVyLCByYWRpdXMpIHtcbiAgICBsZXQgcG9seWxpbmVJbmRleCA9IDA7XG4gICAgbGV0IHByZXYgPSB7XG4gICAgICBsYXQ6IDAsXG4gICAgICBsbmc6IDAsXG4gICAgICBicmc6IDBcbiAgICB9O1xuICAgIGxldCBzdGVwO1xuXG4gICAgdGhpcy5fbGF0bG5ncyA9IFtdO1xuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcblxuICAgIGxldCBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcoY2VudGVyKSwgMCwgcmFkaXVzLCB0aGlzLm9wdGlvbnNcbiAgICAgIC53cmFwKTtcbiAgICBwcmV2ID0gTC5sYXRMbmcoZGlyZWN0LmxhdCwgZGlyZWN0LmxuZyk7XG4gICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XS5wdXNoKHByZXYpO1xuICAgIGZvciAoc3RlcCA9IDE7IHN0ZXAgPD0gdGhpcy5vcHRpb25zLnN0ZXBzOykge1xuICAgICAgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KEwubGF0TG5nKGNlbnRlciksIDM2MCAvIHRoaXMub3B0aW9uc1xuICAgICAgICAuc3RlcHMgKiBzdGVwLCByYWRpdXMsIHRoaXMub3B0aW9ucy53cmFwKTtcbiAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xuICAgICAgaWYgKE1hdGguYWJzKGdwLmxuZyAtIHByZXYubG5nKSA+IDE4MCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocHJldiwgZ3ApO1xuICAgICAgICBsZXQgc2VjID0gdGhpcy5faW50ZXJzZWN0aW9uKHByZXYsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcbiAgICAgICAgICBsYXQ6IC04OSxcbiAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIGlmIChzZWMpIHtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdID0gW107XG4gICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2gocHJldik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcG9seWxpbmVJbmRleCsrO1xuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2goZ3ApO1xuICAgICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgICBzdGVwKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XG4gICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgc3RlcCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGdlb2Rlc2ljIFBvbHlsaW5lIGZyb20gZ2l2ZW4gY29vcmRpbmF0ZXNcbiAgICogTm90ZTogZGFzaGVkIGxpbmVzIGFyZSB1bmRlciB3b3JrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRsbmdzIC0gT25lIG9yIG1vcmUgcG9seWxpbmVzIGFzIGFuIGFycmF5LiBTZWUgTGVhZmxldCBkb2MgYWJvdXQgUG9seWxpbmVcbiAgICogQHJldHVybnMgKE9iamVjdH0gQW4gYXJyYXkgb2YgYXJyYXlzIG9mIGdlb2dyYXBoaWNhbCBwb2ludHMuXG4gICAqL1xuICBfZ2VuZXJhdGVfR2VvZGVzaWM6IGZ1bmN0aW9uKGxhdGxuZ3MpIHtcbiAgICBsZXQgX2dlbyA9IFtdLCBfZ2VvY250ID0gMDtcblxuICAgIGZvciAobGV0IHBvbHkgPSAwOyBwb2x5IDwgbGF0bG5ncy5sZW5ndGg7IHBvbHkrKykge1xuICAgICAgX2dlb1tfZ2VvY250XSA9IFtdO1xuICAgICAgbGV0IHByZXYgPSBMLmxhdExuZyhsYXRsbmdzW3BvbHldWzBdKTtcbiAgICAgIGZvciAobGV0IHBvaW50cyA9IDA7IHBvaW50cyA8IChsYXRsbmdzW3BvbHldLmxlbmd0aCAtIDEpOyBwb2ludHMrKykge1xuICAgICAgICAvLyB1c2UgcHJldiwgc28gdGhhdCB3cmFwcGluZyBiZWhhdmVzIGNvcnJlY3RseVxuICAgICAgICBsZXQgcG9pbnRBID0gcHJldjtcbiAgICAgICAgbGV0IHBvaW50QiA9IEwubGF0TG5nKGxhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pO1xuICAgICAgICBpZiAocG9pbnRBLmVxdWFscyhwb2ludEIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHBvaW50QSwgcG9pbnRCKTtcbiAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKHByZXYpO1xuICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XG4gICAgICAgICAgbGV0IGRpc3RhbmNlID0gaW52ZXJzZS5kaXN0YW5jZSAvIHRoaXMub3B0aW9ucy5zdGVwcztcbiAgICAgICAgICAvLyBkYXNoZWQgbGluZXMgZG9uJ3QgZ28gdGhlIGZ1bGwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnRzXG4gICAgICAgICAgbGV0IGRpc3RfbXVsdCA9IHMgLSAxICsgdGhpcy5vcHRpb25zLmRhc2g7XG4gICAgICAgICAgbGV0IGRpcmVjdCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKmRpc3RfbXVsdCwgdGhpcy5vcHRpb25zLndyYXApO1xuICAgICAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhncC5sbmcgLSBwcmV2LmxuZykgPiAxODApIHtcbiAgICAgICAgICAgIGxldCBzZWMgPSB0aGlzLl9pbnRlcnNlY3Rpb24ocG9pbnRBLCBpbnZlcnNlLmluaXRpYWxCZWFyaW5nLCB7XG4gICAgICAgICAgICAgIGxhdDogLTg5LFxuICAgICAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgaWYgKHNlYykge1xuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xuICAgICAgICAgICAgICBfZ2VvY250Kys7XG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcbiAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcbiAgICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKHByZXYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX2dlb2NudCsrO1xuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChncCk7XG4gICAgICAgICAgICAgIHByZXYgPSBncDtcbiAgICAgICAgICAgICAgcysrO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChncCk7XG4gICAgICAgICAgICAvLyBEYXNoZWQgbGluZXMgc3RhcnQgYSBuZXcgbGluZVxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXNoIDwgMSl7XG4gICAgICAgICAgICAgICAgX2dlb2NudCsrO1xuICAgICAgICAgICAgICAgIC8vIGdvIGZ1bGwgZGlzdGFuY2UgdGhpcyB0aW1lLCB0byBnZXQgc3RhcnRpbmcgcG9pbnQgZm9yIG5leHQgbGluZVxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3RfZnVsbCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKnMsIHRoaXMub3B0aW9ucy53cmFwKTtcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XG4gICAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKGRpcmVjdF9mdWxsLmxhdCwgZGlyZWN0X2Z1bGwubG5nKTtcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHByZXYgPSBncDtcbiAgICAgICAgICAgIHMrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9nZW9jbnQrKztcbiAgICB9XG4gICAgcmV0dXJuIF9nZW87XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpbmNlbnR5IGRpcmVjdCBjYWxjdWxhdGlvbi5cbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluaXRpYWxCZWFyaW5nIC0gSW5pdGlhbCBiZWFyaW5nIGluIGRlZ3JlZXMgZnJvbSBub3J0aC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gRGlzdGFuY2UgYWxvbmcgYmVhcmluZyBpbiBtZXRyZXMuXG4gICAqIEByZXR1cm5zIChPYmplY3R9IE9iamVjdCBpbmNsdWRpbmcgcG9pbnQgKGRlc3RpbmF0aW9uIHBvaW50KSwgZmluYWxCZWFyaW5nLlxuICAgKi9cblxuICBfdmluY2VudHlfZGlyZWN0OiBmdW5jdGlvbihwMSwgaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlLCB3cmFwKSB7XG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgzrExID0gaW5pdGlhbEJlYXJpbmcudG9SYWRpYW5zKCk7XG4gICAgdmFyIHMgPSBkaXN0YW5jZTtcblxuICAgIHZhciBhID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYSxcbiAgICAgIGIgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5iLFxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XG5cbiAgICB2YXIgc2luzrExID0gTWF0aC5zaW4ozrExKTtcbiAgICB2YXIgY29zzrExID0gTWF0aC5jb3MozrExKTtcblxuICAgIHZhciB0YW5VMSA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjEpLFxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxuICAgICAgc2luVTEgPSB0YW5VMSAqIGNvc1UxO1xuICAgIHZhciDPgzEgPSBNYXRoLmF0YW4yKHRhblUxLCBjb3POsTEpO1xuICAgIHZhciBzaW7OsSA9IGNvc1UxICogc2luzrExO1xuICAgIHZhciBjb3NTcc6xID0gMSAtIHNpbs6xICogc2luzrE7XG4gICAgdmFyIHVTcSA9IGNvc1NxzrEgKiAoYSAqIGEgLSBiICogYikgLyAoYiAqIGIpO1xuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxuICAgICAgdVNxKSkpO1xuICAgIHZhciBCID0gdVNxIC8gMTAyNCAqICgyNTYgKyB1U3EgKiAoLTEyOCArIHVTcSAqICg3NCAtIDQ3ICogdVNxKSkpO1xuXG4gICAgdmFyIM+DID0gcyAvIChiICogQSksXG4gICAgICDPg8q5LCBpdGVyYXRpb25zID0gMDtcbiAgICB2YXIgc2luz4MsIGNvc8+DO1xuICAgIHZhciBjb3Myz4NNO1xuICAgIGRvIHtcbiAgICAgIGNvczLPg00gPSBNYXRoLmNvcygyICogz4MxICsgz4MpO1xuICAgICAgc2luz4MgPSBNYXRoLnNpbijPgyk7XG4gICAgICBjb3PPgyA9IE1hdGguY29zKM+DKTtcbiAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcbiAgICAgICAgICBjb3Myz4NNKSAtXG4gICAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcbiAgICAgICAgICBjb3Myz4NNKSkpO1xuICAgICAgz4PKuSA9IM+DO1xuICAgICAgz4MgPSBzIC8gKGIgKiBBKSArIM6Uz4M7XG4gICAgfSB3aGlsZSAoTWF0aC5hYnMoz4MgLSDPg8q5KSA+IDFlLTEyICYmICsraXRlcmF0aW9ucyk7XG5cbiAgICB2YXIgeCA9IHNpblUxICogc2luz4MgLSBjb3NVMSAqIGNvc8+DICogY29zzrExO1xuICAgIHZhciDPhjIgPSBNYXRoLmF0YW4yKHNpblUxICogY29zz4MgKyBjb3NVMSAqIHNpbs+DICogY29zzrExLCAoMSAtIGYpICpcbiAgICAgIE1hdGguc3FydChzaW7OsSAqIHNpbs6xICsgeCAqIHgpKTtcbiAgICB2YXIgzrsgPSBNYXRoLmF0YW4yKHNpbs+DICogc2luzrExLCBjb3NVMSAqIGNvc8+DIC0gc2luVTEgKiBzaW7PgyAqIGNvc86xMSk7XG4gICAgdmFyIEMgPSBmIC8gMTYgKiBjb3NTcc6xICogKDQgKyBmICogKDQgLSAzICogY29zU3HOsSkpO1xuICAgIHZhciBMID0gzrsgLSAoMSAtIEMpICogZiAqIHNpbs6xICpcbiAgICAgICjPgyArIEMgKiBzaW7PgyAqIChjb3Myz4NNICsgQyAqIGNvc8+DICogKC0xICsgMiAqIGNvczLPg00gKiBjb3Myz4NNKSkpO1xuXG4gICAgdmFyIM67MjtcbiAgICBpZiAod3JhcCkge1xuICAgICAgzrsyID0gKM67MSArIEwgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gbm9ybWFsaXNlIHRvIC0xODAuLi4rMTgwXG4gICAgfSBlbHNlIHtcbiAgICAgIM67MiA9ICjOuzEgKyBMKTsgLy8gZG8gbm90IG5vcm1hbGl6ZVxuICAgIH1cblxuICAgIHZhciByZXZBeiA9IE1hdGguYXRhbjIoc2luzrEsIC14KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYXQ6IM+GMi50b0RlZ3JlZXMoKSxcbiAgICAgIGxuZzogzrsyLnRvRGVncmVlcygpLFxuICAgICAgZmluYWxCZWFyaW5nOiByZXZBei50b0RlZ3JlZXMoKVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZpbmNlbnR5IGludmVyc2UgY2FsY3VsYXRpb24uXG4gICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGF0TG5nfSBwMSAtIExhdGl0dWRlL2xvbmdpdHVkZSBvZiBzdGFydCBwb2ludC5cbiAgICogQHBhcmFtIHtMYXRMbmd9IHAyIC0gTGF0aXR1ZGUvbG9uZ2l0dWRlIG9mIGRlc3RpbmF0aW9uIHBvaW50LlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgaW5jbHVkaW5nIGRpc3RhbmNlLCBpbml0aWFsQmVhcmluZywgZmluYWxCZWFyaW5nLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZm9ybXVsYSBmYWlsZWQgdG8gY29udmVyZ2UuXG4gICAqL1xuICBfdmluY2VudHlfaW52ZXJzZTogZnVuY3Rpb24ocDEsIHAyKSB7XG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgz4YyID0gcDIubGF0LnRvUmFkaWFucygpLFxuICAgICAgzrsyID0gcDIubG5nLnRvUmFkaWFucygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxuICAgICAgYiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmIsXG4gICAgICBmID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuZjtcblxuICAgIHZhciBMID0gzrsyIC0gzrsxO1xuICAgIHZhciB0YW5VMSA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjEpLFxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxuICAgICAgc2luVTEgPSB0YW5VMSAqIGNvc1UxO1xuICAgIHZhciB0YW5VMiA9ICgxIC0gZikgKiBNYXRoLnRhbijPhjIpLFxuICAgICAgY29zVTIgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTIgKiB0YW5VMikpLFxuICAgICAgc2luVTIgPSB0YW5VMiAqIGNvc1UyO1xuXG4gICAgdmFyIM67ID0gTCxcbiAgICAgIM67yrksIGl0ZXJhdGlvbnMgPSAwO1xuICAgIHZhciBjb3NTcc6xLCBzaW7PgywgY29zMs+DTSwgY29zz4MsIM+DLCBzaW7OuywgY29zzrs7XG4gICAgZG8ge1xuICAgICAgc2luzrsgPSBNYXRoLnNpbijOuyk7XG4gICAgICBjb3POuyA9IE1hdGguY29zKM67KTtcbiAgICAgIHZhciBzaW5Tcc+DID0gKGNvc1UyICogc2luzrspICogKGNvc1UyICogc2luzrspICsgKGNvc1UxICogc2luVTIgLVxuICAgICAgICBzaW5VMSAqIGNvc1UyICogY29zzrspICogKGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICogY29zzrspO1xuICAgICAgc2luz4MgPSBNYXRoLnNxcnQoc2luU3HPgyk7XG4gICAgICBpZiAoc2luz4MgPT0gMCkgcmV0dXJuIDA7IC8vIGNvLWluY2lkZW50IHBvaW50c1xuICAgICAgY29zz4MgPSBzaW5VMSAqIHNpblUyICsgY29zVTEgKiBjb3NVMiAqIGNvc867O1xuICAgICAgz4MgPSBNYXRoLmF0YW4yKHNpbs+DLCBjb3PPgyk7XG4gICAgICB2YXIgc2luzrEgPSBjb3NVMSAqIGNvc1UyICogc2luzrsgLyBzaW7PgztcbiAgICAgIGNvc1NxzrEgPSAxIC0gc2luzrEgKiBzaW7OsTtcbiAgICAgIGNvczLPg00gPSBjb3PPgyAtIDIgKiBzaW5VMSAqIHNpblUyIC8gY29zU3HOsTtcbiAgICAgIGlmIChpc05hTihjb3Myz4NNKSkgY29zMs+DTSA9IDA7IC8vIGVxdWF0b3JpYWwgbGluZTogY29zU3HOsT0wICjCpzYpXG4gICAgICB2YXIgQyA9IGYgLyAxNiAqIGNvc1NxzrEgKiAoNCArIGYgKiAoNCAtIDMgKiBjb3NTcc6xKSk7XG4gICAgICDOu8q5ID0gzrs7XG4gICAgICDOuyA9IEwgKyAoMSAtIEMpICogZiAqIHNpbs6xICogKM+DICsgQyAqIHNpbs+DICogKGNvczLPg00gKyBDICogY29zz4MgKiAoLVxuICAgICAgICAxICsgMiAqIGNvczLPg00gKiBjb3Myz4NNKSkpO1xuICAgIH0gd2hpbGUgKE1hdGguYWJzKM67IC0gzrvKuSkgPiAxZS0xMiAmJiArK2l0ZXJhdGlvbnMgPCAxMDApO1xuICAgIGlmIChpdGVyYXRpb25zID49IDEwMCkge1xuICAgICAgY29uc29sZS5sb2coXCJGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZS4gQWx0ZXJpbmcgdGFyZ2V0IHBvc2l0aW9uLlwiKTtcbiAgICAgIHJldHVybiB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHAxLCB7XG4gICAgICAgICAgbGF0OiBwMi5sYXQsXG4gICAgICAgICAgbG5nOiBwMi5sbmcgLSAwLjAxXG4gICAgICAgIH0pO1xuICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZScpO1xuICAgIH1cblxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcbiAgICB2YXIgQSA9IDEgKyB1U3EgLyAxNjM4NCAqICg0MDk2ICsgdVNxICogKC03NjggKyB1U3EgKiAoMzIwIC0gMTc1ICpcbiAgICAgIHVTcSkpKTtcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcbiAgICB2YXIgzpTPgyA9IEIgKiBzaW7PgyAqIChjb3Myz4NNICsgQiAvIDQgKiAoY29zz4MgKiAoLTEgKyAyICogY29zMs+DTSAqXG4gICAgICAgIGNvczLPg00pIC1cbiAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcbiAgICAgICAgY29zMs+DTSkpKTtcblxuICAgIHZhciBzID0gYiAqIEEgKiAoz4MgLSDOlM+DKTtcblxuICAgIHZhciBmd2RBeiA9IE1hdGguYXRhbjIoY29zVTIgKiBzaW7OuywgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKlxuICAgICAgY29zzrspO1xuICAgIHZhciByZXZBeiA9IE1hdGguYXRhbjIoY29zVTEgKiBzaW7OuywgLXNpblUxICogY29zVTIgKyBjb3NVMSAqIHNpblUyICpcbiAgICAgIGNvc867KTtcblxuICAgIHMgPSBOdW1iZXIocy50b0ZpeGVkKDMpKTsgLy8gcm91bmQgdG8gMW1tIHByZWNpc2lvblxuICAgIHJldHVybiB7XG4gICAgICBkaXN0YW5jZTogcyxcbiAgICAgIGluaXRpYWxCZWFyaW5nOiBmd2RBei50b0RlZ3JlZXMoKSxcbiAgICAgIGZpbmFsQmVhcmluZzogcmV2QXoudG9EZWdyZWVzKClcbiAgICB9O1xuICB9LFxuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbiBvZiB0d28gcGF0aHMgZGVmaW5lZCBieSBwb2ludCBhbmQgYmVhcmluZy5cbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcbiAgICpcbiAgICogQHBhcmFtIHtMYXRMb259IHAxIC0gRmlyc3QgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMSAtIEluaXRpYWwgYmVhcmluZyBmcm9tIGZpcnN0IHBvaW50LlxuICAgKiBAcGFyYW0ge0xhdExvbn0gcDIgLSBTZWNvbmQgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMiAtIEluaXRpYWwgYmVhcmluZyBmcm9tIHNlY29uZCBwb2ludC5cbiAgICogQHJldHVybnMge09iamVjdH0gY29udGFpbmluZyBsYXQvbG5nIGluZm9ybWF0aW9uIG9mIGludGVyc2VjdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHAxID0gTGF0TG9uKDUxLjg4NTMsIDAuMjU0NSksIGJybmcxID0gMTA4LjU1O1xuICAgKiB2YXIgcDIgPSBMYXRMb24oNDkuMDAzNCwgMi41NzM1KSwgYnJuZzIgPSAzMi40NDtcbiAgICogdmFyIHBJbnQgPSBMYXRMb24uaW50ZXJzZWN0aW9uKHAxLCBicm5nMSwgcDIsIGJybmcyKTsgLy8gcEludC50b1N0cmluZygpOiA1MC45MDc4wrBOLCA0LjUwODTCsEVcbiAgICovXG4gIF9pbnRlcnNlY3Rpb246IGZ1bmN0aW9uKHAxLCBicm5nMSwgcDIsIGJybmcyKSB7XG4gICAgLy8gc2VlIGh0dHA6Ly93aWxsaWFtcy5iZXN0LnZ3aC5uZXQvYXZmb3JtLmh0bSNJbnRlcnNlY3Rpb25cblxuICAgIHZhciDPhjEgPSBwMS5sYXQudG9SYWRpYW5zKCksXG4gICAgICDOuzEgPSBwMS5sbmcudG9SYWRpYW5zKCk7XG4gICAgdmFyIM+GMiA9IHAyLmxhdC50b1JhZGlhbnMoKSxcbiAgICAgIM67MiA9IHAyLmxuZy50b1JhZGlhbnMoKTtcbiAgICB2YXIgzrgxMyA9IE51bWJlcihicm5nMSkudG9SYWRpYW5zKCksXG4gICAgICDOuDIzID0gTnVtYmVyKGJybmcyKS50b1JhZGlhbnMoKTtcbiAgICB2YXIgzpTPhiA9IM+GMiAtIM+GMSxcbiAgICAgIM6UzrsgPSDOuzIgLSDOuzE7XG5cbiAgICB2YXIgzrQxMiA9IDIgKiBNYXRoLmFzaW4oTWF0aC5zcXJ0KE1hdGguc2luKM6Uz4YgLyAyKSAqIE1hdGguc2luKM6Uz4YgLyAyKSArXG4gICAgICBNYXRoLmNvcyjPhjEpICogTWF0aC5jb3Moz4YyKSAqIE1hdGguc2luKM6UzrsgLyAyKSAqIE1hdGguc2luKM6UzrsgL1xuICAgICAgICAyKSkpO1xuICAgIGlmICjOtDEyID09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gaW5pdGlhbC9maW5hbCBiZWFyaW5ncyBiZXR3ZWVuIHBvaW50c1xuICAgIHZhciDOuDEgPSBNYXRoLmFjb3MoKE1hdGguc2luKM+GMikgLSBNYXRoLnNpbijPhjEpICogTWF0aC5jb3MozrQxMikpIC9cbiAgICAgIChNYXRoLnNpbijOtDEyKSAqIE1hdGguY29zKM+GMSkpKTtcbiAgICBpZiAoaXNOYU4ozrgxKSkgzrgxID0gMDsgLy8gcHJvdGVjdCBhZ2FpbnN0IHJvdW5kaW5nXG4gICAgdmFyIM64MiA9IE1hdGguYWNvcygoTWF0aC5zaW4oz4YxKSAtIE1hdGguc2luKM+GMikgKiBNYXRoLmNvcyjOtDEyKSkgL1xuICAgICAgKE1hdGguc2luKM60MTIpICogTWF0aC5jb3Moz4YyKSkpO1xuICAgIHZhciDOuDEyLCDOuDIxO1xuICAgIGlmIChNYXRoLnNpbijOuzIgLSDOuzEpID4gMCkge1xuICAgICAgzrgxMiA9IM64MTtcbiAgICAgIM64MjEgPSAyICogTWF0aC5QSSAtIM64MjtcbiAgICB9IGVsc2Uge1xuICAgICAgzrgxMiA9IDIgKiBNYXRoLlBJIC0gzrgxO1xuICAgICAgzrgyMSA9IM64MjtcbiAgICB9XG5cbiAgICB2YXIgzrExID0gKM64MTMgLSDOuDEyICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMi0xLTNcbiAgICB2YXIgzrEyID0gKM64MjEgLSDOuDIzICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMS0yLTNcblxuICAgIGlmIChNYXRoLnNpbijOsTEpID09IDAgJiYgTWF0aC5zaW4ozrEyKSA9PSAwKSByZXR1cm4gbnVsbDsgLy8gaW5maW5pdGUgaW50ZXJzZWN0aW9uc1xuICAgIGlmIChNYXRoLnNpbijOsTEpICogTWF0aC5zaW4ozrEyKSA8IDApIHJldHVybiBudWxsOyAvLyBhbWJpZ3VvdXMgaW50ZXJzZWN0aW9uXG5cbiAgICAvL86xMSA9IE1hdGguYWJzKM6xMSk7XG4gICAgLy/OsTIgPSBNYXRoLmFicyjOsTIpO1xuICAgIC8vIC4uLiBFZCBXaWxsaWFtcyB0YWtlcyBhYnMgb2YgzrExL86xMiwgYnV0IHNlZW1zIHRvIGJyZWFrIGNhbGN1bGF0aW9uP1xuXG4gICAgdmFyIM6xMyA9IE1hdGguYWNvcygtTWF0aC5jb3MozrExKSAqIE1hdGguY29zKM6xMikgK1xuICAgICAgTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMikgKiBNYXRoLmNvcyjOtDEyKSk7XG4gICAgdmFyIM60MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM60MTIpICogTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMiksXG4gICAgICBNYXRoLmNvcyjOsTIpICsgTWF0aC5jb3MozrExKSAqIE1hdGguY29zKM6xMykpO1xuICAgIHZhciDPhjMgPSBNYXRoLmFzaW4oTWF0aC5zaW4oz4YxKSAqIE1hdGguY29zKM60MTMpICtcbiAgICAgIE1hdGguY29zKM+GMSkgKiBNYXRoLnNpbijOtDEzKSAqIE1hdGguY29zKM64MTMpKTtcbiAgICB2YXIgzpTOuzEzID0gTWF0aC5hdGFuMihNYXRoLnNpbijOuDEzKSAqIE1hdGguc2luKM60MTMpICogTWF0aC5jb3Moz4YxKSxcbiAgICAgIE1hdGguY29zKM60MTMpIC0gTWF0aC5zaW4oz4YxKSAqIE1hdGguc2luKM+GMykpO1xuICAgIHZhciDOuzMgPSDOuzEgKyDOlM67MTM7XG4gICAgzrszID0gKM67MyArIDMgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBub3JtYWxpc2UgdG8gLTE4MC4uKzE4MMK6XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiDPhjMudG9EZWdyZWVzKCksXG4gICAgICBsbmc6IM67My50b0RlZ3JlZXMoKVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIE92ZXJ3cml0ZXMgb2JqMSdzIHZhbHVlcyB3aXRoIG9iajIncyBhbmQgYWRkcyBvYmoyJ3MgaWYgbm9uIGV4aXN0ZW50IGluIG9iajFcbiAgICogQHBhcmFtIG9iajFcbiAgICogQHBhcmFtIG9iajJcbiAgICogQHJldHVybnMgb2JqMyBhIG5ldyBvYmplY3QgYmFzZWQgb24gb2JqMSBhbmQgb2JqMlxuICAgKi9cbiAgX21lcmdlX29wdGlvbnM6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHtcbiAgICBsZXQgb2JqMyA9IHt9O1xuICAgIGZvciAobGV0IGF0dHJuYW1lIGluIG9iajEpIHtcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMVthdHRybmFtZV07XG4gICAgfVxuICAgIGZvciAobGV0IGF0dHJuYW1lIGluIG9iajIpIHtcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMlthdHRybmFtZV07XG4gICAgfVxuICAgIHJldHVybiBvYmozO1xuICB9XG59KTtcblxuTC5nZW9kZXNpYyA9IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBMLkdlb2Rlc2ljKGxhdGxuZ3MsIG9wdGlvbnMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0xlYWZsZXQuR2VvZGVzaWMvTGVhZmxldC5HZW9kZXNpYy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\n"); +eval("\r\n\r\n// This file is part of Leaflet.Geodesic.\r\n// Copyright (C) 2017 Henry Thasler\r\n// based on code by Chris Veness Copyright (C) 2014 https://github.com/chrisveness/geodesy\r\n//\r\n// Leaflet.Geodesic is free software: you can redistribute it and/or modify\r\n// it under the terms of the GNU General Public License as published by\r\n// the Free Software Foundation, either version 3 of the License, or\r\n// (at your option) any later version.\r\n//\r\n// Leaflet.Geodesic is distributed in the hope that it will be useful,\r\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n// GNU General Public License for more details.\r\n//\r\n// You should have received a copy of the GNU General Public License\r\n// along with Leaflet.Geodesic. If not, see .\r\n\r\n\r\n/** Extend Number object with method to convert numeric degrees to radians */\r\nif (typeof Number.prototype.toRadians === \"undefined\") {\r\n Number.prototype.toRadians = function() {\r\n return this * Math.PI / 180;\r\n };\r\n}\r\n\r\n/** Extend Number object with method to convert radians to numeric (signed) degrees */\r\nif (typeof Number.prototype.toDegrees === \"undefined\") {\r\n Number.prototype.toDegrees = function() {\r\n return this * 180 / Math.PI;\r\n };\r\n}\r\n\r\nvar INTERSECT_LNG = 179.999; // Lng used for intersection and wrap around on map edges\r\n\r\nL.Geodesic = L.Polyline.extend({\r\n options: {\r\n color: \"blue\",\r\n steps: 10,\r\n dash: 1,\r\n wrap: true\r\n },\r\n\r\n initialize: function(latlngs, options) {\r\n this.options = this._merge_options(this.options, options);\r\n this.options.dash = Math.max(1e-3, Math.min(1, parseFloat(this.options.dash) || 1));\r\n this.datum = {};\r\n this.datum.ellipsoid = {\r\n a: 6378137,\r\n b: 6356752.3142,\r\n f: 1 / 298.257223563\r\n }; // WGS-84\r\n this._latlngs = this._generate_Geodesic(latlngs);\r\n L.Polyline.prototype.initialize.call(this, this._latlngs, this.options);\r\n },\r\n\r\n setLatLngs: function(latlngs) {\r\n this._latlngs = this._generate_Geodesic(latlngs);\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Calculates some statistic values of current geodesic multipolyline\r\n * @returns (Object} Object with several properties (e.g. overall distance)\r\n */\r\n getStats: function() {\r\n let obj = {\r\n distance: 0,\r\n points: 0,\r\n polygons: this._latlngs.length\r\n }, poly, points;\r\n\r\n for (poly = 0; poly < this._latlngs.length; poly++) {\r\n obj.points += this._latlngs[poly].length;\r\n for (points = 0; points < (this._latlngs[poly].length - 1); points++) {\r\n obj.distance += this._vincenty_inverse(this._latlngs[poly][points],\r\n this._latlngs[poly][points + 1]).distance;\r\n }\r\n }\r\n return obj;\r\n },\r\n\r\n\r\n /**\r\n * Creates geodesic lines from geoJson. Replaces all current features of this instance.\r\n * Supports LineString, MultiLineString and Polygon\r\n * @param {Object} geojson - geosjon as object.\r\n */\r\n geoJson: function(geojson) {\r\n\r\n let normalized = L.GeoJSON.asFeature(geojson);\r\n let features = normalized.type === \"FeatureCollection\" ? normalized.features : [\r\n normalized\r\n ];\r\n this._latlngs = [];\r\n for (let feature of features) {\r\n let geometry = feature.type === \"Feature\" ? feature.geometry :\r\n feature,\r\n coords = geometry.coordinates;\r\n\r\n switch (geometry.type) {\r\n case \"LineString\":\r\n this._latlngs.push(this._generate_Geodesic([L.GeoJSON.coordsToLatLngs(\r\n coords, 0)]));\r\n break;\r\n case \"MultiLineString\":\r\n case \"Polygon\":\r\n this._latlngs.push(this._generate_Geodesic(L.GeoJSON.coordsToLatLngs(\r\n coords, 1)));\r\n break;\r\n case \"Point\":\r\n case \"MultiPoint\":\r\n console.log(\"Dude, points can't be drawn as geodesic lines...\");\r\n break;\r\n default:\r\n console.log(\"Drawing \" + geometry.type +\r\n \" as a geodesic is not supported. Skipping...\");\r\n }\r\n }\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Creates a great circle. Replaces all current lines.\r\n * @param {Object} center - geographic position\r\n * @param {number} radius - radius of the circle in metres\r\n */\r\n createCircle: function(center, radius) {\r\n let polylineIndex = 0;\r\n let prev = {\r\n lat: 0,\r\n lng: 0,\r\n brg: 0\r\n };\r\n let step;\r\n\r\n this._latlngs = [];\r\n this._latlngs[polylineIndex] = [];\r\n\r\n let direct = this._vincenty_direct(L.latLng(center), 0, radius, this.options\r\n .wrap);\r\n prev = L.latLng(direct.lat, direct.lng);\r\n this._latlngs[polylineIndex].push(prev);\r\n for (step = 1; step <= this.options.steps;) {\r\n direct = this._vincenty_direct(L.latLng(center), 360 / this.options\r\n .steps * step, radius, this.options.wrap);\r\n let gp = L.latLng(direct.lat, direct.lng);\r\n if (Math.abs(gp.lng - prev.lng) > 180) {\r\n let inverse = this._vincenty_inverse(prev, gp);\r\n let sec = this._intersection(prev, inverse.initialBearing, {\r\n lat: -89,\r\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\r\n }, 0);\r\n if (sec) {\r\n this._latlngs[polylineIndex].push(L.latLng(sec.lat, sec.lng));\r\n polylineIndex++;\r\n this._latlngs[polylineIndex] = [];\r\n prev = L.latLng(sec.lat, -sec.lng);\r\n this._latlngs[polylineIndex].push(prev);\r\n } else {\r\n polylineIndex++;\r\n this._latlngs[polylineIndex] = [];\r\n this._latlngs[polylineIndex].push(gp);\r\n prev = gp;\r\n step++;\r\n }\r\n } else {\r\n this._latlngs[polylineIndex].push(gp);\r\n prev = gp;\r\n step++;\r\n }\r\n }\r\n\r\n L.Polyline.prototype.setLatLngs.call(this, this._latlngs);\r\n },\r\n\r\n /**\r\n * Creates a geodesic Polyline from given coordinates\r\n * Note: dashed lines are under work\r\n * @param {Object} latlngs - One or more polylines as an array. See Leaflet doc about Polyline\r\n * @returns (Object} An array of arrays of geographical points.\r\n */\r\n _generate_Geodesic: function(latlngs) {\r\n let _geo = [], _geocnt = 0;\r\n\r\n for (let poly = 0; poly < latlngs.length; poly++) {\r\n _geo[_geocnt] = [];\r\n let prev = L.latLng(latlngs[poly][0]);\r\n for (let points = 0; points < (latlngs[poly].length - 1); points++) {\r\n // use prev, so that wrapping behaves correctly\r\n let pointA = prev;\r\n let pointB = L.latLng(latlngs[poly][points + 1]);\r\n if (pointA.equals(pointB)) {\r\n continue;\r\n }\r\n let inverse = this._vincenty_inverse(pointA, pointB);\r\n _geo[_geocnt].push(prev);\r\n for (let s = 1; s <= this.options.steps;) {\r\n let distance = inverse.distance / this.options.steps;\r\n // dashed lines don't go the full distance between the points\r\n let dist_mult = s - 1 + this.options.dash;\r\n let direct = this._vincenty_direct(pointA, inverse.initialBearing, distance*dist_mult, this.options.wrap);\r\n let gp = L.latLng(direct.lat, direct.lng);\r\n if (Math.abs(gp.lng - prev.lng) > 180) {\r\n let sec = this._intersection(pointA, inverse.initialBearing, {\r\n lat: -89,\r\n lng: ((gp.lng - prev.lng) > 0) ? -INTERSECT_LNG : INTERSECT_LNG\r\n }, 0);\r\n if (sec) {\r\n _geo[_geocnt].push(L.latLng(sec.lat, sec.lng));\r\n _geocnt++;\r\n _geo[_geocnt] = [];\r\n prev = L.latLng(sec.lat, -sec.lng);\r\n _geo[_geocnt].push(prev);\r\n } else {\r\n _geocnt++;\r\n _geo[_geocnt] = [];\r\n _geo[_geocnt].push(gp);\r\n prev = gp;\r\n s++;\r\n } \r\n } else {\r\n _geo[_geocnt].push(gp);\r\n // Dashed lines start a new line\r\n if (this.options.dash < 1){\r\n _geocnt++;\r\n // go full distance this time, to get starting point for next line\r\n let direct_full = this._vincenty_direct(pointA, inverse.initialBearing, distance*s, this.options.wrap);\r\n _geo[_geocnt] = [];\r\n prev = L.latLng(direct_full.lat, direct_full.lng);\r\n _geo[_geocnt].push(prev);\r\n }\r\n else prev = gp;\r\n s++;\r\n }\r\n }\r\n }\r\n _geocnt++;\r\n }\r\n return _geo;\r\n },\r\n\r\n /**\r\n * Vincenty direct calculation.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @private\r\n * @param {number} initialBearing - Initial bearing in degrees from north.\r\n * @param {number} distance - Distance along bearing in metres.\r\n * @returns (Object} Object including point (destination point), finalBearing.\r\n */\r\n\r\n _vincenty_direct: function(p1, initialBearing, distance, wrap) {\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var α1 = initialBearing.toRadians();\r\n var s = distance;\r\n\r\n var a = this.datum.ellipsoid.a,\r\n b = this.datum.ellipsoid.b,\r\n f = this.datum.ellipsoid.f;\r\n\r\n var sinα1 = Math.sin(α1);\r\n var cosα1 = Math.cos(α1);\r\n\r\n var tanU1 = (1 - f) * Math.tan(φ1),\r\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\r\n sinU1 = tanU1 * cosU1;\r\n var σ1 = Math.atan2(tanU1, cosα1);\r\n var sinα = cosU1 * sinα1;\r\n var cosSqα = 1 - sinα * sinα;\r\n var uSq = cosSqα * (a * a - b * b) / (b * b);\r\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\r\n uSq)));\r\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\r\n\r\n var σ = s / (b * A),\r\n σʹ, iterations = 0;\r\n var sinσ, cosσ;\r\n var cos2σM;\r\n do {\r\n cos2σM = Math.cos(2 * σ1 + σ);\r\n sinσ = Math.sin(σ);\r\n cosσ = Math.cos(σ);\r\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\r\n cos2σM) -\r\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\r\n cos2σM)));\r\n σʹ = σ;\r\n σ = s / (b * A) + Δσ;\r\n } while (Math.abs(σ - σʹ) > 1e-12 && ++iterations);\r\n\r\n var x = sinU1 * sinσ - cosU1 * cosσ * cosα1;\r\n var φ2 = Math.atan2(sinU1 * cosσ + cosU1 * sinσ * cosα1, (1 - f) *\r\n Math.sqrt(sinα * sinα + x * x));\r\n var λ = Math.atan2(sinσ * sinα1, cosU1 * cosσ - sinU1 * sinσ * cosα1);\r\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\r\n var L = λ - (1 - C) * f * sinα *\r\n (σ + C * sinσ * (cos2σM + C * cosσ * (-1 + 2 * cos2σM * cos2σM)));\r\n\r\n var λ2;\r\n if (wrap) {\r\n λ2 = (λ1 + L + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180...+180\r\n } else {\r\n λ2 = (λ1 + L); // do not normalize\r\n }\r\n\r\n var revAz = Math.atan2(sinα, -x);\r\n\r\n return {\r\n lat: φ2.toDegrees(),\r\n lng: λ2.toDegrees(),\r\n finalBearing: revAz.toDegrees()\r\n };\r\n },\r\n\r\n /**\r\n * Vincenty inverse calculation.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @private\r\n * @param {LatLng} p1 - Latitude/longitude of start point.\r\n * @param {LatLng} p2 - Latitude/longitude of destination point.\r\n * @returns {Object} Object including distance, initialBearing, finalBearing.\r\n * @throws {Error} If formula failed to converge.\r\n */\r\n _vincenty_inverse: function(p1, p2) {\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var φ2 = p2.lat.toRadians(),\r\n λ2 = p2.lng.toRadians();\r\n\r\n var a = this.datum.ellipsoid.a,\r\n b = this.datum.ellipsoid.b,\r\n f = this.datum.ellipsoid.f;\r\n\r\n var L = λ2 - λ1;\r\n var tanU1 = (1 - f) * Math.tan(φ1),\r\n cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)),\r\n sinU1 = tanU1 * cosU1;\r\n var tanU2 = (1 - f) * Math.tan(φ2),\r\n cosU2 = 1 / Math.sqrt((1 + tanU2 * tanU2)),\r\n sinU2 = tanU2 * cosU2;\r\n\r\n var λ = L,\r\n λʹ, iterations = 0;\r\n var cosSqα, sinσ, cos2σM, cosσ, σ, sinλ, cosλ;\r\n do {\r\n sinλ = Math.sin(λ);\r\n cosλ = Math.cos(λ);\r\n var sinSqσ = (cosU2 * sinλ) * (cosU2 * sinλ) + (cosU1 * sinU2 -\r\n sinU1 * cosU2 * cosλ) * (cosU1 * sinU2 - sinU1 * cosU2 * cosλ);\r\n sinσ = Math.sqrt(sinSqσ);\r\n if (sinσ == 0) return 0; // co-incident points\r\n cosσ = sinU1 * sinU2 + cosU1 * cosU2 * cosλ;\r\n σ = Math.atan2(sinσ, cosσ);\r\n var sinα = cosU1 * cosU2 * sinλ / sinσ;\r\n cosSqα = 1 - sinα * sinα;\r\n cos2σM = cosσ - 2 * sinU1 * sinU2 / cosSqα;\r\n if (isNaN(cos2σM)) cos2σM = 0; // equatorial line: cosSqα=0 (§6)\r\n var C = f / 16 * cosSqα * (4 + f * (4 - 3 * cosSqα));\r\n λʹ = λ;\r\n λ = L + (1 - C) * f * sinα * (σ + C * sinσ * (cos2σM + C * cosσ * (-\r\n 1 + 2 * cos2σM * cos2σM)));\r\n } while (Math.abs(λ - λʹ) > 1e-12 && ++iterations < 100);\r\n if (iterations >= 100) {\r\n console.log(\"Formula failed to converge. Altering target position.\");\r\n return this._vincenty_inverse(p1, {\r\n lat: p2.lat,\r\n lng: p2.lng - 0.01\r\n });\r\n // throw new Error('Formula failed to converge');\r\n }\r\n\r\n var uSq = cosSqα * (a * a - b * b) / (b * b);\r\n var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 *\r\n uSq)));\r\n var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\r\n var Δσ = B * sinσ * (cos2σM + B / 4 * (cosσ * (-1 + 2 * cos2σM *\r\n cos2σM) -\r\n B / 6 * cos2σM * (-3 + 4 * sinσ * sinσ) * (-3 + 4 * cos2σM *\r\n cos2σM)));\r\n\r\n var s = b * A * (σ - Δσ);\r\n\r\n var fwdAz = Math.atan2(cosU2 * sinλ, cosU1 * sinU2 - sinU1 * cosU2 *\r\n cosλ);\r\n var revAz = Math.atan2(cosU1 * sinλ, -sinU1 * cosU2 + cosU1 * sinU2 *\r\n cosλ);\r\n\r\n s = Number(s.toFixed(3)); // round to 1mm precision\r\n return {\r\n distance: s,\r\n initialBearing: fwdAz.toDegrees(),\r\n finalBearing: revAz.toDegrees()\r\n };\r\n },\r\n\r\n\r\n /**\r\n * Returns the point of intersection of two paths defined by point and bearing.\r\n * based on the work of Chris Veness (https://github.com/chrisveness/geodesy)\r\n *\r\n * @param {LatLon} p1 - First point.\r\n * @param {number} brng1 - Initial bearing from first point.\r\n * @param {LatLon} p2 - Second point.\r\n * @param {number} brng2 - Initial bearing from second point.\r\n * @returns {Object} containing lat/lng information of intersection.\r\n *\r\n * @example\r\n * var p1 = LatLon(51.8853, 0.2545), brng1 = 108.55;\r\n * var p2 = LatLon(49.0034, 2.5735), brng2 = 32.44;\r\n * var pInt = LatLon.intersection(p1, brng1, p2, brng2); // pInt.toString(): 50.9078°N, 4.5084°E\r\n */\r\n _intersection: function(p1, brng1, p2, brng2) {\r\n // see http://williams.best.vwh.net/avform.htm#Intersection\r\n\r\n var φ1 = p1.lat.toRadians(),\r\n λ1 = p1.lng.toRadians();\r\n var φ2 = p2.lat.toRadians(),\r\n λ2 = p2.lng.toRadians();\r\n var θ13 = Number(brng1).toRadians(),\r\n θ23 = Number(brng2).toRadians();\r\n var Δφ = φ2 - φ1,\r\n Δλ = λ2 - λ1;\r\n\r\n var δ12 = 2 * Math.asin(Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\r\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ /\r\n 2)));\r\n if (δ12 == 0) return null;\r\n\r\n // initial/final bearings between points\r\n var θ1 = Math.acos((Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) /\r\n (Math.sin(δ12) * Math.cos(φ1)));\r\n if (isNaN(θ1)) θ1 = 0; // protect against rounding\r\n var θ2 = Math.acos((Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) /\r\n (Math.sin(δ12) * Math.cos(φ2)));\r\n var θ12, θ21;\r\n if (Math.sin(λ2 - λ1) > 0) {\r\n θ12 = θ1;\r\n θ21 = 2 * Math.PI - θ2;\r\n } else {\r\n θ12 = 2 * Math.PI - θ1;\r\n θ21 = θ2;\r\n }\r\n\r\n var α1 = (θ13 - θ12 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 2-1-3\r\n var α2 = (θ21 - θ23 + Math.PI) % (2 * Math.PI) - Math.PI; // angle 1-2-3\r\n\r\n if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return null; // infinite intersections\r\n if (Math.sin(α1) * Math.sin(α2) < 0) return null; // ambiguous intersection\r\n\r\n //α1 = Math.abs(α1);\r\n //α2 = Math.abs(α2);\r\n // ... Ed Williams takes abs of α1/α2, but seems to break calculation?\r\n\r\n var α3 = Math.acos(-Math.cos(α1) * Math.cos(α2) +\r\n Math.sin(α1) * Math.sin(α2) * Math.cos(δ12));\r\n var δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2),\r\n Math.cos(α2) + Math.cos(α1) * Math.cos(α3));\r\n var φ3 = Math.asin(Math.sin(φ1) * Math.cos(δ13) +\r\n Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13));\r\n var Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1),\r\n Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3));\r\n var λ3 = λ1 + Δλ13;\r\n λ3 = (λ3 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º\r\n\r\n return {\r\n lat: φ3.toDegrees(),\r\n lng: λ3.toDegrees()\r\n };\r\n },\r\n\r\n /**\r\n * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n * @param obj1\r\n * @param obj2\r\n * @returns obj3 a new object based on obj1 and obj2\r\n */\r\n _merge_options: function(obj1, obj2) {\r\n let obj3 = {};\r\n for (let attrname in obj1) {\r\n obj3[attrname] = obj1[attrname];\r\n }\r\n for (let attrname in obj2) {\r\n obj3[attrname] = obj2[attrname];\r\n }\r\n return obj3;\r\n }\r\n});\r\n\r\nL.geodesic = function(latlngs, options) {\r\n return new L.Geodesic(latlngs, options);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzPzU3NGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0Esc0JBQXNCLDJDQUEyQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9MZWFmbGV0Lkdlb2Rlc2ljL0xlYWZsZXQuR2VvZGVzaWMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIExlYWZsZXQuR2VvZGVzaWMuXHJcbi8vIENvcHlyaWdodCAoQykgMjAxNyAgSGVucnkgVGhhc2xlclxyXG4vLyBiYXNlZCBvbiBjb2RlIGJ5IENocmlzIFZlbmVzcyBDb3B5cmlnaHQgKEMpIDIwMTQgaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3lcclxuLy9cclxuLy8gTGVhZmxldC5HZW9kZXNpYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbi8vIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbi8vXHJcbi8vIExlYWZsZXQuR2VvZGVzaWMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcclxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcclxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4vLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4vL1xyXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4vLyBhbG9uZyB3aXRoIExlYWZsZXQuR2VvZGVzaWMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXHJcblxyXG5cclxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgbnVtZXJpYyBkZWdyZWVzIHRvIHJhZGlhbnMgKi9cclxuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvUmFkaWFucyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gIE51bWJlci5wcm90b3R5cGUudG9SYWRpYW5zID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcyAqIE1hdGguUEkgLyAxODA7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqIEV4dGVuZCBOdW1iZXIgb2JqZWN0IHdpdGggbWV0aG9kIHRvIGNvbnZlcnQgcmFkaWFucyB0byBudW1lcmljIChzaWduZWQpIGRlZ3JlZXMgKi9cclxuaWYgKHR5cGVvZiBOdW1iZXIucHJvdG90eXBlLnRvRGVncmVlcyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gIE51bWJlci5wcm90b3R5cGUudG9EZWdyZWVzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcyAqIDE4MCAvIE1hdGguUEk7XHJcbiAgfTtcclxufVxyXG5cclxudmFyIElOVEVSU0VDVF9MTkcgPSAxNzkuOTk5OyAvLyBMbmcgdXNlZCBmb3IgaW50ZXJzZWN0aW9uIGFuZCB3cmFwIGFyb3VuZCBvbiBtYXAgZWRnZXNcclxuXHJcbkwuR2VvZGVzaWMgPSBMLlBvbHlsaW5lLmV4dGVuZCh7XHJcbiAgb3B0aW9uczoge1xyXG4gICAgY29sb3I6IFwiYmx1ZVwiLFxyXG4gICAgc3RlcHM6IDEwLFxyXG4gICAgZGFzaDogMSxcclxuICAgIHdyYXA6IHRydWVcclxuICB9LFxyXG5cclxuICBpbml0aWFsaXplOiBmdW5jdGlvbihsYXRsbmdzLCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLl9tZXJnZV9vcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMuZGFzaCA9IE1hdGgubWF4KDFlLTMsIE1hdGgubWluKDEsIHBhcnNlRmxvYXQodGhpcy5vcHRpb25zLmRhc2gpIHx8IDEpKTtcclxuICAgIHRoaXMuZGF0dW0gPSB7fTtcclxuICAgIHRoaXMuZGF0dW0uZWxsaXBzb2lkID0ge1xyXG4gICAgICAgIGE6IDYzNzgxMzcsXHJcbiAgICAgICAgYjogNjM1Njc1Mi4zMTQyLFxyXG4gICAgICAgIGY6IDEgLyAyOTguMjU3MjIzNTYzXHJcbiAgICAgIH07IC8vIFdHUy04NFxyXG4gICAgdGhpcy5fbGF0bG5ncyA9IHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKGxhdGxuZ3MpO1xyXG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MsIHRoaXMub3B0aW9ucyk7XHJcbiAgfSxcclxuXHJcbiAgc2V0TGF0TG5nczogZnVuY3Rpb24obGF0bG5ncykge1xyXG4gICAgdGhpcy5fbGF0bG5ncyA9IHRoaXMuX2dlbmVyYXRlX0dlb2Rlc2ljKGxhdGxuZ3MpO1xyXG4gICAgTC5Qb2x5bGluZS5wcm90b3R5cGUuc2V0TGF0TG5ncy5jYWxsKHRoaXMsIHRoaXMuX2xhdGxuZ3MpO1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgc29tZSBzdGF0aXN0aWMgdmFsdWVzIG9mIGN1cnJlbnQgZ2VvZGVzaWMgbXVsdGlwb2x5bGluZVxyXG4gICAqIEByZXR1cm5zIChPYmplY3R9IE9iamVjdCB3aXRoIHNldmVyYWwgcHJvcGVydGllcyAoZS5nLiBvdmVyYWxsIGRpc3RhbmNlKVxyXG4gICAqL1xyXG4gIGdldFN0YXRzOiBmdW5jdGlvbigpIHtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgZGlzdGFuY2U6IDAsXHJcbiAgICAgICAgcG9pbnRzOiAwLFxyXG4gICAgICAgIHBvbHlnb25zOiB0aGlzLl9sYXRsbmdzLmxlbmd0aFxyXG4gICAgICB9LCBwb2x5LCBwb2ludHM7XHJcblxyXG4gICAgZm9yIChwb2x5ID0gMDsgcG9seSA8IHRoaXMuX2xhdGxuZ3MubGVuZ3RoOyBwb2x5KyspIHtcclxuICAgICAgb2JqLnBvaW50cyArPSB0aGlzLl9sYXRsbmdzW3BvbHldLmxlbmd0aDtcclxuICAgICAgZm9yIChwb2ludHMgPSAwOyBwb2ludHMgPCAodGhpcy5fbGF0bG5nc1twb2x5XS5sZW5ndGggLSAxKTsgcG9pbnRzKyspIHtcclxuICAgICAgICBvYmouZGlzdGFuY2UgKz0gdGhpcy5fdmluY2VudHlfaW52ZXJzZSh0aGlzLl9sYXRsbmdzW3BvbHldW3BvaW50c10sXHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHldW3BvaW50cyArIDFdKS5kaXN0YW5jZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9LFxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBnZW9kZXNpYyBsaW5lcyBmcm9tIGdlb0pzb24uIFJlcGxhY2VzIGFsbCBjdXJyZW50IGZlYXR1cmVzIG9mIHRoaXMgaW5zdGFuY2UuXHJcbiAgICogU3VwcG9ydHMgTGluZVN0cmluZywgTXVsdGlMaW5lU3RyaW5nIGFuZCBQb2x5Z29uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IGdlb2pzb24gLSBnZW9zam9uIGFzIG9iamVjdC5cclxuICAgKi9cclxuICBnZW9Kc29uOiBmdW5jdGlvbihnZW9qc29uKSB7XHJcblxyXG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBMLkdlb0pTT04uYXNGZWF0dXJlKGdlb2pzb24pO1xyXG4gICAgbGV0IGZlYXR1cmVzID0gbm9ybWFsaXplZC50eXBlID09PSBcIkZlYXR1cmVDb2xsZWN0aW9uXCIgPyBub3JtYWxpemVkLmZlYXR1cmVzIDogW1xyXG4gICAgICBub3JtYWxpemVkXHJcbiAgICBdO1xyXG4gICAgdGhpcy5fbGF0bG5ncyA9IFtdO1xyXG4gICAgZm9yIChsZXQgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xyXG4gICAgICBsZXQgZ2VvbWV0cnkgPSBmZWF0dXJlLnR5cGUgPT09IFwiRmVhdHVyZVwiID8gZmVhdHVyZS5nZW9tZXRyeSA6XHJcbiAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcclxuXHJcbiAgICAgIHN3aXRjaCAoZ2VvbWV0cnkudHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6XHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzLnB1c2godGhpcy5fZ2VuZXJhdGVfR2VvZGVzaWMoW0wuR2VvSlNPTi5jb29yZHNUb0xhdExuZ3MoXHJcbiAgICAgICAgICAgIGNvb3JkcywgMCldKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6XHJcbiAgICAgICAgY2FzZSBcIlBvbHlnb25cIjpcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3MucHVzaCh0aGlzLl9nZW5lcmF0ZV9HZW9kZXNpYyhMLkdlb0pTT04uY29vcmRzVG9MYXRMbmdzKFxyXG4gICAgICAgICAgICBjb29yZHMsIDEpKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiUG9pbnRcIjpcclxuICAgICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOlxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJEdWRlLCBwb2ludHMgY2FuJ3QgYmUgZHJhd24gYXMgZ2VvZGVzaWMgbGluZXMuLi5cIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJEcmF3aW5nIFwiICsgZ2VvbWV0cnkudHlwZSArXHJcbiAgICAgICAgICAgIFwiIGFzIGEgZ2VvZGVzaWMgaXMgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcuLi5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgZ3JlYXQgY2lyY2xlLiBSZXBsYWNlcyBhbGwgY3VycmVudCBsaW5lcy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2VudGVyIC0gZ2VvZ3JhcGhpYyBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSByYWRpdXMgb2YgdGhlIGNpcmNsZSBpbiBtZXRyZXNcclxuICAgKi9cclxuICBjcmVhdGVDaXJjbGU6IGZ1bmN0aW9uKGNlbnRlciwgcmFkaXVzKSB7XHJcbiAgICBsZXQgcG9seWxpbmVJbmRleCA9IDA7XHJcbiAgICBsZXQgcHJldiA9IHtcclxuICAgICAgbGF0OiAwLFxyXG4gICAgICBsbmc6IDAsXHJcbiAgICAgIGJyZzogMFxyXG4gICAgfTtcclxuICAgIGxldCBzdGVwO1xyXG5cclxuICAgIHRoaXMuX2xhdGxuZ3MgPSBbXTtcclxuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuXHJcbiAgICBsZXQgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KEwubGF0TG5nKGNlbnRlciksIDAsIHJhZGl1cywgdGhpcy5vcHRpb25zXHJcbiAgICAgIC53cmFwKTtcclxuICAgIHByZXYgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKTtcclxuICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChwcmV2KTtcclxuICAgIGZvciAoc3RlcCA9IDE7IHN0ZXAgPD0gdGhpcy5vcHRpb25zLnN0ZXBzOykge1xyXG4gICAgICBkaXJlY3QgPSB0aGlzLl92aW5jZW50eV9kaXJlY3QoTC5sYXRMbmcoY2VudGVyKSwgMzYwIC8gdGhpcy5vcHRpb25zXHJcbiAgICAgICAgLnN0ZXBzICogc3RlcCwgcmFkaXVzLCB0aGlzLm9wdGlvbnMud3JhcCk7XHJcbiAgICAgIGxldCBncCA9IEwubGF0TG5nKGRpcmVjdC5sYXQsIGRpcmVjdC5sbmcpO1xyXG4gICAgICBpZiAoTWF0aC5hYnMoZ3AubG5nIC0gcHJldi5sbmcpID4gMTgwKSB7XHJcbiAgICAgICAgbGV0IGludmVyc2UgPSB0aGlzLl92aW5jZW50eV9pbnZlcnNlKHByZXYsIGdwKTtcclxuICAgICAgICBsZXQgc2VjID0gdGhpcy5faW50ZXJzZWN0aW9uKHByZXYsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcclxuICAgICAgICAgIGxhdDogLTg5LFxyXG4gICAgICAgICAgbG5nOiAoKGdwLmxuZyAtIHByZXYubG5nKSA+IDApID8gLUlOVEVSU0VDVF9MTkcgOiBJTlRFUlNFQ1RfTE5HXHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgaWYgKHNlYykge1xyXG4gICAgICAgICAgdGhpcy5fbGF0bG5nc1twb2x5bGluZUluZGV4XS5wdXNoKEwubGF0TG5nKHNlYy5sYXQsIHNlYy5sbmcpKTtcclxuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuICAgICAgICAgIHByZXYgPSBMLmxhdExuZyhzZWMubGF0LCAtc2VjLmxuZyk7XHJcbiAgICAgICAgICB0aGlzLl9sYXRsbmdzW3BvbHlsaW5lSW5kZXhdLnB1c2gocHJldik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBvbHlsaW5lSW5kZXgrKztcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0gPSBbXTtcclxuICAgICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XHJcbiAgICAgICAgICBwcmV2ID0gZ3A7XHJcbiAgICAgICAgICBzdGVwKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xhdGxuZ3NbcG9seWxpbmVJbmRleF0ucHVzaChncCk7XHJcbiAgICAgICAgcHJldiA9IGdwO1xyXG4gICAgICAgIHN0ZXArKztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEwuUG9seWxpbmUucHJvdG90eXBlLnNldExhdExuZ3MuY2FsbCh0aGlzLCB0aGlzLl9sYXRsbmdzKTtcclxuICB9LFxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgZ2VvZGVzaWMgUG9seWxpbmUgZnJvbSBnaXZlbiBjb29yZGluYXRlc1xyXG4gICAqIE5vdGU6IGRhc2hlZCBsaW5lcyBhcmUgdW5kZXIgd29ya1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsYXRsbmdzIC0gT25lIG9yIG1vcmUgcG9seWxpbmVzIGFzIGFuIGFycmF5LiBTZWUgTGVhZmxldCBkb2MgYWJvdXQgUG9seWxpbmVcclxuICAgKiBAcmV0dXJucyAoT2JqZWN0fSBBbiBhcnJheSBvZiBhcnJheXMgb2YgZ2VvZ3JhcGhpY2FsIHBvaW50cy5cclxuICAgKi9cclxuICBfZ2VuZXJhdGVfR2VvZGVzaWM6IGZ1bmN0aW9uKGxhdGxuZ3MpIHtcclxuICAgIGxldCBfZ2VvID0gW10sIF9nZW9jbnQgPSAwO1xyXG5cclxuICAgIGZvciAobGV0IHBvbHkgPSAwOyBwb2x5IDwgbGF0bG5ncy5sZW5ndGg7IHBvbHkrKykge1xyXG4gICAgICBfZ2VvW19nZW9jbnRdID0gW107XHJcbiAgICAgIGxldCBwcmV2ID0gTC5sYXRMbmcobGF0bG5nc1twb2x5XVswXSk7XHJcbiAgICAgIGZvciAobGV0IHBvaW50cyA9IDA7IHBvaW50cyA8IChsYXRsbmdzW3BvbHldLmxlbmd0aCAtIDEpOyBwb2ludHMrKykge1xyXG4gICAgICAgIC8vIHVzZSBwcmV2LCBzbyB0aGF0IHdyYXBwaW5nIGJlaGF2ZXMgY29ycmVjdGx5XHJcbiAgICAgICAgbGV0IHBvaW50QSA9IHByZXY7XHJcbiAgICAgICAgbGV0IHBvaW50QiA9IEwubGF0TG5nKGxhdGxuZ3NbcG9seV1bcG9pbnRzICsgMV0pO1xyXG4gICAgICAgIGlmIChwb2ludEEuZXF1YWxzKHBvaW50QikpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW52ZXJzZSA9IHRoaXMuX3ZpbmNlbnR5X2ludmVyc2UocG9pbnRBLCBwb2ludEIpO1xyXG4gICAgICAgIF9nZW9bX2dlb2NudF0ucHVzaChwcmV2KTtcclxuICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSB0aGlzLm9wdGlvbnMuc3RlcHM7KSB7XHJcbiAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBpbnZlcnNlLmRpc3RhbmNlIC8gdGhpcy5vcHRpb25zLnN0ZXBzO1xyXG4gICAgICAgICAgLy8gZGFzaGVkIGxpbmVzIGRvbid0IGdvIHRoZSBmdWxsIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50c1xyXG4gICAgICAgICAgbGV0IGRpc3RfbXVsdCA9IHMgLSAxICsgdGhpcy5vcHRpb25zLmRhc2g7XHJcbiAgICAgICAgICBsZXQgZGlyZWN0ID0gdGhpcy5fdmluY2VudHlfZGlyZWN0KHBvaW50QSwgaW52ZXJzZS5pbml0aWFsQmVhcmluZywgZGlzdGFuY2UqZGlzdF9tdWx0LCB0aGlzLm9wdGlvbnMud3JhcCk7XHJcbiAgICAgICAgICBsZXQgZ3AgPSBMLmxhdExuZyhkaXJlY3QubGF0LCBkaXJlY3QubG5nKTtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhncC5sbmcgLSBwcmV2LmxuZykgPiAxODApIHtcclxuICAgICAgICAgICAgbGV0IHNlYyA9IHRoaXMuX2ludGVyc2VjdGlvbihwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIHtcclxuICAgICAgICAgICAgICBsYXQ6IC04OSxcclxuICAgICAgICAgICAgICBsbmc6ICgoZ3AubG5nIC0gcHJldi5sbmcpID4gMCkgPyAtSU5URVJTRUNUX0xORyA6IElOVEVSU0VDVF9MTkdcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChzZWMpIHtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goTC5sYXRMbmcoc2VjLmxhdCwgc2VjLmxuZykpO1xyXG4gICAgICAgICAgICAgIF9nZW9jbnQrKztcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdID0gW107XHJcbiAgICAgICAgICAgICAgcHJldiA9IEwubGF0TG5nKHNlYy5sYXQsIC1zZWMubG5nKTtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgX2dlb2NudCsrO1xyXG4gICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcclxuICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2goZ3ApO1xyXG4gICAgICAgICAgICAgIHByZXYgPSBncDtcclxuICAgICAgICAgICAgICBzKys7XHJcbiAgICAgICAgICAgIH0gIFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX2dlb1tfZ2VvY250XS5wdXNoKGdwKTtcclxuICAgICAgICAgICAgLy8gRGFzaGVkIGxpbmVzIHN0YXJ0IGEgbmV3IGxpbmVcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kYXNoIDwgMSl7XHJcbiAgICAgICAgICAgICAgICBfZ2VvY250Kys7XHJcbiAgICAgICAgICAgICAgICAvLyBnbyBmdWxsIGRpc3RhbmNlIHRoaXMgdGltZSwgdG8gZ2V0IHN0YXJ0aW5nIHBvaW50IGZvciBuZXh0IGxpbmVcclxuICAgICAgICAgICAgICAgIGxldCBkaXJlY3RfZnVsbCA9IHRoaXMuX3ZpbmNlbnR5X2RpcmVjdChwb2ludEEsIGludmVyc2UuaW5pdGlhbEJlYXJpbmcsIGRpc3RhbmNlKnMsIHRoaXMub3B0aW9ucy53cmFwKTtcclxuICAgICAgICAgICAgICAgIF9nZW9bX2dlb2NudF0gPSBbXTtcclxuICAgICAgICAgICAgICAgIHByZXYgPSBMLmxhdExuZyhkaXJlY3RfZnVsbC5sYXQsIGRpcmVjdF9mdWxsLmxuZyk7XHJcbiAgICAgICAgICAgICAgICBfZ2VvW19nZW9jbnRdLnB1c2gocHJldik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBwcmV2ID0gZ3A7XHJcbiAgICAgICAgICAgIHMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgX2dlb2NudCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9nZW87XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogVmluY2VudHkgZGlyZWN0IGNhbGN1bGF0aW9uLlxyXG4gICAqIGJhc2VkIG9uIHRoZSB3b3JrIG9mIENocmlzIFZlbmVzcyAoaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdmVuZXNzL2dlb2Rlc3kpXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbml0aWFsQmVhcmluZyAtIEluaXRpYWwgYmVhcmluZyBpbiBkZWdyZWVzIGZyb20gbm9ydGguXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gRGlzdGFuY2UgYWxvbmcgYmVhcmluZyBpbiBtZXRyZXMuXHJcbiAgICogQHJldHVybnMgKE9iamVjdH0gT2JqZWN0IGluY2x1ZGluZyBwb2ludCAoZGVzdGluYXRpb24gcG9pbnQpLCBmaW5hbEJlYXJpbmcuXHJcbiAgICovXHJcblxyXG4gIF92aW5jZW50eV9kaXJlY3Q6IGZ1bmN0aW9uKHAxLCBpbml0aWFsQmVhcmluZywgZGlzdGFuY2UsIHdyYXApIHtcclxuICAgIHZhciDPhjEgPSBwMS5sYXQudG9SYWRpYW5zKCksXHJcbiAgICAgIM67MSA9IHAxLmxuZy50b1JhZGlhbnMoKTtcclxuICAgIHZhciDOsTEgPSBpbml0aWFsQmVhcmluZy50b1JhZGlhbnMoKTtcclxuICAgIHZhciBzID0gZGlzdGFuY2U7XHJcblxyXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxyXG4gICAgICBiID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYixcclxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XHJcblxyXG4gICAgdmFyIHNpbs6xMSA9IE1hdGguc2luKM6xMSk7XHJcbiAgICB2YXIgY29zzrExID0gTWF0aC5jb3MozrExKTtcclxuXHJcbiAgICB2YXIgdGFuVTEgPSAoMSAtIGYpICogTWF0aC50YW4oz4YxKSxcclxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxyXG4gICAgICBzaW5VMSA9IHRhblUxICogY29zVTE7XHJcbiAgICB2YXIgz4MxID0gTWF0aC5hdGFuMih0YW5VMSwgY29zzrExKTtcclxuICAgIHZhciBzaW7OsSA9IGNvc1UxICogc2luzrExO1xyXG4gICAgdmFyIGNvc1NxzrEgPSAxIC0gc2luzrEgKiBzaW7OsTtcclxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcclxuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxyXG4gICAgICB1U3EpKSk7XHJcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcclxuXHJcbiAgICB2YXIgz4MgPSBzIC8gKGIgKiBBKSxcclxuICAgICAgz4PKuSwgaXRlcmF0aW9ucyA9IDA7XHJcbiAgICB2YXIgc2luz4MsIGNvc8+DO1xyXG4gICAgdmFyIGNvczLPg007XHJcbiAgICBkbyB7XHJcbiAgICAgIGNvczLPg00gPSBNYXRoLmNvcygyICogz4MxICsgz4MpO1xyXG4gICAgICBzaW7PgyA9IE1hdGguc2luKM+DKTtcclxuICAgICAgY29zz4MgPSBNYXRoLmNvcyjPgyk7XHJcbiAgICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcclxuICAgICAgICAgIGNvczLPg00pIC1cclxuICAgICAgICBCIC8gNiAqIGNvczLPg00gKiAoLTMgKyA0ICogc2luz4MgKiBzaW7PgykgKiAoLTMgKyA0ICogY29zMs+DTSAqXHJcbiAgICAgICAgICBjb3Myz4NNKSkpO1xyXG4gICAgICDPg8q5ID0gz4M7XHJcbiAgICAgIM+DID0gcyAvIChiICogQSkgKyDOlM+DO1xyXG4gICAgfSB3aGlsZSAoTWF0aC5hYnMoz4MgLSDPg8q5KSA+IDFlLTEyICYmICsraXRlcmF0aW9ucyk7XHJcblxyXG4gICAgdmFyIHggPSBzaW5VMSAqIHNpbs+DIC0gY29zVTEgKiBjb3PPgyAqIGNvc86xMTtcclxuICAgIHZhciDPhjIgPSBNYXRoLmF0YW4yKHNpblUxICogY29zz4MgKyBjb3NVMSAqIHNpbs+DICogY29zzrExLCAoMSAtIGYpICpcclxuICAgICAgTWF0aC5zcXJ0KHNpbs6xICogc2luzrEgKyB4ICogeCkpO1xyXG4gICAgdmFyIM67ID0gTWF0aC5hdGFuMihzaW7PgyAqIHNpbs6xMSwgY29zVTEgKiBjb3PPgyAtIHNpblUxICogc2luz4MgKiBjb3POsTEpO1xyXG4gICAgdmFyIEMgPSBmIC8gMTYgKiBjb3NTcc6xICogKDQgKyBmICogKDQgLSAzICogY29zU3HOsSkpO1xyXG4gICAgdmFyIEwgPSDOuyAtICgxIC0gQykgKiBmICogc2luzrEgKlxyXG4gICAgICAoz4MgKyBDICogc2luz4MgKiAoY29zMs+DTSArIEMgKiBjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICogY29zMs+DTSkpKTtcclxuXHJcbiAgICB2YXIgzrsyO1xyXG4gICAgaWYgKHdyYXApIHtcclxuICAgICAgzrsyID0gKM67MSArIEwgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gbm9ybWFsaXNlIHRvIC0xODAuLi4rMTgwXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICDOuzIgPSAozrsxICsgTCk7IC8vIGRvIG5vdCBub3JtYWxpemVcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmV2QXogPSBNYXRoLmF0YW4yKHNpbs6xLCAteCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGF0OiDPhjIudG9EZWdyZWVzKCksXHJcbiAgICAgIGxuZzogzrsyLnRvRGVncmVlcygpLFxyXG4gICAgICBmaW5hbEJlYXJpbmc6IHJldkF6LnRvRGVncmVlcygpXHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIFZpbmNlbnR5IGludmVyc2UgY2FsY3VsYXRpb24uXHJcbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHtMYXRMbmd9IHAxIC0gTGF0aXR1ZGUvbG9uZ2l0dWRlIG9mIHN0YXJ0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7TGF0TG5nfSBwMiAtIExhdGl0dWRlL2xvbmdpdHVkZSBvZiBkZXN0aW5hdGlvbiBwb2ludC5cclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgaW5jbHVkaW5nIGRpc3RhbmNlLCBpbml0aWFsQmVhcmluZywgZmluYWxCZWFyaW5nLlxyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBmb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZS5cclxuICAgKi9cclxuICBfdmluY2VudHlfaW52ZXJzZTogZnVuY3Rpb24ocDEsIHAyKSB7XHJcbiAgICB2YXIgz4YxID0gcDEubGF0LnRvUmFkaWFucygpLFxyXG4gICAgICDOuzEgPSBwMS5sbmcudG9SYWRpYW5zKCk7XHJcbiAgICB2YXIgz4YyID0gcDIubGF0LnRvUmFkaWFucygpLFxyXG4gICAgICDOuzIgPSBwMi5sbmcudG9SYWRpYW5zKCk7XHJcblxyXG4gICAgdmFyIGEgPSB0aGlzLmRhdHVtLmVsbGlwc29pZC5hLFxyXG4gICAgICBiID0gdGhpcy5kYXR1bS5lbGxpcHNvaWQuYixcclxuICAgICAgZiA9IHRoaXMuZGF0dW0uZWxsaXBzb2lkLmY7XHJcblxyXG4gICAgdmFyIEwgPSDOuzIgLSDOuzE7XHJcbiAgICB2YXIgdGFuVTEgPSAoMSAtIGYpICogTWF0aC50YW4oz4YxKSxcclxuICAgICAgY29zVTEgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTEgKiB0YW5VMSkpLFxyXG4gICAgICBzaW5VMSA9IHRhblUxICogY29zVTE7XHJcbiAgICB2YXIgdGFuVTIgPSAoMSAtIGYpICogTWF0aC50YW4oz4YyKSxcclxuICAgICAgY29zVTIgPSAxIC8gTWF0aC5zcXJ0KCgxICsgdGFuVTIgKiB0YW5VMikpLFxyXG4gICAgICBzaW5VMiA9IHRhblUyICogY29zVTI7XHJcblxyXG4gICAgdmFyIM67ID0gTCxcclxuICAgICAgzrvKuSwgaXRlcmF0aW9ucyA9IDA7XHJcbiAgICB2YXIgY29zU3HOsSwgc2luz4MsIGNvczLPg00sIGNvc8+DLCDPgywgc2luzrssIGNvc867O1xyXG4gICAgZG8ge1xyXG4gICAgICBzaW7OuyA9IE1hdGguc2luKM67KTtcclxuICAgICAgY29zzrsgPSBNYXRoLmNvcyjOuyk7XHJcbiAgICAgIHZhciBzaW5Tcc+DID0gKGNvc1UyICogc2luzrspICogKGNvc1UyICogc2luzrspICsgKGNvc1UxICogc2luVTIgLVxyXG4gICAgICAgIHNpblUxICogY29zVTIgKiBjb3POuykgKiAoY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3POuyk7XHJcbiAgICAgIHNpbs+DID0gTWF0aC5zcXJ0KHNpblNxz4MpO1xyXG4gICAgICBpZiAoc2luz4MgPT0gMCkgcmV0dXJuIDA7IC8vIGNvLWluY2lkZW50IHBvaW50c1xyXG4gICAgICBjb3PPgyA9IHNpblUxICogc2luVTIgKyBjb3NVMSAqIGNvc1UyICogY29zzrs7XHJcbiAgICAgIM+DID0gTWF0aC5hdGFuMihzaW7PgywgY29zz4MpO1xyXG4gICAgICB2YXIgc2luzrEgPSBjb3NVMSAqIGNvc1UyICogc2luzrsgLyBzaW7PgztcclxuICAgICAgY29zU3HOsSA9IDEgLSBzaW7OsSAqIHNpbs6xO1xyXG4gICAgICBjb3Myz4NNID0gY29zz4MgLSAyICogc2luVTEgKiBzaW5VMiAvIGNvc1NxzrE7XHJcbiAgICAgIGlmIChpc05hTihjb3Myz4NNKSkgY29zMs+DTSA9IDA7IC8vIGVxdWF0b3JpYWwgbGluZTogY29zU3HOsT0wICjCpzYpXHJcbiAgICAgIHZhciBDID0gZiAvIDE2ICogY29zU3HOsSAqICg0ICsgZiAqICg0IC0gMyAqIGNvc1NxzrEpKTtcclxuICAgICAgzrvKuSA9IM67O1xyXG4gICAgICDOuyA9IEwgKyAoMSAtIEMpICogZiAqIHNpbs6xICogKM+DICsgQyAqIHNpbs+DICogKGNvczLPg00gKyBDICogY29zz4MgKiAoLVxyXG4gICAgICAgIDEgKyAyICogY29zMs+DTSAqIGNvczLPg00pKSk7XHJcbiAgICB9IHdoaWxlIChNYXRoLmFicyjOuyAtIM67yrkpID4gMWUtMTIgJiYgKytpdGVyYXRpb25zIDwgMTAwKTtcclxuICAgIGlmIChpdGVyYXRpb25zID49IDEwMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkZvcm11bGEgZmFpbGVkIHRvIGNvbnZlcmdlLiBBbHRlcmluZyB0YXJnZXQgcG9zaXRpb24uXCIpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fdmluY2VudHlfaW52ZXJzZShwMSwge1xyXG4gICAgICAgICAgbGF0OiBwMi5sYXQsXHJcbiAgICAgICAgICBsbmc6IHAyLmxuZyAtIDAuMDFcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyAgdGhyb3cgbmV3IEVycm9yKCdGb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB1U3EgPSBjb3NTcc6xICogKGEgKiBhIC0gYiAqIGIpIC8gKGIgKiBiKTtcclxuICAgIHZhciBBID0gMSArIHVTcSAvIDE2Mzg0ICogKDQwOTYgKyB1U3EgKiAoLTc2OCArIHVTcSAqICgzMjAgLSAxNzUgKlxyXG4gICAgICB1U3EpKSk7XHJcbiAgICB2YXIgQiA9IHVTcSAvIDEwMjQgKiAoMjU2ICsgdVNxICogKC0xMjggKyB1U3EgKiAoNzQgLSA0NyAqIHVTcSkpKTtcclxuICAgIHZhciDOlM+DID0gQiAqIHNpbs+DICogKGNvczLPg00gKyBCIC8gNCAqIChjb3PPgyAqICgtMSArIDIgKiBjb3Myz4NNICpcclxuICAgICAgICBjb3Myz4NNKSAtXHJcbiAgICAgIEIgLyA2ICogY29zMs+DTSAqICgtMyArIDQgKiBzaW7PgyAqIHNpbs+DKSAqICgtMyArIDQgKiBjb3Myz4NNICpcclxuICAgICAgICBjb3Myz4NNKSkpO1xyXG5cclxuICAgIHZhciBzID0gYiAqIEEgKiAoz4MgLSDOlM+DKTtcclxuXHJcbiAgICB2YXIgZndkQXogPSBNYXRoLmF0YW4yKGNvc1UyICogc2luzrssIGNvc1UxICogc2luVTIgLSBzaW5VMSAqIGNvc1UyICpcclxuICAgICAgY29zzrspO1xyXG4gICAgdmFyIHJldkF6ID0gTWF0aC5hdGFuMihjb3NVMSAqIHNpbs67LCAtc2luVTEgKiBjb3NVMiArIGNvc1UxICogc2luVTIgKlxyXG4gICAgICBjb3POuyk7XHJcblxyXG4gICAgcyA9IE51bWJlcihzLnRvRml4ZWQoMykpOyAvLyByb3VuZCB0byAxbW0gcHJlY2lzaW9uXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaXN0YW5jZTogcyxcclxuICAgICAgaW5pdGlhbEJlYXJpbmc6IGZ3ZEF6LnRvRGVncmVlcygpLFxyXG4gICAgICBmaW5hbEJlYXJpbmc6IHJldkF6LnRvRGVncmVlcygpXHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gb2YgdHdvIHBhdGhzIGRlZmluZWQgYnkgcG9pbnQgYW5kIGJlYXJpbmcuXHJcbiAgICogYmFzZWQgb24gdGhlIHdvcmsgb2YgQ2hyaXMgVmVuZXNzIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXN2ZW5lc3MvZ2VvZGVzeSlcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TGF0TG9ufSBwMSAtIEZpcnN0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicm5nMSAtIEluaXRpYWwgYmVhcmluZyBmcm9tIGZpcnN0IHBvaW50LlxyXG4gICAqIEBwYXJhbSB7TGF0TG9ufSBwMiAtIFNlY29uZCBwb2ludC5cclxuICAgKiBAcGFyYW0ge251bWJlcn0gYnJuZzIgLSBJbml0aWFsIGJlYXJpbmcgZnJvbSBzZWNvbmQgcG9pbnQuXHJcbiAgICogQHJldHVybnMge09iamVjdH0gY29udGFpbmluZyBsYXQvbG5nIGluZm9ybWF0aW9uIG9mIGludGVyc2VjdGlvbi5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogdmFyIHAxID0gTGF0TG9uKDUxLjg4NTMsIDAuMjU0NSksIGJybmcxID0gMTA4LjU1O1xyXG4gICAqIHZhciBwMiA9IExhdExvbig0OS4wMDM0LCAyLjU3MzUpLCBicm5nMiA9IDMyLjQ0O1xyXG4gICAqIHZhciBwSW50ID0gTGF0TG9uLmludGVyc2VjdGlvbihwMSwgYnJuZzEsIHAyLCBicm5nMik7IC8vIHBJbnQudG9TdHJpbmcoKTogNTAuOTA3OMKwTiwgNC41MDg0wrBFXHJcbiAgICovXHJcbiAgX2ludGVyc2VjdGlvbjogZnVuY3Rpb24ocDEsIGJybmcxLCBwMiwgYnJuZzIpIHtcclxuICAgIC8vIHNlZSBodHRwOi8vd2lsbGlhbXMuYmVzdC52d2gubmV0L2F2Zm9ybS5odG0jSW50ZXJzZWN0aW9uXHJcblxyXG4gICAgdmFyIM+GMSA9IHAxLmxhdC50b1JhZGlhbnMoKSxcclxuICAgICAgzrsxID0gcDEubG5nLnRvUmFkaWFucygpO1xyXG4gICAgdmFyIM+GMiA9IHAyLmxhdC50b1JhZGlhbnMoKSxcclxuICAgICAgzrsyID0gcDIubG5nLnRvUmFkaWFucygpO1xyXG4gICAgdmFyIM64MTMgPSBOdW1iZXIoYnJuZzEpLnRvUmFkaWFucygpLFxyXG4gICAgICDOuDIzID0gTnVtYmVyKGJybmcyKS50b1JhZGlhbnMoKTtcclxuICAgIHZhciDOlM+GID0gz4YyIC0gz4YxLFxyXG4gICAgICDOlM67ID0gzrsyIC0gzrsxO1xyXG5cclxuICAgIHZhciDOtDEyID0gMiAqIE1hdGguYXNpbihNYXRoLnNxcnQoTWF0aC5zaW4ozpTPhiAvIDIpICogTWF0aC5zaW4ozpTPhiAvIDIpICtcclxuICAgICAgTWF0aC5jb3Moz4YxKSAqIE1hdGguY29zKM+GMikgKiBNYXRoLnNpbijOlM67IC8gMikgKiBNYXRoLnNpbijOlM67IC9cclxuICAgICAgICAyKSkpO1xyXG4gICAgaWYgKM60MTIgPT0gMCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gaW5pdGlhbC9maW5hbCBiZWFyaW5ncyBiZXR3ZWVuIHBvaW50c1xyXG4gICAgdmFyIM64MSA9IE1hdGguYWNvcygoTWF0aC5zaW4oz4YyKSAtIE1hdGguc2luKM+GMSkgKiBNYXRoLmNvcyjOtDEyKSkgL1xyXG4gICAgICAoTWF0aC5zaW4ozrQxMikgKiBNYXRoLmNvcyjPhjEpKSk7XHJcbiAgICBpZiAoaXNOYU4ozrgxKSkgzrgxID0gMDsgLy8gcHJvdGVjdCBhZ2FpbnN0IHJvdW5kaW5nXHJcbiAgICB2YXIgzrgyID0gTWF0aC5hY29zKChNYXRoLnNpbijPhjEpIC0gTWF0aC5zaW4oz4YyKSAqIE1hdGguY29zKM60MTIpKSAvXHJcbiAgICAgIChNYXRoLnNpbijOtDEyKSAqIE1hdGguY29zKM+GMikpKTtcclxuICAgIHZhciDOuDEyLCDOuDIxO1xyXG4gICAgaWYgKE1hdGguc2luKM67MiAtIM67MSkgPiAwKSB7XHJcbiAgICAgIM64MTIgPSDOuDE7XHJcbiAgICAgIM64MjEgPSAyICogTWF0aC5QSSAtIM64MjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIM64MTIgPSAyICogTWF0aC5QSSAtIM64MTtcclxuICAgICAgzrgyMSA9IM64MjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgzrExID0gKM64MTMgLSDOuDEyICsgTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gYW5nbGUgMi0xLTNcclxuICAgIHZhciDOsTIgPSAozrgyMSAtIM64MjMgKyBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBhbmdsZSAxLTItM1xyXG5cclxuICAgIGlmIChNYXRoLnNpbijOsTEpID09IDAgJiYgTWF0aC5zaW4ozrEyKSA9PSAwKSByZXR1cm4gbnVsbDsgLy8gaW5maW5pdGUgaW50ZXJzZWN0aW9uc1xyXG4gICAgaWYgKE1hdGguc2luKM6xMSkgKiBNYXRoLnNpbijOsTIpIDwgMCkgcmV0dXJuIG51bGw7IC8vIGFtYmlndW91cyBpbnRlcnNlY3Rpb25cclxuXHJcbiAgICAvL86xMSA9IE1hdGguYWJzKM6xMSk7XHJcbiAgICAvL86xMiA9IE1hdGguYWJzKM6xMik7XHJcbiAgICAvLyAuLi4gRWQgV2lsbGlhbXMgdGFrZXMgYWJzIG9mIM6xMS/OsTIsIGJ1dCBzZWVtcyB0byBicmVhayBjYWxjdWxhdGlvbj9cclxuXHJcbiAgICB2YXIgzrEzID0gTWF0aC5hY29zKC1NYXRoLmNvcyjOsTEpICogTWF0aC5jb3MozrEyKSArXHJcbiAgICAgIE1hdGguc2luKM6xMSkgKiBNYXRoLnNpbijOsTIpICogTWF0aC5jb3MozrQxMikpO1xyXG4gICAgdmFyIM60MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM60MTIpICogTWF0aC5zaW4ozrExKSAqIE1hdGguc2luKM6xMiksXHJcbiAgICAgIE1hdGguY29zKM6xMikgKyBNYXRoLmNvcyjOsTEpICogTWF0aC5jb3MozrEzKSk7XHJcbiAgICB2YXIgz4YzID0gTWF0aC5hc2luKE1hdGguc2luKM+GMSkgKiBNYXRoLmNvcyjOtDEzKSArXHJcbiAgICAgIE1hdGguY29zKM+GMSkgKiBNYXRoLnNpbijOtDEzKSAqIE1hdGguY29zKM64MTMpKTtcclxuICAgIHZhciDOlM67MTMgPSBNYXRoLmF0YW4yKE1hdGguc2luKM64MTMpICogTWF0aC5zaW4ozrQxMykgKiBNYXRoLmNvcyjPhjEpLFxyXG4gICAgICBNYXRoLmNvcyjOtDEzKSAtIE1hdGguc2luKM+GMSkgKiBNYXRoLnNpbijPhjMpKTtcclxuICAgIHZhciDOuzMgPSDOuzEgKyDOlM67MTM7XHJcbiAgICDOuzMgPSAozrszICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSAtIE1hdGguUEk7IC8vIG5vcm1hbGlzZSB0byAtMTgwLi4rMTgwwrpcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsYXQ6IM+GMy50b0RlZ3JlZXMoKSxcclxuICAgICAgbG5nOiDOuzMudG9EZWdyZWVzKClcclxuICAgIH07XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcndyaXRlcyBvYmoxJ3MgdmFsdWVzIHdpdGggb2JqMidzIGFuZCBhZGRzIG9iajIncyBpZiBub24gZXhpc3RlbnQgaW4gb2JqMVxyXG4gICAqIEBwYXJhbSBvYmoxXHJcbiAgICogQHBhcmFtIG9iajJcclxuICAgKiBAcmV0dXJucyBvYmozIGEgbmV3IG9iamVjdCBiYXNlZCBvbiBvYmoxIGFuZCBvYmoyXHJcbiAgICovXHJcbiAgX21lcmdlX29wdGlvbnM6IGZ1bmN0aW9uKG9iajEsIG9iajIpIHtcclxuICAgIGxldCBvYmozID0ge307XHJcbiAgICBmb3IgKGxldCBhdHRybmFtZSBpbiBvYmoxKSB7XHJcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMVthdHRybmFtZV07XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBhdHRybmFtZSBpbiBvYmoyKSB7XHJcbiAgICAgIG9iajNbYXR0cm5hbWVdID0gb2JqMlthdHRybmFtZV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqMztcclxuICB9XHJcbn0pO1xyXG5cclxuTC5nZW9kZXNpYyA9IGZ1bmN0aW9uKGxhdGxuZ3MsIG9wdGlvbnMpIHtcclxuICByZXR1cm4gbmV3IEwuR2VvZGVzaWMobGF0bG5ncywgb3B0aW9ucyk7XHJcbn07XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL0xlYWZsZXQuR2VvZGVzaWMvTGVhZmxldC5HZW9kZXNpYy5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvTGVhZmxldC5HZW9kZXNpYy9MZWFmbGV0Lkdlb2Rlc2ljLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\n"); /***/ }), @@ -338,21 +338,21 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cclxucmVxdWlyZSgnLi9jb21tb24nKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("/**\r\n *\r\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\r\n * Generic formatter to prepend\r\n * @param value\r\n * @param prepend\r\n * @returns {*}\r\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\r\n * Format minutes into HHh MMm\r\n * @param value\r\n * @returns {string}\r\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqXHJcbiAqL1xyXG5cclxuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmb3JtYXR0ZXIgdG8gcHJlcGVuZFxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIHByZXBlbmRcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XHJcbiAgICByZXR1cm4gcHJlcGVuZCArIHZhbHVlXHJcbn07XHJcblxyXG4vKipcclxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XHJcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcclxuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcGFyYW0gbGVuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcclxufTtcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIGxlblxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHtcclxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XHJcbn07XHJcblxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHZhbHVlXHJcbiAqIEBwYXJhbSBsZW5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XHJcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), /***/ "./resources/js/frontend/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IjtBQUNBLG1CQUFBQSxDQUFRLDZCQUFSOztBQUVBO0FBQ0FDLE9BQU9DLE1BQVAsQ0FBY0MsR0FBZCxHQUFvQixtQkFBQUgsQ0FBUSw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XG5cbi8vIEltcG9ydCB0aGUgbWFwcGluZyBmdW5jdGlvblxud2luZG93LnBocHZtcy5tYXAgPSByZXF1aXJlKCcuLi9tYXBzL2luZGV4Jyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); +eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsIm1hcCJdLCJtYXBwaW5ncyI6IjtBQUNBLG1CQUFBQSxDQUFRLDZCQUFSOztBQUVBO0FBQ0FDLE9BQU9DLE1BQVAsQ0FBY0MsR0FBZCxHQUFvQixtQkFBQUgsQ0FBUSw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcclxuXHJcbi8vIEltcG9ydCB0aGUgbWFwcGluZyBmdW5jdGlvblxyXG53aW5kb3cucGhwdm1zLm1hcCA9IHJlcXVpcmUoJy4uL21hcHMvaW5kZXgnKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); /***/ }), @@ -360,7 +360,7 @@ eval("\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the m /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZW5kZXIgYSBtYXAgd2l0aCB0aGUgYWlyc3BhY2UsIGV0YyBhcm91bmQgYSBnaXZlbiBzZXQgb2YgY29vcmRzXG4gKiBlLmcsIHRoZSBhaXJwb3J0IG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgcGFyYW1zOiB7fVxuICAgIH0sXG4gIH0sIG9wdHMpO1xuXG4gIGxldCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZihvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcbiAgfVxuXG4gIHJldHVybiBtYXA7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvYWlyc3BhY2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\r\n * Render a map with the airspace, etc around a given set of coords\r\n * e.g, the airport map\r\n * @param opts\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTtBQUN2QkEsU0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ25CQyxpQkFBYSxLQURNO0FBRW5CQyxrQkFBYyxFQUZLO0FBR25CQyxTQUFLLENBSGM7QUFJbkJDLFNBQUssQ0FKYztBQUtuQkMsVUFBTSxFQUxhO0FBTW5CQyxZQUFRLEVBTlc7QUFPbkJDLGdCQUFZLElBUE87QUFRbkJDLGtCQUFjLEVBUks7O0FBVW5CO0FBQ0FDLGVBQVc7QUFDUEMsV0FBSyxFQURFO0FBRVBDLGNBQVE7QUFGRDtBQVhRLEdBQWQsRUFlSmIsSUFmSSxDQUFQOztBQWlCQSxNQUFJYyxNQUFNLGtFQUFBQyxDQUFjZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyxJQUFBLHFFQUFBQSxDQUFZVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNIOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHsgYWRkV01TTGF5ZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciBhIG1hcCB3aXRoIHRoZSBhaXJzcGFjZSwgZXRjIGFyb3VuZCBhIGdpdmVuIHNldCBvZiBjb29yZHNcclxuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcclxuICAgIGxhdDogMCxcclxuICAgIGxvbjogMCxcclxuICAgIHpvb206IDEyLFxyXG4gICAgbGF5ZXJzOiBbXSxcclxuICAgIHNldF9tYXJrZXI6IHRydWUsXHJcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxyXG5cclxuICAgIC8vIFBhc3NlZCBmcm9tIHRoZSBjb25maWcvbWFwcy5waHAgZmlsZVxyXG4gICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgdXJsOiAnJyxcclxuICAgICAgICBwYXJhbXM6IHt9XHJcbiAgICB9LFxyXG4gIH0sIG9wdHMpO1xyXG5cclxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcclxuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcclxuICBjb25zb2xlLmxvZygnQXBwbHlpbmcgY29vcmRzJywgY29vcmRzKTtcclxuXHJcbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xyXG4gIGlmIChvcHRzLnNldF9tYXJrZXIgPT09IHRydWUpIHtcclxuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xyXG4gIH1cclxuXHJcbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xyXG4gICAgICBhZGRXTVNMYXllcihtYXAsIG9wdHMubWV0YXJfd21zKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBtYXA7XHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -368,7 +368,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLG1CQUFBQSxDQUFRLHVEQUFSOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xuXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxuICAgICAgICB6b29tOiA1LFxuICAgICAgICBtYXhab29tOiAxMCxcbiAgICAgICAgbGF5ZXJzOiBbXSxcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgICAgICBdLFxuICAgICAgICB0aWxlX2xheWVyczogW10sXG4gICAgfSwgb3B0cyk7XG5cbiAgICAvKlxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgICAgXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3dtc1wiLCB7XG4gICAgICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgICAgbGF5ZXJzOiAnb3BlbmFpcF9hcHByb3ZlZF9haXJzcGFjZXNfbGFiZWxzJyxcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgICAgc3ViZG9tYWluczogJzEyJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgLy9sYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxuICAgICAgICB6b29tOiBvcHRzLnpvb20sXG4gICAgICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBmb3IoY29uc3QgaSBpbiBvcHRzLnByb3ZpZGVycykge1xuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\r\n let feature_groups = [];\r\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\r\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\r\n maxZoom: 14,\r\n minZoom: 12,\r\n layers: 'openaip_approved_airspaces_labels',\r\n tileSize: 1024,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\r\n maxZoom: 14,\r\n minZoom: 4,\r\n tms: true,\r\n detectRetina: true,\r\n subdomains: '12',\r\n format: 'image/png',\r\n transparent: true\r\n });\r\n feature_groups.push(openaip_cached_basemap);\r\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjtBQUNBLG1CQUFBQSxDQUFRLHVEQUFSOztBQUVBLHlEQUFlLFVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXHJcblxyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcclxuXHJcbiAgICBvcHRzID0gT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxyXG4gICAgICAgIHpvb206IDUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTAsXHJcbiAgICAgICAgbGF5ZXJzOiBbXSxcclxuICAgICAgICBzZXRfbWFya2VyOiBmYWxzZSxcclxuICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdGlsZV9sYXllcnM6IFtdLFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgLypcclxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xyXG4gICAgY29uc3Qgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMgPSBuZXcgbGVhZmxldC5UaWxlTGF5ZXIuV01TKFxyXG4gICAgICAgIFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS93bXNcIiwge1xyXG4gICAgICAgICAgICBtYXhab29tOiAxNCxcclxuICAgICAgICAgICAgbWluWm9vbTogMTIsXHJcbiAgICAgICAgICAgIGxheWVyczogJ29wZW5haXBfYXBwcm92ZWRfYWlyc3BhY2VzX2xhYmVscycsXHJcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxyXG4gICAgICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXHJcbiAgICAgICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXHJcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsqL1xyXG5cclxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xyXG4gICAgICAgIG1heFpvb206IDE0LFxyXG4gICAgICAgIG1pblpvb206IDQsXHJcbiAgICAgICAgdG1zOiB0cnVlLFxyXG4gICAgICAgIGRldGVjdFJldGluYTogdHJ1ZSxcclxuICAgICAgICBzdWJkb21haW5zOiAnMTInLFxyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWVcclxuICAgIH0pO1xyXG5cclxuICAgIGZlYXR1cmVfZ3JvdXBzLnB1c2gob3BlbmFpcF9jYWNoZWRfYmFzZW1hcCk7XHJcbiAgICAqL1xyXG5cclxuICAgIGxldCBtYXAgPSBsZWFmbGV0Lm1hcCgnbWFwJywge1xyXG4gICAgICAgIC8vbGF5ZXJzOiBbb3BlbmFpcF9iYXNlbWFwX3BoeXNfb3NtXSxcclxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxyXG4gICAgICAgIHpvb206IG9wdHMuem9vbSxcclxuICAgICAgICBzY3JvbGxXaGVlbFpvb206IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yKGNvbnN0IGkgaW4gb3B0cy5wcm92aWRlcnMpIHtcclxuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFwO1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -376,7 +376,7 @@ eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaf /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XHJcbiAgICBQTEFOX1JPVVRFX0NPTE9SID0gJyMwNDM3NTgnLFxyXG4gICAgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnLFxyXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -384,7 +384,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuXG4gICAgaWYob3B0cy51cmwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBmb3JtYXQ6ICdpbWFnZS9wbmcnLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgbWF4Wm9vbTogMTQsXG4gICAgICAgIG1pblpvb206IDQsXG4gICAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gICAgY29uc3QgbWxheWVyID0gbGVhZmxldC50aWxlTGF5ZXIud21zKFxuICAgICAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXNcbiAgICApO1xuXG4gICAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgICByZXR1cm4gbWxheWVyO1xufVxuXG4vKipcbiAqIFNob3cgYSBwb3B1cFxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\r\n * Add a WMS layer to a map. opts must be:\r\n * {\r\n * url: '',\r\n * params: {}\r\n * }\r\n * @param map\r\n * @param opts\r\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\r\n * Show a popup\r\n * @param feature\r\n * @param layer\r\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVSxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFoQjs7QUFFQTs7Ozs7Ozs7O0FBU08sU0FBU0MsV0FBVCxDQUFxQkMsR0FBckIsRUFBMEJDLElBQTFCLEVBQWdDOztBQUVuQyxRQUFHQSxLQUFLQyxHQUFMLEtBQWEsRUFBaEIsRUFBb0I7QUFDaEI7QUFDSDs7QUFFREQsU0FBS0UsTUFBTCxHQUFjQyxPQUFPQyxNQUFQLENBQWM7QUFDeEJDLGdCQUFRLFdBRGdCO0FBRXhCQyxxQkFBYSxJQUZXO0FBR3hCQyxpQkFBUyxFQUhlO0FBSXhCQyxpQkFBUztBQUplLEtBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLFFBQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ1hYLEtBQUtDLEdBRE0sRUFDREQsS0FBS0UsTUFESixDQUFmOztBQUlBTyxXQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsV0FBT1UsTUFBUDtBQUNIOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSUMsYUFBYSxFQUFqQjtBQUNBLFFBQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2hERixzQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDSDs7QUFFREgsVUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDSCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBXTVMgbGF5ZXIgdG8gYSBtYXAuIG9wdHMgbXVzdCBiZTpcclxuICoge1xyXG4gKiAgdXJsOiAnJyxcclxuICogIHBhcmFtczoge31cclxuICogIH1cclxuICogQHBhcmFtIG1hcFxyXG4gKiBAcGFyYW0gb3B0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xyXG5cclxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgbWF4Wm9vbTogMTQsXHJcbiAgICAgICAgbWluWm9vbTogNCxcclxuICAgIH0sIG9wdHMucGFyYW1zKTtcclxuXHJcbiAgICBjb25zdCBtbGF5ZXIgPSBsZWFmbGV0LnRpbGVMYXllci53bXMoXHJcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXHJcbiAgICApO1xyXG5cclxuICAgIG1sYXllci5hZGRUbyhtYXApO1xyXG5cclxuICAgIHJldHVybiBtbGF5ZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaG93IGEgcG9wdXBcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0ZlYXR1cmVQb3B1cChmZWF0dXJlLCBsYXllcikge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -392,7 +392,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\r\n * All of the functionality required for maps\r\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBVyxtQkFBQUMsQ0FBUSw0Q0FBUixDQUFYO0FBQ0EsbUJBQUFBLENBQVEscURBQVI7QUFDQSxtQkFBQUEsQ0FBUSwrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgZm9yIG1hcHNcclxuICovXHJcblxyXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcclxucmVxdWlyZSgnTGVhZmxldC5HZW9kZXNpYycpO1xyXG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcclxuXHJcbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJ1xyXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXHJcbmltcG9ydCByZW5kZXJfcm91dGVfbWFwIGZyb20gJy4vcm91dGVfbWFwJ1xyXG5cclxuZXhwb3J0IHtcclxuICByZW5kZXJfYWlyc3BhY2VfbWFwLFxyXG4gIHJlbmRlcl9saXZlX21hcCxcclxuICByZW5kZXJfcm91dGVfbWFwLFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -400,7 +400,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\n * Controller for two-way bindings\n * @type {{focusMarker: focusMarker}}\n */\n var mapController = {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\n html: '
' + rte.airports.d.icao + '
'\n });\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTs7QUFFQSxJQUFNQSxTQUFTLG1CQUFBQyxDQUFRLHNDQUFSLENBQWY7QUFDQSxJQUFNQyxVQUFVLG1CQUFBRCxDQUFRLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBUyxtQkFBQUYsQ0FBUSxzQ0FBUixDQUFmOztBQUVBO0FBQ0E7O0FBRUE7Ozs7O0FBS0EseURBQWUsVUFBQ0csSUFBRCxFQUFVOztBQUVyQkEsV0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ2pCQyxnQkFBUSxDQUFDLFFBQUQsRUFBVyxDQUFDLFFBQVosQ0FEUztBQUVqQkMsY0FBTSxDQUZXO0FBR2pCQyxvQkFBWSxZQUhLO0FBSWpCQyxtQkFBVyxrQkFKTTtBQUtqQkMsd0JBQWdCLGNBTEM7QUFNakJDLG1CQUFXLElBTk07QUFPakJDLHFCQUFhLEtBUEk7QUFRakJDLHVCQUFlLGdDQVJFO0FBU2pCQyxlQUFPO0FBVFUsS0FBZCxFQVVKWCxJQVZJLENBQVA7O0FBWUEsUUFBTVksTUFBTSxrRUFBQUMsQ0FBY2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9CQUFZLENBQUMsRUFBRCxFQUFLLEVBQUw7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LENBQW9CLGtCQUFVO0FBQzFCZix5QkFBYXNDLE1BQWIsQ0FBb0I7QUFDaEJyQyx3QkFBUUEsT0FBT3NDLElBREM7QUFFaEJrQiwwQkFBV3hELE9BQU9zQyxJQUFQLENBQVltQixNQUFaLEdBQXFCO0FBRmhCLGFBQXBCO0FBSUgsU0FMRDtBQU1ILEtBbEVEOztBQW9FQWpCO0FBQ0FrQixnQkFBWWxCLFNBQVosRUFBdUIsS0FBdkI7QUFDSCxDQXpNRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9cblxuY29uc3QgZ2VvbGliID0gcmVxdWlyZSgnZ2VvbGliJyk7XG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IgfSBmcm9tICcuL2NvbmZpZydcblxuLyoqXG4gKiBSZW5kZXIgdGhlIGxpdmUgbWFwXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgICAgIHpvb206IDUsXG4gICAgICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICAgICAgcGlyZXBfdXJpOiAnL2FwaS9waXJlcHMve2lkfScsXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcG9zaXRpb25zOiBudWxsLFxuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxuICAgICAgICB1bml0czogJ25taScsXG4gICAgfSwgb3B0cyk7XG5cbiAgICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICAgIGNvbnN0IGFpcmNyYWZ0SWNvbiA9IGxlYWZsZXQuaWNvbih7XG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgICAgICBpY29uQW5jaG9yOiBbMjEsIDIxXSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEhvbGQgdGhlIG1hcmtlcnNcbiAgICAgKiBAdHlwZSB7e319XG4gICAgICovXG4gICAgbGV0IG1hcmtlcnNfbGlzdCA9IHt9O1xuXG4gICAgbGV0IHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG5cbiAgICBsZXQgbGF5ZXJGbGlnaHRzID0gbnVsbDtcbiAgICBsZXQgbGF5ZXJTZWxGbGlnaHQgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodExheWVyID0gbnVsbDtcbiAgICBsZXQgbGF5ZXJTZWxBcnIgPSBudWxsO1xuICAgIGxldCBsYXllclNlbERlcCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sbGVyIGZvciB0d28td2F5IGJpbmRpbmdzXG4gICAgICogQHR5cGUge3tmb2N1c01hcmtlcjogZm9jdXNNYXJrZXJ9fVxuICAgICAqL1xuICAgIGNvbnN0IG1hcENvbnRyb2xsZXIgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1cyBvbiBhIHNwZWNpZmljIG1hcmtlclxuICAgICAgICAgKiBAcGFyYW0gZVxuICAgICAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzTWFya2VyOiAoZSwgbW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmKCEobW9kZWwucGlyZXAuaWQgaW4gbWFya2Vyc19saXN0KSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXJrZXIgbm90IGZvdW5kIGluIGxpc3QnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XG4gICAgICAgICAgICBvbkZsaWdodENsaWNrKG1hcmtlclswXSwgbWFya2VyWzFdKTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcl9tYXBfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwge3BpcmVwOiB7fSwgY29udHJvbGxlcjogbWFwQ29udHJvbGxlcn0pO1xuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW10sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgICAqIEBwYXJhbSBmZWF0dXJlXG4gICAgICogQHBhcmFtIGxheWVyXG4gICAgICovXG4gICAgY29uc3Qgb25GbGlnaHRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xuICAgICAgICBjb25zdCBnZW9qc29uX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpICsgXCIvYWNhcnMvZ2VvanNvblwiO1xuXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGdlb2pzb25fdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXG4gICAgICAgICQud2hlbihmbGlnaHRfcm91dGUpLmRvbmUoKHJ0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICAgICAgICAgICAgICAvL21hcC5yZW1vdmVMYXllcihsYXllclNlbEFycik7XG4gICAgICAgICAgICAgICAgLy9tYXAucmVtb3ZlTGF5ZXIobGF5ZXJTZWxEZXApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodCA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC45LFxuICAgICAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgICAgICB9KS5hZGRUbyhtYXApO1xuXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJ0ZS5saW5lKTtcbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgICAgICBsYXllclNlbEZsaWdodExheWVyID0gbGF5ZXI7XG5cbiAgICAgICAgICAgIC8qY29uc3QgZHB0SWNvbiA9IGxlYWZsZXQuZGl2SWNvbih7XG4gICAgICAgICAgICAgICAgaHRtbDogJzxkaXYgY2xhc3M9XCJtYXAtaW5mby1sYWJlbFwiPjxoNT4nICsgcnRlLmFpcnBvcnRzLmQuaWNhbyArICc8L2g1PjwvZGl2PidcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsYXllclNlbERlcCA9IGxlYWZsZXQubWFya2VyKFtydGUuYWlycG9ydHMuZC5sYXQsIHJ0ZS5haXJwb3J0cy5kLmxvbl0sIHtpY29uOmRwdEljb259KS5hZGRUbyhtYXApO1xuICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gQ2VudGVyIG9uIGl0LCBidXQgb25seSBkbyBpdCBvbmNlLCBpbiBjYXNlIHRoZSBtYXAgaXMgbW92ZWRcbiAgICAgICAgICAgIGlmKCFwYW5uZWRUb0NlbnRlcikge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgY2VudGVyXG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGdlb2xpYi5nZXRDZW50ZXIoW1xuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuYS5sb259LFxuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuZC5sb259LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgLy9tYXAucGFuVG8oe2xhdDogYy5sYXRpdHVkZSwgbG5nOiBjLmxvbmdpdHVkZX0pO1xuICAgICAgICAgICAgICAgIG1hcC5wYW5Ubyh7bGF0OiBydGUucG9zaXRpb24ubGF0LCBsbmc6IHJ0ZS5wb3NpdGlvbi5sb259KTtcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gdGhlIFBJUkVQIGluZm8gaXMgZG9uZSBsb2FkaW5nLCBzaG93IHRoZSBib3R0b20gYmFyXG4gICAgICAgIC8vXG4gICAgICAgICQud2hlbihwaXJlcF9pbmZvKS5kb25lKHBpcmVwID0+IHtcbiAgICAgICAgICAgIHJfbWFwX3ZpZXcudXBkYXRlKHtwaXJlcDpwaXJlcC5kYXRhfSk7XG4gICAgICAgICAgICAkKCcjbWFwLWluZm8tYm94Jykuc2hvdygpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlTWFwID0gKCkgPT4ge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZWxvYWRpbmcgZmxpZ2h0cyBmcm9tIGFjYXJzLi4uJyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFKQVggVVBEQVRFXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBwaXJlcF91cmkgPSBvcHRzLnBpcmVwX3VyaS5yZXBsYWNlKCd7aWR9JywgJycpO1xuICAgICAgICBsZXQgcGlyZXBzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogcGlyZXBfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZmxpZ2h0cyA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IG9wdHMudXBkYXRlX3VyaSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC53aGVuKGZsaWdodHMpLmRvbmUoZmxpZ2h0R2VvSnNvbiA9PiB7XG5cbiAgICAgICAgICAgIGlmIChsYXllckZsaWdodHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xuICAgICAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsYXllci5vbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2soZmVhdHVyZSwgbGF5ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgKGZlYXR1cmUucHJvcGVydGllcy5wb3B1cCAhPT0gJycgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJzX2xpc3RbZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkXSA9IFtmZWF0dXJlLCBsYXllcl07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJGbGlnaHRzLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgY2xpY2tlZC1mbGlnaHQgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4ocGlyZXBzKS5kb25lKHBpcmVwcyA9PiB7XG4gICAgICAgICAgICByX3RhYmxlX3ZpZXcudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxuICAgICAgICAgICAgICAgIGhhc19kYXRhOiAocGlyZXBzLmRhdGEubGVuZ3RoID4gMCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZU1hcCgpO1xuICAgIHNldEludGVydmFsKHVwZGF0ZU1hcCwgMTAwMDApXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\r\n * Render the live map\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\r\n * Hold the markers\r\n * @type {{}}\r\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\r\n * Controller for two-way bindings\r\n * @type {{focusMarker: focusMarker}}\r\n */\n var mapController = {\n /**\r\n * Focus on a specific marker\r\n * @param e\r\n * @param model\r\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\r\n * When a flight is clicked on, show the path, etc for that flight\r\n * @param feature\r\n * @param layer\r\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\r\n html: '
' + rte.airports.d.icao + '
'\r\n });\r\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\r\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\r\n * AJAX UPDATE\r\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTs7QUFFQSxJQUFNQSxTQUFTLG1CQUFBQyxDQUFRLHNDQUFSLENBQWY7QUFDQSxJQUFNQyxVQUFVLG1CQUFBRCxDQUFRLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBUyxtQkFBQUYsQ0FBUSxzQ0FBUixDQUFmOztBQUVBO0FBQ0E7O0FBRUE7Ozs7O0FBS0EseURBQWUsVUFBQ0csSUFBRCxFQUFVOztBQUVyQkEsV0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ2pCQyxnQkFBUSxDQUFDLFFBQUQsRUFBVyxDQUFDLFFBQVosQ0FEUztBQUVqQkMsY0FBTSxDQUZXO0FBR2pCQyxvQkFBWSxZQUhLO0FBSWpCQyxtQkFBVyxrQkFKTTtBQUtqQkMsd0JBQWdCLGNBTEM7QUFNakJDLG1CQUFXLElBTk07QUFPakJDLHFCQUFhLEtBUEk7QUFRakJDLHVCQUFlLGdDQVJFO0FBU2pCQyxlQUFPO0FBVFUsS0FBZCxFQVVKWCxJQVZJLENBQVA7O0FBWUEsUUFBTVksTUFBTSxrRUFBQUMsQ0FBY2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9CQUFZLENBQUMsRUFBRCxFQUFLLEVBQUw7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LENBQW9CLGtCQUFVO0FBQzFCZix5QkFBYXNDLE1BQWIsQ0FBb0I7QUFDaEJyQyx3QkFBUUEsT0FBT3NDLElBREM7QUFFaEJrQiwwQkFBV3hELE9BQU9zQyxJQUFQLENBQVltQixNQUFaLEdBQXFCO0FBRmhCLGFBQXBCO0FBSUgsU0FMRDtBQU1ILEtBbEVEOztBQW9FQWpCO0FBQ0FrQixnQkFBWWxCLFNBQVosRUFBdUIsS0FBdkI7QUFDSCxDQXpNRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy9cclxuXHJcbmNvbnN0IGdlb2xpYiA9IHJlcXVpcmUoJ2dlb2xpYicpO1xyXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcclxuXHJcbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXHJcbmltcG9ydCB7IEFDVFVBTF9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgbGl2ZSBtYXBcclxuICogQHBhcmFtIG9wdHNcclxuICogQHByaXZhdGVcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XHJcblxyXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxyXG4gICAgICAgIHpvb206IDUsXHJcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxyXG4gICAgICAgIHBpcmVwX3VyaTogJy9hcGkvcGlyZXBzL3tpZH0nLFxyXG4gICAgICAgIHBpcmVwX2xpbmtfdXJpOiAnL3BpcmVwcy97aWR9JyxcclxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXHJcbiAgICAgICAgcmVuZGVyX2VsZW06ICdtYXAnLFxyXG4gICAgICAgIGFpcmNyYWZ0X2ljb246ICcvYXNzZXRzL2ltZy9hY2Fycy9haXJjcmFmdC5wbmcnLFxyXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcclxuICAgIH0sIG9wdHMpO1xyXG5cclxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xyXG4gICAgICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcclxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXHJcbiAgICAgICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhvbGQgdGhlIG1hcmtlcnNcclxuICAgICAqIEB0eXBlIHt7fX1cclxuICAgICAqL1xyXG4gICAgbGV0IG1hcmtlcnNfbGlzdCA9IHt9O1xyXG5cclxuICAgIGxldCBwYW5uZWRUb0NlbnRlciA9IGZhbHNlO1xyXG5cclxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0ID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xyXG4gICAgbGV0IGxheWVyU2VsQXJyID0gbnVsbDtcclxuICAgIGxldCBsYXllclNlbERlcCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9sbGVyIGZvciB0d28td2F5IGJpbmRpbmdzXHJcbiAgICAgKiBAdHlwZSB7e2ZvY3VzTWFya2VyOiBmb2N1c01hcmtlcn19XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG1hcENvbnRyb2xsZXIgPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRm9jdXMgb24gYSBzcGVjaWZpYyBtYXJrZXJcclxuICAgICAgICAgKiBAcGFyYW0gZVxyXG4gICAgICAgICAqIEBwYXJhbSBtb2RlbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZvY3VzTWFya2VyOiAoZSwgbW9kZWwpID0+IHtcclxuICAgICAgICAgICAgaWYoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbWFya2VyIG5vdCBmb3VuZCBpbiBsaXN0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XHJcbiAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHJfbWFwX3ZpZXcgPSByaXZldHMuYmluZCgkKCcjbWFwLWluZm8tYm94JyksIHtwaXJlcDoge30sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcclxuICAgIGNvbnN0IHJfdGFibGVfdmlldyA9IHJpdmV0cy5iaW5kKCQoJyNsaXZlX2ZsaWdodHMnKSwge3BpcmVwczogW10sIGNvbnRyb2xsZXI6IG1hcENvbnRyb2xsZXJ9KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxyXG4gICAgICogQHBhcmFtIGZlYXR1cmVcclxuICAgICAqIEBwYXJhbSBsYXllclxyXG4gICAgICovXHJcbiAgICBjb25zdCBvbkZsaWdodENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpO1xyXG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHBpcmVwX2luZm8gPSAkLmFqYXgoe1xyXG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZsaWdodF9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2FkIHVwIHRoZSBQSVJFUCBpbmZvXHJcbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocnRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcclxuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsQXJyKTtcclxuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRGVwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHQgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDUsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XHJcblxyXG4gICAgICAgICAgICBsYXllclNlbEZsaWdodC5nZW9Kc29uKHJ0ZS5saW5lKTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRMYXllciA9IGxheWVyO1xyXG5cclxuICAgICAgICAgICAgLypjb25zdCBkcHRJY29uID0gbGVhZmxldC5kaXZJY29uKHtcclxuICAgICAgICAgICAgICAgIGh0bWw6ICc8ZGl2IGNsYXNzPVwibWFwLWluZm8tbGFiZWxcIj48aDU+JyArIHJ0ZS5haXJwb3J0cy5kLmljYW8gKyAnPC9oNT48L2Rpdj4nXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGF5ZXJTZWxEZXAgPSBsZWFmbGV0Lm1hcmtlcihbcnRlLmFpcnBvcnRzLmQubGF0LCBydGUuYWlycG9ydHMuZC5sb25dLCB7aWNvbjpkcHRJY29ufSkuYWRkVG8obWFwKTtcclxuICAgICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgICAgIC8vIENlbnRlciBvbiBpdCwgYnV0IG9ubHkgZG8gaXQgb25jZSwgaW4gY2FzZSB0aGUgbWFwIGlzIG1vdmVkXHJcbiAgICAgICAgICAgIGlmKCFwYW5uZWRUb0NlbnRlcikge1xyXG4gICAgICAgICAgICAgICAgLy8gZmluZCBjZW50ZXJcclxuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZW9saWIuZ2V0Q2VudGVyKFtcclxuICAgICAgICAgICAgICAgICAgICB7bGF0aXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxhdCwgbG9uZ2l0dWRlOiBydGUuYWlycG9ydHMuYS5sb259LFxyXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmQubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxvbn0sXHJcbiAgICAgICAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL21hcC5wYW5Ubyh7bGF0OiBjLmxhdGl0dWRlLCBsbmc6IGMubG9uZ2l0dWRlfSk7XHJcbiAgICAgICAgICAgICAgICBtYXAucGFuVG8oe2xhdDogcnRlLnBvc2l0aW9uLmxhdCwgbG5nOiBydGUucG9zaXRpb24ubG9ufSk7XHJcbiAgICAgICAgICAgICAgICBwYW5uZWRUb0NlbnRlciA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXaGVuIHRoZSBQSVJFUCBpbmZvIGlzIGRvbmUgbG9hZGluZywgc2hvdyB0aGUgYm90dG9tIGJhclxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xyXG4gICAgICAgICAgICByX21hcF92aWV3LnVwZGF0ZSh7cGlyZXA6cGlyZXAuZGF0YX0pO1xyXG4gICAgICAgICAgICAkKCcjbWFwLWluZm8tYm94Jykuc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZWxvYWRpbmcgZmxpZ2h0cyBmcm9tIGFjYXJzLi4uJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFKQVggVVBEQVRFXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsICcnKTtcclxuICAgICAgICBsZXQgcGlyZXBzID0gJC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgZmxpZ2h0cyA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGZsaWdodHMpLmRvbmUoZmxpZ2h0R2VvSnNvbiA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJGbGlnaHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsYXllckZsaWdodHMgPSBsZWFmbGV0Lmdlb0pTT04oZmxpZ2h0R2VvSnNvbiwge1xyXG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIub24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGljazogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3B1cF9odG1sID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlcnNfbGlzdFtmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWRdID0gW2ZlYXR1cmUsIGxheWVyXTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5hZGRUbyhtYXApO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxyXG4gICAgICAgICAgICBpZiAobGF5ZXJTZWxGbGlnaHQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobGF5ZXJTZWxGbGlnaHRGZWF0dXJlLCBsYXllclNlbEZsaWdodExheWVyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQud2hlbihwaXJlcHMpLmRvbmUocGlyZXBzID0+IHtcclxuICAgICAgICAgICAgcl90YWJsZV92aWV3LnVwZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBwaXJlcHM6IHBpcmVwcy5kYXRhLFxyXG4gICAgICAgICAgICAgICAgaGFzX2RhdGE6IChwaXJlcHMuZGF0YS5sZW5ndGggPiAwKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZU1hcCgpO1xyXG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -408,7 +408,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\r\n * Show some popup text when a feature is clicked on\r\n * @param feature\r\n * @param layer\r\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\r\n * Show each point as a marker\r\n * @param feature\r\n * @param latlng\r\n * @returns {*}\r\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\r\n *\r\n * @param opts\r\n * @private\r\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\r\n * draw the actual route\r\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\r\n *\r\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsInN0ZXBzIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImZpdEJvdW5kcyIsImdldEJvdW5kcyIsImUiLCJjb25zb2xlIiwibG9nIiwiZ2VvSlNPTiIsIm9uRWFjaEZlYXR1cmUiLCJzdHlsZSIsImZlYXR1cmVzIiwibGVuZ3RoIiwibGl2ZUZsaWdodCIsInVyaSIsInBpcmVwX3VyaSIsImxpdmVfcm91dGUiLCIkIiwiYWpheCIsImRhdGFUeXBlIiwiZXJyb3IiLCJ3aGVuIiwiZG9uZSIsInJvdXRlSnNvbiIsImxhdGxvbiIsIm1hcmtlciIsInJvdGF0aW9uQW5nbGUiLCJoZWFkaW5nIiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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QVUsVUFBRUksSUFBRixDQUFPTCxVQUFQLEVBQW1CTSxJQUFuQixDQUF3QixVQUFDQyxTQUFELEVBQWU7QUFDbkM1Qiw4QkFBa0J0QyxRQUFRbUQsT0FBUixDQUFnQmUsU0FBaEIsRUFBMkI7QUFDekN6RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQmdFLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPbkUsUUFBUW9FLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQm5DLDhCQUFNRCxZQURvQjtBQUUxQnNDLHVDQUFlbEUsUUFBUUcsVUFBUixDQUFtQmdFO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWhDLDRCQUFnQk0sS0FBaEIsQ0FBc0JSLEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQW1DLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xyXG5cclxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcclxuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcclxuXHJcbmltcG9ydCB7QUNUVUFMX1JPVVRFX0NPTE9SLCBDSVJDTEVfQ09MT1IsIFBMQU5fUk9VVEVfQ09MT1J9IGZyb20gJy4vY29uZmlnJ1xyXG5cclxuLyoqXHJcbiAqIFNob3cgc29tZSBwb3B1cCB0ZXh0IHdoZW4gYSBmZWF0dXJlIGlzIGNsaWNrZWQgb25cclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxheWVyXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xyXG4gICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcclxuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XHJcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcclxuICAgIH1cclxuXHJcbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93IGVhY2ggcG9pbnQgYXMgYSBtYXJrZXJcclxuICogQHBhcmFtIGZlYXR1cmVcclxuICogQHBhcmFtIGxhdGxuZ1xyXG4gKiBAcmV0dXJucyB7Kn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XHJcbiAgICByZXR1cm4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XHJcbiAgICAgICAgcmFkaXVzOiA1LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxyXG4gICAgICAgIGNvbG9yOiAnIzAwMCcsXHJcbiAgICAgICAgd2VpZ2h0OiAxLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuOFxyXG4gICAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSBvcHRzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xyXG5cclxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcclxuICAgICAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxyXG4gICAgICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxyXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcclxuICAgICAgICBsaXZlX21hcDogZmFsc2UsXHJcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXHJcbiAgICAgICAgbWV0YXJfd21zOiB7XHJcbiAgICAgICAgICAgIHVybDogJycsXHJcbiAgICAgICAgICAgIHBhcmFtczoge31cclxuICAgICAgICB9LFxyXG4gICAgfSwgb3B0cyk7XHJcblxyXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcclxuICAgICAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXHJcbiAgICAgICAgaWNvblNpemU6IFs0MiwgNDJdLFxyXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XHJcbiAgICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xyXG5cclxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XHJcbiAgICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XHJcbiAgICAgICAgd2VpZ2h0OiA0LFxyXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcclxuICAgICAgICBjb2xvcjogUExBTl9ST1VURV9DT0xPUixcclxuICAgICAgICBzdGVwczogNTAsXHJcbiAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICB9KS5hZGRUbyhtYXApO1xyXG5cclxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBQTEFOX1JPVVRFX0NPTE9SLFxyXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXHJcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZ2VvZGVzaWNMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcclxuICAgICAgICAgICAgd2VpZ2h0OiAzLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXHJcbiAgICAgICAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgIHN0ZXBzOiA1MCxcclxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXHJcbiAgICAgICAgfSkuYWRkVG8obWFwKTtcclxuXHJcbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHJvdXRlX3BvaW50cyA9IGxlYWZsZXQuZ2VvSlNPTihvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMsIHtcclxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogb25GZWF0dXJlUG9pbnRDbGljayxcclxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAnY29sb3InOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXHJcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcclxuICAgICAgICAgICAgICAgICdvcGFjaXR5JzogMC42NSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGxpdmVGbGlnaHQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XHJcbiAgICAgICAgY29uc3QgbGl2ZV9yb3V0ZSA9ICQuYWpheCh7XHJcbiAgICAgICAgICAgIHVybDogdXJpLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC53aGVuKGxpdmVfcm91dGUpLmRvbmUoKHJvdXRlSnNvbikgPT4ge1xyXG4gICAgICAgICAgICBsYXllckxpdmVGbGlnaHQgPSBsZWFmbGV0Lmdlb0pTT04ocm91dGVKc29uLCB7XHJcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGFpcmNyYWZ0SWNvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodC5hZGRUbyhtYXApXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); /***/ }), diff --git a/public/assets/installer/css/vendor.css b/public/assets/installer/css/vendor.css index 7b87e764..821e5929 100644 --- a/public/assets/installer/css/vendor.css +++ b/public/assets/installer/css/vendor.css @@ -6799,31 +6799,31 @@ button.close { } /*# sourceMappingURL=bootstrap.css.map */ -/*! - - ========================================================= - * Now-ui-kit - v1.0.0 - ========================================================= - - * Product Page: http://www.creative-tim.com/product/now-ui-kit - * Copyright 2017 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) - - * Designed by www.invisionapp.com Coded by www.creative-tim.com - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +/*! + + ========================================================= + * Now-ui-kit - v1.0.0 + ========================================================= + + * Product Page: http://www.creative-tim.com/product/now-ui-kit + * Copyright 2017 Creative Tim (http://www.creative-tim.com) + * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + */ /* brand Colors */ /* light colors */ -/* ======================================================================== - * bootstrap-switch - v3.3.2 - * http://www.bootstrap-switch.org - * ======================================================================== - * Copyright 2012-2013 Mattia Larentis - * http://www.apache.org/licenses/LICENSE-2.0 +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * http://www.apache.org/licenses/LICENSE-2.0 */ .bootstrap-switch { display: inline-block; @@ -7094,14 +7094,14 @@ button.close { } /*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */ -/* Functional styling; - * These styles are required for noUiSlider to function. - * You don't need to change these rules to apply your design. +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. */ .noUi-target, .noUi-target * { -webkit-touch-callout: none; - -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-user-select: none; -ms-touch-action: none; touch-action: none; @@ -7154,8 +7154,8 @@ button.close { cursor: inherit !important; } -/* Painting and performance; - * Browsers can paint handles in their own layer. +/* Painting and performance; + * Browsers can paint handles in their own layer. */ .noUi-base, .noUi-handle { @@ -7163,7 +7163,7 @@ button.close { transform: translate3d(0, 0, 0); } -/* Slider size and handle placement; +/* Slider size and handle placement; */ .noUi-horizontal { height: 1px; @@ -7192,7 +7192,7 @@ button.close { top: -17px; } -/* Styling; +/* Styling; */ .noUi-target { background-color: rgba(182, 182, 182, 0.3); @@ -7206,7 +7206,7 @@ button.close { transition: background 450ms; } -/* Handles and cursors; +/* Handles and cursors; */ .noUi-draggable { cursor: ew-resize; @@ -7220,8 +7220,8 @@ button.close { border-radius: 3px; background: #FFF; cursor: default; - -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; - box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + -webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; -webkit-transition: 300ms ease 0s; -moz-transition: 300ms ease 0s; -ms-transition: 300ms ease 0s; @@ -7234,7 +7234,7 @@ button.close { transform: scale3d(1.5, 1.5, 1); } -/* Disabled state; +/* Disabled state; */ [disabled] .noUi-connect { background: #B8B8B8; @@ -7246,8 +7246,8 @@ button.close { cursor: not-allowed; } -/* Base; - * +/* Base; + * */ .noUi-pips, .noUi-pips * { @@ -7260,8 +7260,8 @@ button.close { color: #999; } -/* Values; - * +/* Values; + * */ .noUi-value { position: absolute; @@ -7273,8 +7273,8 @@ button.close { font-size: 10px; } -/* Markings; - * +/* Markings; + * */ .noUi-marker { position: absolute; @@ -7289,8 +7289,8 @@ button.close { background: #AAA; } -/* Horizontal layout; - * +/* Horizontal layout; + * */ .noUi-pips-horizontal { padding: 10px 0; @@ -7319,8 +7319,8 @@ button.close { height: 15px; } -/* Vertical layout; - * +/* Vertical layout; + * */ .noUi-pips-vertical { padding: 0 10px; @@ -7446,10 +7446,10 @@ button.close { background-color: #FF3636; } -/*! - * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) +/*! + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) */ .datepicker { padding: 8px 6px; @@ -8890,7 +8890,7 @@ fieldset[disabled] .form-group .form-control, .input-group .form-control { - margin-top: 2px; + /*margin-top: 2px;*/ padding: 4px 14px 4px 14px; } @@ -8999,17 +8999,17 @@ fieldset[disabled] background-color: #E3E3E3; } -/*.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-right: 0 none; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-left: 0 none; +/*.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child) { + border-left: 0 none; }*/ .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #E3E3E3; @@ -10556,12 +10556,12 @@ img { box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); } -/* -------------------------------- - -Nucleo Outline Web Font - nucleoapp.com/ -License - nucleoapp.com/license/ -Created using IcoMoon - icomoon.io - +/* -------------------------------- + +Nucleo Outline Web Font - nucleoapp.com/ +License - nucleoapp.com/license/ +Created using IcoMoon - icomoon.io + -------------------------------- */ @font-face { font-family: 'Nucleo Outline'; @@ -10571,8 +10571,8 @@ Created using IcoMoon - icomoon.io font-style: normal; } -/*------------------------ - base class definition +/*------------------------ + base class definition -------------------------*/ .now-ui-icons { display: inline-block; @@ -10585,11 +10585,11 @@ Created using IcoMoon - icomoon.io -moz-osx-font-smoothing: grayscale; } -/*------------------------ - change icon size +/*------------------------ + change icon size -------------------------*/ -/*---------------------------------- - add a square/circle background +/*---------------------------------- + add a square/circle background -----------------------------------*/ .now-ui-icons.circle { padding: 0.33333333em; @@ -10601,8 +10601,8 @@ Created using IcoMoon - icomoon.io border-radius: 50%; } -/*------------------------ - list icons +/*------------------------ + list icons -------------------------*/ .nc-icon-ul { padding-left: 0; @@ -10626,8 +10626,8 @@ Created using IcoMoon - icomoon.io left: -1.9047619em; } -/*------------------------ - spinning icons +/*------------------------ + spinning icons -------------------------*/ .now-ui-icons.spin { -webkit-animation: nc-icon-spin 2s infinite linear; @@ -10654,11 +10654,11 @@ Created using IcoMoon - icomoon.io } } -/*------------------------ - rotated/flipped icons +/*------------------------ + rotated/flipped icons -------------------------*/ -/*------------------------ - font icons +/*------------------------ + font icons -------------------------*/ .now-ui-icons.ui-1_check:before { content: "\EA22"; @@ -12469,21 +12469,21 @@ Created using IcoMoon - icomoon.io } } -/*.separator{ - content: "Separator"; - color: #FFFFFF; - display: block; - width: 100%; - padding: 20px; -} -.separator-line{ - background-color: #EEE; - height: 1px; - width: 100%; - display: block; -} -.separator.separator-gray{ - background-color: #EEEEEE; +/*.separator{ + content: "Separator"; + color: #FFFFFF; + display: block; + width: 100%; + padding: 20px; +} +.separator-line{ + background-color: #EEE; + height: 1px; + width: 100%; + display: block; +} +.separator.separator-gray{ + background-color: #EEEEEE; }*/ .social-buttons-demo .btn { margin-right: 5px; diff --git a/public/assets/installer/js/app.js b/public/assets/installer/js/app.js index 45ee171a..e87261eb 100644 --- a/public/assets/installer/js/app.js +++ b/public/assets/installer/js/app.js @@ -302,21 +302,21 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ "./resources/js/bootstrap.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\n 'X-CSRF-TOKEN': token.content\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG53aW5kb3cuYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIENvbnRhaW5lciBmb3IgcGhwVk1TIHNwZWNpZmljIGZ1bmN0aW9uc1xuICovXG53aW5kb3cucGhwdm1zID0ge307XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0LmJhc2VVUkwgPSBiYXNlX3VybDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XG4gIC8qd2luZG93LmpxdWVyeS5hamF4U2V0dXAoe1xuICAgICdYLUNTUkYtVE9LRU4nOiB0b2tlbi5jb250ZW50XG4gIH0pKi9cbn0gZWxzZSB7XG4gIGNvbnNvbGUuZXJyb3IoJ0NTUkYgdG9rZW4gbm90IGZvdW5kOiBodHRwczovL2xhcmF2ZWwuY29tL2RvY3MvY3NyZiNjc3JmLXgtY3NyZi10b2tlbicpXG59XG5cbmNvbnN0IGFwaV9rZXkgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImFwaS1rZXlcIl0nKTtcbmlmIChhcGlfa2V5KSB7XG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsneC1hcGkta2V5J10gPSBhcGlfa2V5LmNvbnRlbnQ7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gYXBpX2tleS5jb250ZW50XG59IGVsc2Uge1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGZhbHNlO1xuICBjb25zb2xlLmVycm9yKCdBUEkgS2V5IG5vdCBmb3VuZCEnKVxufVxuXG5yZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("/**\r\n * Bootstrap any Javascript libraries required\r\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\r\n * Container for phpVMS specific functions\r\n */\nwindow.phpvms = {};\n\n/**\r\n * Configure Axios with both the csrf token and the API key\r\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n window.axios.default.baseURL = base_url;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n /*window.jquery.ajaxSetup({\r\n 'X-CSRF-TOKEN': token.content\r\n })*/\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNvbnRlbnQiLCJjb25zb2xlIiwiZXJyb3IiLCJhcGlfa2V5IiwiUEhQVk1TX1VTRVJfQVBJX0tFWSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7QUFJQUEsT0FBT0MsS0FBUCxHQUFlLG1CQUFBQyxDQUFRLCtCQUFSLENBQWY7O0FBRUE7OztBQUdBRixPQUFPRyxNQUFQLEdBQWdCLEVBQWhCOztBQUVBOzs7O0FBSUEsSUFBTUMsV0FBV0MsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHVCQUE1QixDQUFqQjtBQUNBLElBQUdILFFBQUgsRUFBYTtBQUNYSixTQUFPQyxLQUFQLENBQWFPLE9BQWIsQ0FBcUJDLE9BQXJCLEdBQStCTCxRQUEvQjtBQUNEOztBQUVESixPQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxrQkFBckMsSUFBMkQsZ0JBQTNEO0FBQ0EsSUFBTUMsUUFBUVIsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkOztBQUVBLElBQUlNLEtBQUosRUFBVztBQUNUYixTQUFPQyxLQUFQLENBQWFTLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTUMsT0FBN0Q7QUFDQTs7O0FBR0QsQ0FMRCxNQUtPO0FBQ0xDLFVBQVFDLEtBQVIsQ0FBYyx1RUFBZDtBQUNEOztBQUVELElBQU1DLFVBQVVaLFNBQVNDLElBQVQsQ0FBY0MsYUFBZCxDQUE0QixzQkFBNUIsQ0FBaEI7QUFDQSxJQUFJVSxPQUFKLEVBQWE7QUFDWGpCLFNBQU9DLEtBQVAsQ0FBYVMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLFdBQXJDLElBQW9ESyxRQUFRSCxPQUE1RDtBQUNBZCxTQUFPa0IsbUJBQVAsR0FBNkJELFFBQVFILE9BQXJDO0FBQ0QsQ0FIRCxNQUdPO0FBQ0xkLFNBQU9rQixtQkFBUCxHQUE2QixLQUE3QjtBQUNBSCxVQUFRQyxLQUFSLENBQWMsb0JBQWQ7QUFDRDs7QUFFRCxtQkFBQWQsQ0FBUSwwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxyXG4gKi9cclxuXHJcbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XHJcblxyXG4vKipcclxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXHJcbiAqL1xyXG53aW5kb3cucGhwdm1zID0ge307XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcclxuICovXHJcblxyXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcclxuaWYoYmFzZV91cmwpIHtcclxuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmw7XHJcbn1cclxuXHJcbndpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcclxuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcclxuXHJcbmlmICh0b2tlbikge1xyXG4gIHdpbmRvdy5heGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vblsnWC1DU1JGLVRPS0VOJ10gPSB0b2tlbi5jb250ZW50XHJcbiAgLyp3aW5kb3cuanF1ZXJ5LmFqYXhTZXR1cCh7XHJcbiAgICAnWC1DU1JGLVRPS0VOJzogdG9rZW4uY29udGVudFxyXG4gIH0pKi9cclxufSBlbHNlIHtcclxuICBjb25zb2xlLmVycm9yKCdDU1JGIHRva2VuIG5vdCBmb3VuZDogaHR0cHM6Ly9sYXJhdmVsLmNvbS9kb2NzL2NzcmYjY3NyZi14LWNzcmYtdG9rZW4nKVxyXG59XHJcblxyXG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XHJcbmlmIChhcGlfa2V5KSB7XHJcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcclxuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxyXG59IGVsc2Uge1xyXG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XHJcbiAgY29uc29sZS5lcnJvcignQVBJIEtleSBub3QgZm91bmQhJylcclxufVxyXG5cclxucmVxdWlyZSgnLi9jb21tb24nKTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5cbmNvbnN0IHJpdmV0cyA9IHJlcXVpcmUoJ3JpdmV0cycpO1xuXG4vKipcbiAqIEdlbmVyaWMgZm9ybWF0dGVyIHRvIHByZXBlbmRcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByZXBlbmRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XG4gICAgcmV0dXJuIHByZXBlbmQgKyB2YWx1ZVxufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjApO1xuICAgIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5sdCA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IGxlbjtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmVxID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9jb21tb24uanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("/**\r\n *\r\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\r\n * Generic formatter to prepend\r\n * @param value\r\n * @param prepend\r\n * @returns {*}\r\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\r\n * Format minutes into HHh MMm\r\n * @param value\r\n * @returns {string}\r\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\r\n *\r\n * @param value\r\n * @param len\r\n * @returns {boolean}\r\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVMsbUJBQUFDLENBQVEsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ2xELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0gsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBU0QsS0FBVCxFQUFnQjtBQUN4QyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFPRSxRQUFRLElBQVIsR0FBZUcsSUFBZixHQUFzQixHQUE3QjtBQUNILENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCVyxFQUFsQixHQUF1QixVQUFDVCxLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQ7O0FBSUE7Ozs7OztBQU1BWCxPQUFPRSxVQUFQLENBQWtCWSxFQUFsQixHQUF1QixVQUFDVixLQUFELEVBQVFPLEdBQVIsRUFBZ0I7QUFDbkMsU0FBT1AsTUFBTVEsTUFBTixHQUFlRCxHQUF0QjtBQUNILENBRkQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqXHJcbiAqL1xyXG5cclxuY29uc3Qgcml2ZXRzID0gcmVxdWlyZSgncml2ZXRzJyk7XHJcblxyXG4vKipcclxuICogR2VuZXJpYyBmb3JtYXR0ZXIgdG8gcHJlcGVuZFxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIHByZXBlbmRcclxuICogQHJldHVybnMgeyp9XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5wcmVwZW5kID0gZnVuY3Rpb24gKHZhbHVlLCBwcmVwZW5kKSB7XHJcbiAgICByZXR1cm4gcHJlcGVuZCArIHZhbHVlXHJcbn07XHJcblxyXG4vKipcclxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XHJcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcclxuICAgIHJldHVybiBob3VycyArICdoICcgKyBtaW5zICsgJ20nO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZVxyXG4gKiBAcGFyYW0gbGVuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxucml2ZXRzLmZvcm1hdHRlcnMuZ3QgPSAodmFsdWUsIGxlbikgPT4ge1xyXG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcclxufTtcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIGxlblxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHtcclxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XHJcbn07XHJcblxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHZhbHVlXHJcbiAqIEBwYXJhbSBsZW5cclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqL1xyXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XHJcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); /***/ }), /***/ "./resources/js/installer/app.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcz8wNTdjIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBSUEsbUJBQUFBLENBQVEsNkJBQVIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRtaW4gc3R1ZmYgbmVlZGVkXG4gKi9cblxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9pbnN0YWxsZXIvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/installer/app.js\n"); +eval("/**\r\n * Admin stuff needed\r\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcz8wNTdjIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBSUEsbUJBQUFBLENBQVEsNkJBQVIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBZG1pbiBzdHVmZiBuZWVkZWRcclxuICovXHJcblxyXG5yZXF1aXJlKCcuLy4uL2Jvb3RzdHJhcCcpO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvaW5zdGFsbGVyL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/installer/app.js\n"); /***/ }), diff --git a/public/mix-manifest.json b/public/mix-manifest.json index ab1e19db..e0721605 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,20 +1,20 @@ { - "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=b83a392b6c373e164576", - "/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=b0a0f05b94a4486db4f2", - "/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=cc80aec3cf1646f83d8d", - "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=1f2917a3a9f172f3cdad", - "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=3a51850509367b06cd1f", + "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=9052380a3cc49659d9cb", + "/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=2354239267725cc034f3", + "/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=b5820cec33652625583a", + "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=bc90d7d46de8f35e92c5", + "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=3a241e6be44a47bee0c1", "/assets/fonts/glyphicons-halflings-regular.woff2": "/assets/fonts/glyphicons-halflings-regular.woff2?id=349344e92fb16221dd56", "/assets/admin/fonts/glyphicons-halflings-regular.woff2": "/assets/admin/fonts/glyphicons-halflings-regular.woff2?id=349344e92fb16221dd56", "/assets/admin/img/clear.png": "/assets/admin/img/clear.png?id=63b3af84650a0145d61a", "/assets/admin/img/loading.gif": "/assets/admin/img/loading.gif?id=1e2db432947c2dca1b9f", "/assets/global/js/jquery.js": "/assets/global/js/jquery.js?id=6a07da9fae934baf3f74", - "/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=99aedbd62dfa118e7b73", - "/assets/admin/js/vendor.js": "/assets/admin/js/vendor.js?id=5130233c88c71fc60135", + "/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=4aa0f487325aea4c83e5", + "/assets/admin/js/vendor.js": "/assets/admin/js/vendor.js?id=cca6276af7b190a6b13b", "/assets/admin/css/blue.png": "/assets/admin/css/blue.png?id=39437a6200d8066a49d4", "/assets/admin/css/blue@2x.png": "/assets/admin/css/blue@2x.png?id=127d7cfbb176dc559854", "/assets/global/js/vendor.js": "/assets/global/js/vendor.js?id=6436d215691e8f38eb12", "/assets/global/css/vendor.css": "/assets/global/css/vendor.css?id=115d5c4f2370ae94a962", - "/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=cd76d2d9611b9a13d644", + "/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=34f312e5c4413231bba6", "/assets/installer/js/vendor.js": "/assets/installer/js/vendor.js?id=01249af00bd2c1267e15" } \ No newline at end of file