Files
nodeMap/.next/server/components_MapComponent_js.js

25 lines
43 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "components_MapComponent_js";
exports.ids = ["components_MapComponent_js"];
exports.modules = {
/***/ "./components/MapComponent.js":
/*!************************************!*\
!*** ./components/MapComponent.js ***!
\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"react/jsx-dev-runtime\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! leaflet */ \"leaflet\");\n/* harmony import */ var leaflet__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(leaflet__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var leaflet_dist_leaflet_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! leaflet/dist/leaflet.css */ \"./node_modules/leaflet/dist/leaflet.css\");\n/* harmony import */ var leaflet_dist_leaflet_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(leaflet_dist_leaflet_css__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var leaflet_contextmenu_dist_leaflet_contextmenu_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! leaflet-contextmenu/dist/leaflet.contextmenu.css */ \"./node_modules/leaflet-contextmenu/dist/leaflet.contextmenu.css\");\n/* harmony import */ var leaflet_contextmenu_dist_leaflet_contextmenu_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(leaflet_contextmenu_dist_leaflet_contextmenu_css__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var leaflet_contextmenu__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! leaflet-contextmenu */ \"leaflet-contextmenu\");\n/* harmony import */ var leaflet_contextmenu__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(leaflet_contextmenu__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\nconst MapComponent = ({ locations, onLocationUpdate })=>{\n const mapRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [map, setMap] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [online, setOnline] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(navigator.onLine);\n const offlineTileLayer = \"../TileMap/mapTiles/{z}/{x}/{y}.png\";\n const onlineTileLayer = \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\";\n let initialMap = [];\n // Funktionen zur Überwachung der Internetverbindung\n const checkInternet = ()=>{\n console.log(\"Checking internet connectivity...\");\n fetch(\"https://tile.openstreetmap.org/1/1/1.png\", {\n method: \"HEAD\"\n }).then((response)=>setOnline(response.ok)).catch(()=>setOnline(false));\n };\n // Initialisiere die Karte\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (mapRef.current && !map) {\n initialMap = leaflet__WEBPACK_IMPORTED_MODULE_2___default().map(mapRef.current, {\n center: [\n 53.111111,\n 8.4625\n ],\n zoom: 10,\n zoomControl: false,\n contextmenu: true,\n contextmenuItems: [\n {\n text: \"Station hinzuf\\xfcgen\",\n callback: showAddStationPopup\n },\n {\n text: \"Station \\xf6ffnen (Tab)\",\n icon: \"img/screen_new.png\",\n callback: newLink\n },\n {\n text: \"Station \\xf6ffnen\",\n icon: \"img/screen_same.png\",\n callback: sameLink\n },\n {\n text: \"Koordinaten\",\n icon: \"img/screen_same.png\",\n callback: lata\n },\n \"-\",\n {\n text: \"Reinzoomen\",\n callback: zoomIn\n },\n {\n text: \"Rauszoomen\",\n callback: zoomOut\n },\n {\n text: \"Hier zentrieren\",\n callback: centerHere\n }\n ]\n });\n leaflet__WEBPACK_IMPORTED_MODULE_2___default().tileLayer(online ? onlineTileLayer : offlineTileLayer, {\n attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(initialMap);\n setMap(initialMap);\n }\n }, [\n mapRef,\n map\n ]);\n // Handle online/offline status\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n window.addEventListener(\"online\", checkInternet);\n window.addEventListener(\"offline\", checkInternet);\n return ()=>{\n window.removeEventListener(\"online\", checkInternet);\n window.removeEventListener(\"offline\", checkInternet);\n };\n }, []);\n // Update map layers based on online status\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (map) {\n const newLayer = leaflet__WEBPACK_IMPORTED_MODULE_2___default().tileLayer(online ? onlineTileLayer : offlineTileLayer, {\n minZoom: 7,\n maxZoom: online ? 19 : 14,\n attribution: 'Map data \\xa9 <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n });\n map.eachLayer((layer)=>{\n if (layer instanceof (leaflet__WEBPACK_IMPORTED_MODULE_2___default().TileLayer)) {\n map.removeLayer(layer);\n }\n });\n newLayer.addTo(map);\n }\n }, [\n online,\n map\n ]);\n // Marker handling\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n // Remove old markers\n if (map) {\n map.eachLayer((layer)=>{\n if (layer instanceof (leaflet__WEBPACK_IMPORTED_MODULE_2___default().Marker)) {\n map.removeLayer(layer);\n }\n });\n // Add new markers\n locations.forEach((location)=>{\n const { latitude, longitude } = parsePoint(location.position);\n const marker = leaflet__WEBPACK_IMPORTED_MODULE_2___default().marker([\n latitude,\n longitude\n ], {\n icon: leaflet__WEBPACK_IMPORTED_MODULE_2___default().icon({\n iconUrl: \"/location.svg\",\n iconSize: [\n 34,\n 34\n ],\n iconAnchor: [\n 17,\n 34\n ],\n popupAnchor: [\n 0,\n -34\n ]\n }),\n draggable: true,\n id: location.idPoi\n });\n marker.bindPopup(`<b>${location.description || \"Unbekannt\"}</b><br>Type: ${location.idPoiTyp || \"N/A\"}<br>Lat: ${latitude.toFixed(5)}, Lng: ${longitude.toFixed(5)}`);\n marker.on(\"dragend\", function(e) {\n const newLat = e.target.getLatLng().lat;\n const newLng = e.target.getLatLng().lng;\n const markerId = e.target.options.id;\n updateLocationInDatabase(markerId, newLat, newLng).then(()=>{\n onLocationUpdate(markerId, newLat, newLng);\n });\n });\n marker.addTo(map);\n });\n }\n }, [\n map,\n locations,\n onLocationUpdate\n ]);\n //------------------------------------------\n function parsePoint(pointString) {\n const match = pointString.match(/POINT\\s*\\((\\d+(\\.\\d+)?)\\s+(\\d+(\\.\\d+)?)\\)/);\n if (match) {\n return {\n longitude: parseFloat(match[1]),\n latitude: parseFloat(match[3])\n };\n } else {\n // Handle the error or return a default/fallback value\n console.error(\"Invalid POINT format:\", pointString);\n return null; // Oder eine sinnvolle Standardantwort\n }\n }\n //----------------------------------\n //-----Kontextmenu----------------\n const newLink = (e)=>{\n try {\n if (!e.relatedTarget || !e.relatedTarget.options) {\n throw new Error(\"relatedTarget or options not defined\");\n }\n alert(\"Neues Fenster: \" + e.relatedTarget.options.test);\n window.open(`../devices/${e.relatedTarget.options.test}`, \"_blank\").focus();\n } catch (error) {\n console.error(\"Failed in newLink function:\", error);\n }\n };\n const sameLink = (e)=>{\n alert(e.relatedTarget.options.test);\n window.open(\"../devices/\" + e.relatedTarget.options.test, \"_parent\").focus();\n };\n const lata = (e)=>{\n alert(\"Breitengrad: \" + e.latlng.lat);\n };\n const zoomIn = (e)=>{\n initialMap.flyTo(e.latlng, 12);\n };\n const zoomOut = (e)=>{\n fly();\n };\n const centerHere = (e)=>{\n initialMap.panTo(e.latlng);\n };\n const showCoordinates = (e)=>{\n alert(\"Breitengrad: \" + e.latlng.lat + \"\\nL\\xe4ngengrad: \" + e.latlng.lng);\n };\n const showData = (e)=>{\n console.log(e);\n };\n const showTalas = (e)=>{\n map.addLayer(TALAS);\n loadData();\n };\n const hideTalas = (e)=>{\n map.removeLayer(TALAS);\n loadData();\n };\n const showGSM = (e)=>{\n map.addLayer(GMA);\n loadData();\n };\n const hideGSM = (e)=>{\n map.removeLayer(GMA);\n loadData();\n };\n //-----Kontextmenu----ende------------\n // Ensure this function is only called when map is initialized and available\n const showAddStationPopup = (e)=>{\n if (!initialMap) {\n console.log(\"Map is not initialized.\");\n return;\n }\n const popupContent = leaflet__WEBPACK_IMPORTED_MODULE_2___default().DomUtil.create(\"div\");\n popupContent.innerHTML = `\r\n <form id=\"addStationForm\" class=\"m-0 p-2 w-full\">\r\n <div class=\"flex items-center mb-4\"> \r\n <label for=\"name\" class=\"block mr-2 flex-none\">Name:</label>\r\n <input\r\n type=\"text\"\r\n id=\"name\"\r\n name=\"name\"\r\n placeholder=\"Name der Station\"\r\n class=\"block p-2 flex-grow border-2 border-gray-200 rounded-md text-sm\"\r\n />\r\n </div>\r\n \r\n <div class=\"flex items-center mb-4\"> \r\n <label for=\"type\" class=\"block mr-3 flex-none\">Type:</label>\r\n <input\r\n type=\"text\"\r\n id=\"type\"\r\n name=\"type\"\r\n placeholder=\"Typ der Station\"\r\n class=\"block p-2 flex-grow border-2 border-gray-200 rounded-md text-sm\"\r\n />\r\n </div>\r\n \r\n <div class=\"flex items-center mb-4\">\r\n <label for=\"lat\" class=\"block mr-2 flex-none\">Breitengrad:</label>\r\n <input\r\n type=\"text\"\r\n id=\"lat\"\r\n name=\"lat\"\r\n value=\"${e.latlng.lat.toFixed(5)}\"\r\n readonly\r\n class=\"block p-2 flex-grow border-2 border-gray-200 rounded-md text-sm\"\r\n />\r\n </div>\r\n \r\n <div class=\"flex items-center mb-4\"> \r\n <label for=\"lng\" class=\"block mr-2 flex-none\">Längengrad:</label>\r\n <input\r\n type=\"text\"\r\n id=\"lng\"\r\n name=\"lng\"\r\n value=\"${e.latlng.lng.toFixed(5)}\"\r\n readonly\r\n class=\"block p-2 flex-grow border-2 border-gray-200 rounded-md text-sm\"\r\n />\r\n </div>\r\n \r\n <button\r\n type=\"submit\"\r\n class=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded w-full\"\r\n >\r\n Station hinzufügen\r\n </button>\r\n</form>\r\n `;\n leaflet__WEBPACK_IMPORTED_MODULE_2___default().popup().setLatLng(e.latlng).setContent(popupContent).openOn(initialMap);\n // Attach event listener here\n leaflet__WEBPACK_IMPORTED_MODULE_2___default().DomEvent.on(popupContent, \"submit\", handleSubmit);\n };\n /*\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n const form = event.target;\r\n const data = {\r\n name: form.name.value,\r\n type: form.type.value,\r\n latitude: form.lat.value,\r\n longitude: form.lng.value,\r\n };\r\n\r\n onAddLocation(name, type, lat, lng);\r\n console.log(\"Name: \", name, \"Type: \", type, \"Lat: \", lat, \"Lng: \", lng);\r\n map.closePopup();\r\n };\r\n*/ // Funktion zum Hinzufügen eines neuen Standorts\n async function handleSubmit(event) {\n event.preventDefault();\n const form = event.target;\n const data = {\n name: form.name.value,\n type: form.type.value,\n latitude: form.lat.value,\n longitude: form.lng.value\n };\n try {\n const response = await fetch(\"/api/addLocation\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(data)\n });\n const result = await response.json();\n if (response.ok) {\n console.log(\"Standort hinzugef\\xfcgt:\", result);\n alert(\"Standort erfolgreich hinzugef\\xfcgt!\");\n form.reset(); // Formular zurücksetzen\n // Hier könntest du weitere Aktionen durchführen, wie das Schließen des Popups oder das Aktualisieren der Marker auf der Karte\n } else {\n throw new Error(result.error || \"Ein unbekannter Fehler ist aufgetreten.\");\n }\n } catch (error) {\n console.error(\"Fehler beim Hinzuf\\xfcgen des Standorts:\", error);\n alert(error.message);\n }\n }\n function fly(stationValue) {\n var x = 51.41321407879154;\n var y = 7.739617925303934;\n var zoom = 7;\n /* for (var i = 0; i < dataStaticlength; i++) {\r\n var gisStatics = dataStatic[i];\r\n if (stationValue === gisStatics.Area_Name) {\r\n //console.log(gisStatics.X+\",\"+gisStatics.Y);\r\n x = gisStatics.X;\r\n y = gisStatics.Y;\r\n }\r\n }\r\n if (y === 7.739617925303934) {\r\n zoom = 8;\r\n } */ initialMap.flyTo([\n x,\n y\n ], zoom);\n /* var popup = new L.Popup();\r\n oms.addListener(\"click\", function (marker) {\r\n popup.setContent(marker.desc);\r\n popup.setLatLng(marker.getLatLng());\r\n map.openPopup(popup);\r\n });\r\n\r\n for (var i = 0; i < window.mapData.length; i++) {\r\n var datum = window.mapData[i];\r\n var loc = new L.LatLng(datum.lat, datum.lon);\r\n var marker = new L.Marker(loc);\r\n marker.desc = datum.d;\r\n map.addLayer(marker);\r\n //oms.addMarker(marker); // <-- here\r\n } */ }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n id: \"map\",\n ref: mapRef,\n style: {\n height: \"100vh\",\n width: \"100vw\",\n overflow: \"hidden\"\n }\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\isa.LTW\\\\Desktop\\\\15.04.2024\\\\wwwrootTalas5NodeMap\\\\components\\\\MapComponent.js\",\n lineNumber: 375,\n columnNumber: 5\n }, undefined);\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapComponent);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jb21wb25lbnRzL01hcENvbXBvbmVudC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUEyRDtBQUNuQztBQUNVO0FBQ3dCO0FBQzdCO0FBQzdCLE1BQU1LLGVBQWUsQ0FBQyxFQUFFQyxTQUFTLEVBQUVDLGdCQUFnQixFQUFFO0lBQ25ELE1BQU1DLFNBQVNOLDZDQUFNQSxDQUFDO0lBQ3RCLE1BQU0sQ0FBQ08sS0FBS0MsT0FBTyxHQUFHUCwrQ0FBUUEsQ0FBQztJQUMvQixNQUFNLENBQUNRLFFBQVFDLFVBQVUsR0FBR1QsK0NBQVFBLENBQUNVLFVBQVVDLE1BQU07SUFDckQsTUFBTUMsbUJBQW1CO0lBQ3pCLE1BQU1DLGtCQUFrQjtJQUV4QixJQUFJQyxhQUFhLEVBQUU7SUFFbkIsb0RBQW9EO0lBQ3BELE1BQU1DLGdCQUFnQjtRQUNwQkMsUUFBUUMsR0FBRyxDQUFDO1FBQ1pDLE1BQU0sNENBQTRDO1lBQUVDLFFBQVE7UUFBTyxHQUNoRUMsSUFBSSxDQUFDLENBQUNDLFdBQWFaLFVBQVVZLFNBQVNDLEVBQUUsR0FDeENDLEtBQUssQ0FBQyxJQUFNZCxVQUFVO0lBQzNCO0lBQ0EsMEJBQTBCO0lBQzFCWCxnREFBU0EsQ0FBQztRQUNSLElBQUlPLE9BQU9tQixPQUFPLElBQUksQ0FBQ2xCLEtBQUs7WUFDMUJRLGFBQWFiLGtEQUFLLENBQUNJLE9BQU9tQixPQUFPLEVBQUU7Z0JBQ2pDQyxRQUFRO29CQUFDO29CQUFXO2lCQUFPO2dCQUMzQkMsTUFBTTtnQkFDTkMsYUFBYTtnQkFDYkMsYUFBYTtnQkFDYkMsa0JBQWtCO29CQUNoQjt3QkFBRUMsTUFBTTt3QkFBc0JDLFVBQVVDO29CQUFvQjtvQkFDNUQ7d0JBQ0VGLE1BQU07d0JBQ05HLE1BQU07d0JBQ05GLFVBQVVHO29CQUNaO29CQUNBO3dCQUNFSixNQUFNO3dCQUNORyxNQUFNO3dCQUNORixVQUFVSTtvQkFDWjtvQkFDQTt3QkFDRUwsTUFBTTt3QkFDTkcsTUFBTTt3QkFDTkYsVUFBVUs7b0JBQ1o7b0JBQ0E7b0JBQ0E7d0JBQUVOLE1BQU07d0JBQWNDLFVBQVVNO29CQUFPO29CQUN2Qzt3QkFBRVAsTUFBTTt3QkFBY0MsVUFBVU87b0JBQVE7b0JBQ3hDO3dCQUFFUixNQUFNO3dCQUFtQkMsVUFBVVE7b0JBQVc7aUJBQ2pEO1lBQ0g7WUFDQXRDLHdEQUFXLENBQUNPLFNBQVNLLGtCQUFrQkQsa0JBQWtCO2dCQUN2RDZCLGFBQ0U7WUFDSixHQUFHQyxLQUFLLENBQUM1QjtZQUVUUCxPQUFPTztRQUNUO0lBQ0YsR0FBRztRQUFDVDtRQUFRQztLQUFJO0lBRWhCLCtCQUErQjtJQUMvQlIsZ0RBQVNBLENBQUM7UUFDUjZDLE9BQU9DLGdCQUFnQixDQUFDLFVBQVU3QjtRQUNsQzRCLE9BQU9DLGdCQUFnQixDQUFDLFdBQVc3QjtRQUNuQyxPQUFPO1lBQ0w0QixPQUFPRSxtQkFBbUIsQ0FBQyxVQUFVOUI7WUFDckM0QixPQUFPRSxtQkFBbUIsQ0FBQyxXQUFXOUI7UUFDeEM7SUFDRixHQUFHLEVBQUU7SUFFTCwyQ0FBMkM7SUFDM0NqQixnREFBU0EsQ0FBQztRQUNSLElBQUlRLEtBQUs7WUFDUCxNQUFNd0MsV0FBVzdDLHdEQUFXLENBQzFCTyxTQUFTSyxrQkFBa0JELGtCQUMzQjtnQkFDRW1DLFNBQVM7Z0JBQ1RDLFNBQVN4QyxTQUFTLEtBQUs7Z0JBQ3ZCaUMsYUFDRTtZQUNKO1lBR0ZuQyxJQUFJMkMsU0FBUyxDQUFDLENBQUNDO2dCQUNiLElBQUlBLGlCQUFpQmpELDBEQUFXLEVBQUU7b0JBQ2hDSyxJQUFJOEMsV0FBVyxDQUFDRjtnQkFDbEI7WUFDRjtZQUVBSixTQUFTSixLQUFLLENBQUNwQztRQUNqQjtJQUNGLEdBQUc7UUFBQ0U7UUFBUUY7S0FBSTtJQUVoQixrQkFBa0I7SUFDbEJSLGdEQUFTQSxDQUFDO1FBQ1IscUJBQXFCO1FBQ3JCLElBQUlRLEtBQUs7WUFDUEEsSUFBSTJDLFNBQVMsQ0FBQyxDQUFDQztnQkFDYixJQUFJQSxpQkFBaUJqRCx1REFBUSxFQUFFO29CQUM3QkssSUFBSThDLFdBQVcsQ0FBQ0Y7Z0JBQ2xCO1lBQ0Y7WUFFQSxrQkFBa0I7WUFDbEIvQyxVQUFVbUQsT0FBTyxDQUFDLENBQUNDO2dCQUNqQixNQUFNLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxFQUFFLEdBQUdDLFdBQVdILFNBQVNJLFFBQVE7Z0JBQzVELE1BQU1DLFNBQVMzRCxxREFBUSxDQUFDO29CQUFDdUQ7b0JBQVVDO2lCQUFVLEVBQUU7b0JBQzdDeEIsTUFBTWhDLG1EQUFNLENBQUM7d0JBQ1g0RCxTQUFTO3dCQUNUQyxVQUFVOzRCQUFDOzRCQUFJO3lCQUFHO3dCQUNsQkMsWUFBWTs0QkFBQzs0QkFBSTt5QkFBRzt3QkFDcEJDLGFBQWE7NEJBQUM7NEJBQUcsQ0FBQzt5QkFBRztvQkFDdkI7b0JBQ0FDLFdBQVc7b0JBQ1hDLElBQUlYLFNBQVNZLEtBQUs7Z0JBQ3BCO2dCQUVBUCxPQUFPUSxTQUFTLENBQ2QsQ0FBQyxHQUFHLEVBQUViLFNBQVNjLFdBQVcsSUFBSSxZQUFZLGNBQWMsRUFBRWQsU0FBU2UsUUFBUSxJQUFJLE1BQU0sU0FBUyxFQUFFZCxTQUFTZSxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUVkLFVBQVVjLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBR3JKWCxPQUFPWSxFQUFFLENBQUMsV0FBVyxTQUFVQyxDQUFDO29CQUM5QixNQUFNQyxTQUFTRCxFQUFFRSxNQUFNLENBQUNDLFNBQVMsR0FBR0MsR0FBRztvQkFDdkMsTUFBTUMsU0FBU0wsRUFBRUUsTUFBTSxDQUFDQyxTQUFTLEdBQUdHLEdBQUc7b0JBQ3ZDLE1BQU1DLFdBQVdQLEVBQUVFLE1BQU0sQ0FBQ00sT0FBTyxDQUFDZixFQUFFO29CQUNwQ2dCLHlCQUF5QkYsVUFBVU4sUUFBUUksUUFBUTFELElBQUksQ0FBQzt3QkFDdERoQixpQkFBaUI0RSxVQUFVTixRQUFRSTtvQkFDckM7Z0JBQ0Y7Z0JBRUFsQixPQUFPbEIsS0FBSyxDQUFDcEM7WUFDZjtRQUNGO0lBQ0YsR0FBRztRQUFDQTtRQUFLSDtRQUFXQztLQUFpQjtJQUVyQyw0Q0FBNEM7SUFDNUMsU0FBU3NELFdBQVd5QixXQUFXO1FBQzdCLE1BQU1DLFFBQVFELFlBQVlDLEtBQUssQ0FDN0I7UUFFRixJQUFJQSxPQUFPO1lBQ1QsT0FBTztnQkFDTDNCLFdBQVc0QixXQUFXRCxLQUFLLENBQUMsRUFBRTtnQkFDOUI1QixVQUFVNkIsV0FBV0QsS0FBSyxDQUFDLEVBQUU7WUFDL0I7UUFDRixPQUFPO1lBQ0wsc0RBQXNEO1lBQ3REcEUsUUFBUXNFLEtBQUssQ0FBQyx5QkFBeUJIO1lBQ3ZDLE9BQU8sTUFBTSxzQ0FBc0M7UUFDckQ7SUFDRjtJQUNBLG9DQUFvQztJQUNwQyxrQ0FBa0M7SUFDbEMsTUFBTWpELFVBQVUsQ0FBQ3VDO1FBQ2YsSUFBSTtZQUNGLElBQUksQ0FBQ0EsRUFBRWMsYUFBYSxJQUFJLENBQUNkLEVBQUVjLGFBQWEsQ0FBQ04sT0FBTyxFQUFFO2dCQUNoRCxNQUFNLElBQUlPLE1BQU07WUFDbEI7WUFDQUMsTUFBTSxvQkFBb0JoQixFQUFFYyxhQUFhLENBQUNOLE9BQU8sQ0FBQ1MsSUFBSTtZQUN0RC9DLE9BQ0dnRCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUVsQixFQUFFYyxhQUFhLENBQUNOLE9BQU8sQ0FBQ1MsSUFBSSxDQUFDLENBQUMsRUFBRSxVQUNuREUsS0FBSztRQUNWLEVBQUUsT0FBT04sT0FBTztZQUNkdEUsUUFBUXNFLEtBQUssQ0FBQywrQkFBK0JBO1FBQy9DO0lBQ0Y7SUFFQSxNQUFNbkQsV0FBVyxDQUFDc0M7UUFDaEJnQixNQUFNaEIsRUFBRWMsYUFBYSxDQUFDTixPQUFPLENBQUNTLElBQUk7UUFDbEMvQyxPQUNHZ0QsSUFBSSxDQUFDLGdCQUFnQmxCLEVBQUVjLGFBQWEsQ0FBQ04sT0FBTyxDQUFDUyxJQUFJLEVBQUUsV0FDbkRFLEtBQUs7SUFDVjtJQUVBLE1BQU14RCxPQUFPLENBQUNxQztRQUNaZ0IsTUFBTSxrQkFBa0JoQixFQUFFb0IsTUFBTSxDQUFDaEIsR0FBRztJQUN0QztJQUVBLE1BQU14QyxTQUFTLENBQUNvQztRQUNkM0QsV0FBV2dGLEtBQUssQ0FBQ3JCLEVBQUVvQixNQUFNLEVBQUU7SUFDN0I7SUFFQSxNQUFNdkQsVUFBVSxDQUFDbUM7UUFDZnNCO0lBQ0Y7SUFDQSxNQUFNeEQsYUFBYSxDQUFDa0M7UUFDbEIzRCxXQUFXa0YsS0FBSyxDQUFDdkIsRUFBRW9CLE1BQU07SUFDM0I7SUFFQSxNQUFNSSxrQkFBa0IsQ0FBQ3hCO1FBQ3ZCZ0IsTUFBTSxrQkFBa0JoQixFQUFFb0IsTUFBTSxDQUFDaEIsR0FBRyxHQUFHLHNCQUFtQkosRUFBRW9CLE1BQU0sQ0FBQ2QsR0FBRztJQUN4RTtJQUNBLE1BQU1tQixXQUFXLENBQUN6QjtRQUNoQnpELFFBQVFDLEdBQUcsQ0FBQ3dEO0lBQ2Q7SUFDQSxNQUFNMEIsWUFBWSxDQUFDMUI7UUFDakJuRSxJQUFJOEYsUUFBUSxDQUFDQztRQUNiQztJQUNGO0lBQ0EsTUFBTUMsWUFBWSxDQUFDOUI7UUFDakJuRSxJQUFJOEMsV0FBVyxDQUFDaUQ7UUFDaEJDO0lBQ0Y7SUFDQSxNQUFNRSxVQUFVLENBQUMvQjtRQUNmbkUsSUFBSThGLFFBQVEsQ0FBQ0s7UUFDYkg7SUFDRjtJQUNBLE1BQU1JLFVBQVUsQ0FBQ2pDO1FBQ2ZuRSxJQUFJOEMsV0FBVyxDQUFDcUQ7UUFDaEJIO0lBQ0Y7SUFDQSxzQ0FBc0M7SUFDdEMsNEVBQTRFO0lBQzVFLE1BQU10RSxzQkFBc0IsQ0FBQ3lDO1FBQzNCLElBQUksQ0FBQzNELFlBQVk7WUFDZkUsUUFBUUMsR0FBRyxDQUFDO1lBQ1o7UUFDRjtRQUVBLE1BQU0wRixlQUFlMUcsc0RBQVMsQ0FBQzRHLE1BQU0sQ0FBQztRQUN0Q0YsYUFBYUcsU0FBUyxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzthQThCakIsRUFBRXJDLEVBQUVvQixNQUFNLENBQUNoQixHQUFHLENBQUNOLE9BQU8sQ0FBQyxHQUFHOzs7Ozs7Ozs7Ozs7YUFZMUIsRUFBRUUsRUFBRW9CLE1BQU0sQ0FBQ2QsR0FBRyxDQUFDUixPQUFPLENBQUMsR0FBRzs7Ozs7Ozs7Ozs7OztFQWFyQyxDQUFDO1FBRUN0RSxvREFBTyxHQUFHK0csU0FBUyxDQUFDdkMsRUFBRW9CLE1BQU0sRUFBRW9CLFVBQVUsQ0FBQ04sY0FBY08sTUFBTSxDQUFDcEc7UUFFOUQsNkJBQTZCO1FBQzdCYix1REFBVSxDQUFDdUUsRUFBRSxDQUFDbUMsY0FBYyxVQUFVUztJQUN4QztJQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUFlRixHQUNFLGdEQUFnRDtJQUNoRCxlQUFlQSxhQUFhQyxLQUFLO1FBQy9CQSxNQUFNQyxjQUFjO1FBQ3BCLE1BQU1DLE9BQU9GLE1BQU0xQyxNQUFNO1FBQ3pCLE1BQU02QyxPQUFPO1lBQ1hDLE1BQU1GLEtBQUtFLElBQUksQ0FBQ0MsS0FBSztZQUNyQkMsTUFBTUosS0FBS0ksSUFBSSxDQUFDRCxLQUFLO1lBQ3JCbEUsVUFBVStELEtBQUsxQyxHQUFHLENBQUM2QyxLQUFLO1lBQ3hCakUsV0FBVzhELEtBQUt4QyxHQUFHLENBQUMyQyxLQUFLO1FBQzNCO1FBRUEsSUFBSTtZQUNGLE1BQU1yRyxXQUFXLE1BQU1ILE1BQU0sb0JBQW9CO2dCQUMvQ0MsUUFBUTtnQkFDUnlHLFNBQVM7b0JBQ1AsZ0JBQWdCO2dCQUNsQjtnQkFDQUMsTUFBTUMsS0FBS0MsU0FBUyxDQUFDUDtZQUN2QjtZQUVBLE1BQU1RLFNBQVMsTUFBTTNHLFNBQVM0RyxJQUFJO1lBRWxDLElBQUk1RyxTQUFTQyxFQUFFLEVBQUU7Z0JBQ2ZOLFFBQVFDLEdBQUcsQ0FBQyw0QkFBeUIrRztnQkFDckN2QyxNQUFNO2dCQUNOOEIsS0FBS1csS0FBSyxJQUFJLHdCQUF3QjtZQUN0Qyw4SEFBOEg7WUFDaEksT0FBTztnQkFDTCxNQUFNLElBQUkxQyxNQUNSd0MsT0FBTzFDLEtBQUssSUFBSTtZQUVwQjtRQUNGLEVBQUUsT0FBT0EsT0FBTztZQUNkdEUsUUFBUXNFLEtBQUssQ0FBQyw0Q0FBeUNBO1lBQ3ZERyxNQUFNSCxNQUFNNkMsT0FBTztRQUNyQjtJQUNGO0lBRUEsU0FBU3BDLElBQUlxQyxZQUFZO1FBQ3ZCLElBQUlDLElBQUk7UUFDUixJQUFJQyxJQUFJO1FBQ1IsSUFBSTVHLE9BQU87UUFFWDs7Ozs7Ozs7OztNQVVFLEdBQ0ZaLFdBQVdnRixLQUFLLENBQUM7WUFBQ3VDO1lBQUdDO1NBQUUsRUFBRTVHO0lBRXpCOzs7Ozs7Ozs7Ozs7OztNQWNFLEdBQ0o7SUFFQSxxQkFDRSw4REFBQzZHO1FBQ0NyRSxJQUFHO1FBQ0hzRSxLQUFLbkk7UUFDTG9JLE9BQU87WUFBRUMsUUFBUTtZQUFTQyxPQUFPO1lBQVNDLFVBQVU7UUFBUzs7Ozs7O0FBR25FO0FBRUEsaUVBQWUxSSxZQUFZQSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9NYXBDb21wb25lbnQuanM/ZDA3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBMIGZyb20gXCJsZWFmbGV0XCI7XHJcbmltcG9ydCBcImxlYWZsZXQvZGlzdC9sZWFmbGV0LmNzc1wiO1xyXG5pbXBvcnQgXCJsZWFmbGV0LWNvbnRleHRtZW51L2Rpc3QvbGVhZmxldC5jb250ZXh0bWVudS5jc3NcIjtcclxuaW1wb3J0IFwibGVhZmxldC1jb250ZXh0bWVudVwiO1xyXG5jb25zdCBNYXBDb21wb25lbnQgPSAoeyBsb2NhdGlvbnMsIG9uTG9jYXRpb25VcGRhdGUgfSkgPT4ge1xyXG4gIGNvbnN0IG1hcFJlZiA9IHVzZVJlZihudWxsKTtcclxuICBjb25zdCBbbWFwLCBzZXRNYXBdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgY29uc3QgW29ubGluZSwgc2V0T25saW5lXSA9IHVzZVN0YXRlKG5hdmlnYXRvci5vbkxpbmUpO1xyXG4gIGNvbnN0IG9mZmxpbmVUaWxlTGF5ZXIgPSBcIi4uL1RpbGVNYXAvbWFwVGlsZXMve3p9L3t4fS97eX0ucG5nXCI7XHJcbiAgY29uc3Qgb25saW5lVGlsZUxheWVyID0gXCJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZ1wiO1xyXG5cclxuICBsZXQgaW5pdGlhbE1hcCA9IFtdO1xyXG5cclxuICAvLyBGdW5rdGlvbmVuIHp1ciDDnGJlcndhY2h1bmcgZGVyIEludGVybmV0dmVyYmluZHVuZ1xyXG4gIGNvbnN0IGNoZWNrSW50ZXJuZXQgPSAoKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkNoZWNraW5nIGludGVybmV0IGNvbm5lY3Rpdml0eS4uLlwiKTtcclxuICAgIGZldGNoKFwiaHR0cHM6Ly90aWxlLm9wZW5zdHJlZXRtYXAub3JnLzEvMS8xLnBuZ1wiLCB7IG1ldGhvZDogXCJIRUFEXCIgfSlcclxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiBzZXRPbmxpbmUocmVzcG9uc2Uub2spKVxyXG4gICAgICAuY2F0Y2goKCkgPT4gc2V0T25saW5lKGZhbHNlKSk7XHJcbiAgfTtcclxuICAvLyBJbml0aWFsaXNpZXJlIGRpZSBLYXJ0ZVxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAobWFwUmVmLmN1cnJlbnQgJiYgIW1hcCkge1xyXG4gICAgICBpbml0aWFsTWFwID0gTC5tYXAobWFwUmVmLmN1cnJlbnQsIHtcclxuICAgICAgICBjZW50ZXI6IFs1My4xMTExMTEsIDguNDYyNV0sXHJcbiAgICAgICAgem9vbTogMTAsXHJcbiAgICAgICAgem9vbUNvbnRyb2w6IGZhbHNlLCAvLyBEZWFrdGl2aWVyZSBkaWUgU3RhbmRhcmQtWm9vbXN0ZXVlcnVuZ1xyXG4gICAgICAgIGNvbnRleHRtZW51OiB0cnVlLFxyXG4gICAgICAgIGNvbnRleHRtZW51SXRlbXM6IFtcclxuICAgICAgICAgIHsgdGV4dDogXCJTdGF0aW9uIGhpbnp1ZsO8Z2VuXCIsIGNhbGxiYWNrOiBzaG93QWRkU3RhdGlvblBvcHVwIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiU3RhdGlvbiDDtmZmbmVuIChUYWIpXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiaW1nL3NjcmVlbl9uZXcucG5nXCIsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBuZXdMaW5rLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dDogXCJTdGF0aW9uIMO2ZmZuZW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJpbWcvc2NyZWVuX3NhbWUucG5nXCIsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBzYW1lTGluayxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiS29vcmRpbmF0ZW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJpbWcvc2NyZWVuX3NhbWUucG5nXCIsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBsYXRhLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiLVwiLCAvLyBEaXZpZGVyXHJcbiAgICAgICAgICB7IHRleHQ6IFwiUmVpbnpvb21lblwiLCBjYWxsYmFjazogem9vbUluIH0sXHJcbiAgICAgICAgICB7IHRleHQ6IFwiUmF1c3pvb21lblwiLCBjYWxsYmFjazogem9vbU91dCB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiBcIkhpZXIgemVudHJpZXJlblwiLCBjYWxsYmFjazogY2VudGVySGVyZSB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBMLnRpbGVMYXllcihvbmxpbmUgPyBvbmxpbmVUaWxlTGF5ZXIgOiBvZmZsaW5lVGlsZUxheWVyLCB7XHJcbiAgICAgICAgYXR0cmlidXRpb246XHJcbiAgICAgICAgICAnJmNvcHk7IDxhIGhyZWY9XCJodHRwczovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPiBjb250cmlidXRvcnMnLFxyXG4gICAgICB9KS5hZGRUbyhpbml0aWFsTWFwKTtcclxuXHJcbiAgICAgIHNldE1hcChpbml0aWFsTWFwKTtcclxuICAgIH1cclxuICB9LCBbbWFwUmVmLCBtYXBdKTtcclxuXHJcbiAgLy8gSGFuZGxlIG9ubGluZS9vZmZsaW5lIHN0YXR1c1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCBjaGVja0ludGVybmV0KTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib2ZmbGluZVwiLCBjaGVja0ludGVybmV0KTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwib25saW5lXCIsIGNoZWNrSW50ZXJuZXQpO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgY2hlY2tJbnRlcm5ldCk7XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgLy8gVXBkYXRlIG1hcCBsYXllcnMgYmFzZWQgb24gb25saW5lIHN0YXR1c1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAobWFwKSB7XHJcbiAgICAgIGNvbnN0IG5ld0xheWVyID0gTC50aWxlTGF5ZXIoXHJcbiAgICAgICAgb25saW5lID8gb25saW5lVGlsZUxheWVyIDogb2ZmbGluZVRpbGVMYXllcixcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtaW5ab29tOiA3LFxyXG4gICAgICAgICAgbWF4Wm9vbTogb25saW5lID8gMTkgOiAxNCxcclxuICAgICAgICAgIGF0dHJpYnV0aW9uOlxyXG4gICAgICAgICAgICAnTWFwIGRhdGEgwqkgPGEgaHJlZj1cImh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodFwiPk9wZW5TdHJlZXRNYXA8L2E+IGNvbnRyaWJ1dG9ycycsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgbWFwLmVhY2hMYXllcigobGF5ZXIpID0+IHtcclxuICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLlRpbGVMYXllcikge1xyXG4gICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbmV3TGF5ZXIuYWRkVG8obWFwKTtcclxuICAgIH1cclxuICB9LCBbb25saW5lLCBtYXBdKTtcclxuXHJcbiAgLy8gTWFya2VyIGhhbmRsaW5nXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIC8vIFJlbW92ZSBvbGQgbWFya2Vyc1xyXG4gICAgaWYgKG1hcCkge1xyXG4gICAgICBtYXAuZWFjaExheWVyKChsYXllcikgPT4ge1xyXG4gICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuTWFya2VyKSB7XHJcbiAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBBZGQgbmV3IG1hcmtlcnNcclxuICAgICAgbG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBsYXRpdHVkZSwgbG9uZ2l0dWRlIH0gPSBwYXJzZVBvaW50KGxvY2F0aW9uLnBvc2l0aW9uKTtcclxuICAgICAgICBjb25zdCBtYXJrZXIgPSBMLm1hcmtlcihbbGF0aXR1ZGUsIGxvbmdpdHVkZV0sIHtcclxuICAgICAgICAgIGljb246IEwuaWNvbih7XHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiL2xvY2F0aW9uLnN2Z1wiLFxyXG4gICAgICAgICAgICBpY29uU2l6ZTogWzM0LCAzNF0sXHJcbiAgICAgICAgICAgIGljb25BbmNob3I6IFsxNywgMzRdLFxyXG4gICAgICAgICAgICBwb3B1cEFuY2hvcjogWzAsIC0zNF0sXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGlkOiBsb2NhdGlvbi5pZFBvaSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbWFya2VyLmJpbmRQb3B1cChcclxuICAgICAgICAgIGA8Yj4ke2xvY2F0aW9uLmRlc2NyaXB0aW9uIHx8IFwiVW5iZWthbm50XCJ9PC9iPjxicj5UeXBlOiAke2xvY2F0aW9uLmlkUG9pVHlwIHx8IFwiTi9BXCJ9PGJyPkxhdDogJHtsYXRpdHVkZS50b0ZpeGVkKDUpfSwgTG5nOiAke2xvbmdpdHVkZS50b0ZpeGVkKDUpfWBcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBtYXJrZXIub24oXCJkcmFnZW5kXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdMYXQgPSBlLnRhcmdldC5nZXRMYXRMbmcoKS5sYXQ7XHJcbiAgICAgICAgICBjb25zdCBuZXdMbmcgPSBlLnRhcmdldC5nZXRMYXRMbmcoKS5sbmc7XHJcbiAgICAgICAgICBjb25zdCBtYXJrZXJJZCA9IGUudGFyZ2V0Lm9wdGlvbnMuaWQ7XHJcbiAgICAgICAgICB1cGRhdGVMb2NhdGlvbkluRGF0YWJhc2UobWFya2VySWQsIG5ld0xhdCwgbmV3TG5nKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgb25Mb2NhdGlvblVwZGF0ZShtYXJrZXJJZCwgbmV3TGF0LCBuZXdMbmcpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG1hcmtlci5hZGRUbyhtYXApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LCBbbWFwLCBsb2NhdGlvbnMsIG9uTG9jYXRpb25VcGRhdGVdKTtcclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBmdW5jdGlvbiBwYXJzZVBvaW50KHBvaW50U3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXRjaCA9IHBvaW50U3RyaW5nLm1hdGNoKFxyXG4gICAgICAvUE9JTlRcXHMqXFwoKFxcZCsoXFwuXFxkKyk/KVxccysoXFxkKyhcXC5cXGQrKT8pXFwpL1xyXG4gICAgKTtcclxuICAgIGlmIChtYXRjaCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxvbmdpdHVkZTogcGFyc2VGbG9hdChtYXRjaFsxXSksXHJcbiAgICAgICAgbGF0aXR1ZGU6IHBhcnNlRmxvYXQobWF0Y2hbM10pLCAvLyBBY2h0dW5nOiBJbmRleCAzIGbDvHIgZGllIHp3ZWl0ZSBLb29yZGluYXRlLCB3ZWdlbiBkZXIgR3J1cHBlIChcXC5cXGQrKT9cclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEhhbmRsZSB0aGUgZXJyb3Igb3IgcmV0dXJuIGEgZGVmYXVsdC9mYWxsYmFjayB2YWx1ZVxyXG4gICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBQT0lOVCBmb3JtYXQ6XCIsIHBvaW50U3RyaW5nKTtcclxuICAgICAgcmV0dXJuIG51bGw7IC8vIE9kZXIgZWluZSBzaW5udm9sbGUgU3RhbmRhcmRhbnR3b3J0XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vLS0tLS1Lb250ZXh0bWVudS0tLS0tLS0tLS0tLS0tLS1cclxuICBjb25zdCBuZXdMaW5rID0gKGUpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghZS5yZWxhdGVkVGFyZ2V0IHx8ICFlLnJlbGF0ZWRUYXJnZXQub3B0aW9ucykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlbGF0ZWRUYXJnZXQgb3Igb3B0aW9ucyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgfVxyXG4gICAgICBhbGVydChcIk5ldWVzIEZlbnN0ZXI6IFwiICsgZS5yZWxhdGVkVGFyZ2V0Lm9wdGlvbnMudGVzdCk7XHJcbiAgICAgIHdpbmRvd1xyXG4gICAgICAgIC5vcGVuKGAuLi9kZXZpY2VzLyR7ZS5yZWxhdGVkVGFyZ2V0Lm9wdGlvbnMudGVzdH1gLCBcIl9ibGFua1wiKVxyXG4gICAgICAgIC5mb2N1cygpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCBpbiBuZXdMaW5rIGZ1bmN0aW9uOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc2FtZUxpbmsgPSAoZSkgPT4ge1xyXG4gICAgYWxlcnQoZS5yZWxhdGVkVGFyZ2V0Lm9wdGlvbnMudGVzdCk7XHJcbiAgICB3aW5kb3dcclxuICAgICAgLm9wZW4oXCIuLi9kZXZpY2VzL1wiICsgZS5yZWxhdGVkVGFyZ2V0Lm9wdGlvbnMudGVzdCwgXCJfcGFyZW50XCIpXHJcbiAgICAgIC5mb2N1cygpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGxhdGEgPSAoZSkgPT4ge1xyXG4gICAgYWxlcnQoXCJCcmVpdGVuZ3JhZDogXCIgKyBlLmxhdGxuZy5sYXQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHpvb21JbiA9IChlKSA9PiB7XHJcbiAgICBpbml0aWFsTWFwLmZseVRvKGUubGF0bG5nLCAxMik7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgem9vbU91dCA9IChlKSA9PiB7XHJcbiAgICBmbHkoKTtcclxuICB9O1xyXG4gIGNvbnN0IGNlbnRlckhlcmUgPSAoZSkgPT4ge1xyXG4gICAgaW5pdGlhbE1hcC5wYW5UbyhlLmxhdGxuZyk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc2hvd0Nvb3JkaW5hdGVzID0gKGUpID0+IHtcclxuICAgIGFsZXJ0KFwiQnJlaXRlbmdyYWQ6IFwiICsgZS5sYXRsbmcubGF0ICsgXCJcXG5Mw6RuZ2VuZ3JhZDogXCIgKyBlLmxhdGxuZy5sbmcpO1xyXG4gIH07XHJcbiAgY29uc3Qgc2hvd0RhdGEgPSAoZSkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coZSk7XHJcbiAgfTtcclxuICBjb25zdCBzaG93VGFsYXMgPSAoZSkgPT4ge1xyXG4gICAgbWFwLmFkZExheWVyKFRBTEFTKTtcclxuICAgIGxvYWREYXRhKCk7XHJcbiAgfTtcclxuICBjb25zdCBoaWRlVGFsYXMgPSAoZSkgPT4ge1xyXG4gICAgbWFwLnJlbW92ZUxheWVyKFRBTEFTKTtcclxuICAgIGxvYWREYXRhKCk7XHJcbiAgfTtcclxuICBjb25zdCBzaG93R1NNID0gKGUpID0+IHtcclxuICAgIG1hcC5hZGRMYXllcihHTUEpO1xyXG4gICAgbG9hZERhdGEoKTtcclxuICB9O1xyXG4gIGNvbnN0IGhpZGVHU00gPSAoZSkgPT4ge1xyXG4gICAgbWFwLnJlbW92ZUxheWVyKEdNQSk7XHJcbiAgICBsb2FkRGF0YSgpO1xyXG4gIH07XHJcbiAgLy8tLS0tLUtvbnRleHRtZW51LS0tLWVuZGUtLS0tLS0tLS0tLS1cclxuICAvLyBFbnN1cmUgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIG1hcCBpcyBpbml0aWFsaXplZCBhbmQgYXZhaWxhYmxlXHJcbiAgY29uc3Qgc2hvd0FkZFN0YXRpb25Qb3B1cCA9IChlKSA9PiB7XHJcbiAgICBpZiAoIWluaXRpYWxNYXApIHtcclxuICAgICAgY29uc29sZS5sb2coXCJNYXAgaXMgbm90IGluaXRpYWxpemVkLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBvcHVwQ29udGVudCA9IEwuRG9tVXRpbC5jcmVhdGUoXCJkaXZcIik7XHJcbiAgICBwb3B1cENvbnRlbnQuaW5uZXJIVE1MID0gYFxyXG4gIDxmb3JtIGlkPVwiYWRkU3RhdGlvbkZvcm1cIiBjbGFzcz1cIm0tMCBwLTIgdy1mdWxsXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG1iLTRcIj4gICAgICBcclxuICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJibG9jayBtci0yIGZsZXgtbm9uZVwiPk5hbWU6PC9sYWJlbD5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgIGlkPVwibmFtZVwiXHJcbiAgICAgIG5hbWU9XCJuYW1lXCJcclxuICAgICAgcGxhY2Vob2xkZXI9XCJOYW1lIGRlciBTdGF0aW9uXCJcclxuICAgICAgY2xhc3M9XCJibG9jayBwLTIgZmxleC1ncm93IGJvcmRlci0yIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLW1kIHRleHQtc21cIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuICBcclxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWItNFwiPiAgIFxyXG4gICAgPGxhYmVsIGZvcj1cInR5cGVcIiBjbGFzcz1cImJsb2NrIG1yLTMgZmxleC1ub25lXCI+VHlwZTo8L2xhYmVsPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgaWQ9XCJ0eXBlXCJcclxuICAgICAgbmFtZT1cInR5cGVcIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIlR5cCBkZXIgU3RhdGlvblwiXHJcbiAgICAgIGNsYXNzPVwiYmxvY2sgcC0yIGZsZXgtZ3JvdyBib3JkZXItMiBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1tZCB0ZXh0LXNtXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG1iLTRcIj5cclxuICAgIDxsYWJlbCBmb3I9XCJsYXRcIiBjbGFzcz1cImJsb2NrIG1yLTIgZmxleC1ub25lXCI+QnJlaXRlbmdyYWQ6PC9sYWJlbD5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgIGlkPVwibGF0XCJcclxuICAgICAgbmFtZT1cImxhdFwiXHJcbiAgICAgIHZhbHVlPVwiJHtlLmxhdGxuZy5sYXQudG9GaXhlZCg1KX1cIlxyXG4gICAgICByZWFkb25seVxyXG4gICAgICBjbGFzcz1cImJsb2NrIHAtMiBmbGV4LWdyb3cgYm9yZGVyLTIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbWQgdGV4dC1zbVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG4gICBcclxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWItNFwiPiAgIFxyXG4gICAgPGxhYmVsIGZvcj1cImxuZ1wiIGNsYXNzPVwiYmxvY2sgbXItMiBmbGV4LW5vbmVcIj5Mw6RuZ2VuZ3JhZDo8L2xhYmVsPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgaWQ9XCJsbmdcIlxyXG4gICAgICBuYW1lPVwibG5nXCJcclxuICAgICAgdmFsdWU9XCIke2UubGF0bG5nLmxuZy50b0ZpeGVkKDUpfVwiXHJcbiAgICAgIHJlYWRvbmx5XHJcbiAgICAgIGNsYXNzPVwiYmxvY2sgcC0yIGZsZXgtZ3JvdyBib3JkZXItMiBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1tZCB0ZXh0LXNtXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPGJ1dHRvblxyXG4gICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICBjbGFzcz1cImJnLWJsdWUtNTAwIGhvdmVyOmJnLWJsdWUtNzAwIHRleHQtd2hpdGUgZm9udC1ib2xkIHB5LTIgcHgtNCByb3VuZGVkIHctZnVsbFwiXHJcbiAgPlxyXG4gICAgU3RhdGlvbiBoaW56dWbDvGdlblxyXG4gIDwvYnV0dG9uPlxyXG48L2Zvcm0+XHJcbiAgYDtcclxuXHJcbiAgICBMLnBvcHVwKCkuc2V0TGF0TG5nKGUubGF0bG5nKS5zZXRDb250ZW50KHBvcHVwQ29udGVudCkub3Blbk9uKGluaXRpYWxNYXApO1xyXG5cclxuICAgIC8vIEF0dGFjaCBldmVudCBsaXN0ZW5lciBoZXJlXHJcbiAgICBMLkRvbUV2ZW50Lm9uKHBvcHVwQ29udGVudCwgXCJzdWJtaXRcIiwgaGFuZGxlU3VibWl0KTtcclxuICB9O1xyXG5cclxuICAvKlxyXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IChldmVudCkgPT4ge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQ7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBuYW1lOiBmb3JtLm5hbWUudmFsdWUsXHJcbiAgICAgIHR5cGU6IGZvcm0udHlwZS52YWx1ZSxcclxuICAgICAgbGF0aXR1ZGU6IGZvcm0ubGF0LnZhbHVlLFxyXG4gICAgICBsb25naXR1ZGU6IGZvcm0ubG5nLnZhbHVlLFxyXG4gICAgfTtcclxuXHJcbiAgICBvbkFkZExvY2F0aW9uKG5hbWUsIHR5cGUsIGxhdCwgbG5nKTtcclxuICAgIGNvbnNvbGUubG9nKFwiTmFtZTogXCIsIG5hbWUsIFwiVHlwZTogXCIsIHR5cGUsIFwiTGF0OiBcIiwgbGF0LCBcIkxuZzogXCIsIGxuZyk7XHJcbiAgICBtYXAuY2xvc2VQb3B1cCgpO1xyXG4gIH07XHJcbiovXHJcbiAgLy8gRnVua3Rpb24genVtIEhpbnp1ZsO8Z2VuIGVpbmVzIG5ldWVuIFN0YW5kb3J0c1xyXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQ7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBuYW1lOiBmb3JtLm5hbWUudmFsdWUsXHJcbiAgICAgIHR5cGU6IGZvcm0udHlwZS52YWx1ZSxcclxuICAgICAgbGF0aXR1ZGU6IGZvcm0ubGF0LnZhbHVlLFxyXG4gICAgICBsb25naXR1ZGU6IGZvcm0ubG5nLnZhbHVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL2FwaS9hZGRMb2NhdGlvblwiLCB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhbmRvcnQgaGluenVnZWbDvGd0OlwiLCByZXN1bHQpO1xyXG4gICAgICAgIGFsZXJ0KFwiU3RhbmRvcnQgZXJmb2xncmVpY2ggaGluenVnZWbDvGd0IVwiKTtcclxuICAgICAgICBmb3JtLnJlc2V0KCk7IC8vIEZvcm11bGFyIHp1csO8Y2tzZXR6ZW5cclxuICAgICAgICAvLyBIaWVyIGvDtm5udGVzdCBkdSB3ZWl0ZXJlIEFrdGlvbmVuIGR1cmNoZsO8aHJlbiwgd2llIGRhcyBTY2hsaWXDn2VuIGRlcyBQb3B1cHMgb2RlciBkYXMgQWt0dWFsaXNpZXJlbiBkZXIgTWFya2VyIGF1ZiBkZXIgS2FydGVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICByZXN1bHQuZXJyb3IgfHwgXCJFaW4gdW5iZWthbm50ZXIgRmVobGVyIGlzdCBhdWZnZXRyZXRlbi5cIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGZWhsZXIgYmVpbSBIaW56dWbDvGdlbiBkZXMgU3RhbmRvcnRzOlwiLCBlcnJvcik7XHJcbiAgICAgIGFsZXJ0KGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZmx5KHN0YXRpb25WYWx1ZSkge1xyXG4gICAgdmFyIHggPSA1MS40MTMyMTQwNzg3OTE1NDtcclxuICAgIHZhciB5ID0gNy43Mzk2MTc5MjUzMDM5MzQ7XHJcbiAgICB2YXIgem9vbSA9IDc7XHJcblxyXG4gICAgLyogIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVN0YXRpY2xlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBnaXNTdGF0aWNzID0gZGF0YVN0YXRpY1tpXTtcclxuICAgICAgaWYgKHN0YXRpb25WYWx1ZSA9PT0gZ2lzU3RhdGljcy5BcmVhX05hbWUpIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGdpc1N0YXRpY3MuWCtcIixcIitnaXNTdGF0aWNzLlkpO1xyXG4gICAgICAgIHggPSBnaXNTdGF0aWNzLlg7XHJcbiAgICAgICAgeSA9IGdpc1N0YXRpY3MuWTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHkgPT09IDcuNzM5NjE3OTI1MzAzOTM0KSB7XHJcbiAgICAgIHpvb20gPSA4O1xyXG4gICAgfSAqL1xyXG4gICAgaW5pdGlhbE1hcC5mbHlUbyhbeCwgeV0sIHpvb20pO1xyXG5cclxuICAgIC8qIHZhciBwb3B1cCA9IG5ldyBMLlBvcHVwKCk7XHJcbiAgICBvbXMuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAobWFya2VyKSB7XHJcbiAgICAgIHBvcHVwLnNldENvbnRlbnQobWFya2VyLmRlc2MpO1xyXG4gICAgICBwb3B1cC5zZXRMYXRMbmcobWFya2VyLmdldExhdExuZygpKTtcclxuICAgICAgbWFwLm9wZW5Qb3B1cChwb3B1cCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpbmRvdy5tYXBEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBkYXR1bSA9IHdpbmRvdy5tYXBEYXRhW2ldO1xyXG4gICAgICB2YXIgbG9jID0gbmV3IEwuTGF0TG5nKGRhdHVtLmxhdCwgZGF0dW0ubG9uKTtcclxuICAgICAgdmFyIG1hcmtlciA9IG5ldyBMLk1hcmtlcihsb2MpO1xyXG4gICAgICBtYXJrZXIuZGVzYyA9IGRhdHVtLmQ7XHJcbiAgICAgIG1hcC5hZGRMYXllcihtYXJrZXIpO1xyXG4gICAgICAvL29tcy5hZGRNYXJrZXIobWFya2VyKTsgIC8vIDwtLSBoZXJlXHJcbiAgICB9ICovXHJcbiAgfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdlxyXG4gICAgICBpZD1cIm1hcFwiXHJcbiAgICAgIHJlZj17bWFwUmVmfVxyXG4gICAgICBzdHlsZT17eyBoZWlnaHQ6IFwiMTAwdmhcIiwgd2lkdGg6IFwiMTAwdndcIiwgb3ZlcmZsb3c6IFwiaGlkZGVuXCIgfX1cclxuICAgID48L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWFwQ29tcG9uZW50O1xyXG4iXSwibmFtZXMiOlsiUmVhY3QiLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIkwiLCJNYXBDb21wb25lbnQiLCJsb2NhdGlvbnMiLCJvbkxvY2F0aW9uVXBkYXRlIiwibWFwUmVmIiwibWFwIiwic2V0TWFwIiwib25saW5lIiwic2V0T25saW5lIiwibmF2aWdhdG9yIiwib25MaW5lIiwib2ZmbGluZVRpbGVMYXllciIsIm9ubGluZVRpbGVMYXllciIsImluaXRpYWxNYXAiLCJjaGVja0ludGVybmV0IiwiY29uc29sZSIsImxvZyIsImZldGNoIiwibWV0aG9kIiwidGhlbiIsInJlc3BvbnNlIiwib2siLCJjYXRjaCIsImN1cnJlbnQiLCJjZW50ZXIiLCJ6b29tIiwiem9vbUNvbnRyb2wiLCJjb250ZXh0bWVudSIsImNvbnRleHRtZW51SXRlbXMiLCJ0ZXh0IiwiY2FsbGJhY2siLCJzaG93QWRkU3RhdGlvblBvcHVwIiwiaWNvbiIsIm5ld0xpbmsiLCJzYW1lTGluayIsImxhdGEiLCJ6b29tSW4iLCJ6b29tT3V0IiwiY2VudGVySGVyZSIsInRpbGVMYXllciIsImF0dHJpYnV0aW9uIiwiYWRkVG8iLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm5ld0xheWVyIiwibWluWm9vbSIsIm1heFpvb20iLCJlYWNoTGF5ZXIiLCJsYXllciIsIlRpbGVMYXllciIsInJlbW92ZUxheWVyIiwiTWFya2VyIiwiZm9yRWFjaCIsImxvY2F0aW9uIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJwYXJzZVBvaW50IiwicG9zaXRpb24iLCJtYXJrZXIiLCJpY29uVXJsIiwiaWNvblNpemUiLCJpY29uQW5jaG9yIiwicG9wdXBBbmNob3IiLCJkcmFnZ2FibGUiLCJpZCIsImlkUG9pIiwiYmluZFBvcHVwIiwiZGVzY3JpcHRpb24iLCJpZFBvaVR5cCIsInRvRml4ZWQiLCJvbiIsImUiLCJuZXdMYXQiLCJ0YXJnZXQiLCJnZXRMYXRMbmciLCJsYXQiLCJuZXdMbmciLCJsbmciLCJtYXJrZXJJZCIsIm9wdGlvbnMiLCJ1cGRhdGVMb2NhdGlvbkluRGF0YWJhc2UiLCJwb2ludFN0cmluZyIsIm1hdGNoIiwicGFyc2VGbG9hdCIsImVycm9yIiwicmVsYXRlZFRhcmdldCIsIkVycm9yIiwiYWxlcnQiLCJ0ZXN0Iiwib3BlbiIsImZvY3VzIiwibGF0bG5nIiwiZmx5VG8iLCJmbHkiLCJwYW5UbyIsInNob3dDb29yZGluYXRlcyIsInNob3dEYXRhIiwic2hvd1RhbGFzIiwiYWRkTGF5ZXIiLCJUQUxBUyIsImxvYWREYXRhIiwiaGlkZVRhbGFzIiwic2hvd0dTTSIsIkdNQSIsImhpZGVHU00iLCJwb3B1cENvbnRlbnQiLCJEb21VdGlsIiwiY3JlYXRlIiwiaW5uZXJIVE1MIiwicG9wdXAiLCJzZXRMYXRMbmciLCJzZXRDb250ZW50Iiwib3Blbk9uIiwiRG9tRXZlbnQiLCJoYW5kbGVTdWJtaXQiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiZm9ybSIsImRhdGEiLCJuYW1lIiwidmFsdWUiLCJ0eXBlIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzdWx0IiwianNvbiIsInJlc2V0IiwibWVzc2FnZSIsInN0YXRpb25WYWx1ZSIsIngiLCJ5IiwiZGl2IiwicmVmIiwic3R5bGUiLCJoZWlnaHQiLCJ3aWR0aCIsIm92ZXJmbG93Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./components/MapComponent.js\n");
/***/ })
};
;