您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Normaliza nombres de lugares y gestiona categorías dinámicamente en WME.
当前为
// ==UserScript== // @name WME Places Name Normalizer // @namespace https://gf.qytechs.cn/en/users/mincho77 // @version 8.0.0 // @author Mincho77 // @description Normaliza nombres de lugares y gestiona categorías dinámicamente en WME. // @license MIT // @include https://beta.waze.com/* // @include https://www.waze.com/editor* // @include https://www.waze.com/*/editor* // @exclude https://www.waze.com/user/editor* // @grant GM_xmlhttpRequest // @connect sheets.googleapis.com // @run-at document-end // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js // ==/UserScript== (function () { //window.normalizeWordInternal = normalizeWordInternal; // Variables globales básicas const SCRIPT_NAME = GM_info.script.name; const VERSION = GM_info.script.version.toString(); // Variables globales para el diccionario de palabras excluidas //Permite inicializar el diccionario de palabras intercambiadas if (!window.swapWords) { const stored = localStorage.getItem("wme_swapWords"); window.swapWords = stored ? JSON.parse(stored) : []; } // Variables globales para el panel flotante let floatingPanelElement = null; let dynamicCategoriesLoaded = false; const tempSelectedCategories = new Map(); // Mapa para placeId -> categoryKey seleccionada const placesForDuplicateCheckGlobal = []; // Nueva variable global para almacenar datos de lugares para verificar duplicados const processingPanelDimensions = { width: '400px', height: '200px' }; // Panel pequeño para procesamiento const resultsPanelDimensions = { width: '1400px', height: '700px' }; // Panel grande para resultados const commonWords = [//Palabras comunes en español que no deberían ser consideradas para normalización 'de', 'del', 'el', 'la', 'los', 'las', 'y', 'e', 'o', 'u', 'un', 'una', 'unos', 'unas', 'a', 'en', 'con', 'tras', 'por', 'al', 'lo' ]; const tabNames = [//Definir nombres de pestañas cortos antes de la generación de botones { label: "Gene", icon: "⚙️" }, { label: "Espe", icon: "🏷️" }, { label: "Dicc", icon: "📘" }, { label: "Reemp", icon: "🔂" } ]; let statsPanelElement = null; // Para el panel flotante de estadísticas let editorStats = {}; // Para almacenar las estadísticas en memoria const STATS_STORAGE_KEY = 'wme_pln_editor_stats'; // Clave para localStorage const STATS_ENABLED_KEY = 'wme_pln_stats_enabled'; // Clave para el checkbox de visibilidad let wmeSDK = null; // Almacena la instancia del SDK de WME. //Variable global para almacenar la información del usuario actual let currentGlobalUserInfo = { id: null, name: 'Cargando...', privilege: 'N/A' }; //Novedades de cada version del script esto permitirá una pantalla la primera vez que se abra el script const myChangelog = { [VERSION]: { "Novedades": [ // --- NUEVAS NOVEDADES --- "Ahora puedes excluir lugares completos por su ID desde el panel de resultados, para que no vuelvan a aparecer en futuras búsquedas.", "La gestión de Palabras Especiales ahora incluye una sección para 'Lugares Excluidos', con importación/exportación.", "El panel de resultados muestra el área en m² para lugares de tipo polígono (con alerta si es < 400m²).", "Los lugares corregidos, eliminados o excluidos ahora se marcan visualmente en la tabla (tachado y atenuado) en lugar de desaparecer inmediatamente, y el contador se actualiza dinámicamente." ], "Correcciones": [ // Correcciones existentes "No identificaba palabras con emojis para habilitar el botón Aplicar", "No se estaban tomando correctamente las palabras Especiales al normalizar", "Se corrige inconveniente cuando se tiene más de una palabra exlcuída en un nombre", // --- NUEVAS CORRECCIONES --- "Se asegura que los artículos y preposiciones (ej. 'El', 'La', 'De', 'Del') en nombres propios siempre comiencen con mayúscula, incluso si no son la primera palabra del nombre.", "Corregido el problema de duplicación de guiones (ej. ' -- ') en nombres.", "Se asegura que el guion final (' -') se elimine si no hay una palabra después de un reemplazo.", "Se corrige el reemplazo contextual de palabras (ej. 'D1' a 'D1 -') para que el guion se inserte correctamente si hay una palabra siguiente.", "La lista de lugares excluidos ahora muestra el nombre del lugar (si está disponible) en lugar del ID, para una mejor identificación." ] } };// myChangelog // ======================================================================== // --- Funciones auxiliares para manejar fechas --- // Obtiene la fecha actual en formato AAAA-MM-DD function getCurrentDateString() { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); const day = String(now.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // Obtiene la semana actual en formato AAAA-WW (ISO 8601) function getCurrentISOWeekString() { const date = new Date(); date.setHours(0, 0, 0, 0); date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); const week1 = new Date(date.getFullYear(), 0, 4); const weekNumber = 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); return `${date.getFullYear()}-${String(weekNumber).padStart(2, '0')}`; } // Obtiene el mes actual en formato AAAA-MM function getCurrentMonthString() { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); return `${year}-${month}`; } // --- Funciones principales de estadísticas --- // Carga las estadísticas desde localStorage function loadEditorStats() { const savedStats = localStorage.getItem(STATS_STORAGE_KEY); if (savedStats) { try { editorStats = JSON.parse(savedStats); if (typeof editorStats !== 'object' || editorStats === null) { editorStats = {}; } } catch (e) { console.error('[WME PLN Stats] Error al parsear estadísticas desde localStorage:', e); editorStats = {}; } } else { editorStats = {}; } } // Guarda las estadísticas en localStorage function saveEditorStats() { try { localStorage.setItem(STATS_STORAGE_KEY, JSON.stringify(editorStats)); } catch (e) { console.error('[WME PLN Stats] Error al guardar estadísticas en localStorage:', e); } } // Registra una edición y actualiza los contadores function recordNormalizationEvent() { const userId = currentGlobalUserInfo.id; const userName = currentGlobalUserInfo.name; if (!userId || userId === 0 || userName === 'No detectado') { return; } // Obtiene las estadísticas del usuario o las inicializa si no existen let userStats = editorStats[userId]; if (!userStats) { userStats = { userName: userName, total_count: 0, monthly_count: 0, monthly_period: "N/A", weekly_count: 0, weekly_period: "N/A", daily_count: 0, daily_period: "N/A", last_update: 0 }; editorStats[userId] = userStats; } // Obtiene los periodos de tiempo actuales const todayStr = getCurrentDateString(); const weekStr = getCurrentISOWeekString(); const monthStr = getCurrentMonthString(); // --- Lógica de reseteo de contadores --- // Si la fecha guardada es diferente a la de hoy, resetea el contador diario. if (userStats.daily_period !== todayStr) { userStats.daily_count = 0; userStats.daily_period = todayStr; } // Si la semana guardada es diferente a la de hoy, resetea el contador semanal. if (userStats.weekly_period !== weekStr) { userStats.weekly_count = 0; userStats.weekly_period = weekStr; } // Si el mes guardado es diferente al de hoy, resetea el contador mensual. if (userStats.monthly_period !== monthStr) { userStats.monthly_count = 0; userStats.monthly_period = monthStr; } // --- Incrementar los contadores --- userStats.daily_count++; userStats.weekly_count++; userStats.monthly_count++; userStats.total_count++; userStats.last_update = Date.now(); userStats.userName = userName; // Asegurarse de que el nombre esté actualizado // Guardar los nuevos datos y actualizar la pantalla saveEditorStats(); updateStatsDisplay(); } // Devuelve la palabra excluida original si existe en la lista (case-insensitive, ignora tildes y espacios) function isExcludedWord(word) { if (!word || !excludedWords) return null; // Normaliza quitando tildes y pasa a minúsculas const clean = w => w.trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); const cleanedWord = clean(word); for (const excl of excludedWords) { if (clean(excl) === cleanedWord) { return excl; // Devuelve la versión guardada, con sus mayúsculas/tildes originales } } return null; }// isExcludedWord // Muestra los contadores en el panel flotante function updateStatsDisplay() { if (!statsPanelElement || !currentGlobalUserInfo.id) return; const userId = currentGlobalUserInfo.id; // Obtiene los datos guardados o valores por defecto si no existen const stats = editorStats[userId] || { daily_count: 0, weekly_count: 0, monthly_count: 0, total_count: 0 }; // Actualiza los elementos de la UI con los valores guardados const summaryText = statsPanelElement.querySelector('#stats-summary-text'); const todayCountSpan = statsPanelElement.querySelector('#stats-count-today'); const weekCountSpan = statsPanelElement.querySelector('#stats-count-week'); const monthCountSpan = statsPanelElement.querySelector('#stats-count-month'); const totalCountSpan = statsPanelElement.querySelector('#stats-count-total'); if (summaryText) summaryText.textContent = `📊 ${stats.daily_count || 0} Places NrmliZed`; if (todayCountSpan) todayCountSpan.textContent = stats.daily_count || 0; if (weekCountSpan) weekCountSpan.textContent = stats.weekly_count || 0; if (monthCountSpan) monthCountSpan.textContent = stats.monthly_count || 0; if (totalCountSpan) totalCountSpan.textContent = stats.total_count || 0; } // Crea el panel de estadísticas flotante en la interfaz de usuario. function createStatsPanel() { if (document.getElementById('wme-pln-stats-panel')) return; // Contenedor principal del panel statsPanelElement = document.createElement('div'); statsPanelElement.id = 'wme-pln-stats-panel'; Object.assign(statsPanelElement.style, { position: 'fixed', bottom: '60px', left: '23%', // <-- Ancla el panel a 20px del borde izquierdo // Se elimina la propiedad 'transform' que ya no es necesaria backgroundColor: 'rgba(45, 45, 45, 0.9)', color: 'white', padding: '5px 12px', borderRadius: '15px', fontSize: '13px', fontFamily: "'Helvetica Neue', Helvetica, Arial, sans-serif", zIndex: '10000', cursor: 'pointer', display: 'none', // Oculto inicialmente border: '1px solid #555', boxShadow: '0 2px 10px rgba(0,0,0,0.5)', userSelect: 'none', whiteSpace: 'nowrap' }); // Vista de resumen (la que siempre está visible) const summaryView = document.createElement('div'); summaryView.id = 'stats-summary-view'; Object.assign(summaryView.style, { display: 'flex', alignItems: 'center', gap: '6px' }); const summaryText = document.createElement('span'); summaryText.id = 'stats-summary-text'; summaryText.textContent = '📊 0 NrmliZer Stats'; const dropdownArrow = document.createElement('span'); dropdownArrow.id = 'stats-arrow'; dropdownArrow.textContent = '▼'; dropdownArrow.style.fontSize = '10px'; summaryView.appendChild(summaryText); summaryView.appendChild(dropdownArrow); // Vista detallada (la que se expande) const detailView = document.createElement('div'); detailView.id = 'stats-detail-view'; Object.assign(detailView.style, { display: 'none', marginTop: '8px', paddingTop: '8px', borderTop: '1px solid #666' }); const list = document.createElement('ul'); Object.assign(list.style, { margin: '0', padding: '0', listStyle: 'none', textAlign: 'left' }); // Crear elementos de la lista const items = { 'Hoy': 'stats-count-today', 'Esta Semana': 'stats-count-week', 'Este Mes': 'stats-count-month', 'Total': 'stats-count-total' }; for (const [label, id] of Object.entries(items)) { const listItem = document.createElement('li'); listItem.style.marginBottom = '4px'; const countBold = document.createElement('b'); countBold.id = id; countBold.textContent = '0'; listItem.append(`${label}: `, countBold); list.appendChild(listItem); } detailView.appendChild(list); // Ensamblar el panel statsPanelElement.appendChild(summaryView); statsPanelElement.appendChild(detailView); document.body.appendChild(statsPanelElement); // Lógica para desplegar/contraer statsPanelElement.addEventListener('click', () => { const isHidden = detailView.style.display === 'none'; detailView.style.display = isHidden ? 'block' : 'none'; dropdownArrow.textContent = isHidden ? '▲' : '▼'; }); // Lógica para cerrar al hacer clic fuera document.addEventListener('click', (e) => { if (!statsPanelElement.contains(e.target)) { detailView.style.display = 'none'; dropdownArrow.textContent = '▼'; } }, true); toggleStatsPanelVisibility(); }// createStatsPanel // Función para alternar la visibilidad del panel de estadísticas basado en el estado del checkbox. function toggleStatsPanelVisibility() { if (!statsPanelElement) return; const isEnabled = localStorage.getItem(STATS_ENABLED_KEY) === 'true'; statsPanelElement.style.display = isEnabled ? 'block' : 'none'; }// toggleStatsPanelVisibility // ======================================================================== // FIN: Bloque De Funciones Para Estadísticas // Función que construirá el HTML del changelog function getChangelogHtml(versionData) { let html = ''; if (versionData["Novedades"] && versionData["Novedades"].length > 0) { html += `<h6>Novedades:</h6><ul style="margin-bottom: 10px; list-style-type: disc; margin-left: 20px;">`; versionData["Novedades"].forEach(item => { html += `<li>${item}</li>`; }); html += `</ul>`; } if (versionData["Correcciones"] && versionData["Correcciones"].length > 0) { html += `<h6>Correcciones:</h6><ul style="margin-bottom: 10px; list-style-type: disc; margin-left: 20px;">`; versionData["Correcciones"].forEach(item => { html += `<li>${item}</li>`; }); html += `</ul>`; } return html; }//getChangelogHtml // Función para mostrar el changelog al actualizar el script function showChangelogOnUpdate() { const LAST_SEEN_VERSION_KEY = `${SCRIPT_NAME}_last_seen_version`; const lastSeenVersion = localStorage.getItem(LAST_SEEN_VERSION_KEY); const currentScriptVersion = VERSION; // Variable global VERSION // Obtener la versión actual del script desde GM_info const versionData = myChangelog[currentScriptVersion]; // Verificar si hay datos de versión y si la versión actual es diferente a la última vista if (versionData && currentScriptVersion !== lastSeenVersion) { const title = `${SCRIPT_NAME} v${currentScriptVersion}`; const bodyHtml = getChangelogHtml(versionData); // Genera el HTML del cuerpo // Crear el modal const modal = document.createElement("div"); modal.style.position = "fixed"; modal.style.top = "50%"; modal.style.left = "50%"; modal.style.transform = "translate(-50%, -50%)"; modal.style.backgroundColor = "#fff"; modal.style.border = "1px solid #ccc"; modal.style.borderRadius = "8px"; modal.style.boxShadow = "0 5px 15px rgba(0,0,0,0.3)"; modal.style.padding = "20px"; modal.style.fontFamily = "'Helvetica Neue', Helvetica, Arial, sans-serif"; modal.style.zIndex = "20000"; // Por encima de casi todo modal.style.width = "450px"; modal.style.maxHeight = "80vh"; modal.style.overflowY = "auto"; // Estilos adicionales para el modal const modalTitle = document.createElement("h3"); modalTitle.textContent = title; modalTitle.style.marginTop = "0"; modalTitle.style.marginBottom = "15px"; modalTitle.style.textAlign = "center"; modalTitle.style.color = "#333"; // Crear el cuerpo del modal con el contenido del changelog const modalBody = document.createElement("div"); modalBody.innerHTML = bodyHtml; // Estilos para el cuerpo del modal const closeButton = document.createElement("button"); closeButton.textContent = "Entendido"; closeButton.style.display = "block"; closeButton.style.margin = "20px auto 0 auto"; closeButton.style.padding = "10px 20px"; closeButton.style.backgroundColor = "#007bff"; closeButton.style.color = "#fff"; closeButton.style.border = "none"; closeButton.style.borderRadius = "5px"; closeButton.style.cursor = "pointer"; // closeButton.addEventListener("click", () => { modal.remove(); localStorage.setItem(LAST_SEEN_VERSION_KEY, currentScriptVersion); // Guarda la versión }); // Añadir todo al modal y al body modal.appendChild(modalTitle); modal.appendChild(modalBody); modal.appendChild(closeButton); document.body.appendChild(modal); } else if (!versionData) {// // Si no hay datos de versión, no se hace nada localStorage.setItem(LAST_SEEN_VERSION_KEY, currentScriptVersion); } }//showChangelogOnUpdate //Permite inicializar el SDK de WME function tryInitializeSDK(finalCallback) { let attempts = 0; const maxAttempts = 60; // Intentos máximos (60 * 500ms = 30 segundos) const intervalTime = 500; let sdkAttemptInterval = null; // Función interna para intentar obtener el SDK de WME function attempt() { if (typeof getWmeSdk === 'function') { if (sdkAttemptInterval) clearInterval(sdkAttemptInterval); try { wmeSDK = getWmeSdk({scriptId : 'WMEPlacesNameInspector', scriptName : SCRIPT_NAME, }); if (wmeSDK) console.log("[WME_PLN][SDK INIT SUCCESS] SDK obtenido exitosamente:", wmeSDK); else console.warn("[WME_PLN][SDK INIT WARNING] getWmeSdk() fue llamada pero devolvió null/undefined."); } catch (e) { console.error("[WME_PLN][SDK INIT ERROR] Error al llamar a getWmeSdk():", e); wmeSDK = null; } finalCallback(); return; } attempts++; if (attempts >= maxAttempts) { if (sdkAttemptInterval) clearInterval(sdkAttemptInterval); // console.error(`[WME_PLN][SDK INIT FAILURE] No se pudo encontrar getWmeSdk() después de ${maxAttempts} intentos.`); wmeSDK = null; finalCallback(); } } sdkAttemptInterval = setInterval(attempt, intervalTime); attempt(); }//tryInitializeSDK //----------------------------------------------------------------------------------------------------------- // 1) Con el WME SDK // Funciones de obtención de usuario (revisa y asegúrate de que tengan estos logs) async function getCurrentEditorViaSdk() { if (!wmeSDK) { //console.log('[WME PLN][DEBUG] SDK: wmeSDK es null.'); return null; } if (!wmeSDK.DataModel || !wmeSDK.DataModel.User || typeof wmeSDK.DataModel.User.getCurrentUser !== 'function') { //console.log('[WME PLN][DEBUG] SDK: DataModel.User o getCurrentUser no disponible. DataModel:', wmeSDK.DataModel); // Más detalles return null; } try { const user = await wmeSDK.DataModel.User.getCurrentUser(); if (user && user.id && user.name) { //console.log(`[WME PLN][DEBUG] SDK SUCCESS: Usuario obtenido: ${user.name} (ID: ${user.id})`); return { id: user.id, name: user.name, privilege: user.privilege }; } else { console.warn('[WME PLN][DEBUG] SDK: getCurrentUser() devolvió datos incompletos o null:', user); return null; } } catch (e) { console.error('[WME PLN][DEBUG] SDK ERROR al obtener usuario:', e); return null; } }// getCurrentEditorViaSdk // 2) Con WazeWrap function getCurrentEditorViaWazeWrap() { if (typeof WazeWrap === 'undefined') { //console.log('[WME PLN][DEBUG] WazeWrap: WazeWrap no definido.'); return null; } if (!WazeWrap.Login || typeof WazeWrap.Login.getLoggedInUser !== 'function') { //console.log('[WME PLN][DEBUG] WazeWrap: Login.getLoggedInUser() no disponible. WazeWrap.Login:', WazeWrap.Login); // Más detalles return null; } const wrapUser = WazeWrap.Login.getLoggedInUser(); if (wrapUser && wrapUser.userId && wrapUser.username) { //console.log(`[WME PLN][DEBUG] WazeWrap SUCCESS: Usuario obtenido: ${wrapUser.username} (ID: ${wrapUser.userId})`); return { id: wrapUser.userId, name: wrapUser.username, privilege: wrapUser.privilege }; } else { //console.log('[WME PLN][DEBUG] WazeWrap: getLoggedInUser() devolvió datos incompletos o null:', wrapUser); return null; } }// getCurrentEditorViaWazeWrap // 3) Fallback a la API nativa de WME function getCurrentEditorViaWmeInternal() { if (typeof W === 'undefined' || !W.loginManager) { //console.log('[WME PLN][DEBUG] WME Internal: W o W.loginManager no definido.'); return null; } if (W.loginManager.userId && W.loginManager.userName) { //console.log(`[WME PLN][DEBUG] WME Internal SUCCESS: Usuario obtenido: ${W.loginManager.userName} (ID: ${W.loginManager.userId})`); return { id: W.loginManager.userId, name: W.loginManager.userName, privilege: W.loginManager.userPrivilege }; } else { //console.log('[WME PLN][DEBUG] WME Internal: W.loginManager devolvió datos incompletos o null:', W.loginManager); // Más detalles // Puedes incluso logear todo el objeto W.loginManager para ver su contenido // console.log('[WME_PLN][DEBUG] W.loginManager content:', W.loginManager); return null; } }// getCurrentEditorViaWmeInternal //----------------------------------------------------------------------------------------------------------- // Esperar a que la API principal de Waze esté completamente cargada async function waitForWazeAPI(callbackPrincipalDelScript) { let wAttempts = 0; const wMaxAttempts = 40; const wInterval = setInterval(async () => { wAttempts++; if (typeof W !== 'undefined' && W.map && W.loginManager && W.model && W.model.venues && W.userscripts && typeof W.userscripts.registerSidebarTab === 'function') { clearInterval(wInterval); if (!dynamicCategoriesLoaded) // solo carga las categorías de Google Sheets si no se han cargado aún { try { await loadDynamicCategoriesFromSheet(); dynamicCategoriesLoaded = true; // <-- Marcar como cargado } catch (error) { console.error("No se pudieron cargar las categorías dinámicas:", error); } } // : Esperar a que tryInitializeSDK se complete tryInitializeSDK(() => { // // Una vez que el SDK ha intentado inicializarse (exitosamente o no), // y las APIs de WazeWrap y W.loginManager deberían estar cargadas, // llamamos al callback principal del script (createSidebarTab). callbackPrincipalDelScript(); // : Mueve el callback aquí }); // } else if (wAttempts >= wMaxAttempts) // Si no se ha cargado la API de Waze después de 20 segundos { clearInterval(wInterval); console.error("[WME PLN] Waze API no se cargó completamente después de múltiples intentos."); // callbackPrincipalDelScript(); // Llama al callback de todas formas si se agotaron los intentos } }, 500); }//waitforWazeAPI //+++++++++Funciones de Georeferenciación y Distancia++++++++++++++ // Función para calcular la distancia en metros entre dos puntos geográficos (latitud, longitud) function calculateDistance(lat1, lon1, lat2, lon2) { const earthRadiusMeters = 6371e3; // Radio de la Tierra en metros // Convertir latitudes y diferencias de longitudes de grados a radianes const lat1Rad = lat1 * Math.PI / 180;// Convertir latitud 1 a radianes const lat2Rad = lat2 * Math.PI / 180;// Convertir latitud 2 a radianes const deltaLatRad = (lat2 - lat1) * Math.PI / 180;// Convertir diferencia de latitudes a radianes const deltaLonRad = (lon2 - lon1) * Math.PI / 180;// Convertir diferencia de longitudes a radianes // Fórmula de Haversine para calcular la distancia entre dos puntos en una esfera // a = sin²(Δlat/2) + cos(lat1) * cos(lat2) * sin²(Δlon/2) const a = Math.sin(deltaLatRad / 2) * Math.sin(deltaLatRad / 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.sin(deltaLonRad / 2) * Math.sin(deltaLonRad / 2);// // c = 2 * atan2(√a, √(1−a)) const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // Calcular la distancia final en metros const distanceMeters = earthRadiusMeters * c; return distanceMeters; }//calculateDistance //Función para obtener coordenadas de un lugar function getPlaceCoordinates(venueOldModel, venueSDK) { let lat = null; let lon = null; const placeId = venueOldModel ? venueOldModel.getID() : 'N/A'; // Priorizar SDK si tiene 'geometry.coordinates' (lat/lon como array [lon, lat]) if (venueSDK && venueSDK.geometry && Array.isArray(venueSDK.geometry.coordinates) && venueSDK.geometry.coordinates.length === 2) { lon = venueSDK.geometry.coordinates[0]; lat = venueSDK.geometry.coordinates[1]; if (typeof lat === 'number' && typeof lon === 'number' && Math.abs(lat) <= 90 && Math.abs(lon) <= 180) { // console.log(`[WME_PLN][COORD] Coords from SDK (geometry.coordinates) for ID ${placeId}: ${lat}, ${lon}`); return { lat, lon }; } else { console.log(`[WME PLN][COORD] SDK geometry.coordinates tiene valores no geográficos o inválidos para ID ${placeId}. Coords: [${lon}, ${lat}]`); lat = null; lon = null; } } // Si no se obtuvieron del SDK o eran inválidas, intentar con 'geometry.centroid' del SDK if (venueSDK && venueSDK.geometry && venueSDK.geometry.centroid) { if (typeof venueSDK.geometry.centroid.lat === 'number' && typeof venueSDK.geometry.centroid.lon === 'number') { lat = venueSDK.geometry.centroid.lat; lon = venueSDK.geometry.centroid.lon; // console.log(`[WME_PLN][COORD] Coords from SDK (geometry.centroid) for ID ${placeId}: ${lat}, ${lon}`); return { lat, lon }; } else { console.log(`[WME PLN][COORD] SDK geometry.centroid lacks numerical lat/lon for ID ${placeId}. Centroid:`, venueSDK.geometry.centroid); lat = null; lon = null; } } // Fallback a OpenLayers Geometry (modelo antiguo) si SDK no proporcionó o fue inválido // Añadiendo conversión de coordenadas de proyección. if ((lat === null || lon === null) && venueOldModel && typeof venueOldModel.getOLGeometry === 'function') { try { const geometry = venueOldModel.getOLGeometry(); if (geometry && typeof geometry.getCentroid === 'function') { const centroid = geometry.getCentroid(); if (centroid && typeof centroid.x === 'number' && typeof centroid.y === 'number') { // Convertir de la proyección de Waze (Spherical Mercator) a WGS84 (Lat/Lon) // Waze usa EPSG:3857 (Spherical Mercator) para sus coordenadas de mapa interno. // La función OL.Projection.transform es la clave aquí. // OpenLayers.Projection debe estar disponible globalmente. if (typeof OpenLayers !== 'undefined' && OpenLayers.Projection) { const mercatorPoint = new OpenLayers.Geometry.Point(centroid.x, centroid.y); const wgs84Point = mercatorPoint.transform( new OpenLayers.Projection("EPSG:3857"), // Fuente: Spherical Mercator new OpenLayers.Projection("EPSG:4326") // Destino: WGS84 Lat/Lon ); lat = wgs84Point.y; lon = wgs84Point.x; if (typeof lat === 'number' && typeof lon === 'number' && Math.abs(lat) <= 90 && Math.abs(lon) <= 180) { // console.log(`[WME_PLN][COORD] Coords from Old Model (Converted OLGeometry) for ID ${placeId}: ${lat}, ${lon}`); return { lat, lon }; } else { //console.log(`[WME PLN][COORD] OLGeometry().getCentroid() (after conversion) resulted in invalid lat/lon for ID ${placeId}. Converted: ${lat}, ${lon}`); lat = null; lon = null; } } else { console.log(`[WME PLN][COORD] OpenLayers.Projection no está disponible para la conversión de coordenadas para ID ${placeId}.`); lat = centroid.y; // Si no hay conversión, se usan las originales (que fallarán la validación) lon = centroid.x; } } else { console.log(`[WME PLN][COORD] getOLGeometry().getCentroid() returned invalid/null centroid or missing x/y for ID ${placeId}. Centroid:`, centroid); } } else { console.log(`[WME PLN][COORD] getOLGeometry() or getCentroid() method not available for ID ${placeId}. Geometry:`, geometry); } } catch (e) { console.error(`[WME_PLN][COORD] Error calling getOLGeometry() or transforming for ID ${placeId}:`, e); } } // Log final si las coordenadas siguen siendo inválidas o indefinidas. if (lat === null || lon === null || isNaN(lat) || isNaN(lon)) { console.log(`[WME PLN][COORD] No se pudieron obtener coordenadas válidas FINALES para el lugar ID: ${placeId}. Lat: ${lat}, Lon: ${lon}`); return { lat: null, lon: null }; } return { lat, lon }; }//getPlaceCoordinates // Nueva función robusta para agregar datos para verificación de duplicados function addPlaceDataForDuplicateCheck(venue, venueSDK, normalizedName) { // Usa una variable global para almacenar los datos de lugares para comparar duplicados if (typeof window.duplicatePlacesData === "undefined") window.duplicatePlacesData = []; const duplicatePlacesData = window.duplicatePlacesData; let geometry = null; if (venueSDK && venueSDK.geometry && venueSDK.geometry.coordinates) { const [lon, lat] = venueSDK.geometry.coordinates; duplicatePlacesData.push({ name: normalizedName, lat, lon, venueId: venueSDK.id }); return; } else if (venue && typeof venue.getOLGeometry === 'function') { geometry = venue.getOLGeometry(); if (geometry) { const lonLat = geometry.getCoordinates(); const lon = lonLat[0]; const lat = lonLat[1]; duplicatePlacesData.push({ name: normalizedName, lat, lon, venueId: venue.getID() }); return; } } console.warn("[WME_PLN][WARNING] No se pudo obtener geometría válida para el lugar:", venue, venueSDK); } // Función para detectar nombres duplicados cercanos y generar alertas function detectAndAlertDuplicateNames(allScannedPlacesData) { const DISTANCE_THRESHOLD_METERS = 50; // Umbral de distancia para considerar "cerca" (en metros) const duplicatesGroupedForAlert = new Map(); // Almacenará {normalizedName: [{places}, {places}]} // Paso 1: Agrupar por nombre NORMALIZADO y encontrar duplicados cercanos allScannedPlacesData.forEach(p1 => { if (p1.lat === null || p1.lon === null) return; // Saltar si no tiene coordenadas // Buscar otros lugares con el mismo nombre normalizado const nearbyMatches = allScannedPlacesData.filter(p2 => { if (p2.id === p1.id || p2.lat === null || p2.lon === null || p1.normalized !== p2.normalized) { return false; } const distance = calculateDistance(p1.lat, p1.lon, p2.lat, p2.lon); return distance <= DISTANCE_THRESHOLD_METERS; }); if (nearbyMatches.length > 0) { // Si encontramos duplicados cercanos para p1, agruparlos const groupKey = p1.normalized.toLowerCase(); if (!duplicatesGroupedForAlert.has(groupKey)) { duplicatesGroupedForAlert.set(groupKey, new Set()); } duplicatesGroupedForAlert.get(groupKey).add(p1); // Añadir p1 nearbyMatches.forEach(p => duplicatesGroupedForAlert.get(groupKey).add(p)); // Añadir todos sus duplicados } }); // Paso 2: Generar el mensaje de alerta final if (duplicatesGroupedForAlert.size > 0) { let totalNearbyDuplicateGroups = 0; // Para contar la cantidad de "nombres" con duplicados const duplicateEntriesHtml = []; // Para almacenar las líneas HTML de la alerta formateadas duplicatesGroupedForAlert.forEach((placesSet, normalizedName) => { const uniquePlacesInGroup = Array.from(placesSet); // Convertir Set a Array if (uniquePlacesInGroup.length > 1) { // Solo si realmente hay más de un lugar en el grupo totalNearbyDuplicateGroups++; // Obtener los números de línea para cada lugar en este grupo const lineNumbers = uniquePlacesInGroup.map(p => { const originalPlaceInInconsistents = allScannedPlacesData.find(item => item.id === p.id); return originalPlaceInInconsistents ? (allScannedPlacesData.indexOf(originalPlaceInInconsistents) + 1) : 'N/A'; }).filter(num => num !== 'N/A').sort((a, b) => a - b); // Asegurarse que son números y ordenarlos // Marcar los lugares en `allScannedPlacesData` para el `⚠️` visual uniquePlacesInGroup.forEach(p => { const originalPlaceInInconsistents = allScannedPlacesData.find(item => item.id === p.id); if (originalPlaceInInconsistents) { originalPlaceInInconsistents.isDuplicate = true; } }); // Construir la línea para el modal duplicateEntriesHtml.push(` <div style="margin-bottom: 5px; font-size: 15px; text-align: left;"> <b>${totalNearbyDuplicateGroups}.</b> Nombre: <b>${normalizedName}</b><br> <span style="font-weight: bold; color: #007bff;">Registros: [${lineNumbers.join("],[")}]</span> </div> `); } }); // Solo mostrar la alerta si realmente hay grupos de más de 1 duplicado cercano if (duplicateEntriesHtml.length > 0) { // Crear el modal const modal = document.createElement("div"); modal.style.position = "fixed"; modal.style.top = "50%"; modal.style.left = "50%"; modal.style.transform = "translate(-50%, -50%)"; modal.style.background = "#fff"; modal.style.border = "1px solid #aad"; modal.style.padding = "28px 32px 20px 32px"; modal.style.zIndex = "20000"; // Z-INDEX ALTO para asegurar que esté encima modal.style.boxShadow = "0 4px 24px rgba(0,0,0,0.18)"; modal.style.fontFamily = "sans-serif"; modal.style.borderRadius = "10px"; modal.style.textAlign = "center"; modal.style.minWidth = "400px"; modal.style.maxWidth = "600px"; modal.style.maxHeight = "80vh"; // Para scroll si hay muchos duplicados modal.style.overflowY = "auto"; // Para scroll si hay muchos duplicados // Ícono visual const iconElement = document.createElement("div"); iconElement.innerHTML = "⚠️"; // Signo de advertencia iconElement.style.fontSize = "38px"; iconElement.style.marginBottom = "10px"; modal.appendChild(iconElement); // Mensaje principal const messageTitle = document.createElement("div"); messageTitle.innerHTML = `<b>¡Atención! Se encontraron ${duplicateEntriesHtml.length} nombres duplicados.</b>`; messageTitle.style.fontSize = "20px"; messageTitle.style.marginBottom = "8px"; modal.appendChild(messageTitle); const messageExplanation = document.createElement("div"); messageExplanation.textContent = `Los siguientes grupos de lugares se encuentran a menos de ${DISTANCE_THRESHOLD_METERS}m uno del otro. El algoritmo asume que son el mismo lugar, por favor revisa los registros indicados en el panel flotante:`; messageExplanation.style.fontSize = "15px"; messageExplanation.style.color = "#555"; messageExplanation.style.marginBottom = "18px"; messageExplanation.style.textAlign = "left"; // Alinear texto explicativo a la izquierda modal.appendChild(messageExplanation); // Lista de duplicados const duplicatesListDiv = document.createElement("div"); duplicatesListDiv.style.textAlign = "left"; // Alinear la lista a la izquierda duplicatesListDiv.style.paddingLeft = "10px"; // Pequeño padding para los números duplicatesListDiv.innerHTML = duplicateEntriesHtml.join(''); modal.appendChild(duplicatesListDiv); // Botón OK const buttonWrapper = document.createElement("div"); buttonWrapper.style.display = "flex"; buttonWrapper.style.justifyContent = "center"; buttonWrapper.style.gap = "18px"; buttonWrapper.style.marginTop = "20px"; // Espacio superior const okBtn = document.createElement("button"); okBtn.textContent = "OK"; okBtn.style.padding = "7px 18px"; okBtn.style.background = "#007bff"; okBtn.style.color = "#fff"; okBtn.style.border = "none"; okBtn.style.borderRadius = "4px"; okBtn.style.cursor = "pointer"; okBtn.style.fontWeight = "bold"; okBtn.addEventListener("click", () => modal.remove()); // Cierra el modal buttonWrapper.appendChild(okBtn); modal.appendChild(buttonWrapper); document.body.appendChild(modal); // Añadir el modal al body } } } //+++++++++FIN Funciones de Georeferenciación y Distancia++++++++++++++ // Permite crear un panel flotante en WME function updateScanProgressBar(currentIndex, totalPlaces) { if (totalPlaces === 0) // Si no hay lugares, no actualiza la barra de progreso return; let progressPercent = Math.floor(((currentIndex + 1) / totalPlaces) * 100); // Calcular el porcentaje de progreso progressPercent = Math.min(progressPercent, 100); const progressBarInnerTab = document.getElementById("progressBarInnerTab"); // Actualizar la barra de progreso const progressBarTextTab = document.getElementById("progressBarTextTab"); // Actualizar el texto de la barra de progreso if (progressBarInnerTab && progressBarTextTab) // Asegurarse de que los elementos existen antes de intentar actualizarlos { progressBarInnerTab.style.width = `${progressPercent}%`; // Actualizar el ancho de la barra de progreso const currentDisplay = Math.min(currentIndex + 1, totalPlaces); // Mostrar el número actual de lugares procesados progressBarTextTab.textContent = `Progreso: ${progressPercent}% (${currentDisplay}/${totalPlaces})`; // Actualizar el texto de la barra de progreso } }//updateScanProgressBar // Función auxiliar para actualizar el contador de inconsistencias en la cabecera function updateInconsistenciesCount(delta) { const resultsCounterDiv = document.querySelector("#wme-place-inspector-panel .results-counter-display"); // Nuevo ID/Clase if (resultsCounterDiv) { let currentCount = parseInt(resultsCounterDiv.dataset.currentCount || resultsCounterDiv.textContent.match(/\d+/)?.[0] || '0', 10); currentCount = Math.max(0, currentCount + delta); // Asegura que no sea negativo resultsCounterDiv.dataset.currentCount = currentCount; // Guardar el valor real en un data attribute const totalOriginal = parseInt(resultsCounterDiv.dataset.totalOriginal || '0', 10); const maxRenderLimit = parseInt(resultsCounterDiv.dataset.maxRenderLimit || '0', 10); if (currentCount === 0) { resultsCounterDiv.innerHTML = `<span style="color: green;">✔</span> Todos los lugares visibles están ${totalOriginal > 0 ? "procesados o excluidos" : "correctamente normalizados"}.`; // Si todo está procesado, podrías querer ocultar la tabla o mostrar un mensaje de éxito grande. const outputDiv = document.querySelector("#wme-place-inspector-output"); if (outputDiv) outputDiv.innerHTML = `<div style='color:green; padding:10px;'>✔ Todos los lugares visibles están correctamente normalizados o excluidos.</div>`; } else if (totalOriginal > maxRenderLimit && maxRenderLimit > 0) { // Si se aplicó un límite, actualiza el mensaje mostrando el conteo actual de visibles. resultsCounterDiv.innerHTML = `<span style="color: #ff0000;"><b>${totalOriginal}</b> inconsistencias encontradas</span>. Mostrando <span style="color: #ff0000;"><b>${currentCount}</b></span> (límite de ${maxRenderLimit} aplicado).`; } else { // Mensaje normal sin límite aplicado resultsCounterDiv.innerHTML = `<span style="color: #ff0000;"><b>${currentCount}</b> inconsistencias encontradas</span>. Mostrando <span style="color: #ff0000;"><b>${currentCount}</b></span>.`; } } }//updateInconsistenciesCount // Permite crear un panel flotante en WME function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }//escapeRegExp // Función para cargar palabras del diccionario desde Google Sheets (Hoja "Dictionary") async function loadDictionaryWordsFromSheet() { const SPREADSHEET_ID = "1kJDEOn8pKLdqEyhIZ9DdcrHTb_GsoeXgIN4GisrpW2Y"; const API_KEY = "AIzaSyAQbvIQwSPNWfj6CcVEz5BmwfNkao533i8"; const RANGE = "Dictionary!A2:B"; // Asegurarse de que window.dictionaryWords y window.dictionaryIndex estén inicializados if (!window.dictionaryWords) window.dictionaryWords = new Set(); // Usar Set para evitar duplicados if (!window.dictionaryIndex) window.dictionaryIndex = {}; // Índice para palabras por primera letra const url = `https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/${RANGE}?key=${API_KEY}`; // URL para acceder a la hoja de Google Sheets return new Promise((resolve) => { // Promise para manejar la carga asíncrona if (SPREADSHEET_ID === "TU_SPREADSHEET_ID" || API_KEY === "TU_API_KEY") { console.warn('[WME PLN] SPREADSHEET_ID o API_KEY no configurados para el diccionario. Se omitirá la carga desde Google Sheets.'); resolve(); return; } console.log('[WME PLN] Cargando palabras del diccionario desde Google Sheets...'); GM_xmlhttpRequest( { method: "GET", url: url, onload: function (response) { if (response.status >= 200 && response.status < 300) { const data = JSON.parse(response.responseText); let newWordsAdded = 0; if (data.values) { data.values.forEach(row => { // Procesar cada fila de la hoja const word = (row[0] || '').trim(); // Columna A es WORD if (word && !window.dictionaryWords.has(word.toLowerCase()))// Verificar si la palabra ya está en el Set { window.dictionaryWords.add(word.toLowerCase()); // Añadir a Set en minúsculas const firstChar = word.charAt(0).toLowerCase(); if (!window.dictionaryIndex[firstChar]) window.dictionaryIndex[firstChar] = []; // Asegurarse de que el índice existe para la primera letra window.dictionaryIndex[firstChar].push(word.toLowerCase()); // Añadir al índice newWordsAdded++; } }); //console.log(`[WME PLN] ¡Éxito! Diccionario cargado desde Google Sheets. ${newWordsAdded} palabras nuevas añadidas.`); try// Guardar el diccionario actualizado en localStorage { localStorage.setItem("dictionaryWordsList", JSON.stringify(Array.from(window.dictionaryWords))); } catch (e) { console.error("[WME PLN] Error guardando diccionario actualizado en localStorage:", e); } } else console.warn('[WME PLN] No se encontraron valores en la hoja "Dictionary".'); } else { const error = JSON.parse(response.responseText); console.error(`[WME PLN] Error al cargar la hoja "Dictionary" de Google: ${error.error.message}.`); } resolve(); }, onerror: function () { console.error('[WME PLN][ERROR] Error de red al intentar conectar con Google Sheets para el diccionario.'); resolve(); } }); }); }//loadDictionaryWordsFromSheet //Función Para Cargar Categorías Desde Google Sheets async function loadDynamicCategoriesFromSheet() { const SPREADSHEET_ID = "1kJDEOn8pKLdqEyhIZ9DdcrHTb_GsoeXgIN4GisrpW2Y"; const API_KEY = "AIzaSyAQbvIQwSPNWfj6CcVEz5BmwfNkao533i8"; const RANGE = "Categories!A2:E"; window.dynamicCategoryRules = []; // Definimos la variable global para guardar las reglas const url = `https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/${RANGE}?key=${API_KEY}`; return new Promise((resolve) => { // Verificamos si la variable global ya está definida if (SPREADSHEET_ID === "TU_SPREADSHEET_ID" || API_KEY === "TU_API_KEY") { console.warn('[WME PLN] No se ha configurado SPREADSHEET_ID o API_KEY. Se omitirá la carga de categorías dinámicas.'); resolve(); // Permite que el script continúe sin las reglas. return; } //console.log('[WME PLN] Cargando reglas de categoría dinámicas desde Google Sheets...'); GM_xmlhttpRequest({method: "GET", url: url, onload: function (response) { if (response.status >= 200 && response.status < 300) // Verifica si la respuesta fue exitosa { const data = JSON.parse(response.responseText); if (data.values) // Verifica si hay valores en la hoja { window.dynamicCategoryRules = data.values.map(row => { // Procesa los datos y los guarda en la variable global const keyword = (row[0] || '').toLowerCase().trim(); const keywords = keyword.split(';').map(k => k.trim()).filter(k => k.length > 0); const regexParts = keywords.map(k => `\\b${escapeRegExp(k)}\\b`); const combinedRegex = new RegExp(`(${regexParts.join('|')})`, 'i'); return { keyword: keyword, // Mantener original si es necesario categoryKey: row[1] || '', icon: row[2] || '⚪', desc_es: row[3] || 'Sin descripción', desc_en: row[4] || 'No description', compiledRegex: combinedRegex // Guarda la regex pre-compilada }; }); window.dynamicCategoryRules.sort((a, b) => b.keyword.length - a.keyword.length); // Una vez cargadas, ordena las reglas UNA SOLA VEZ console.log('[WME PLN] ¡Éxito! Reglas de categoría dinámicas cargadas y ordenadas:', window.dynamicCategoryRules); } else { console.warn('[WME PLN] No se encontraron valores en la hoja de categorías.'); } } else { const error = JSON.parse(response.responseText); alert(`Error al cargar la hoja de Google: ${error.error.message}.`); } resolve(); }, onerror: function () { alert('Error de red al intentar conectar con Google Sheets.'); resolve(); } });// GM_xmlhttpRequest }); }//loadDynamicCategoriesFromSheet // Función para encontrar la categoría de un lugar basado en su nombre function findCategoryForPlace(placeName) { if (!placeName || typeof placeName !== 'string' || !window.dynamicCategoryRules || window.dynamicCategoryRules.length === 0) // Si el nombre del lugar es inválido o no hay reglas de categoría cargadas, devuelve un array vacío de sugerencias. return []; const lowerCasePlaceName = placeName.toLowerCase();// Convertir el nombre del lugar a minúsculas para comparaciones insensibles a mayúsculas const allMatchingRules = []; // Este array almacenará todas las reglas de categoría que coincidan. const placeWords = lowerCasePlaceName.split(/\s+/).filter(w => w.length > 0); // Descomponer el nombre del lugar en palabras const SIMILARITY_THRESHOLD_FOR_KEYWORDS = 0.95; // Puedes ajustar este umbral (ej. 0.90 para 90% de similitud) // PASO 0: Normalizar el nombre del lugar eliminando diacríticos y caracteres especiales for (const rule of window.dynamicCategoryRules) { if (!rule.compiledRegex) continue; // Si la regla no tiene una expresión regular compilada (lo cual no debería pasar si se cargó correctamente), salta a la siguiente regla. // **PASO 1: Búsqueda por Regex Exacta if (rule.compiledRegex.test(lowerCasePlaceName)) { if (!allMatchingRules.some(mr => mr.categoryKey === rule.categoryKey)) { allMatchingRules.push(rule); } // Si Ya Añadimos La Regla Por Regex Exacta, Pasar A La Siguiente Regla Para Ahorrar Cálculos De Similitud continue; } // **PASO 2: Búsqueda por Similitud para CADA palabra del lugar vs CADA palabra clave de la regla** const ruleKeywords = rule.keyword.split(';').map(k => k.trim().toLowerCase()).filter(k => k.length > 0); let foundSimilarityForThisRule = false; // Bandera para saber si ya encontramos una buena similitud para esta regla, para no seguir buscando más palabras clave de la regla. for (const pWord of placeWords) // Cada palabra del nombre del lugar { // Cada palabra del nombre del lugar if (foundSimilarityForThisRule) break; // Si ya encontramos una buena similitud para esta regla, pasamos a la siguiente. for (const rKeyword of ruleKeywords) { // Cada palabra clave de la regla // Asegurarse de que rKeyword no sea una expresión regular, sino la palabra literal para Levenshtein const similarity = calculateSimilarity(pWord, rKeyword); // Calcular la similitud entre la palabra del lugar y la palabra clave de la regla if (similarity >= SIMILARITY_THRESHOLD_FOR_KEYWORDS && !allMatchingRules.some(mr => mr.categoryKey === rule.categoryKey)) // Si la similitud es alta y aún no hemos añadido esta categoría { allMatchingRules.push(rule); foundSimilarityForThisRule = true; // Marcamos que ya la encontramos para esta regla break; // Salimos del bucle de rKeyword y pWord } } } } //console.log(`[WME PLN][DEBUG] findCategoryForPlace para "${placeName}" devolvió: `, allMatchingRules); return allMatchingRules; }//findCategoryForPlace // Permite obtener el icono de una categoría function getWazeLanguage() { // 1. Intento principal con el SDK (método recomendado) if (wmeSDK && typeof wmeSDK.getWazeLocale === 'function') { const locale = wmeSDK.getWazeLocale(); // ej: 'es-419' if (locale) return locale.split('-')[0].toLowerCase(); // -> 'es' } // 2. Fallback al objeto global 'W' si el SDK falla if (typeof W !== 'undefined' && W.locale) return W.locale.split('-')[0].toLowerCase(); // 3. Último recurso si nada funciona return 'es'; }//getWazeLanguage //Permite obtener el icono y descripción de una categoría function getCategoryDetails(categoryKey) { const lang = getWazeLanguage(); // 1. Intento con la hoja de Google (window.dynamicCategoryRules) if (window.dynamicCategoryRules && window.dynamicCategoryRules.length > 0) { const rule = window.dynamicCategoryRules.find(r => r.categoryKey.toUpperCase() === categoryKey.toUpperCase()); if (rule) { const description = (lang === 'es' && rule.desc_es) ? rule.desc_es : rule.desc_en; return { icon: rule.icon, description: description }; } } // 2. Fallback a la lista interna del script si no se encontró en la hoja const hardcodedInfo = getCategoryIcon(categoryKey); // Llama a la función original if (hardcodedInfo && hardcodedInfo.icon !== '⚪' && hardcodedInfo.icon !== '❓') { // La función original devuelve un título "Español / English", lo separamos. const descriptions = hardcodedInfo.title.split(' / '); const description = (lang === 'es' && descriptions[0]) ? descriptions[0] : descriptions[1] || descriptions[0]; return { icon: hardcodedInfo.icon, description: description }; } // 3. Si no se encuentra en ninguna parte, devolver un valor por defecto. const defaultDescription = lang === 'es' ? `Categoría no encontrada (${categoryKey})` : `Category not found (${categoryKey})`; return { icon: '⚪', description: defaultDescription }; }//getCategoryDetails // Función para eliminar diacríticos de una cadena function removeDiacritics(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); }//removeDiacritics // Función para validar una palabra excluida function isValidExcludedWord(newWord) { if (!newWord) // Si la palabra está vacía, no es válida return { valid : false, msg : "La palabra no puede estar vacía." }; const lowerNewWord = newWord.toLowerCase(); // Convertir a minúsculas para comparaciones insensibles a mayúsculas if (newWord.length === 1) // No permitir palabras de un solo caracter return { valid: false, msg: "No se permite agregar palabras de un solo caracter." }; if (/[-']/.test(newWord)) // Permitir palabras con "-" o "'" sin separarlas return { valid: true }; if (/^[^a-zA-Z0-9áéíóúÁÉÍÓÚñÑ]+$/.test(newWord)) // No permitir caracteres especiales solos return { valid : false, msg : "No se permite agregar solo caracteres especiales." }; // La verificación del diccionario ahora será sensible a mayúsculas/minúsculas // Si la palabra existe EXACTAMENTE como está en el diccionario, no permitirla como excluida. // Si el diccionario tiene 'sos' y la excluida es 'SOS', SÍ se permitirá. if (window.dictionaryWords && Array.from(window.dictionaryWords).some(w => w === newWord)) // Comparación sensible a mayúsculas/minúsculas return { valid : false, msg :"La palabra (con esta capitalización exacta) ya existe en el diccionario. No se puede agregar a especiales." }; // Verificar si la palabra es una palabra común if (commonWords.includes(lowerNewWord)) // No permitir palabras comunes return { valid: false, msg: "Esa palabra es muy común y no debe agregarse a la lista." }; // Verificar si la palabra ya está en la lista de excluidas if (excludedWords && Array.from(excludedWords).some(w => w === newWord)) // No permitir duplicados exactos en excluidas return { valid : false, msg : "La palabra (con esta capitalización exacta) ya está en la lista." }; return { valid : true }; }//isValidExcludeWord // La función removeEmoticons con una regex más segura o un paso extraremoveEmoticons solo para emojis (sin afectar números) function removeEmoticons(text) { if (!text || typeof text !== 'string') { return ''; } // Esta es una regex moderna y más robusta que utiliza propiedades de Unicode. // \p{Emoji_Presentation}: Coincide con emojis que se muestran como imágenes por defecto (Ej: 😊, 🏨, 🚗). // \p{Extended_Pictographic}: Coincide con un conjunto más amplio de símbolos que pueden ser emojis. // El flag 'u' es CRUCIAL para que la sintaxis \p{...} funcione. const emojiRegex = /[\p{Emoji_Presentation}\p{Extended_Pictographic}]/gu; let cleanedText = text.replace(emojiRegex, ''); // Limpieza final de espacios extra que puedan quedar. return cleanedText.trim().replace(/\s{2,}/g, ' '); }// removeEmoticons // Modify aplicarReemplazosGenerales function aplicarReemplazosGenerales(name) { if (typeof window.skipGeneralReplacements === "boolean" && window.skipGeneralReplacements) return name; // Paso 1: Eliminar emoticones al inicio de los reemplazos generales. name = removeEmoticons(name); const reglas = [ // Nueva regla: reemplazar | por espacio, guion y espacio { buscar: /\|/g, reemplazar: " - " }, // Nueva regla: reemplazar / por espacio, barra y espacio, eliminando espacios alrededor { buscar: /\s*\/\s*/g, reemplazar: " / " }, // Corrección: Para buscar [P] o [p] literalmente { buscar: /\[[Pp]\]/g, reemplazar: "" }, // 1. Convertir guiones pegados a palabras o con un solo espacio a ' - ' // Esto convierte "Palabra-Otra" -> "Palabra - Otra" // y "Palabra -Otra" -> "Palabra - Otra" // y "Palabra- Otra" -> "Palabra - Otra" { buscar: /(\p{L}|\p{N})\s*-\s*(\p{L}|\p{N})/gu, reemplazar: "$1 - $2" }, // 2. Limpiar guiones que no estén entre palabras, convirtiéndolos en un solo ' - ' // Esto estandariza " -- " a " - ", y " - " a " - ". // Asegura que siempre haya un espacio en cada lado del guion si no es un guion interno. { buscar: /\s*-\s*/g, reemplazar: " - " }, { buscar: /\s{2,}/g, reemplazar: ' ' }, // Asegura espacios únicos antes de trim ]; reglas.forEach(regla => { // Itera sobre cada regla de reemplazo if (regla.buscar.source === '\\|') // Si la regla es para el carácter '|', usa replaceAll name = name.replace(regla.buscar, regla.reemplazar); else name = name.replace(regla.buscar, regla.reemplazar); }); name = name.replace(/\s{2,}/g, ' ').trim(); // Asegura el recorte final y espacios únicos // ****** INICIO DE LA MODIFICACIÓN: Limpieza de guiones dobles ****** // Eliminar guiones dobles si están seguidos, reemplazándolos por un solo guion // Maneja '--', ' - - ', etc. y los convierte a un solo ' - ' name = name.replace(/\s*-\s*-\s*/g, ' - '); name = name.replace(/--/g, '-'); // También para guiones pegados 'a--b' -> 'a-b' // ****** FIN DE LA MODIFICACIÓN ****** return name; }// aplicarReemplazosGenerales // función auxiliar para capitalizar cada palabra en una frase function capitalizeEachWord(phrase) { if (!phrase || typeof phrase !== 'string') return ""; return phrase.split(/\s+/) // Dividir por uno o más espacios .map((word, index) => { // Añadir index if (word.length === 0) return ""; // La capitalización de palabras comunes y otras reglas complejas // ya las maneja normalizeWordInternal. Aquí solo capitalizamos la primera letra // si no es un caso especial. // Llamar a normalizeWordInternal para asegurar consistencia return normalizeWordInternal(word, index === 0, false); // Pasar isFirstWordInSequence }) .join(' '); // Unir de nuevo con un solo espacio } //Permite aplicar reglas especiales de capitalización y puntuación a un nombre function aplicarReglasEspecialesNombre(newName) { // Regla de capitalización después de GUION newName = newName.replace(/-(\s*)([^\s]+)/g, (match, spaces, nextWord) => { // Esta lógica reutiliza la función principal de normalización para la palabra que sigue al guion. // Se pasa 'true' para isFirstWordInSequence, lo que le indica a la función que debe // capitalizar palabras comunes como "de", "la", "el", etc. const normalizedNextWord = normalizeWordInternal(nextWord, true, false); return `-${spaces}${normalizedNextWord}`; }); // Capitalizar Después De Punto newName = newName.replace(/\.\s+([a-z])/g, (match, letter) => `. ${letter.toUpperCase()}`); // Capitalizar Después De Paréntesis De Apertura newName = newName.replace(/(\(\s*)([a-zA-Z])/g, (match, P1, P2) => { return P1 + P2.toUpperCase(); }); // Asegura que la última letra de una cadena esté en mayúsculas si es una letra sola al final newName = newName.replace(/\s([a-zA-Z])$/, (match, letter) => ` ${letter.toUpperCase()}`); // Asegurarse de que no haya espacios dobles creados y trim final newName = newName.replace(/\s{2,}/g, ' ').trim(); return newName; }//aplicarReglasEspecialesNombre // Permite normalizar un nombre de lugar function processPlaceName(originalName) { //console.log(`[WME PLN] --- INICIANDO ANÁLISIS PARA: "${originalName}" ---`); console.log(`[WME PLN - processPlaceName] Recibido para normalizar: "${originalName}"`); // LOG INICIO let processedName = originalName.trim(); // Primero, reemplazamos el pipe por un espacio, para que las palabras se separen correctamente. // Hacemos esto ANTES de dividir en palabras para que normalizeWordInternal las vea por separado. processedName = processedName.replace(/\|/g, ' - '); // Reemplaza | por un espacio processedName = processedName.replace(/\s{2,}/g, ' ').trim(); // Limpia espacios dobles que puedan generarse console.log(`[WME PLN - processPlaceName] Después de reemplazo de pipe: "${processedName}"`); // LOG PIPE REEMPLAZADO // Si el nombre está vacío después de los reemplazos, no hacemos nada más. const words = processedName.split(/\s+/).filter(word => word.length > 0); console.log(`[WME PLN - processPlaceName] Palabras extraídas:`, words); // LOG PALABRAS EXTRAÍDAS // PASO 1: Normalización palabra por palabra (capitalización, reglas especiales) const normalizedWords = words.map((word, index) => { if (word === '-') { return '-'; } const excl = isExcludedWord(word); if (excl) { // Si la palabra excluida termina en "-" y NO hay más caracteres después en el nombre original, elimínale el guion if (excl.endsWith('-') && excl.replace(/-+$/, '').length > 0) { return excl.replace(/-+$/, ''); // Devuelve solo la parte antes del guion } return excl; } return normalizeWordInternal(word, index === 0, false); }); processedName = normalizedWords.join(" "); console.log(`[WME PLN] [Paso 1] Después de normalizar cada palabra: "${processedName}"`); // LOG PALABRAS NORMALIZADAS //console.log(`[WME PLN] [Paso 1] Después de normalizar cada palabra: "${processedName}"`); // PASO 2: Aplicar reglas especiales de nombre (capitalización después de guion, etc.) // Aquí es donde `aplicarReglasEspecialesNombre` manejará el guion y capitalizará "Bolívar". processedName = aplicarReglasEspecialesNombre(processedName); //console.log(`[WME PLN] [Paso 2] Después de aplicar reglas especiales: "${processedName}"`); // PASO 3: Procesar comillas y paréntesis processedName = postProcessQuotesAndParentheses(processedName); //console.log(`[WME PLN] [Paso 3] Después de procesar comillas/paréntesis: "${processedName}"`); // PASO 4: Aplicar reemplazos definidos por el usuario if (typeof replacementWords === 'object' && Object.keys(replacementWords).length > 0) { processedName = aplicarReemplazosDefinidos(processedName, replacementWords); } //console.log(`[WME PLN] [Paso 4] DESPUÉS de aplicar reemplazos: "${processedName}"`); // PASO 5: Aplicar reemplazos generales (barras, corchetes, etc.) // La regla para el pipe '|' en `aplicarReemplazosGenerales` ahora es redundante si solo se busca el pipe, // pero es inofensiva si ya lo reemplazamos. Asegúrate de que no haya otras reglas en aplicarReemplazosGenerales // que interfieran negativamente. processedName = aplicarReemplazosGenerales(processedName); // Esto ya no afectaría el `|` //console.log(`[WME PLN] [Paso 5] Después de aplicar reemplazos generales: "${processedName}"`); // ****************************************************************************** // NUEVO PASO: Corregir tildes basándose en el diccionario /* let finalWords = processedName.split(/\s+/).filter(word => word.length > 0); const SIMILARITY_THRESHOLD_FOR_TILDE_CORRECTION = 0.99; // Usar el umbral específico para tildes finalWords = finalWords.map(word => { if (!window.dictionaryWords || window.dictionaryWords.size === 0) { return word; // No hay diccionario, no hay corrección de tildes por diccionario } const lowerWord = word.toLowerCase(); const cleanedWordNoDiacritics = removeDiacritics(lowerWord); // Buscar en el diccionario una palabra que sea idéntica sin diacríticos // y que *sí* tenga diacríticos en su forma original del diccionario. for (const dictWord of window.dictionaryWords) { const lowerDictWord = dictWord.toLowerCase(); const cleanedDictWordNoDiacritics = removeDiacritics(lowerDictWord); // Condición 1: Las palabras son idénticas IGNORANDO diacríticos // Condición 2: La palabra del diccionario (original) tiene diacríticos, // mientras que la palabra actual (originalmente de Waze) no los tiene. // Condición 3: La palabra actual de Waze NO es idéntica a la del diccionario (o sea, es la que no tiene tilde) if (cleanedWordNoDiacritics === cleanedDictWordNoDiacritics && lowerDictWord !== lowerWord && // Asegura que la del diccionario SÍ tenga la tilde/diferencia /[áéíóúÁÉÍÓÚüÜñÑ]/.test(lowerDictWord) && // Confirma que la del diccionario tiene tilde !/[áéíóúÁÉÍÓÚüÜñÑ]/.test(lowerWord) // Confirma que la palabra actual NO tiene tilde ) { // Encontrada una coincidencia por diacríticos. // Ahora, necesitamos aplicar la capitalización correcta a la palabra del diccionario. // Podemos reutilizar normalizeWordInternal, pero debemos ser cuidadosos // para que no la vuelva a "desacentuar" si pasa por ahí. // Una forma sencilla es simplemente capitalizar la primera letra // y el resto en minúsculas, manteniendo la tilde. let correctedWord = dictWord.charAt(0).toUpperCase() + dictWord.slice(1).toLowerCase(); //console.log(`[WME PLN] Corrigiendo tilde: "${word}" -> "${correctedWord}"`); return correctedWord; } } return word; // Si no se encontró una corrección de tilde, devuelve la palabra original }); processedName = finalWords.join(" ");*/ //console.log(`[WME PLN] [Paso 6] Después de corregir tildes: "${processedName}"`); // ****************************************************************************** // PASO FINAL: Mover palabras al inicio (swap words) processedName = applyWordsToStartMovement(processedName); //console.log(`[WME PLN] [Paso 7] Después de applyWordsToStartMovement: "${processedName}"`); let finalName = processedName.replace(/\s{2,}/g, ' ').trim(); // Regla para eliminar un guion (-) si está al final del nombre, posiblemente con espacios. // Ejemplo: "Tiendas D1 - " -> "Tiendas D1" // Ejemplo: "Tiendas D1-" -> "Tiendas D1" // Ejemplo: "Tiendas D1- " -> "Tiendas D1" finalName = finalName.replace(/\s*-\s*$/, ''); // Elimina '-' con espacios a su alrededor si está al final // Quitar el punto final si existe. if (finalName.endsWith('.')) { finalName = finalName.slice(0, -1); } console.log(`[WME PLN - pPN] Resultado final de pPN: "${finalName}"`); // LOG FINAL return finalName; }// processPlaceName //Permite normalizar una palabra individual function updateApplyButtonState(row, originalName) { // Encontrar los elementos necesarios dentro de la fila const inputReplacement = row.querySelector('.replacement-input'); // Usaremos una clase para identificarlo const applyButton = row.querySelector('button[title="Aplicar sugerencia"]'); const applyButtonWrapper = applyButton?.parentElement; if (!inputReplacement || !applyButton || !applyButtonWrapper) return; const nameIsDifferent = inputReplacement.value.trim() !== originalName.trim(); const categoryWasChanged = row.dataset.categoryChanged === 'true'; if (nameIsDifferent || categoryWasChanged) { // Habilitar botón applyButton.disabled = false; applyButton.style.opacity = "1"; // Quitar el chulo verde de éxito si existe const successIcon = applyButtonWrapper.querySelector('span'); if (successIcon) { successIcon.remove(); } } else { // Deshabilitar botón applyButton.disabled = true; applyButton.style.opacity = "0.5"; } }// updateApplyButtonState //Permite aplicar reemplazos definidos por el usuario a un texto function aplicarReemplazosDefinidos(text, replacementRules) { let newText = text; // La cadena que se está modificando if (typeof replacementRules !== 'object' || replacementRules === null || Object.keys(replacementRules).length === 0) { return newText; } // Ordenar las claves de reemplazo por longitud descendente para procesar primero las frases más largas. const sortedFromKeys = Object.keys(replacementRules).sort((a, b) => b.length - a.length); for (const fromKey of sortedFromKeys) { const toValue = replacementRules[fromKey]; const escapedFromKey = escapeRegExp(fromKey); let regex; const wordCharSet = '[\\p{L}\\p{N}_-]'; if (toValue.endsWith(' -')) { // Esta regex tiene 4 grupos de captura: (delimitadorPrevio), (matchedFromKey), (capturedSpaces), (nextWordIfCaptured) regex = new RegExp(`(^|[^\\p{L}\\p{N}_\\-])(${escapedFromKey})(\\s+)(${wordCharSet}+)?(?=$|[^\\p{L}\\p{N}_-])`, 'giu'); } else { // Esta regex tiene 2 grupos de captura: (delimitadorPrevio), (matchedFromKey) regex = new RegExp(`(^|[^\\p{L}\\p{N}_-])(${escapedFromKey})(?=$|[^\\p{L}\\p{N}_-])`, 'giu'); } // CORRECCIÓN CLAVE: Usar la sintaxis '...args' para capturar todos los argumentos // y luego extraerlos de forma robusta. newText = newText.replace(regex, (match, ...args) => { // El último argumento de `args` es la cadena original completa. // El penúltimo argumento de `args` es el offset. const originalString = args[args.length - 1]; // Captura el string original const offset = args[args.length - 2]; // Captura el offset // Los grupos de captura vienen antes del offset y originalString. // Reasignar los grupos de captura según el tipo de regex. let delimitadorPrevio, matchedFromKey, capturedSpaces, nextWordIfCaptured; if (toValue.endsWith(' -')) { // Para la regex con 4 grupos de captura delimitadorPrevio = args[0]; // p1 matchedFromKey = args[1]; // p2 capturedSpaces = args[2]; // p3 nextWordIfCaptured = args[3]; // p4 } else { // Para la regex con 2 grupos de captura delimitadorPrevio = args[0]; // p1 matchedFromKey = args[1]; // p2 // Los demás serán undefined si se intenta acceder a ellos, lo cual es correcto. } const offsetOfMatchInCurrentText = offset; const stringBeingProcessedActual = originalString; // Ya es la cadena correcta // --- Lógica Anti-Duplicación de palabra anterior --- const textoAntesDelMatch = stringBeingProcessedActual.substring(0, offsetOfMatchInCurrentText + delimitadorPrevio.length); const palabrasAntes = textoAntesDelMatch.trim().split(/\s+/); const ultimaPalabraAntes = palabrasAntes.length > 0 ? palabrasAntes[palabrasAntes.length - 1] : ""; const palabrasDelReemplazo = toValue.trim().split(/\s+/); const primeraPalabraReemplazo = palabrasDelReemplazo.length > 0 ? palabrasDelReemplazo[0] : ""; if (ultimaPalabraAntes && primeraPalabraReemplazo) { const semejanza = calculateSimilarity(ultimaPalabraAntes, primeraPalabraReemplazo); if (semejanza > 0.9) { return match; } } // --- Lógica para evitar auto-reemplazo infinito (ej: Terpel -> Terpel -) --- if (toValue.toLowerCase().startsWith(fromKey.toLowerCase()) && toValue.length > fromKey.length) { const suffix = toValue.substring(fromKey.length); const textAfterMatchRaw = stringBeingProcessedActual.substring(offsetOfMatchInCurrentText + match.length); const textAfterMatchTrimmed = textAfterMatchRaw.trim(); if (textAfterMatchTrimmed.startsWith(suffix.trim())) { return match; } } // --- Lógica específica para el reemplazo que termina en ' -' --- if (toValue.endsWith(' -')) { return delimitadorPrevio + toValue + (nextWordIfCaptured || ''); } // --- Para otros reemplazos que no terminan en ' -' --- return delimitadorPrevio + toValue; }); } return newText; }//aplicarReemplazosDefinidos //Permite crear un panel flotante en WME function getVisiblePlaces() { if (typeof W === 'undefined' || !W.map || !W.model || !W.model.venues) {// Si Waze Map Editor no está completamente cargado, retornar un array vacío console.warn('[WME_PLN][WARNING] Waze Map Editor no está completamente cargado.'); return []; } // Obtener los lugares visibles en el mapa const venues = W.model.venues.objects; const visiblePlaces = Object.values(venues).filter(venue => { // Filtrar los lugares que están visibles en el mapa const olGeometry = venue.getOLGeometry?.();// Obtener la geometría del lugar const bounds = olGeometry?.getBounds?.(); // Obtener los límites del lugar return bounds && W.map.getExtent().intersectsBounds(bounds); }); return visiblePlaces; }// getVisiblePlaces //Permite renderizar los lugares en el panel flotante function renderPlacesInFloatingPanel(places) { // Limpiar la lista global de duplicados antes de llenarla de nuevo placesForDuplicateCheckGlobal.length = 0; createFloatingPanel("processing"); // Mostrar panel en modo "procesando" const maxPlacesToScan = parseInt(document.getElementById("maxPlacesInput")?.value || "100", 10); //Obtiene el número total de lugares a procesar let initialVisiblePlacesCount = places.length; // Guardar el conteo original de visibles // Filtrar los lugares visibles por los Places Excluidos. // Si excludedPlaces es un Map, .has() funciona con la clave (ID). places = places.filter(place => !excludedPlaces.has(place.getID())); const excludedByInitialFilterCount = initialVisiblePlacesCount - places.length; console.log(`[WME PLN] ${excludedByInitialFilterCount} lugares excluidos por filtro inicial.`); if (places.length > maxPlacesToScan) // Limitar el número de lugares a escanear places = places.slice(0, maxPlacesToScan); // Limitar el número de places a escanear if (places.length > maxPlacesToScan) // Limitar el número de lugares a escanear places = places.slice(0, maxPlacesToScan); // Limitar el número de places a escanear const lockRankEmojis = ["0️⃣", "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣"]; // Definir los emojis de nivel de bloqueo // Permite obtener el nombre de la categoría de un lugar, ya sea del modelo antiguo o del SDK function getPlaceCategoryName(venueFromOldModel, venueSDKObject) { // Acepta ambos tipos de venue let categoryId = null; let categoryName = null; // Intento 1: Usar el venueSDKObject si está disponible y tiene la info if (venueSDKObject) { if (venueSDKObject.mainCategory && venueSDKObject.mainCategory.id) {// Si venueSDKObject tiene mainCategory con ID categoryId = venueSDKObject.mainCategory.id; // source = "SDK (mainCategory.id)"; //Limpiar comillas aquí if (typeof categoryId === 'string') categoryId = categoryId.replace(/'/g, ''); if (venueSDKObject.mainCategory.name) // Si mainCategory tiene nombre categoryName = venueSDKObject.mainCategory.name;// source = "SDK (mainCategory.name)"; if (typeof categoryName === 'string') categoryName = categoryName.replace(/'/g, ''); } else if (Array.isArray(venueSDKObject.categories) && venueSDKObject.categories.length > 0) {// Si venueSDKObject tiene un array de categorías y al menos una categoría const firstCategorySDK = venueSDKObject.categories[0]; // source = "SDK (categories[0])"; if (typeof firstCategorySDK === 'object' && firstCategorySDK.id) {// Si la primera categoría es un objeto con ID categoryId = firstCategorySDK.id; // Limpiar comillas aquí if (typeof categoryId === 'string') categoryId = categoryId.replace(/'/g, ''); if (firstCategorySDK.name) // Si la primera categoría tiene nombre categoryName = firstCategorySDK.name; if (typeof categoryName === 'string') categoryName = categoryName.replace(/'/g, ''); } else if (typeof firstCategorySDK === 'string') // Si la primera categoría es una cadena (nombre de categoría) { categoryName = firstCategorySDK; if (typeof categoryName === 'string') categoryName = categoryName.replace(/'/g, ''); } } else if (venueSDKObject.primaryCategoryID) { categoryId = venueSDKObject.primaryCategoryID; if (typeof categoryName === 'string') categoryName = categoryName.replace(/'/g, ''); } } if (categoryName) {// Si se obtuvo el nombre de categoría del SDK // console.log(`[WME_PLN][CATEGORÍA] Usando nombre de categoría de ${source}: ${categoryName} ${categoryId ? `(ID: ${categoryId})` : ''}`); // Comentario de depuración eliminado return categoryName; } // Intento 2: Usar W.model si no se obtuvo del SDK if (!categoryId && venueFromOldModel && venueFromOldModel.attributes && Array.isArray(venueFromOldModel.attributes.categories) && venueFromOldModel.attributes.categories.length > 0) categoryId = venueFromOldModel.attributes.categories[0]; if (!categoryId)// Si no se pudo obtener el ID de categoría de ninguna fuente return "Sin categoría"; let categoryObjWModel = null; // Intentar obtener el objeto de categoría del modelo Waze if (typeof W !== 'undefined' && W.model) {// Si Waze Map Editor está disponible if (W.model.venueCategories && typeof W.model.venueCategories.getObjectById === "function") // Si venueCategories está disponible en W.model categoryObjWModel = W.model.venueCategories.getObjectById(categoryId); if (!categoryObjWModel && W.model.categories && typeof W.model.categories.getObjectById === "function") // Si no se encontró en venueCategories, intentar en categories categoryObjWModel = W.model.categories.getObjectById(categoryId); } if (categoryObjWModel && categoryObjWModel.attributes && categoryObjWModel.attributes.name) {// Si se encontró el objeto de categoría en W.model // console.log(`[WME_PLN][CATEGORÍA] Usando nombre de categoría de W.model.categories (para ID ${categoryId} de ${source}): ${categoryObjWModel.attributes.name}`); // Comentario de depuración eliminado let nameToReturn = categoryObjWModel.attributes.name; // Limpiar comillas aquí if (typeof nameToReturn === 'string') nameToReturn = nameToReturn.replace(/'/g, ''); return nameToReturn; } if (typeof categoryId === 'number' || (typeof categoryId === 'string' && categoryId.trim() !== '')) {// Si no se pudo obtener el nombre de categoría de ninguna fuente, devolver el ID // console.log(`[WME_PLN][CATEGORÍA] No se pudo resolver el nombre para ID de categoría ${categoryId} (obtenido de ${source}). Devolviendo ID.`); // Comentario de depuración eliminado return `${categoryId}`; // Devuelve el ID si no se encuentra el nombre. } return "Sin categoría"; }//getPlaceCategoryName //Permite obtener el tipo de lugar (área o punto) y su icono function getPlaceTypeInfo(venueSDKObject) // <--- AHORA RECIBE venueSDKObject { let isArea = false; let icon = "⊙"; // Icono por defecto para punto let title = "Punto"; // Título por defecto para punto if (venueSDKObject && venueSDKObject.geometry && venueSDKObject.geometry.type) { const geometryType = venueSDKObject.geometry.type; if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') { isArea = true; icon = "⭔"; // Icono para área title = "Área"; // Título para área } // Para otros tipos como 'Point', 'LineString', etc., se mantienen los valores por defecto (Punto). } return { isArea, icon, title }; }// getPlaceTypeInfo //Permite procesar un lugar y generar un objeto con sus detalles function shouldForceSuggestionForReview(word) { if (typeof word !== 'string') // Si la palabra no es una cadena, no forzar sugerencia por esta regla return false; const lowerWord = word.toLowerCase(); // Convertir la palabra a minúsculas para evitar problemas de mayúsculas/minúsculas const hasTilde = /[áéíóúÁÉÍÓÚ]/.test(word); // Verificar si la palabra tiene alguna tilde (incluyendo mayúsculas acentuadas) if (!hasTilde) // Si no tiene tilde, no forzar sugerencia por esta regla return false; // Si no hay tilde, no forzar sugerencia por esta regla const problematicSubstrings = ['c', 's', 'x', 'cc', 'sc', 'cs', 'g', 'j', 'z','ñ']; // Lista de patrones de letras/combinaciones que, junto con una tilde, fuerzan la sugerencia (insensible a mayúsculas debido a lowerWord) for (const sub of problematicSubstrings) {// Verificar si la palabra contiene alguna de las letras/combinaciones problemáticas if (lowerWord.includes(sub)) return true; // Tiene tilde y una de las letras/combinaciones problemáticas } return false; // Tiene tilde, pero no una de las letras/combinaciones problemáticas }//shouldForceSuggestionForReview // Procesa un lugar y genera un objeto con sus detalles async function getPlaceCityInfo(venueFromOldModel, venueSDKObject) { let hasExplicitCity = false; // Indica si hay una ciudad explícita definida let explicitCityName = null; // Nombre de la ciudad explícita, si se encuentra let hasStreetInfo = false; // Indica si hay información de calle disponible let cityAssociatedWithStreet = null; // Nombre de la ciudad asociada a la calle, si se encuentra // 1. Check for EXPLICIT city SDK if (venueSDKObject && venueSDKObject.address) { if (venueSDKObject.address.city && typeof venueSDKObject.address.city.name === 'string' && venueSDKObject.address.city.name.trim() !== '') {// Si hay una ciudad explícita en el SDK explicitCityName = venueSDKObject.address.city.name.trim();// Nombre de la ciudad explícita hasExplicitCity = true;// source = "SDK (address.city.name)"; } else if (typeof venueSDKObject.address.cityName === 'string' && venueSDKObject.address.cityName.trim() !== '') {// Si hay una ciudad explícita en el SDK (cityName) explicitCityName = venueSDKObject.address.cityName.trim();// Nombre de la ciudad explícita hasExplicitCity = true;// source = "SDK (address.cityName)"; } } if (!hasExplicitCity && venueFromOldModel && venueFromOldModel.attributes) {// Old Model (if no explicit city from SDK) const cityID = venueFromOldModel.attributes.cityID; if (cityID && typeof W !== 'undefined' && W.model && W.model.cities && W.model.cities.getObjectById) {// Si hay un cityID en el modelo antiguo const cityObject = W.model.cities.getObjectById(cityID); // Obtener el objeto de ciudad del modelo Waze if (cityObject && cityObject.attributes && typeof cityObject.attributes.name === 'string' && cityObject.attributes.name.trim() !== '') {// Si el objeto de ciudad tiene un nombre válido explicitCityName = cityObject.attributes.name.trim(); // Nombre de la ciudad explícita hasExplicitCity = true; // source = "W.model.cities (cityID)"; } } } // 2. Check for STREET information (and any city derived from it) // SDK street check if (venueSDKObject && venueSDKObject.address) if ((venueSDKObject.address.street && typeof venueSDKObject.address.street.name === 'string' && venueSDKObject.address.street.name.trim() !== '') || (typeof venueSDKObject.address.streetName === 'string' && venueSDKObject.address.streetName.trim() !== '')) hasStreetInfo = true; // source = "SDK (address.street.name or streetName)"; if (venueFromOldModel && venueFromOldModel.attributes && venueFromOldModel.attributes.streetID) {// Old Model street check (if not found via SDK or to supplement) hasStreetInfo = true; // Street ID exists in old model const streetID = venueFromOldModel.attributes.streetID; // Obtener el streetID del modelo antiguo if (typeof W !== 'undefined' && W.model && W.model.streets && W.model.streets.getObjectById) {// Si hay un streetID en el modelo antiguo const streetObject = W.model.streets.getObjectById(streetID); // Obtener el objeto de calle del modelo Waze if (streetObject && streetObject.attributes && streetObject.attributes.cityID) {// Si el objeto de calle tiene un cityID asociado const cityIDFromStreet = streetObject.attributes.cityID;// Obtener el cityID de la calle if (W.model.cities && W.model.cities.getObjectById) {// Si W.model.cities está disponible y tiene el método getObjectById const cityObjectFromStreet = W.model.cities.getObjectById(cityIDFromStreet);// Obtener el objeto de ciudad asociado a la calle // Si el objeto de ciudad tiene un nombre válido if (cityObjectFromStreet && cityObjectFromStreet.attributes && typeof cityObjectFromStreet.attributes.name === 'string' && cityObjectFromStreet.attributes.name.trim() !== '') cityAssociatedWithStreet = cityObjectFromStreet.attributes.name.trim(); // Nombre de la ciudad asociada a la calle } } } } // --- 3. Determine icon, title, and returned hasCity based on user's specified logic --- let icon; let title; const returnedHasCityBoolean = hasExplicitCity; // To be returned, indicates if an *explicit* city is set. const hasAnyAddressInfo = hasExplicitCity || hasStreetInfo; // Determina si hay alguna información de dirección (ciudad explícita o calle). //console.log(`[WME_PLN] Calculated flags: hasExplicitCity=${hasExplicitCity} (Name: ${explicitCityName}), hasStreetInfo=${hasStreetInfo}, cityAssociatedWithStreet=${cityAssociatedWithStreet}`); //console.log(`[WME_PLN] Calculated: hasAnyAddressInfo=${hasAnyAddressInfo}`); if (hasAnyAddressInfo) {// Si hay información de dirección (ciudad explícita o calle) if (hasExplicitCity) {// Tiene ciudad explícita icon = "🏙️"; // Icono para ciudad asignada title = `Ciudad: ${explicitCityName}`; } else { // No tiene ciudad explícita, pero sí información de calle if (cityAssociatedWithStreet) { // Tiene calle y ciudad asociada a la calle icon = "🇻🇦"; title = `Tiene ciudad asociada a la calle: ${cityAssociatedWithStreet}`; } else { icon = "🚫"; title = "Tiene calle, sin ciudad explícita"; } } } else { // No tiene ni ciudad explícita ni información de calle icon = "🚫"; title = "El campo dirección posee inconsistencias"; // Título para "no tiene ciudad ni calle" } // console.log(`[WME_PLN] Place ID ${venueFromOldModel ? venueFromOldModel.getID() : 'N/A'}: Icon=${icon}, Title='${title}', HasExplicitCity=${hasExplicitCity}, HasStreet=${hasStreetInfo}, CityViaStreet='${cityAssociatedWithStreet}', ReturnedHasCity=${returnedHasCityBoolean}`); return { icon: icon || "❓", // Usar '?' si icon es undefined/null/empty title: title || "Info no disponible", // Usar "Info no disponible" si title es undefined/null/empty hasCity: returnedHasCityBoolean || false // Asegurarse de que sea un booleano }; }//getPlaceCityInfo //Renderizar barra de progreso en el TAB PRINCIPAL justo después del slice const tabOutput = document.querySelector("#wme-normalization-tab-output"); if (tabOutput) {// Si el tab de salida ya existe, limpiar su contenido // Reiniciar el estilo del mensaje en el tab al valor predeterminado tabOutput.style.color = "#000"; tabOutput.style.fontWeight = "normal"; // Crear barra de progreso visual const progressBarWrapperTab = document.createElement("div"); progressBarWrapperTab.style.margin = "10px 0"; progressBarWrapperTab.style.marginTop = "10px"; progressBarWrapperTab.style.height = "18px"; progressBarWrapperTab.style.backgroundColor = "transparent"; // Crear el contenedor de la barra de progreso const progressBarTab = document.createElement("div"); progressBarTab.style.height = "100%"; progressBarTab.style.width = "0%"; progressBarTab.style.backgroundColor = "#007bff"; progressBarTab.style.transition = "width 0.2s"; progressBarTab.id = "progressBarInnerTab"; progressBarWrapperTab.appendChild(progressBarTab); // Crear texto de progreso const progressTextTab = document.createElement("div"); progressTextTab.style.fontSize = "12px"; progressTextTab.style.marginTop = "5px"; progressTextTab.id = "progressBarTextTab"; tabOutput.appendChild(progressBarWrapperTab); tabOutput.appendChild(progressTextTab); } // Asegurar que la barra de progreso en el tab se actualice desde el principio const progressBarInnerTab = document.getElementById("progressBarInnerTab"); // Obtener la barra de progreso del tab const progressBarTextTab = document.getElementById("progressBarTextTab"); // Obtener el texto de progreso del tab if (progressBarInnerTab && progressBarTextTab) {// Si ambos elementos existen, reiniciar su estado progressBarInnerTab.style.width = "0%"; progressBarTextTab.textContent = `Progreso: 0% (0/${places.length})`; // Reiniciar el texto de progreso } // --- PANEL FLOTANTE: limpiar y preparar salida --- const output = document.querySelector("#wme-place-inspector-output");// if (!output) {// Si el panel flotante no está disponible, mostrar un mensaje de error console.error("[WME_PLN][ERROR]❌ Panel flotante no está disponible"); return; } output.innerHTML = ""; // Limpia completamente el contenido del panel flotante output.innerHTML = "<div style='display:flex; align-items:center; gap:10px;'><span class='loader-spinner' style='width:16px; height:16px; border:2px solid #ccc; border-top:2px solid #007bff; border-radius:50%; animation:spin 0.8s linear infinite;'></span><div><div id='processingText'>Procesando lugares visibles<span class='dots'>.</span></div><div id='processingStep' style='font-size:13px; color:#555;'>Inicializando escaneo...</div></div></div>"; // Asegurar que el panel flotante tenga un alto mínimo const processingStepLabel = document.getElementById("processingStep"); // Animación de puntos suspensivos const dotsSpan = output.querySelector(".dots"); if (dotsSpan) {// Si el span de puntos existe, iniciar la animación de puntos const dotStates = ["", ".", "..", "..."]; let dotIndex = 0; window.processingDotsInterval = setInterval(() => {dotIndex = (dotIndex + 1) % dotStates.length; dotsSpan.textContent = dotStates[dotIndex];}, 500); } output.style.height = "calc(55vh - 40px)"; if (!places.length) {// Si no hay places, mostrar mensaje y salir output.appendChild(document.createTextNode("No hay places visibles para analizar.")); const existingOverlay = document.getElementById("scanSpinnerOverlay"); if (existingOverlay)// Si ya existe un overlay de escaneo, removerlo existingOverlay.remove(); return; } // Procesamiento incremental para evitar congelamiento let inconsistents = []; // Array para almacenar inconsistencias encontradas let index = 0; // Índice para iterar sobre los lugares const scanBtn = document.querySelector("button[type='button']"); // Remover ícono de ✔ previo si existe if (scanBtn) {// Si el botón de escaneo existe, remover el ícono de ✔ previo si está presente const existingCheck = scanBtn.querySelector("span"); if (existingCheck) // Si hay un span dentro del botón, removerlo existingCheck.remove(); } // --- Sugerencias por palabra global para toda la ejecución --- let sugerenciasPorPalabra = {}; // Convertir excludedWords a array solo una vez al inicio del análisis, seguro ante undefined const excludedArray = (typeof excludedWords !== "undefined" && Array.isArray(excludedWords)) ? excludedWords : (typeof excludedWords !== "undefined" ? Array.from(excludedWords) : []); async function processNextPlace() { const currentPlaceForLog = places[index]; const currentVenueIdForLog = currentPlaceForLog ? currentPlaceForLog.getID() : 'ID Desconocido'; const currentVenueId = currentVenueIdForLog; // Usar el ID del lugar actual para el procesamiento console.log(`\n[WME PLN - processNextPlace] --- INICIANDO PROCESAMIENTO PARA LUGAR ID: ${currentVenueIdForLog} (Índice: ${index}) ---`); console.log(`[WME PLN - processNextPlace] Total de lugares a procesar: ${places.length}`); let cityInfo = { icon: "❓", title: "Información de ciudad no disponible", hasCity: false }; // --- Obtener venueSDK lo antes posible para el nombre más confiable --- let venueSDK = null; //Declarar e inicializar variables importantes al inicio let resolvedEditorName = "Desconocido"; let lastEditorIdForComparison = null; // Declarar e inicializar variables relacionadas con el usuario y el salto al principio let currentLoggedInUserId = currentGlobalUserInfo.id; // let wasEditedByMe = false; // const avoidMyEdits = document.getElementById("chk-avoid-my-edits")?.checked ?? false; // // Declarar variables de estado de salto aquí let shouldSkipThisPlace = false; // Inicializar al principio let skipReasonLog = ""; // Inicializar al principio if (wmeSDK && wmeSDK.DataModel && wmeSDK.DataModel.Venues && wmeSDK.DataModel.Venues.getById) // Verificar si wmeSDK y sus métodos están disponibles try { venueSDK = await wmeSDK.DataModel.Venues.getById({ venueId: currentVenueIdForLog }); } catch (sdkError) { console.error(`[WME_PLN] Error al obtener venueSDK para ID ${currentVenueIdForLog}:`, sdkError); } // --- Determinar el nombre original más completo (priorizando SDK) --- let originalNameRaw; // Este conservará el nombre REAL, con emojis. if (venueSDK && venueSDK.name) originalNameRaw = venueSDK.name; else originalNameRaw = currentPlaceForLog && currentPlaceForLog.attributes ? (currentPlaceForLog.attributes.name?.value || currentPlaceForLog.attributes.name || '') : ''; originalNameRaw = originalNameRaw.trim();// Asegurarse de que el nombre original esté limpio de espacios al inicio y al final // Inicializar typeInfo y areaMeters ANTES de usarlos let typeInfo = { isArea: false, icon: "⊙", title: "Punto" }; let areaMeters = null; if (venueSDK) { typeInfo = getPlaceTypeInfo(venueSDK); areaMeters = calculateAreaMeters(venueSDK); } // Crear una versión SIN emojis solo para el PROCESO de normalización. const nameForProcessing = removeEmoticons(originalNameRaw); console.log(`[WME PLN - processNextPlace] Nombre Original Raw (de Waze/SDK): "${originalNameRaw}"`); console.log(`[WME PLN - processNextPlace] Nombre para Procesamiento (sin emojis): "${nameForProcessing}"`); console.log(`[WME PLN - DEBUG] Place ID: ${currentVenueId}, Name: "${originalNameRaw}"`); console.log(`[WME PLN - DEBUG] -> typeInfo:`, typeInfo); // Mostrar el objeto typeInfo completo console.log(`[WME PLN - DEBUG] -> areaMeters:`, areaMeters); // Mostrar el valor de areaMeters //Obtener el ID del usuario actual (si está disponible globalmente de forma confiable) const useFullPipeline = true; // Siempre usar el pipeline completo para este flujo const applyGeneralReplacements = useFullPipeline || (document.getElementById("chk-general-replacements")?.checked ?? true); // Aplicar reemplazos generales por defecto const checkExcludedWords = useFullPipeline || (document.getElementById("chk-check-excluded")?.checked ?? false); // Verificar palabras excluidas por defecto const checkDictionaryWords = true;// Siempre verificar palabras del diccionario para este flujo const restoreCommas = document.getElementById("chk-restore-commas")?.checked ?? false;// Restaurar comas por defecto const similarityThreshold = parseFloat(document.getElementById("similarityThreshold")?.value || "81") / 100;// Umbral de similitud por defecto (convertido a porcentaje) //console.log(`[WME_PLN] Configuraciones leídas.`); // 2. Condición de salida principal (todos los lugares procesados) if (index >= places.length) { // console.log("[WME_PLN] Todos los lugares procesados. Finalizando render..."); finalizeRender(inconsistents, places, sugerenciasPorPalabra); return; } const venueFromOldModel = places[index]; // Obtener el lugar actual del array de lugares const currentVenueNameObj = venueFromOldModel?.attributes?.name; // Obtener el objeto de nombre del lugar actual const nameValue = typeof currentVenueNameObj === 'object' && currentVenueNameObj !== null && typeof currentVenueNameObj.value === 'string' ? currentVenueNameObj.value.trim() !== '' ? currentVenueNameObj.value : undefined : typeof currentVenueNameObj === 'string' && currentVenueNameObj.trim() !== '' ? currentVenueNameObj : undefined; if (!places[index] || typeof places[index] !== 'object') {// 2.1 --- Verificar si el lugar es válido y tiene un ID --- // console.warn(`[WME_PLN] Lugar inválido o tipo inesperado en el índice ${index}:`, places[index]); updateScanProgressBar(index, places.length); index++; // console.log(`[WME_PLN] Saltando al siguiente place (lugar inválido). Próximo índice: ${index}`); setTimeout(() => processNextPlace(), 0); return; } // console.log(`[WME_PLN] Venue Old Model obtenido: ID ${venueFromOldModel.getID()}`); // 3. Salto temprano si el venue es inválido o no tiene nombre if (!venueFromOldModel || typeof venueFromOldModel !== 'object' || !venueFromOldModel.attributes || typeof nameValue !== 'string' || nameValue.trim() === '') { //console.warn(`[WME_PLN] Lugar inválido o sin nombre en el índice ${index}:`, venueFromOldModel); updateScanProgressBar(index, places.length);// Actualizar barra de progreso antes de saltar al siguiente lugar index++; // console.log(`[WME_PLN] Saltando al siguiente place (sin nombre/inválido). Próximo índice: ${index}`); setTimeout(() => processNextPlace(), 0); return; } // Se usa la variable limpia de emojis para generar el nombre normalizado. const originalName = nameForProcessing; // 'originalName' ahora es explícitamente para el pipeline de procesamiento. const normalizedName = processPlaceName(originalName); // Normalizar el nombre del lugar console.log(`[WME PLN - processNextPlace] Nombre Original para pipeline (sin emojis): "${originalName}"`); console.log(`[WME PLN - processNextPlace] Nombre Normalizado (después de processPlaceName): "${normalizedName}"`); // 4. Verificar si el nombre ya está normalizado (sin emojis) y no requiere cambios const { lat: placeLat, lon: placeLon } = getPlaceCoordinates(venueFromOldModel, venueSDK);// Obtener las coordenadas del lugar // Continuar con el flujo usando el nombre normalizado //console.log(`[WME_PLN]Nombre original: "${originalName}", Nombre normalizado: "${normalizedName}"`); // const currentVenueId = venueFromOldModel.getID(); // Lógica unificada y robusta para obtener resolvedEditorName, lastEditorIdForComparison y calcular wasEditedByMe resolvedEditorName = "Desconocido"; // Reinicializar para cada place lastEditorIdForComparison = null; // Reinicializar para cada place // Obtener el ID del usuario actual de forma robusta if (venueSDK && venueSDK.modificationData) { const updatedByDataFromSDK = venueSDK.modificationData.updatedBy; if (typeof updatedByDataFromSDK === 'string' && updatedByDataFromSDK.trim() !== '') { resolvedEditorName = updatedByDataFromSDK; // El nombre del editor es una cadena } else if (typeof updatedByDataFromSDK === 'number') { lastEditorIdForComparison = updatedByDataFromSDK; // El ID numérico es la fuente principal resolvedEditorName = `ID ${updatedByDataFromSDK}`; // Nombre temporal if (W && W.model && W.model.users) { const userObjectW = W.model.users.getObjectById(updatedByDataFromSDK); if (userObjectW && userObjectW.userName) {// Si el usuario está en el modelo Waze resolvedEditorName = userObjectW.userName; // Obtener nombre real del usuario si está en el modelo } } } } else if (venueFromOldModel && venueFromOldModel.attributes && (venueFromOldModel.attributes.updatedBy !== null && venueFromOldModel.attributes.updatedBy !== undefined)) { // Fallback al modelo antiguo si el SDK no dio datos de editor const oldModelUpdatedBy = venueFromOldModel.attributes.updatedBy; lastEditorIdForComparison = oldModelUpdatedBy; // El ID numérico es la fuente principal resolvedEditorName = `ID ${oldModelUpdatedBy}`; // Nombre temporal if (W && W.model && W.model.users) { const userObjectW = W.model.users.getObjectById(oldModelUpdatedBy); if (userObjectW && userObjectW.userName) { resolvedEditorName = userObjectW.userName; // Obtener nombre real del usuario si está en el modelo } } } else { resolvedEditorName = "N/D"; // No hay información de editor } // Calcular wasEditedByMe de forma robusta aquí mismo wasEditedByMe = false; // Resetear para este place if (currentLoggedInUserId !== null && currentLoggedInUserId !== undefined && resolvedEditorName !== "N/D") { // Solo si tenemos un nombre de usuario logueado y el resolvedEditorName no es N/D if (lastEditorIdForComparison !== null && lastEditorIdForComparison !== undefined && typeof lastEditorIdForComparison === 'number') { // PRIORIDAD 1: Comparar IDs numéricos si ambos están disponibles y son válidos if (typeof currentLoggedInUserId === 'number') { // Si el ID también es numérico wasEditedByMe = (lastEditorIdForComparison === currentLoggedInUserId); } else { // Si el ID es string (userName) y el del place es number wasEditedByMe = (String(lastEditorIdForComparison) === currentLoggedInUserId); // Convertir solo el del place a string } } else if (resolvedEditorName && typeof resolvedEditorName === 'string') { // PRIORIDAD 2: Si no hay ID numérico del editor del place, pero sí su nombre, comparar por nombre wasEditedByMe = (resolvedEditorName.toLowerCase() === String(currentLoggedInUserId).toLowerCase()); } } // console.log(`[WME_PLN] Iniciando pipeline de normalización para: "${originalName}"`); // Paso 1: Usar la función principal para la normalización base (capitalización, reglas especiales, etc.). let processedName = processPlaceName(originalName); // console.log(`[WME_PLN] Después de processPlaceName: "${processedName}"`); // Paso 2: Aplicar reemplazos generales (como | por - , etc.). processedName = aplicarReemplazosGenerales(processedName); // console.log(`[WME_PLN] Después de aplicarReemplazosGenerales: "${processedName}"`); // Paso 3: Aplicar el movimiento de palabras al inicio (función de SWAP). processedName = applyWordsToStartMovement(processedName); // console.log(`[WME_PLN] Después de applyWordsToStartMovement: "${processedName}"`); // Paso 4: Limpieza final para crear el nombre sugerido definitivo. let suggestedName = processedName.replace(/\s{2,}/g, ' ').trim(); // Paso 5: Quitar el punto final si existe. if (suggestedName.endsWith('.')) { suggestedName = suggestedName.slice(0, -1); } //console.log(`[WME_PLN] Nombre sugerido final: "${suggestedName}"`); // --- Lógica para generar sugerencias del diccionario --- const originalWords = originalName.split(/\s+/).filter(word => word.length > 0); let sugerenciasLugar = {}; const suggestedNameWords = suggestedName.split(/\s+/).filter(word => word.length > 0); originalWords.forEach((originalWord, wordIndex) => { console.log(`\n[WME PLN - processNextPlace] Procesando palabra original: "${originalWord}" (Índice: ${wordIndex})`); if (!originalWord) return; const lowerOriginalWord = originalWord.toLowerCase(); const cleanedLowerNoDiacritics = removeDiacritics(lowerOriginalWord); console.log(`[WME PLN - processNextPlace] lowerOriginalWord: "${lowerOriginalWord}", cleanedLowerNoDiacritics: "${cleanedLowerNoDiacritics}"`); let tildeCorrectionSuggested = false; // Bandera para saber si ya sugerimos tilde para esta palabra const currentSuggestedWord = suggestedNameWords[wordIndex] || ''; const lowerCurrentSuggestedWord = currentSuggestedWord.toLowerCase(); const currentSuggestedWordHasDiacritics = /[áéíóúÁÉÍÓÚüÜñÑ]/.test(lowerCurrentSuggestedWord); console.log(`[WME PLN - processNextPlace] currentSuggestedWord (del nombre sugerido): "${currentSuggestedWord}", lowerCurrentSuggestedWord: "${lowerCurrentSuggestedWord}", currentSuggestedWordHasDiacritics: ${currentSuggestedWordHasDiacritics}`); // ******************************************************************* // PASO 1: PRIORIDAD - SUGERIR CORRECCIÓN DE TILDES if (window.dictionaryWords && window.dictionaryWords.size > 0) { console.log(`[WME PLN - processNextPlace] Iniciando búsqueda de corrección de tildes para: "${originalWord}"`); const firstChar = lowerOriginalWord.charAt(0); const candidatesForTildeCheck = window.dictionaryIndex[firstChar] ? Array.from(window.dictionaryIndex[firstChar]) : []; console.log(`[WME PLN - processNextPlace] Candidatos del diccionario (letra '${firstChar}'):`, candidatesForTildeCheck); for (const dictWord of candidatesForTildeCheck) { const lowerDictWord = dictWord.toLowerCase(); const cleanedDictWordNoDiacritics = removeDiacritics(lowerDictWord); console.log(`[WME PLN - processNextPlace] Comparando con dictWord: "${dictWord}", lowerDictWord: "${lowerDictWord}", cleanedDictWordNoDiacritics: "${cleanedDictWordNoDiacritics}"`); const conditionMet = cleanedDictWordNoDiacritics === cleanedLowerNoDiacritics && // Mismo sin tilde lowerDictWord !== lowerCurrentSuggestedWord && // Diferente (uno tiene tilde, el otro no) !currentSuggestedWordHasDiacritics && // La palabra en el SUGERIDO no tiene tilde /[áéíóúÁÉÍÓÚüÜñÑ]/.test(lowerDictWord); // La palabra del diccionario SÍ tiene tilde console.log(`[WME PLN - processNextPlace] Condición de tilde cumplida: ${conditionMet}`); if (conditionMet) { let suggestedTildeWord = normalizeWordInternal(dictWord, true, false); console.log(`[WME PLN - processNextPlace] ✅ ¡Tilde sugerida! Original: "${originalWord}" -> Sugerencia: "${suggestedTildeWord}"`); if (!sugerenciasLugar[originalWord]) sugerenciasLugar[originalWord] = []; sugerenciasLugar[originalWord].push({ word: suggestedTildeWord, similarity: 0.999, fuente: 'dictionary_tilde' }); tildeCorrectionSuggested = true; break; } } if (!tildeCorrectionSuggested) { console.log(`[WME PLN - processNextPlace] No se encontró sugerencia de tilde para "${originalWord}" en el diccionario.`); } } // ******************************************************************* // ******************************************************************* // PASO 2: OTRAS SUGERENCIAS DEL DICCIONARIO (SOLO SI NO SE SUGIRIÓ CORRECCIÓN DE TILDE) if (!tildeCorrectionSuggested && checkDictionaryWords && window.dictionaryWords) { console.log(`[WME PLN - processNextPlace] Buscando otras sugerencias del diccionario para: "${originalWord}" (No se sugirió tilde).`); const similarDictionary = findSimilarWords(cleanedLowerNoDiacritics, window.dictionaryIndex, similarityThreshold); if (similarDictionary.length > 0) { const finalSuggestions = similarDictionary.filter(d => d.word.toLowerCase() !== lowerOriginalWord && // No es la misma palabra original d.word.toLowerCase() !== lowerCurrentSuggestedWord && // No es la misma palabra que ya está en el sugerido !sugerenciasLugar[originalWord]?.some(s => s.word === normalizeWordInternal(d.word, true, false)) // No duplica una sugerencia de tilde ya agregada ); console.log(`[WME PLN - processNextPlace] Otras sugerencias filtradas:`, finalSuggestions); if (finalSuggestions.length > 0) { if (!sugerenciasLugar[originalWord]) sugerenciasLugar[originalWord] = []; finalSuggestions.forEach(dictSuggestion => { if (!sugerenciasLugar[originalWord].some(s => s.word === normalizeWordInternal(dictSuggestion.word, true, false))) { sugerenciasLugar[originalWord].push({ ...dictSuggestion, fuente: 'dictionary' }); } }); } } } // ******************************************************************* }); // console.log(`[WME_PLN] Nombre sugerido después de trim/espacios múltiples: "${suggestedName}"`); // 6.1 --- QUITAR PUNTO FINAL SI EXISTE --- if (suggestedName.endsWith('.')) { suggestedName = suggestedName.slice(0, -1); // console.log(`[WME_PLN] Nombre sugerido después de quitar punto final: "${suggestedName}"`); } // 6.2 --- QUITAR ESPACIOS MÚLTIPLES --- //console.log(`[WME_PLN] Evaluando lógica de salto...`); const tieneSugerencias = Object.keys(sugerenciasLugar).length > 0; // Condición 1: Si el nombre ya está normalizado y no hay cambios significativos let isNameAlreadyNormalized = false; // Comparamos la versión de procesamiento (sin emojis) con el nombre final sugerido. const cleanedOriginalName = nameForProcessing.trim().replace(/\s{2,}/g, ' '); let isNameEffectivelyNormalized = (cleanedOriginalName === suggestedName.trim()); console.log(`[WME PLN - processNextPlace] isNameEffectivelyNormalized (Original vs Sugerido): ${isNameEffectivelyNormalized}`); // PASO 1: Comprobar si se debe excluir por ser una edición tuya DENTRO del rango de fecha. if (avoidMyEdits && wasEditedByMe) { // Es un lugar editado por mí y el filtro está activo. const dateFilterValue = document.getElementById("dateFilterSelect")?.value || "all"; const placeEditDate = (venueSDK && venueSDK.modificationData && venueSDK.modificationData.updatedOn) ? new Date(venueSDK.modificationData.updatedOn) : null; // Comprobar si la fecha de edición del lugar está dentro del rango seleccionado if (placeEditDate && isDateWithinRange(placeEditDate, dateFilterValue)) { // Está DENTRO del rango, por lo tanto, se omite. La decisión es final. shouldSkipThisPlace = true; skipReasonLog = `[SKIP MY OWN EDIT - In Range: ${dateFilterValue}]`; } // Si está FUERA del rango, no hacemos nada aquí. Dejamos que 'shouldSkipThisPlace' siga siendo 'false' // y pase al siguiente filtro de abajo. } // PASO 2.5: Comprobar si el lugar está en la lista de excluidos console.log(`[WME PLN - SKIP] Verificando exclusión para ID: "${currentVenueIdForLog}"`); console.log(`[WME PLN - SKIP] 'excludedPlaces' contiene ID: ${excludedPlaces.has(currentVenueIdForLog)}`); // true/false console.log(`[WME PLN - SKIP] Contenido de 'excludedPlaces' (primeros 5 entries):`, Array.from(excludedPlaces.entries()).slice(0, 5)); // Ver algunos IDs guardados if (!shouldSkipThisPlace && excludedPlaces.has(currentVenueIdForLog)) { shouldSkipThisPlace = true; skipReasonLog = `[SKIP EXCLUDED PLACE]`; } // PASO 2: Comprobar si el lugar ya está normalizado. // Esta regla se aplica a TODOS los lugares que NO fueron omitidos en el PASO 1. // (Incluye los lugares de otros editores y propias ediciones fuera del rango de fecha). if (!shouldSkipThisPlace && isNameEffectivelyNormalized) { shouldSkipThisPlace = true; skipReasonLog = `[SKIP NORMALIZED]`; } // PASO ADICIONAL DE SALTO: Si es un área y no se pudo calcular su área if (!shouldSkipThisPlace && typeInfo.isArea && areaMeters === null) { // <-- typeInfo se usa aquí shouldSkipThisPlace = true; skipReasonLog = `[SKIP AREA_CALC_FAILED]`; } console.log(`[WME PLN - processNextPlace] LUGAR NO SALTADO. Procediendo. ID: ${currentVenueId}. Nombre: "${originalNameRaw}"`); console.log(`[WME PLN - SKIP] Verificando exclusión para ID: "${currentVenueIdForLog}"`); console.log(`[WME PLN - SKIP] 'excludedPlaces' contiene ID: ${excludedPlaces.has(currentVenueIdForLog)}`); // true/false console.log(`[WME PLN - SKIP] Contenido de 'excludedPlaces' (primeros 5 entries):`, Array.from(excludedPlaces.entries()).slice(0, 5)); // Ver algunos IDs guardados // PASO 2.5: Comprobar si el lugar está en la lista de excluidos if (!shouldSkipThisPlace && excludedPlaces.has(currentVenueIdForLog)) { shouldSkipThisPlace = true; skipReasonLog = `[SKIP EXCLUDED PLACE]`; } // --- Salto temprano si se determinó omitir el lugar --- if (shouldSkipThisPlace) { console.log(`[WME PLN - processNextPlace] LUGAR SALTADO. Razón: ${skipReasonLog}. ID: ${currentVenueId}. Nombre: "${originalNameRaw}"`); // if (skipReasonLog) console.log(`[WME_PLN] ${skipReasonLog} Descartado "${originalName}" (ID: ${currentVenueId})`); //Añadir ID al log const updateFrequency = 3; // Actualiza cada 3 lugares la barra de progreso if ((index + 1) % updateFrequency === 0 || (index + 1) === places.length) { updateScanProgressBar(index, places.length); } index++; setTimeout(() => processNextPlace(), 0); // Continúa con el siguiente lugar return; } else { console.log(`[WME PLN - processNextPlace] LUGAR NO SALTADO. Procediendo. ID: ${currentVenueId}. Nombre: "${originalNameRaw}"`); } //console.log(`[WME_PLN] Decisión de salto: ${shouldSkipThisPlace} (${skipReasonLog})`); // 8. Registrar o no en la lista de inconsistentes //console.log(`[WME_PLN] Registrando lugar con inconsistencias...`); // *** Si Llegamos Aquí, El Lugar No Se Salta Y Necesitamos Su Info Completa Para La Tabla *** if (processingStepLabel) { processingStepLabel.textContent = "Registrando lugar(es) con inconsistencias..."; } // Lógica de Categorías (solo para lugares no saltados) const shouldRecommendCategories = document.getElementById("chk-recommend-categories")?.checked ?? true; let currentCategoryKey; let currentCategoryIcon; let currentCategoryTitle; let currentCategoryName; let dynamicSuggestions; try { const lang = getWazeLanguage(); currentCategoryKey = getPlaceCategoryName(venueFromOldModel, venueSDK); const categoryDetails = getCategoryDetails(currentCategoryKey); currentCategoryIcon = categoryDetails.icon; currentCategoryTitle = categoryDetails.description; currentCategoryName = categoryDetails.description; if (shouldRecommendCategories) dynamicSuggestions = findCategoryForPlace(originalName); else dynamicSuggestions = []; } catch (e) { console.error("[WME PLN] Error procesando las categorías:", e); currentCategoryName = "Error"; currentCategoryIcon = "❓"; currentCategoryTitle = "Error al obtener categoría"; dynamicSuggestions = []; currentCategoryKey = "UNKNOWN"; } // Lógica unificada y robusta para obtener resolvedEditorName, lastEditorIdForComparison y calcular wasEditedByMe resolvedEditorName = "Desconocido"; // Reinicializar para cada place lastEditorIdForComparison = null; // Reinicializar para cada place if (venueSDK && venueSDK.modificationData) { const updatedByDataFromSDK = venueSDK.modificationData.updatedBy; if (typeof updatedByDataFromSDK === 'string' && updatedByDataFromSDK.trim() !== '') { resolvedEditorName = updatedByDataFromSDK; // El nombre del editor es una cadena } else if (typeof updatedByDataFromSDK === 'number') { lastEditorIdForComparison = updatedByDataFromSDK; // El ID numérico es la fuente principal resolvedEditorName = `ID ${updatedByDataFromSDK}`; // Nombre temporal if (W && W.model && W.model.users) { const userObjectW = W.model.users.getObjectById(updatedByDataFromSDK); if (userObjectW && userObjectW.userName) { resolvedEditorName = userObjectW.userName; // Obtener nombre real del usuario si está en el modelo } } } } else if (venueFromOldModel && venueFromOldModel.attributes && (venueFromOldModel.attributes.updatedBy !== null && venueFromOldModel.attributes.updatedBy !== undefined)) { // Fallback al modelo antiguo si el SDK no dio datos de editor const oldModelUpdatedBy = venueFromOldModel.attributes.updatedBy; lastEditorIdForComparison = oldModelUpdatedBy; // El ID numérico es la fuente principal resolvedEditorName = `ID ${oldModelUpdatedBy}`; // Nombre temporal if (W && W.model && W.model.users) { const userObjectW = W.model.users.getObjectById(oldModelUpdatedBy); if (userObjectW && userObjectW.userName) { resolvedEditorName = userObjectW.userName; // Obtener nombre real del usuario si está en el modelo } } } else { resolvedEditorName = "N/D"; // No hay información de editor } wasEditedByMe = false; // Resetear para este place // Calcular wasEditedByMe de forma robusta aquí mismo if (currentLoggedInUserId !== null && currentLoggedInUserId !== undefined && resolvedEditorName !== "N/D") { // Solo si tenemos un nombre de usuario logueado y el resolvedEditorName no es N/D if (lastEditorIdForComparison !== null && lastEditorIdForComparison !== undefined && typeof lastEditorIdForComparison === 'number') { // PRIORIDAD 1: Comparar IDs numéricos si ambos están disponibles y son válidos if (typeof currentLoggedInUserId === 'number') { // Si el ID también es numérico wasEditedByMe = (lastEditorIdForComparison === currentLoggedInUserId); } else { // Si el ID es string (userName) y el del place es number wasEditedByMe = (String(lastEditorIdForComparison) === currentLoggedInUserId); // Convertir solo el del place a string } } else if (resolvedEditorName && typeof resolvedEditorName === 'string') { // PRIORIDAD 2: Si no hay ID numérico del editor del place, pero sí su nombre, comparar por nombre wasEditedByMe = (resolvedEditorName.toLowerCase() === String(currentLoggedInUserId).toLowerCase()); } } // Obtener información de la ciudad (esto ya estaba bien, solo reubicado) try { cityInfo = await getPlaceCityInfo(venueFromOldModel, venueSDK); } catch (e) { console.error(`[WME_PLN] Error al obtener información de la ciudad para el venue ID ${currentVenueId}:`, e); } //Determinar nivel de bloqueo correspondiente let lockRank = 0; // Valor por defecto if (venueSDK && venueSDK.lockRank !== undefined && venueSDK.lockRank !== null) lockRank = venueSDK.lockRank; else if (venueFromOldModel && venueFromOldModel.attributes && venueFromOldModel.attributes.lockRank !== undefined && venueFromOldModel.attributes.lockRank !== null) lockRank = venueFromOldModel.attributes.lockRank; //console.log(`[WME_PLN][DEBUG] Place ID: ${currentVenueId}, Raw LockRank: ${lockRank}`); let lockRankEmoji; // Lógica corregida: 1 al 6 muestra su respectivo emoji; 0 (desbloqueado) o cualquier otro valor muestra 0️⃣ if (lockRank >= 0 && lockRank <= 5) lockRankEmoji = lockRankEmojis[lockRank+1]; // Usa el emoji para el nivel exacto (1 al 6) else lockRankEmoji = lockRankEmojis[0]; // Para 0 (desbloqueado), Auto (si no fue 1-6), o cualquier otro caso //console.log(`[WME_PLN][DEBUG] Assigned LockRankEmoji: ${lockRankEmoji}`); // Agregar a la lista de inconsistencias inconsistents.push({ lockRankEmoji: lockRankEmoji, id: currentVenueId, original: originalNameRaw, normalized: suggestedName, editor: resolvedEditorName, // Usamos el nombre del editor resuelto cityIcon: cityInfo.icon, cityTitle: cityInfo.title, hasCity: cityInfo.hasCity, venueSDKForRender: venueSDK, currentCategoryName: currentCategoryName, currentCategoryIcon: currentCategoryIcon, currentCategoryTitle: currentCategoryTitle, currentCategoryKey: currentCategoryKey, dynamicCategorySuggestions: dynamicSuggestions, // Asegurarse de incluir lat y lon obtenidos de getPlaceCoordinates lat: placeLat, lon: placeLon, typeInfo: typeInfo, // Guardar el objeto completo para su uso en el render areaMeters: areaMeters // Ya se calcula con venueSDK }); // 9. Agregar datos del lugar para la verificación de duplicados sugerenciasPorPalabra[currentVenueId] = sugerenciasLugar;// Guardar sugerencias por palabra para este lugar // 10. Finalizar procesamiento del 'place' actual y pasar al siguiente const updateFrequency = 5; if ((index + 1) % updateFrequency === 0 || (index + 1) === places.length) updateScanProgressBar(index, places.length); index++; setTimeout(() => processNextPlace(), 0); } // console.log("[WME_PLN] Iniciando primer processNextPlace..."); try { setTimeout(() => { processNextPlace(); }, 10); } catch (error) { console.error("[WME_PLN][ERROR_CRITICAL] Fallo al iniciar processNextPlace:", error, error.stack); enableScanControls(); const outputFallback = document.querySelector("#wme-place-inspector-output"); if (outputFallback) { outputFallback.innerHTML = `<div style='color:red; padding:10px;'><b>Error Crítico:</b> El script de normalización encontró un problema grave y no pudo continuar. Revise la consola para más detalles (F12).<br>Detalles: ${error.message}</div>`; } const scanBtn = document.querySelector("button[type='button']"); // Asumiendo que es el botón de Start Scan if (scanBtn) { scanBtn.disabled = false; scanBtn.textContent = "Start Scan... (Error Previo)"; } if (window.processingDotsInterval) { clearInterval(window.processingDotsInterval); } }// processNextPlace // Función para re-aplicar la lógica de palabras excluidas al texto normalizado function reapplyExcludedWordsLogic(text, excludedWordsSet) { if (typeof text !== 'string' || !excludedWordsSet || excludedWordsSet.size === 0) { return text; } const wordsInText = text.split(/\s+/); const processedWordsArray = wordsInText.map(word => { if (word === "") return ""; const wordWithoutDiacriticsLower = removeDiacritics(word.toLowerCase()); // Encontrar la palabra excluida que coincida (insensible a may/min y diacríticos) const matchingExcludedWord = Array.from(excludedWordsSet).find( w_excluded => removeDiacritics(w_excluded.toLowerCase()) === wordWithoutDiacriticsLower); if (matchingExcludedWord) { // Si coincide, DEVOLVER LA FORMA EXACTA DE LA LISTA DE EXCLUIDAS return matchingExcludedWord; } // Si no, devolver la palabra como estaba (ya normalizada por pasos previos) return word; }); return processedWordsArray.join(' '); }// reapplyExcludedWordsLogic //Función para finalizar renderizado una vez completado el análisis function finalizeRender(inconsistents, placesArr, allSuggestions) { // Limpiar el mensaje de procesamiento y spinner al finalizar el análisis //const typeInfo = venueSDK?.typeInfo || {}; enableScanControls(); // Detener animación de puntos suspensivos si existe if (window.processingDotsInterval) { clearInterval(window.processingDotsInterval); window.processingDotsInterval = null; } // Refuerza el restablecimiento del botón de escaneo al entrar const scanBtn = document.querySelector("button[type='button']"); if (scanBtn) { scanBtn.textContent = "Start Scan..."; scanBtn.disabled = false; scanBtn.style.opacity = "1"; scanBtn.style.cursor = "pointer"; } // Verificar si el botón de escaneo existe const output = document.querySelector("#wme-place-inspector-output"); if (!output) { // console.error("[WME_PLN]❌ No se pudo montar el panel flotante. Revisar estructura del DOM."); alert("Hubo un problema al mostrar los resultados. Intenta recargar la página."); return; } // Limpiar el mensaje de procesamiento y spinner const undoRedoHandler = function() {// Maneja el evento de deshacer/rehacer if (floatingPanelElement && floatingPanelElement.style.display !== 'none') { waitForWazeAPI(() => { const places = getVisiblePlaces(); renderPlacesInFloatingPanel(places); // Esto mostrará el panel de "procesando" y luego resultados reactivateAllActionButtons(); // No necesitamos setTimeout aquí si renderPlacesInFloatingPanel es síncrono. }); } else { console.log("[WME PLN] Undo/Redo: Panel de resultados no visible, no se re-escanea."); } }; // Objeto para almacenar referencias de listeners para desregistro if (!window._wmePlnUndoRedoListeners) { window._wmePlnUndoRedoListeners = {}; } // Desregistrar listeners previos si existen if (window._wmePlnUndoRedoListeners.undo) { W.model.actionManager.events.unregister("afterundoaction", null, window._wmePlnUndoRedoListeners.undo); } if (window._wmePlnUndoRedoListeners.redo) { W.model.actionManager.events.unregister("afterredoaction", null, window._wmePlnUndoRedoListeners.redo); } // Registrar nuevos listeners W.model.actionManager.events.register("afterundoaction", null, undoRedoHandler); W.model.actionManager.events.register("afterredoaction", null, undoRedoHandler); // Almacenar referencias para poder desregistrar en el futuro window._wmePlnUndoRedoListeners.undo = undoRedoHandler; window._wmePlnUndoRedoListeners.redo = undoRedoHandler; // Esta llamada se hace ANTES de limpiar el output. El primer argumento es el estado, el segundo es el número de inconsistencias. createFloatingPanel("results", inconsistents.length); // Limpiar el mensaje de procesamiento y spinner if (output) { // Mostrar el panel flotante al terminar el procesamiento se usa para mostrar los resultados y llamados al console.log } // Limitar a 30 resultados y mostrar advertencia si excede const maxRenderLimit = 30; const totalInconsistentsOriginal = inconsistents.length; // Guardar el total original let isLimited = false; // Declarar e inicializar isLimited // Si hay más de 30 resultados, limitar a 30 y mostrar mensaje if (totalInconsistentsOriginal > maxRenderLimit) { inconsistents = inconsistents.slice(0, maxRenderLimit); isLimited = true; // Establecer isLimited a true si se aplica el límite // Mostrar mensaje de advertencia si se aplica el límite if (!sessionStorage.getItem("popupShown")) { const modalLimit = document.createElement("div"); // Renombrado a modalLimit para claridad modalLimit.style.position = "fixed"; modalLimit.style.top = "50%"; modalLimit.style.left = "50%"; modalLimit.style.transform = "translate(-50%, -50%)"; modalLimit.style.background = "#fff"; modalLimit.style.border = "1px solid #ccc"; modalLimit.style.padding = "20px"; modalLimit.style.zIndex = "10007"; // <<<<<<< Z-INDEX AUMENTADO modalLimit.style.width = "400px"; modalLimit.style.boxShadow = "0 0 15px rgba(0,0,0,0.3)"; modalLimit.style.borderRadius = "8px"; modalLimit.style.fontFamily = "sans-serif"; // Fondo suave azul y mejor presentación modalLimit.style.backgroundColor = "#f0f8ff"; modalLimit.style.border = "1px solid #aad"; modalLimit.style.boxShadow = "0 0 10px rgba(0, 123, 255, 0.2)"; // --- Insertar ícono visual de información arriba del mensaje --- const iconInfo = document.createElement("div"); // Renombrado iconInfo.innerHTML = "ℹ️"; iconInfo.style.fontSize = "24px"; iconInfo.style.marginBottom = "10px"; modalLimit.appendChild(iconInfo); // Contenedor del mensaje const message = document.createElement("p"); message.innerHTML = `Se encontraron <strong>${ totalInconsistentsOriginal}</strong> lugares con nombres no normalizados.<br><br>Solo se mostrarán los primeros <strong>${ maxRenderLimit}</strong>.<br><br>Una vez corrijas estos, presiona nuevamente <strong>'Start Scan...'</strong> para continuar con el análisis del resto.`; message.style.marginBottom = "20px"; modalLimit.appendChild(message); // Botón de aceptar const acceptBtn = document.createElement("button"); acceptBtn.textContent = "Aceptar"; acceptBtn.style.padding = "6px 12px"; acceptBtn.style.cursor = "pointer"; acceptBtn.style.backgroundColor = "#007bff"; acceptBtn.style.color = "#fff"; acceptBtn.style.border = "none"; acceptBtn.style.borderRadius = "4px"; acceptBtn.addEventListener("click", () => {sessionStorage.setItem("popupShown", "true"); modalLimit.remove(); }); modalLimit.appendChild(acceptBtn); document.body.appendChild(modalLimit); // Se añade al body, así que el z-index debería funcionar globalmente } } // Llamar a la función para detectar y alertar nombres duplicados detectAndAlertDuplicateNames(inconsistents); // Crear un contenedor para los elementos fijos de la cabecera del panel de resultados const fixedHeaderContainer = document.createElement("div"); fixedHeaderContainer.style.background = "#fff"; // Fondo para que no se vea el scroll debajo fixedHeaderContainer.style.padding = "0 10px 8px 10px"; // Padding para espacio y que no esté pegado fixedHeaderContainer.style.borderBottom = "1px solid #ccc"; // Un borde para separarlo de la tabla fixedHeaderContainer.style.zIndex = "11"; // Asegurarse de que esté por encima de la tabla // Añadir Estas Dos Líneas Clave Al FixedHeaderContainer fixedHeaderContainer.style.position = "sticky"; // Hacer Que Este Contenedor Sea Sticky fixedHeaderContainer.style.top = "0"; // Pegado A La Parte Superior Del Contenedor De Scroll const resultsCounter = document.createElement("div"); resultsCounter.className = "results-counter-display"; resultsCounter.style.fontSize = "13px"; resultsCounter.style.color = "#555"; // Color base para el texto normal resultsCounter.style.marginBottom = "8px"; resultsCounter.style.textAlign = "left"; // Almacenar los conteos originales en data attributes para la función updateInconsistenciesCount resultsCounter.dataset.currentCount = inconsistents.length; resultsCounter.dataset.totalOriginal = totalInconsistentsOriginal; resultsCounter.dataset.maxRenderLimit = maxRenderLimit; // Mostrar el número total de inconsistencias encontradas if (totalInconsistentsOriginal > 0) { if (isLimited) { resultsCounter.innerHTML = `<span style="color: #ff0000;"><b>${totalInconsistentsOriginal}</b> inconsistencias encontradas</span>. Mostrando las primeras <span style="color: #ff0000;"><b>${inconsistents.length}</b></span> (límite de ${maxRenderLimit} aplicado).`; } else { resultsCounter.innerHTML = `<span style="color: #ff0000;"><b>${totalInconsistentsOriginal}</b> inconsistencias encontradas</span>. Mostrando <span style="color: #ff0000;"><b>${inconsistents.length}</b></span>.`; } fixedHeaderContainer.appendChild(resultsCounter); // Añadir resultsCounter al fixedHeaderContainer } else { // Si no hay inconsistencias para mostrar en la tabla, mostrar el mensaje de éxito y salir // Esto se manejará en el bloque de 'if (inconsistents.length === 0)' más abajo. const outputDiv = document.querySelector("#wme-place-inspector-output"); if (outputDiv) { outputDiv.innerHTML = `<div style='color:green; padding:10px;'>✔ Todos los lugares visibles están correctamente normalizados o excluidos.</div>`; } } // Si no hay inconsistencias para renderizar la tabla, el mensaje de éxito ya se mostró arriba. // Aquí se asegura que fixedHeaderContainer se añada al output antes de la tabla, // o si no hay inconsistencias, se muestre el mensaje de "Todo normalizado". if (inconsistents.length === 0) { // Si no hay inconsistencias para mostrar en la tabla if (totalInconsistentsOriginal === 0) { // Si realmente no había nada, muestra el mensaje de éxito //output.appendChild(document.createTextNode("Todos los nombres de lugares visibles están correctamente normalizados.")); const checkIcon = document.createElement("div"); checkIcon.innerHTML = "✔ Análisis finalizado sin inconsistencias."; checkIcon.style.marginTop = "10px"; checkIcon.style.fontSize = "14px"; checkIcon.style.color = "green"; output.appendChild(checkIcon); const successMsg = document.createElement("div"); successMsg.textContent = "Todos los nombres están correctamente normalizados."; successMsg.style.marginTop = "10px"; successMsg.style.fontSize = "14px"; successMsg.style.color = "green"; successMsg.style.fontWeight = "bold"; output.appendChild(successMsg); } // Si inconsistents.length === 0 PERO totalInconsistentsOriginal > 0, // significa que se aplicó un límite tan bajo que no se muestra nada, // o se filtraron todos los inconsistentes. El mensaje adecuado ya se mostró en resultsCounter si aplica. const existingOverlay = document.getElementById("scanSpinnerOverlay"); if (existingOverlay) existingOverlay.remove(); const progressBarInnerTab = document.getElementById("progressBarInnerTab"); const progressBarTextTab = document.getElementById("progressBarTextTab"); if (progressBarInnerTab && progressBarTextTab) { progressBarInnerTab.style.width = "100%"; progressBarTextTab.textContent = `Progreso: 100% (${placesArr.length}/${placesArr.length})`; } const outputTab = document.getElementById("wme-normalization-tab-output"); if (outputTab) { outputTab.innerHTML = `✔ Todos los nombres están normalizados. Se analizaron ${placesArr.length} lugares.`; outputTab.style.color = "green"; outputTab.style.fontWeight = "bold"; } const scanBtn = document.querySelector("button[type='button']"); if (scanBtn) { scanBtn.textContent = "Start Scan..."; scanBtn.disabled = false; scanBtn.style.opacity = "1"; scanBtn.style.cursor = "pointer"; const iconCheck = document.createElement("span"); iconCheck.textContent = " ✔"; iconCheck.style.marginLeft = "8px"; iconCheck.style.color = "green"; scanBtn.appendChild(iconCheck); } return; // Salir de la función si no hay inconsistencias para renderizar tabla } // Asegurarse de que el outputDiv tenga estilos para manejar el sticky header // Este bloque se ejecuta SIEMPRE que se va a renderizar la tabla (es decir, inconsistents.length > 0) if (output) { // Asegurarse de que 'output' existe output.style.display = 'flex'; // output.style.flexDirection = 'column'; // output.style.position = 'relative'; // Necesario para que sticky funcione bien output.appendChild(fixedHeaderContainer); // Añadir el fixedHeaderContainer antes de la tabla } //Permite renderizar la tabla de resultados const table = document.createElement("table"); // Declaración única de table table.style.width = "100%"; table.style.borderCollapse = "collapse"; table.style.fontSize = "12px"; // Añadir clase para estilo de tabla (No es necesaria si no tienes CSS externo para esa clase) const thead = document.createElement("thead"); // Declaración única de thead // Añadir cabecera de la tabla const headerRow = document.createElement("tr"); // Declaración única de headerRow [ "N°", "Perma", "Tipo/Ciudad", "LL", "Editor", "Nombre Actual", "⚠️", // ("Alerta", "Advertencia") "Nombre Sugerido", "Sugerencias<br>de reemplazo", "Categoría", "Categoría<br>Recomendada", "Acción" ].forEach(header => { const th = document.createElement("th"); th.innerHTML = header; th.style.borderBottom = "1px solid #ccc"; th.style.padding = "4px"; th.style.textAlign = "center"; th.style.fontSize = "14px"; if (header === "N°") { th.style.width = "30px"; } else if (header === "LL") { th.title = "Nivel de Bloqueo (Lock Level)"; th.style.width = "40px"; } else if (header === "Perma" || header === "Tipo/Ciudad") { th.style.width = "65px"; } else if (header === "⚠️") { th.title = "Alertas y advertencias"; th.style.width = "30px"; // Un ancho pequeño } else if (header === "Categoría") { th.style.width = "130px"; } else if (header === "Categoría<br>Recomendada" || header === "Sugerencias<br>de reemplazo") { th.style.width = "180px"; } else if (header === "Editor") { // <-- Ajustar ancho si es necesario th.style.width = "100px"; // Reducido de 120px a 100px } else if (header === "Acción") { // <-- Ajustar ancho si es necesario th.style.width = "100px"; // Reducido de 120px a 100px } else if (header === "Nombre Actual" || header === "Nombre Sugerido") { th.style.width = "270px"; } headerRow.appendChild(th); }); thead.appendChild(headerRow); table.appendChild(thead); thead.style.position = "sticky"; thead.style.top = "0"; thead.style.background = "#f1f1f1"; thead.style.zIndex = "10"; // z-index de la cabecera de la tabla headerRow.style.backgroundColor = "#003366"; headerRow.style.color = "#ffffff"; // Declarar tbody aquí, ANTES de llenarlo con el forEach const tbody = document.createElement("tbody"); // Declaración ÚNICA de tbody // En el render de cada fila: inconsistents.forEach(({ lockRankEmoji, id, original, normalized, editor, cityIcon, cityTitle, hasCity, currentCategoryName, currentCategoryIcon, currentCategoryTitle, currentCategoryKey, dynamicCategorySuggestions, venueSDKForRender, isDuplicate = false, duplicatePartners = [], typeInfo, areaMeters }, index) => { //const typeInfo = venueSDKForRender?.typeInfo || {}; // Añadir un console.log para depurar el estado de isDuplicate y duplicatePartners //console.log([WME_PLN][DEBUG] Procesando lugar ID: ${id}, isDuplicate: ${isDuplicate}, duplicatePartners:`, duplicatePartners); // Actualizar barra de progreso visual EN EL TAB PRINCIPAL const progressPercent = Math.floor(((index + 1) / inconsistents.length) * 100); // Actualiza barra de progreso en el tab principal const progressBarInnerTab = document.getElementById("progressBarInnerTab"); const progressBarTextTab = document.getElementById("progressBarTextTab"); if (progressBarInnerTab && progressBarTextTab) { progressBarInnerTab.style.width = `${progressPercent}%`; progressBarTextTab.textContent = `Progreso: ${progressPercent}% (${index + 1}/${inconsistents.length})`; } const row = document.createElement("tr"); row.querySelectorAll("td").forEach(td => td.style.verticalAlign = "top"); row.dataset.placeId = id; //Añadir data-place-id a la fila para fácil referencia //Celda para el número de línea (N°) const numberCell = document.createElement("td"); numberCell.textContent = index + 1; // +1 porque el índice es base 0 numberCell.style.textAlign = "center"; numberCell.style.padding = "4px"; row.appendChild(numberCell); // Columna de enlace permanente (Perma) const permalinkCell = document.createElement("td"); const link = document.createElement("a"); link.href = "#"; link.addEventListener("click", (e) => { e.preventDefault(); const venueObj = W.model.venues.getObjectById(id); // Obtiene el objeto del lugar (modelo antiguo) const venueSDKForUse = venueSDKForRender; // Objeto del SDK que pasamos desde processNextPlace let targetLat = null; let targetLon = null; // PRIORIDAD 1: Usar coordenadas del venueSDK (más robusto y directo) if (venueSDKForUse && venueSDKForUse.geometry && Array.isArray(venueSDKForUse.geometry.coordinates) && venueSDKForUse.geometry.coordinates.length >= 2) { targetLon = venueSDKForUse.geometry.coordinates[0]; targetLat = venueSDKForUse.geometry.coordinates[1]; // Nota: Si es un polígono, las coords pueden ser [lon, lat] de su primer punto, // pero W.map.setCenter necesita el centroide. // Para polígonos, es mejor obtener el centroide de la geometría OL. } // PRIORIDAD 2: Obtener coordenadas del modelo antiguo (OLGeometry) si venueSDK no dio un punto claro if ((targetLat === null || targetLon === null) && venueObj && typeof venueObj.getOLGeometry === 'function') { try { const geometryOL = venueObj.getOLGeometry(); if (geometryOL && typeof geometryOL.getCentroid === 'function') { const centroidOL = geometryOL.getCentroid(); // Transformar de EPSG:3857 (Waze) a EPSG:4326 (Lat/Lon) if (typeof OpenLayers !== 'undefined' && OpenLayers.Projection) { const transformedPoint = new OpenLayers.Geometry.Point(centroidOL.x, centroidOL.y).transform( new OpenLayers.Projection("EPSG:3857"), new OpenLayers.Projection("EPSG:4326") ); targetLat = transformedPoint.y; targetLon = transformedPoint.x; } else { // Fallback si OpenLayers.Projection no está disponible, usar las coordenadas crudas (menos precisas) targetLat = centroidOL.y; targetLon = centroidOL.x; } } } catch (e) { console.error("[WME PLN] Error al obtener/transformar geometría OL para navegación:", e); } } // *** LÓGICA DE NAVEGACIÓN Y SELECCIÓN *** let navigated = false; /* if (venueObj && W.map && typeof W.map.setCenter === "function" && targetLat !== null && targetLon !== null) { // Centrar mapa si tenemos coordenadas válidas W.map.setCenter(new OpenLayers.LonLat(targetLon, targetLat), null, false, 0); // OpenLayers.LonLat necesita (lon, lat) navigated = true; }*/ if (venueObj && W.selectionManager && typeof W.selectionManager.select === "function") { // Seleccionar lugar si el objeto está cargado W.selectionManager.select(venueObj); navigated = true; } else if (venueObj && W.selectionManager && typeof W.selectionManager.setSelectedModels === "function") { W.selectionManager.setSelectedModels([venueObj]); navigated = true; } // Fallback: Abrir en nueva pestaña si no se pudo navegar/seleccionar if (!navigated) { const confirmOpen = confirm(`El lugar "${original}" (ID: ${id}) no se pudo seleccionar o centrar directamente. ¿Deseas abrirlo en una nueva pestaña del editor?`); if (confirmOpen) { const wmeUrl = `https://www.waze.com/editor?env=row&venueId=${id}`; window.open(wmeUrl, '_blank'); } else { showTemporaryMessage("El lugar podría estar fuera de vista o no cargado.", 4000, 'warning'); } } else { showTemporaryMessage("Presentando detalles del lugar...", 2000, 'info'); } }); link.title = "Seleccionar lugar en el mapa"; // Título más descriptivo link.textContent = "🔗"; permalinkCell.appendChild(link); permalinkCell.style.padding = "4px"; permalinkCell.style.fontSize = "18px"; // Tamaño del ícono permalinkCell.style.textAlign = "center"; // Centrar el ícono permalinkCell.style.width = "65px"; row.appendChild(permalinkCell); // Combinada: Tipo / Ciudad const typeCityCell = document.createElement("td"); typeCityCell.style.padding = "4px"; typeCityCell.style.width = "65px"; // Ancho de la columna typeCityCell.style.verticalAlign = "middle"; // Centrado vertical // Contenedor principal para alinear el tipo/área a la izquierda y la ciudad a la derecha const cellContentWrapper = document.createElement("div"); cellContentWrapper.style.display = "flex"; cellContentWrapper.style.justifyContent = "space-between"; // Espacio entre elementos cellContentWrapper.style.alignItems = "center"; // Centrado verticalmente // --- Contenedor del Icono de Tipo y Área (lado izquierdo) --- const typeAreaWrapper = document.createElement("div"); typeAreaWrapper.style.display = "flex"; typeAreaWrapper.style.flexDirection = "column"; // Contenido apilado verticalmente typeAreaWrapper.style.alignItems = "center"; // Centrados horizontalmente // Ya no necesitamos 'position: relative' en este wrapper si el areaSpan no es absoluto aquí. // Icono de tipo de lugar (Polígono o Punto) const typeIconSpan = document.createElement("span"); typeIconSpan.textContent = typeInfo.icon; typeIconSpan.style.fontSize = "20px"; // Tamaño del icono typeIconSpan.title = `Tipo: ${typeInfo.title}`; typeAreaWrapper.appendChild(typeIconSpan); // Añadir el icono base (ARRIBA) // Mostrar área solo si es un polígono y se calculó el área if (typeInfo.isArea && areaMeters !== null) { const areaSpan = document.createElement("span"); const formattedArea = areaMeters.toLocaleString(getWazeLanguage(), { maximumFractionDigits: 0 }); areaSpan.innerHTML = `${formattedArea}m<sup>2</sup>`; // Formato: 329m² (con superíndice) areaSpan.style.fontSize = "9px"; // Números pequeños areaSpan.style.fontWeight = "bold"; // areaSpan.style.position = "absolute"; // YA NO ES ABSOLUTO // areaSpan.style.top = "-10px"; // YA NO ES ABSOLUTO // areaSpan.style.left = "50%"; // YA NO ES ABSOLUTO // areaSpan.style.transform = "translateX(-50%)"; // YA NO ES ABSOLUTO // areaSpan.style.zIndex = "1"; // YA NO ES ABSOLUTO areaSpan.style.whiteSpace = "nowrap"; areaSpan.style.backgroundColor = "rgba(255,255,255,0.8)"; areaSpan.style.padding = "0 3px"; areaSpan.style.borderRadius = "3px"; areaSpan.style.marginTop = "-2px"; // <-- AJUSTE CLAVE: Empujar ligeramente hacia arriba (menos espacio) areaSpan.style.marginBottom = "2px"; // <-- AJUSTE CLAVE: Añadir un poco de margen inferior // Color rojo si es menor de 400m² if (areaMeters < 400) { areaSpan.style.color = "red"; areaSpan.title = `Área: ${formattedArea} m²\n(Menor a 400m² para ser visible en la app)`; } else { areaSpan.style.color = "blue"; areaSpan.title = `Área: ${formattedArea} m²`; } typeAreaWrapper.appendChild(areaSpan); // Añadir el área al wrapper de tipo (ABAJO) } cellContentWrapper.appendChild(typeAreaWrapper); // Añadir el wrapper de tipo/área a la celda // --- Contenedor del Icono de Ciudad (lado derecho) --- if (!hasCity) { // Si NO tiene ciudad, muestra el icono de ciudad en rojo const cityIconSpan = document.createElement("span"); cityIconSpan.innerHTML = cityIcon; cityIconSpan.style.color = "red"; cityIconSpan.style.fontSize = "18px"; cityIconSpan.title = cityTitle; cellContentWrapper.appendChild(cityIconSpan); } typeCityCell.appendChild(cellContentWrapper); typeCityCell.style.textAlign = "center"; typeCityCell.style.fontSize = "20px"; row.appendChild(typeCityCell); //Columna Bloqueo (LL) const lockCell = document.createElement("td"); lockCell.textContent = lockRankEmoji; // Usa el emoji obtenido lockCell.style.textAlign = "center"; // lockCell.style.padding = "4px"; // lockCell.style.width = "40px"; // Mismo ancho que en el thead lockCell.style.fontSize = "18px"; row.appendChild(lockCell); // // Columna Editor (username) const editorCell = document.createElement("td"); editorCell.textContent = editor || "Desconocido"; // Use the stored editor name editorCell.title = "Último editor"; editorCell.style.padding = "4px"; editorCell.style.width = "140px"; editorCell.style.textAlign = "center"; row.appendChild(editorCell); const originalCell = document.createElement("td"); const inputOriginal = document.createElement("input"); inputOriginal.type = "text"; // Añadir logs para depurar el problema del nombre vacío // console.log(`[WME_PLN][DEBUG] Procesando fila para ID: ${id}`); // console.log(`[WME_PLN][DEBUG] Nombre 'original' del inconsistents (passed in): "${original}"`); // Este es el que debería ir const venueLive = W.model.venues.getObjectById(id); // Añadir logs para ver el objeto venueLive y su nombre // console.log(`[WME_PLN][DEBUG] Objeto venueLive para ID ${id}:`, venueLive); // console.log(`[WME_PLN][DEBUG] venueLive?.attributes?.name:`, venueLive?.attributes?.name); const currentLiveName = venueLive?.attributes?.name?.value || venueLive?.attributes?.name || ""; // console.log(`[WME_PLN][DEBUG] Nombre actual del W.model.venues (para inputOriginal): "${currentLiveName}"`); // Usar 'original' (del objeto inconsistents) como fallback si currentLiveName está vacío. inputOriginal.value = currentLiveName || original; // // Si el nombre actual es distinto del sugerido, resalta en rojo. if (currentLiveName.trim().toLowerCase() !== normalized.trim().toLowerCase()) { inputOriginal.style.border = "1px solid red"; inputOriginal.title = "Este nombre es distinto del original mostrado en el panel"; } inputOriginal.disabled = true; inputOriginal.style.width = "270px"; // Asegura el ancho del input inputOriginal.style.backgroundColor = "#eee"; // convierte la celda en flex y centra verticalmente originalCell.style.padding = "4px"; originalCell.style.width = "270px"; // Asegura el ancho de la celda originalCell.style.display = "flex"; originalCell.style.alignItems = "flex-start"; originalCell.style.verticalAlign = "middle"; // haces que el input llene el alto inputOriginal.style.flex = "1"; inputOriginal.style.height = "100%"; inputOriginal.style.boxSizing = "border-box"; originalCell.appendChild(inputOriginal); // input al originalCell row.appendChild(originalCell); // celda "Nombre Actual" a la fila // Alertas const alertCell = document.createElement("td"); alertCell.style.width = "30px"; // Ancho de la columna de alerta alertCell.style.textAlign = "center"; alertCell.style.verticalAlign = "middle"; // Centra el contenido verticalmente alertCell.style.padding = "4px"; if (isDuplicate) { // Si el lugar es un duplicado, añade el icono de advertencia const warningIcon = document.createElement("span"); warningIcon.textContent = " ⚠️"; // El símbolo de advertencia warningIcon.style.fontSize = "16px"; let tooltipText = `Nombre de lugar duplicado cercano.`; if (duplicatePartners && duplicatePartners.length > 0) { const partnerDetails = duplicatePartners.map(p => `Línea ${p.line}: "${p.originalName}"`).join(", "); tooltipText += ` Duplicado(s) con: ${partnerDetails}.`; } else { tooltipText += ` No se encontraron otros duplicados cercanos específicos.`; } warningIcon.title = tooltipText; alertCell.appendChild(warningIcon); // icono a la nueva celda de alerta } row.appendChild(alertCell); // nueva celda de alerta a la fila const suggestionCell = document.createElement("td"); // : Asegurar estilos flex para alineación vertical suggestionCell.style.display = "flex"; suggestionCell.style.alignItems = "flex-start"; suggestionCell.style.justifyContent = "flex-start"; suggestionCell.style.padding = "4px"; // Según la cabecera: "Nombre Sugerido" tiene width "270px". suggestionCell.style.width = "270px"; // Mantener este ancho para la celda // --- Renderizar input principal de sugerencia --- const inputReplacement = document.createElement("input"); inputReplacement.className = 'replacement-input'; // Clase para poder seleccionarlo fácilmente inputReplacement.type = "text"; inputReplacement.value = normalized; inputReplacement.style.width = "100%"; inputReplacement.style.height = "100%"; inputReplacement.style.boxSizing = "border-box"; suggestionCell.appendChild(inputReplacement); // Añadir el input a la celda //Función debounce (necesaria para el listener) function debounce(func, delay) { let timeout; return function (...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), delay); }; } // Habilitar/deshabilitar el botón Aplicar --- const checkAndUpdateApplyButton = () => { // Compara el valor actual del campo con el nombre original del lugar const nameIsDifferent = inputReplacement.value.trim() !== original.trim(); // Comprueba si la categoría ha sido cambiada const categoryWasChanged = row.dataset.categoryChanged === 'true'; if (nameIsDifferent || categoryWasChanged) { // Si el nombre es diferente O la categoría cambió -> Habilitar botón applyButton.disabled = false; applyButton.style.opacity = "1"; const successIcon = applyButtonWrapper.querySelector('span'); if (successIcon) successIcon.remove(); } else { // Si no hay cambios -> Deshabilitar botón applyButton.disabled = true; applyButton.style.opacity = "0.5"; } }; // 2. LISTENER ÚNICO: Se añade el listener para cuando el usuario escribe manualmente. inputReplacement.addEventListener('input', debounce(checkAndUpdateApplyButton, 300)); let autoApplied = false; if (Object.values(allSuggestions).flat().some(s => s.fuente === 'excluded' && s.similarity === 1)) { autoApplied = true; } if (autoApplied) { inputReplacement.style.backgroundColor = "#c8e6c9"; // verde claro inputReplacement.title = "Reemplazo automático aplicado (palabra especial con 100% similitud)"; } else if (Object.values(allSuggestions).flat().some(s => s.fuente === 'excluded')) { inputReplacement.style.backgroundColor = "#fff3cd"; // amarillo claro inputReplacement.title = "Contiene palabra especial reemplazada"; } // --- Función debounce function debounce(func, delay) { let timeout; return function(...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), delay); }; } // --- Activar/desactivar el botón Aplicar inputReplacement.addEventListener('input', debounce(() => { if (inputReplacement.value.trim() !== original) { applyButton.disabled = false; applyButton.style.color = ""; } else { applyButton.disabled = true; applyButton.style.color = "#bbb"; } }, 300)); // --- Listener para inputOriginal inputOriginal.addEventListener('input', debounce(() => { // Opcional: alguna lógica si se desea manejar cambios en inputOriginal }, 300)); // --- Lógica Unificada Para Renderizar Todas Las Sugerencias --- const suggestionListCell = document.createElement("td"); suggestionListCell.style.padding = "4px"; suggestionListCell.style.width = "180px"; const suggestionContainer = document.createElement('div'); const palabrasYaProcesadas = new Set(); // Asegurarse de que allSuggestions[id] existe const currentPlaceSuggestions = allSuggestions[id]; // Asegurarse de que currentPlaceSuggestions es un objeto if (currentPlaceSuggestions) { // Aquí usamos `suggestionsArray` para evitar el conflicto con `suggestions` que podría venir de un nombre de variable anterior Object.entries(currentPlaceSuggestions).forEach(([originalWordForThisPlace, suggestionsArray]) => { // Verificar si 'suggestionsArray' es realmente un array antes de intentar 'forEach'. if (Array.isArray(suggestionsArray)) { suggestionsArray.forEach(s => { // Aquí ya NO deberías tener error de "not defined" let icono = ''; let textoSugerencia = ''; let colorFondo = '#f9f9f9'; let esSugerenciaValida = false; let palabraAReemplazar = originalWordForThisPlace; let palabraAInsertar = s.word; switch (s.fuente) { case 'original_preserved': esSugerenciaValida = true; icono = '⚙️'; textoSugerencia = `¿"${originalWordForThisPlace}" x "${s.word}"?`; colorFondo = '#f0f0f0'; palabraAReemplazar = originalWordForThisPlace; palabraAInsertar = s.word; break; case 'excluded': if (s.similarity < 1 || (s.similarity === 1 && originalWordForThisPlace.toLowerCase() !== s.word.toLowerCase())) { esSugerenciaValida = true; icono = '🏷️'; textoSugerencia = `¿"${originalWordForThisPlace}" x "${s.word}"? (sim. ${(s.similarity * 100).toFixed(0)}%)`; colorFondo = '#f3f9ff'; palabraAReemplazar = originalWordForThisPlace; palabraAInsertar = s.word; palabrasYaProcesadas.add(originalWordForThisPlace.toLowerCase()); } break; case 'dictionary': // ESTE ES EL CASE ORIGINAL PARA DICCIONARIO esSugerenciaValida = true; // icono = '📘'; // colorFondo = '#e6ffe6'; // Color de fondo para sugerencias del diccionario // 1. Normalizamos la palabra sugerida para que tenga la capitalización correcta. // Por ejemplo, convierte "clínica" (del diccionario) en "Clínica". // Usamos normalizeWordInternal que es más robusta para esto. const normalizedSuggestedWordForDisplay = normalizeWordInternal(s.word, true, false); // // 2. Usamos esa palabra normalizada para mostrarla en el texto de la sugerencia. textoSugerencia = `¿"${originalWordForThisPlace}" x "${normalizedSuggestedWordForDisplay}"? (sim. ${(s.similarity * 100).toFixed(0)}%)`; // // 3. Asignamos las palabras correctas para la acción de reemplazo. palabraAReemplazar = originalWordForThisPlace; // // Usamos la versión normalizada para que se inserte con la capitalización correcta. palabraAInsertar = normalizedSuggestedWordForDisplay; // break; // // ************************************************************ // NUEVO CASO PARA SUGERENCIAS DE TILDES ESPECÍFICAS case 'dictionary_tilde': // esSugerenciaValida = true; // icono = '✍️'; // Un ícono que sugiera "escritura" o "corrección" colorFondo = '#ffe6e6'; // Un color rojizo claro o rosado para resaltar corrección de tilde // El s.word ya viene con la capitalización deseada desde la lógica anterior textoSugerencia = `¿"${originalWordForThisPlace}" x "${s.word}"? (Corregir Tilde)`; // palabraAReemplazar = originalWordForThisPlace; // palabraAInsertar = s.word; // break; // } if (esSugerenciaValida) { const suggestionDiv = document.createElement("div"); suggestionDiv.innerHTML = `${icono} ${textoSugerencia}`; suggestionDiv.style.cursor = "pointer"; suggestionDiv.style.padding = "2px 4px"; suggestionDiv.style.margin = "2px 0"; suggestionDiv.style.border = "1px solid #ddd"; suggestionDiv.style.borderRadius = "3px"; suggestionDiv.style.backgroundColor = colorFondo; suggestionDiv.addEventListener("click", () => { const currentSuggestedValue = inputReplacement.value; const searchRegex = new RegExp("\\b" + escapeRegExp(palabraAReemplazar) + "\\b", "gi"); const newSuggestedValue = currentSuggestedValue.replace(searchRegex, palabraAInsertar); // Actualizar el inputReplacement con el nuevo valor sugerido if (inputReplacement.value !== newSuggestedValue) { inputReplacement.value = newSuggestedValue; } checkAndUpdateApplyButton(); }); suggestionContainer.appendChild(suggestionDiv); } }); } else { console.warn(`[WME_PLN][DEBUG] suggestionsArray para "${originalWordForThisPlace}" no es un array o es undefined:`, suggestionsArray); } }); } suggestionListCell.appendChild(suggestionContainer); // Se añaden las celdas a la fila row.appendChild(suggestionCell); row.appendChild(suggestionListCell); // Columna Categoría (nombre y luego ícono abajo) const categoryCell = document.createElement("td"); categoryCell.style.padding = "4px"; categoryCell.style.width = "130px"; categoryCell.style.textAlign = "center"; // Centra el contenido en la celda // Columna Categoría (nombre y luego ícono abajo) const currentCategoryDiv = document.createElement("div"); // Contenedor para el nombre y el ícono currentCategoryDiv.style.display = "flex"; currentCategoryDiv.style.flexDirection = "column"; // Elementos apilados verticalmente currentCategoryDiv.style.alignItems = "center"; // Centrar horizontalmente currentCategoryDiv.style.gap = "2px"; // Pequeño espacio entre el nombre y el ícono // Crear el texto y el ícono de la categoría actual const currentCategoryText = document.createElement("span"); currentCategoryText.textContent = currentCategoryTitle; currentCategoryText.title = `Categoría Actual: ${currentCategoryTitle}`; // Tooltip para la categoría actual currentCategoryDiv.appendChild(currentCategoryText); // Crear el ícono de la categoría actual const currentCategoryIconDisplay = document.createElement("span"); // Contenedor para el ícono de la categoría actual currentCategoryIconDisplay.textContent = currentCategoryIcon; // Usar el ícono de la categoría actual currentCategoryIconDisplay.style.fontSize = "20px"; // Tamaño del ícono currentCategoryDiv.appendChild(currentCategoryIconDisplay);// Añadir el ícono al contenedor // Añadir el contenedor de categoría al cell categoryCell.appendChild(currentCategoryDiv); row.appendChild(categoryCell); // Columna Categoría Recomendada (Ahora con un dropdown de búsqueda) const recommendedCategoryCell = document.createElement("td"); // Línea existente recommendedCategoryCell.style.padding = "4px"; recommendedCategoryCell.style.width = "180px"; recommendedCategoryCell.style.textAlign = "left"; // Alinear a la izquierda para el dropdown // Crear y adjuntar el nuevo dropdown de categoría con búsqueda const categoryDropdown = createRecommendedCategoryDropdown( id, // ID del lugar para actualizar la categoría currentCategoryKey, // La categoría actual del lugar dynamicCategorySuggestions // Las sugerencias dinámicas ); recommendedCategoryCell.appendChild(categoryDropdown); row.appendChild(recommendedCategoryCell); // --- Columna Acción --- const actionCell = document.createElement("td"); actionCell.style.padding = "4px"; actionCell.style.width = "120px"; // Crear botones de acción const buttonGroup = document.createElement("div"); // Contenedor principal de los botones de acción buttonGroup.style.display = "flex"; buttonGroup.style.flexDirection = "column"; // VERTICAL: Apilar los elementos (wrappers de botones) buttonGroup.style.gap = "4px"; // Espacio entre los grupos de botones buttonGroup.style.alignItems = "flex-start"; // Alinear los grupos de botones a la izquierda // Estilos Comunes Para Todos Los Botones De Acción Para Homogeneidad const commonButtonStyle = { width: "40px", height: "30px", minWidth: "40px", minHeight: "30px", padding: "4px", border: "1px solid #ccc", borderRadius: "4px", backgroundColor: "#f0f0f0", color: "#555", cursor: "pointer", fontSize: "18px", display: "flex", justifyContent: "center", alignItems: "center", boxSizing: "border-box" }; // 1. Botón de aplicar sugerencia (EL BOTÓN GRIS CON EL CHULITO) const applyButton = document.createElement("button"); Object.assign(applyButton.style, commonButtonStyle); applyButton.textContent = "✔"; // Texto o icono para el botón de aplicar applyButton.title = "Aplicar sugerencia"; applyButton.disabled = true;// Deshabilitado inicialmente applyButton.style.opacity = "0.5"; // Botón deshabilitado inicialmente // Contenedor para el botón Aplicar y el chulito VERDE de confirmación const applyButtonWrapper = document.createElement("div"); applyButtonWrapper.style.display = "flex"; // Horizontal: Botón y chulito uno al lado del otro applyButtonWrapper.style.alignItems = "center"; applyButtonWrapper.style.gap = "5px"; applyButtonWrapper.appendChild(applyButton); buttonGroup.appendChild(applyButtonWrapper); // Añadir el wrapper al grupo principal de botones // 2. Botón de eliminar lugar (EL BOTÓN GRIS CON EL BOTE DE BASURA) let deleteButton = document.createElement("button"); Object.assign(deleteButton.style, commonButtonStyle); deleteButton.textContent = "🗑️"; deleteButton.title = "Eliminar lugar"; // Contenedor para el botón Eliminar y el icono de bote de basura de confirmación const deleteButtonWrapper = document.createElement("div"); Object.assign(deleteButtonWrapper.style, { // Asegurar estilos para el wrapper del deleteButton también display: "flex", alignItems: "center", gap: "5px" }); deleteButtonWrapper.appendChild(deleteButton); buttonGroup.appendChild(deleteButtonWrapper); // Añadir el wrapper al grupo principal de botones // 3. Botón para añadir a la lista de exclusión (EL BOTÓN GRIS CON LA ETIQUETA) const addToExclusionBtn = document.createElement("button"); Object.assign(addToExclusionBtn.style, commonButtonStyle); // Aplicar estilos comunes addToExclusionBtn.textContent = "🏷️"; addToExclusionBtn.title = "Marcar palabra como especial (no se modifica)"; buttonGroup.appendChild(addToExclusionBtn); // Este botón se añade directamente al buttonGroup (no necesita un wrapper flex si siempre va solo) actionCell.appendChild(buttonGroup); // Añadir el grupo de botones a la celda de acción row.appendChild(actionCell); // 4. Botón para añadir lugar completo a la lista de excluidos const excludePlaceBtn = document.createElement("button"); Object.assign(excludePlaceBtn.style, commonButtonStyle); excludePlaceBtn.textContent = "📵"; // Ícono de "más" excludePlaceBtn.title = "Excluir este lugar (no aparecerá en futuras búsquedas)"; buttonGroup.appendChild(excludePlaceBtn); actionCell.appendChild(buttonGroup); row.appendChild(actionCell); // --- LISTENERS --- // Listener para el botón "APLICAR" (Versión Mejorada) applyButton.addEventListener("click", async () => { const venueObj = W.model.venues.getObjectById(id); if (!venueObj) { console.error("[WME_PLN] Error: El lugar no está disponible o ya fue eliminado."); return; } const newName = inputReplacement.value.trim(); const currentLiveNameInWaze = venueObj?.attributes?.name?.value || venueObj?.attributes?.name || ""; // Obtenemos la fila y revisamos si la categoría fue cambiada const row = applyButton.closest('tr'); const nameWasChanged = (newName !== currentLiveNameInWaze); const categoryWasChanged = row.dataset.categoryChanged === 'true'; try { if (nameWasChanged) { // CASO 1: El nombre ha cambiado (con o sin cambio de categoría) const UpdateObject = require("Waze/Action/UpdateObject"); const action = new UpdateObject(venueObj, { name: newName }); W.model.actionManager.add(action); // Actualizar el nombre en el venue showTemporaryMessage("Lugar normalizado. Presione 'Guardar' para finalizar.", 4000, 'success'); recordNormalizationEvent(); // Registrar el evento de normalización // Feedback visual de éxito applyButton.disabled = true; applyButton.style.opacity = "0.5"; const successIcon = document.createElement("span"); successIcon.textContent = " ✅"; successIcon.style.fontSize = "20px"; applyButtonWrapper.appendChild(successIcon); row.dataset.categoryChanged = 'false'; // Reseteamos la bandera } else if (categoryWasChanged) { // CASO 2: El nombre NO ha cambiado, PERO la categoría SÍ showTemporaryMessage("Cambios de categoría aplicados correctamente.", 3000, 'success'); recordNormalizationEvent();// Registrar el evento de normalización // Feedback visual de éxito applyButton.disabled = true; applyButton.style.opacity = "0.5"; const successIcon = document.createElement("span"); successIcon.textContent = " ✅"; successIcon.style.fontSize = "20px"; applyButtonWrapper.appendChild(successIcon); row.dataset.categoryChanged = 'false'; // Reseteamos la bandera } else { // CASO 3: No ha cambiado ni el nombre ni la categoría showTemporaryMessage("No hay cambios para aplicar.", 3000, 'warning'); } if (nameWasChanged || categoryWasChanged) { markRowAsProcessed(row, 'applied'); // Marcar la fila como aplicada // Aquí necesitas actualizar el contador de inconsistencias en la cabecera updateInconsistenciesCount(-1); // Función auxiliar que crearemos } } catch (e) { alert("Error al actualizar: " + e.message); console.error("[WME_PLN] Error al actualizar lugar:", e); } }); // Listener para el botón de "ELIMINAR" deleteButton.addEventListener("click", () => { // Modal bonito de confirmación const confirmModal = document.createElement("div"); confirmModal.style.position = "fixed"; confirmModal.style.top = "50%"; confirmModal.style.left = "50%"; confirmModal.style.transform = "translate(-50%, -50%)"; confirmModal.style.background = "#fff"; confirmModal.style.border = "1px solid #aad"; confirmModal.style.padding = "28px 32px 20px 32px"; confirmModal.style.zIndex = "20000"; // Z-INDEX AUMENTADO confirmModal.style.boxShadow = "0 4px 24px rgba(0,0,0,0.18)"; confirmModal.style.fontFamily = "sans-serif"; confirmModal.style.borderRadius = "10px"; confirmModal.style.textAlign = "center"; confirmModal.style.minWidth = "340px"; // Ícono visual const iconElement = document.createElement("div"); iconElement.innerHTML = "⚠️"; iconElement.style.fontSize = "38px"; iconElement.style.marginBottom = "10px"; confirmModal.appendChild(iconElement); // Mensaje principal const message = document.createElement("div"); const venue = W.model.venues.getObjectById(id); // Asegurarse de que placeName siempre tenga un valor para mostrar en el modal const placeName = venue?.attributes?.name?.value || venue?.attributes?.name || "este lugar"; message.innerHTML = `<b>¿Eliminar "${placeName}"?</b>`; message.style.fontSize = "20px"; message.style.marginBottom = "8px"; confirmModal.appendChild(message); // Nombre del lugar const nameDiv = document.createElement("div"); nameDiv.textContent = `"${placeName}"`; nameDiv.style.fontSize = "15px"; nameDiv.style.color = "#007bff"; nameDiv.style.marginBottom = "18px"; confirmModal.appendChild(nameDiv); // Botones de confirmación const buttonWrapper = document.createElement("div"); buttonWrapper.style.display = "flex"; buttonWrapper.style.justifyContent = "center"; buttonWrapper.style.gap = "18px"; // Botones de confirmación const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancelar"; cancelBtn.style.padding = "7px 18px"; cancelBtn.style.background = "#eee"; cancelBtn.style.border = "none"; cancelBtn.style.borderRadius = "4px"; cancelBtn.style.cursor = "pointer"; cancelBtn.addEventListener("click", () => confirmModal.remove()); // Botón de confirmación const confirmBtn = document.createElement("button"); confirmBtn.textContent = "Eliminar"; confirmBtn.style.padding = "7px 18px"; confirmBtn.style.background = "#d9534f"; confirmBtn.style.color = "#fff"; confirmBtn.style.border = "none"; confirmBtn.style.borderRadius = "4px"; confirmBtn.style.cursor = "pointer"; confirmBtn.style.fontWeight = "bold"; // Listener para el botón de confirmación confirmBtn.addEventListener("click", () => { const venue = W.model.venues.getObjectById(id); if (!venue) { console.error("[WME_PLN]El lugar no está disponible o ya fue eliminado."); confirmModal.remove(); // Asegurarse de cerrar el modal return; } try { const DeleteObject = require("Waze/Action/DeleteObject"); const action = new DeleteObject(venue); W.model.actionManager.add(action); // Ejecutar la acción de eliminación en Waze recordNormalizationEvent(); // Registrar el evento de normalización const row = deleteButton.closest('tr'); markRowAsProcessed(row, 'deleted'); // Marcar la fila como eliminada updateInconsistenciesCount(-1); // Función auxiliar // Deshabilitar el botón de eliminar actual deleteButton.disabled = true; deleteButton.style.color = "#bbb"; deleteButton.style.opacity = "0.5"; // Deshabilitar el botón de aplicar de esta fila applyButton.disabled = true; applyButton.style.color = "#bbb"; applyButton.style.opacity = "0.5"; // Añadir el icono de éxito visual al lado del botón de eliminar const successIcon = document.createElement("span"); successIcon.textContent = " 🗑️"; successIcon.style.marginLeft = "0"; successIcon.style.fontSize = "20px"; deleteButtonWrapper.appendChild(successIcon); } catch (e) { console.error("[WME_PLN] Error al eliminar lugar: " + e.message, e); } confirmModal.remove(); // Cerrar el modal después de la acción (éxito o fallo) }); buttonWrapper.appendChild(cancelBtn); buttonWrapper.appendChild(confirmBtn); confirmModal.appendChild(buttonWrapper); document.body.appendChild(confirmModal); // Añadir el modal al body para que sea visible }); // Listener para el botón de añadir a exclusión addToExclusionBtn.addEventListener("click", () => { const words = original.split(/\s+/); const modal = document.createElement("div"); modal.style.position = "fixed"; modal.style.top = "50%"; modal.style.left = "50%"; modal.style.transform = "translate(-50%, -50%)"; modal.style.background = "#fff"; modal.style.border = "1px solid #ccc"; modal.style.padding = "10px"; modal.style.zIndex = "20000"; modal.style.maxWidth = "300px"; // Añadir un borde redondeado const title = document.createElement("h4"); title.textContent = "Agregar palabra a especiales"; modal.appendChild(title); // Añadir un mensaje de instrucciones const instructions = document.createElement("p"); const list = document.createElement("ul"); list.style.listStyle = "none"; list.style.padding = "0"; words.forEach(w => { if (w.trim() === '') return; const lowerW = w.trim().toLowerCase(); if (!/[a-zA-ZáéíóúÁÉÍÓÚñÑüÜ0-9]/.test(lowerW) || /^[^a-zA-Z0-9]+$/.test(lowerW)) return; const alreadyExists = Array.from(excludedWords).some(existing => existing.toLowerCase() === lowerW); if (commonWords.includes(lowerW) || alreadyExists) return; // Crear un checkbox para cada palabra const li = document.createElement("li"); const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.value = w; checkbox.id = `cb-exc-${w.replace(/[^a-zA-Z0-9]/g, "")}`; li.appendChild(checkbox); const label = document.createElement("label"); label.htmlFor = checkbox.id; label.appendChild(document.createTextNode(" " + w)); li.appendChild(label); list.appendChild(li); }); modal.appendChild(list); // Botones de confirmación const confirmBtn = document.createElement("button"); confirmBtn.textContent = "Añadir Seleccionadas"; confirmBtn.addEventListener("click", () => { const checked = modal.querySelectorAll("input[type=checkbox]:checked"); let wordsActuallyAdded = false; // Añadir las palabras seleccionadas al Set de palabras excluidas checked.forEach(c => { if (!excludedWords.has(c.value)) { excludedWords.add(c.value); wordsActuallyAdded = true; } }); // Actualizar el mapa de palabras excluidas if (wordsActuallyAdded) { if (typeof renderExcludedWordsList === 'function') { const excludedListElement = document.getElementById("excludedWordsList"); if (excludedListElement) { renderExcludedWordsList(excludedListElement); } else { renderExcludedWordsList(); } } } modal.remove(); if (wordsActuallyAdded) { // Solo guardar si realmente se añadió algo saveExcludedWordsToLocalStorage(); showTemporaryMessage("Palabra(s) añadida(s) a especiales y guardada(s).", 3000, 'success'); } else { showTemporaryMessage("No se seleccionaron palabras o ya estaban en la lista.", 3000, 'info'); } }); modal.appendChild(confirmBtn); // Botón de cancelar const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancelar"; cancelBtn.style.marginLeft = "8px"; cancelBtn.addEventListener("click", () => modal.remove()); modal.appendChild(cancelBtn); document.body.appendChild(modal); }); buttonGroup.appendChild(addToExclusionBtn); // Listener para el botón "Excluir Lugar" (el botón con el ícono de prohibido 📵) excludePlaceBtn.addEventListener("click", () => { const placeName = original || `ID: ${id}`; // ************************************************************ // INICIO DE LA MODIFICACIÓN: Modal de confirmación "bonito" // ************************************************************ const confirmModal = document.createElement("div"); confirmModal.style.position = "fixed"; confirmModal.style.top = "50%"; confirmModal.style.left = "50%"; confirmModal.style.transform = "translate(-50%, -50%)"; confirmModal.style.background = "#fff"; confirmModal.style.border = "1px solid #aad"; confirmModal.style.padding = "28px 32px 20px 32px"; confirmModal.style.zIndex = "20000"; // Z-INDEX ALTO confirmModal.style.boxShadow = "0 4px 24px rgba(0,0,0,0.18)"; confirmModal.style.fontFamily = "sans-serif"; confirmModal.style.borderRadius = "10px"; confirmModal.style.textAlign = "center"; confirmModal.style.minWidth = "340px"; // Ícono visual const iconElement = document.createElement("div"); iconElement.innerHTML = "🚫"; // Ícono de "prohibido" o "no permitido" iconElement.style.fontSize = "38px"; iconElement.style.marginBottom = "10px"; confirmModal.appendChild(iconElement); // Mensaje principal const messageTitle = document.createElement("div"); messageTitle.innerHTML = `<b>¿Excluir "${placeName}"?</b>`; messageTitle.style.fontSize = "20px"; messageTitle.style.marginBottom = "8px"; confirmModal.appendChild(messageTitle); // Mensaje explicativo const explanationDiv = document.createElement("div"); explanationDiv.textContent = `Este lugar no aparecerá en futuras búsquedas del normalizador.`; explanationDiv.style.fontSize = "15px"; explanationDiv.style.color = "#555"; explanationDiv.style.marginBottom = "18px"; confirmModal.appendChild(explanationDiv); // Botones de confirmación const buttonWrapper = document.createElement("div"); buttonWrapper.style.display = "flex"; buttonWrapper.style.justifyContent = "center"; buttonWrapper.style.gap = "18px"; // Botón Cancelar const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancelar"; cancelBtn.style.padding = "7px 18px"; cancelBtn.style.background = "#eee"; cancelBtn.style.border = "none"; cancelBtn.style.borderRadius = "4px"; cancelBtn.style.cursor = "pointer"; cancelBtn.addEventListener("click", () => confirmModal.remove()); // Botón Confirmar Exclusión const confirmExcludeBtn = document.createElement("button"); confirmExcludeBtn.textContent = "Excluir"; confirmExcludeBtn.style.padding = "7px 18px"; confirmExcludeBtn.style.background = "#d9534f"; // Rojo confirmExcludeBtn.style.color = "#fff"; confirmExcludeBtn.style.border = "none"; confirmExcludeBtn.style.borderRadius = "4px"; confirmExcludeBtn.style.cursor = "pointer"; confirmExcludeBtn.style.fontWeight = "bold"; confirmExcludeBtn.addEventListener("click", () => { // Aquí va la lógica que antes estaba directamente en el if(confirm) excludedPlaces.set(id, placeName); // Guardar ID y Nombre saveExcludedPlacesToLocalStorage(); showTemporaryMessage("Lugar excluido de futuras búsquedas.", 3000, 'success'); const row = excludePlaceBtn.closest('tr'); if (row) { markRowAsProcessed(row, 'excluded'); // Marcar la fila como excluida updateInconsistenciesCount(-1); // Función auxiliar } confirmModal.remove(); // Cerrar el modal después de la acción }); buttonWrapper.appendChild(cancelBtn); buttonWrapper.appendChild(confirmExcludeBtn); confirmModal.appendChild(buttonWrapper); document.body.appendChild(confirmModal); // Añadir el modal al body // ************************************************************ // FIN DE LA MODIFICACIÓN // ************************************************************ }); actionCell.appendChild(buttonGroup); row.appendChild(actionCell); // Añadir borde inferior visible entre cada lugar row.style.borderBottom = "1px solid #ddd"; row.style.backgroundColor = index % 2 === 0 ? "#f9f9f9" : "#ffffff"; row.querySelectorAll("td").forEach(td => { td.style.verticalAlign = "top"; }); tbody.appendChild(row); checkAndUpdateApplyButton();// // Actualizar progreso al final del ciclo usando setTimeout para evitar bloqueo de UI setTimeout(() => { const progress = Math.floor(((index + 1) / inconsistents.length) * 100); const progressElem = document.getElementById("scanProgressText"); if (progressElem) { progressElem.textContent = `Analizando lugares: ${progress}% (${index + 1}/${inconsistents.length})`; } }, 0); });// forEach // Adjuntar tbody a la tabla (fuera del forEach) table.appendChild(tbody); // Adjuntar la tabla completa al contenedor de salida (output) output.appendChild(table); // Quitar overlay spinner justo antes de mostrar la tabla const existingOverlay = document.getElementById("scanSpinnerOverlay"); if (existingOverlay) { existingOverlay.remove(); } // Al finalizar, actualizar el texto final en el tab principal (progreso 100%) const progressBarInnerTab = document.getElementById("progressBarInnerTab"); const progressBarTextTab = document.getElementById("progressBarTextTab"); if (progressBarInnerTab && progressBarTextTab) { progressBarInnerTab.style.width = "100%"; progressBarTextTab.textContent = `Progreso: 100% (${inconsistents.length}/${placesArr.length})`; } // Función para reactivar todos los botones de acción en el panel flotante function reactivateAllActionButtons() { document.querySelectorAll("#wme-place-inspector-output button") .forEach(btn => { btn.disabled = false; btn.style.color = ""; btn.style.opacity = ""; }); }// reactivateAllActionButtons W.model.actionManager.events.register("afterundoaction", null, () => { // Verificar si el panel flotante está visible if (floatingPanelElement && floatingPanelElement.style.display !== 'none') { waitForWazeAPI(() => { const places = getVisiblePlaces(); renderPlacesInFloatingPanel(places); // Esto mostrará el panel de "procesando" y luego resultados setTimeout(reactivateAllActionButtons, 250); }); } else { console.log("[WME PLN] Undo/Redo: Panel de resultados no visible, no se re-escanea."); } }); W.model.actionManager.events.register("afterredoaction", null, () => { // Verificar si el panel flotante está visible if (floatingPanelElement && floatingPanelElement.style.display !== 'none') { waitForWazeAPI(() => { const places = getVisiblePlaces(); renderPlacesInFloatingPanel(places); // Esto mostrará el panel de "procesando" y luego resultados setTimeout(reactivateAllActionButtons, 250); }); } else { console.log("[WME PLN] Undo/Redo: Panel de resultados no visible, no se re-escanea."); } }); } }// renderPlacesInFloatingPanel // Normaliza una palabra eliminando diacríticos (tildes) y caracteres especiales function getLevenshteinDistance(a, b) { const matrix = Array.from( { length : b.length + 1 }, (_, i) => Array.from({ length : a.length + 1 },(_, j) => (i === 0 ? j : (j === 0 ? i : 0)))); for (let i = 1; i <= b.length; i++) { for (let j = 1; j <= a.length; j++) { if (b.charAt(i - 1) === a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min( matrix[i - 1][j] + 1, // deletion matrix[i][j - 1] + 1, // insertion matrix[i - 1][j - 1] + 1 // substitution ); } } } return matrix[b.length][a.length]; }// getLevenshteinDistance // Normaliza una palabra eliminando caracteres especiales y convirtiéndola a minúsculas function calculateSimilarity(word1, word2) { const w1_lower = word1.toLowerCase(); const w2_lower = word2.toLowerCase(); // Si las palabras son diferentes, pero al quitarles las tildes son idénticas, // dales una similitud muy alta (99%) para priorizarlas siempre. if (w1_lower !== w2_lower && removeDiacritics(w1_lower) === removeDiacritics(w2_lower)) { return 0.99; // Prioridad máxima para corrección de tildes } // Si no es un caso de tildes, procede con el cálculo normal de Levenshtein. const distance = getLevenshteinDistance(w1_lower, w2_lower); const maxLen = Math.max(w1_lower.length, w2_lower.length); if (maxLen === 0) return 1; return 1 - distance / maxLen; }// calculateSimilarity // Verifica si una fecha de edición está dentro del rango especificado function isDateWithinRange(editDate, filterRange) { if (!(editDate instanceof Date) || isNaN(editDate)) { console.warn("[WME PLN] Se proporcionó una fecha de edición inválida a isDateWithinRange."); return false; // No se puede comparar una fecha inválida. } const now = new Date(); let cutoffDate = new Date(); switch (filterRange) { case "all": // Si es "Elegir una opción", siempre se cumple la condición return true; case "6_months": cutoffDate.setMonth(now.getMonth() - 6); break; case "3_months": cutoffDate.setMonth(now.getMonth() - 3); break; case "1_month": cutoffDate.setMonth(now.getMonth() - 1); break; case "1_week": cutoffDate.setDate(now.getDate() - 7); break; case "1_day": cutoffDate.setDate(now.getDate() - 1); break; default: return true; // Si el filtro es desconocido, por seguridad no se filtra. } return editDate >= cutoffDate; }//isDateWithinRange // Encuentra palabras similares a una palabra dada en una lista o array indexado function findSimilarWords(word, indexedListOrArray, threshold) { const lowerWord = word.toLowerCase(); const firstChar = lowerWord.charAt(0); let candidates = []; // Si el segundo argumento es un objeto literal (como window.dictionaryIndex) if (indexedListOrArray && typeof indexedListOrArray === 'object' && !Array.isArray(indexedListOrArray) && indexedListOrArray[firstChar]) { candidates = Array.from(indexedListOrArray[firstChar] || []); // Esto es lo correcto para tu window.dictionaryIndex } // Si es un Set o Array (menos óptimo, pero fallback) else if (indexedListOrArray instanceof Set || Array.isArray(indexedListOrArray)) { candidates = Array.from(indexedListOrArray).filter(candidate => candidate.charAt(0).toLowerCase() === firstChar); } else { return []; } return candidates .map(candidate => { const similarity = calculateSimilarity(lowerWord, candidate.toLowerCase()); return { word: candidate, similarity }; }) .filter(item => item.similarity >= threshold) .sort((a, b) => b.similarity - a.similarity); }// findSimilarWords // Sugiere palabras excluidas basadas en el nombre actual y las palabras excluidas function suggestExcludedReplacements(currentName, excludedWords) { const words = currentName.split(/\s+/); const suggestions = {}; const threshold = parseFloat(document.getElementById("similarityThreshold")?.value || "85") / 100; words.forEach(word => { const similar = findSimilarWords(word, Array.from(excludedWords), threshold); if (similar.length > 0) { suggestions[word] = similar; } }); return suggestions; }// suggestExcludedReplacements // Reset del inspector: progreso y texto de tab function resetInspectorState() { const inner = document.getElementById("progressBarInnerTab"); const text = document.getElementById("progressBarTextTab"); const outputTab = document.getElementById("wme-normalization-tab-output"); if (inner) inner.style.width = "0%"; if (text) text.textContent = `Progreso: 0% (0/0)`; if (outputTab) outputTab.textContent = "Presiona 'Start Scan...' para analizar los lugares visibles."; }// resetInspectorState // Función auxiliar para marcar una fila de la tabla como procesada/eliminada function markRowAsProcessed(rowElement, actionType) { if (!rowElement) return; // Estilos para atenuar y tachar la fila rowElement.style.opacity = '0.4'; rowElement.style.textDecoration = 'line-through'; rowElement.style.transition = 'opacity 0.5s ease'; // Transición suave // Deshabilitar todos los botones de acción en esta fila const buttons = rowElement.querySelectorAll('button'); buttons.forEach(btn => { btn.disabled = true; btn.style.cursor = 'not-allowed'; btn.style.opacity = '0.3'; }); // Opcional: Mostrar un pequeño icono de confirmación en la fila const numberCell = rowElement.querySelector('td:first-child'); if (numberCell) { let icon = ''; let tooltip = ''; if (actionType === 'applied') { icon = '✅'; tooltip = 'Cambios aplicados'; } else if (actionType === 'deleted') { icon = '🗑️'; tooltip = 'Lugar eliminado de Waze'; } else if (actionType === 'excluded') { icon = '🚫'; tooltip = 'Lugar excluido de futuras búsquedas'; } if (icon) { const statusIcon = document.createElement('span'); statusIcon.textContent = icon; statusIcon.style.marginLeft = '5px'; statusIcon.style.fontSize = '1.2em'; statusIcon.title = tooltip; numberCell.appendChild(statusIcon); } } }// markRowAsProcessed // Muestra un mensaje temporal en la parte superior de la pantalla function showTemporaryMessage(message, duration = 3000, type = 'info') { // Crear el elemento del popup const popup = document.createElement('div'); popup.textContent = message; // Estilos base para el popup popup.style.position = 'fixed'; popup.style.top = '70px'; popup.style.left = '50%'; popup.style.transform = 'translateX(-50%)'; popup.style.padding = '12px 25px'; popup.style.borderRadius = '6px'; popup.style.color = 'white'; popup.style.fontWeight = 'bold'; popup.style.zIndex = '25000'; // Un z-index muy alto para que esté por encima de todo popup.style.boxShadow = '0 4px 10px rgba(0,0,0,0.15)'; popup.style.opacity = '0'; popup.style.transition = 'opacity 0.4s ease, top 0.4s ease'; // Animación suave // Estilos según el tipo de mensaje switch (type) { case 'success': popup.style.backgroundColor = '#28a745'; // Verde break; case 'warning': popup.style.backgroundColor = '#ffc107'; // Amarillo/Naranja popup.style.color = '#212529'; // Texto oscuro para mejor contraste sobre amarillo break; case 'error': popup.style.backgroundColor = '#dc3545'; // Rojo break; default: // 'info' popup.style.backgroundColor = '#17a2b8'; // Azul break; } // Añadir el popup al body y animar su entrada document.body.appendChild(popup); setTimeout(() => { popup.style.opacity = '1'; popup.style.top = '90px'; // Se desliza hacia abajo }, 50); // Configurar la animación de salida y eliminación del DOM setTimeout(() => { popup.style.opacity = '0'; popup.style.top = '70px'; // Se desliza hacia arriba // Eliminar el elemento del DOM después de que termine la transición popup.addEventListener('transitionend', () => popup.remove()); // Agregamos un fallback por si el evento transitionend no se dispara setTimeout(() => { if (popup.parentElement) { popup.remove(); } }, 500); }, duration); }// showTemporaryMessage //Permite crear un panel flotante para mostrar los resultados del escaneo function createFloatingPanel(status = "processing", numInconsistents = 0) { if (!floatingPanelElement) { floatingPanelElement = document.createElement("div"); floatingPanelElement.id = "wme-place-inspector-panel"; floatingPanelElement.style.position = "fixed"; floatingPanelElement.style.zIndex = "10005"; // Z-INDEX DEL PANEL DE RESULTADOS floatingPanelElement.style.background = "#fff"; floatingPanelElement.style.border = "1px solid #ccc"; floatingPanelElement.style.borderRadius = "8px"; floatingPanelElement.style.boxShadow = "0 5px 15px rgba(0,0,0,0.2)"; floatingPanelElement.style.padding = "10px"; floatingPanelElement.style.fontFamily = "'Helvetica Neue', Helvetica, Arial, sans-serif"; floatingPanelElement.style.display = 'none'; floatingPanelElement.style.transition = "width 0.25s, height 0.25s, left 0.25s, top 0.25s"; // Agregado left y top a la transición floatingPanelElement.style.overflow = "hidden"; // Dimensiones del panel const closeBtn = document.createElement("span"); closeBtn.textContent = "×"; closeBtn.style.position = "absolute"; closeBtn.style.top = "8px"; closeBtn.style.right = "12px"; closeBtn.style.cursor = "pointer"; closeBtn.style.fontSize = "22px"; closeBtn.style.color = "#555"; closeBtn.title = "Cerrar panel"; closeBtn.addEventListener("click", () => { if (floatingPanelElement) floatingPanelElement.style.display = 'none'; resetInspectorState(); }); floatingPanelElement.appendChild(closeBtn); // Dimensiones del panel de procesamiento const titleElement = document.createElement("h4"); titleElement.id = "wme-pln-panel-title"; titleElement.style.marginTop = "0"; titleElement.style.marginBottom = "10px"; titleElement.style.fontSize = "20px"; titleElement.style.color = "#333"; titleElement.style.textAlign = "center"; titleElement.style.fontWeight = "bold"; floatingPanelElement.appendChild(titleElement); // Dimensiones del panel de resultados const outputDivLocal = document.createElement("div"); outputDivLocal.id = "wme-place-inspector-output"; outputDivLocal.style.fontSize = "18px"; outputDivLocal.style.backgroundColor = "#fdfdfd"; outputDivLocal.style.overflowY = "auto"; floatingPanelElement.appendChild(outputDivLocal); document.body.appendChild(floatingPanelElement); } // Dimensiones del panel de procesamiento const titleElement = floatingPanelElement.querySelector("#wme-pln-panel-title"); // Dimensiones del panel de resultados const outputDiv = floatingPanelElement.querySelector("#wme-place-inspector-output"); // Dimensiones del panel de procesamiento if(outputDiv) outputDiv.innerHTML = ""; // Dimensiones del panel de procesamiento if (status === "processing") { floatingPanelElement.style.width = processingPanelDimensions.width; floatingPanelElement.style.height = processingPanelDimensions.height; if(outputDiv) outputDiv.style.height = "150px"; if(titleElement) titleElement.textContent = "Buscando..."; if (outputDiv) { // Añadir un overlay spinner al panel de procesamiento outputDiv.innerHTML = "<div style='display:flex; align-items:center; justify-content:center; height:100%;'><span class='loader-spinner' style='width:32px; height:32px; border:4px solid #ccc; border-top:4px solid #007bff; border-radius:50%; animation:spin 0.8s linear infinite;'></span></div>"; const processingStepLabel = document.getElementById("processingStep"); } // Centrar el panel de procesamiento floatingPanelElement.style.top = "50%"; floatingPanelElement.style.left = "50%"; floatingPanelElement.style.transform = "translate(-50%, -50%)"; } else { // status === "results" floatingPanelElement.style.width = resultsPanelDimensions.width; floatingPanelElement.style.height = resultsPanelDimensions.height; if(outputDiv) outputDiv.style.height = "660px"; if(titleElement) titleElement.textContent = "Resultado de la búsqueda"; // Mover el panel de resultados más a la derecha floatingPanelElement.style.top = "50%"; floatingPanelElement.style.left = "60%"; floatingPanelElement.style.transform = "translate(-50%, -50%)"; } floatingPanelElement.style.display = 'flex'; floatingPanelElement.style.flexDirection = 'column'; } // Escuchar el botón Guardar de WME para resetear el inspector const wmeSaveBtn = document.querySelector( "button.action.save, button[title='Guardar'], button[aria-label='Guardar']"); if (wmeSaveBtn) { wmeSaveBtn.addEventListener("click", () => resetInspectorState()); } // Función para crear la pestaña lateral del script function createSidebarTab() { try { // 1. Verificar si WME y la función para registrar pestañas están listos if (!W || !W.userscripts || typeof W.userscripts.registerSidebarTab !== 'function') { console.error("[WME PLN] WME (userscripts o registerSidebarTab) no está listo para crear la pestaña lateral."); return; } // 2. Registrar la pestaña principal del script en WME y obtener tabPane let registration; try { registration = W.userscripts.registerSidebarTab("NrmliZer"); // Nombre del Tab que aparece en WME } catch (e) { if (e.message.includes("already been registered")) { console.warn("[WME PLN] Tab 'NrmliZer' ya registrado. El script puede no funcionar como se espera si hay múltiples instancias."); // Podrías intentar obtener el tabPane existente o simplemente // retornar. Para evitar mayor complejidad, si ya está // registrado, no continuaremos con la creación de la UI de la // pestaña. return; } //console.error("[WME PLN] Error registrando el sidebar tab:", e); throw e; // Relanzar otros errores para que se vean en consola } const { tabLabel, tabPane } = registration; if (!tabLabel || !tabPane) { //console.error("[WME PLN] Falló el registro del Tab: 'tabLabel' o 'tabPane' no fueron retornados."); return; } // Configurar el ícono y nombre de la pestaña principal del script tabLabel.innerHTML = ` <img src="data:image/jpeg;base64,/9j/4QDKRXhpZgAATU0AKgAAAAgABgESAAMAAAABAAEAAAEaAAUAAAABAAAAVgEbAAUAAAABAAAAXgEoAAMAAAABAAIAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAeQAAAHAAAABDAyMjGRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAAAoCgAwAEAAAAAQAAAqmkBgADAAAAAQAAAAAAAAAAAAD/2wCEAAEBAQEBAQIBAQIDAgICAwQDAwMDBAUEBAQEBAUGBQUFBQUFBgYGBgYGBgYHBwcHBwcICAgICAkJCQkJCQkJCQkBAQEBAgICBAICBAkGBQYJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCf/dAAQABv/AABEIAGUAXwMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP7+KKKKACiivxO/4Kff8FePDv7Gt23wK+B9jbeKvird26zNBcMf7O0SGUfu7nUTGVd3Ycw2kbK8g5ZokIevQyvKq+MrLD4eN2/6+47MBl9XE1VRoq7P2rlnht4zNOwRFGSxOAB7noK5i18e+CL67+wWWsWMs/Ty0uImb/vkNmv86P42fHz9o/8Aaf1eTW/2lPiBrXitpWZvsAuXsdIiD/8ALOLTbQx2/lr0XzVlkx952PNfNsHwh+FdlOlzY+HNOtpoyGSWG3jjkUjoVdAGBHYg1+uYXwbk4fvq9n5RuvzX5H6Rh/C+q4/vKqT8l/wx/qNZFLX+ej+zZ+3h+2f+x/qMNx8G/Heoato0LBpPDnii4m1bTJlG3KI9w7XVqSowrQTKik7jG/Q/2Mf8E7v+Cjvwo/4KAfD25vdDtz4c8a6AI08QeGriUST2bSZCTwSAL9pspip8mdVXoUkWORWRfiuJ+A8Xlkfav3qfddPVdPyPlc/4QxOAXPLWHdf5dD9FqKK5bxp4v0bwH4Zu/FWvPstrOPccfeY9FRR3ZjgKPWvgMXi6WHpSr1pKMYq7b2SX+R81QoTqTVOmrt6JHU0V8kfAr9pTUfix4uufC+q6SlliB7iF4ZDIAqMqlZMgc/MMEcdsdK+t68DhHjHL88wax+WT5qd2tmtV5NJno51keJy6v9WxUbSt5fof/9D+/iiiigD5K/bq/acsP2Ov2TfG/wC0Tcwpd3Ph7TmbT7R2CC61Gdlt7G2z2865kjT8a/z2ftfifWtUv/GPj7UJNZ8Sa9cyajrGpTf6y7vZzullb0GeEQfKiBUXCqoH9d3/AAcVXl2n7C+haPGStrqHjnQo7nHdYGluYwfbzYkr+RYnnmv6H8I8vpwwM8T9qTt8klY/bPDPBQWGnX6t2+Ssdp8K/hT8Yf2gviVZ/Bn9n7w7N4p8U3qGYW0brDBbW6kK1zeXD/Jb26EjLHLH7qK74U/qF4j/AOCDH/BRrw74N/4SvTr7wTr+oLGHfQrS8vIJxgfMkN5cQLDK/ZQ6QqT1Ze36Wf8ABuH8PPBVn+zz8Rvi9DGj+J9c8YT6bfSHaZYbPTLeFbK3B6rFiV7hV6bpmPev6NK8Xi3xIxmGx0sNhUlGGmq3/wCB6Hj8R8dYuji5UcPZKOm39fgf5lFzba3o+t6l4R8XabdaHruiXL2Wp6Xfx+VdWdzHjdFKnY4IKkZV1KshKMpPoXwU/aD8ZfsgfGzw7+1R8PyxvPCU2/ULZP8Al/0aQqNRsmAxu8yFd8Q6CeOJv4cV+t3/AAcK+BPCXhT9tz4eeOvDsaQar4w8JajHrAT/AJbDR7u1Sxmcf3lW7mj3dWVVByEXH4i3j20dpLJesqQqjGRmIChAPmJJ4AA6+1fqmT42GZ5dCtUhpNar8H+Wnkfo2V4uGY4CNSpHSS2/A/0wfCnifRfGnhfTvGPhyYXOnaraw3lrKvSSGdBJGw9ipFfmh+1J8XX8feKx4K8PuZNM0qXZ+75+0XX3SQB1CfcT1OfavHv2Ovil43+FH/BKf4HeCfFENxp3i+/8GabbtDcqUuLa2SEIsrq3zK5i2BAQCCeR8pFfRv7I/wAGf7Y1Bfih4gi/0SyYpp8bdHlXgy/7sfRf9rn+EV/k/wCO+bYnOc5jwDkstW/30ltGC6fdaT7+7Hq0fHcG5PQymjVzzG6qF4013e11+S7avoj6Z/Zy+DqfC3wiLrVox/bOpBZLo9fLA+5CD6J/Fjq2e2K+iqTGOBS1/QXDHDmFyjAUsuwUbU6asv8AN+b3fmfk+bZpWxuIniq7vKX9W9Fsj//R/v4ooooA/K7/AILRfATWv2gf+CdfjzRfCls95rXhpLXxTp1vEPnmm0OdL0wr/tSxRvGOP4q/hs07UbPV9Pg1XTpFmt7mNZYnXlWRxlSMdiOlf6b80MVxC0E6h0cbWVhkEHggj0r/AD7f+Cgv7Hd3+wd+1dqvwhsIDF4K8Sm413wbLgBFsZJAbnThjgNp00gjVQABbvBjJ3Y/cPCPPIpTy+e/xR+7X8l+J+s+GmbxjzYKXXVfr+SOi/4J7/8ABQLx/wD8E7vinq/iHTtHl8V+BvFvlNr+hWzxxXaXMC+XFqFg0pSIziMCKWKRlWWNUw6GMbv6DPEP/BxT+wTZ+F5NR8JWHjLW9a8smLSE8P3VnK0gHCNc3Yis09NxmK+meK/kNZgME9K+ifgT+yJ+07+0zqMVh8EvBOp6tbybc6jNC1lpcasMiR764VIWTjnyfNf0Q19txFwVlWKqfXMX7vd3SXzv+lj6zO+EMvxFT6zXfL31SXz/AKRX/aH+Pnxo/bq/aTu/jT47sS2ua59m0fQ9A09muVsrQORbWNvkIZZZJZC0km1TJI38KKoT9f8A4F/8EdvDfw28a+H/ABj+2J460eWPS9uq6l4KsbeWWWby0EkNlNfecI5A0oHnRrABKmYwShZm/Qf9gn/gmd8PP2MJ4vif49vLfxj8SyjiK7jjI07SFkG1ksUf5pJinyPcvhiMhFiRih774r/BzxpoOq3nivSXn12xupHnm3fPdws5ydw/5aoOxHIHGMDNfyN9IH6SOOyPBrB8F0ozUdJSteytb3Vvp3WqOzJq2GxFT6lRqeypJWTSV5el17qt10b6W63/AAtoXib9pT4uST3uYYZSJLlk+7a2ifKkadgcfIn+1luxr9ddH0jTtA0u30XSIVgtbWNYoo0GAqKMACvgb9hPXri9i8QaTbQxNaRGCUzhcSea25fLY9wFXIH8PPrX6F1+DfRs4foRyZ55NudfEuTnJrXSTVl5XTfm35JL4DxVzKo8csviuWnSSUUttl+mnoFFFFf0Yflp/9L+/iiiigAr4P8A+CiX7Dfg79vb9na9+FGsTJpfiCwkGpeG9ZKb207VIVIikIGGaCRSYbiMEb4XYZBwR94UV04PF1MPVjWou0o7G2GxE6M1UpuzWx/mfXOleM/hR8ULrwL8V9DWy8U+B9Zt49Z0S5bMTy2U0VwYGcKd1reRBdsgXD28oYLztr+8H4G/tO/DX9rD4NWvxm+EF+8mkKFgv9LbC3Gk3SKN1rcQx8KUBBVhlHQq6EoytXyF/wAFf/8Agl8v7X3hJPj58B7WG2+Lnhe18uFeI49e0+MlzplyxwokUlms5m/1UhKE+XI9fy1/sJ/Gn9qzwH+09oOkfsXWdxcfETWp30u68OXqSQ2s8NpIVvIddhYBre3sWLebMyia1f5Y8ySeRN+t8U5dheL8l/ieyq00/Radf7rtofskcyoZphFiW1GdPo9v+Be2j6H9yWn6hJqLebBHstxwGbqx9h0AFaAuYt7qD/qsbvb2/KvSNc+H2qz6RHc6MILa+Ma+bChJhD4+byiQCAD93IHHYV51b+FNUluYvCsMMiPKf30jKRtT+JyenPav4PzDh3HYSqqMoXvs1s+yR5WGzPD1oc8Xa3TsepfCDQLLTdBn1uG3SGbVZjPIyqFLgfIhbAGeBXrVVrO1gsbSOytl2xxKEUegUYFWa/ecmy2OEwtPDR+yvx6/ifm2PxTr1pVX1/pfgFFFFemcZ//T/v4oopOlAH5M/wDBZL/gpvaf8Esf2Urf43aZo9t4k8Ta5rVpomiaTdSywQzyyB57l5ZII5HjjgtIZpSwU5YKnVgK+Q/+CHX/AAXNuP8AgrD4j8d/Dvx/4X0vwj4j8KWljqllBpV9Lew3mn3Mk1vK4aeOFw8E0ShwE27ZY8HOQPxT/wCC4WvXf/BUb/guB8IP+CXnhWc3PhzwhPbafraLJIiibUlj1PXZMrxuttGt44UdRlZLopuQk1i/tR29p/wRy/4OU/CHx60GIaR8Nfiy1m9zHBHHFbJY655Oi6pFnhQlnfwWF8wG0hWON3SgD+rb/grf+3b4u/4Jx/sX6r+1F4I8PWfii/0/VdJ05NPv55LaBxqV5HaFjLCkjrs8zdwh6YxX8vPwi/4Lm/t1XUWtft1/Bv8AYL0u7sPGEKjV/HGgx6pM2pQac5gPnXVrpUk8q27IUZmQqmz5uF4/Zj/g6IYH/gkb4jYc/wDFT+FP/Txb1/P7/wAEvv8Agu78V/2Iv+CYvhX9nr4ffsy+N/HcvhmHV3t/FUVtdDw5MbnULq7LvNa2dy/lweb5cgQH50YZXqKjNpNJjUmtj+on/gj/AP8ABZn4Pf8ABWXwPrn9g6DceDfGvhKO1l1jRJ51vIDbXm9YLyxvEVBcW0jxSJ80cUqMvzxqGQt82/8ABW3/AIOFvg1/wTn8eH9nX4T+HD8TPikiQte2CXX2bT9JNwEa3ivZoo553upkdWitLeF5MNGZDEJYt/5c/wDBo58KPh/s+MP7Wknjjw/qvjLxHDb20/hLR2K3ekWbXV1qBuLyI4VBdzylbZIPMijhiUedI7MqfEP/AAbR+ENH/bp/4K1fEr9sT47QjU9b0Gz1HxbZW96DJJFq2u6rNAk7q5I8ywtka3i4/dbtq42JiRH163/BzH/wVV+Bk1p8QP2v/wBk/wDsLwLfXEaQ3bW2u6K0iSNgLFdahaPb+a3SKO48jzGwBgHNf1nfsJ/tyfAj/god+znpP7Sn7Pt5LLpN+8lrd2d0qpeadf2523Fldxozqs0TY5RmjdSskbNGysfefjH8H/h58ffhV4g+CnxY0yHWPDfiiwn03UbO4UPHLBOhRhhgQCM5U9VYAjkV8r/sC/8ABN79l7/gm18PtU+Hf7MllqUFvr1zFeapc6rqV1qNxeXUMK26zOZ3McbeWiqRCka4AG3AGAD70ooooA//1P7+K8j+Pnxn8F/s6fBLxZ8efiLcraaF4O0m71i+lY4xBZwtKwHudu0DuSAK9crG8QeHfD/izR5/Dvimxt9S0+5AWa2uokmhkAIIDxuCrDIBwR2oA/zJ/wDgl3/wSl+Lv/Bd/wCI/wAYv2wPGvxOvfh0P7eaebVtJiW+lu9X1gvqF3ZxzC5jKxWNtJbQ5U8rsTaqpivYP+Cr3/Btd40/YP8A2SNS/at0/wCNGtfFC28P3VpZ6rZarZeW1ppmpzLaTXUM5uJ/LETyRtLldmwFmxsBH+jR4S8D+C/AOnPo/gXSLLRbSSQytBYW8dtG0hABcpEqqWIAGcZwB6Vp67oGheKNIuPD/iWyg1Cwu08ue2uY1lhkQ/wvG4KsPYjFAH8SP7a/7a1t+3D/AMGsPh742a/qMNxr+l614X8P+JJfNi2jVNG1m3tbiZmRigS4VFukJI/dSq2BXjv/AASH/wCDkL/gnv8A8E//APgm54H/AGUvi1H4j1Xxt4VGrNNb6Va2z2crXmpXV7Akd5NdRQDMcyBixVVbIPSv7lovgj8GIPDs3hCDwjoqaTczLcy2S6fbC3kmQALI0Qj2M6gABiMjAx0rGh/Zu/Z4t5Vnt/Afh2N0OVZdLswQR6ERcUAfxH/8GyvwY+M3x1/4KPfE3/gpFpnhR/CXwy1i38UJbj5vsj3HiLWIL+HTrGTYqXMVmkDGeSImJHKKh5KR+AfG3wT+0b/wbZ/8FXtV/a28M+F5PEPwZ8bXmpJBKhMFldaRq9wL2bTJ7zaYbTUbC6H+ieftjkjChM+bMYf9E6ysrPTrWOysIkghiAVI41CqoHQBRgAewqlrmgaH4m0ubQ/EdnBf2VwuyW3uY1lidfRkcFSPYigD+Mv9pj/g8H/Zo8Q/BDU/DX7GXhHxBN8StVs3tbJ9dWyhstNuph5ayEW13PLfyRkkxQ2qssrhVMkYYGv2Z/4IT/8ADyjWv2R5viH/AMFJfEF9qeq+ILxJ/DVhrFrbW2q2ejrCio+ofZ7a1YTXMu+RY5k82OHy/M2yM6J+lngf9kf9lb4ZeIT4t+HHw18LaBqpbd9s07R7K2nz6+ZFErfrX0KBigBaKKKAP//V/v4ooooAKKKKACiiigAooooAKKKKACiiigD/2Q==" style="height: 16px; vertical-align: middle; margin-right: 5px;"> NrmliZer `; // 3. Inicializar las pestañas internas (General, Especiales, // Diccionario, Reemplazos) const tabsContainer = document.createElement("div"); tabsContainer.style.display = "flex"; tabsContainer.style.marginBottom = "8px"; tabsContainer.style.gap = "8px"; const tabButtons = {}; const tabContents = {}; // Objeto para guardar los divs de contenido // Crear botones para cada pestaña tabNames.forEach(({ label, icon }) => { const btn = document.createElement("button"); btn.innerHTML = icon ? `<span style="display: inline-flex; align-items: center; font-size: 11px;"> <span style="font-size: 12px; margin-right: 4px;">${icon}</span>${label} </span>` : `<span style="font-size: 11px;">${label}</span>`; btn.style.fontSize = "11px"; btn.style.padding = "4px 8px"; btn.style.marginRight = "4px"; btn.style.minHeight = "28px"; btn.style.border = "1px solid #ccc"; btn.style.borderRadius = "4px 4px 0 0"; btn.style.cursor = "pointer"; btn.style.borderBottom = "none"; // Para que la pestaña activa se vea mejor integrada btn.className = "custom-tab-style"; // Agrega el tooltip personalizado para cada tab if (label === "Gene") btn.title = "Configuración general"; else if (label === "Espe") btn.title = "Palabras especiales (Excluidas)"; else if (label === "Dicc") btn.title = "Diccionario de palabras válidas"; else if (label === "Reemp") btn.title = "Gestión de reemplazos automáticos"; // Estilo inicial: la primera pestaña es la activa if (label === tabNames[0].label) { btn.style.backgroundColor = "#ffffff"; // Color de fondo activo (blanco) btn.style.borderBottom = "2px solid #007bff"; // Borde inferior distintivo para la activa btn.style.fontWeight = "bold"; } else { btn.style.backgroundColor = "#f0f0f0"; // Color de fondo inactivo (gris claro) btn.style.fontWeight = "normal"; } btn.addEventListener("click", () => { tabNames.forEach(({ label: tabLabel_inner }) => { const isActive = (tabLabel_inner === label); const currentButton = tabButtons[tabLabel_inner]; if (tabContents[tabLabel_inner]) { tabContents[tabLabel_inner].style.display = isActive ? "block" : "none"; } if (currentButton) { // Aplicar/Quitar estilos de pestaña activa directamente if (isActive) { currentButton.style.backgroundColor = "#ffffff"; // Activo currentButton.style.borderBottom = "2px solid #007bff"; currentButton.style.fontWeight = "bold"; } else { currentButton.style.backgroundColor = "#f0f0f0"; // Inactivo currentButton.style.borderBottom = "none"; currentButton.style.fontWeight = "normal"; } } // Llamar a la función de renderizado correspondiente if (isActive) { if (tabLabel_inner === "Espe") { const ul = document.getElementById("excludedWordsList"); if (ul && typeof renderExcludedWordsList === 'function') renderExcludedWordsList(ul); } else if (tabLabel_inner === "Dicc") { const ulDict = document.getElementById("dictionaryWordsList"); if (ulDict && typeof renderDictionaryList === 'function') renderDictionaryList(ulDict); } else if (tabLabel_inner === "Reemp") { const ulReemplazos = document.getElementById("replacementsListElementID"); if (ulReemplazos && typeof renderReplacementsList === 'function') renderReplacementsList(ulReemplazos); } } }); }); tabButtons[label] = btn; tabsContainer.appendChild(btn); }); tabPane.appendChild(tabsContainer); // Crear los divs contenedores para el contenido de cada pestaña tabNames.forEach(({ label }) => { const contentDiv = document.createElement("div"); contentDiv.style.display = label === tabNames[0].label ? "block" : "none"; // Mostrar solo la primera contentDiv.style.padding = "10px"; tabContents[label] = contentDiv; // Guardar referencia tabPane.appendChild(contentDiv); }); // --- POBLAR EL CONTENIDO DE CADA PESTAÑA --- // 4. Poblar el contenido de la pestaña "General" const containerGeneral = tabContents["Gene"]; if (containerGeneral) { // Crear el contenedor principal const mainTitle = document.createElement("h3"); mainTitle.textContent = "NormliZer"; mainTitle.style.textAlign = "center"; mainTitle.style.fontSize = "20px"; mainTitle.style.marginBottom = "2px"; containerGeneral.appendChild(mainTitle); // Crear el subtítulo (información de la versión) const versionInfo = document.createElement("div"); versionInfo.textContent = "V. " + VERSION; // VERSION global versionInfo.style.textAlign = "right"; versionInfo.style.fontSize = "10px"; versionInfo.style.color = "#777"; versionInfo.style.marginBottom = "15px"; containerGeneral.appendChild(versionInfo); //Crear un div para mostrar el ID del usuario const userIdInfo = document.createElement("div"); // userIdInfo.id = "wme-pln-user-id"; // userIdInfo.textContent = "Cargando usuario..."; // userIdInfo.style.textAlign = "right"; // userIdInfo.style.fontSize = "10px"; // userIdInfo.style.color = "#777"; // userIdInfo.style.marginBottom = "15px"; // containerGeneral.appendChild(userIdInfo); // // Esta función reemplaza la necesidad de las funciones getCurrentEditorViaSdk, etc. const pollAndDisplayUserInfo = () => { let pollingAttempts = 0; const maxPollingAttempts = 60; const pollInterval = setInterval(async () => { //console.log(`[WME PLN][DEBUG] Polling intento ${pollingAttempts + 1}...`); let currentUserInfoLocal = null; //: Usar una variable local temporal // Primero intentar con wmeSDK.State.getUserInfo() *** if (wmeSDK && wmeSDK.State && typeof wmeSDK.State.getUserInfo === 'function') { try { const sdkUserInfo = await wmeSDK.State.getUserInfo(); if (sdkUserInfo && sdkUserInfo.userName) { currentUserInfoLocal = { // Si sdkUserInfo.id NO existe, usar sdkUserInfo.userName DIRECTAMENTE (sin Number()) id: sdkUserInfo.id !== undefined ? sdkUserInfo.id : sdkUserInfo.userName, // name: sdkUserInfo.userName, privilege: sdkUserInfo.privilege || 'N/A' }; // Asegurarse de que el ID es válido para el log const displayId = typeof currentUserInfoLocal.id === 'number' ? currentUserInfoLocal.id : `"${currentUserInfoLocal.id}"`; // //console.log(`[WME PLN][DEBUG] SDK.State SUCCESS: Usuario obtenido: ${currentUserInfoLocal.name} (ID: ${displayId})`); // } else { // console.warn(`[WME_PLN][DEBUG] SDK.State: getUserInfo() devolvió datos incompletos o null:`, sdkUserInfo); } } catch (e) { // console.error(`[WME_PLN][DEBUG] SDK.State ERROR al obtener usuario:`, e); } } else { //console.warn(`[WME_PLN][DEBUG] SDK.State.getUserInfo no disponible. wmeSDK:`, wmeSDK); } // Fallback a W.loginManager (si SDK.State no funcionó) if (!currentUserInfoLocal && typeof W !== 'undefined' && W.loginManager && W.loginManager.userName && W.loginManager.userId) { //: Usar currentUserInfoLocal currentUserInfoLocal = { id: Number(W.loginManager.userId), // Convertir a número name: W.loginManager.userName, privilege: W.loginManager.userPrivilege || 'N/A' }; //console.log(`[WME PLN][DEBUG] W.loginManager SUCCESS: Usuario obtenido: ${currentUserInfoLocal.name} (ID: ${currentUserInfoLocal.id})`); } else if (!currentUserInfoLocal) { //: Solo logear si aún no se encontró en ningún método // console.warn(`[WME_PLN][DEBUG] W.loginManager devolvió datos incompletos o null:`, W?.loginManager); } if (currentUserInfoLocal && currentUserInfoLocal.id && currentUserInfoLocal.name) { clearInterval(pollInterval); currentGlobalUserInfo = currentUserInfoLocal; userIdInfo.textContent = `Editor Actual: ${currentGlobalUserInfo.name}`; userIdInfo.title = `Privilegio: ${currentGlobalUserInfo.privilege}`; updateStatsDisplay();//: Actualizar estadísticas con el nuevo usuario // console.log('[WME_PLN][DEBUG] USUARIO CARGADO EXITOSAMENTE mediante polling.'); const labelToUpdate = document.querySelector('label[for="chk-avoid-my-edits"]'); if (labelToUpdate) { labelToUpdate.innerHTML = `Excluir lugares cuya última edición sea del Editor: <span style="color: #007bff; font-weight: normal;">${currentGlobalUserInfo.name}</span>`; } const avoidMyEditsCheckbox = document.getElementById("chk-avoid-my-edits"); if (avoidMyEditsCheckbox) { avoidMyEditsCheckbox.disabled = false; avoidMyEditsCheckbox.style.opacity = "1"; avoidMyEditsCheckbox.style.cursor = "pointer"; } } else if (pollingAttempts >= maxPollingAttempts - 1) { clearInterval(pollInterval); userIdInfo.textContent = "Usuario no detectado (agotados intentos)"; //console.log('[WME PLN][DEBUG] Polling agotado. Usuario no detectado después de varios intentos.'); // Asignar el estado de fallo a currentGlobalUserInfo currentGlobalUserInfo = { id: 0, name: 'No detectado', privilege: 'N/A' }; // Usar 0 o null como number // Actualizar el texto del checkbox para evitar ediciones del usuario const avoidTextSpanToUpdate = document.querySelector("#chk-avoid-my-edits + label span"); //: Actualizar el texto del checkbox para evitar ediciones del usuario if (avoidTextSpanToUpdate) { //: Usa innerHTML y estilo atenuado para el nombre "No detectado" avoidTextSpanToUpdate.innerHTML = `Excluir lugares cuya última edición sea del Editor: <span style="color: #777; opacity: 0.5;">No detectado</span>`; // avoidTextSpanToUpdate.style.opacity = "1"; //: Asegurar opacidad base para el span principal // avoidTextSpanToUpdate.style.color = "#777"; //: Puedes quitar esta línea si el color del span es suficiente } const avoidMyEditsCheckbox = document.getElementById("chk-avoid-my-edits"); //: Deshabilitar el checkbox si no se detecta el usuario if (avoidMyEditsCheckbox) { avoidMyEditsCheckbox.disabled = true; avoidMyEditsCheckbox.style.opacity = "0.5"; avoidMyEditsCheckbox.style.cursor = "not-allowed"; } } pollingAttempts++; }, 200); // console.log('[WME_PLN][DEBUG] Iniciando polling para información del usuario...'); }; // Iniciar el polling para la información del usuario pollAndDisplayUserInfo(); //Llamada directa a la nueva función de polling // Título de la sección de normalización const normSectionTitle = document.createElement("h4"); normSectionTitle.textContent = "Análisis de Nombres de Places"; normSectionTitle.style.fontSize = "16px"; normSectionTitle.style.marginTop = "10px"; normSectionTitle.style.marginBottom = "5px"; normSectionTitle.style.borderBottom = "1px solid #eee"; normSectionTitle.style.paddingBottom = "3px"; containerGeneral.appendChild(normSectionTitle); // Descripción de la sección const scanButton = document.createElement("button"); scanButton.id = "pln-start-scan-btn"; scanButton.textContent = "Start Scan..."; scanButton.setAttribute("type", "button"); scanButton.style.marginBottom = "10px"; scanButton.style.fontSize = "14px"; scanButton.style.width = "100%"; scanButton.style.padding = "8px"; scanButton.style.border = "none"; scanButton.style.borderRadius = "4px"; scanButton.style.backgroundColor = "#007bff"; scanButton.style.color = "#fff"; scanButton.style.cursor = "pointer"; scanButton.addEventListener("click", () => { disableScanControls(); // Deshabilitar controles durante el escaneo scanButton.textContent = "Escaneando..."; // Cambia el texto del botón const places = getVisiblePlaces(); const outputDiv = document.getElementById("wme-normalization-tab-output"); if (!outputDiv) { // Mover esta verificación antes // console.error("[WME_PLN] Div de salida (wme-normalization-tab-output) no encontrado en el tab."); return; } if (places.length === 0) { outputDiv.textContent = "No se encontraron lugares visibles para analizar."; return; } const maxPlacesInput = document.getElementById("maxPlacesInput"); const maxPlacesToScan = parseInt(maxPlacesInput?.value || "100", 10); const scannedCount = Math.min(places.length, maxPlacesToScan); outputDiv.textContent = `Escaneando ${scannedCount} lugares...`; setTimeout(() => {renderPlacesInFloatingPanel(places.slice(0, maxPlacesToScan));}, 10); }); containerGeneral.appendChild(scanButton); // Crear el contenedor para el checkbox de usuario const maxWrapper = document.createElement("div"); maxWrapper.style.display = "flex"; maxWrapper.style.alignItems = "center"; maxWrapper.style.gap = "8px"; maxWrapper.style.marginBottom = "8px"; const maxLabel = document.createElement("label"); maxLabel.textContent = "Máximo de places a revisar:"; maxLabel.style.fontSize = "13px"; maxWrapper.appendChild(maxLabel); const maxInput = document.createElement("input"); maxInput.type = "number"; maxInput.id = "maxPlacesInput"; maxInput.min = "1"; maxInput.value = "100"; maxInput.style.width = "80px"; maxWrapper.appendChild(maxInput); containerGeneral.appendChild(maxWrapper); const presets = [ 25, 50, 100, 250, 500 ]; const presetContainer = document.createElement("div"); presetContainer.style.textAlign = "center"; presetContainer.style.marginBottom = "8px"; presets.forEach(preset => { const btn = document.createElement("button"); btn.className = "pln-preset-btn"; // Clase para aplicar estilos comunes btn.textContent = preset.toString(); btn.style.margin = "2px"; btn.style.padding = "4px 6px"; btn.addEventListener("click", () => { if (maxInput) maxInput.value = preset.toString(); }); presetContainer.appendChild(btn); }); containerGeneral.appendChild(presetContainer); // Checkbox para recomendar categorías const recommendCategoriesWrapper = document.createElement("div"); recommendCategoriesWrapper.style.marginTop = "10px"; recommendCategoriesWrapper.style.marginBottom = "5px"; recommendCategoriesWrapper.style.display = "flex"; recommendCategoriesWrapper.style.flexDirection = "column"; //Cambiar a columna para apilar checkboxes recommendCategoriesWrapper.style.alignItems = "flex-start"; //Alinear ítems al inicio recommendCategoriesWrapper.style.padding = "6px 8px"; // Añadir padding recommendCategoriesWrapper.style.backgroundColor = "#e0f7fa"; // Fondo claro para destacar recommendCategoriesWrapper.style.border = "1px solid #00bcd4"; // Borde azul recommendCategoriesWrapper.style.borderRadius = "4px"; // Bordes redondeados containerGeneral.appendChild(recommendCategoriesWrapper); //Añadir el wrapper aquí, antes de sus contenidos // Contenedor para el checkbox "Recomendar categorías" const recommendCategoryCheckboxRow = document.createElement("div"); // recommendCategoryCheckboxRow.style.display = "flex"; //Fila para checkbox y etiqueta recommendCategoryCheckboxRow.style.alignItems = "center"; // recommendCategoryCheckboxRow.style.marginBottom = "5px"; //Margen inferior // Crear el checkbox y la etiqueta const recommendCategoriesCheckbox = document.createElement("input"); recommendCategoriesCheckbox.type = "checkbox"; recommendCategoriesCheckbox.id = "chk-recommend-categories"; recommendCategoriesCheckbox.style.marginRight = "8px"; const savedCategoryRecommendationState = localStorage.getItem("wme_pln_recommend_categories"); recommendCategoriesCheckbox.checked = (savedCategoryRecommendationState === "true"); const recommendCategoriesLabel = document.createElement("label"); recommendCategoriesLabel.htmlFor = "chk-recommend-categories"; recommendCategoriesLabel.style.fontSize = "14px"; recommendCategoriesLabel.style.cursor = "pointer"; recommendCategoriesLabel.style.fontWeight = "bold"; recommendCategoriesLabel.style.color = "#00796b"; recommendCategoriesLabel.style.display = "flex"; recommendCategoriesLabel.style.alignItems = "center"; const iconSpan = document.createElement("span"); iconSpan.innerHTML = "✨ "; iconSpan.style.marginRight = "4px"; iconSpan.style.fontSize = "16px"; iconSpan.appendChild(document.createTextNode("Recomendar categorías")); recommendCategoriesLabel.appendChild(iconSpan); recommendCategoryCheckboxRow.appendChild(recommendCategoriesCheckbox); // recommendCategoryCheckboxRow.appendChild(recommendCategoriesLabel); // recommendCategoriesWrapper.appendChild(recommendCategoryCheckboxRow); //Añadir la fila al wrapper recommendCategoriesCheckbox.addEventListener("change", () => { localStorage.setItem("wme_pln_recommend_categories", recommendCategoriesCheckbox.checked ? "true" : "false"); }); // --- Contenedor para AGRUPAR las opciones de exclusión --- const excludeContainer = document.createElement('div'); excludeContainer.style.marginTop = '8px'; // Espacio que lo separa de la opción de arriba // --- Fila para el checkbox "Excluir lugares..." --- const avoidMyEditsCheckboxRow = document.createElement("div"); avoidMyEditsCheckboxRow.style.display = "flex"; avoidMyEditsCheckboxRow.style.alignItems = "center"; //: Añadir un margen inferior para separar del checkbox de categorías const avoidMyEditsCheckbox = document.createElement("input"); avoidMyEditsCheckbox.type = "checkbox"; avoidMyEditsCheckbox.id = "chk-avoid-my-edits"; avoidMyEditsCheckbox.style.marginRight = "8px"; const savedAvoidMyEditsState = localStorage.getItem("wme_pln_avoid_my_edits"); avoidMyEditsCheckbox.checked = (savedAvoidMyEditsState === "true"); avoidMyEditsCheckboxRow.appendChild(avoidMyEditsCheckbox); //: Añadir un label con el texto de la opción const avoidMyEditsLabel = document.createElement("label"); avoidMyEditsLabel.htmlFor = "chk-avoid-my-edits"; avoidMyEditsLabel.style.fontSize = "16px"; // Tamaño de fuente consistente avoidMyEditsLabel.style.cursor = "pointer"; avoidMyEditsLabel.style.fontWeight = "bold"; avoidMyEditsLabel.style.color = "#00796b"; avoidMyEditsLabel.innerHTML = `Excluir lugares cuya última edición sea del Editor: <span style="color: #007bff; font-weight: normal;">Cargando...</span>`; avoidMyEditsCheckboxRow.appendChild(avoidMyEditsLabel); // --- Fila para el dropdown de fecha (sub-menú) --- const dateFilterRow = document.createElement("div"); dateFilterRow.style.display = "flex"; dateFilterRow.style.alignItems = "center"; dateFilterRow.style.marginTop = "8px"; // Espacio entre el checkbox y esta fila dateFilterRow.style.paddingLeft = "25px"; // Indentación para que parezca una sub-opción dateFilterRow.style.gap = "8px"; //: Añadir un label para el dropdown const dateFilterLabel = document.createElement("label"); dateFilterLabel.htmlFor = "dateFilterSelect"; dateFilterLabel.textContent = "Excluir solo ediciones de:"; dateFilterLabel.style.fontSize = "13px"; dateFilterLabel.style.fontWeight = "500"; dateFilterLabel.style.color = "#334"; dateFilterRow.appendChild(dateFilterLabel); //: Crear el dropdown para seleccionar el filtro de fecha const dateFilterSelect = document.createElement("select"); dateFilterSelect.id = "dateFilterSelect"; dateFilterSelect.style.padding = "5px 8px"; dateFilterSelect.style.border = "1px solid #b0c4de"; dateFilterSelect.style.borderRadius = "4px"; dateFilterSelect.style.backgroundColor = "#fff"; dateFilterSelect.style.flexGrow = "1"; dateFilterSelect.style.fontSize = "13px"; dateFilterSelect.style.cursor = "pointer"; // Añadir opciones al dropdown const dateOptions = { "all": "Elegir una opción", "6_months": "Últimos 6 meses", "3_months": "Últimos 3 meses", "1_month": "Último mes", "1_week": "Última Semana", "1_day": "Último día" }; // Añadir las opciones al dropdown for (const [value, text] of Object.entries(dateOptions)) { const option = document.createElement("option"); option.value = value; option.textContent = text; dateFilterSelect.appendChild(option); } // Cargar el valor guardado del localStorage const savedDateFilter = localStorage.getItem("wme_pln_date_filter"); if (savedDateFilter) { dateFilterSelect.value = savedDateFilter; } dateFilterSelect.addEventListener("change", () => { localStorage.setItem("wme_pln_date_filter", dateFilterSelect.value); }); dateFilterRow.appendChild(dateFilterSelect); // --- Añadir AMBAS filas al contenedor de exclusión --- excludeContainer.appendChild(avoidMyEditsCheckboxRow); excludeContainer.appendChild(dateFilterRow); // --- Añadir el contenedor AGRUPADO al wrapper principal (el cuadro azul) --- recommendCategoriesWrapper.appendChild(excludeContainer); // --- Lógica para habilitar/deshabilitar el dropdown --- const toggleDateFilterState = () => { const isChecked = avoidMyEditsCheckbox.checked; dateFilterSelect.disabled = !isChecked; dateFilterRow.style.opacity = isChecked ? "1" : "0.5"; dateFilterRow.style.pointerEvents = isChecked ? "auto" : "none"; }; // --- Listener unificado para el checkbox --- avoidMyEditsCheckbox.addEventListener("change", () => { toggleDateFilterState(); // Actualiza la UI del dropdown localStorage.setItem("wme_pln_avoid_my_edits", avoidMyEditsCheckbox.checked ? "true" : "false"); // Guarda el estado }); // Llamada inicial para establecer el estado correcto al cargar toggleDateFilterState(); // --- Contenedor para el checkbox de estadísticas --- const statsContainer = document.createElement('div'); statsContainer.style.marginTop = '8px'; // Añadir un borde y fondo para destacar const statsCheckboxRow = document.createElement("div"); statsCheckboxRow.style.display = "flex"; statsCheckboxRow.style.alignItems = "center"; // Añadir un margen inferior para separar del checkbox de exclusión const statsCheckbox = document.createElement("input"); statsCheckbox.type = "checkbox"; statsCheckbox.id = "chk-enable-stats"; statsCheckbox.style.marginRight = "8px"; statsCheckbox.checked = localStorage.getItem(STATS_ENABLED_KEY) === 'true'; statsCheckboxRow.appendChild(statsCheckbox); // Crear la etiqueta para el checkbox de estadísticas const statsLabel = document.createElement("label"); statsLabel.htmlFor = "chk-enable-stats"; statsLabel.style.fontSize = "16px"; // Tamaño consistente statsLabel.style.cursor = "pointer"; statsLabel.style.fontWeight = "bold"; statsLabel.style.color = "#00796b"; statsLabel.innerHTML = `📊 Habilitar panel de estadísticas`; statsCheckboxRow.appendChild(statsLabel); // Añadir un tooltip al checkbox de estadísticas statsContainer.appendChild(statsCheckboxRow); // Añadir el contenedor de estadísticas al wrapper principal (el cuadro azul) recommendCategoriesWrapper.appendChild(statsContainer); // Listener para el checkbox de estadísticas statsCheckbox.addEventListener("change", () => { localStorage.setItem(STATS_ENABLED_KEY, statsCheckbox.checked ? "true" : "false"); toggleStatsPanelVisibility(); }); //===========================Finaliza bloque de estadísticas // Listener para guardar el estado del nuevo checkbox avoidMyEditsCheckbox.addEventListener("change", () => { // localStorage.setItem("wme_pln_avoid_my_edits", avoidMyEditsCheckbox.checked ? "true" : "false"); // }); // Barra de progreso y texto const tabProgressWrapper = document.createElement("div"); tabProgressWrapper.style.margin = "10px 0"; tabProgressWrapper.style.height = "18px"; tabProgressWrapper.style.backgroundColor = "transparent"; const tabProgressBar = document.createElement("div"); tabProgressBar.style.height = "100%"; tabProgressBar.style.width = "0%"; tabProgressBar.style.backgroundColor = "#007bff"; tabProgressBar.style.transition = "width 0.2s"; tabProgressBar.id = "progressBarInnerTab"; tabProgressWrapper.appendChild(tabProgressBar); containerGeneral.appendChild(tabProgressWrapper); // Texto de progreso const tabProgressText = document.createElement("div"); tabProgressText.style.fontSize = "13px"; tabProgressText.style.marginTop = "5px"; tabProgressText.id = "progressBarTextTab"; tabProgressText.textContent = "Progreso: 0% (0/0)"; containerGeneral.appendChild(tabProgressText); // Div para mostrar el resultado del análisis const outputNormalizationInTab = document.createElement("div"); outputNormalizationInTab.id = "wme-normalization-tab-output"; outputNormalizationInTab.style.fontSize = "12px"; outputNormalizationInTab.style.minHeight = "20px"; outputNormalizationInTab.style.padding = "5px"; outputNormalizationInTab.style.marginBottom = "15px"; outputNormalizationInTab.textContent = "Presiona 'Start Scan...' para analizar los places visibles."; containerGeneral.appendChild(outputNormalizationInTab); } else { console.error("[WME PLN] No se pudo poblar la pestaña 'General' porque su contenedor no existe."); } // 5. Poblar las otras pestañas if (tabContents["Espe"]) createSpecialItemsManager(tabContents["Espe"]); else { console.error("[WME PLN] No se pudo encontrar el contenedor para la pestaña 'Especiales'."); } // --- Llamada A La Función Para Poblar La Nueva Pestaña "Diccionario" if (tabContents["Dicc"]) { createDictionaryManager(tabContents["Dicc"]); } else { console.error("[WME PLN] No se pudo encontrar el contenedor para la pestaña 'Diccionario'."); } // --- Llamada A La Función Para Poblar La Nueva Pestaña "Reemplazos" if (tabContents["Reemp"]) { createReplacementsManager(tabContents["Reemp"]); // Esta es la llamada clave } else { console.error("[WME PLN] No se pudo encontrar el contenedor para la pestaña 'Reemplazos'."); } } catch (error) { console.error("[WME PLN] Error creando la pestaña lateral:", error, error.stack); } } // Fin de createSidebarTab // 2. Esperar a que Waze API esté disponible function waitForSidebarAPI() { // Comprobar si Waze API está disponible if (W && W.userscripts && W.userscripts.registerSidebarTab) { const savedExcluded = localStorage.getItem("excludedWordsList"); if (savedExcluded) { try { const parsed = JSON.parse(savedExcluded); excludedWords = new Set(); // Reinicializa el Set excludedWordsMap = new Map(); // Reinicializa el Map parsed.forEach(word => { // parsed es el array del JSON excludedWords.add(word); const firstChar = word.charAt(0).toLowerCase(); if (!excludedWordsMap.has(firstChar)) { excludedWordsMap.set(firstChar, new Set()); } excludedWordsMap.get(firstChar).add(word); }); // console.log("[WME PLN] Palabras especiales restauradas desde localStorage:", Array.from(excludedWords)); } catch (e) { //console.error("[WME PLN] Error al cargar excludedWordsList del localStorage:", e); excludedWords = new Set(); } } else { excludedWords = new Set(); // console.log("[WME PLN] No se encontraron palabras especiales en localStorage."); } // --- Cargar Lugares Excluidos desde localStorage --- const savedExcludedPlaces = localStorage.getItem("excludedPlacesList"); if (savedExcludedPlaces) { try { const parsed = JSON.parse(savedExcludedPlaces); // Restaurar el Map desde el array de arrays excludedPlaces = new Map(parsed); // Antes era new Set(parsed) console.log("[WME PLN] Lugares excluidos restaurados desde localStorage:", Array.from(excludedPlaces.entries())); // Logear entries } catch (e) { console.error("[WME PLN] Error al cargar excludedPlacesList del localStorage:", e); excludedPlaces = new Map(); // Asegurar que sea un Map vacío en caso de error } } else { excludedPlaces = new Map(); // Asegurar que sea un Map vacío si no hay datos console.log("[WME PLN] No se encontraron lugares excluidos en localStorage."); } // --- Cargar diccionario desde localStorage --- const savedDictionary = localStorage.getItem("dictionaryWordsList"); if (savedDictionary) { try { const parsed = JSON.parse(savedDictionary); window.dictionaryWords = new Set(parsed); // Crear el índice de palabras por letra window.dictionaryIndex = {}; // Iterar sobre las palabras y agregarlas al índice parsed.forEach(word => { const letter = word.charAt(0).toLowerCase(); if (!window.dictionaryIndex[letter]) window.dictionaryIndex[letter] = []; window.dictionaryIndex[letter].push(word); }); } catch (e) { console.error("[WME PLN] Error al cargar dictionaryWordsList del localStorage:", e); window.dictionaryWords = new Set(); window.dictionaryIndex = {}; } } else { window.dictionaryWords = new Set(); window.dictionaryIndex = {}; // console.log("[WME PLN] No se encontró diccionario en // localStorage."); } // Esto añadirá nuevas palabras del Excel a window.dictionaryWords y se encarga de guardar en localStorage después. // Se hace de forma asíncrona pero no bloquea la UI. loadDictionaryWordsFromSheet().then(() => { console.log('[WME PLN] Carga del diccionario desde Google Sheets finalizada.'); }).catch(err => { console.error('[WME PLN] Fallo en la carga del diccionario desde Google Sheets:', err); }); // Cargar estadísticas del editor loadEditorStats(); // --- Cargar palabras de reemplazo desde localStorage --- loadReplacementWordsFromStorage(); // La llamada a waitForWazeAPI ya se encarga de la lógica de dynamicCategoriesLoaded. waitForWazeAPI(() => { createSidebarTab(); createStatsPanel(); //Crea el panel de estadísticas }); } else { // console.log("[WME PLN] Esperando W.userscripts API..."); setTimeout(waitForSidebarAPI, 1000); } }// Fin de waitForSidebarAPI // 1. normalizePlaceName function normalizePlaceName(word) { //console.log("[WME_PLN][DEBUG] Analizando nombre:", word); if (!word || typeof word !== "string") return ""; // Manejar palabras con "/" recursivamente if (word.includes("/")) { if (word === "/") return "/"; return word.split("/").map(part => normalizePlaceName(part.trim())).join("/"); } // Regla 1: Si la palabra es SOLO números, mantenerla tal cual. (Prioridad alta) if (/^[0-9]+$/.test(word)) return word; // Regla 2: Números seguidos de letras (sin espacio) word = word.replace(/(\d)([a-zA-Z])/g, (_, num, letter) => `${num}${letter.toUpperCase()}`); // Regla 3: Números romanos: todo en mayúsculas const romanRegexStrict = /^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i; if (romanRegexStrict.test(word)) return word.toUpperCase(); // Regla 4: Acrónimos/Palabras con puntos/letras mayúsculas que deben mantenerse. Esto es para "St." o "U.S.A." o "EPM", "SURA" // NOTA: originalNameFull ya no tiene emoticones gracias a `processNextPlace` if (/^[A-ZÁÉÍÓÚÑ0-9.]+$/.test(word) && word.length > 1 && (word.includes('.') || /^[A-ZÁÉÍÓÚÑ]+$/.test(word))) { // Asegurarse de que no sea "MI", "DI", "SI" si están en mayúsculas accidentales if (word.toUpperCase() === "MI" || word.toUpperCase() === "DI" || word.toUpperCase() === "SI") return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); return word; // Mantener como está } // Regla 5: Capitalización estándar para el resto de las palabras. // Esta será la regla para la mayoría de las palabras que no caen en las anteriores. let normalizedWord = word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); return normalizedWord; }// Fin de normalizePlaceName // Función para escapar caracteres especiales en una cadena para usar en regex function applyWordsToStartMovement(name) { let newName = name; // Asegurarse de que window.swapWords exista y no esté vacío if (!window.swapWords || window.swapWords.length === 0) { return newName; // No hay palabras para mover } // Ordenar las palabras swap por longitud descendente para procesar primero las frases más largas. // Esto es crucial para evitar que una palabra corta (ej. "Club") se mueva antes que una frase más larga que la contiene // (ej. "Club Campestre"), si ambas estuvieran en la lista. const sortedSwapWords = [...window.swapWords].sort((a, b) => b.length - a.length); for (const swapWord of sortedSwapWords) { // Regex para encontrar la palabra swap al final del nombre. // \s* : Cero o más espacios antes de la palabra. // (${escapeRegExp(swapWord)}) : Captura la palabra swap (escapando caracteres especiales de regex). // \s*$ : Cero o más espacios al final del nombre, seguido del fin de la cadena. // 'i' : Para búsqueda insensible a mayúsculas/minúsculas. const regex = new RegExp(`\\s*(${escapeRegExp(swapWord)})\\s*$`, 'i'); if (regex.test(newName)) { // Captura la parte del nombre que coincide con la palabra swap al final. const match = newName.match(regex); const matchedSwapWord = match[1]; // La palabra/frase real que coincidió (ej. "apartamentos", "Urbanización") // Elimina la palabra swap del final del nombre para obtener el resto. const remainingName = newName.replace(regex, '').trim(); // Capitaliza la palabra movida para que aparezca correctamente al inicio. // Si ya está correctamente capitalizada (ej. "Urbanización"), se mantiene así. //const capitalizedSwapWord = matchedSwapWord.charAt(0).toUpperCase() + matchedSwapWord.slice(1).toLowerCase(); const capitalizedSwapWord = capitalizeEachWord(matchedSwapWord); // Usar la nueva función aquí // Reconstruye el nombre: Palabra movida + espacio + resto del nombre. newName = `${capitalizedSwapWord} ${remainingName}`.trim(); // Una vez que se mueve una palabra, asumimos que no hay más movimientos // que hacer con otras palabras swap para esta misma entrada, // a menos que quieras permitir múltiples movimientos, lo cual // complicaría la lógica. Por ahora, nos detenemos en la primera coincidencia. break; } } return newName; }//applyWordsToStartMovement // Esta función normaliza una palabra individual, considerando palabras excluidas, tildes y capitalización function normalizeWordInternal(word, isFirstWordInSequence = false, isInsideQuotesOrParentheses = false) { console.log(`[WME PLN - NWI] Inicia procesamiento de palabra: "${word}"`); // LOG INICIO if (!word || typeof word !== 'string') { return ""; } // PRioridad 1: Palabras Especiales (Excluidas) if (excludedWords && excludedWordsMap) { console.log(`[WME PLN - NWI] Intentando Prioridad 1 (Excluidas) para: "${word}"`); // LOG INICIO EXCLUIDAS // La limpieza para comparación ahora SÓLO quita tildes y convierte a minúsculas. // Ya no elimina símbolos como '&' o '.', haciendo la comparación más estricta. const cleanedInputWord = removeDiacritics(word.toLowerCase()); const firstChar = word.charAt(0).toLowerCase(); const excludedCandidates = excludedWordsMap.get(firstChar); console.log(`[WME PLN - NWI] cleanedInputWord: "${cleanedInputWord}", firstChar: "${firstChar}"`); // LOG CLEANED console.log(`[WME PLN - NWI] excludedCandidates para '${firstChar}':`, excludedCandidates ? Array.from(excludedCandidates) : 'Ninguno'); // LOG CANDIDATOS // Verifica si hay candidatos excluidos para la primera letra de la palabra. if (excludedCandidates) { for (const excludedWord of excludedCandidates) { // Limpia la palabra de la lista de la misma manera estricta. const cleanedExcludedWord = removeDiacritics(excludedWord.toLowerCase()); if (cleanedExcludedWord === cleanedInputWord) { return excludedWord; // Si es una palabra excluida, devuelve su forma exacta y termina. } } console.log(`[WME PLN - NWI] 🚫 No se encontró coincidencia exacta para excluida: "${word}"`); // LOG NO COINCIDENCIA } } // FIN PRIORIDAD 1 // Prioridad 2: Manejo De Guiones Dentro De Palabras (solo si no fue excluida completa) // La condición /\p{L}-\p{L}/u.test(word) es crucial: asegura que el guion esté entre letras if (word.includes('-') && /\p{L}-\p{L}/u.test(word)) { console.log(`[WME PLN - NWI] Aplicando Prioridad 2: Manejo de guiones para: "${word}"`); const parts = word.split('-'); const normalizedParts = parts.map((part, partIndex) => { let normalizedPart = part; const isAcronymLikePart = /^[A-ZÁÉÍÓÚÑ0-9.]+$/.test(part); if (isAcronymLikePart && part.length > 1) { normalizedPart = part; // Mantener como acrónimo si lo es. } else { normalizedPart = part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(); } return normalizedPart; }); return normalizedParts.join('-'); } // Prioridad 3: Palabras Con Apóstrofe if (word.includes("'")) { console.log(`[WME PLN - NWI] Aplicando Prioridad 3 (Apóstrofe): "${word}"`); return handleApostropheWord(word); } // Prioridad 4: Acrónimos Y Palabras Con Mayúsculas/Puntos/& (después de guiones y apóstrofes) const isAcronymLike = /^[A-ZÁÉÍÓÚÑ0-9.&]+$/.test(word); if (isAcronymLike && word.length > 1) { console.log(`[WME PLN - NWI] Aplicando Prioridad 4 (Acrónimo): "${word}"`); return word; // Mantener como está } // Prioridad 5: Números Romanos const romanRegexInsensitive = /^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i; if (romanRegexInsensitive.test(word)) { console.log(`[WME PLN - NWI] Aplicando Prioridad 5 (Números Romanos): "${word}"`); return word.toUpperCase(); } // Prioridad 6: Palabras Comunes const lowerWord = word.toLowerCase().replace('.', ''); // `commonWords` es una constante global. if (commonWords.includes(lowerWord)) // Si es una palabra común { console.log(`[WME PLN - NWI] Aplicando Prioridad 6 (Palabra Común): "${word}"`); // Artículos y preposiciones que siempre queremos capitalizar si están en commonWords const alwaysCapitalizeCommonWords = ["el", "la", "los", "las", "de", "del", "y", "e", "o", "u", "al", "en", "con", "por"]; if (alwaysCapitalizeCommonWords.includes(lowerWord)) { // Si es un artículo/preposición de la lista, SIEMPRE capitalizar su primera letra. // Esto forzará "el" -> "El", "de" -> "De", incluso si no es la primera palabra. return lowerWord.charAt(0).toUpperCase() + lowerWord.slice(1); } else if (isFirstWordInSequence && !isInsideQuotesOrParentheses) { // Para otras palabras comunes (ej. "un", "una"), solo capitalizar si es la primera palabra return lowerWord.charAt(0).toUpperCase() + lowerWord.slice(1); } else { // Si es una palabra común que NO es un artículo/preposición de la lista, // y NO es la primera palabra, la minúsculas (comportamiento actual). return lowerWord; } } // Prioridad 7: Capitalización Estándar (Regla Por Defecto) let wordWithoutPunctuation = word.endsWith('.') ? word.slice(0, -1) : word; let result = wordWithoutPunctuation.charAt(0).toUpperCase() + wordWithoutPunctuation.slice(1).toLowerCase(); console.log(`[WME PLN - NWI] Aplicando Prioridad 7 (Capitalización Estándar). Resultado: "${result}"`); // LOG Capitalización estándar return result; }//normalizeWordInternal window.normalizeWordInternal = normalizeWordInternal; // Maneja la capitalización de palabras que contienen un apóstrofe. function handleApostropheWord(word) { const parts = word.split("'"); // Solo aplica si hay exactamente un apóstrofe. if (parts.length === 2) { const before = parts[0]; const after = parts[1]; if (after.toLowerCase() === 's') { // Caso posesivo como McDonald's, la 's' va en minúscula. return before + "'s"; } else { // Caso como Q'Menú, se capitaliza la parte después del apóstrofe. const capitalizedAfter = after.charAt(0).toUpperCase() + after.slice(1).toLowerCase(); return before + "'" + capitalizedAfter; } } // Si no es un caso manejable, devuelve la palabra original para que la procesen otras reglas. return word; }// handleApostropheWord // Función para crear un dropdown de categorías function createCategoryDropdown(currentCategoryKey, rowIndex, venue) { const select = document.createElement("select"); select.style.padding = "4px"; select.style.borderRadius = "4px"; select.style.fontSize = "12px"; select.title = "Selecciona una categoría"; select.id = `categoryDropdown-${rowIndex}`; Object.entries(categoryIcons).forEach(([key, value]) => { const option = document.createElement("option"); option.value = key; option.textContent = `${value.icon} ${value.en}`; if (key === currentCategoryKey) option.selected = true; select.appendChild(option); }); // Evento: al cambiar la categoría select.addEventListener("change", (e) => { const selectedCategory = e.target.value; if (!venue || !venue.model || !venue.model.attributes) { //console.error("[WME_PLN] Venue inválido al intentar actualizar la categoría"); return; } // Actualizar la categoría en el modelo venue.model.attributes.categories = [selectedCategory]; venue.model.save(); // Mensaje opcional de confirmación WazeWrap.Alerts.success("Categoría actualizada", `Nueva categoría: ${categoryIcons[selectedCategory].en}`); }); return select; } // 3. La función postProcessQuotesAndParentheses (CORREGIDA de la respuesta anterior) function postProcessQuotesAndParentheses(text) { if (typeof text !== 'string') return text; // Normalizar contenido dentro de comillas dobles text = text.replace(/"([^"]*)"/g, (match, content) => { const trimmedContent = content.trim(); if (trimmedContent === "") return '""'; const wordsInside = trimmedContent.split(/\s+/).filter(w => w.length > 0); const normalizedWordsInside = wordsInside.map((singleWord, index) => { return normalizeWordInternal(singleWord, index === 0, true); // true para isInsideQuotesOrParentheses }).join(' '); return `"${normalizedWordsInside}"`; // Sin espacios extra }); // Normalizar contenido dentro de paréntesis text = text.replace(/\(([^)]*)\)/g, (match, content) => { const trimmedContent = content.trim(); if (trimmedContent === "") return '()'; const wordsInside = trimmedContent.split(/\s+/).filter(w => w.length > 0); const normalizedWordsInside = wordsInside.map((singleWord, index) => { return normalizeWordInternal(singleWord, index === 0, true); // true para isInsideQuotesOrParentheses }).join(' '); return `(${normalizedWordsInside})`; // Sin espacios extra }); return text.replace(/\s+/g, ' ').trim(); // Limpieza final general }// postProcessQuotesAndParentheses // === Palabras especiales === let excludedWords = new Set(); // Mantenemos el Set para facilitar el renderizado original let excludedWordsMap = new Map(); // Para la búsqueda optimizada let excludedPlaces = new Map(); // Nuevo Map para IDs de lugares excluidos let dictionaryWords = new Set(); // O window.dictionaryWords = new Set(); // === Palabras especiales === // --- ADICIÓN PARA DEPURACIÓN EN CONSOLA --- window.excludedWords = excludedWords; window.excludedWordsMap = excludedWordsMap; window.excludedPlaces = excludedPlaces; // Función para crear el gestor de palabras excluidas y lugares excluidos function createSpecialItemsManager(parentContainer) { const mainSection = document.createElement("div"); // <--- Nueva sección principal para la pestaña "Espe" mainSection.id = "specialItemsManagerSection"; mainSection.style.marginTop = "20px"; mainSection.style.borderTop = "1px solid #ccc"; mainSection.style.paddingTop = "10px"; // --- Dropdown para seleccionar el tipo de gestión --- const typeSelectorWrapper = document.createElement("div"); typeSelectorWrapper.style.marginBottom = "15px"; typeSelectorWrapper.style.textAlign = "center"; const typeSelectorLabel = document.createElement("label"); typeSelectorLabel.textContent = "Gestionar:"; typeSelectorLabel.style.marginRight = "10px"; typeSelectorLabel.style.fontWeight = "bold"; typeSelectorWrapper.appendChild(typeSelectorLabel); const typeSelector = document.createElement("select"); typeSelector.id = "specialTypeSelector"; typeSelector.style.padding = "5px"; typeSelector.style.borderRadius = "4px"; typeSelector.style.fontSize = "13px"; const optionWords = document.createElement("option"); optionWords.value = "words"; optionWords.textContent = "Palabras Especiales"; typeSelector.appendChild(optionWords); const optionPlaces = document.createElement("option"); optionPlaces.value = "places"; optionPlaces.textContent = "Lugares Excluidos"; typeSelector.appendChild(optionPlaces); typeSelectorWrapper.appendChild(typeSelector); mainSection.appendChild(typeSelectorWrapper); // Añadir a mainSection // --- Contenedores para las dos vistas --- const wordsView = document.createElement("div"); wordsView.id = "specialWordsView"; wordsView.style.display = "block"; // Visible por defecto const placesView = document.createElement("div"); placesView.id = "excludedPlacesView"; placesView.style.display = "none"; // Oculto por defecto mainSection.appendChild(wordsView); // Añadir a mainSection mainSection.appendChild(placesView); // Añadir a mainSection // *********************************************************************************** // INICIO DEL CONTENIDO DE LA VISTA DE PALABRAS ESPECIALES (Antigua createExcludedWordsManager) // *********************************************************************************** // Título de la sección const wordsTitle = document.createElement("h4"); wordsTitle.textContent = "Gestión de Palabras Especiales"; wordsTitle.style.fontSize = "15px"; wordsTitle.style.marginBottom = "10px"; wordsView.appendChild(wordsTitle); // AÑADIDO A wordsView // Contenedor para los controles de añadir palabra const addWordsControlsContainer = document.createElement("div"); // Renombrado para claridad addWordsControlsContainer.style.display = "flex"; addWordsControlsContainer.style.gap = "8px"; addWordsControlsContainer.style.marginBottom = "8px"; addWordsControlsContainer.style.alignItems = "center"; // Alinear verticalmente // Input para añadir nueva palabra o frase const wordsInput = document.createElement("input"); // Renombrado para claridad wordsInput.type = "text"; wordsInput.placeholder = "Nueva palabra o frase"; wordsInput.style.flexGrow = "1"; wordsInput.style.padding = "6px"; wordsInput.style.border = "1px solid #ccc"; wordsInput.style.borderRadius = "3px"; addWordsControlsContainer.appendChild(wordsInput); // AÑADIDO A addWordsControlsContainer // Botón para añadir la palabra const addWordBtn = document.createElement("button"); // Renombrado para claridad addWordBtn.textContent = "Añadir"; addWordBtn.style.padding = "6px 10px"; addWordBtn.style.cursor = "pointer"; // Añadir tooltip al botón addWordBtn.addEventListener("click", function () { const newWord = wordsInput.value.trim(); // Usa wordsInput const validation = isValidExcludedWord(newWord); if (!validation.valid) { alert(validation.msg); return; } excludedWords.add(newWord); const firstCharNew = newWord.charAt(0).toLowerCase(); if (!excludedWordsMap.has(firstCharNew)) { excludedWordsMap.set(firstCharNew, new Set()); } excludedWordsMap.get(firstCharNew).add(newWord); wordsInput.value = ""; // Limpia wordsInput renderExcludedWordsList(document.getElementById("excludedWordsList")); saveExcludedWordsToLocalStorage(); }); addWordsControlsContainer.appendChild(addWordBtn); // AÑADIDO A addWordsControlsContainer wordsView.appendChild(addWordsControlsContainer); // AÑADIDO A wordsView // Contenedor para los botones de acción (Exportar/Limpiar para Palabras) const wordsActionButtonsContainer = document.createElement("div"); // Renombrado wordsActionButtonsContainer.style.display = "flex"; wordsActionButtonsContainer.style.gap = "8px"; wordsActionButtonsContainer.style.marginBottom = "10px"; const exportWordsBtn = document.createElement("button"); // Renombrado exportWordsBtn.textContent = "Exportar"; exportWordsBtn.title = "Exportar Lista a XML"; exportWordsBtn.style.padding = "6px 10px"; exportWordsBtn.style.cursor = "pointer"; exportWordsBtn.addEventListener("click", () => exportSharedDataToXml("words")); // Pasa el tipo wordsActionButtonsContainer.appendChild(exportWordsBtn); // AÑADIDO A wordsActionButtonsContainer const clearWordsBtn = document.createElement("button"); // Renombrado clearWordsBtn.textContent = "Limpiar"; clearWordsBtn.title = "Limpiar toda la lista"; clearWordsBtn.style.padding = "6px 10px"; clearWordsBtn.style.cursor = "pointer"; clearWordsBtn.addEventListener("click", function () { if (confirm("¿Estás seguro de que deseas eliminar TODAS las palabras de la lista?")) { excludedWords.clear(); excludedWordsMap.clear(); renderExcludedWordsList(document.getElementById("excludedWordsList")); saveExcludedWordsToLocalStorage(); } }); wordsActionButtonsContainer.appendChild(clearWordsBtn); // AÑADIDO A wordsActionButtonsContainer wordsView.appendChild(wordsActionButtonsContainer); // AÑADIDO A wordsView // Contenedor para la lista de palabras excluidas (buscador y UL) const wordsSearchInput = document.createElement("input"); // Renombrado wordsSearchInput.type = "text"; wordsSearchInput.placeholder = "Buscar en especiales..."; wordsSearchInput.style.display = "block"; wordsSearchInput.style.width = "calc(100% - 14px)"; wordsSearchInput.style.padding = "6px"; wordsSearchInput.style.border = "1px solid #ccc"; wordsSearchInput.style.borderRadius = "3px"; wordsSearchInput.style.marginBottom = "5px"; wordsSearchInput.addEventListener("input", () => { renderExcludedWordsList(document.getElementById("excludedWordsList"), wordsSearchInput.value.trim()); // Usa wordsSearchInput }); wordsView.appendChild(wordsSearchInput); // AÑADIDO A wordsView // UL para palabras excluidas const wordsListUL = document.createElement("ul"); // Renombrado wordsListUL.id = "excludedWordsList"; // Mantiene el ID original para compatibilidad con renderExcludedWordsList wordsListUL.style.maxHeight = "150px"; wordsListUL.style.overflowY = "auto"; wordsListUL.style.border = "1px solid #ddd"; wordsListUL.style.padding = "5px"; wordsListUL.style.margin = "0"; wordsListUL.style.background = "#fff"; wordsListUL.style.listStyle = "none"; wordsView.appendChild(wordsListUL); // AÑADIDO A wordsView // Drop Area para XML de palabras const wordsDropArea = document.createElement("div"); // Renombrado wordsDropArea.textContent = "Arrastra aquí el archivo XML de palabras especiales"; wordsDropArea.style.border = "2px dashed #ccc"; wordsDropArea.style.borderRadius = "4px"; wordsDropArea.style.padding = "15px"; wordsDropArea.style.marginTop = "10px"; wordsDropArea.style.textAlign = "center"; wordsDropArea.style.background = "#f9f9f9"; wordsDropArea.style.color = "#555"; wordsDropArea.addEventListener("dragover", (e) => { e.preventDefault(); wordsDropArea.style.background = "#e9e9e9"; wordsDropArea.style.borderColor = "#aaa"; }); wordsDropArea.addEventListener("dragleave", () => { wordsDropArea.style.background = "#f9f9f9"; wordsDropArea.style.borderColor = "#ccc"; }); wordsDropArea.addEventListener("drop", (e) => { e.preventDefault(); wordsDropArea.style.background = "#f9f9f9"; handleXmlFileDrop(e.dataTransfer.files[0], "words"); // Pasar el tipo de importación }); wordsView.appendChild(wordsDropArea); // AÑADIDO A wordsView // *********************************************************************************** // FIN DEL CONTENIDO DE LA VISTA DE PALABRAS ESPECIALES // *********************************************************************************** // *********************************************************************************** // INICIO DEL CONTENIDO DE LA VISTA DE LUGARES EXCLUIDOS (Nueva lógica) // *********************************************************************************** // Título de la sección const placesTitle = document.createElement("h4"); placesTitle.textContent = "Gestión de Lugares Excluidos"; placesTitle.style.fontSize = "15px"; placesTitle.style.marginBottom = "10px"; placesView.appendChild(placesTitle); // Controles de búsqueda y lista de lugares const placesSearchInput = document.createElement("input"); placesSearchInput.type = "text"; placesSearchInput.placeholder = "Buscar lugar excluido..."; placesSearchInput.style.display = "block"; placesSearchInput.style.width = "calc(100% - 14px)"; placesSearchInput.style.padding = "6px"; placesSearchInput.style.border = "1px solid #ccc"; placesSearchInput.style.borderRadius = "3px"; placesSearchInput.style.marginBottom = "5px"; placesSearchInput.addEventListener("input", () => { renderExcludedPlacesList(document.getElementById("excludedPlacesListUL"), placesSearchInput.value.trim()); }); placesView.appendChild(placesSearchInput); const placesListUL = document.createElement("ul"); placesListUL.id = "excludedPlacesListUL"; // Nuevo ID para la lista de Places placesListUL.style.maxHeight = "200px"; // Un poco más grande placesListUL.style.overflowY = "auto"; placesListUL.style.border = "1px solid #ddd"; placesListUL.style.padding = "5px"; placesListUL.style.margin = "0"; placesListUL.style.background = "#fff"; placesListUL.style.listStyle = "none"; placesView.appendChild(placesListUL); // Botones de acción para Lugares Excluidos const placesActionButtonsContainer = document.createElement("div"); placesActionButtonsContainer.style.display = "flex"; placesActionButtonsContainer.style.gap = "8px"; placesActionButtonsContainer.style.marginTop = "10px"; const exportPlacesBtn = document.createElement("button"); exportPlacesBtn.textContent = "Exportar"; exportPlacesBtn.title = "Exportar Lugares Excluidos a XML"; exportPlacesBtn.style.padding = "6px 10px"; exportPlacesBtn.style.cursor = "pointer"; exportPlacesBtn.addEventListener("click", () => exportSharedDataToXml("places")); // Pasa el tipo placesActionButtonsContainer.appendChild(exportPlacesBtn); const clearPlacesBtn = document.createElement("button"); clearPlacesBtn.textContent = "Limpiar"; clearPlacesBtn.title = "Limpiar lista de lugares excluidos"; clearPlacesBtn.style.padding = "6px 10px"; clearPlacesBtn.style.cursor = "pointer"; clearPlacesBtn.addEventListener("click", () => { if (confirm("¿Estás seguro de que deseas eliminar TODOS los lugares de la lista?")) { excludedPlaces.clear(); renderExcludedPlacesList(document.getElementById("excludedPlacesListUL")); saveExcludedPlacesToLocalStorage(); } }); placesActionButtonsContainer.appendChild(clearPlacesBtn); placesView.appendChild(placesActionButtonsContainer); // Drop Area para XML de Lugares Excluidos const placesDropArea = document.createElement("div"); placesDropArea.textContent = "Arrastra aquí el archivo XML de lugares excluidos"; placesDropArea.style.border = "2px dashed #ccc"; placesDropArea.style.borderRadius = "4px"; placesDropArea.style.padding = "15px"; placesDropArea.style.marginTop = "10px"; placesDropArea.style.textAlign = "center"; placesDropArea.style.background = "#f9f9f9"; placesDropArea.style.color = "#555"; placesDropArea.addEventListener("dragover", (e) => { e.preventDefault(); placesDropArea.style.background = "#e9e9e9"; placesDropArea.style.borderColor = "#aaa"; }); placesDropArea.addEventListener("dragleave", () => { placesDropArea.style.background = "#f9f9f9"; placesDropArea.style.borderColor = "#ccc"; }); placesDropArea.addEventListener("drop", (e) => { e.preventDefault(); placesDropArea.style.background = "#f9f9f9"; handleXmlFileDrop(e.dataTransfer.files[0], "places"); // Pasa el tipo de importación }); placesView.appendChild(placesDropArea); // *********************************************************************************** // FIN DEL CONTENIDO DE LA VISTA DE LUGARES EXCLUIDOS // *********************************************************************************** // --- Lógica de alternancia del selector --- typeSelector.addEventListener("change", () => { if (typeSelector.value === "words") { wordsView.style.display = "block"; placesView.style.display = "none"; renderExcludedWordsList(document.getElementById("excludedWordsList"), wordsSearchInput.value.trim()); // Renderiza lista de palabras } else { wordsView.style.display = "none"; placesView.style.display = "block"; renderExcludedPlacesList(document.getElementById("excludedPlacesListUL"), placesSearchInput.value.trim()); // Renderiza lista de lugares } }); // --- Renderizado inicial de las listas al cargar --- renderExcludedWordsList(wordsListUL, ""); // Usa la referencia directa a wordsListUL renderExcludedPlacesList(placesListUL, ""); // Usa la referencia directa a placesListUL parentContainer.appendChild(mainSection); // <--- AÑADE SOLO ESTA SECCIÓN PRINCIPAL AL PARENT CONTAINER } // === Diccionario === function createDictionaryManager(parentContainer) { const section = document.createElement("div"); section.id = "dictionaryManagerSection"; section.style.marginTop = "20px"; section.style.borderTop = "1px solid #ccc"; section.style.paddingTop = "10px"; // Título de la sección const title = document.createElement("h4"); title.textContent = "Gestión del Diccionario"; title.style.fontSize = "15px"; title.style.marginBottom = "10px"; section.appendChild(title); // Contenedor para los controles de añadir palabra const addControlsContainer = document.createElement("div"); addControlsContainer.style.display = "flex"; addControlsContainer.style.gap = "8px"; addControlsContainer.style.marginBottom = "8px"; addControlsContainer.style.alignItems = "center"; // Alinear verticalmente // Input para añadir nueva palabra const input = document.createElement("input"); input.type = "text"; input.placeholder = "Nueva palabra"; input.style.flexGrow = "1"; input.style.padding = "6px"; // Mejor padding input.style.border = "1px solid #ccc"; input.style.borderRadius = "3px"; addControlsContainer.appendChild(input); // Botón para añadir la palabra const addBtn = document.createElement("button"); addBtn.textContent = "Añadir"; addBtn.style.padding = "6px 10px"; // Mejor padding addBtn.style.cursor = "pointer"; addBtn.addEventListener("click", function () { const newWord = input.value.trim(); if (newWord) { const lowerNewWord = newWord.toLowerCase(); const alreadyExists = Array.from(window.dictionaryWords).some(w => w.toLowerCase() === lowerNewWord); if (commonWords.includes(lowerNewWord)) { alert("La palabra es muy común y no debe agregarse a la lista."); return; } if (alreadyExists) { alert("La palabra ya está en la lista."); return; } window.dictionaryWords.add(lowerNewWord); input.value = ""; renderDictionaryList(document.getElementById("dictionaryWordsList")); } }); // Añadir tooltip al botón addControlsContainer.appendChild(addBtn); section.appendChild(addControlsContainer); // Contenedor para los botones de acción const actionButtonsContainer = document.createElement("div"); actionButtonsContainer.style.display = "flex"; actionButtonsContainer.style.gap = "8px"; actionButtonsContainer.style.marginBottom = "10px"; // Más espacio // Botón para importar desde XML const exportBtn = document.createElement("button"); exportBtn.textContent = "Exportar"; // Más corto exportBtn.title = "Exportar Diccionario a XML"; exportBtn.style.padding = "6px 10px"; exportBtn.style.cursor = "pointer"; exportBtn.addEventListener("click", exportDictionaryWordsList); actionButtonsContainer.appendChild(exportBtn); // Botón para importar desde XML const clearBtn = document.createElement("button"); clearBtn.textContent = "Limpiar"; // Más corto clearBtn.title = "Limpiar toda la lista"; clearBtn.style.padding = "6px 10px"; clearBtn.style.cursor = "pointer"; clearBtn.addEventListener("click", function () { if (confirm("¿Estás seguro de que deseas eliminar TODAS las palabras del diccionario?")) { window.dictionaryWords.clear(); renderDictionaryList(document.getElementById("dictionaryWordsList")); // Pasar el elemento UL } }); actionButtonsContainer.appendChild(clearBtn); section.appendChild(actionButtonsContainer); // Diccionario: búsqueda const search = document.createElement("input"); search.type = "text"; search.placeholder = "Buscar en diccionario..."; search.style.display = "block"; search.style.width = "calc(100% - 14px)"; search.style.padding = "6px"; search.style.border = "1px solid #ccc"; search.style.borderRadius = "3px"; search.style.marginTop = "5px"; // On search input, render filtered list search.addEventListener("input", () => { renderDictionaryList(document.getElementById("dictionaryWordsList"),search.value.trim()); }); section.appendChild(search); // Lista UL para mostrar palabras del diccionario const listContainerElement = document.createElement("ul"); listContainerElement.id = "dictionaryWordsList"; listContainerElement.style.maxHeight = "150px"; listContainerElement.style.overflowY = "auto"; listContainerElement.style.border = "1px solid #ddd"; listContainerElement.style.padding = "5px"; listContainerElement.style.margin = "0"; listContainerElement.style.background = "#fff"; listContainerElement.style.listStyle = "none"; section.appendChild(listContainerElement); // Renderizar la lista de palabras del diccionario const dropArea = document.createElement("div"); dropArea.textContent = "Arrastra aquí el archivo XML del diccionario"; dropArea.style.border = "2px dashed #ccc"; dropArea.style.borderRadius = "4px"; dropArea.style.padding = "15px"; dropArea.style.marginTop = "10px"; dropArea.style.textAlign = "center"; dropArea.style.background = "#f9f9f9"; dropArea.style.color = "#555"; // Añadir eventos de arrastrar y soltar dropArea.addEventListener("dragover", (e) => { e.preventDefault(); dropArea.style.background = "#e9e9e9"; dropArea.style.borderColor = "#aaa"; }); // Evento para cuando el ratón sale del área de arrastre dropArea.addEventListener("dragleave", () => { dropArea.style.background = "#f9f9f9"; dropArea.style.borderColor = "#ccc"; }); // Evento para cuando se suelta el archivo dropArea.addEventListener("drop", (e) => { e.preventDefault(); dropArea.style.background = "#f9f9f9"; dropArea.style.borderColor = "#ccc"; const file = e.dataTransfer.files[0]; if (file && (file.type === "text/xml" || file.name.endsWith(".xml"))) { const reader = new FileReader(); reader.onload = function (evt) { try { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(evt.target.result, "application/xml"); const parserError = xmlDoc.querySelector("parsererror"); if (parserError) { console.error("[WME PLN] Error parseando XML:", parserError.textContent); alert("Error al parsear el archivo XML del diccionario."); return; } const xmlWords = xmlDoc.querySelectorAll("word"); let newWordsAddedCount = 0; for (let i = 0; i < xmlWords.length; i++) { const val = xmlWords[i].textContent.trim(); if (val && !window.dictionaryWords.has(val)) { window.dictionaryWords.add(val); newWordsAddedCount++; } } if (newWordsAddedCount > 0) console.log(`[WME PLN] ${newWordsAddedCount} nuevas palabras añadidas desde XML.`); // Renderizar la lista en el panel renderDictionaryList(listContainerElement); } catch (err) { alert("Error procesando el diccionario XML."); } }; reader.readAsText(file); } else { alert("Por favor, arrastra un archivo XML válido."); } }); section.appendChild(dropArea); parentContainer.appendChild(section); renderDictionaryList(listContainerElement); }// createDictionaryManager // Carga las palabras excluidas desde localStorage function loadReplacementWordsFromStorage() { const savedReplacements = localStorage.getItem("replacementWordsList"); if (savedReplacements) { try { replacementWords = JSON.parse(savedReplacements); if (typeof replacementWords !== 'object' || replacementWords === null) { // Asegurar que sea un objeto replacementWords = {}; } } catch (e) { console.error("[WME PLN] Error cargando lista de reemplazos desde localStorage:", e); replacementWords = {}; } } else { replacementWords = {}; // Inicializar si no hay nada guardado } console.log("[WME PLN] Reemplazos cargados:", Object.keys(replacementWords).length, "reglas."); }// loadReplacementWordsFromStorage // Carga las palabras excluidas desde localStorage function saveSwapWordsToStorage() { localStorage.setItem("swapWords", JSON.stringify(window.swapWords || [])); }// saveSwapWordsToStorage // Carga las palabras reemplazo function saveReplacementWordsToStorage() { try { localStorage.setItem("replacementWordsList", JSON.stringify(replacementWords)); // console.log("[WME PLN] Lista de reemplazos guardada en localStorage."); } catch (e) { console.error("[WME PLN] Error guardando lista de reemplazos en localStorage:", e); } }// saveReplacementWordsToStorage // Carga las palabras excluidas desde localStorage function saveExcludedWordsToLocalStorage() { try { localStorage.setItem("excludedWordsList", JSON.stringify(Array.from(excludedWords))); // console.log("[WME PLN] Lista de palabras especiales guardada en localStorage."); } catch (e) { console.error("[WME PLN] Error guardando palabras especiales en localStorage:", e); } }// saveExcludedWordsToLocalStorage // Función para guardar los IDs de lugares excluidos en localStorage function saveExcludedPlacesToLocalStorage() { try { // Convertir el Map a un array de arrays antes de stringify localStorage.setItem("excludedPlacesList", JSON.stringify(Array.from(excludedPlaces.entries()))); console.log('[WME PLN] Lugares excluidos GUARDADOS EXITOSAMENTE.'); } catch (e) { console.error('[WME PLN] Error guardando lugares excluidos en localStorage:', e); } }// saveExcludedPlacesToLocalStorage // Renderiza la lista de reemplazos function renderReplacementsList(ulElement) { //console.log("[WME_PLN][DEBUG] renderReplacementsList llamada para:", ulElement ? ulElement.id : "Elemento UL nulo"); if (!ulElement) { //console.error("[WME PLN] Elemento UL para reemplazos no proporcionado a renderReplacementsList."); return; } ulElement.innerHTML = ""; // Limpiar lista actual const entries = Object.entries(replacementWords); // Si no hay reemplazos, mostrar mensaje if (entries.length === 0) { const li = document.createElement("li"); li.textContent = "No hay reemplazos definidos."; li.style.textAlign = "center"; li.style.color = "#777"; li.style.padding = "5px"; ulElement.appendChild(li); return; } // Ordenar alfabéticamente por la palabra original (from) entries.sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase())); entries.forEach(([from, to]) => { const li = document.createElement("li"); li.style.display = "flex"; li.style.justifyContent = "space-between"; li.style.alignItems = "center"; li.style.padding = "4px 2px"; li.style.borderBottom = "1px solid #f0f0f0"; // Añadir un tooltip al elemento li const textContainer = document.createElement("div"); textContainer.style.flexGrow = "1"; textContainer.style.overflow = "hidden"; textContainer.style.textOverflow = "ellipsis"; textContainer.style.whiteSpace = "nowrap"; textContainer.title = `Reemplazar "${from}" con "${to}"`; // Crear los spans para mostrar el texto const fromSpan = document.createElement("span"); fromSpan.textContent = from; fromSpan.style.fontWeight = "bold"; textContainer.appendChild(fromSpan); // Añadir un espacio entre el "from" y el "to" const arrowSpan = document.createElement("span"); arrowSpan.textContent = " → "; arrowSpan.style.margin = "0 5px"; textContainer.appendChild(arrowSpan); // Span para el texto de reemplazo const toSpan = document.createElement("span"); toSpan.textContent = to; toSpan.style.color = "#007bff"; textContainer.appendChild(toSpan); // Añadir el contenedor de texto al li li.appendChild(textContainer); // Botón Editar const editBtn = document.createElement("button"); editBtn.innerHTML = "✏️"; editBtn.title = "Editar este reemplazo"; editBtn.style.border = "none"; editBtn.style.background = "transparent"; editBtn.style.cursor = "pointer"; editBtn.style.padding = "2px 4px"; editBtn.style.fontSize = "14px"; editBtn.style.marginLeft = "4px"; editBtn.addEventListener("click", () => { const newFrom = prompt("Editar texto original:", from); if (newFrom === null) return; const newTo = prompt("Editar texto de reemplazo:", to); if (newTo === null) return; if (!newFrom.trim()) { alert("El campo 'Texto Original' es requerido."); return; } if (newFrom === newTo) { alert("El texto original y el de reemplazo no pueden ser iguales."); return; } // Si cambia la clave, elimina la anterior if (newFrom !== from) delete replacementWords[from]; replacementWords[newFrom] = newTo; renderReplacementsList(ulElement); saveReplacementWordsToStorage(); }); // Botón Eliminar const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "🗑️"; deleteBtn.title = `Eliminar este reemplazo`; deleteBtn.style.border = "none"; deleteBtn.style.background = "transparent"; deleteBtn.style.cursor = "pointer"; deleteBtn.style.padding = "2px 4px"; deleteBtn.style.fontSize = "14px"; deleteBtn.style.marginLeft = "4px"; deleteBtn.addEventListener("click", () => { if (confirm(`¿Estás seguro de eliminar el reemplazo:\n"${from}" → "${to}"?`)) { delete replacementWords[from]; renderReplacementsList(ulElement); saveReplacementWordsToStorage(); } }); // Contenedor para los botones de acción const btnContainer = document.createElement("span"); btnContainer.style.display = "flex"; btnContainer.style.gap = "4px"; btnContainer.appendChild(editBtn); btnContainer.appendChild(deleteBtn); // Añadir el contenedor de botones al li li.appendChild(btnContainer); ulElement.appendChild(li); }); } // Exporta las palabras especiales y reemplazos a un archivo XML function exportSharedDataToXml(type = "words") { let xmlParts = []; let rootTagName = "SharedData"; // Nombre de raíz por defecto, puede cambiar. let fileName = "wme_normalizer_data_export.xml"; if (type === "words") { rootTagName = "ExcludedWords"; fileName = "wme_excluded_words_export.xml"; if (excludedWords.size === 0 && Object.keys(replacementWords).length === 0 && (!window.swapWords || window.swapWords.length === 0) && Object.keys(editorStats).length === 0) { alert("No hay datos para Palabras Especiales (Excluidas, Reemplazos, SwapWords, Estadísticas) para exportar."); return; } // Exportar palabras especiales if (excludedWords.size > 0) { xmlParts.push(" <words>"); Array.from(excludedWords) .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())) .forEach(w => xmlParts.push(` <word>${xmlEscape(w)}</word>`)); xmlParts.push(" </words>"); } // Exportar reemplazos if (Object.keys(replacementWords).length > 0) { xmlParts.push(" <replacements>"); Object.entries(replacementWords) .sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase())) .forEach(([from, to]) => { xmlParts.push(` <replacement from="${xmlEscape(from)}">${xmlEscape(to)}</replacement>`); }); xmlParts.push(" </replacements>"); } // Exportar palabras de intercambio if (window.swapWords && window.swapWords.length > 0) { xmlParts.push(" <swapWords>"); window.swapWords.forEach(val => { xmlParts.push(` <swap value="${xmlEscape(val)}"/>`); }); xmlParts.push(" </swapWords>"); } // Exportar estadísticas con la nueva estructura de totales if (Object.keys(editorStats).length > 0) { xmlParts.push(" <statistics>"); Object.entries(editorStats).forEach(([userId, data]) => { // Escribe todos los contadores y periodos como atributos del editor xmlParts.push(` <editor id="${userId}" name="${xmlEscape(data.userName || '')}" total_count="${data.total_count || 0}" monthly_count="${data.monthly_count || 0}" monthly_period="${data.monthly_period || ''}" weekly_count="${data.weekly_count || 0}" weekly_period="${data.weekly_period || ''}" daily_count="${data.daily_count || 0}" daily_period="${data.daily_period || ''}" last_update="${data.last_update || 0}" />`); }); xmlParts.push(" </statistics>"); } else if (type === "places") { rootTagName = "ExcludedPlaces"; // Nuevo tag raíz para lugares fileName = "wme_excluded_places_export.xml"; if (excludedPlaces.size === 0) { alert("No hay Lugares Excluidos para exportar."); return; } // Exportar lugares excluidos xmlParts.push(" <placeIds>"); // Iterar sobre los entries del Map: [id, name] Array.from(excludedPlaces.entries()) .sort((a, b) => a[0].toLowerCase().localeCompare(b[0].toLowerCase())) // Ordenar por ID para consistencia en XML .forEach(([id, name]) => xmlParts.push(` <placeId id="${xmlEscape(id)}" name="${xmlEscape(name)}"></placeId>`)); // Guardar ID y nombre xmlParts.push(" </placeIds>"); } else { alert("Tipo de exportación XML desconocido."); return; } const xmlContent = `<?xml version="1.0" encoding="UTF-8"?>\n<${rootTagName}>\n${xmlParts.join("\n")}\n</${rootTagName}>`; const blob = new Blob([xmlContent], { type: "application/xml;charset=utf-8" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = fileName; // Usa el nombre de archivo dinámico document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } }//exportSharedDataToXml // Función para manejar el archivo XML arrastrado function handleXmlFileDrop(file, type = "words") { if (file && (file.type === "text/xml" || file.name.endsWith(".xml"))) { const reader = new FileReader(); reader.onload = function(evt) { try { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(evt.target.result, "application/xml"); const parserError = xmlDoc.querySelector("parsererror"); if (parserError) { alert("Error al parsear el archivo XML: " + parserError.textContent); return; } const rootTag = xmlDoc.documentElement.tagName.toLowerCase(); // ************************************************************ // INICIO MODIFICACIÓN DE LÓGICA DE IMPORTACIÓN // ************************************************************ if (type === "words") { if (rootTag !== "excludedwords") { alert("El archivo XML no es válido para Palabras Especiales. Debe tener <ExcludedWords> como raíz."); return; } let newExcludedAdded = 0; const words = xmlDoc.getElementsByTagName("word"); for (let i = 0; i < words.length; i++) { const val = words[i].textContent.trim(); if (val && !excludedWords.has(val)) { const validation = isValidExcludedWord(val); // <-- Asumiendo que isValidExcludedWord existe y es robusta if (validation.valid) { excludedWords.add(val); // Sincronizar excludedWordsMap en importación const firstChar = val.charAt(0).toLowerCase(); if (!excludedWordsMap.has(firstChar)) excludedWordsMap.set(firstChar, new Set()); excludedWordsMap.get(firstChar).add(val); newExcludedAdded++; } } } alert(`Importación completada para Palabras Especiales. Palabras nuevas: ${newExcludedAdded}`); saveExcludedWordsToLocalStorage(); const excludedListElement = document.getElementById("excludedWordsList"); if (excludedListElement) renderExcludedWordsList(excludedListElement); } else if (type === "places") { if (rootTag !== "excludedplaces") { alert("El archivo XML no es válido para Lugares Excluidos. Debe tener <ExcludedPlaces> como raíz."); return; } let newPlacesAdded = 0; const placesNodes = xmlDoc.getElementsByTagName("placeId"); // Asume <placeId id="..." name="..."></placeId> excludedPlaces = new Map(); // Reinicializa el Map para la importación for (let i = 0; i < placesNodes.length; i++) { const placeId = placesNodes[i].getAttribute("id")?.trim(); const placeName = placesNodes[i].textContent.trim(); // Nombre del contenido del tag if (placeId && !excludedPlaces.has(placeId)) { excludedPlaces.set(placeId, placeName); // Guarda ID y Nombre newPlacesAdded++; } } alert(`Importación completada para Lugares Excluidos. Lugares nuevos: ${newPlacesAdded}`); saveExcludedPlacesToLocalStorage(); const placesListElement = document.getElementById("excludedPlacesListUL"); if (placesListElement) renderExcludedPlacesList(placesListElement); } else { alert("Tipo de importación XML desconocido."); return; } // ************************************************************ // FIN MODIFICACIÓN DE LÓGICA DE IMPORTACIÓN // ************************************************************ // --- Mover lógica de reemplazos, swapWords, y estadísticas AQUI (si aún deben importarse desde este XML) --- // Tu código actual importa reemplazos, swapWords y estadísticas en CUALQUIER importación XML. // Necesitas decidir si estos también deben ser importados SÓLO si el rootTag es "excludedwords". // Por ahora, asumiré que los reemplazos, swapWords y estadísticas se importan sólo si el XML es de tipo "words". if (type === "words") { // Si este XML es para palabras, procesa también reemplazos y stats. const replacements = xmlDoc.getElementsByTagName("replacement"); let newReplacementsAdded = 0; let replacementsOverwritten = 0; for (let i = 0; i < replacements.length; i++) { const from = replacements[i].getAttribute("from")?.trim(); const to = replacements[i].textContent.trim(); if (from && to) { if (replacements.hasOwnProperty(from) && replacements[from] !== to) { replacementsOverwritten++; } else if (!replacements.hasOwnProperty(from)) { newReplacementsAdded++; } replacements[from] = to; } } saveReplacementWordsToStorage(); // Guardar reemplazos const replacementsListElement = document.getElementById("replacementsListElementID"); if (replacementsListElement) renderReplacementsList(replacementsListElement); const swapWordsNode = xmlDoc.querySelector("swapWords"); if (swapWordsNode) { if (!window.swapWords) window.swapWords = []; window.swapWords = []; // Limpiar antes de importar nuevos swapWordsNode.querySelectorAll("swap").forEach(swapNode => { const value = swapNode.getAttribute("value"); if (value && !window.swapWords.includes(value)) { window.swapWords.push(value); } }); saveSwapWordsToStorage(); // Guardar swapWords } // Lógica de importación de estadísticas (tal como la tienes) const statsNode = xmlDoc.querySelector("statistics"); if (statsNode) { const editorNode = statsNode.querySelector("editor"); if (editorNode) { // Detectar si el XML tiene el formato nuevo (con atributos de conteo) o el viejo (con eventos) if (editorNode.hasAttribute("total_count")) { // --- Formato Nuevo: Importar los totales --- if (!currentGlobalUserInfo.id || currentGlobalUserInfo.name === 'No detectado') { showTemporaryMessage("Espera a que tu usuario se cargue para importar estadísticas.", 5000, "error"); } else if (editorNode.getAttribute("id") === String(currentGlobalUserInfo.id)) { editorStats[currentGlobalUserInfo.id] = { userName: editorNode.getAttribute("name") || currentGlobalUserInfo.name, total_count: parseInt(editorNode.getAttribute("total_count"), 10) || 0, monthly_count: parseInt(editorNode.getAttribute("monthly_count"), 10) || 0, monthly_period: editorNode.getAttribute("monthly_period") || '', weekly_count: parseInt(editorNode.getAttribute("weekly_count"), 10) || 0, weekly_period: editorNode.getAttribute("weekly_period") || '', daily_count: parseInt(editorNode.getAttribute("daily_count"), 10) || 0, daily_period: editorNode.getAttribute("daily_period") || '', last_update: parseInt(editorNode.getAttribute("last_update"), 10) || 0 }; // 2. Marcar como exitosa la importación de estadísticas statsImportedSuccessfully = true; } } else { // --- Formato Viejo: Ignorar y advertir para no borrar datos --- showTemporaryMessage("XML con formato de estadísticas antiguo detectado. Se omitió la importación de estadísticas para no borrar tus datos actuales.", 6000, "warning"); } } } // Guardar y Re-renderizar todo saveExcludedWordsToLocalStorage(); saveReplacementWordsToStorage(); saveEditorStats(); // Guardar estadísticas updateStatsDisplay(); } // Mensaje de resumen final. // Adapta este alert para reflejar lo que se importó realmente. // alert(`Importación completada para tipo ${type}. ...`); } catch (err) { console.error("[WME PLN] Error procesando el archivo XML importado:", err); alert("Ocurrió un error procesando el archivo XML."); } }; reader.readAsText(file); } else { alert("Por favor, arrastra un archivo XML válido."); } }//handleXmlFileDrop // Bloquea todos los controles de la pestaña principal durante el escaneo function disableScanControls() { const idsToDisable = [ 'pln-start-scan-btn', 'maxPlacesInput', 'chk-recommend-categories', 'chk-avoid-my-edits', 'dateFilterSelect', 'chk-enable-stats' ]; // Deshabilitar los controles principales idsToDisable.forEach(id => { const el = document.getElementById(id); if (el) { el.disabled = true; el.style.opacity = '0.6'; el.style.cursor = 'not-allowed'; } }); // Deshabilitar los botones de presets document.querySelectorAll('.pln-preset-btn').forEach(btn => { btn.disabled = true; btn.style.opacity = '0.6'; btn.style.cursor = 'not-allowed'; }); }// disableScanControls // Reactiva todos los controles de la pestaña principal al finalizar el escaneo function enableScanControls() { const idsToEnable = [ 'pln-start-scan-btn', 'maxPlacesInput', 'chk-recommend-categories', 'chk-avoid-my-edits', 'dateFilterSelect', 'chk-enable-stats' ]; // Reactivar los controles principales idsToEnable.forEach(id => { const el = document.getElementById(id); if (el) { el.disabled = false; el.style.opacity = '1'; el.style.cursor = 'pointer'; } }); // Reactivar los botones de presets document.querySelectorAll('.pln-preset-btn').forEach(btn => { btn.disabled = false; btn.style.opacity = '1'; btn.style.cursor = 'pointer'; }); // Restaurar el estado del dropdown de fecha según el checkbox const avoidMyEditsCheckbox = document.getElementById("chk-avoid-my-edits"); if (avoidMyEditsCheckbox) { const dateFilterRow = document.getElementById("dateFilterSelect").parentElement; dateFilterRow.style.opacity = avoidMyEditsCheckbox.checked ? "1" : "0.5"; dateFilterRow.style.pointerEvents = avoidMyEditsCheckbox.checked ? "auto" : "none"; } }// enableScanControls // Carga las palabras swap desde localStorage function loadSwapWordsFromStorage() { const stored = localStorage.getItem("swapWords"); // Si hay datos en localStorage, intentar parsearlos if (stored) { try { window.swapWords = JSON.parse(stored); } catch (e) { window.swapWords = []; } } else { window.swapWords = []; } }// loadSwapWordsFromStorage // Función para calcular el área en metros cuadrados de una geometría de polígono usando Turf.js function calculateAreaMeters(venueSDK) { if (!venueSDK || !venueSDK.geometry || !venueSDK.geometry.coordinates || !venueSDK.geometry.type) { //console.warn("[WME PLN] calculateAreaMeters: venueSDK inválido o sin datos de geometría."); return null; } // Asegurarse de que turf esté disponible if (typeof turf === 'undefined') { console.error("[WME PLN] calculateAreaMeters: La librería Turf.js no está cargada. No se puede calcular el área."); return null; } // La geometría del SDK ya viene en formato GeoJSON. // 'venueSDK.geometry.type' puede ser 'Point', 'LineString', 'Polygon', etc. if (venueSDK.geometry.type !== 'Polygon' && venueSDK.geometry.type !== 'MultiPolygon') { // Solo calculamos área para polígonos. Los puntos y líneas no tienen área significativa en este contexto. //console.log("[WME PLN] calculateAreaMeters: Geometría no es Polygon/MultiPolygon (tipo: " + venueSDK.geometry.type + ")."); return null; } try { // Crear un objeto Feature de GeoJSON para Turf.js const polygonFeature = { type: "Feature", geometry: venueSDK.geometry, properties: {} }; // turf.area() calcula el área en metros cuadrados por defecto. const areaSquareMeters = turf.area(polygonFeature); // if (typeof areaSquareMeters === 'number' && !isNaN(areaSquareMeters)) { return areaSquareMeters; } } catch (e) { console.error("[WME PLN] calculateAreaMeters: Error al calcular el área del polígono con Turf.js:", e); } return null; } // Crea el gestor de reemplazos function createReplacementsManager(parentContainer) { loadSwapWordsFromStorage(); parentContainer.innerHTML = ''; // Limpiar por si acaso // --- Contenedor principal --- const title = document.createElement("h4"); title.textContent = "Gestión de Reemplazos"; title.style.fontSize = "15px"; title.style.marginBottom = "10px"; parentContainer.appendChild(title); // --- Dropdown de modo de reemplazo --- const modeSelector = document.createElement("select"); modeSelector.id = "replacementModeSelector"; modeSelector.style.marginBottom = "10px"; modeSelector.style.marginTop = "5px"; // Añadir opciones al selector const optionWords = document.createElement("option"); optionWords.value = "words"; optionWords.textContent = "Reemplazos de palabras"; modeSelector.appendChild(optionWords); // Añadir opción para swap const optionSwap = document.createElement("option"); optionSwap.value = "swapStart"; optionSwap.textContent = "Palabras al inicio (swap)"; modeSelector.appendChild(optionSwap); parentContainer.appendChild(modeSelector); //Contenedor para reemplazos y controles const replacementsContainer = document.createElement("div"); replacementsContainer.id = "replacementsContainer"; // Sección para añadir nuevos reemplazos const addSection = document.createElement("div"); addSection.style.display = "flex"; addSection.style.gap = "8px"; addSection.style.marginBottom = "12px"; addSection.style.alignItems = "flex-end"; // Alinear inputs y botón // Contenedores para inputs de texto const fromInputContainer = document.createElement("div"); fromInputContainer.style.flexGrow = "1"; const fromLabel = document.createElement("label"); fromLabel.textContent = "Texto Original:"; fromLabel.style.display = "block"; fromLabel.style.fontSize = "12px"; fromLabel.style.marginBottom = "2px"; // Input para el texto original const fromInput = document.createElement("input"); fromInput.type = "text"; fromInput.placeholder = "Ej: Urb."; fromInput.style.width = "95%"; // Para que quepa bien fromInput.style.padding = "6px"; fromInput.style.border = "1px solid #ccc"; // Añadir label e input al contenedor fromInputContainer.appendChild(fromLabel); fromInputContainer.appendChild(fromInput); addSection.appendChild(fromInputContainer); // Contenedor para el texto de reemplazo const toInputContainer = document.createElement("div"); toInputContainer.style.flexGrow = "1"; const toLabel = document.createElement("label"); toLabel.textContent = "Texto de Reemplazo:"; toLabel.style.display = "block"; toLabel.style.fontSize = "12px"; toLabel.style.marginBottom = "2px"; // Input para el texto de reemplazo const toInput = document.createElement("input"); toInput.type = "text"; toInput.placeholder = "Ej: Urbanización"; toInput.style.width = "95%"; toInput.style.padding = "6px"; toInput.style.border = "1px solid #ccc"; toInputContainer.appendChild(toLabel); toInputContainer.appendChild(toInput); addSection.appendChild(toInputContainer); // Atributos para evitar corrección ortográfica fromInput.setAttribute('spellcheck', 'false'); toInput.setAttribute('spellcheck', 'false'); // Botón para añadir el reemplazo const addReplacementBtn = document.createElement("button"); addReplacementBtn.textContent = "Añadir"; addReplacementBtn.style.padding = "6px 10px"; addReplacementBtn.style.cursor = "pointer"; addReplacementBtn.style.height = "30px"; // Para alinear con los inputs addSection.appendChild(addReplacementBtn); // Elemento UL para la lista de reemplazos const listElement = document.createElement("ul"); listElement.id = "replacementsListElementID"; // ID ÚNICO para esta lista listElement.style.maxHeight = "150px"; listElement.style.overflowY = "auto"; listElement.style.border = "1px solid #ddd"; listElement.style.padding = "8px"; listElement.style.margin = "0 0 10px 0"; listElement.style.background = "#fff"; listElement.style.listStyle = "none"; // Event listener para el botón "Añadir" addReplacementBtn.addEventListener("click", () => { const fromValue = fromInput.value.trim(); const toValue = toInput.value.trim(); if (!fromValue) { alert("El campo 'Texto Original' es requerido."); return; } // Validar que no sea solo caracteres especiales if (fromValue === toValue) { alert("El texto original y el de reemplazo no pueden ser iguales."); return; } // Validar que no sea solo caracteres especiales if (replacementWords.hasOwnProperty(fromValue) && replacementWords[fromValue] !== toValue) { if (!confirm(`El reemplazo para "${fromValue}" ya existe ('${replacementWords[fromValue]}'). ¿Deseas sobrescribirlo con '${toValue}'?`)) return; } replacementWords[fromValue] = toValue; fromInput.value = ""; toInput.value = ""; // Renderiza toda la lista (más seguro y rápido en la práctica) renderReplacementsList(listElement); saveReplacementWordsToStorage(); }); // Botones de Acción y Drop Area (usarán la lógica compartida) const actionButtonsContainer = document.createElement("div"); actionButtonsContainer.style.display = "flex"; actionButtonsContainer.style.gap = "8px"; actionButtonsContainer.style.marginBottom = "10px"; // Botones de acción const exportButton = document.createElement("button"); exportButton.textContent = "Exportar Todo"; exportButton.title = "Exportar Excluidas y Reemplazos a XML"; exportButton.style.padding = "6px 10px"; exportButton.addEventListener("click", exportSharedDataToXml); // Llamar a la función compartida actionButtonsContainer.appendChild(exportButton); // Botón para exportar solo reemplazos const clearButton = document.createElement("button"); clearButton.textContent = "Limpiar Reemplazos"; clearButton.title = "Limpiar solo la lista de reemplazos"; clearButton.style.padding = "6px 10px"; clearButton.addEventListener("click", () => { if (confirm("¿Estás seguro de que deseas eliminar TODOS los reemplazos definidos?")) { replacementWords = {}; saveReplacementWordsToStorage(); renderReplacementsList(listElement); } }); actionButtonsContainer.appendChild(clearButton); // Botón para importar desde XML const dropArea = document.createElement("div"); dropArea.textContent = "Arrastra aquí el archivo XML (contiene Excluidas y Reemplazos)"; dropArea.style.border = "2px dashed #ccc"; dropArea.style.borderRadius = "4px"; dropArea.style.padding = "15px"; dropArea.style.marginTop = "10px"; dropArea.style.textAlign = "center"; dropArea.style.background = "#f9f9f9"; dropArea.style.color = "#555"; // Añadir estilos para el drop area dropArea.addEventListener("dragover", (e) => { e.preventDefault(); dropArea.style.background = "#e9e9e9"; }); // Cambiar el fondo al salir del área de arrastre dropArea.addEventListener("dragleave", () => { dropArea.style.background = "#f9f9f9"; }); // Manejar el evento de drop dropArea.addEventListener("drop", (e) => { e.preventDefault(); dropArea.style.background = "#f9f9f9"; handleXmlFileDrop(e.dataTransfer.files[0]); }); // --- Ensamblar en replacementsContainer --- replacementsContainer.appendChild(addSection); replacementsContainer.appendChild(listElement); replacementsContainer.appendChild(actionButtonsContainer); replacementsContainer.appendChild(dropArea); parentContainer.appendChild(replacementsContainer); // --- Contenedor para swapStart/frases al inicio --- const swapContainer = document.createElement("div"); swapContainer.id = "swapContainer"; swapContainer.style.display = "none"; // Título y explicación del swap const swapTitle = document.createElement("h4"); swapTitle.textContent = "Palabras al inicio"; // Estilo del título const swapExplanationBox = document.createElement("div"); swapExplanationBox.style.background = "#f4f8ff"; swapExplanationBox.style.borderLeft = "4px solid #2d6df6"; swapExplanationBox.style.padding = "10px"; swapExplanationBox.style.margin = "10px 0"; swapExplanationBox.style.fontSize = "13px"; swapExplanationBox.style.lineHeight = "1.4"; swapExplanationBox.innerHTML = "<strong>🔄 ¿Qué hace esta lista?</strong><br>" + "Las palabras ingresadas aquí se moverán del final al inicio del nombre del lugar si se encuentran al final.<br>" + "<em>Ej:</em> “Las Palmas <strong>Urbanización</strong>” → “<strong>Urbanización</strong> Las Palmas”<br>" + "<em>Ej:</em> “Tornillos <strong>Ferretería</strong>” → “<strong>Ferretería</strong> Tornillos”"; // Añadir caja de explicación al contenedor swapContainer.appendChild(swapExplanationBox); const swapExplanation = document.createElement("p"); swapExplanation.textContent = "El orden importa: las palabras se evalúan una a una desde el inicio. Si se ordenan alfabéticamente, una más corta podría bloquear otra más específica."; swapExplanation.style.fontSize = "12px"; swapExplanation.style.fontStyle = "italic"; swapExplanation.style.marginTop = "6px"; swapExplanation.style.marginBottom = "10px"; swapExplanation.style.color = "#555"; // Inserta este nodo justo después del swapTitle, por ejemplo: swapContainer.appendChild(swapExplanation); swapTitle.style.fontSize = "14px"; swapTitle.style.marginBottom = "8px"; swapContainer.appendChild(swapTitle); // Contenedor para añadir nuevas palabras swap const swapInput = document.createElement("input"); swapInput.type = "text"; swapInput.placeholder = "Ej: Urbanización"; swapInput.style.width = "70%"; swapInput.style.padding = "6px"; swapInput.style.marginRight = "8px"; // Atributos para evitar corrección ortográfica const swapBtn = document.createElement("button"); swapBtn.textContent = "Añadir"; swapBtn.style.padding = "6px 10px"; swapBtn.addEventListener("click", () => { const val = swapInput.value.trim(); if (!val || /^[^a-zA-Z0-9]+$/.test(val)) { alert("No se permiten caracteres especiales solos"); return; } if (window.swapWords.includes(val)) { alert("Ya existe en la lista."); return; } window.swapWords.push(val); // mantiene orden localStorage.setItem("wme_swapWords", JSON.stringify(window.swapWords)); saveSwapWordsToStorage(); // Guardar en localStorage swapInput.value = ""; renderSwapList(); }); swapContainer.appendChild(swapInput); swapContainer.appendChild(swapBtn); // Añadir campo de búsqueda justo después de swapBtn let searchSwapInput = document.createElement("input"); searchSwapInput.type = "text"; searchSwapInput.placeholder = "Buscar palabra..."; searchSwapInput.id = "searchSwapInput"; searchSwapInput.style.width = "70%"; searchSwapInput.style.padding = "6px"; searchSwapInput.style.marginTop = "8px"; searchSwapInput.style.marginBottom = "8px"; searchSwapInput.style.border = "1px solid #ccc"; // Escuchar el input para actualizar lista searchSwapInput.addEventListener("input", () => { renderSwapList(searchSwapInput); }); swapContainer.appendChild(searchSwapInput); // Renderiza la lista renderSwapList(searchSwapInput); parentContainer.appendChild(swapContainer); // --- Alternar visibilidad según modo seleccionado --- modeSelector.addEventListener("change", () => { replacementsContainer.style.display = modeSelector.value === "words" ? "block" : "none"; swapContainer.style.display = modeSelector.value === "swapStart" ? "block" : "none"; }); // --- Función para renderizar la lista de swapWords --- function renderSwapList(searchInput = null) { // Buscar automáticamente el campo si no se pasó como parámetro if (!searchInput) searchInput = document.getElementById("searchSwapInput"); // Asegurarse de que swapContainer existe const swapList = swapContainer.querySelector("ul") || (() => { const ul = document.createElement("ul"); ul.id = "swapList"; ul.style.maxHeight = "120px"; ul.style.overflowY = "auto"; ul.style.border = "1px solid #ddd"; ul.style.padding = "8px"; ul.style.margin = "10px 0 0 0"; ul.style.background = "#fff"; ul.style.listStyle = "none"; swapContainer.appendChild(ul); return ul; })(); swapList.innerHTML = ""; // Verificar si hay palabras swap definidas if (!window.swapWords || window.swapWords.length === 0) { const li = document.createElement("li"); li.textContent = "No hay palabras al inicio definidas."; li.style.textAlign = "center"; li.style.color = "#777"; li.style.padding = "5px"; swapList.appendChild(li); return; } // Filtrar palabras swap según el término de búsqueda const searchTerm = searchSwapInput && searchSwapInput.value ? searchSwapInput.value.trim().toLowerCase() : ""; let filteredSwapWords = Array.from(window.swapWords); // Si hay un término de búsqueda, filtrar la lista if (searchTerm) filteredSwapWords = filteredSwapWords.filter(word => word.toLowerCase().includes(searchTerm)); // Ordenar alfabéticamente filteredSwapWords.forEach(word => { const li = document.createElement("li"); li.style.display = "flex"; li.style.justifyContent = "space-between"; li.style.alignItems = "center"; li.style.padding = "4px 2px"; li.style.borderBottom = "1px solid #f0f0f0"; // Span para la palabra const wordSpan = document.createElement("span"); wordSpan.title = word; // Aplicar estilos para truncar texto largo if (searchTerm) { const i = word.toLowerCase().indexOf(searchTerm); if (i !== -1) { const before = word.substring(0, i); const match = word.substring(i, i + searchTerm.length); const after = word.substring(i + searchTerm.length); wordSpan.innerHTML = `${before}<mark>${match}</mark>${after}`; } else { wordSpan.textContent = word; } } else { wordSpan.textContent = word; } // Estilos para el span de la palabra const btnContainer = document.createElement("span"); btnContainer.style.display = "flex"; btnContainer.style.gap = "4px"; // Botón Editar const editBtn = document.createElement("button"); editBtn.innerHTML = "✏️"; editBtn.title = "Editar"; editBtn.style.border = "none"; editBtn.style.background = "transparent"; editBtn.style.cursor = "pointer"; editBtn.style.padding = "2px"; editBtn.style.fontSize = "14px"; editBtn.addEventListener("click", () => { const newWord = prompt("Editar palabra:", word); if (newWord !== null && newWord.trim() !== word) { // Permitir string vacío para borrar si se quisiera, pero const trimmedNewWord = newWord.trim(); if (trimmedNewWord === "") { alert("La palabra no puede estar vacía."); return; } if (window.swapWords.includes(trimmedNewWord) && trimmedNewWord !== word) { alert("Esa palabra ya existe en la lista."); return; } window.swapWords = window.swapWords.filter(w => w !== word); window.swapWords.push(trimmedNewWord); saveSwapWordsToStorage(); renderSwapList(searchInput); } }); // Botón Eliminar const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "🗑️"; deleteBtn.title = "Eliminar"; deleteBtn.style.border = "none"; deleteBtn.style.background = "transparent"; deleteBtn.style.cursor = "pointer"; deleteBtn.style.padding = "2px"; deleteBtn.style.fontSize = "14px"; deleteBtn.addEventListener("click", () => { if (confirm(`¿Eliminar la palabra '${word}' de la lista?`)) { window.swapWords = window.swapWords.filter(w => w !== word); renderSwapList(searchInput); saveSwapWordsToStorage(); } }); btnContainer.appendChild(editBtn); btnContainer.appendChild(deleteBtn); li.appendChild(wordSpan); li.appendChild(btnContainer); swapList.appendChild(li); }); } // Render inicial renderReplacementsList(listElement); if (window.swapWords && window.swapWords.size > 0) renderSwapList(); // Listener de búsqueda para swap searchSwapInput.addEventListener("input", renderSwapList); }// createReplacementsManager // Renderiza la lista de palabras excluidas function renderExcludedWordsList(ulElement, filter = "") { if (!ulElement) { return; } // Asegurarse de que ulElement es válido const currentFilter = filter.toLowerCase(); ulElement.innerHTML = ""; // Asegurarse de que excludedWords es un Set const wordsToRender = Array.from(excludedWords).filter(word => word.toLowerCase().includes(currentFilter)) .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); // Si no hay palabras para renderizar, mostrar mensaje if (wordsToRender.length === 0) { const li = document.createElement("li"); li.textContent = "No hay palabras excluidas."; li.style.textAlign = "center"; li.style.color = "#777"; ulElement.appendChild(li); return; } // Renderizar cada palabra wordsToRender.forEach(word => { const li = document.createElement("li"); li.style.display = "flex"; // Agregado para alinear texto y botones li.style.justifyContent = "space-between"; // Agregado para espacio entre texto y botones li.style.alignItems = "center"; // Agregado para centrado vertical li.style.padding = "5px"; li.style.borderBottom = "1px solid #ddd"; // Span para el texto de la palabra const wordSpan = document.createElement("span"); wordSpan.textContent = word; wordSpan.style.flexGrow = "1"; // Permite que el texto ocupe el espacio disponible wordSpan.style.marginRight = "10px"; // Espacio entre el texto y los botones li.appendChild(wordSpan); //Bloque para los botones de edición y eliminación --- const btnContainer = document.createElement("span"); btnContainer.style.display = "flex"; btnContainer.style.gap = "8px"; // Espacio entre los botones // Botón de edición const editBtn = document.createElement("button"); editBtn.innerHTML = "✏️"; // Icono de lápiz editBtn.title = "Editar"; editBtn.style.border = "none"; editBtn.style.background = "transparent"; editBtn.style.cursor = "pointer"; editBtn.style.padding = "2px"; editBtn.style.fontSize = "14px"; editBtn.addEventListener("click", () => { const newWord = prompt("Editar palabra:", word); if (newWord !== null && newWord.trim() !== word) { const validation = isValidExcludedWord(newWord.trim()); if (!validation.valid) { alert(validation.msg); return; } // Eliminar la palabra antigua del Set y Map excludedWords.delete(word); const oldFirstChar = word.charAt(0).toLowerCase(); if (excludedWordsMap.has(oldFirstChar)) { excludedWordsMap.get(oldFirstChar).delete(word); if (excludedWordsMap.get(oldFirstChar).size === 0) { excludedWordsMap.delete(oldFirstChar); } } // Añadir la nueva palabra al Set y Map const trimmedNewWord = newWord.trim(); excludedWords.add(trimmedNewWord); const newFirstChar = trimmedNewWord.charAt(0).toLowerCase(); if (!excludedWordsMap.has(newFirstChar)) { excludedWordsMap.set(newFirstChar, new Set()); } excludedWordsMap.get(newFirstChar).add(trimmedNewWord); renderExcludedWordsList(ulElement, currentFilter); saveExcludedWordsToLocalStorage(); } }); btnContainer.appendChild(editBtn); // Botón de eliminación const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "🗑️"; // Icono de bote de basura deleteBtn.title = "Eliminar"; deleteBtn.style.border = "none"; deleteBtn.style.background = "transparent"; deleteBtn.style.cursor = "pointer"; deleteBtn.style.padding = "2px"; deleteBtn.style.fontSize = "14px"; deleteBtn.addEventListener("click", () => { if (confirm(`¿Eliminar la palabra '${word}' de la lista de especiales?`)) { excludedWords.delete(word); const firstChar = word.charAt(0).toLowerCase(); if (excludedWordsMap.has(firstChar)) { excludedWordsMap.get(firstChar).delete(word); if (excludedWordsMap.get(firstChar).size === 0) { excludedWordsMap.delete(firstChar); } } renderExcludedWordsList(ulElement, currentFilter); saveExcludedWordsToLocalStorage(); } }); btnContainer.appendChild(deleteBtn); li.appendChild(btnContainer); // --- FIN DEL BLOQUE PARA LOS BOTONES --- ulElement.appendChild(li); });// }// renderExcludedWordsList // Función para renderizar la lista de lugares excluidos function renderExcludedPlacesList(ulElement, filter = "") { if (!ulElement) return; ulElement.innerHTML = ""; const lowerFilter = filter.toLowerCase(); // Ahora excludedPlaces es un Map<ID, Nombre>. Iteramos sobre sus entries. const placesToRender = Array.from(excludedPlaces.entries()).filter(([placeId, placeNameSaved]) => // Filtra por ID o por el nombre guardado placeId.toLowerCase().includes(lowerFilter) || placeNameSaved.toLowerCase().includes(lowerFilter) ).sort((a, b) => { // Ordena alfabéticamente por el nombre guardado return a[1].toLowerCase().localeCompare(b[1].toLowerCase()); // Compara por el nombre (índice 1 del entry) }); if (placesToRender.length === 0) { const li = document.createElement("li"); li.textContent = "No hay lugares excluidos."; li.style.textAlign = "center"; li.style.color = "#777"; li.style.padding = "5px"; ulElement.appendChild(li); return; } placesToRender.forEach(([placeId, placeNameSaved]) => { // Ahora recibimos [ID, NombreGuardado] const li = document.createElement("li"); li.style.display = "flex"; li.style.justifyContent = "space-between"; li.style.alignItems = "center"; li.style.padding = "4px 2px"; li.style.borderBottom = "1px solid #f0f0f0"; // Muestra el nombre guardado, con un fallback si el nombre guardado está vacío. const displayName = placeNameSaved || `ID: ${placeId}`; const linkSpan = document.createElement("span"); linkSpan.style.flexGrow = "1"; linkSpan.style.marginRight = "10px"; const link = document.createElement("a"); link.href = "#"; link.textContent = displayName; // Muestra el nombre guardado link.title = `Abrir lugar en WME (ID: ${placeId})`; // El tooltip sigue mostrando el ID link.addEventListener("click", (e) => { e.preventDefault(); // Intenta obtener el lugar del modelo para seleccionarlo y centrarlo // Usamos W.model como fallback si wmeSDK.DataModel.Venues.getById no es eficiente aquí o no está diseñado para esta interacción const venueObj = W.model.venues.getObjectById(placeId); // <--- REINTRODUCIMOS W.model AQUÍ if (venueObj) { if (W.map && typeof W.map.setCenter === 'function' && venueObj.getOLGeometry && venueObj.getOLGeometry().getCentroid) { W.map.setCenter(venueObj.getOLGeometry().getCentroid(), null, false, 0); // <--- REINTRODUCIMOS W.map.setCenter } if (W.selectionManager && typeof W.selectionManager.select === 'function') { W.selectionManager.select(venueObj); // <--- REINTRODUCIMOS W.selectionManager.select } else if (W.selectionManager && typeof W.selectionManager.setSelectedModels === 'function') { W.selectionManager.setSelectedModels([venueObj]); // Fallback para versiones antiguas } } else { // Si el lugar no está en el modelo (fuera de vista), avisa y ofrece abrir en nueva pestaña. const confirmOpen = confirm(`Lugar '${displayName}' (ID: ${placeId}) no encontrado en el modelo actual. ¿Deseas abrirlo en una nueva pestaña del editor?`); if (confirmOpen) { const wmeUrl = `https://www.waze.com/editor?env=row&venueId=${placeId}`; window.open(wmeUrl, '_blank'); } } }); linkSpan.appendChild(link); li.appendChild(linkSpan); // Botón para eliminar el lugar de la lista de excluidos. const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "🗑️"; deleteBtn.title = "Eliminar lugar de la lista de excluidos"; deleteBtn.style.border = "none"; deleteBtn.style.background = "transparent"; deleteBtn.style.cursor = "pointer"; deleteBtn.style.padding = "2px"; deleteBtn.style.fontSize = "14px"; deleteBtn.addEventListener("click", () => { // ************************************************************ // INICIO DE LA MODIFICACIÓN: Modal de confirmación "bonito" // ************************************************************ const confirmModal = document.createElement("div"); confirmModal.style.position = "fixed"; confirmModal.style.top = "50%"; confirmModal.style.left = "50%"; confirmModal.style.transform = "translate(-50%, -50%)"; confirmModal.style.background = "#fff"; confirmModal.style.border = "1px solid #aad"; confirmModal.style.padding = "28px 32px 20px 32px"; confirmModal.style.zIndex = "20000"; // Z-INDEX ALTO confirmModal.style.boxShadow = "0 4px 24px rgba(0,0,0,0.18)"; confirmModal.style.fontFamily = "sans-serif"; confirmModal.style.borderRadius = "10px"; confirmModal.style.textAlign = "center"; confirmModal.style.minWidth = "340px"; // Ícono visual const iconElement = document.createElement("div"); iconElement.innerHTML = "⚠️"; // Ícono de advertencia iconElement.style.fontSize = "38px"; iconElement.style.marginBottom = "10px"; confirmModal.appendChild(iconElement); // Mensaje principal const messageTitle = document.createElement("div"); messageTitle.innerHTML = `<b>¿Eliminar de excluidos "${placeNameSaved}"?</b>`; messageTitle.style.fontSize = "20px"; messageTitle.style.marginBottom = "8px"; confirmModal.appendChild(messageTitle); // Mensaje explicativo const explanationDiv = document.createElement("div"); explanationDiv.textContent = `Este lugar volverá a aparecer en futuras búsquedas del normalizador.`; explanationDiv.style.fontSize = "15px"; explanationDiv.style.color = "#555"; explanationDiv.style.marginBottom = "18px"; confirmModal.appendChild(explanationDiv); // Botones de confirmación const buttonWrapper = document.createElement("div"); buttonWrapper.style.display = "flex"; buttonWrapper.style.justifyContent = "center"; buttonWrapper.style.gap = "18px"; // Botón Cancelar const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancelar"; cancelBtn.style.padding = "7px 18px"; cancelBtn.style.background = "#eee"; cancelBtn.style.border = "none"; cancelBtn.style.borderRadius = "4px"; cancelBtn.style.cursor = "pointer"; cancelBtn.addEventListener("click", () => confirmModal.remove()); // Botón Confirmar Eliminación const confirmDeleteBtn = document.createElement("button"); confirmDeleteBtn.textContent = "Eliminar"; confirmDeleteBtn.style.padding = "7px 18px"; confirmDeleteBtn.style.background = "#d9534f"; // Rojo confirmDeleteBtn.style.color = "#fff"; confirmDeleteBtn.style.border = "none"; confirmDeleteBtn.style.borderRadius = "4px"; confirmDeleteBtn.style.cursor = "pointer"; confirmDeleteBtn.style.fontWeight = "bold"; confirmDeleteBtn.addEventListener("click", () => { // Aquí va la lógica que antes estaba directamente en el if(confirm) excludedPlaces.delete(placeId); // Sigue eliminando por ID renderExcludedPlacesList(ulElement, filter); // Vuelve a renderizar la lista después de eliminar. saveExcludedPlacesToLocalStorage(); // Guarda los cambios en localStorage. showTemporaryMessage("Lugar eliminado de la lista de excluidos.", 3000, 'success'); confirmModal.remove(); // Cerrar el modal después de la acción }); buttonWrapper.appendChild(cancelBtn); buttonWrapper.appendChild(confirmDeleteBtn); confirmModal.appendChild(buttonWrapper); document.body.appendChild(confirmModal); // Añadir el modal al body // ************************************************************ // FIN DE LA MODIFICACIÓN // ************************************************************ }); li.appendChild(deleteBtn); ulElement.appendChild(li); }); }// renderExcludedPlacesList // Crea un dropdown para seleccionar categorías recomendadas function createRecommendedCategoryDropdown(placeId, currentCategoryKey, dynamicCategorySuggestions) { const wrapperDiv = document.createElement("div"); wrapperDiv.style.position = "relative"; wrapperDiv.style.width = "100%"; wrapperDiv.style.minWidth = "150px"; wrapperDiv.style.display = "flex"; wrapperDiv.style.flexDirection = "column"; // Parte de sugerencias dinámicas existentes const suggestionsWrapper = document.createElement("div"); // Contenedor para sugerencias suggestionsWrapper.style.display = "flex"; suggestionsWrapper.style.flexDirection = "column"; suggestionsWrapper.style.alignItems = "flex-start"; suggestionsWrapper.style.gap = "4px"; // Filtrar y ordenar las sugerencias dinámicas para la presentación const filteredSuggestions = dynamicCategorySuggestions.filter(suggestion => suggestion.categoryKey.toUpperCase() !== currentCategoryKey.toUpperCase()); if (filteredSuggestions.length > 0) { // Solo si hay sugerencias diferentes a la actual filteredSuggestions.forEach(suggestion => { const suggestionEntry = document.createElement("div"); suggestionEntry.style.display = "flex"; suggestionEntry.style.alignItems = "center"; suggestionEntry.style.gap = "4px"; suggestionEntry.style.padding = "2px 4px"; suggestionEntry.style.border = "1px solid #dcdcdc"; suggestionEntry.style.borderRadius = "3px"; suggestionEntry.style.backgroundColor = "#eaf7ff"; // Un color distinto para sugerencias suggestionEntry.style.cursor = "pointer"; suggestionEntry.title = `Sugerencia: ${getCategoryDetails(suggestion.categoryKey).description}`; //Añadir icono y descripción de la categoría const suggestedIconSpan = document.createElement("span");// Icono de la sugerencia suggestedIconSpan.textContent = suggestion.icon; suggestedIconSpan.style.fontSize = "16px"; suggestionEntry.appendChild(suggestedIconSpan); // Añadir descripción de la categoría const suggestedDescSpan = document.createElement("span"); suggestedDescSpan.textContent = getCategoryDetails(suggestion.categoryKey).description; suggestionEntry.appendChild(suggestedDescSpan); suggestionEntry.addEventListener("click", async function handler() { // Cambiado a función con nombre 'handler' const placeToUpdate = W.model.venues.getObjectById(placeId); if (!placeToUpdate) { console.error("[WME_PLN] Lugar no encontrado para actualizar categoría."); return; } try { const UpdateObject = require("Waze/Action/UpdateObject"); const action = new UpdateObject(placeToUpdate, { categories: [suggestion.categoryKey] }); W.model.actionManager.add(action); // Obtener la celda de la categoría original y aplicar un estilo de opacidad const row = document.querySelector(`tr[data-place-id="${placeId}"]`); // Obtener la fila row.dataset.categoryChanged = 'true'; // Marcar fila como modificada // Habilitar el botón de aplicar sugerencia const applyButton = row.querySelector('button[title="Aplicar sugerencia"]'); if (applyButton) { applyButton.disabled = false; applyButton.style.opacity = "1"; } //Actualizar visualmente la celda de Categoría Actual en la tabla updateCategoryDisplayInTable(placeId, suggestion.categoryKey); // Asegurarse de que la fila existe antes de intentar acceder a sus celdas if (row) { const originalCategoryCell = row.querySelector('td:nth-child(10)'); // La décima columna es "Categoría" if (originalCategoryCell) { originalCategoryCell.style.opacity = '0.5'; // Atenuar la celda completa originalCategoryCell.title += ' (Modificada)'; // Opcional, añadir un tooltip } } // : Mostrar chulito verde en la sugerencia misma const successIcon = document.createElement("span"); successIcon.textContent = " ✅"; successIcon.style.marginLeft = "5px"; suggestionEntry.appendChild(successIcon); // Añadir el chulito a la entrada de la sugerencia suggestionEntry.style.cursor = "default"; // Deshabilitar clic posterior suggestionEntry.removeEventListener("click", handler); // Deshabilita el listener una vez que se ha hecho clic suggestionEntry.style.opacity = "0.7"; // Opcional: Atenúa la sugerencia para indicar que ya se usó optionsListDiv.style.display = "none"; // Ocultar lista searchInput.blur(); // Quitar el foco // : Eliminar la selección temporal para la categoría, ya se guardó tempSelectedCategories.delete(placeId); // Si esta categoría se guardó directamente } catch (e) { //console.error("[WME_PLN] Error al actualizar la categoría desde sugerencia:", e); alert("Error al actualizar la categoría: " + e.message); // Mantener alerta para errores } }); suggestionsWrapper.appendChild(suggestionEntry); }); wrapperDiv.appendChild(suggestionsWrapper); // Añadir contenedor de sugerencias }// createRecommendedCategoryDropdown //Fin de parte de sugerencias dinámicas // Input para buscar const searchInput = document.createElement("input"); searchInput.type = "text"; searchInput.placeholder = "Buscar o Seleccionar Categoría";// Placeholder más descriptivo searchInput.style.width = "calc(100% - 10px)"; searchInput.style.padding = "5px"; searchInput.style.marginTop = "5px"; // Espacio después de sugerencias searchInput.style.marginBottom = "5px"; searchInput.style.border = "1px solid #ccc"; searchInput.style.borderRadius = "3px"; searchInput.setAttribute('spellcheck', 'false');// Evitar corrección ortográfica searchInput.readOnly = false;// Permitir escribir pero no editar directamente searchInput.style.cursor = 'auto';// Permitir escribir pero no editar directamente searchInput.style.opacity = '1.0'; // Opacidad normal para el input wrapperDiv.appendChild(searchInput); // Añadir el input al wrapper // Div que actuará como la lista desplegable de opciones const optionsListDiv = document.createElement("div"); optionsListDiv.style.position = "absolute"; // Ajuste de top para que aparezca debajo del input, incluso con sugerencias optionsListDiv.style.top = "calc(100% + 5px)"; // Se ajusta dinámicamente o se puede hacer con position: relative dentro de un contenedor fijo. optionsListDiv.style.left = "0"; optionsListDiv.style.width = "calc(100% - 2px)"; optionsListDiv.style.maxHeight = "200px"; optionsListDiv.style.overflowY = "auto"; optionsListDiv.style.border = "1px solid #ddd"; optionsListDiv.style.backgroundColor = "#fff"; optionsListDiv.style.zIndex = "1001"; optionsListDiv.style.display = "none"; optionsListDiv.style.borderRadius = "3px"; optionsListDiv.style.boxShadow = "0 2px 5px rgba(0,0,0,0.2)"; wrapperDiv.appendChild(optionsListDiv); // --- Populate options list --- function populateOptions(filterText = "") { optionsListDiv.innerHTML = ""; // Clear existing options const lowerFilterText = filterText.toLowerCase(); // Normalize filter text for case-insensitive search // Sort rules alphabetically by their Spanish description for display const sortedRules = [...window.dynamicCategoryRules].sort((a, b) => { const descA = (getWazeLanguage() === 'es' && a.desc_es) ? a.desc_es : a.desc_en; const descB = (getWazeLanguage() === 'es' && b.desc_es) ? b.desc_es : b.desc_en; return descA.localeCompare(descB); }); sortedRules.forEach(rule => {// Iterate through each rule const displayDesc = (getWazeLanguage() === 'es' && rule.desc_es) ? rule.desc_es : rule.desc_en; if (filterText === "" || displayDesc.toLowerCase().includes(lowerFilterText) || rule.categoryKey.toLowerCase().includes(lowerFilterText)) {// Check if displayDesc or categoryKey contains the filter text const optionDiv = document.createElement("div"); optionDiv.style.padding = "5px"; optionDiv.style.cursor = "pointer"; optionDiv.style.borderBottom = "1px solid #eee"; optionDiv.style.display = "flex"; optionDiv.style.alignItems = "center"; optionDiv.style.gap = "5px"; optionDiv.title = `Seleccionar: ${displayDesc} (${rule.categoryKey})`; // Resaltar si es la categoría actual o la temporalmente seleccionada const tempSelectedKey = tempSelectedCategories.get(placeId); // Obtener selección temporal if (rule.categoryKey.toUpperCase() === currentCategoryKey.toUpperCase()) {// Resaltar la categoría actual optionDiv.style.backgroundColor = "#e0f7fa"; // Azul claro para la actual optionDiv.style.fontWeight = "bold"; } else if (tempSelectedKey && rule.categoryKey.toUpperCase() === tempSelectedKey.toUpperCase()) // Resaltar selección temporal optionDiv.style.backgroundColor = "#fffacd"; // Amarillo claro para la seleccionada temporalmente else if (dynamicCategorySuggestions.some(s => s.categoryKey.toUpperCase() === rule.categoryKey.toUpperCase())) optionDiv.style.backgroundColor = "#e6ffe6"; // Verde claro para sugerida por el sistema const iconSpan = document.createElement("span");// Icono de la categoría iconSpan.textContent = rule.icon; iconSpan.style.fontSize = "16px"; optionDiv.appendChild(iconSpan); const textSpan = document.createElement("span");// Descripción de la categoría textSpan.textContent = displayDesc; optionDiv.appendChild(textSpan);// Añadir descripción de la categoría optionDiv.addEventListener("mouseenter", () => optionDiv.style.backgroundColor = "#f0f0f0"); optionDiv.addEventListener("mouseleave", () => { if (tempSelectedKey && rule.categoryKey.toUpperCase() === tempSelectedKey.toUpperCase()) { optionDiv.style.backgroundColor = "#fffacd"; } else if (rule.categoryKey.toUpperCase() === currentCategoryKey.toUpperCase()) { optionDiv.style.backgroundColor = "#e0f7fa"; } else if (dynamicCategorySuggestions.some(s => s.categoryKey.toUpperCase() === rule.categoryKey.toUpperCase())) { optionDiv.style.backgroundColor = "#e6ffe6"; } else { optionDiv.style.backgroundColor = "#fff"; } }); // Añadir evento click para seleccionar la categoría optionDiv.addEventListener("click", async () => { const placeToUpdate = W.model.venues.getObjectById(placeId); if (!placeToUpdate) { //console.error("[WME_PLN] Lugar no encontrado para actualizar categoría."); return; } try { const UpdateObject = require("Waze/Action/UpdateObject"); const action = new UpdateObject(placeToUpdate, { categories: [rule.categoryKey] }); W.model.actionManager.add(action); // ✅ CORRECCIÓN: Se declara 'row' aquí, ANTES de su primer uso. const row = document.querySelector(`tr[data-place-id="${placeId}"]`); // Ahora es seguro usar la variable 'row'. if (row) { row.dataset.categoryChanged = 'true'; // Marcar fila como modificada const applyButton = row.querySelector('button[title="Aplicar sugerencia"]'); // Habilitar el botón de aplicar sugerencia if (applyButton) { applyButton.disabled = false; applyButton.style.opacity = "1"; } } // Actualizar visualmente la celda de Categoría Actual en la tabla updateCategoryDisplayInTable(placeId, rule.categoryKey); // Atenuar la celda de la categoría original if (row) { const categoryCell = row.querySelector('td:nth-child(10)'); if (categoryCell) { const currentCategoryDiv = categoryCell.querySelector('div'); if (currentCategoryDiv) { currentCategoryDiv.style.opacity = '0.5'; currentCategoryDiv.title += ' (Modificada)'; } } } // Actualizar el valor del input con icono y descripción de la selección searchInput.value = `${rule.icon} ${displayDesc}`; searchInput.style.setProperty('opacity', '1.0', 'important'); // Usar setProperty para asegurar visibilidad // Ocultar la lista de opciones optionsListDiv.style.display = "none"; searchInput.blur(); } catch (e) { console.error("[WME_PLN] Error al actualizar la categoría desde dropdown:", e); alert("Error al actualizar la categoría: " + e.message); } }); optionsListDiv.appendChild(optionDiv); } }); if (optionsListDiv.childElementCount === 0) {// Si no hay opciones que coincidan con el filtro, mostrar mensaje const noResults = document.createElement("div"); noResults.style.padding = "5px"; noResults.style.color = "#777"; noResults.textContent = "No hay resultados."; optionsListDiv.appendChild(noResults); } }// populateOptions // Limpiamos los listeners anteriores y los reescribimos de forma más robusta. let debounceTimer; searchInput.addEventListener("input", () => { clearTimeout(debounceTimer); // Muestra la lista y filtra mientras el usuario escribe. debounceTimer = setTimeout(() => { populateOptions(searchInput.value); optionsListDiv.style.display = "block"; }, 200); }); searchInput.addEventListener("focus", () => { // Al hacer foco, muestra la lista completa. populateOptions(searchInput.value); optionsListDiv.style.display = "block"; }); // Usamos 'mousedown' en lugar de 'click' para cerrar el menú. // Esto evita conflictos con el evento 'click' de las opciones. document.addEventListener("mousedown", (e) => { if (!wrapperDiv.contains(e.target)) { optionsListDiv.style.display = "none"; } }); populateOptions(""); // Cargar las opciones inicialmente (sin filtro) return wrapperDiv; }// createRecommendedCategoryDropdown // Función auxiliar para actualizar el display de la categoría actual en la tabla function updateCategoryDisplayInTable(placeId, newCategoryKey) { const row = document.querySelector(`tr[data-place-id="${placeId}"]`); // Asume que cada fila tiene un data-place-id if (!row) return; const categoryCell = row.querySelector('td:nth-child(8)'); // Asume que la 8ª columna es la de Categoría Actual if (!categoryCell) return;// Asegurarse de que la celda existe const categoryDetails = getCategoryDetails(newCategoryKey); // Obtener detalles de la categoría const currentCategoryDiv = categoryCell.querySelector('div'); // Contenedor del texto y el ícono if (currentCategoryDiv) {// Actualizar el contenido del div existente currentCategoryDiv.querySelector('span:first-child').textContent = categoryDetails.description; // Actualiza el texto currentCategoryDiv.querySelector('span:last-child').textContent = categoryDetails.icon; // Actualiza el ícono currentCategoryDiv.querySelector('span:first-child').title = `Categoría Actual: ${categoryDetails.description}`; // Actualiza el título } } // Renderizar lista de palabras del diccionario function renderDictionaryList(ulElement, filter = "") { // Asegurarse de que ulElement es válido if (!ulElement || !window.dictionaryWords) return; // Asegurarse de que ulElement es válido const currentFilter = filter.toLowerCase(); ulElement.innerHTML = ""; // Asegurarse de que dictionaryWords es un Set const wordsToRender = Array.from(window.dictionaryWords) .filter(word => word.toLowerCase().startsWith(currentFilter)) .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); // Si no hay palabras que renderizar, mostrar mensaje if (wordsToRender.length === 0) { const li = document.createElement("li"); li.textContent = window.dictionaryWords.size === 0 ? "El diccionario está vacío." : "No hay coincidencias."; li.style.textAlign = "center"; li.style.color = "#777"; ulElement.appendChild(li); // Guardar diccionario también cuando está vacío try { localStorage.setItem( "dictionaryWordsList", JSON.stringify(Array.from(window.dictionaryWords))); } catch (e) { console.error( "[WME PLN] Error guardando el diccionario en localStorage:", e); } return; } // Renderizar cada palabra wordsToRender.forEach(word => { const li = document.createElement("li"); li.style.display = "flex"; li.style.justifyContent = "space-between"; li.style.alignItems = "center"; li.style.padding = "4px 2px"; li.style.borderBottom = "1px solid #f0f0f0"; // Span para la palabra const wordSpan = document.createElement("span"); wordSpan.textContent = word; wordSpan.style.maxWidth = "calc(100% - 60px)"; wordSpan.style.overflow = "hidden"; wordSpan.style.textOverflow = "ellipsis"; wordSpan.style.whiteSpace = "nowrap"; wordSpan.title = word; li.appendChild(wordSpan); // Contenedor para los iconos de acción const iconContainer = document.createElement("span"); iconContainer.style.display = "flex"; iconContainer.style.gap = "8px"; // Botón de edición y eliminación const editBtn = document.createElement("button"); editBtn.innerHTML = "✏️"; editBtn.title = "Editar"; editBtn.style.border = "none"; editBtn.style.background = "transparent"; editBtn.style.cursor = "pointer"; editBtn.style.padding = "2px"; editBtn.style.fontSize = "14px"; editBtn.addEventListener("click", () => { const newWord = prompt("Editar palabra:", word); if (newWord !== null && newWord.trim() !== word) { window.dictionaryWords.delete(word); window.dictionaryWords.add(newWord.trim()); renderDictionaryList(ulElement, currentFilter); } }); // Botón de eliminación const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "🗑️"; deleteBtn.title = "Eliminar"; deleteBtn.style.border = "none"; deleteBtn.style.background = "transparent"; deleteBtn.style.cursor = "pointer"; deleteBtn.style.padding = "2px"; deleteBtn.style.fontSize = "14px"; deleteBtn.addEventListener("click", () => { // Confirmación antes de eliminar if (confirm(`¿Eliminar la palabra '${word}' del diccionario?`)) { window.dictionaryWords.delete(word); renderDictionaryList(ulElement, currentFilter); } }); iconContainer.appendChild(editBtn); iconContainer.appendChild(deleteBtn); li.appendChild(iconContainer); ulElement.appendChild(li); }); // Guardar el diccionario actualizado en localStorage después de cada render try { localStorage.setItem("dictionaryWordsList", JSON.stringify(Array.from(window.dictionaryWords))); } catch (e) { console.error("[WME PLN] Error guardando el diccionario en localStorage:", e); } }// renderDictionaryList // Función para manejar el archivo XML arrastrado function exportExcludedWordsList() { // Verificar si hay palabras excluidas if (excludedWords.size === 0 && Object.keys(replacementWords).length === 0) { alert("No hay palabras especiales ni reemplazos para exportar."); return; } // Crear el contenido XML let xmlContent = `<?xml version="1.0" encoding="UTF-8"?>\n<ExcludedWords>\n`; xmlContent += Array.from(excludedWords) .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())) .map(w => ` <word>${xmlEscape(w)}</word>`) .join("\n"); // Añadir reemplazos si existen if (Object.keys(replacementWords).length > 0) { xmlContent += "\n"; xmlContent += Object.entries(replacementWords) .map(([ from, to ]) => ` <replacement from="${ xmlEscape(from)}">${xmlEscape(to)}</replacement>`) .join("\n"); } xmlContent += "\n</ExcludedWords>"; // Crear el Blob y descargarlo const blob = new Blob([xmlContent], { type: "application/xml;charset=utf-8" }); // Crear un enlace temporal para descargar el archivo const url = URL.createObjectURL(blob); // Crear un elemento <a> para descargar el archivo const a = document.createElement("a"); a.href = url; a.download = "wme_excluded_words_export.xml"; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }// exportExcludedWordsList // Función para exportar palabras del diccionario a XML function exportDictionaryWordsList() { // Verificar si hay palabras en el diccionario if (window.dictionaryWords.size === 0) { alert( "La lista de palabras del diccionario está vacía. Nada que exportar."); return; } // Crear el contenido XML const xmlContent = `<?xml version="1.0" encoding="UTF-8"?>\n<diccionario>\n${ Array.from(window.dictionaryWords) .sort((a, b) => a.toLowerCase().localeCompare( b.toLowerCase())) // Exportar ordenado .map(w => ` <word>${xmlEscape(w)}</word>`) // Indentación y escape .join("\n")}\n</diccionario>`; // Crear el Blob y descargarlo const blob = new Blob([xmlContent], { type: "application/xml;charset=utf-8" }); // Añadir charset // Crear un enlace temporal para descargar el archivo const url = URL.createObjectURL(blob); // Crear un elemento <a> para descargar el archivo const a = document.createElement("a"); a.href = url; a.download = "wme_dictionary_words_export.xml"; // Nombre más descriptivo document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }// exportDictionaryWordsList // Función para exportar datos compartidos a XML function xmlEscape(str) { return str.replace(/[<>&"']/g, function (match) { switch (match) { case '<': return '<'; case '>': return '>'; case '&': return '&'; case '"': return '"'; case "'": return '''; default: return match; } }); }// xmlEscape // Función para manejar el archivo XML arrastrado waitForSidebarAPI(); //Llamar a la función para mostrar el changelog showChangelogOnUpdate(); !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).turf={})}(this,(function(t){"use strict";var e=6371008.8,n={centimeters:637100880,centimetres:637100880,degrees:57.22891354143274,feet:20902260.511392,inches:39.37*e,kilometers:6371.0088,kilometres:6371.0088,meters:e,metres:e,miles:3958.761333810546,millimeters:6371008800,millimetres:6371008800,nauticalmiles:e/1852,radians:1,yards:6967335.223679999},r={centimeters:100,centimetres:100,degrees:1/111325,feet:3.28084,inches:39.37,kilometers:.001,kilometres:.001,meters:1,metres:1,miles:1/1609.344,millimeters:1e3,millimetres:1e3,nauticalmiles:1/1852,radians:1/e,yards:1.0936133},i={acres:247105e-9,centimeters:1e4,centimetres:1e4,feet:10.763910417,hectares:1e-4,inches:1550.003100006,kilometers:1e-6,kilometres:1e-6,meters:1,metres:1,miles:386e-9,millimeters:1e6,millimetres:1e6,yards:1.195990046};function o(t,e,n){void 0===n&&(n={});var r={type:"Feature"};return(0===n.id||n.id)&&(r.id=n.id),n.bbox&&(r.bbox=n.bbox),r.properties=e||{},r.geometry=t,r}function s(t,e,n){switch(t){case"Point":return a(e).geometry;case"LineString":return h(e).geometry;case"Polygon":return l(e).geometry;case"MultiPoint":return d(e).geometry;case"MultiLineString":return g(e).geometry;case"MultiPolygon":return y(e).geometry;default:throw new Error(t+" is invalid")}}function a(t,e,n){if(void 0===n&&(n={}),!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!C(t[0])||!C(t[1]))throw new Error("coordinates must contain numbers");return o({type:"Point",coordinates:t},e,n)}function u(t,e,n){return void 0===n&&(n={}),f(t.map((function(t){return a(t,e)})),n)}function l(t,e,n){void 0===n&&(n={});for(var r=0,i=t;r<i.length;r++){var s=i[r];if(s.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");for(var a=0;a<s[s.length-1].length;a++)if(s[s.length-1][a]!==s[0][a])throw new Error("First and last Position are not equivalent.")}return o({type:"Polygon",coordinates:t},e,n)}function c(t,e,n){return void 0===n&&(n={}),f(t.map((function(t){return l(t,e)})),n)}function h(t,e,n){if(void 0===n&&(n={}),t.length<2)throw new Error("coordinates must be an array of two or more positions");return o({type:"LineString",coordinates:t},e,n)}function p(t,e,n){return void 0===n&&(n={}),f(t.map((function(t){return h(t,e)})),n)}function f(t,e){void 0===e&&(e={});var n={type:"FeatureCollection"};return e.id&&(n.id=e.id),e.bbox&&(n.bbox=e.bbox),n.features=t,n}function g(t,e,n){return void 0===n&&(n={}),o({type:"MultiLineString",coordinates:t},e,n)}function d(t,e,n){return void 0===n&&(n={}),o({type:"MultiPoint",coordinates:t},e,n)}function y(t,e,n){return void 0===n&&(n={}),o({type:"MultiPolygon",coordinates:t},e,n)}function v(t,e,n){return void 0===n&&(n={}),o({type:"GeometryCollection",geometries:t},e,n)}function _(t,e){if(void 0===e&&(e=0),e&&!(e>=0))throw new Error("precision must be a positive number");var n=Math.pow(10,e||0);return Math.round(t*n)/n}function m(t,e){void 0===e&&(e="kilometers");var r=n[e];if(!r)throw new Error(e+" units is invalid");return t*r}function x(t,e){void 0===e&&(e="kilometers");var r=n[e];if(!r)throw new Error(e+" units is invalid");return t/r}function E(t,e){return w(x(t,e))}function b(t){var e=t%360;return e<0&&(e+=360),e}function w(t){return 180*(t%(2*Math.PI))/Math.PI}function I(t){return t%360*Math.PI/180}function N(t,e,n){if(void 0===e&&(e="kilometers"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("length must be a positive number");return m(x(t,e),n)}function S(t,e,n){if(void 0===e&&(e="meters"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("area must be a positive number");var r=i[e];if(!r)throw new Error("invalid original units");var o=i[n];if(!o)throw new Error("invalid final units");return t/r*o}function C(t){return!isNaN(t)&&null!==t&&!Array.isArray(t)}function P(t){return!!t&&t.constructor===Object}function M(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!C(t))throw new Error("bbox must only contain numbers")}))}function L(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}var O=Object.freeze({__proto__:null,earthRadius:e,factors:n,unitsFactors:r,areaFactors:i,feature:o,geometry:s,point:a,points:u,polygon:l,polygons:c,lineString:h,lineStrings:p,featureCollection:f,multiLineString:g,multiPoint:d,multiPolygon:y,geometryCollection:v,round:_,radiansToLength:m,lengthToRadians:x,lengthToDegrees:E,bearingToAzimuth:b,radiansToDegrees:w,degreesToRadians:I,convertLength:N,convertArea:S,isNumber:C,isObject:P,validateBBox:M,validateId:L});function R(t,e,n){if(null!==t)for(var r,i,o,s,a,u,l,c,h=0,p=0,f=t.type,g="FeatureCollection"===f,d="Feature"===f,y=g?t.features.length:1,v=0;v<y;v++){a=(c=!!(l=g?t.features[v].geometry:d?t.geometry:t)&&"GeometryCollection"===l.type)?l.geometries.length:1;for(var _=0;_<a;_++){var m=0,x=0;if(null!==(s=c?l.geometries[_]:l)){u=s.coordinates;var E=s.type;switch(h=!n||"Polygon"!==E&&"MultiPolygon"!==E?0:1,E){case null:break;case"Point":if(!1===e(u,p,v,m,x))return!1;p++,m++;break;case"LineString":case"MultiPoint":for(r=0;r<u.length;r++){if(!1===e(u[r],p,v,m,x))return!1;p++,"MultiPoint"===E&&m++}"LineString"===E&&m++;break;case"Polygon":case"MultiLineString":for(r=0;r<u.length;r++){for(i=0;i<u[r].length-h;i++){if(!1===e(u[r][i],p,v,m,x))return!1;p++}"MultiLineString"===E&&m++,"Polygon"===E&&x++}"Polygon"===E&&m++;break;case"MultiPolygon":for(r=0;r<u.length;r++){for(x=0,i=0;i<u[r].length;i++){for(o=0;o<u[r][i].length-h;o++){if(!1===e(u[r][i][o],p,v,m,x))return!1;p++}x++}m++}break;case"GeometryCollection":for(r=0;r<s.geometries.length;r++)if(!1===R(s.geometries[r],e,n))return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function T(t,e,n,r){var i=n;return R(t,(function(t,r,o,s,a){i=0===r&&void 0===n?t:e(i,t,r,o,s,a)}),r),i}function A(t,e){var n;switch(t.type){case"FeatureCollection":for(n=0;n<t.features.length&&!1!==e(t.features[n].properties,n);n++);break;case"Feature":e(t.properties,0)}}function D(t,e,n){var r=n;return A(t,(function(t,i){r=0===i&&void 0===n?t:e(r,t,i)})),r}function F(t,e){if("Feature"===t.type)e(t,0);else if("FeatureCollection"===t.type)for(var n=0;n<t.features.length&&!1!==e(t.features[n],n);n++);}function k(t,e,n){var r=n;return F(t,(function(t,i){r=0===i&&void 0===n?t:e(r,t,i)})),r}function G(t){var e=[];return R(t,(function(t){e.push(t)})),e}function q(t,e){var n,r,i,o,s,a,u,l,c,h,p=0,f="FeatureCollection"===t.type,g="Feature"===t.type,d=f?t.features.length:1;for(n=0;n<d;n++){for(a=f?t.features[n].geometry:g?t.geometry:t,l=f?t.features[n].properties:g?t.properties:{},c=f?t.features[n].bbox:g?t.bbox:void 0,h=f?t.features[n].id:g?t.id:void 0,s=(u=!!a&&"GeometryCollection"===a.type)?a.geometries.length:1,i=0;i<s;i++)if(null!==(o=u?a.geometries[i]:a))switch(o.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":if(!1===e(o,p,l,c,h))return!1;break;case"GeometryCollection":for(r=0;r<o.geometries.length;r++)if(!1===e(o.geometries[r],p,l,c,h))return!1;break;default:throw new Error("Unknown Geometry Type")}else if(!1===e(null,p,l,c,h))return!1;p++}}function B(t,e,n){var r=n;return q(t,(function(t,i,o,s,a){r=0===i&&void 0===n?t:e(r,t,i,o,s,a)})),r}function z(t,e){q(t,(function(t,n,r,i,s){var a,u=null===t?null:t.type;switch(u){case null:case"Point":case"LineString":case"Polygon":return!1!==e(o(t,r,{bbox:i,id:s}),n,0)&&void 0}switch(u){case"MultiPoint":a="Point";break;case"MultiLineString":a="LineString";break;case"MultiPolygon":a="Polygon"}for(var l=0;l<t.coordinates.length;l++){var c=t.coordinates[l];if(!1===e(o({type:a,coordinates:c},r),n,l))return!1}}))}function j(t,e,n){var r=n;return z(t,(function(t,i,o){r=0===i&&0===o&&void 0===n?t:e(r,t,i,o)})),r}function U(t,e){z(t,(function(t,n,r){var i=0;if(t.geometry){var o=t.geometry.type;if("Point"!==o&&"MultiPoint"!==o){var s,a=0,u=0,l=0;return!1!==R(t,(function(o,c,p,f,g){if(void 0===s||n>a||f>u||g>l)return s=o,a=n,u=f,l=g,void(i=0);var d=h([s,o],t.properties);if(!1===e(d,n,r,g,i))return!1;i++,s=o}))&&void 0}}}))}function V(t,e,n){var r=n,i=!1;return U(t,(function(t,o,s,a,u){r=!1===i&&void 0===n?t:e(r,t,o,s,a,u),i=!0})),r}function X(t,e){if(!t)throw new Error("geojson is required");z(t,(function(t,n,r){if(null!==t.geometry){var i=t.geometry.type,o=t.geometry.coordinates;switch(i){case"LineString":if(!1===e(t,n,r,0,0))return!1;break;case"Polygon":for(var s=0;s<o.length;s++)if(!1===e(h(o[s],t.properties),n,r,s))return!1}}}))}function Y(t,e,n){var r=n;return X(t,(function(t,i,o,s){r=0===i&&void 0===n?t:e(r,t,i,o,s)})),r}function H(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n,r=e.featureIndex||0,i=e.multiFeatureIndex||0,o=e.geometryIndex||0,s=e.segmentIndex||0,a=e.properties;switch(t.type){case"FeatureCollection":r<0&&(r=t.features.length+r),a=a||t.features[r].properties,n=t.features[r].geometry;break;case"Feature":a=a||t.properties,n=t.geometry;break;case"Point":case"MultiPoint":return null;case"LineString":case"Polygon":case"MultiLineString":case"MultiPolygon":n=t;break;default:throw new Error("geojson is invalid")}if(null===n)return null;var u=n.coordinates;switch(n.type){case"Point":case"MultiPoint":return null;case"LineString":return s<0&&(s=u.length+s-1),h([u[s],u[s+1]],a,e);case"Polygon":return o<0&&(o=u.length+o),s<0&&(s=u[o].length+s-1),h([u[o][s],u[o][s+1]],a,e);case"MultiLineString":return i<0&&(i=u.length+i),s<0&&(s=u[i].length+s-1),h([u[i][s],u[i][s+1]],a,e);case"MultiPolygon":return i<0&&(i=u.length+i),o<0&&(o=u[i].length+o),s<0&&(s=u[i][o].length-s-1),h([u[i][o][s],u[i][o][s+1]],a,e)}throw new Error("geojson is invalid")}function W(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n,r=e.featureIndex||0,i=e.multiFeatureIndex||0,o=e.geometryIndex||0,s=e.coordIndex||0,u=e.properties;switch(t.type){case"FeatureCollection":r<0&&(r=t.features.length+r),u=u||t.features[r].properties,n=t.features[r].geometry;break;case"Feature":u=u||t.properties,n=t.geometry;break;case"Point":case"MultiPoint":return null;case"LineString":case"Polygon":case"MultiLineString":case"MultiPolygon":n=t;break;default:throw new Error("geojson is invalid")}if(null===n)return null;var l=n.coordinates;switch(n.type){case"Point":return a(l,u,e);case"MultiPoint":return i<0&&(i=l.length+i),a(l[i],u,e);case"LineString":return s<0&&(s=l.length+s),a(l[s],u,e);case"Polygon":return o<0&&(o=l.length+o),s<0&&(s=l[o].length+s),a(l[o][s],u,e);case"MultiLineString":return i<0&&(i=l.length+i),s<0&&(s=l[i].length+s),a(l[i][s],u,e);case"MultiPolygon":return i<0&&(i=l.length+i),o<0&&(o=l[i].length+o),s<0&&(s=l[i][o].length-s),a(l[i][o][s],u,e)}throw new Error("geojson is invalid")}var J=Object.freeze({__proto__:null,coordAll:G,coordEach:R,coordReduce:T,featureEach:F,featureReduce:k,findPoint:W,findSegment:H,flattenEach:z,flattenReduce:j,geomEach:q,geomReduce:B,lineEach:X,lineReduce:Y,propEach:A,propReduce:D,segmentEach:U,segmentReduce:V});function Z(t){var e=[1/0,1/0,-1/0,-1/0];return R(t,(function(t){e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]<t[0]&&(e[2]=t[0]),e[3]<t[1]&&(e[3]=t[1])})),e}function K(t){if(!t)throw new Error("coord is required");if(!Array.isArray(t)){if("Feature"===t.type&&null!==t.geometry&&"Point"===t.geometry.type)return t.geometry.coordinates;if("Point"===t.type)return t.coordinates}if(Array.isArray(t)&&t.length>=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return t;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function Q(t){if(Array.isArray(t))return t;if("Feature"===t.type){if(null!==t.geometry)return t.geometry.coordinates}else if(t.coordinates)return t.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function $(t){if(t.length>1&&C(t[0])&&C(t[1]))return!0;if(Array.isArray(t[0])&&t[0].length)return $(t[0]);throw new Error("coordinates must only contain numbers")}function tt(t,e,n){if(!e||!n)throw new Error("type and name required");if(!t||t.type!==e)throw new Error("Invalid input to "+n+": must be a "+e+", given "+t.type)}function et(t,e,n){if(!t)throw new Error("No feature passed");if(!n)throw new Error(".featureOf() requires a name");if(!t||"Feature"!==t.type||!t.geometry)throw new Error("Invalid input to "+n+", Feature with geometry required");if(!t.geometry||t.geometry.type!==e)throw new Error("Invalid input to "+n+": must be a "+e+", given "+t.geometry.type)}function nt(t,e,n){if(!t)throw new Error("No featureCollection passed");if(!n)throw new Error(".collectionOf() requires a name");if(!t||"FeatureCollection"!==t.type)throw new Error("Invalid input to "+n+", FeatureCollection required");for(var r=0,i=t.features;r<i.length;r++){var o=i[r];if(!o||"Feature"!==o.type||!o.geometry)throw new Error("Invalid input to "+n+", Feature with geometry required");if(!o.geometry||o.geometry.type!==e)throw new Error("Invalid input to "+n+": must be a "+e+", given "+o.geometry.type)}}function rt(t){return"Feature"===t.type?t.geometry:t}function it(t,e){return"FeatureCollection"===t.type?"FeatureCollection":"GeometryCollection"===t.type?"GeometryCollection":"Feature"===t.type&&null!==t.geometry?t.geometry.type:t.type}Z.default=Z;var ot=Object.freeze({__proto__:null,getCoord:K,getCoords:Q,containsNumber:$,geojsonType:tt,featureOf:et,collectionOf:nt,getGeom:rt,getType:it}),st=Object.getOwnPropertySymbols,at=Object.prototype.hasOwnProperty,ut=Object.prototype.propertyIsEnumerable; /* object-assign (c) Sindre Sorhus @license MIT */function lt(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}var ct=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(t){r[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,r,i=lt(t),o=1;o<arguments.length;o++){for(var s in n=Object(arguments[o]))at.call(n,s)&&(i[s]=n[s]);if(st){r=st(n);for(var a=0;a<r.length;a++)ut.call(n,r[a])&&(i[r[a]]=n[r[a]])}}return i},ht={successCallback:null,verbose:!1},pt={}; /** * @license GNU Affero General Public License. * Copyright (c) 2015, 2015 Ronny Lorenz <[email protected]> * v. 1.2.0 * https://github.com/RaumZeit/MarchingSquares.js * * MarchingSquaresJS is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MarchingSquaresJS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * As additional permission under GNU Affero General Public License version 3 * section 7, third-party projects (personal or commercial) may distribute, * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the * requirement that said third-party project for that reason alone becomes * subject to any requirement of the GNU Affero General Public License version 3. * Any modifications to MarchingSquaresJS, however, must be shared with the public * and made available. * * In summary this: * - allows you to use MarchingSquaresJS at no cost * - allows you to use MarchingSquaresJS for both personal and commercial purposes * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any * license as long as this license notice is included * - enables you to keep the source code of your program that uses MarchingSquaresJS * undisclosed * - forces you to share any modifications you have made to MarchingSquaresJS, * e.g. bug-fixes * * You should have received a copy of the GNU Affero General Public License * along with MarchingSquaresJS. If not, see <http://www.gnu.org/licenses/>. */function ft(t,e,n){n=n||{};for(var r=Object.keys(ht),i=0;i<r.length;i++){var o=r[i],s=n[o];s=null!=s?s:ht[o],pt[o]=s}pt.verbose&&console.log("MarchingSquaresJS-isoContours: computing isocontour for "+e);var a=function(t){var e=[],n=0,r=1e-7;return t.cells.forEach((function(i,o){i.forEach((function(i,s){if(void 0!==i&&(5!==(f=i).cval&&10!==f.cval)&&!dt(i)){var a=function(t,e,n){var r,i,o=t.length,s=[],a=[0,0,1,1,0,0,0,0,-1,0,1,1,-1,0,-1,0],u=[0,-1,0,0,1,1,1,1,0,-1,0,0,0,-1,0,0],l=["none","left","bottom","left","right","none","bottom","left","top","top","none","top","right","right","bottom","none"],c=["none","bottom","right","right","top","top","top","top","left","bottom","right","right","left","bottom","left","none"],h=t[e][n],p=h.cval,f=l[p],g=vt(h,f);s.push([n+g[0],e+g[1]]),f=c[p],g=vt(h,f),s.push([n+g[0],e+g[1]]),yt(h);var d=n+a[p],y=e+u[p],v=p;for(;d>=0&&y>=0&&y<o&&(d!=n||y!=e)&&void 0!==(h=t[y][d]);){if(0===(p=h.cval)||15===p)return{path:s,info:"mergeable"};f=c[p],r=a[p],i=u[p],5!==p&&10!==p||(5===p?h.flipped?-1===u[v]?(f="left",r=-1,i=0):(f="right",r=1,i=0):-1===a[v]&&(f="bottom",r=0,i=-1):10===p&&(h.flipped?-1===a[v]?(f="top",r=0,i=1):(f="bottom",r=0,i=-1):1===u[v]&&(f="left",r=-1,i=0))),g=vt(h,f),s.push([d+g[0],y+g[1]]),yt(h),d+=r,y+=i,v=p}return{path:s,info:"closed"}}(t.cells,o,s),u=!1;if("mergeable"===a.info)for(var l=a.path[a.path.length-1][0],c=a.path[a.path.length-1][1],h=n-1;h>=0;h--)if(Math.abs(e[h][0][0]-l)<=r&&Math.abs(e[h][0][1]-c)<=r){for(var p=a.path.length-2;p>=0;--p)e[h].unshift(a.path[p]);u=!0;break}u||(e[n++]=a.path)}var f}))})),e}(function(t,e){for(var n=t.length-1,r=t[0].length-1,i={rows:n,cols:r,cells:[]},o=0;o<n;++o){i.cells[o]=[];for(var s=0;s<r;++s){var a=0,u=t[o+1][s],l=t[o+1][s+1],c=t[o][s+1],h=t[o][s];if(!(isNaN(u)||isNaN(l)||isNaN(c)||isNaN(h))){a|=u>=e?8:0,a|=l>=e?4:0,a|=c>=e?2:0;var p,f,g,d,y=!1;if(5===(a|=h>=e?1:0)||10===a){var v=(u+l+c+h)/4;5===a&&v<e?(a=10,y=!0):10===a&&v<e&&(a=5,y=!0)}if(0!==a&&15!==a)p=f=g=d=.5,1===a?(g=1-gt(e,u,h),f=1-gt(e,c,h)):2===a?(f=gt(e,h,c),d=1-gt(e,l,c)):3===a?(g=1-gt(e,u,h),d=1-gt(e,l,c)):4===a?(p=gt(e,u,l),d=gt(e,c,l)):5===a?(p=gt(e,u,l),d=gt(e,c,l),f=1-gt(e,c,h),g=1-gt(e,u,h)):6===a?(f=gt(e,h,c),p=gt(e,u,l)):7===a?(g=1-gt(e,u,h),p=gt(e,u,l)):8===a?(g=gt(e,h,u),p=1-gt(e,l,u)):9===a?(f=1-gt(e,c,h),p=1-gt(e,l,u)):10===a?(p=1-gt(e,l,u),d=1-gt(e,l,c),f=gt(e,h,c),g=gt(e,h,u)):11===a?(p=1-gt(e,l,u),d=1-gt(e,l,c)):12===a?(g=gt(e,h,u),d=gt(e,c,l)):13===a?(f=1-gt(e,c,h),d=gt(e,c,l)):14===a?(g=gt(e,h,u),f=gt(e,h,c)):console.log("MarchingSquaresJS-isoContours: Illegal cval detected: "+a),i.cells[o][s]={cval:a,flipped:y,top:p,right:d,bottom:f,left:g}}}}return i}(t,e));return"function"==typeof pt.successCallback&&pt.successCallback(a),a}function gt(t,e,n){return(t-e)/(n-e)}function dt(t){return 0===t.cval||15===t.cval}function yt(t){dt(t)||5===t.cval||10===t.cval||(t.cval=15)}function vt(t,e){return"top"===e?[t.top,1]:"bottom"===e?[t.bottom,0]:"right"===e?[1,t.right]:"left"===e?[0,t.left]:void 0}function _t(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.zProperty||"elevation",r=e.flip,i=e.flags;nt(t,"Point","input must contain Points");for(var o=function(t,e){var n={};return F(t,(function(t){var e=Q(t)[1];n[e]||(n[e]=[]),n[e].push(t)})),Object.keys(n).map((function(t){return n[t].sort((function(t,e){return Q(t)[0]-Q(e)[0]}))})).sort((function(t,n){return e?Q(t[0])[1]-Q(n[0])[1]:Q(n[0])[1]-Q(t[0])[1]}))}(t,r),s=[],a=0;a<o.length;a++){for(var u=o[a],l=[],c=0;c<u.length;c++){var h=u[c];h.properties[n]?l.push(h.properties[n]):l.push(0),!0===i&&(h.properties.matrixPosition=[a,c])}s.push(l)}return s}var mt=Et,xt=Et;function Et(t,e,n,r,i){bt(t,e,n||0,r||t.length-1,i||It)}function bt(t,e,n,r,i){for(;r>n;){if(r-n>600){var o=r-n+1,s=e-n+1,a=Math.log(o),u=.5*Math.exp(2*a/3),l=.5*Math.sqrt(a*u*(o-u)/o)*(s-o/2<0?-1:1);bt(t,e,Math.max(n,Math.floor(e-s*u/o+l)),Math.min(r,Math.floor(e+(o-s)*u/o+l)),i)}var c=t[e],h=n,p=r;for(wt(t,n,e),i(t[r],c)>0&&wt(t,n,r);h<p;){for(wt(t,h,p),h++,p--;i(t[h],c)<0;)h++;for(;i(t[p],c)>0;)p--}0===i(t[n],c)?wt(t,n,p):wt(t,++p,r),p<=e&&(n=p+1),e<=p&&(r=p-1)}}function wt(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function It(t,e){return t<e?-1:t>e?1:0}mt.default=xt;var Nt=Ct,St=Ct;function Ct(t,e){if(!(this instanceof Ct))return new Ct(t,e);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),e&&this._initFormat(e),this.clear()}function Pt(t,e,n){if(!n)return e.indexOf(t);for(var r=0;r<e.length;r++)if(n(t,e[r]))return r;return-1}function Mt(t,e){Lt(t,0,t.children.length,e,t)}function Lt(t,e,n,r,i){i||(i=Gt(null)),i.minX=1/0,i.minY=1/0,i.maxX=-1/0,i.maxY=-1/0;for(var o,s=e;s<n;s++)o=t.children[s],Ot(i,t.leaf?r(o):o);return i}function Ot(t,e){return t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),t}function Rt(t,e){return t.minX-e.minX}function Tt(t,e){return t.minY-e.minY}function At(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function Dt(t){return t.maxX-t.minX+(t.maxY-t.minY)}function Ft(t,e){return t.minX<=e.minX&&t.minY<=e.minY&&e.maxX<=t.maxX&&e.maxY<=t.maxY}function kt(t,e){return e.minX<=t.maxX&&e.minY<=t.maxY&&e.maxX>=t.minX&&e.maxY>=t.minY}function Gt(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function qt(t,e,n,r,i){for(var o,s=[e,n];s.length;)(n=s.pop())-(e=s.pop())<=r||(o=e+Math.ceil((n-e)/r/2)*r,mt(t,o,e,n,i),s.push(e,o,o,n))}function Bt(t){var e={exports:{}};return t(e,e.exports),e.exports}Ct.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,n=[],r=this.toBBox;if(!kt(t,e))return n;for(var i,o,s,a,u=[];e;){for(i=0,o=e.children.length;i<o;i++)s=e.children[i],kt(t,a=e.leaf?r(s):s)&&(e.leaf?n.push(s):Ft(t,a)?this._all(s,n):u.push(s));e=u.pop()}return n},collides:function(t){var e=this.data,n=this.toBBox;if(!kt(t,e))return!1;for(var r,i,o,s,a=[];e;){for(r=0,i=e.children.length;r<i;r++)if(o=e.children[r],kt(t,s=e.leaf?n(o):o)){if(e.leaf||Ft(t,s))return!0;a.push(o)}e=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var e=0,n=t.length;e<n;e++)this.insert(t[e]);return this}var r=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===r.height)this._splitRoot(this.data,r);else{if(this.data.height<r.height){var i=this.data;this.data=r,r=i}this._insert(r,this.data.height-r.height-1,!0)}else this.data=r;return this},insert:function(t){return t&&this._insert(t,this.data.height-1),this},clear:function(){return this.data=Gt([]),this},remove:function(t,e){if(!t)return this;for(var n,r,i,o,s=this.data,a=this.toBBox(t),u=[],l=[];s||u.length;){if(s||(s=u.pop(),r=u[u.length-1],n=l.pop(),o=!0),s.leaf&&-1!==(i=Pt(t,s.children,e)))return s.children.splice(i,1),u.push(s),this._condense(u),this;o||s.leaf||!Ft(s,a)?r?(n++,s=r.children[n],o=!1):s=null:(u.push(s),l.push(n),n=0,r=s,s=s.children[0])}return this},toBBox:function(t){return t},compareMinX:Rt,compareMinY:Tt,toJSON:function(){return this.data},fromJSON:function(t){return this.data=t,this},_all:function(t,e){for(var n=[];t;)t.leaf?e.push.apply(e,t.children):n.push.apply(n,t.children),t=n.pop();return e},_build:function(t,e,n,r){var i,o=n-e+1,s=this._maxEntries;if(o<=s)return Mt(i=Gt(t.slice(e,n+1)),this.toBBox),i;r||(r=Math.ceil(Math.log(o)/Math.log(s)),s=Math.ceil(o/Math.pow(s,r-1))),(i=Gt([])).leaf=!1,i.height=r;var a,u,l,c,h=Math.ceil(o/s),p=h*Math.ceil(Math.sqrt(s));for(qt(t,e,n,p,this.compareMinX),a=e;a<=n;a+=p)for(qt(t,a,l=Math.min(a+p-1,n),h,this.compareMinY),u=a;u<=l;u+=h)c=Math.min(u+h-1,l),i.children.push(this._build(t,u,c,r-1));return Mt(i,this.toBBox),i},_chooseSubtree:function(t,e,n,r){for(var i,o,s,a,u,l,c,h,p,f;r.push(e),!e.leaf&&r.length-1!==n;){for(c=h=1/0,i=0,o=e.children.length;i<o;i++)u=At(s=e.children[i]),p=t,f=s,(l=(Math.max(f.maxX,p.maxX)-Math.min(f.minX,p.minX))*(Math.max(f.maxY,p.maxY)-Math.min(f.minY,p.minY))-u)<h?(h=l,c=u<c?u:c,a=s):l===h&&u<c&&(c=u,a=s);e=a||e.children[0]}return e},_insert:function(t,e,n){var r=this.toBBox,i=n?t:r(t),o=[],s=this._chooseSubtree(i,this.data,e,o);for(s.children.push(t),Ot(s,i);e>=0&&o[e].children.length>this._maxEntries;)this._split(o,e),e--;this._adjustParentBBoxes(i,o,e)},_split:function(t,e){var n=t[e],r=n.children.length,i=this._minEntries;this._chooseSplitAxis(n,i,r);var o=this._chooseSplitIndex(n,i,r),s=Gt(n.children.splice(o,n.children.length-o));s.height=n.height,s.leaf=n.leaf,Mt(n,this.toBBox),Mt(s,this.toBBox),e?t[e-1].children.push(s):this._splitRoot(n,s)},_splitRoot:function(t,e){this.data=Gt([t,e]),this.data.height=t.height+1,this.data.leaf=!1,Mt(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,n){var r,i,o,s,a,u,l,c,h,p,f,g,d,y;for(u=l=1/0,r=e;r<=n-e;r++)i=Lt(t,0,r,this.toBBox),o=Lt(t,r,n,this.toBBox),h=i,p=o,f=void 0,g=void 0,d=void 0,y=void 0,f=Math.max(h.minX,p.minX),g=Math.max(h.minY,p.minY),d=Math.min(h.maxX,p.maxX),y=Math.min(h.maxY,p.maxY),s=Math.max(0,d-f)*Math.max(0,y-g),a=At(i)+At(o),s<u?(u=s,c=r,l=a<l?a:l):s===u&&a<l&&(l=a,c=r);return c},_chooseSplitAxis:function(t,e,n){var r=t.leaf?this.compareMinX:Rt,i=t.leaf?this.compareMinY:Tt;this._allDistMargin(t,e,n,r)<this._allDistMargin(t,e,n,i)&&t.children.sort(r)},_allDistMargin:function(t,e,n,r){t.children.sort(r);var i,o,s=this.toBBox,a=Lt(t,0,e,s),u=Lt(t,n-e,n,s),l=Dt(a)+Dt(u);for(i=e;i<n-e;i++)o=t.children[i],Ot(a,t.leaf?s(o):o),l+=Dt(a);for(i=n-e-1;i>=e;i--)o=t.children[i],Ot(u,t.leaf?s(o):o),l+=Dt(u);return l},_adjustParentBBoxes:function(t,e,n){for(var r=n;r>=0;r--)Ot(e[r],t)},_condense:function(t){for(var e,n=t.length-1;n>=0;n--)0===t[n].children.length?n>0?(e=t[n-1].children).splice(e.indexOf(t[n]),1):this.clear():Mt(t[n],this.toBBox)},_initFormat:function(t){var e=["return a"," - b",";"];this.compareMinX=new Function("a","b",e.join(t[0])),this.compareMinY=new Function("a","b",e.join(t[1])),this.toBBox=new Function("a","return {minX: a"+t[0]+", minY: a"+t[1]+", maxX: a"+t[2]+", maxY: a"+t[3]+"};")}},Nt.default=St;var zt=function(t,e,n){var r=t*e,i=jt*t,o=i-(i-t),s=t-o,a=jt*e,u=a-(a-e),l=e-u,c=s*l-(r-o*u-s*u-o*l);if(n)return n[0]=c,n[1]=r,n;return[c,r]},jt=+(Math.pow(2,27)+1);var Ut=function(t,e){var n=0|t.length,r=0|e.length;if(1===n&&1===r)return function(t,e){var n=t+e,r=n-t,i=t-(n-r)+(e-r);if(i)return[i,n];return[n]}(t[0],e[0]);var i,o,s=new Array(n+r),a=0,u=0,l=0,c=Math.abs,h=t[u],p=c(h),f=e[l],g=c(f);p<g?(o=h,(u+=1)<n&&(h=t[u],p=c(h))):(o=f,(l+=1)<r&&(f=e[l],g=c(f)));u<n&&p<g||l>=r?(i=h,(u+=1)<n&&(h=t[u],p=c(h))):(i=f,(l+=1)<r&&(f=e[l],g=c(f)));var d,y,v=i+o,_=v-i,m=o-_,x=m,E=v;for(;u<n&&l<r;)p<g?(i=h,(u+=1)<n&&(h=t[u],p=c(h))):(i=f,(l+=1)<r&&(f=e[l],g=c(f))),(m=(o=x)-(_=(v=i+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d;for(;u<n;)(m=(o=x)-(_=(v=(i=h)+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d,(u+=1)<n&&(h=t[u]);for(;l<r;)(m=(o=x)-(_=(v=(i=f)+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d,(l+=1)<r&&(f=e[l]);x&&(s[a++]=x);E&&(s[a++]=E);a||(s[a++]=0);return s.length=a,s};var Vt=function(t,e,n){var r=t+e,i=r-t,o=e-i,s=t-(r-i);if(n)return n[0]=s+o,n[1]=r,n;return[s+o,r]};var Xt=function(t,e){var n=t.length;if(1===n){var r=zt(t[0],e);return r[0]?r:[r[1]]}var i=new Array(2*n),o=[.1,.1],s=[.1,.1],a=0;zt(t[0],e,o),o[0]&&(i[a++]=o[0]);for(var u=1;u<n;++u){zt(t[u],e,s);var l=o[1];Vt(l,s[0],o),o[0]&&(i[a++]=o[0]);var c=s[1],h=o[1],p=c+h,f=h-(p-c);o[1]=p,f&&(i[a++]=f)}o[1]&&(i[a++]=o[1]);0===a&&(i[a++]=0);return i.length=a,i};var Yt=function(t,e){var n=0|t.length,r=0|e.length;if(1===n&&1===r)return function(t,e){var n=t+e,r=n-t,i=t-(n-r)+(e-r);if(i)return[i,n];return[n]}(t[0],-e[0]);var i,o,s=new Array(n+r),a=0,u=0,l=0,c=Math.abs,h=t[u],p=c(h),f=-e[l],g=c(f);p<g?(o=h,(u+=1)<n&&(h=t[u],p=c(h))):(o=f,(l+=1)<r&&(f=-e[l],g=c(f)));u<n&&p<g||l>=r?(i=h,(u+=1)<n&&(h=t[u],p=c(h))):(i=f,(l+=1)<r&&(f=-e[l],g=c(f)));var d,y,v=i+o,_=v-i,m=o-_,x=m,E=v;for(;u<n&&l<r;)p<g?(i=h,(u+=1)<n&&(h=t[u],p=c(h))):(i=f,(l+=1)<r&&(f=-e[l],g=c(f))),(m=(o=x)-(_=(v=i+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d;for(;u<n;)(m=(o=x)-(_=(v=(i=h)+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d,(u+=1)<n&&(h=t[u]);for(;l<r;)(m=(o=x)-(_=(v=(i=f)+o)-i))&&(s[a++]=m),x=E-((d=E+v)-(y=d-E))+(v-y),E=d,(l+=1)<r&&(f=-e[l]);x&&(s[a++]=x);E&&(s[a++]=E);a||(s[a++]=0);return s.length=a,s};var Ht=Bt((function(t){function e(t,e){for(var n=new Array(t.length-1),r=1;r<t.length;++r)for(var i=n[r-1]=new Array(t.length-1),o=0,s=0;o<t.length;++o)o!==e&&(i[s++]=t[r][o]);return n}function n(t){if(1===t.length)return t[0];if(2===t.length)return["sum(",t[0],",",t[1],")"].join("");var e=t.length>>1;return["sum(",n(t.slice(0,e)),",",n(t.slice(e)),")"].join("")}function r(t){if(2===t.length)return[["sum(prod(",t[0][0],",",t[1][1],"),prod(-",t[0][1],",",t[1][0],"))"].join("")];for(var i=[],o=0;o<t.length;++o)i.push(["scale(",n(r(e(t,o))),",",(s=o,1&s?"-":""),t[0][o],")"].join(""));return i;var s}function i(t){for(var i=[],o=[],s=function(t){for(var e=new Array(t),n=0;n<t;++n){e[n]=new Array(t);for(var r=0;r<t;++r)e[n][r]=["m",r,"[",t-n-1,"]"].join("")}return e}(t),a=[],u=0;u<t;++u)0==(1&u)?i.push.apply(i,r(e(s,u))):o.push.apply(o,r(e(s,u))),a.push("m"+u);var l=n(i),c=n(o),h="orientation"+t+"Exact",p=["function ",h,"(",a.join(),"){var p=",l,",n=",c,",d=sub(p,n);return d[d.length-1];};return ",h].join("");return new Function("sum","prod","scale","sub",p)(Ut,zt,Xt,Yt)}var o=i(3),s=i(4),a=[function(){return 0},function(){return 0},function(t,e){return e[0]-t[0]},function(t,e,n){var r,i=(t[1]-n[1])*(e[0]-n[0]),s=(t[0]-n[0])*(e[1]-n[1]),a=i-s;if(i>0){if(s<=0)return a;r=i+s}else{if(!(i<0))return a;if(s>=0)return a;r=-(i+s)}var u=33306690738754716e-32*r;return a>=u||a<=-u?a:o(t,e,n)},function(t,e,n,r){var i=t[0]-r[0],o=e[0]-r[0],a=n[0]-r[0],u=t[1]-r[1],l=e[1]-r[1],c=n[1]-r[1],h=t[2]-r[2],p=e[2]-r[2],f=n[2]-r[2],g=o*c,d=a*l,y=a*u,v=i*c,_=i*l,m=o*u,x=h*(g-d)+p*(y-v)+f*(_-m),E=7771561172376103e-31*((Math.abs(g)+Math.abs(d))*Math.abs(h)+(Math.abs(y)+Math.abs(v))*Math.abs(p)+(Math.abs(_)+Math.abs(m))*Math.abs(f));return x>E||-x>E?x:s(t,e,n,r)}];function u(t){var e=a[t.length];return e||(e=a[t.length]=i(t.length)),e.apply(void 0,t)}!function(){for(;a.length<=5;)a.push(i(a.length));for(var e=[],n=["slow"],r=0;r<=5;++r)e.push("a"+r),n.push("o"+r);var o=["function getOrientation(",e.join(),"){switch(arguments.length){case 0:case 1:return 0;"];for(r=2;r<=5;++r)o.push("case ",r,":return o",r,"(",e.slice(0,r).join(),");");o.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation"),n.push(o.join(""));var s=Function.apply(void 0,n);for(t.exports=s.apply(void 0,[u].concat(a)),r=0;r<=5;++r)t.exports[r]=a[r]}()})),Wt=function(t){var e=t.length;if(e<3){for(var n=new Array(e),r=0;r<e;++r)n[r]=r;return 2===e&&t[0][0]===t[1][0]&&t[0][1]===t[1][1]?[0]:n}var i=new Array(e);for(r=0;r<e;++r)i[r]=r;i.sort((function(e,n){var r=t[e][0]-t[n][0];return r||t[e][1]-t[n][1]}));var o=[i[0],i[1]],s=[i[0],i[1]];for(r=2;r<e;++r){for(var a=i[r],u=t[a],l=o.length;l>1&&Jt(t[o[l-2]],t[o[l-1]],u)<=0;)l-=1,o.pop();for(o.push(a),l=s.length;l>1&&Jt(t[s[l-2]],t[s[l-1]],u)>=0;)l-=1,s.pop();s.push(a)}n=new Array(s.length+o.length-2);for(var c=0,h=(r=0,o.length);r<h;++r)n[c++]=o[r];for(var p=s.length-2;p>0;--p)n[c++]=s[p];return n},Jt=Ht[3];var Zt=Qt,Kt=Qt;function Qt(t,e){if(!(this instanceof Qt))return new Qt(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||$t,this.length>0)for(var n=(this.length>>1)-1;n>=0;n--)this._down(n)}function $t(t,e){return t<e?-1:t>e?1:0}Qt.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,n=this.compare,r=e[t];t>0;){var i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r},_down:function(t){for(var e=this.data,n=this.compare,r=this.length>>1,i=e[t];t<r;){var o=1+(t<<1),s=o+1,a=e[o];if(s<this.length&&n(e[s],a)<0&&(o=s,a=e[s]),n(a,i)>=0)break;e[t]=a,t=o}e[t]=i}},Zt.default=Kt;var te=function(t,e){for(var n=t[0],r=t[1],i=!1,o=0,s=e.length-1;o<e.length;s=o++){var a=e[o][0],u=e[o][1],l=e[s][0],c=e[s][1];u>r!=c>r&&n<(l-a)*(r-u)/(c-u)+a&&(i=!i)}return i},ee=Ht[3],ne=ie,re=ie;function ie(t,e,n){e=Math.max(0,void 0===e?2:e),n=n||0;for(var r,i=function(t){for(var e=t[0],n=t[0],r=t[0],i=t[0],o=0;o<t.length;o++){var s=t[o];s[0]<e[0]&&(e=s),s[0]>r[0]&&(r=s),s[1]<n[1]&&(n=s),s[1]>i[1]&&(i=s)}var a=[e,n,r,i],u=a.slice();for(o=0;o<t.length;o++)te(t[o],a)||u.push(t[o]);var l=Wt(u),c=[];for(o=0;o<l.length;o++)c.push(u[l[o]]);return c}(t),o=Nt(16,["[0]","[1]","[0]","[1]"]).load(t),s=[],a=0;a<i.length;a++){var u=i[a];o.remove(u),r=he(u,r),s.push(r)}var l=Nt(16);for(a=0;a<s.length;a++)l.insert(ce(s[a]));for(var c=e*e,h=n*n;s.length;){var p=s.shift(),f=p.p,g=p.next.p,d=pe(f,g);if(!(d<h)){var y=d/c;(u=oe(o,p.prev.p,f,g,p.next.next.p,y,l))&&Math.min(pe(u,f),pe(u,g))<=y&&(s.push(p),s.push(he(u,p)),o.remove(u),l.remove(p),l.insert(ce(p)),l.insert(ce(p.next)))}}p=r;var v=[];do{v.push(p.p),p=p.next}while(p!==r);return v.push(p.p),v}function oe(t,e,n,r,i,o,s){for(var a=new Zt(null,se),u=t.data;u;){for(var l=0;l<u.children.length;l++){var c=u.children[l],h=u.leaf?fe(c,n,r):ae(n,r,c);h>o||a.push({node:c,dist:h})}for(;a.length&&!a.peek().node.children;){var p=a.pop(),f=p.node,g=fe(f,e,n),d=fe(f,r,i);if(p.dist<g&&p.dist<d&&le(n,f,s)&&le(r,f,s))return f}(u=a.pop())&&(u=u.node)}return null}function se(t,e){return t.dist-e.dist}function ae(t,e,n){if(ue(t,n)||ue(e,n))return 0;var r=ge(t[0],t[1],e[0],e[1],n.minX,n.minY,n.maxX,n.minY);if(0===r)return 0;var i=ge(t[0],t[1],e[0],e[1],n.minX,n.minY,n.minX,n.maxY);if(0===i)return 0;var o=ge(t[0],t[1],e[0],e[1],n.maxX,n.minY,n.maxX,n.maxY);if(0===o)return 0;var s=ge(t[0],t[1],e[0],e[1],n.minX,n.maxY,n.maxX,n.maxY);return 0===s?0:Math.min(r,i,o,s)}function ue(t,e){return t[0]>=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function le(t,e,n){for(var r,i,o,s,a=Math.min(t[0],e[0]),u=Math.min(t[1],e[1]),l=Math.max(t[0],e[0]),c=Math.max(t[1],e[1]),h=n.search({minX:a,minY:u,maxX:l,maxY:c}),p=0;p<h.length;p++)if(r=h[p].p,i=h[p].next.p,o=t,r!==(s=e)&&i!==o&&ee(r,i,o)>0!=ee(r,i,s)>0&&ee(o,s,r)>0!=ee(o,s,i)>0)return!1;return!0}function ce(t){var e=t.p,n=t.next.p;return t.minX=Math.min(e[0],n[0]),t.minY=Math.min(e[1],n[1]),t.maxX=Math.max(e[0],n[0]),t.maxY=Math.max(e[1],n[1]),t}function he(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function pe(t,e){var n=t[0]-e[0],r=t[1]-e[1];return n*n+r*r}function fe(t,e,n){var r=e[0],i=e[1],o=n[0]-r,s=n[1]-i;if(0!==o||0!==s){var a=((t[0]-r)*o+(t[1]-i)*s)/(o*o+s*s);a>1?(r=n[0],i=n[1]):a>0&&(r+=o*a,i+=s*a)}return(o=t[0]-r)*o+(s=t[1]-i)*s}function ge(t,e,n,r,i,o,s,a){var u,l,c,h,p=n-t,f=r-e,g=s-i,d=a-o,y=t-i,v=e-o,_=p*p+f*f,m=p*g+f*d,x=g*g+d*d,E=p*y+f*v,b=g*y+d*v,w=_*x-m*m,I=w,N=w;0===w?(l=0,I=1,h=b,N=x):(h=_*b-m*E,(l=m*b-x*E)<0?(l=0,h=b,N=x):l>I&&(l=I,h=b+m,N=x)),h<0?(h=0,-E<0?l=0:-E>_?l=I:(l=-E,I=_)):h>N&&(h=N,-E+m<0?l=0:-E+m>_?l=I:(l=-E+m,I=_));var S=(1-(c=0===h?0:h/N))*i+c*s-((1-(u=0===l?0:l/I))*t+u*n),C=(1-c)*o+c*a-((1-u)*e+u*r);return S*S+C*C}function de(t,e){void 0===e&&(e={}),e.concavity=e.concavity||1/0;var n=[];if(R(t,(function(t){n.push([t[0],t[1]])})),!n.length)return null;var r=ne(n,e.concavity);return r.length>3?l([r]):null}function ye(t,e,n){if(void 0===n&&(n={}),!t)throw new Error("point is required");if(!e)throw new Error("polygon is required");var r=K(t),i=rt(e),o=i.type,s=e.bbox,a=i.coordinates;if(s&&!1===function(t,e){return e[0]<=t[0]&&e[1]<=t[1]&&e[2]>=t[0]&&e[3]>=t[1]}(r,s))return!1;"Polygon"===o&&(a=[a]);for(var u=!1,l=0;l<a.length&&!u;l++)if(ve(r,a[l][0],n.ignoreBoundary)){for(var c=!1,h=1;h<a[l].length&&!c;)ve(r,a[l][h],!n.ignoreBoundary)&&(c=!0),h++;c||(u=!0)}return u}function ve(t,e,n){var r=!1;e[0][0]===e[e.length-1][0]&&e[0][1]===e[e.length-1][1]&&(e=e.slice(0,e.length-1));for(var i=0,o=e.length-1;i<e.length;o=i++){var s=e[i][0],a=e[i][1],u=e[o][0],l=e[o][1];if(t[1]*(s-u)+a*(u-t[0])+l*(t[0]-s)==0&&(s-t[0])*(u-t[0])<=0&&(a-t[1])*(l-t[1])<=0)return!n;a>t[1]!=l>t[1]&&t[0]<(u-s)*(t[1]-a)/(l-a)+s&&(r=!r)}return r}function _e(t,e){var n=[];return F(t,(function(t){var r=!1;if("Point"===t.geometry.type)q(e,(function(e){ye(t,e)&&(r=!0)})),r&&n.push(t);else{if("MultiPoint"!==t.geometry.type)throw new Error("Input geometry must be a Point or MultiPoint");var i=[];q(e,(function(e){R(t,(function(t){ye(t,e)&&(r=!0,i.push(t))}))})),r&&n.push(d(i))}})),f(n)}function me(t,e,n){void 0===n&&(n={});var r=K(t),i=K(e),o=I(i[1]-r[1]),s=I(i[0]-r[0]),a=I(r[1]),u=I(i[1]),l=Math.pow(Math.sin(o/2),2)+Math.pow(Math.sin(s/2),2)*Math.cos(a)*Math.cos(u);return m(2*Math.atan2(Math.sqrt(l),Math.sqrt(1-l)),n.units)}function xe(t,e){var n=!1;return f(function(t){if(t.length<3)return[];t.sort(be);var e,n,r,i,o,s,a=t.length-1,u=t[a].x,l=t[0].x,c=t[a].y,h=c,p=1e-12;for(;a--;)t[a].y<c&&(c=t[a].y),t[a].y>h&&(h=t[a].y);var f,g=l-u,d=h-c,y=g>d?g:d,v=.5*(l+u),_=.5*(h+c),m=[new Ee({__sentinel:!0,x:v-20*y,y:_-y},{__sentinel:!0,x:v,y:_+20*y},{__sentinel:!0,x:v+20*y,y:_-y})],x=[],E=[];a=t.length;for(;a--;){for(E.length=0,f=m.length;f--;)(g=t[a].x-m[f].x)>0&&g*g>m[f].r?(x.push(m[f]),m.splice(f,1)):g*g+(d=t[a].y-m[f].y)*d>m[f].r||(E.push(m[f].a,m[f].b,m[f].b,m[f].c,m[f].c,m[f].a),m.splice(f,1));for(we(E),f=E.length;f;)n=E[--f],e=E[--f],r=t[a],i=n.x-e.x,o=n.y-e.y,s=2*(i*(r.y-n.y)-o*(r.x-n.x)),Math.abs(s)>p&&m.push(new Ee(e,n,r))}Array.prototype.push.apply(x,m),a=x.length;for(;a--;)(x[a].a.__sentinel||x[a].b.__sentinel||x[a].c.__sentinel)&&x.splice(a,1);return x}(t.features.map((function(t){var r={x:t.geometry.coordinates[0],y:t.geometry.coordinates[1]};return e?r.z=t.properties[e]:3===t.geometry.coordinates.length&&(n=!0,r.z=t.geometry.coordinates[2]),r}))).map((function(t){var e=[t.a.x,t.a.y],r=[t.b.x,t.b.y],i=[t.c.x,t.c.y],o={};return n?(e.push(t.a.z),r.push(t.b.z),i.push(t.c.z)):o={a:t.a.z,b:t.b.z,c:t.c.z},l([[e,r,i,e]],o)})))}ne.default=re;var Ee=function(t,e,n){this.a=t,this.b=e,this.c=n;var r,i,o=e.x-t.x,s=e.y-t.y,a=n.x-t.x,u=n.y-t.y,l=o*(t.x+e.x)+s*(t.y+e.y),c=a*(t.x+n.x)+u*(t.y+n.y),h=2*(o*(n.y-e.y)-s*(n.x-e.x));this.x=(u*l-s*c)/h,this.y=(o*c-a*l)/h,r=this.x-t.x,i=this.y-t.y,this.r=r*r+i*i};function be(t,e){return e.x-t.x}function we(t){var e,n,r,i,o,s=t.length;t:for(;s;)for(n=t[--s],e=t[--s],r=s;r;)if(o=t[--r],e===(i=t[--r])&&n===o||e===o&&n===i){t.splice(s,2),t.splice(r,2),s-=2;continue t}}function Ie(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return Ne(t);case"FeatureCollection":return function(t){var e={type:"FeatureCollection"};return Object.keys(t).forEach((function(n){switch(n){case"type":case"features":return;default:e[n]=t[n]}})),e.features=t.features.map((function(t){return Ne(t)})),e}(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Ce(t);default:throw new Error("unknown GeoJSON type")}}function Ne(t){var e={type:"Feature"};return Object.keys(t).forEach((function(n){switch(n){case"type":case"properties":case"geometry":return;default:e[n]=t[n]}})),e.properties=Se(t.properties),e.geometry=Ce(t.geometry),e}function Se(t){var e={};return t?(Object.keys(t).forEach((function(n){var r=t[n];"object"==typeof r?null===r?e[n]=null:Array.isArray(r)?e[n]=r.map((function(t){return t})):e[n]=Se(r):e[n]=r})),e):e}function Ce(t){var e={type:t.type};return t.bbox&&(e.bbox=t.bbox),"GeometryCollection"===t.type?(e.geometries=t.geometries.map((function(t){return Ce(t)})),e):(e.coordinates=Pe(t.coordinates),e)}function Pe(t){var e=t;return"object"!=typeof e[0]?e.slice():e.map((function(t){return Pe(t)}))}function Me(t,e){if(void 0===e&&(e={}),!P(e=e||{}))throw new Error("options is invalid");var n=e.mutate;if("FeatureCollection"!==it(t))throw new Error("geojson must be a FeatureCollection");if(!t.features.length)throw new Error("geojson is empty");!1!==n&&void 0!==n||(t=Ie(t));var r=[],i=Y(t,(function(t,e){var n=function(t,e){var n,r=t.geometry.coordinates,i=e.geometry.coordinates,o=Le(r[0]),s=Le(r[r.length-1]),a=Le(i[0]),u=Le(i[i.length-1]);if(o===u)n=i.concat(r.slice(1));else if(a===s)n=r.concat(i.slice(1));else if(o===a)n=r.slice(1).reverse().concat(i);else{if(s!==u)return null;n=r.concat(i.reverse().slice(1))}return h(n)}(t,e);return n||(r.push(t),e)}));return i&&r.push(i),r.length?1===r.length?r[0]:g(r.map((function(t){return t.coordinates}))):null}function Le(t){return t[0].toString()+","+t[1].toString()}function Oe(t){return t}function Re(t,e){var n=function(t){if(null==t)return Oe;var e,n,r=t.scale[0],i=t.scale[1],o=t.translate[0],s=t.translate[1];return function(t,a){a||(e=n=0);var u=2,l=t.length,c=new Array(l);for(c[0]=(e+=t[0])*r+o,c[1]=(n+=t[1])*i+s;u<l;)c[u]=t[u],++u;return c}}(t.transform),r=t.arcs;function i(t,e){e.length&&e.pop();for(var i=r[t<0?~t:t],o=0,s=i.length;o<s;++o)e.push(n(i[o],o));t<0&&function(t,e){for(var n,r=t.length,i=r-e;i<--r;)n=t[i],t[i++]=t[r],t[r]=n}(e,s)}function o(t){return n(t)}function s(t){for(var e=[],n=0,r=t.length;n<r;++n)i(t[n],e);return e.length<2&&e.push(e[0]),e}function a(t){for(var e=s(t);e.length<4;)e.push(e[0]);return e}function u(t){return t.map(a)}return function t(e){var n,r=e.type;switch(r){case"GeometryCollection":return{type:r,geometries:e.geometries.map(t)};case"Point":n=o(e.coordinates);break;case"MultiPoint":n=e.coordinates.map(o);break;case"LineString":n=s(e.arcs);break;case"MultiLineString":n=e.arcs.map(s);break;case"Polygon":n=u(e.arcs);break;case"MultiPolygon":n=e.arcs.map(u);break;default:return null}return{type:r,coordinates:n}}(e)}function Te(t,e){var n={},r={},i={},o=[],s=-1;function a(t,e){for(var r in t){var i=t[r];delete e[i.start],delete i.start,delete i.end,i.forEach((function(t){n[t<0?~t:t]=1})),o.push(i)}}return e.forEach((function(n,r){var i,o=t.arcs[n<0?~n:n];o.length<3&&!o[1][0]&&!o[1][1]&&(i=e[++s],e[s]=n,e[r]=i)})),e.forEach((function(e){var n,o,s=function(e){var n,r=t.arcs[e<0?~e:e],i=r[0];t.transform?(n=[0,0],r.forEach((function(t){n[0]+=t[0],n[1]+=t[1]}))):n=r[r.length-1];return e<0?[n,i]:[i,n]}(e),a=s[0],u=s[1];if(n=i[a])if(delete i[n.end],n.push(e),n.end=u,o=r[u]){delete r[o.start];var l=o===n?n:n.concat(o);r[l.start=n.start]=i[l.end=o.end]=l}else r[n.start]=i[n.end]=n;else if(n=r[u])if(delete r[n.start],n.unshift(e),n.start=a,o=i[a]){delete i[o.end];var c=o===n?n:o.concat(n);r[c.start=o.start]=i[c.end=n.end]=c}else r[n.start]=i[n.end]=n;else r[(n=[e]).start=a]=i[n.end=u]=n})),a(i,r),a(r,i),e.forEach((function(t){n[t<0?~t:t]||o.push([t])})),o}function Ae(t,e){var n={},r=[],i=[];function o(t){t.forEach((function(e){e.forEach((function(e){(n[e=e<0?~e:e]||(n[e]=[])).push(t)}))})),r.push(t)}function s(e){return function(t){for(var e,n=-1,r=t.length,i=t[r-1],o=0;++n<r;)e=i,i=t[n],o+=e[0]*i[1]-e[1]*i[0];return Math.abs(o)}(Re(t,{type:"Polygon",arcs:[e]}).coordinates[0])}return e.forEach((function t(e){switch(e.type){case"GeometryCollection":e.geometries.forEach(t);break;case"Polygon":o(e.arcs);break;case"MultiPolygon":e.arcs.forEach(o)}})),r.forEach((function(t){if(!t._){var e=[],r=[t];for(t._=1,i.push(e);t=r.pop();)e.push(t),t.forEach((function(t){t.forEach((function(t){n[t<0?~t:t].forEach((function(t){t._||(t._=1,r.push(t))}))}))}))}})),r.forEach((function(t){delete t._})),{type:"MultiPolygon",arcs:i.map((function(e){var r,i=[];if(e.forEach((function(t){t.forEach((function(t){t.forEach((function(t){n[t<0?~t:t].length<2&&i.push(t)}))}))})),(r=(i=Te(t,i)).length)>1)for(var o,a,u=1,l=s(i[0]);u<r;++u)(o=s(i[u]))>l&&(a=i[0],i[0]=i[u],i[u]=a,l=o);return i})).filter((function(t){return t.length>0}))}}var De=Object.prototype.hasOwnProperty;function Fe(t,e,n,r,i,o){3===arguments.length&&(r=o=Array,i=null);for(var s=new r(t=1<<Math.max(4,Math.ceil(Math.log(t)/Math.LN2))),a=new o(t),u=t-1,l=0;l<t;++l)s[l]=i;function c(r,o){for(var l=e(r)&u,c=s[l],h=0;c!=i;){if(n(c,r))return a[l]=o;if(++h>=t)throw new Error("full hashmap");c=s[l=l+1&u]}return s[l]=r,a[l]=o,o}function h(r,o){for(var l=e(r)&u,c=s[l],h=0;c!=i;){if(n(c,r))return a[l];if(++h>=t)throw new Error("full hashmap");c=s[l=l+1&u]}return s[l]=r,a[l]=o,o}function p(r,o){for(var l=e(r)&u,c=s[l],h=0;c!=i;){if(n(c,r))return a[l];if(++h>=t)break;c=s[l=l+1&u]}return o}function f(){for(var t=[],e=0,n=s.length;e<n;++e){var r=s[e];r!=i&&t.push(r)}return t}return{set:c,maybeSet:h,get:p,keys:f}}function ke(t,e){return t[0]===e[0]&&t[1]===e[1]}var Ge=new ArrayBuffer(16),qe=new Float64Array(Ge),Be=new Uint32Array(Ge);function ze(t){qe[0]=t[0],qe[1]=t[1];var e=Be[0]^Be[1];return 2147483647&(e=e<<5^e>>7^Be[2]^Be[3])}function je(t){var e,n,r,i,o=t.coordinates,s=t.lines,a=t.rings,u=function(){for(var t=Fe(1.4*o.length,E,b,Int32Array,-1,Int32Array),e=new Int32Array(o.length),n=0,r=o.length;n<r;++n)e[n]=t.maybeSet(n,n);return e}(),l=new Int32Array(o.length),c=new Int32Array(o.length),h=new Int32Array(o.length),p=new Int8Array(o.length),f=0;for(e=0,n=o.length;e<n;++e)l[e]=c[e]=h[e]=-1;for(e=0,n=s.length;e<n;++e){var g=s[e],d=g[0],y=g[1];for(r=u[d],i=u[++d],++f,p[r]=1;++d<=y;)x(e,r,r=i,i=u[d]);++f,p[i]=1}for(e=0,n=o.length;e<n;++e)l[e]=-1;for(e=0,n=a.length;e<n;++e){var v=a[e],_=v[0]+1,m=v[1];for(x(e,u[m-1],r=u[_-1],i=u[_]);++_<=m;)x(e,r,r=i,i=u[_])}function x(t,e,n,r){if(l[n]!==t){l[n]=t;var i=c[n];if(i>=0){var o=h[n];i===e&&o===r||i===r&&o===e||(++f,p[n]=1)}else c[n]=e,h[n]=r}}function E(t){return ze(o[t])}function b(t,e){return ke(o[t],o[e])}l=c=h=null;var w,I=function(t,e,n,r,i){3===arguments.length&&(r=Array,i=null);for(var o=new r(t=1<<Math.max(4,Math.ceil(Math.log(t)/Math.LN2))),s=t-1,a=0;a<t;++a)o[a]=i;function u(r){for(var a=e(r)&s,u=o[a],l=0;u!=i;){if(n(u,r))return!0;if(++l>=t)throw new Error("full hashset");u=o[a=a+1&s]}return o[a]=r,!0}function l(r){for(var a=e(r)&s,u=o[a],l=0;u!=i;){if(n(u,r))return!0;if(++l>=t)break;u=o[a=a+1&s]}return!1}function c(){for(var t=[],e=0,n=o.length;e<n;++e){var r=o[e];r!=i&&t.push(r)}return t}return{add:u,has:l,values:c}}(1.4*f,ze,ke);for(e=0,n=o.length;e<n;++e)p[w=u[e]]&&I.add(o[w]);return I}function Ue(t,e,n,r){Ve(t,e,n),Ve(t,e,e+r),Ve(t,e+r,n)}function Ve(t,e,n){for(var r,i=e+(n---e>>1);e<i;++e,--n)r=t[e],t[e]=t[n],t[n]=r}function Xe(t){var e,n,r={};for(e in t)r[e]=null==(n=t[e])?{type:null}:("FeatureCollection"===n.type?Ye:"Feature"===n.type?He:We)(n);return r}function Ye(t){var e={type:"GeometryCollection",geometries:t.features.map(He)};return null!=t.bbox&&(e.bbox=t.bbox),e}function He(t){var e,n=We(t.geometry);for(e in null!=t.id&&(n.id=t.id),null!=t.bbox&&(n.bbox=t.bbox),t.properties){n.properties=t.properties;break}return n}function We(t){if(null==t)return{type:null};var e="GeometryCollection"===t.type?{type:"GeometryCollection",geometries:t.geometries.map(We)}:"Point"===t.type||"MultiPoint"===t.type?{type:t.type,coordinates:t.coordinates}:{type:t.type,arcs:t.coordinates};return null!=t.bbox&&(e.bbox=t.bbox),e}function Je(t,e){var n=function(t){var e=1/0,n=1/0,r=-1/0,i=-1/0;function o(t){null!=t&&De.call(s,t.type)&&s[t.type](t)}var s={GeometryCollection:function(t){t.geometries.forEach(o)},Point:function(t){a(t.coordinates)},MultiPoint:function(t){t.coordinates.forEach(a)},LineString:function(t){u(t.arcs)},MultiLineString:function(t){t.arcs.forEach(u)},Polygon:function(t){t.arcs.forEach(u)},MultiPolygon:function(t){t.arcs.forEach(l)}};function a(t){var o=t[0],s=t[1];o<e&&(e=o),o>r&&(r=o),s<n&&(n=s),s>i&&(i=s)}function u(t){t.forEach(a)}function l(t){t.forEach(u)}for(var c in t)o(t[c]);return r>=e&&i>=n?[e,n,r,i]:void 0}(t=Xe(t)),r=e>0&&n&&function(t,e,n){var r=e[0],i=e[1],o=e[2],s=e[3],a=o-r?(n-1)/(o-r):1,u=s-i?(n-1)/(s-i):1;function l(t){return[Math.round((t[0]-r)*a),Math.round((t[1]-i)*u)]}function c(t,e){for(var n,o,s,l,c,h=-1,p=0,f=t.length,g=new Array(f);++h<f;)n=t[h],l=Math.round((n[0]-r)*a),c=Math.round((n[1]-i)*u),l===o&&c===s||(g[p++]=[o=l,s=c]);for(g.length=p;p<e;)p=g.push([g[0][0],g[0][1]]);return g}function h(t){return c(t,2)}function p(t){return c(t,4)}function f(t){return t.map(p)}function g(t){null!=t&&De.call(d,t.type)&&d[t.type](t)}var d={GeometryCollection:function(t){t.geometries.forEach(g)},Point:function(t){t.coordinates=l(t.coordinates)},MultiPoint:function(t){t.coordinates=t.coordinates.map(l)},LineString:function(t){t.arcs=h(t.arcs)},MultiLineString:function(t){t.arcs=t.arcs.map(h)},Polygon:function(t){t.arcs=f(t.arcs)},MultiPolygon:function(t){t.arcs=t.arcs.map(f)}};for(var y in t)g(t[y]);return{scale:[1/a,1/u],translate:[r,i]}}(t,n,e),i=function(t){var e,n,r,i,o=t.coordinates,s=t.lines,a=t.rings,u=s.length+a.length;for(delete t.lines,delete t.rings,r=0,i=s.length;r<i;++r)for(e=s[r];e=e.next;)++u;for(r=0,i=a.length;r<i;++r)for(n=a[r];n=n.next;)++u;var l=Fe(2*u*1.4,ze,ke),c=t.arcs=[];for(r=0,i=s.length;r<i;++r){e=s[r];do{h(e)}while(e=e.next)}for(r=0,i=a.length;r<i;++r)if((n=a[r]).next)do{h(n)}while(n=n.next);else p(n);function h(t){var e,n,r,i,s,a,u,h;if(r=l.get(e=o[t[0]]))for(u=0,h=r.length;u<h;++u)if(f(i=r[u],t))return t[0]=i[0],void(t[1]=i[1]);if(s=l.get(n=o[t[1]]))for(u=0,h=s.length;u<h;++u)if(g(a=s[u],t))return t[1]=a[0],void(t[0]=a[1]);r?r.push(t):l.set(e,[t]),s?s.push(t):l.set(n,[t]),c.push(t)}function p(t){var e,n,r,i,s;if(n=l.get(o[t[0]]))for(i=0,s=n.length;i<s;++i){if(d(r=n[i],t))return t[0]=r[0],void(t[1]=r[1]);if(y(r,t))return t[0]=r[1],void(t[1]=r[0])}if(n=l.get(e=o[t[0]+v(t)]))for(i=0,s=n.length;i<s;++i){if(d(r=n[i],t))return t[0]=r[0],void(t[1]=r[1]);if(y(r,t))return t[0]=r[1],void(t[1]=r[0])}n?n.push(t):l.set(e,[t]),c.push(t)}function f(t,e){var n=t[0],r=e[0],i=t[1];if(n-i!=r-e[1])return!1;for(;n<=i;++n,++r)if(!ke(o[n],o[r]))return!1;return!0}function g(t,e){var n=t[0],r=e[0],i=t[1],s=e[1];if(n-i!=r-s)return!1;for(;n<=i;++n,--s)if(!ke(o[n],o[s]))return!1;return!0}function d(t,e){var n=t[0],r=e[0],i=t[1]-n;if(i!==e[1]-r)return!1;for(var s=v(t),a=v(e),u=0;u<i;++u)if(!ke(o[n+(u+s)%i],o[r+(u+a)%i]))return!1;return!0}function y(t,e){var n=t[0],r=e[0],i=t[1],s=e[1],a=i-n;if(a!==s-r)return!1;for(var u=v(t),l=a-v(e),c=0;c<a;++c)if(!ke(o[n+(c+u)%a],o[s-(c+l)%a]))return!1;return!0}function v(t){for(var e=t[0],n=t[1],r=e,i=r,s=o[r];++r<n;){var a=o[r];(a[0]<s[0]||a[0]===s[0]&&a[1]<s[1])&&(i=r,s=a)}return i-e}return t}(function(t){var e,n,r,i=je(t),o=t.coordinates,s=t.lines,a=t.rings;for(n=0,r=s.length;n<r;++n)for(var u=s[n],l=u[0],c=u[1];++l<c;)i.has(o[l])&&(e={0:l,1:u[1]},u[1]=l,u=u.next=e);for(n=0,r=a.length;n<r;++n)for(var h=a[n],p=h[0],f=p,g=h[1],d=i.has(o[p]);++f<g;)i.has(o[f])&&(d?(e={0:f,1:h[1]},h[1]=f,h=h.next=e):(Ue(o,p,g,g-f),o[g]=o[p],d=!0,f=p));return t}(function(t){var e=-1,n=[],r=[],i=[];function o(t){t&&De.call(s,t.type)&&s[t.type](t)}var s={GeometryCollection:function(t){t.geometries.forEach(o)},LineString:function(t){t.arcs=a(t.arcs)},MultiLineString:function(t){t.arcs=t.arcs.map(a)},Polygon:function(t){t.arcs=t.arcs.map(u)},MultiPolygon:function(t){t.arcs=t.arcs.map(l)}};function a(t){for(var r=0,o=t.length;r<o;++r)i[++e]=t[r];var s={0:e-o+1,1:e};return n.push(s),s}function u(t){for(var n=0,o=t.length;n<o;++n)i[++e]=t[n];var s={0:e-o+1,1:e};return r.push(s),s}function l(t){return t.map(u)}for(var c in t)o(t[c]);return{type:"Topology",coordinates:i,lines:n,rings:r,objects:t}}(t))),o=i.coordinates,s=Fe(1.4*i.arcs.length,Ze,Ke);function a(t){t&&De.call(u,t.type)&&u[t.type](t)}t=i.objects,i.bbox=n,i.arcs=i.arcs.map((function(t,e){return s.set(t,e),o.slice(t[0],t[1]+1)})),delete i.coordinates,o=null;var u={GeometryCollection:function(t){t.geometries.forEach(a)},LineString:function(t){t.arcs=l(t.arcs)},MultiLineString:function(t){t.arcs=t.arcs.map(l)},Polygon:function(t){t.arcs=t.arcs.map(l)},MultiPolygon:function(t){t.arcs=t.arcs.map(c)}};function l(t){var e=[];do{var n=s.get(t);e.push(t[0]<t[1]?n:~n)}while(t=t.next);return e}function c(t){return t.map(l)}for(var h in t)a(t[h]);return r&&(i.transform=r,i.arcs=function(t){for(var e=-1,n=t.length;++e<n;){for(var r,i,o=t[e],s=0,a=1,u=o.length,l=o[0],c=l[0],h=l[1];++s<u;)r=(l=o[s])[0],i=l[1],r===c&&i===h||(o[a++]=[r-c,i-h],c=r,h=i);1===a&&(o[a++]=[0,0]),o.length=a}return t}(i.arcs)),i}function Ze(t){var e,n=t[0],r=t[1];return r<n&&(e=n,n=r,r=e),n+31*r}function Ke(t,e){var n,r=t[0],i=t[1],o=e[0],s=e[1];return i<r&&(n=r,r=i,i=n),s<o&&(n=o,o=s,s=n),r===o&&i===s}function Qe(t,e){if(void 0===e&&(e={}),"FeatureCollection"!==it(t))throw new Error("geojson must be a FeatureCollection");if(!t.features.length)throw new Error("geojson is empty");!1!==e.mutate&&void 0!==e.mutate||(t=Ie(t));var n=[];z(t,(function(t){n.push(t.geometry)}));var r=Je({geoms:v(n).geometry});return function(t){return Re(t,Ae.apply(this,arguments))}(r,r.objects.geoms.geometries)}function $e(t,e){if(void 0===e&&(e={}),!P(e=e||{}))throw new Error("options is invalid");var n=e.mutate;if("FeatureCollection"!==it(t))throw new Error("geojson must be a FeatureCollection");if(!t.features.length)throw new Error("geojson is empty");!1!==n&&void 0!==n||(t=Ie(t));var r=function(t){var e={};z(t,(function(t){e[t.geometry.type]=!0}));var n=Object.keys(e);if(1===n.length)return n[0];return null}(t);if(!r)throw new Error("geojson must be homogenous");var i=t;switch(r){case"LineString":return Me(i,e);case"Polygon":return Qe(i,e);default:throw new Error(r+" is not supported")}}function tn(t,e){void 0===e&&(e={});var n="object"==typeof e?e.mutate:e;if(!t)throw new Error("geojson is required");var r=it(t),i=[];switch(r){case"LineString":i=en(t);break;case"MultiLineString":case"Polygon":Q(t).forEach((function(t){i.push(en(t))}));break;case"MultiPolygon":Q(t).forEach((function(t){var e=[];t.forEach((function(t){e.push(en(t))})),i.push(e)}));break;case"Point":return t;case"MultiPoint":var s={};Q(t).forEach((function(t){var e=t.join("-");Object.prototype.hasOwnProperty.call(s,e)||(i.push(t),s[e]=!0)}));break;default:throw new Error(r+" geometry not supported")}return t.coordinates?!0===n?(t.coordinates=i,t):{type:r,coordinates:i}:!0===n?(t.geometry.coordinates=i,t):o({type:r,coordinates:i},t.properties,{bbox:t.bbox,id:t.id})}function en(t){var e=Q(t);if(2===e.length&&!nn(e[0],e[1]))return e;var n=[],r=e.length-1,i=n.length;n.push(e[0]);for(var o=1;o<r;o++){var s=n[n.length-1];e[o][0]===s[0]&&e[o][1]===s[1]||(n.push(e[o]),(i=n.length)>2&&rn(n[i-3],n[i-1],n[i-2])&&n.splice(n.length-2,1))}if(n.push(e[e.length-1]),i=n.length,nn(e[0],e[e.length-1])&&i<4)throw new Error("invalid polygon");return rn(n[i-3],n[i-1],n[i-2])&&n.splice(n.length-2,1),n}function nn(t,e){return t[0]===e[0]&&t[1]===e[1]}function rn(t,e,n){var r=n[0],i=n[1],o=t[0],s=t[1],a=e[0],u=e[1],l=a-o,c=u-s;return 0===(r-o)*c-(i-s)*l&&(Math.abs(l)>=Math.abs(c)?l>0?o<=r&&r<=a:a<=r&&r<=o:c>0?s<=i&&i<=u:u<=i&&i<=s)}function on(t,e,n){var r=e.x,i=e.y,o=n.x-r,s=n.y-i;if(0!==o||0!==s){var a=((t.x-r)*o+(t.y-i)*s)/(o*o+s*s);a>1?(r=n.x,i=n.y):a>0&&(r+=o*a,i+=s*a)}return(o=t.x-r)*o+(s=t.y-i)*s}function sn(t,e,n,r,i){for(var o,s=r,a=e+1;a<n;a++){var u=on(t[a],t[e],t[n]);u>s&&(o=a,s=u)}s>r&&(o-e>1&&sn(t,e,o,r,i),i.push(t[o]),n-o>1&&sn(t,o,n,r,i))}function an(t,e){var n=t.length-1,r=[t[0]];return sn(t,0,n,e,r),r.push(t[n]),r}function un(t,e,n){if(t.length<=2)return t;var r=void 0!==e?e*e:1;return t=an(t=n?t:function(t,e){for(var n,r,i,o,s,a=t[0],u=[a],l=1,c=t.length;l<c;l++)n=t[l],i=a,o=void 0,s=void 0,o=(r=n).x-i.x,s=r.y-i.y,o*o+s*s>e&&(u.push(n),a=n);return a!==n&&u.push(n),u}(t,r),r)}function ln(t,e,n){return un(t.map((function(t){return{x:t[0],y:t[1],z:t[2]}})),e,n).map((function(t){return t.z?[t.x,t.y,t.z]:[t.x,t.y]}))}function cn(t,e,n){return t.map((function(t){var r=t.map((function(t){return{x:t[0],y:t[1]}}));if(r.length<4)throw new Error("invalid polygon");for(var i=un(r,e,n).map((function(t){return[t.x,t.y]}));!hn(i);)i=un(r,e-=.01*e,n).map((function(t){return[t.x,t.y]}));return i[i.length-1][0]===i[0][0]&&i[i.length-1][1]===i[0][1]||i.push(i[0]),i}))}function hn(t){return!(t.length<3)&&!(3===t.length&&t[2][0]===t[0][0]&&t[2][1]===t[0][1])}var pn=function(){function t(t){this.points=t.points||[],this.duration=t.duration||1e4,this.sharpness=t.sharpness||.85,this.centers=[],this.controls=[],this.stepLength=t.stepLength||60,this.length=this.points.length,this.delay=0;for(var e=0;e<this.length;e++)this.points[e].z=this.points[e].z||0;for(e=0;e<this.length-1;e++){var n=this.points[e],r=this.points[e+1];this.centers.push({x:(n.x+r.x)/2,y:(n.y+r.y)/2,z:(n.z+r.z)/2})}this.controls.push([this.points[0],this.points[0]]);for(e=0;e<this.centers.length-1;e++){var i=this.points[e+1].x-(this.centers[e].x+this.centers[e+1].x)/2,o=this.points[e+1].y-(this.centers[e].y+this.centers[e+1].y)/2,s=this.points[e+1].z-(this.centers[e].y+this.centers[e+1].z)/2;this.controls.push([{x:(1-this.sharpness)*this.points[e+1].x+this.sharpness*(this.centers[e].x+i),y:(1-this.sharpness)*this.points[e+1].y+this.sharpness*(this.centers[e].y+o),z:(1-this.sharpness)*this.points[e+1].z+this.sharpness*(this.centers[e].z+s)},{x:(1-this.sharpness)*this.points[e+1].x+this.sharpness*(this.centers[e+1].x+i),y:(1-this.sharpness)*this.points[e+1].y+this.sharpness*(this.centers[e+1].y+o),z:(1-this.sharpness)*this.points[e+1].z+this.sharpness*(this.centers[e+1].z+s)}])}return this.controls.push([this.points[this.length-1],this.points[this.length-1]]),this.steps=this.cacheSteps(this.stepLength),this}return t.prototype.cacheSteps=function(t){var e=[],n=this.pos(0);e.push(0);for(var r=0;r<this.duration;r+=10){var i=this.pos(r);Math.sqrt((i.x-n.x)*(i.x-n.x)+(i.y-n.y)*(i.y-n.y)+(i.z-n.z)*(i.z-n.z))>t&&(e.push(r),n=i)}return e},t.prototype.vector=function(t){var e=this.pos(t+10),n=this.pos(t-10);return{angle:180*Math.atan2(e.y-n.y,e.x-n.x)/3.14,speed:Math.sqrt((n.x-e.x)*(n.x-e.x)+(n.y-e.y)*(n.y-e.y)+(n.z-e.z)*(n.z-e.z))}},t.prototype.pos=function(t){var e=t-this.delay;e<0&&(e=0),e>this.duration&&(e=this.duration-1);var n=e/this.duration;if(n>=1)return this.points[this.length-1];var r=Math.floor((this.points.length-1)*n);return function(t,e,n,r,i){var o=function(t){var e=t*t;return[e*t,3*e*(1-t),3*t*(1-t)*(1-t),(1-t)*(1-t)*(1-t)]}(t);return{x:i.x*o[0]+r.x*o[1]+n.x*o[2]+e.x*o[3],y:i.y*o[0]+r.y*o[1]+n.y*o[2]+e.y*o[3],z:i.z*o[0]+r.z*o[1]+n.z*o[2]+e.z*o[3]}}((this.length-1)*n-r,this.points[r],this.controls[r][1],this.controls[r+1][0],this.points[r+1])},t}();function fn(t,e){void 0===e&&(e={});for(var n=e.resolution||1e4,r=e.sharpness||.85,i=[],o=rt(t).coordinates.map((function(t){return{x:t[0],y:t[1]}})),s=new pn({duration:n,points:o,sharpness:r}),a=function(t){var e=s.pos(t);Math.floor(t/100)%2==0&&i.push([e.x,e.y])},u=0;u<s.duration;u+=10)a(u);return a(s.duration),h(i,e.properties)}function gn(t,e){void 0===e&&(e={});var n=Number(t[0]),r=Number(t[1]),i=Number(t[2]),o=Number(t[3]);if(6===t.length)throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");var s=[n,r];return l([[s,[i,r],[i,o],[n,o],s]],e.properties,{bbox:t,id:e.id})}function dn(t){return gn(Z(t))}function yn(t){var e=t[0],n=t[1],r=t[2],i=t[3];if(me(t.slice(0,2),[r,n])>=me(t.slice(0,2),[e,i])){var o=(n+i)/2;return[e,o-(r-e)/2,r,o+(r-e)/2]}var s=(e+r)/2;return[s-(i-n)/2,n,s+(i-n)/2,i]}function vn(t,e,n,r){void 0===r&&(r={});var i=K(t),o=I(i[0]),s=I(i[1]),u=I(n),l=x(e,r.units),c=Math.asin(Math.sin(s)*Math.cos(l)+Math.cos(s)*Math.sin(l)*Math.cos(u));return a([w(o+Math.atan2(Math.sin(u)*Math.sin(l)*Math.cos(s),Math.cos(l)-Math.sin(s)*Math.sin(c))),w(c)],r.properties)}function _n(t,e,n){void 0===n&&(n={});for(var r=n.steps||64,i=n.properties?n.properties:!Array.isArray(t)&&"Feature"===t.type&&t.properties?t.properties:{},o=[],s=0;s<r;s++)o.push(vn(t,e,-360*s/r,n).geometry.coordinates);return o.push(o[0]),l([o],i)}function mn(t,e,n){if(void 0===n&&(n={}),!0===n.final)return function(t,e){var n=mn(e,t);return n=(n+180)%360}(t,e);var r=K(t),i=K(e),o=I(r[0]),s=I(i[0]),a=I(r[1]),u=I(i[1]),l=Math.sin(s-o)*Math.cos(u),c=Math.cos(a)*Math.sin(u)-Math.sin(a)*Math.cos(u)*Math.cos(s-o);return w(Math.atan2(l,c))}function xn(t,e){void 0===e&&(e={});var n=Z(t);return a([(n[0]+n[2])/2,(n[1]+n[3])/2],e.properties,e)}function En(t,e){void 0===e&&(e={});var n=0,r=0,i=0;return R(t,(function(t){n+=t[0],r+=t[1],i++}),!0),a([n/i,r/i],e.properties)}function bn(t){var e=[];return"FeatureCollection"===t.type?F(t,(function(t){R(t,(function(n){e.push(a(n,t.properties))}))})):R(t,(function(n){e.push(a(n,t.properties))})),f(e)}var wn=Nn,In=Nn;function Nn(t,e,n){n=n||2;var r,i,o,s,a,u,l,c=e&&e.length,h=c?e[0]*n:t.length,p=Sn(t,0,h,n,!0),f=[];if(!p)return f;if(c&&(p=function(t,e,n,r){var i,o,s,a=[];for(i=0,o=e.length;i<o;i++)(s=Sn(t,e[i]*r,i<o-1?e[i+1]*r:t.length,r,!1))===s.next&&(s.steiner=!0),a.push(Fn(s));for(a.sort(Tn),i=0;i<a.length;i++)An(a[i],n),n=Cn(n,n.next);return n}(t,e,p,n)),t.length>80*n){r=o=t[0],i=s=t[1];for(var g=n;g<h;g+=n)(a=t[g])<r&&(r=a),(u=t[g+1])<i&&(i=u),a>o&&(o=a),u>s&&(s=u);l=0!==(l=Math.max(o-r,s-i))?1/l:0}return Pn(p,f,n,r,i,l),f}function Sn(t,e,n,r,i){var o,s;if(i===Hn(t,e,n,r)>0)for(o=e;o<n;o+=r)s=Vn(o,t[o],t[o+1],s);else for(o=n-r;o>=e;o-=r)s=Vn(o,t[o],t[o+1],s);return s&&Bn(s,s.next)&&(Xn(s),s=s.next),s}function Cn(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!Bn(r,r.next)&&0!==qn(r.prev,r,r.next))r=r.next;else{if(Xn(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function Pn(t,e,n,r,i,o,s){if(t){!s&&o&&function(t,e,n,r){var i=t;do{null===i.z&&(i.z=Dn(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,n,r,i,o,s,a,u,l=1;do{for(n=t,t=null,o=null,s=0;n;){for(s++,r=n,a=0,e=0;e<l&&(a++,r=r.nextZ);e++);for(u=l;a>0||u>0&&r;)0!==a&&(0===u||!r||n.z<=r.z)?(i=n,n=n.nextZ,a--):(i=r,r=r.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;n=r}o.nextZ=null,l*=2}while(s>1)}(i)}(t,r,i,o);for(var a,u,l=t;t.prev!==t.next;)if(a=t.prev,u=t.next,o?Ln(t,r,i,o):Mn(t))e.push(a.i/n),e.push(t.i/n),e.push(u.i/n),Xn(t),t=u.next,l=u.next;else if((t=u)===l){s?1===s?Pn(t=On(t,e,n),e,n,r,i,o,2):2===s&&Rn(t,e,n,r,i,o):Pn(Cn(t),e,n,r,i,o,1);break}}}function Mn(t){var e=t.prev,n=t,r=t.next;if(qn(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(kn(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&qn(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Ln(t,e,n,r){var i=t.prev,o=t,s=t.next;if(qn(i,o,s)>=0)return!1;for(var a=i.x<o.x?i.x<s.x?i.x:s.x:o.x<s.x?o.x:s.x,u=i.y<o.y?i.y<s.y?i.y:s.y:o.y<s.y?o.y:s.y,l=i.x>o.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,h=Dn(a,u,e,n,r),p=Dn(l,c,e,n,r),f=t.prevZ,g=t.nextZ;f&&f.z>=h&&g&&g.z<=p;){if(f!==t.prev&&f!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&qn(f.prev,f,f.next)>=0)return!1;if(f=f.prevZ,g!==t.prev&&g!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,g.x,g.y)&&qn(g.prev,g,g.next)>=0)return!1;g=g.nextZ}for(;f&&f.z>=h;){if(f!==t.prev&&f!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&qn(f.prev,f,f.next)>=0)return!1;f=f.prevZ}for(;g&&g.z<=p;){if(g!==t.prev&&g!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,g.x,g.y)&&qn(g.prev,g,g.next)>=0)return!1;g=g.nextZ}return!0}function On(t,e,n){var r=t;do{var i=r.prev,o=r.next.next;!Bn(i,o)&&zn(i,r,r.next,o)&&jn(i,o)&&jn(o,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(o.i/n),Xn(r),Xn(r.next),r=t=o),r=r.next}while(r!==t);return r}function Rn(t,e,n,r,i,o){var s=t;do{for(var a=s.next.next;a!==s.prev;){if(s.i!==a.i&&Gn(s,a)){var u=Un(s,a);return s=Cn(s,s.next),u=Cn(u,u.next),Pn(s,e,n,r,i,o),void Pn(u,e,n,r,i,o)}a=a.next}s=s.next}while(s!==t)}function Tn(t,e){return t.x-e.x}function An(t,e){if(e=function(t,e){var n,r=e,i=t.x,o=t.y,s=-1/0;do{if(o<=r.y&&o>=r.next.y&&r.next.y!==r.y){var a=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(a<=i&&a>s){if(s=a,a===i){if(o===r.y)return r;if(o===r.next.y)return r.next}n=r.x<r.next.x?r:r.next}}r=r.next}while(r!==e);if(!n)return null;if(i===s)return n.prev;var u,l=n,c=n.x,h=n.y,p=1/0;r=n.next;for(;r!==l;)i>=r.x&&r.x>=c&&i!==r.x&&kn(o<h?i:s,o,c,h,o<h?s:i,o,r.x,r.y)&&((u=Math.abs(o-r.y)/(i-r.x))<p||u===p&&r.x>n.x)&&jn(r,t)&&(n=r,p=u),r=r.next;return n}(t,e)){var n=Un(e,t);Cn(n,n.next)}}function Dn(t,e,n,r,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Fn(t){var e=t,n=t;do{e.x<n.x&&(n=e),e=e.next}while(e!==t);return n}function kn(t,e,n,r,i,o,s,a){return(i-s)*(e-a)-(t-s)*(o-a)>=0&&(t-s)*(r-a)-(n-s)*(e-a)>=0&&(n-s)*(o-a)-(i-s)*(r-a)>=0}function Gn(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&zn(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&jn(t,e)&&jn(e,t)&&function(t,e){var n=t,r=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&i<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}(t,e)}function qn(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function Bn(t,e){return t.x===e.x&&t.y===e.y}function zn(t,e,n,r){return!!(Bn(t,e)&&Bn(n,r)||Bn(t,r)&&Bn(n,e))||qn(t,e,n)>0!=qn(t,e,r)>0&&qn(n,r,t)>0!=qn(n,r,e)>0}function jn(t,e){return qn(t.prev,t,t.next)<0?qn(t,e,t.next)>=0&&qn(t,t.prev,e)>=0:qn(t,e,t.prev)<0||qn(t,t.next,e)<0}function Un(t,e){var n=new Yn(t.i,t.x,t.y),r=new Yn(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,o.next=r,r.prev=o,r}function Vn(t,e,n,r){var i=new Yn(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function Xn(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Yn(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Hn(t,e,n,r){for(var i=0,o=e,s=n-r;o<n;o+=r)i+=(t[s]-t[o])*(t[o+1]+t[s+1]),s=o;return i}function Wn(t){var e=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},r=0,i=0;i<t.length;i++){for(var o=0;o<t[i].length;o++)for(var s=0;s<e;s++)n.vertices.push(t[i][o][s]);i>0&&(r+=t[i-1].length,n.holes.push(r))}return n}(t),n=wn(e.vertices,e.holes,2),r=[],i=[];n.forEach((function(t,r){var o=n[r];i.push([e.vertices[2*o],e.vertices[2*o+1]])}));for(var o=0;o<i.length;o+=3){var s=i.slice(o,o+3);s.push(i[o]),r.push(l([s]))}return r}function Jn(t,e){if(!t)throw new Error("targetPoint is required");if(!e)throw new Error("points is required");var n,r=1/0,i=0;return F(e,(function(e,n){var o=me(t,e);o<r&&(i=n,r=o)})),(n=Ie(e.features[i])).properties.featureIndex=i,n.properties.distanceToPoint=r,n}function Zn(t){if(!t)throw new Error("geojson is required");var e=[];return z(t,(function(t){!function(t,e){var n=[],r=t.geometry;if(null!==r){switch(r.type){case"Polygon":n=Q(r);break;case"LineString":n=[Q(r)]}n.forEach((function(n){(function(t,e){var n=[];return t.reduce((function(t,r){var i=h([t,r],e);return i.bbox=function(t,e){var n=t[0],r=t[1],i=e[0],o=e[1];return[n<i?n:i,r<o?r:o,n>i?n:i,r>o?r:o]}(t,r),n.push(i),r})),n})(n,t.properties).forEach((function(t){t.id=e.length,e.push(t)}))}))}}(t,e)})),f(e)}Nn.deviation=function(t,e,n,r){var i=e&&e.length,o=i?e[0]*n:t.length,s=Math.abs(Hn(t,0,o,n));if(i)for(var a=0,u=e.length;a<u;a++){var l=e[a]*n,c=a<u-1?e[a+1]*n:t.length;s-=Math.abs(Hn(t,l,c,n))}var h=0;for(a=0;a<r.length;a+=3){var p=r[a]*n,f=r[a+1]*n,g=r[a+2]*n;h+=Math.abs((t[p]-t[g])*(t[f+1]-t[p+1])-(t[p]-t[f])*(t[g+1]-t[p+1]))}return 0===s&&0===h?0:Math.abs((h-s)/s)},Nn.flatten=function(t){for(var e=t[0][0].length,n={vertices:[],holes:[],dimensions:e},r=0,i=0;i<t.length;i++){for(var o=0;o<t[i].length;o++)for(var s=0;s<e;s++)n.vertices.push(t[i][o][s]);i>0&&(r+=t[i-1].length,n.holes.push(r))}return n},wn.default=In;var Kn=Bt((function(t,e){function n(t,e,n){void 0===n&&(n={});var r={type:"Feature"};return(0===n.id||n.id)&&(r.id=n.id),n.bbox&&(r.bbox=n.bbox),r.properties=e||{},r.geometry=t,r}function r(t,e,r){if(void 0===r&&(r={}),!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!f(t[0])||!f(t[1]))throw new Error("coordinates must contain numbers");return n({type:"Point",coordinates:t},e,r)}function i(t,e,r){void 0===r&&(r={});for(var i=0,o=t;i<o.length;i++){var s=o[i];if(s.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");for(var a=0;a<s[s.length-1].length;a++)if(s[s.length-1][a]!==s[0][a])throw new Error("First and last Position are not equivalent.")}return n({type:"Polygon",coordinates:t},e,r)}function o(t,e,r){if(void 0===r&&(r={}),t.length<2)throw new Error("coordinates must be an array of two or more positions");return n({type:"LineString",coordinates:t},e,r)}function s(t,e){void 0===e&&(e={});var n={type:"FeatureCollection"};return e.id&&(n.id=e.id),e.bbox&&(n.bbox=e.bbox),n.features=t,n}function a(t,e,r){return void 0===r&&(r={}),n({type:"MultiLineString",coordinates:t},e,r)}function u(t,e,r){return void 0===r&&(r={}),n({type:"MultiPoint",coordinates:t},e,r)}function l(t,e,r){return void 0===r&&(r={}),n({type:"MultiPolygon",coordinates:t},e,r)}function c(t,n){void 0===n&&(n="kilometers");var r=e.factors[n];if(!r)throw new Error(n+" units is invalid");return t*r}function h(t,n){void 0===n&&(n="kilometers");var r=e.factors[n];if(!r)throw new Error(n+" units is invalid");return t/r}function p(t){return 180*(t%(2*Math.PI))/Math.PI}function f(t){return!isNaN(t)&&null!==t&&!Array.isArray(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.earthRadius=6371008.8,e.factors={centimeters:100*e.earthRadius,centimetres:100*e.earthRadius,degrees:e.earthRadius/111325,feet:3.28084*e.earthRadius,inches:39.37*e.earthRadius,kilometers:e.earthRadius/1e3,kilometres:e.earthRadius/1e3,meters:e.earthRadius,metres:e.earthRadius,miles:e.earthRadius/1609.344,millimeters:1e3*e.earthRadius,millimetres:1e3*e.earthRadius,nauticalmiles:e.earthRadius/1852,radians:1,yards:1.0936*e.earthRadius},e.unitsFactors={centimeters:100,centimetres:100,degrees:1/111325,feet:3.28084,inches:39.37,kilometers:.001,kilometres:.001,meters:1,metres:1,miles:1/1609.344,millimeters:1e3,millimetres:1e3,nauticalmiles:1/1852,radians:1/e.earthRadius,yards:1.0936133},e.areaFactors={acres:247105e-9,centimeters:1e4,centimetres:1e4,feet:10.763910417,hectares:1e-4,inches:1550.003100006,kilometers:1e-6,kilometres:1e-6,meters:1,metres:1,miles:386e-9,millimeters:1e6,millimetres:1e6,yards:1.195990046},e.feature=n,e.geometry=function(t,e,n){switch(t){case"Point":return r(e).geometry;case"LineString":return o(e).geometry;case"Polygon":return i(e).geometry;case"MultiPoint":return u(e).geometry;case"MultiLineString":return a(e).geometry;case"MultiPolygon":return l(e).geometry;default:throw new Error(t+" is invalid")}},e.point=r,e.points=function(t,e,n){return void 0===n&&(n={}),s(t.map((function(t){return r(t,e)})),n)},e.polygon=i,e.polygons=function(t,e,n){return void 0===n&&(n={}),s(t.map((function(t){return i(t,e)})),n)},e.lineString=o,e.lineStrings=function(t,e,n){return void 0===n&&(n={}),s(t.map((function(t){return o(t,e)})),n)},e.featureCollection=s,e.multiLineString=a,e.multiPoint=u,e.multiPolygon=l,e.geometryCollection=function(t,e,r){return void 0===r&&(r={}),n({type:"GeometryCollection",geometries:t},e,r)},e.round=function(t,e){if(void 0===e&&(e=0),e&&!(e>=0))throw new Error("precision must be a positive number");var n=Math.pow(10,e||0);return Math.round(t*n)/n},e.radiansToLength=c,e.lengthToRadians=h,e.lengthToDegrees=function(t,e){return p(h(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=p,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,n){if(void 0===e&&(e="kilometers"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("length must be a positive number");return c(h(t,e),n)},e.convertArea=function(t,n,r){if(void 0===n&&(n="meters"),void 0===r&&(r="kilometers"),!(t>=0))throw new Error("area must be a positive number");var i=e.areaFactors[n];if(!i)throw new Error("invalid original units");var o=e.areaFactors[r];if(!o)throw new Error("invalid final units");return t/i*o},e.isNumber=f,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!f(t))throw new Error("bbox must only contain numbers")}))},e.validateId=function(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}}));function Qn(t,e,n){if(null!==t)for(var r,i,o,s,a,u,l,c,h=0,p=0,f=t.type,g="FeatureCollection"===f,d="Feature"===f,y=g?t.features.length:1,v=0;v<y;v++){a=(c=!!(l=g?t.features[v].geometry:d?t.geometry:t)&&"GeometryCollection"===l.type)?l.geometries.length:1;for(var _=0;_<a;_++){var m=0,x=0;if(null!==(s=c?l.geometries[_]:l)){u=s.coordinates;var E=s.type;switch(h=!n||"Polygon"!==E&&"MultiPolygon"!==E?0:1,E){case null:break;case"Point":if(!1===e(u,p,v,m,x))return!1;p++,m++;break;case"LineString":case"MultiPoint":for(r=0;r<u.length;r++){if(!1===e(u[r],p,v,m,x))return!1;p++,"MultiPoint"===E&&m++}"LineString"===E&&m++;break;case"Polygon":case"MultiLineString":for(r=0;r<u.length;r++){for(i=0;i<u[r].length-h;i++){if(!1===e(u[r][i],p,v,m,x))return!1;p++}"MultiLineString"===E&&m++,"Polygon"===E&&x++}"Polygon"===E&&m++;break;case"MultiPolygon":for(r=0;r<u.length;r++){for(x=0,i=0;i<u[r].length;i++){for(o=0;o<u[r][i].length-h;o++){if(!1===e(u[r][i][o],p,v,m,x))return!1;p++}x++}m++}break;case"GeometryCollection":for(r=0;r<s.geometries.length;r++)if(!1===Qn(s.geometries[r],e,n))return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function $n(t,e){var n;switch(t.type){case"FeatureCollection":for(n=0;n<t.features.length&&!1!==e(t.features[n].properties,n);n++);break;case"Feature":e(t.properties,0)}}function tr(t,e){if("Feature"===t.type)e(t,0);else if("FeatureCollection"===t.type)for(var n=0;n<t.features.length&&!1!==e(t.features[n],n);n++);}function er(t,e){var n,r,i,o,s,a,u,l,c,h,p=0,f="FeatureCollection"===t.type,g="Feature"===t.type,d=f?t.features.length:1;for(n=0;n<d;n++){for(a=f?t.features[n].geometry:g?t.geometry:t,l=f?t.features[n].properties:g?t.properties:{},c=f?t.features[n].bbox:g?t.bbox:void 0,h=f?t.features[n].id:g?t.id:void 0,s=(u=!!a&&"GeometryCollection"===a.type)?a.geometries.length:1,i=0;i<s;i++)if(null!==(o=u?a.geometries[i]:a))switch(o.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":if(!1===e(o,p,l,c,h))return!1;break;case"GeometryCollection":for(r=0;r<o.geometries.length;r++)if(!1===e(o.geometries[r],p,l,c,h))return!1;break;default:throw new Error("Unknown Geometry Type")}else if(!1===e(null,p,l,c,h))return!1;p++}}function nr(t,e){er(t,(function(t,n,r,i,o){var s,a=null===t?null:t.type;switch(a){case null:case"Point":case"LineString":case"Polygon":return!1!==e(Kn.feature(t,r,{bbox:i,id:o}),n,0)&&void 0}switch(a){case"MultiPoint":s="Point";break;case"MultiLineString":s="LineString";break;case"MultiPolygon":s="Polygon"}for(var u=0;u<t.coordinates.length;u++){var l={type:s,coordinates:t.coordinates[u]};if(!1===e(Kn.feature(l,r),n,u))return!1}}))}function rr(t,e){nr(t,(function(t,n,r){var i=0;if(t.geometry){var o=t.geometry.type;if("Point"!==o&&"MultiPoint"!==o){var s,a=0,u=0,l=0;return!1!==Qn(t,(function(o,c,h,p,f){if(void 0===s||n>a||p>u||f>l)return s=o,a=n,u=p,l=f,void(i=0);var g=Kn.lineString([s,o],t.properties);if(!1===e(g,n,r,f,i))return!1;i++,s=o}))&&void 0}}}))}function ir(t,e){if(!t)throw new Error("geojson is required");nr(t,(function(t,n,r){if(null!==t.geometry){var i=t.geometry.type,o=t.geometry.coordinates;switch(i){case"LineString":if(!1===e(t,n,r,0,0))return!1;break;case"Polygon":for(var s=0;s<o.length;s++)if(!1===e(Kn.lineString(o[s],t.properties),n,r,s))return!1}}}))}var or=function(t){var e=[];return Qn(t,(function(t){e.push(t)})),e},sr=Qn,ar=function(t,e,n,r){var i=n;return Qn(t,(function(t,r,o,s,a){i=0===r&&void 0===n?t:e(i,t,r,o,s,a)}),r),i},ur=tr,lr=function(t,e,n){var r=n;return tr(t,(function(t,i){r=0===i&&void 0===n?t:e(r,t,i)})),r},cr=function(t,e){if(e=e||{},!Kn.isObject(e))throw new Error("options is invalid");var n,r=e.featureIndex||0,i=e.multiFeatureIndex||0,o=e.geometryIndex||0,s=e.coordIndex||0,a=e.properties;switch(t.type){case"FeatureCollection":r<0&&(r=t.features.length+r),a=a||t.features[r].properties,n=t.features[r].geometry;break;case"Feature":a=a||t.properties,n=t.geometry;break;case"Point":case"MultiPoint":return null;case"LineString":case"Polygon":case"MultiLineString":case"MultiPolygon":n=t;break;default:throw new Error("geojson is invalid")}if(null===n)return null;var u=n.coordinates;switch(n.type){case"Point":return Kn.point(u,a,e);case"MultiPoint":return i<0&&(i=u.length+i),Kn.point(u[i],a,e);case"LineString":return s<0&&(s=u.length+s),Kn.point(u[s],a,e);case"Polygon":return o<0&&(o=u.length+o),s<0&&(s=u[o].length+s),Kn.point(u[o][s],a,e);case"MultiLineString":return i<0&&(i=u.length+i),s<0&&(s=u[i].length+s),Kn.point(u[i][s],a,e);case"MultiPolygon":return i<0&&(i=u.length+i),o<0&&(o=u[i].length+o),s<0&&(s=u[i][o].length-s),Kn.point(u[i][o][s],a,e)}throw new Error("geojson is invalid")},hr=function(t,e){if(e=e||{},!Kn.isObject(e))throw new Error("options is invalid");var n,r=e.featureIndex||0,i=e.multiFeatureIndex||0,o=e.geometryIndex||0,s=e.segmentIndex||0,a=e.properties;switch(t.type){case"FeatureCollection":r<0&&(r=t.features.length+r),a=a||t.features[r].properties,n=t.features[r].geometry;break;case"Feature":a=a||t.properties,n=t.geometry;break;case"Point":case"MultiPoint":return null;case"LineString":case"Polygon":case"MultiLineString":case"MultiPolygon":n=t;break;default:throw new Error("geojson is invalid")}if(null===n)return null;var u=n.coordinates;switch(n.type){case"Point":case"MultiPoint":return null;case"LineString":return s<0&&(s=u.length+s-1),Kn.lineString([u[s],u[s+1]],a,e);case"Polygon":return o<0&&(o=u.length+o),s<0&&(s=u[o].length+s-1),Kn.lineString([u[o][s],u[o][s+1]],a,e);case"MultiLineString":return i<0&&(i=u.length+i),s<0&&(s=u[i].length+s-1),Kn.lineString([u[i][s],u[i][s+1]],a,e);case"MultiPolygon":return i<0&&(i=u.length+i),o<0&&(o=u[i].length+o),s<0&&(s=u[i][o].length-s-1),Kn.lineString([u[i][o][s],u[i][o][s+1]],a,e)}throw new Error("geojson is invalid")},pr=nr,fr=function(t,e,n){var r=n;return nr(t,(function(t,i,o){r=0===i&&0===o&&void 0===n?t:e(r,t,i,o)})),r},gr=er,dr=function(t,e,n){var r=n;return er(t,(function(t,i,o,s,a){r=0===i&&void 0===n?t:e(r,t,i,o,s,a)})),r},yr=ir,vr=function(t,e,n){var r=n;return ir(t,(function(t,i,o,s){r=0===i&&void 0===n?t:e(r,t,i,o,s)})),r},_r=$n,mr=function(t,e,n){var r=n;return $n(t,(function(t,i){r=0===i&&void 0===n?t:e(r,t,i)})),r},xr=rr,Er=function(t,e,n){var r=n,i=!1;return rr(t,(function(t,o,s,a,u){r=!1===i&&void 0===n?t:e(r,t,o,s,a,u),i=!0})),r},br=Object.defineProperty({coordAll:or,coordEach:sr,coordReduce:ar,featureEach:ur,featureReduce:lr,findPoint:cr,findSegment:hr,flattenEach:pr,flattenReduce:fr,geomEach:gr,geomReduce:dr,lineEach:yr,lineReduce:vr,propEach:_r,propReduce:mr,segmentEach:xr,segmentReduce:Er},"__esModule",{value:!0});function wr(t){var e=[1/0,1/0,-1/0,-1/0];return br.coordEach(t,(function(t){e[0]>t[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]<t[0]&&(e[2]=t[0]),e[3]<t[1]&&(e[3]=t[1])})),e}wr.default=wr;var Ir=wr,Nr=Object.defineProperty({default:Ir},"__esModule",{value:!0}).default,Sr=br.featureEach,Cr=(br.coordEach,Kn.polygon,Kn.featureCollection);function Pr(t){var e=Nt(t);return e.insert=function(t){if("Feature"!==t.type)throw new Error("invalid feature");return t.bbox=t.bbox?t.bbox:Nr(t),Nt.prototype.insert.call(this,t)},e.load=function(t){var e=[];return Array.isArray(t)?t.forEach((function(t){if("Feature"!==t.type)throw new Error("invalid features");t.bbox=t.bbox?t.bbox:Nr(t),e.push(t)})):Sr(t,(function(t){if("Feature"!==t.type)throw new Error("invalid features");t.bbox=t.bbox?t.bbox:Nr(t),e.push(t)})),Nt.prototype.load.call(this,e)},e.remove=function(t,e){if("Feature"!==t.type)throw new Error("invalid feature");return t.bbox=t.bbox?t.bbox:Nr(t),Nt.prototype.remove.call(this,t,e)},e.clear=function(){return Nt.prototype.clear.call(this)},e.search=function(t){var e=Nt.prototype.search.call(this,this.toBBox(t));return Cr(e)},e.collides=function(t){return Nt.prototype.collides.call(this,this.toBBox(t))},e.all=function(){var t=Nt.prototype.all.call(this);return Cr(t)},e.toJSON=function(){return Nt.prototype.toJSON.call(this)},e.fromJSON=function(t){return Nt.prototype.fromJSON.call(this,t)},e.toBBox=function(t){var e;if(t.bbox)e=t.bbox;else if(Array.isArray(t)&&4===t.length)e=t;else if(Array.isArray(t)&&6===t.length)e=[t[0],t[1],t[3],t[4]];else if("Feature"===t.type)e=Nr(t);else{if("FeatureCollection"!==t.type)throw new Error("invalid geojson");e=Nr(t)}return{minX:e[0],minY:e[1],maxX:e[2],maxY:e[3]}},e}var Mr=Pr,Lr=Pr;function Or(t,e){var n={},r=[];if("LineString"===t.type&&(t=o(t)),"LineString"===e.type&&(e=o(e)),"Feature"===t.type&&"Feature"===e.type&&null!==t.geometry&&null!==e.geometry&&"LineString"===t.geometry.type&&"LineString"===e.geometry.type&&2===t.geometry.coordinates.length&&2===e.geometry.coordinates.length){var i=Rr(t,e);return i&&r.push(i),f(r)}var s=Mr();return s.load(Zn(e)),F(Zn(t),(function(t){F(s.search(t),(function(e){var i=Rr(t,e);if(i){var o=Q(i).join(",");n[o]||(n[o]=!0,r.push(i))}}))})),f(r)}function Rr(t,e){var n=Q(t),r=Q(e);if(2!==n.length)throw new Error("<intersects> line1 must only contain 2 coordinates");if(2!==r.length)throw new Error("<intersects> line2 must only contain 2 coordinates");var i=n[0][0],o=n[0][1],s=n[1][0],u=n[1][1],l=r[0][0],c=r[0][1],h=r[1][0],p=r[1][1],f=(p-c)*(s-i)-(h-l)*(u-o),g=(h-l)*(o-c)-(p-c)*(i-l),d=(s-i)*(o-c)-(u-o)*(i-l);if(0===f)return null;var y=g/f,v=d/f;return y>=0&&y<=1&&v>=0&&v<=1?a([i+y*(s-i),o+y*(u-o)]):null}function Tr(t,e,n){void 0===n&&(n={});var r=a([1/0,1/0],{dist:1/0}),i=0;return z(t,(function(t){for(var o=Q(t),s=0;s<o.length-1;s++){var u=a(o[s]);u.properties.dist=me(e,u,n);var l=a(o[s+1]);l.properties.dist=me(e,l,n);var c=me(u,l,n),p=Math.max(u.properties.dist,l.properties.dist),f=mn(u,l),g=vn(e,p,f+90,n),d=vn(e,p,f-90,n),y=Or(h([g.geometry.coordinates,d.geometry.coordinates]),h([u.geometry.coordinates,l.geometry.coordinates])),v=null;y.features.length>0&&((v=y.features[0]).properties.dist=me(e,v,n),v.properties.location=i+me(u,v,n)),u.properties.dist<r.properties.dist&&((r=u).properties.index=s,r.properties.location=i),l.properties.dist<r.properties.dist&&((r=l).properties.index=s+1,r.properties.location=i+c),v&&v.properties.dist<r.properties.dist&&((r=v).properties.index=s),i+=c}})),r}function Ar(t,n,r){void 0===r&&(r={});var i=K(t),o=K(n);return o[0]+=o[0]-i[0]>180?-360:i[0]-o[0]>180?360:0,N(function(t,n,r){var i=r=void 0===r?e:Number(r),o=t[1]*Math.PI/180,s=n[1]*Math.PI/180,a=s-o,u=Math.abs(n[0]-t[0])*Math.PI/180;u>Math.PI&&(u-=2*Math.PI);var l=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),c=Math.abs(l)>1e-11?a/l:Math.cos(o);return Math.sqrt(a*a+c*c*u*u)*i}(i,o),"meters",r.units)}function Dr(t,e,n){if(void 0===n&&(n={}),n.method||(n.method="geodesic"),n.units||(n.units="kilometers"),!t)throw new Error("pt is required");if(Array.isArray(t)?t=a(t):"Point"===t.type?t=o(t):et(t,"Point","point"),!e)throw new Error("line is required");Array.isArray(e)?e=h(e):"LineString"===e.type?e=o(e):et(e,"LineString","line");var r=1/0,i=t.geometry.coordinates;return U(e,(function(t){var e=t.geometry.coordinates[0],o=t.geometry.coordinates[1],s=function(t,e,n,r){var i=[n[0]-e[0],n[1]-e[1]],o=Fr([t[0]-e[0],t[1]-e[1]],i);if(o<=0)return kr(t,e,{method:r.method,units:"degrees"});var s=Fr(i,i);if(s<=o)return kr(t,n,{method:r.method,units:"degrees"});var a=o/s,u=[e[0]+a*i[0],e[1]+a*i[1]];return kr(t,u,{method:r.method,units:"degrees"})}(i,e,o,n);s<r&&(r=s)})),N(r,"degrees",n.units)}function Fr(t,e){return t[0]*e[0]+t[1]*e[1]}function kr(t,e,n){return"planar"===n.method?Ar(t,e,n):me(t,e,n)}function Gr(t,e,n,r,i,o,s,a){var u,l,c,h,p={x:null,y:null,onLine1:!1,onLine2:!1};return 0===(u=(a-o)*(n-t)-(s-i)*(r-e))?null!==p.x&&null!==p.y&&p:(h=(n-t)*(l=e-o)-(r-e)*(c=t-i),l=((s-i)*l-(a-o)*c)/u,c=h/u,p.x=t+l*(n-t),p.y=e+l*(r-e),l>=0&&l<=1&&(p.onLine1=!0),c>=0&&c<=1&&(p.onLine2=!0),!(!p.onLine1||!p.onLine2)&&[p.x,p.y])}function qr(t){for(var e=function(t){if("FeatureCollection"!==t.type)return"Feature"!==t.type?f([o(t)]):f([t]);return t}(t),n=xn(e),r=!1,i=0;!r&&i<e.features.length;){var s,u=e.features[i].geometry,l=!1;if("Point"===u.type)n.geometry.coordinates[0]===u.coordinates[0]&&n.geometry.coordinates[1]===u.coordinates[1]&&(r=!0);else if("MultiPoint"===u.type){var c=!1;for(s=0;!c&&s<u.coordinates.length;)n.geometry.coordinates[0]===u.coordinates[s][0]&&n.geometry.coordinates[1]===u.coordinates[s][1]&&(r=!0,c=!0),s++}else if("LineString"===u.type)for(s=0;!l&&s<u.coordinates.length-1;)Br(n.geometry.coordinates[0],n.geometry.coordinates[1],u.coordinates[s][0],u.coordinates[s][1],u.coordinates[s+1][0],u.coordinates[s+1][1])&&(l=!0,r=!0),s++;else if("MultiLineString"===u.type)for(var h=0;h<u.coordinates.length;){l=!1,s=0;for(var p=u.coordinates[h];!l&&s<p.length-1;)Br(n.geometry.coordinates[0],n.geometry.coordinates[1],p[s][0],p[s][1],p[s+1][0],p[s+1][1])&&(l=!0,r=!0),s++;h++}else"Polygon"!==u.type&&"MultiPolygon"!==u.type||ye(n,u)&&(r=!0);i++}if(r)return n;var g=f([]);for(i=0;i<e.features.length;i++)g.features=g.features.concat(bn(e.features[i]).features);return a(Jn(n,g).geometry.coordinates)}function Br(t,e,n,r,i,o){return Math.sqrt((i-n)*(i-n)+(o-r)*(o-r))===Math.sqrt((t-n)*(t-n)+(e-r)*(e-r))+Math.sqrt((i-t)*(i-t)+(o-e)*(o-e))}Mr.default=Lr;var zr=6378137;function jr(t){return B(t,(function(t,e){return t+function(t){var e,n=0;switch(t.type){case"Polygon":return Ur(t.coordinates);case"MultiPolygon":for(e=0;e<t.coordinates.length;e++)n+=Ur(t.coordinates[e]);return n;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0}return 0}(e)}),0)}function Ur(t){var e=0;if(t&&t.length>0){e+=Math.abs(Vr(t[0]));for(var n=1;n<t.length;n++)e-=Math.abs(Vr(t[n]))}return e}function Vr(t){var e,n,r,i,o,s,a=0,u=t.length;if(u>2){for(s=0;s<u;s++)s===u-2?(r=u-2,i=u-1,o=0):s===u-1?(r=u-1,i=0,o=1):(r=s,i=s+1,o=s+2),e=t[r],n=t[i],a+=(Xr(t[o][0])-Xr(e[0]))*Math.sin(Xr(n[1]));a=a*zr*zr/2}return a}function Xr(t){return t*Math.PI/180}function Yr(t,e){return void 0===e&&(e={}),V(t,(function(t,n){var r=n.geometry.coordinates;return t+me(r[0],r[1],e)}),0)}function Hr(t,e,n,r){if(!P(r=r||{}))throw new Error("options is invalid");var i,o=[];if("Feature"===t.type)i=t.geometry.coordinates;else{if("LineString"!==t.type)throw new Error("input must be a LineString Feature or Geometry");i=t.coordinates}for(var s,a,u,l=i.length,c=0,p=0;p<i.length&&!(e>=c&&p===i.length-1);p++){if(c>e&&0===o.length){if(!(s=e-c))return o.push(i[p]),h(o);a=mn(i[p],i[p-1])-180,u=vn(i[p],s,a,r),o.push(u.geometry.coordinates)}if(c>=n)return(s=n-c)?(a=mn(i[p],i[p-1])-180,u=vn(i[p],s,a,r),o.push(u.geometry.coordinates),h(o)):(o.push(i[p]),h(o));if(c>=e&&o.push(i[p]),p===i.length-1)return h(o);c+=me(i[p],i[p+1],r)}if(c<e&&i.length===l)throw new Error("Start position is beyond line");var f=i[i.length-1];return h([f,f])}function Wr(t,e,n){void 0===n&&(n={});for(var r=K(t),i=Q(e),o=0;o<i.length-1;o++){var s=!1;if(n.ignoreEndVertices&&(0===o&&(s="start"),o===i.length-2&&(s="end"),0===o&&o+1===i.length-1&&(s="both")),Jr(i[o],i[o+1],r,s,void 0===n.epsilon?null:n.epsilon))return!0}return!1}function Jr(t,e,n,r,i){var o=n[0],s=n[1],a=t[0],u=t[1],l=e[0],c=e[1],h=l-a,p=c-u,f=(n[0]-a)*p-(n[1]-u)*h;if(null!==i){if(Math.abs(f)>i)return!1}else if(0!==f)return!1;return r?"start"===r?Math.abs(h)>=Math.abs(p)?h>0?a<o&&o<=l:l<=o&&o<a:p>0?u<s&&s<=c:c<=s&&s<u:"end"===r?Math.abs(h)>=Math.abs(p)?h>0?a<=o&&o<l:l<o&&o<=a:p>0?u<=s&&s<c:c<s&&s<=u:"both"===r&&(Math.abs(h)>=Math.abs(p)?h>0?a<o&&o<l:l<o&&o<a:p>0?u<s&&s<c:c<s&&s<u):Math.abs(h)>=Math.abs(p)?h>0?a<=o&&o<=l:l<=o&&o<=a:p>0?u<=s&&s<=c:c<=s&&s<=u}function Zr(t,e){var n=rt(t),r=rt(e),i=n.type,o=r.type;switch(i){case"Point":switch(o){case"MultiPoint":return function(t,e){var n,r=!1;for(n=0;n<e.coordinates.length;n++)if(Qr(e.coordinates[n],t.coordinates)){r=!0;break}return r}(n,r);case"LineString":return Wr(n,r,{ignoreEndVertices:!0});case"Polygon":case"MultiPolygon":return ye(n,r,{ignoreBoundary:!0});default:throw new Error("feature2 "+o+" geometry not supported")}case"MultiPoint":switch(o){case"MultiPoint":return function(t,e){for(var n=0;n<t.coordinates.length;n++){for(var r=!1,i=0;i<e.coordinates.length;i++)Qr(t.coordinates[n],e.coordinates[i])&&(r=!0);if(!r)return!1}return!0}(n,r);case"LineString":return function(t,e){for(var n=!1,r=0;r<t.coordinates.length;r++){if(!Wr(t.coordinates[r],e))return!1;n||(n=Wr(t.coordinates[r],e,{ignoreEndVertices:!0}))}return n}(n,r);case"Polygon":case"MultiPolygon":return function(t,e){for(var n=!0,r=!1,i=0;i<t.coordinates.length;i++){if(!(r=ye(t.coordinates[1],e))){n=!1;break}r=ye(t.coordinates[1],e,{ignoreBoundary:!0})}return n&&r}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"LineString":switch(o){case"LineString":return function(t,e){for(var n=0;n<t.coordinates.length;n++)if(!Wr(t.coordinates[n],e))return!1;return!0}(n,r);case"Polygon":case"MultiPolygon":return function(t,e){var n=Z(e),r=Z(t);if(!Kr(n,r))return!1;for(var i=!1,o=0;o<t.coordinates.length-1;o++){if(!ye(t.coordinates[o],e))return!1;if(i||(i=ye(t.coordinates[o],e,{ignoreBoundary:!0})),!i)i=ye($r(t.coordinates[o],t.coordinates[o+1]),e,{ignoreBoundary:!0})}return i}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"Polygon":switch(o){case"Polygon":case"MultiPolygon":return function(t,e){var n=Z(t);if(!Kr(Z(e),n))return!1;for(var r=0;r<t.coordinates[0].length;r++)if(!ye(t.coordinates[0][r],e))return!1;return!0}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}default:throw new Error("feature1 "+i+" geometry not supported")}}function Kr(t,e){return!(t[0]>e[0])&&(!(t[2]<e[2])&&(!(t[1]>e[1])&&!(t[3]<e[3])))}function Qr(t,e){return t[0]===e[0]&&t[1]===e[1]}function $r(t,e){return[(t[0]+e[0])/2,(t[1]+e[1])/2]}function ti(t,e,n){void 0===n&&(n={}),n.mask&&!n.units&&(n.units="kilometers");for(var r=[],i=t[0],o=t[1],s=t[2],u=t[3],l=e/me([i,o],[s,o],n)*(s-i),c=e/me([i,o],[i,u],n)*(u-o),h=s-i,p=u-o,g=Math.floor(h/l),d=(p-Math.floor(p/c)*c)/2,y=i+(h-g*l)/2;y<=s;){for(var v=o+d;v<=u;){var _=a([y,v],n.properties);n.mask?Zr(_,n.mask)&&r.push(_):r.push(_),v+=c}y+=l}return f(r)}function ei(t,e){void 0===e&&(e={});var n=e.precision,r=e.coordinates,i=e.mutate;if(n=null==n||isNaN(n)?6:n,r=null==r||isNaN(r)?3:r,!t)throw new Error("<geojson> is required");if("number"!=typeof n)throw new Error("<precision> must be a number");if("number"!=typeof r)throw new Error("<coordinates> must be a number");!1!==i&&void 0!==i||(t=JSON.parse(JSON.stringify(t)));var o=Math.pow(10,n);return R(t,(function(t){!function(t,e,n){t.length>n&&t.splice(n,t.length);for(var r=0;r<t.length;r++)t[r]=Math.round(t[r]*e)/e}(t,o,r)})),t}function ni(t){if(!t)throw new Error("geojson is required");var e=[];return z(t,(function(t){e.push(t)})),f(e)}function ri(t,e,n){if("Polygon"!==t.geometry.type)throw new Error("The input feature must be a Polygon");void 0===n&&(n=1);var r=t.geometry.coordinates,i=[],o={};if(n){for(var s=[],a=0;a<r.length;a++)for(var u=0;u<r[a].length-1;u++)s.push(d(a,u));var l=Nt();l.load(s)}for(var c=0;c<r.length;c++)for(var h=0;h<r[c].length-1;h++){if(n)l.search(d(c,h)).forEach((function(t){var e=t.ring,n=t.edge;g(c,h,e,n)}));else for(var p=0;p<r.length;p++)for(var f=0;f<r[p].length-1;f++)g(c,h,p,f)}return e||(i={type:"Feature",geometry:{type:"MultiPoint",coordinates:i}}),i;function g(t,n,s,a){var u,l,c=r[t][n],h=r[t][n+1],p=r[s][a],f=r[s][a+1],g=function(t,e,n,r){if(ii(t,n)||ii(t,r)||ii(e,n)||ii(r,n))return null;var i=t[0],o=t[1],s=e[0],a=e[1],u=n[0],l=n[1],c=r[0],h=r[1],p=(i-s)*(l-h)-(o-a)*(u-c);return 0===p?null:[((i*a-o*s)*(u-c)-(i-s)*(u*h-l*c))/p,((i*a-o*s)*(l-h)-(o-a)*(u*h-l*c))/p]}(c,h,p,f);if(null!==g&&(u=h[0]!==c[0]?(g[0]-c[0])/(h[0]-c[0]):(g[1]-c[1])/(h[1]-c[1]),l=f[0]!==p[0]?(g[0]-p[0])/(f[0]-p[0]):(g[1]-p[1])/(f[1]-p[1]),!(u>=1||u<=0||l>=1||l<=0))){var d=g,y=!o[d];y&&(o[d]=!0),e?i.push(e(g,t,n,c,h,u,s,a,p,f,l,y)):i.push(g)}}function d(t,e){var n,i,o,s,a=r[t][e],u=r[t][e+1];return a[0]<u[0]?(n=a[0],i=u[0]):(n=u[0],i=a[0]),a[1]<u[1]?(o=a[1],s=u[1]):(o=u[1],s=a[1]),{minX:n,minY:o,maxX:i,maxY:s,ring:t,edge:e}}}function ii(t,e){if(!t||!e)return!1;if(t.length!==e.length)return!1;for(var n=0,r=t.length;n<r;n++)if(t[n]instanceof Array&&e[n]instanceof Array){if(!ii(t[n],e[n]))return!1}else if(t[n]!==e[n])return!1;return!0}function oi(t){if("Feature"!=t.type)throw new Error("The input must a geojson object of type Feature");if(void 0===t.geometry||null==t.geometry)throw new Error("The input must a geojson object with a non-empty geometry");if("Polygon"!=t.geometry.type)throw new Error("The input must be a geojson Polygon");for(var e=t.geometry.coordinates.length,n=[],r=0;r<e;r++){var i=t.geometry.coordinates[r];ci(i[0],i[i.length-1])||i.push(i[0]),n.push.apply(n,i.slice(0,i.length-1))}if(!function(t){for(var e={},n=1,r=0,i=t.length;r<i;++r){if(Object.prototype.hasOwnProperty.call(e,t[r])){n=0;break}e[t[r]]=1}return n}(n))throw new Error("The input polygon may not have duplicate vertices (except for the first and last vertex of each ring)");var o=n.length,s=ri(t,(function(t,e,n,r,i,o,s,a,u,l,c,h){return[t,e,n,r,i,o,s,a,u,l,c,h]})),a=s.length;if(0==a){var u=[];for(r=0;r<e;r++)u.push(l([t.geometry.coordinates[r]],{parent:-1,winding:li(t.geometry.coordinates[r])}));var c=f(u);return G(),q(),c}var h=[],p=[];for(r=0;r<e;r++){h.push([]);for(var g=0;g<t.geometry.coordinates[r].length-1;g++)h[r].push([new si(t.geometry.coordinates[r][hi(g+1,t.geometry.coordinates[r].length-1)],1,[r,g],[r,hi(g+1,t.geometry.coordinates[r].length-1)],void 0)]),p.push(new ai(t.geometry.coordinates[r][g],[r,hi(g-1,t.geometry.coordinates[r].length-1)],[r,g],void 0,void 0,!1,!0))}for(r=0;r<a;r++)h[s[r][1]][s[r][2]].push(new si(s[r][0],s[r][5],[s[r][1],s[r][2]],[s[r][6],s[r][7]],void 0)),s[r][11]&&p.push(new ai(s[r][0],[s[r][1],s[r][2]],[s[r][6],s[r][7]],void 0,void 0,!0,!0));var d=p.length;for(r=0;r<h.length;r++)for(g=0;g<h[r].length;g++)h[r][g].sort((function(t,e){return t.param<e.param?-1:1}));var y=[];for(r=0;r<d;r++)y.push({minX:p[r].coord[0],minY:p[r].coord[1],maxX:p[r].coord[0],maxY:p[r].coord[1],index:r});var v=Nt();v.load(y);for(r=0;r<h.length;r++)for(g=0;g<h[r].length;g++)for(var _=0;_<h[r][g].length;_++){x=_==h[r][g].length-1?h[r][hi(g+1,t.geometry.coordinates[r].length-1)][0].coord:h[r][g][_+1].coord;var m=v.search({minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]})[0];h[r][g][_].nxtIsectAlongEdgeIn=m.index}for(r=0;r<h.length;r++)for(g=0;g<h[r].length;g++)for(_=0;_<h[r][g].length;_++){var x=h[r][g][_].coord,E=(m=v.search({minX:x[0],minY:x[1],maxX:x[0],maxY:x[1]})[0]).index;E<o?p[E].nxtIsectAlongRingAndEdge2=h[r][g][_].nxtIsectAlongEdgeIn:ci(p[E].ringAndEdge1,h[r][g][_].ringAndEdgeIn)?p[E].nxtIsectAlongRingAndEdge1=h[r][g][_].nxtIsectAlongEdgeIn:p[E].nxtIsectAlongRingAndEdge2=h[r][g][_].nxtIsectAlongEdgeIn}var b=[];for(r=0,g=0;g<e;g++){var w=r;for(_=0;_<t.geometry.coordinates[g].length-1;_++)p[r].coord[0]<p[w].coord[0]&&(w=r),r++;var I=p[w].nxtIsectAlongRingAndEdge2;for(_=0;_<p.length;_++)if(p[_].nxtIsectAlongRingAndEdge1==w||p[_].nxtIsectAlongRingAndEdge2==w){var N=_;break}var S=ui([p[N].coord,p[w].coord,p[I].coord],!0)?1:-1;b.push({isect:w,parent:-1,winding:S})}b.sort((function(t,e){return p[t.isect].coord>p[e.isect].coord?-1:1}));for(u=[];b.length>0;){var C=b.pop(),P=C.isect,M=C.parent,L=C.winding,O=u.length,R=[p[P].coord],T=P;if(p[P].ringAndEdge1Walkable)var A=p[P].ringAndEdge1,D=p[P].nxtIsectAlongRingAndEdge1;else A=p[P].ringAndEdge2,D=p[P].nxtIsectAlongRingAndEdge2;for(;!ci(p[P].coord,p[D].coord);){R.push(p[D].coord);var F=void 0;for(r=0;r<b.length;r++)if(b[r].isect==D){F=r;break}if(null!=F&&b.splice(F,1),ci(A,p[D].ringAndEdge1)){if(A=p[D].ringAndEdge2,p[D].ringAndEdge2Walkable=!1,p[D].ringAndEdge1Walkable){var k={isect:D};ui([p[T].coord,p[D].coord,p[p[D].nxtIsectAlongRingAndEdge2].coord],1==L)?(k.parent=M,k.winding=-L):(k.parent=O,k.winding=L),b.push(k)}T=D,D=p[D].nxtIsectAlongRingAndEdge2}else{if(A=p[D].ringAndEdge1,p[D].ringAndEdge1Walkable=!1,p[D].ringAndEdge2Walkable){k={isect:D};ui([p[T].coord,p[D].coord,p[p[D].nxtIsectAlongRingAndEdge1].coord],1==L)?(k.parent=M,k.winding=-L):(k.parent=O,k.winding=L),b.push(k)}T=D,D=p[D].nxtIsectAlongRingAndEdge1}}R.push(p[D].coord),u.push(l([R],{index:O,parent:M,winding:L,netWinding:void 0}))}c=f(u);function G(){for(var t=[],e=0;e<c.features.length;e++)-1==c.features[e].properties.parent&&t.push(e);if(t.length>1)for(e=0;e<t.length;e++){for(var n=-1,r=0;r<c.features.length;r++)t[e]!=r&&ye(c.features[t[e]].geometry.coordinates[0][0],c.features[r],{ignoreBoundary:!0})&&jr(c.features[r])<Infinity&&(n=r);c.features[t[e]].properties.parent=n}}function q(){for(var t=0;t<c.features.length;t++)if(-1==c.features[t].properties.parent){var e=c.features[t].properties.winding;c.features[t].properties.netWinding=e,B(t,e)}}function B(t,e){for(var n=0;n<c.features.length;n++)if(c.features[n].properties.parent==t){var r=e+c.features[n].properties.winding;c.features[n].properties.netWinding=r,B(n,r)}}return G(),q(),c}var si=function(t,e,n,r,i){this.coord=t,this.param=e,this.ringAndEdgeIn=n,this.ringAndEdgeOut=r,this.nxtIsectAlongEdgeIn=i},ai=function(t,e,n,r,i,o,s){this.coord=t,this.ringAndEdge1=e,this.ringAndEdge2=n,this.nxtIsectAlongRingAndEdge1=r,this.nxtIsectAlongRingAndEdge2=i,this.ringAndEdge1Walkable=o,this.ringAndEdge2Walkable=s};function ui(t,e){if(void 0===e&&(e=!0),3!=t.length)throw new Error("This function requires an array of three points [x,y]");return(t[1][0]-t[0][0])*(t[2][1]-t[0][1])-(t[1][1]-t[0][1])*(t[2][0]-t[0][0])>=0==e}function li(t){for(var e=0,n=0;n<t.length-1;n++)t[n][0]<t[e][0]&&(e=n);if(ui([t[hi(e-1,t.length-1)],t[e],t[hi(e+1,t.length-1)]],!0))var r=1;else r=-1;return r}function ci(t,e){if(!t||!e)return!1;if(t.length!=e.length)return!1;for(var n=0,r=t.length;n<r;n++)if(t[n]instanceof Array&&e[n]instanceof Array){if(!ci(t[n],e[n]))return!1}else if(t[n]!=e[n])return!1;return!0}function hi(t,e){return(t%e+e)%e}var pi=Math.PI/180,fi=180/Math.PI,gi=function(t,e){this.lon=t,this.lat=e,this.x=pi*t,this.y=pi*e};gi.prototype.view=function(){return String(this.lon).slice(0,4)+","+String(this.lat).slice(0,4)},gi.prototype.antipode=function(){var t=-1*this.lat,e=this.lon<0?180+this.lon:-1*(180-this.lon);return new gi(e,t)};var di=function(){this.coords=[],this.length=0};di.prototype.move_to=function(t){this.length++,this.coords.push(t)};var yi=function(t){this.properties=t||{},this.geometries=[]};yi.prototype.json=function(){if(this.geometries.length<=0)return{geometry:{type:"LineString",coordinates:null},type:"Feature",properties:this.properties};if(1===this.geometries.length)return{geometry:{type:"LineString",coordinates:this.geometries[0].coords},type:"Feature",properties:this.properties};for(var t=[],e=0;e<this.geometries.length;e++)t.push(this.geometries[e].coords);return{geometry:{type:"MultiLineString",coordinates:t},type:"Feature",properties:this.properties}},yi.prototype.wkt=function(){for(var t="",e="LINESTRING(",n=function(t){e+=t[0]+" "+t[1]+","},r=0;r<this.geometries.length;r++){if(0===this.geometries[r].coords.length)return"LINESTRING(empty)";this.geometries[r].coords.forEach(n),t+=e.substring(0,e.length-1)+")"}return t};var vi=function(t,e,n){if(!t||void 0===t.x||void 0===t.y)throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");if(!e||void 0===e.x||void 0===e.y)throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");this.start=new gi(t.x,t.y),this.end=new gi(e.x,e.y),this.properties=n||{};var r=this.start.x-this.end.x,i=this.start.y-this.end.y,o=Math.pow(Math.sin(i/2),2)+Math.cos(this.start.y)*Math.cos(this.end.y)*Math.pow(Math.sin(r/2),2);if(this.g=2*Math.asin(Math.sqrt(o)),this.g===Math.PI)throw new Error("it appears "+t.view()+" and "+e.view()+" are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite");if(isNaN(this.g))throw new Error("could not calculate great circle between "+t+" and "+e)};function _i(t,e){var n=[],r=Mr();return z(e,(function(e){if(n.forEach((function(t,e){t.id=e})),n.length){var i=r.search(e);if(i.features.length){var o=xi(e,i);n=n.filter((function(t){return t.id!==o.id})),r.remove(o),F(mi(o,e),(function(t){n.push(t),r.insert(t)}))}}else(n=mi(t,e).features).forEach((function(t){t.bbox||(t.bbox=yn(Z(t)))})),r.load(f(n))})),f(n)}function mi(t,e){var n=[],r=Q(t)[0],i=Q(t)[t.geometry.coordinates.length-1];if(Ei(r,K(e))||Ei(i,K(e)))return f([t]);var o=Mr(),s=Zn(t);o.load(s);var a=o.search(e);if(!a.features.length)return f([t]);var u=xi(e,a),l=k(s,(function(t,r,i){var o=Q(r)[1],s=K(e);return i===u.id?(t.push(s),n.push(h(t)),Ei(s,o)?[s]:[s,o]):(t.push(o),t)}),[r]);return l.length>1&&n.push(h(l)),f(n)}function xi(t,e){if(!e.features.length)throw new Error("lines must contain features");if(1===e.features.length)return e.features[0];var n,r=1/0;return F(e,(function(e){var i=Tr(e,t).properties.dist;i<r&&(n=e,r=i)})),n}function Ei(t,e){return t[0]===e[0]&&t[1]===e[1]}function bi(t,e,n,r,i){void 0===i&&(i={});var o=i.steps||64,s=wi(n),a=wi(r),u=Array.isArray(t)||"Feature"!==t.type?{}:t.properties;if(s===a)return h(_n(t,e,i).geometry.coordinates[0],u);for(var l=s,c=s<a?a:a+360,p=l,f=[],g=0;p<c;)f.push(vn(t,e,p,i).geometry.coordinates),p=l+360*++g/o;return p>c&&f.push(vn(t,e,c,i).geometry.coordinates),h(f,u)}function wi(t){var e=t%360;return e<0&&(e+=360),e}function Ii(t,e){void 0===e&&(e={});var n=rt(t);switch(e.properties||"Feature"!==t.type||(e.properties=t.properties),n.type){case"Polygon":return Ni(n,e);case"MultiPolygon":return function(t,e){void 0===e&&(e={});var n=rt(t).coordinates,r=e.properties?e.properties:"Feature"===t.type?t.properties:{},i=[];return n.forEach((function(t){i.push(Si(t,r))})),f(i)}(n,e);default:throw new Error("invalid poly")}}function Ni(t,e){return void 0===e&&(e={}),Si(rt(t).coordinates,e.properties?e.properties:"Feature"===t.type?t.properties:{})}function Si(t,e){return t.length>1?g(t,e):h(t[0],e)}function Ci(t,e){var n,r,i;void 0===e&&(e={});var o=e.properties,s=null===(n=e.autoComplete)||void 0===n||n,a=null===(r=e.orderCoords)||void 0===r||r;switch(null!==(i=e.mutate)&&void 0!==i&&i||(t=Ie(t)),t.type){case"FeatureCollection":var u=[];return t.features.forEach((function(t){u.push(Q(Pi(t,{},s,a)))})),y(u,o);default:return Pi(t,o,s,a)}}function Pi(t,e,n,r){e=e||("Feature"===t.type?t.properties:{});var i=rt(t),o=i.coordinates,s=i.type;if(!o.length)throw new Error("line must contain coordinates");switch(s){case"LineString":return n&&(o=Mi(o)),l([o],e);case"MultiLineString":var a=[],u=0;return o.forEach((function(t){if(n&&(t=Mi(t)),r){var e=function(t){var e=t[0],n=t[1],r=t[2],i=t[3];return Math.abs(e-r)*Math.abs(n-i)}(Z(h(t)));e>u?(a.unshift(t),u=e):a.push(t)}else a.push(t)})),l(a,e);default:throw new Error("geometry type "+s+" is not supported")}}function Mi(t){var e=t[0],n=e[0],r=e[1],i=t[t.length-1],o=i[0],s=i[1];return n===o&&r===s||t.push(e),t}function Li(t,e){var n,r,i,o,s,a,u;for(r=1;r<=8;r*=2){for(n=[],o=!(Ri(i=t[t.length-1],e)&r),s=0;s<t.length;s++)(u=!(Ri(a=t[s],e)&r))!==o&&n.push(Oi(i,a,r,e)),u&&n.push(a),i=a,o=u;if(!(t=n).length)break}return n}function Oi(t,e,n,r){return 8&n?[t[0]+(e[0]-t[0])*(r[3]-t[1])/(e[1]-t[1]),r[3]]:4&n?[t[0]+(e[0]-t[0])*(r[1]-t[1])/(e[1]-t[1]),r[1]]:2&n?[r[2],t[1]+(e[1]-t[1])*(r[2]-t[0])/(e[0]-t[0])]:1&n?[r[0],t[1]+(e[1]-t[1])*(r[0]-t[0])/(e[0]-t[0])]:null}function Ri(t,e){var n=0;return t[0]<e[0]?n|=1:t[0]>e[2]&&(n|=2),t[1]<e[1]?n|=4:t[1]>e[3]&&(n|=8),n}function Ti(t,e){for(var n=[],r=0,i=t;r<i.length;r++){var o=Li(i[r],e);o.length>0&&(o[0][0]===o[o.length-1][0]&&o[0][1]===o[o.length-1][1]||o.push(o[0]),o.length>=4&&n.push(o))}return n}vi.prototype.interpolate=function(t){var e=Math.sin((1-t)*this.g)/Math.sin(this.g),n=Math.sin(t*this.g)/Math.sin(this.g),r=e*Math.cos(this.start.y)*Math.cos(this.start.x)+n*Math.cos(this.end.y)*Math.cos(this.end.x),i=e*Math.cos(this.start.y)*Math.sin(this.start.x)+n*Math.cos(this.end.y)*Math.sin(this.end.x),o=e*Math.sin(this.start.y)+n*Math.sin(this.end.y),s=fi*Math.atan2(o,Math.sqrt(Math.pow(r,2)+Math.pow(i,2)));return[fi*Math.atan2(i,r),s]},vi.prototype.Arc=function(t,e){var n=[];if(!t||t<=2)n.push([this.start.lon,this.start.lat]),n.push([this.end.lon,this.end.lat]);else for(var r=1/(t-1),i=0;i<t;++i){var o=r*i,s=this.interpolate(o);n.push(s)}for(var a=!1,u=0,l=e&&e.offset?e.offset:10,c=180-l,h=-180+l,p=360-l,f=1;f<n.length;++f){var g=n[f-1][0],d=n[f][0],y=Math.abs(d-g);y>p&&(d>c&&g<h||g>c&&d<h)?a=!0:y>u&&(u=y)}var v=[];if(a&&u<l){var _=[];v.push(_);for(var m=0;m<n.length;++m){var x=parseFloat(n[m][0]);if(m>0&&Math.abs(x-n[m-1][0])>p){var E=parseFloat(n[m-1][0]),b=parseFloat(n[m-1][1]),w=parseFloat(n[m][0]),I=parseFloat(n[m][1]);if(E>-180&&E<h&&180===w&&m+1<n.length&&n[m-1][0]>-180&&n[m-1][0]<h){_.push([-180,n[m][1]]),m++,_.push([n[m][0],n[m][1]]);continue}if(E>c&&E<180&&-180===w&&m+1<n.length&&n[m-1][0]>c&&n[m-1][0]<180){_.push([180,n[m][1]]),m++,_.push([n[m][0],n[m][1]]);continue}if(E<h&&w>c){var N=E;E=w,w=N;var S=b;b=I,I=S}if(E>c&&w<h&&(w+=360),E<=180&&w>=180&&E<w){var C=(180-E)/(w-E),P=C*I+(1-C)*b;_.push([n[m-1][0]>c?180:-180,P]),(_=[]).push([n[m-1][0]>c?-180:180,P]),v.push(_)}else _=[],v.push(_);_.push([x,n[m][1]])}else _.push([n[m][0],n[m][1]])}}else{var M=[];v.push(M);for(var L=0;L<n.length;++L)M.push([n[L][0],n[L][1]])}for(var O=new yi(this.properties),R=0;R<v.length;++R){var T=new di;O.geometries.push(T);for(var A=v[R],D=0;D<A.length;++D)T.move_to(A[D])}return O};var Ai=Bt((function(t,e){function n(t){var e=[];for(var n in t)e.push(n);return e}(t.exports="function"==typeof Object.keys?Object.keys:n).shim=n})),Di=Bt((function(t,e){var n="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();function r(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function i(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}(e=t.exports=n?r:i).supported=r,e.unsupported=i})),Fi=Bt((function(t){var e=Array.prototype.slice,n=t.exports=function(t,o,s){return s||(s={}),t===o||(t instanceof Date&&o instanceof Date?t.getTime()===o.getTime():!t||!o||"object"!=typeof t&&"object"!=typeof o?s.strict?t===o:t==o:function(t,o,s){var a,u;if(r(t)||r(o))return!1;if(t.prototype!==o.prototype)return!1;if(Di(t))return!!Di(o)&&(t=e.call(t),o=e.call(o),n(t,o,s));if(i(t)){if(!i(o))return!1;if(t.length!==o.length)return!1;for(a=0;a<t.length;a++)if(t[a]!==o[a])return!1;return!0}try{var l=Ai(t),c=Ai(o)}catch(t){return!1}if(l.length!=c.length)return!1;for(l.sort(),c.sort(),a=l.length-1;a>=0;a--)if(l[a]!=c[a])return!1;for(a=l.length-1;a>=0;a--)if(u=l[a],!n(t[u],o[u],s))return!1;return typeof t==typeof o}(t,o,s))};function r(t){return null==t}function i(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}}));function ki(t,e,n){if(void 0===n&&(n={}),!P(n=n||{}))throw new Error("options is invalid");var r,i=n.tolerance||0,o=[],s=Mr(),a=Zn(t);return s.load(a),U(e,(function(t){var e=!1;t&&(F(s.search(t),(function(n){if(!1===e){var o=Q(t).sort(),s=Q(n).sort();Fi(o,s)||(0===i?Wr(o[0],n)&&Wr(o[1],n):Tr(n,o[0]).properties.dist<=i&&Tr(n,o[1]).properties.dist<=i)?(e=!0,r=r?Gi(r,t):t):(0===i?Wr(s[0],t)&&Wr(s[1],t):Tr(t,s[0]).properties.dist<=i&&Tr(t,s[1]).properties.dist<=i)&&(r=r?Gi(r,n):n)}})),!1===e&&r&&(o.push(r),r=void 0))})),r&&o.push(r),f(o)}function Gi(t,e){var n=Q(e),r=Q(t),i=r[0],o=r[r.length-1],s=t.geometry.coordinates;return Fi(n[0],i)?s.unshift(n[1]):Fi(n[0],o)?s.push(n[1]):Fi(n[1],i)?s.unshift(n[0]):Fi(n[1],o)&&s.push(n[0]),t}function qi(t){var e=t%360;return e<0&&(e+=360),e}function Bi(t,e,n){var r;return void 0===n&&(n={}),(r=n.final?zi(K(e),K(t)):zi(K(t),K(e)))>180?-(360-r):r}function zi(t,e){var n=I(t[1]),r=I(e[1]),i=I(e[0]-t[0]);i>Math.PI&&(i-=2*Math.PI),i<-Math.PI&&(i+=2*Math.PI);var o=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(n/2+Math.PI/4));return(w(Math.atan2(i,o))+360)%360}function ji(t,n,r,i){void 0===i&&(i={});var o=n<0,s=N(Math.abs(n),i.units,"meters");o&&(s=-Math.abs(s));var u=K(t),l=function(t,n,r,i){i=void 0===i?e:Number(i);var o=n/i,s=t[0]*Math.PI/180,a=I(t[1]),u=I(r),l=o*Math.cos(u),c=a+l;Math.abs(c)>Math.PI/2&&(c=c>0?Math.PI-c:-Math.PI-c);var h=Math.log(Math.tan(c/2+Math.PI/4)/Math.tan(a/2+Math.PI/4)),p=Math.abs(h)>1e-11?l/h:Math.cos(a),f=o*Math.sin(u)/p;return[(180*(s+f)/Math.PI+540)%360-180,180*c/Math.PI]}(u,s,r);return l[0]+=l[0]-u[0]>180?-360:u[0]-l[0]>180?360:0,a(l,i.properties)}function Ui(t,e,n,r,i,o){for(var s=0;s<t.length;s++){var a=t[s],u=t[s+1];s===t.length-1&&(u=t[0]),r=Xi(a,u,e),n<=0&&r>0?Xi(e,a,i)<0||(i=a):n>0&&r<=0&&(Vi(e,a,o)||(o=a)),n=r}return[i,o]}function Vi(t,e,n){return Xi(t,e,n)>0}function Xi(t,e,n){return(e[0]-t[0])*(n[1]-t[1])-(n[0]-t[0])*(e[1]-t[1])}function Yi(t){for(var e,n,r=Q(t),i=0,o=1;o<r.length;)e=n||r[0],i+=((n=r[o])[0]-e[0])*(n[1]+e[1]),o++;return i>0}function Hi(t,e){switch("Feature"===t.type?t.geometry.type:t.type){case"GeometryCollection":return q(t,(function(t){Hi(t,e)})),t;case"LineString":return Wi(Q(t),e),t;case"Polygon":return Ji(Q(t),e),t;case"MultiLineString":return Q(t).forEach((function(t){Wi(t,e)})),t;case"MultiPolygon":return Q(t).forEach((function(t){Ji(t,e)})),t;case"Point":case"MultiPoint":return t}}function Wi(t,e){Yi(t)===e&&t.reverse()}function Ji(t,e){Yi(t[0])!==e&&t[0].reverse();for(var n=1;n<t.length;n++)Yi(t[n])===e&&t[n].reverse()}function Zi(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.zProperty||"elevation",r=e.flip,i=e.flags;nt(t,"Point","input must contain Points");for(var o=function(t,e){var n={};return F(t,(function(t){var e=Q(t)[1];n[e]||(n[e]=[]),n[e].push(t)})),Object.keys(n).map((function(t){return n[t].sort((function(t,e){return Q(t)[0]-Q(e)[0]}))})).sort((function(t,n){return e?Q(t[0])[1]-Q(n[0])[1]:Q(n[0])[1]-Q(t[0])[1]}))} /*! * @license GNU Affero General Public License. * Copyright (c) 2015, 2015 Ronny Lorenz <[email protected]> * v. 1.2.0 * https://github.com/RaumZeit/MarchingSquares.js * * MarchingSquaresJS is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MarchingSquaresJS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * As additional permission under GNU Affero General Public License version 3 * section 7, third-party projects (personal or commercial) may distribute, * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the * requirement that said third-party project for that reason alone becomes * subject to any requirement of the GNU Affero General Public License version 3. * Any modifications to MarchingSquaresJS, however, must be shared with the public * and made available. * * In summary this: * - allows you to use MarchingSquaresJS at no cost * - allows you to use MarchingSquaresJS for both personal and commercial purposes * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any * license as long as this license notice is included * - enables you to keep the source code of your program that uses MarchingSquaresJS * undisclosed * - forces you to share any modifications you have made to MarchingSquaresJS, * e.g. bug-fixes * * You should have received a copy of the GNU Affero General Public License * along with MarchingSquaresJS. If not, see <http://www.gnu.org/licenses/>. */(t,r),s=[],a=0;a<o.length;a++){for(var u=o[a],l=[],c=0;c<u.length;c++){var h=u[c];h.properties[n]?l.push(h.properties[n]):l.push(0),!0===i&&(h.properties.matrixPosition=[a,c])}s.push(l)}return s}var Ki={successCallback:null,verbose:!1,polygons:!1},Qi={};function $i(t,e,n,r){r=r||{};for(var i=Object.keys(Ki),o=0;o<i.length;o++){var s=i[o],a=r[s];a=null!=a?a:Ki[s],Qi[s]=a}Qi.verbose&&console.log("MarchingSquaresJS-isoBands: computing isobands for ["+e+":"+(e+n)+"]");var u,l=function(t,e,n){for(var r=t.length-1,i=t[0].length-1,o={rows:r,cols:i,cells:[]},s=e+Math.abs(n),a=0;a<r;++a){o.cells[a]=[];for(var u=0;u<i;++u){var l=0,c=t[a+1][u],h=t[a+1][u+1],p=t[a][u+1],f=t[a][u];if(!(isNaN(c)||isNaN(h)||isNaN(p)||isNaN(f))){l|=c<e?0:c>s?128:64,l|=h<e?0:h>s?32:16,l|=p<e?0:p>s?8:4;var g=+(l|=f<e?0:f>s?2:1),d=0;if(17===l||18===l||33===l||34===l||38===l||68===l||72===l||98===l||102===l||132===l||136===l||137===l||152===l||153===l){var y=(c+h+p+f)/4;d=y>s?2:y<e?0:1,34===l?1===d?l=35:0===d&&(l=136):136===l?1===d?(l=35,d=4):0===d&&(l=34):17===l?1===d?(l=155,d=4):0===d&&(l=153):68===l?1===d?(l=103,d=4):0===d&&(l=102):153===l?1===d&&(l=155):102===l?1===d&&(l=103):152===l?d<2&&(l=156,d=1):137===l?d<2&&(l=139,d=1):98===l?d<2&&(l=99,d=1):38===l?d<2&&(l=39,d=1):18===l?d>0?(l=156,d=4):l=152:33===l?d>0?(l=139,d=4):l=137:72===l?d>0?(l=99,d=4):l=98:132===l&&(d>0?(l=39,d=4):l=38)}if(0!=l&&170!=l){var v,_,m,x,E,b,w,I;v=_=m=x=E=b=w=I=.5;var N=[];1===l?(m=1-Vo(e,p,f),I=1-Vo(e,c,f),N.push(Go[l])):169===l?(m=Vo(s,f,p),I=Vo(s,f,c),N.push(Go[l])):4===l?(b=1-Vo(e,h,p),x=Vo(e,f,p),N.push(Fo[l])):166===l?(b=Vo(s,p,h),x=1-Vo(s,p,f),N.push(Fo[l])):16===l?(E=Vo(e,p,h),_=Vo(e,c,h),N.push(Do[l])):154===l?(E=1-Vo(s,h,p),_=1-Vo(s,h,c),N.push(Do[l])):64===l?(w=Vo(e,f,c),v=1-Vo(e,h,c),N.push(Bo[l])):106===l?(w=1-Vo(s,c,f),v=Vo(s,c,h),N.push(Bo[l])):168===l?(x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),N.push(ko[l]),N.push(Go[l])):2===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(ko[l]),N.push(Go[l])):162===l?(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),N.push(ko[l]),N.push(Go[l])):8===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),N.push(Do[l]),N.push(Fo[l])):138===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):32===l?(E=Vo(s,p,h),b=Vo(e,p,h),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):42===l?(I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(qo[l]),N.push(Bo[l])):128===l&&(I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(qo[l]),N.push(Bo[l])),5===l?(b=1-Vo(e,h,p),I=1-Vo(e,c,f),N.push(Fo[l])):165===l?(b=Vo(s,p,h),I=Vo(s,f,c),N.push(Fo[l])):20===l?(x=Vo(e,f,p),_=Vo(e,c,h),N.push(ko[l])):150===l?(x=1-Vo(s,p,f),_=1-Vo(s,h,c),N.push(ko[l])):80===l?(E=Vo(e,p,h),w=Vo(e,f,c),N.push(Do[l])):90===l?(E=1-Vo(s,h,p),w=1-Vo(s,c,f),N.push(Do[l])):65===l?(m=1-Vo(e,p,f),v=1-Vo(e,h,c),N.push(Go[l])):105===l?(m=Vo(s,f,p),v=Vo(s,c,h),N.push(Go[l])):160===l?(E=Vo(s,p,h),b=Vo(e,p,h),I=Vo(e,f,c),w=Vo(s,f,c),N.push(Do[l]),N.push(Fo[l])):10===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(Do[l]),N.push(Fo[l])):130===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(ko[l]),N.push(Go[l])):40===l?(x=Vo(s,f,p),m=Vo(e,f,p),v=Vo(e,c,h),_=Vo(s,c,h),N.push(ko[l]),N.push(Go[l])):101===l?(b=Vo(s,p,h),v=Vo(s,c,h),N.push(Fo[l])):69===l?(b=1-Vo(e,h,p),v=1-Vo(e,h,c),N.push(Fo[l])):149===l?(I=Vo(s,f,c),_=1-Vo(s,h,c),N.push(qo[l])):21===l?(I=1-Vo(e,c,f),_=Vo(e,c,h),N.push(qo[l])):86===l?(x=1-Vo(s,p,f),w=1-Vo(s,c,f),N.push(ko[l])):84===l?(x=Vo(e,f,p),w=Vo(e,f,c),N.push(ko[l])):89===l?(E=1-Vo(s,h,p),m=Vo(s,f,p),N.push(Go[l])):81===l?(E=Vo(e,p,h),m=1-Vo(e,p,f),N.push(Go[l])):96===l?(E=Vo(s,p,h),b=Vo(e,p,h),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):74===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):24===l?(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),_=Vo(e,c,h),N.push(Do[l]),N.push(Go[l])):146===l?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),_=1-Vo(s,h,c),N.push(Do[l]),N.push(Go[l])):6===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(Fo[l]),N.push(ko[l])):164===l?(b=Vo(s,p,h),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),N.push(Fo[l]),N.push(ko[l])):129===l?(m=1-Vo(e,p,f),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Go[l]),N.push(qo[l])):41===l?(m=Vo(s,f,p),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Go[l]),N.push(qo[l])):66===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(ko[l]),N.push(Go[l])):104===l?(x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Go[l]),N.push(zo[l])):144===l?(E=Vo(e,p,h),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c),N.push(Do[l]),N.push(Bo[l])):26===l?(E=1-Vo(s,h,p),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h),N.push(Do[l]),N.push(Bo[l])):36===l?(b=Vo(s,p,h),x=Vo(e,f,p),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Fo[l]),N.push(ko[l])):134===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Fo[l]),N.push(ko[l])):9===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=1-Vo(e,c,f),N.push(Do[l]),N.push(Fo[l])):161===l?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=Vo(s,f,c),N.push(Do[l]),N.push(Fo[l])):37===l?(b=Vo(s,p,h),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Fo[l]),N.push(qo[l])):133===l?(b=1-Vo(e,h,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Fo[l]),N.push(qo[l])):148===l?(x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c),N.push(ko[l]),N.push(Bo[l])):22===l?(x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h),N.push(ko[l]),N.push(Bo[l])):82===l?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),N.push(Do[l]),N.push(Go[l])):88===l?(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),N.push(Do[l]),N.push(Go[l])):73===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),v=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):97===l?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),v=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):145===l?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=Vo(s,f,c),_=1-Vo(s,h,c),N.push(Do[l]),N.push(qo[l])):25===l?(E=1-Vo(s,h,p),m=Vo(s,f,p),I=1-Vo(e,c,f),_=Vo(e,c,h),N.push(Do[l]),N.push(qo[l])):70===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(Fo[l]),N.push(ko[l])):100===l?(b=Vo(s,p,h),x=Vo(e,f,p),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Fo[l]),N.push(ko[l])):34===l?(0===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):35===l?(4===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l]),N.push(Bo[l])):136===l?(0===d?(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):153===l?(0===d?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(Go[l])):102===l?(0===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Fo[l]),N.push(Bo[l])):155===l?(4===d?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(qo[l])):103===l?(4===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Fo[l]),N.push(ko[l])):152===l?(0===d?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(ko[l]),N.push(Go[l])):156===l?(4===d?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(Go[l]),N.push(Bo[l])):137===l?(0===d?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l])):139===l?(4===d?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l])):98===l?(0===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Bo[l])):99===l?(4===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l])):38===l?(0===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):39===l?(4===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Fo[l]),N.push(ko[l]),N.push(Bo[l])):85===l&&(E=1,b=0,x=1,m=0,I=0,w=1,v=0,_=1),(v<0||v>1||_<0||_>1||E<0||E>1||x<0||x>1||I<0||I>1||w<0||w>1)&&console.log("MarchingSquaresJS-isoBands: "+l+" "+g+" "+c+","+h+","+p+","+f+" "+d+" "+v+" "+_+" "+E+" "+b+" "+x+" "+m+" "+I+" "+w),o.cells[a][u]={cval:l,cval_real:g,flipped:d,topleft:v,topright:_,righttop:E,rightbottom:b,bottomright:x,bottomleft:m,leftbottom:I,lefttop:w,edges:N}}}}}return o}(t,e,n);return Qi.polygons?(Qi.verbose&&console.log("MarchingSquaresJS-isoBands: returning single polygons for each grid cell"),u=function(t){var e=[],n=0;return t.cells.forEach((function(t,r){t.forEach((function(t,i){if(void 0!==t){var o=Uo[t.cval](t);"object"==typeof o&&Xo(o)?"object"==typeof o[0]&&Xo(o[0])?"object"==typeof o[0][0]&&Xo(o[0][0])?o.forEach((function(t){t.forEach((function(t){t[0]+=i,t[1]+=r})),e[n++]=t})):(o.forEach((function(t){t[0]+=i,t[1]+=r})),e[n++]=o):console.log("MarchingSquaresJS-isoBands: bandcell polygon with malformed coordinates"):console.log("MarchingSquaresJS-isoBands: bandcell polygon with null coordinates")}}))})),e}(l)):(Qi.verbose&&console.log("MarchingSquaresJS-isoBands: returning polygon paths for entire data grid"),u=function(t){for(var e=[],n=t.rows,r=t.cols,i=[],o=0;o<n;o++)for(var s=0;s<r;s++)if(void 0!==t.cells[o][s]&&t.cells[o][s].edges.length>0){var a=Ho(t.cells[o][s]),u=null,l=s,c=o;null!==a&&i.push([a.p[0]+l,a.p[1]+c]);do{if(null===(u=Wo(t.cells[c][l],a.x,a.y,a.o)))break;if(i.push([u.p[0]+l,u.p[1]+c]),l+=u.x,a=u,(c+=u.y)<0||c>=n||l<0||l>=r||void 0===t.cells[c][l]){var h=Yo(t,l-=u.x,c-=u.y,u.x,u.y,u.o);if(null===h)break;h.path.forEach((function(t){i.push(t)})),l=h.i,c=h.j,a=h}}while(void 0!==t.cells[c][l]&&t.cells[c][l].edges.length>0);e.push(i),i=[],t.cells[o][s].edges.length>0&&s--}return e}(l)),"function"==typeof Qi.successCallback&&Qi.successCallback(u),u}var to=64,eo=16,no=[],ro=[],io=[],oo=[],so=[],ao=[],uo=[],lo=[],co=[],ho=[],po=[],fo=[],go=[],yo=[],vo=[],_o=[],mo=[],xo=[],Eo=[],bo=[],wo=[],Io=[],No=[],So=[];uo[85]=ho[85]=-1,lo[85]=po[85]=0,co[85]=fo[85]=1,Eo[85]=Io[85]=1,bo[85]=No[85]=0,wo[85]=So[85]=1,no[85]=oo[85]=0,ro[85]=so[85]=-1,io[85]=vo[85]=0,_o[85]=go[85]=0,mo[85]=yo[85]=1,ao[85]=xo[85]=1,Io[1]=Io[169]=0,No[1]=No[169]=-1,So[1]=So[169]=0,go[1]=go[169]=-1,yo[1]=yo[169]=0,vo[1]=vo[169]=0,ho[4]=ho[166]=0,po[4]=po[166]=-1,fo[4]=fo[166]=1,_o[4]=_o[166]=1,mo[4]=mo[166]=0,xo[4]=xo[166]=0,uo[16]=uo[154]=0,lo[16]=lo[154]=1,co[16]=co[154]=1,oo[16]=oo[154]=1,so[16]=so[154]=0,ao[16]=ao[154]=1,Eo[64]=Eo[106]=0,bo[64]=bo[106]=1,wo[64]=wo[106]=0,no[64]=no[106]=-1,ro[64]=ro[106]=0,io[64]=io[106]=1,Eo[2]=Eo[168]=0,bo[2]=bo[168]=-1,wo[2]=wo[168]=1,Io[2]=Io[168]=0,No[2]=No[168]=-1,So[2]=So[168]=0,go[2]=go[168]=-1,yo[2]=yo[168]=0,vo[2]=vo[168]=0,_o[2]=_o[168]=-1,mo[2]=mo[168]=0,xo[2]=xo[168]=1,uo[8]=uo[162]=0,lo[8]=lo[162]=-1,co[8]=co[162]=0,ho[8]=ho[162]=0,po[8]=po[162]=-1,fo[8]=fo[162]=1,go[8]=go[162]=1,yo[8]=yo[162]=0,vo[8]=vo[162]=1,_o[8]=_o[162]=1,mo[8]=mo[162]=0,xo[8]=xo[162]=0,uo[32]=uo[138]=0,lo[32]=lo[138]=1,co[32]=co[138]=1,ho[32]=ho[138]=0,po[32]=po[138]=1,fo[32]=fo[138]=0,no[32]=no[138]=1,ro[32]=ro[138]=0,io[32]=io[138]=0,oo[32]=oo[138]=1,so[32]=so[138]=0,ao[32]=ao[138]=1,Io[128]=Io[42]=0,No[128]=No[42]=1,So[128]=So[42]=1,Eo[128]=Eo[42]=0,bo[128]=bo[42]=1,wo[128]=wo[42]=0,no[128]=no[42]=-1,ro[128]=ro[42]=0,io[128]=io[42]=1,oo[128]=oo[42]=-1,so[128]=so[42]=0,ao[128]=ao[42]=0,ho[5]=ho[165]=-1,po[5]=po[165]=0,fo[5]=fo[165]=0,Io[5]=Io[165]=1,No[5]=No[165]=0,So[5]=So[165]=0,_o[20]=_o[150]=0,mo[20]=mo[150]=1,xo[20]=xo[150]=1,oo[20]=oo[150]=0,so[20]=so[150]=-1,ao[20]=ao[150]=1,uo[80]=uo[90]=-1,lo[80]=lo[90]=0,co[80]=co[90]=1,Eo[80]=Eo[90]=1,bo[80]=bo[90]=0,wo[80]=wo[90]=1,go[65]=go[105]=0,yo[65]=yo[105]=1,vo[65]=vo[105]=0,no[65]=no[105]=0,ro[65]=ro[105]=-1,io[65]=io[105]=0,uo[160]=uo[10]=-1,lo[160]=lo[10]=0,co[160]=co[10]=1,ho[160]=ho[10]=-1,po[160]=po[10]=0,fo[160]=fo[10]=0,Io[160]=Io[10]=1,No[160]=No[10]=0,So[160]=So[10]=0,Eo[160]=Eo[10]=1,bo[160]=bo[10]=0,wo[160]=wo[10]=1,_o[130]=_o[40]=0,mo[130]=mo[40]=1,xo[130]=xo[40]=1,go[130]=go[40]=0,yo[130]=yo[40]=1,vo[130]=vo[40]=0,no[130]=no[40]=0,ro[130]=ro[40]=-1,io[130]=io[40]=0,oo[130]=oo[40]=0,so[130]=so[40]=-1,ao[130]=ao[40]=1,ho[37]=ho[133]=0,po[37]=po[133]=1,fo[37]=fo[133]=1,Io[37]=Io[133]=0,No[37]=No[133]=1,So[37]=So[133]=0,no[37]=no[133]=-1,ro[37]=ro[133]=0,io[37]=io[133]=0,oo[37]=oo[133]=1,so[37]=so[133]=0,ao[37]=ao[133]=0,_o[148]=_o[22]=-1,mo[148]=mo[22]=0,xo[148]=xo[22]=0,Io[148]=Io[22]=0,No[148]=No[22]=-1,So[148]=So[22]=1,Eo[148]=Eo[22]=0,bo[148]=bo[22]=1,wo[148]=wo[22]=1,oo[148]=oo[22]=-1,so[148]=so[22]=0,ao[148]=ao[22]=1,uo[82]=uo[88]=0,lo[82]=lo[88]=-1,co[82]=co[88]=1,_o[82]=_o[88]=1,mo[82]=mo[88]=0,xo[82]=xo[88]=1,go[82]=go[88]=-1,yo[82]=yo[88]=0,vo[82]=vo[88]=1,Eo[82]=Eo[88]=0,bo[82]=bo[88]=-1,wo[82]=wo[88]=0,uo[73]=uo[97]=0,lo[73]=lo[97]=1,co[73]=co[97]=0,ho[73]=ho[97]=0,po[73]=po[97]=-1,fo[73]=fo[97]=0,go[73]=go[97]=1,yo[73]=yo[97]=0,vo[73]=vo[97]=0,no[73]=no[97]=1,ro[73]=ro[97]=0,io[73]=io[97]=1,uo[145]=uo[25]=0,lo[145]=lo[25]=-1,co[145]=co[25]=0,go[145]=go[25]=1,yo[145]=yo[25]=0,vo[145]=vo[25]=1,Io[145]=Io[25]=0,No[145]=No[25]=1,So[145]=So[25]=1,oo[145]=oo[25]=-1,so[145]=so[25]=0,ao[145]=ao[25]=0,ho[70]=ho[100]=0,po[70]=po[100]=1,fo[70]=fo[100]=0,_o[70]=_o[100]=-1,mo[70]=mo[100]=0,xo[70]=xo[100]=1,Eo[70]=Eo[100]=0,bo[70]=bo[100]=-1,wo[70]=wo[100]=1,no[70]=no[100]=1,ro[70]=ro[100]=0,io[70]=io[100]=0,ho[101]=ho[69]=0,po[101]=po[69]=1,fo[101]=fo[69]=0,no[101]=no[69]=1,ro[101]=ro[69]=0,io[101]=io[69]=0,Io[149]=Io[21]=0,No[149]=No[21]=1,So[149]=So[21]=1,oo[149]=oo[21]=-1,so[149]=so[21]=0,ao[149]=ao[21]=0,_o[86]=_o[84]=-1,mo[86]=mo[84]=0,xo[86]=xo[84]=1,Eo[86]=Eo[84]=0,bo[86]=bo[84]=-1,wo[86]=wo[84]=1,uo[89]=uo[81]=0,lo[89]=lo[81]=-1,co[89]=co[81]=0,go[89]=go[81]=1,yo[89]=yo[81]=0,vo[89]=vo[81]=1,uo[96]=uo[74]=0,lo[96]=lo[74]=1,co[96]=co[74]=0,ho[96]=ho[74]=-1,po[96]=po[74]=0,fo[96]=fo[74]=1,Eo[96]=Eo[74]=1,bo[96]=bo[74]=0,wo[96]=wo[74]=0,no[96]=no[74]=1,ro[96]=ro[74]=0,io[96]=io[74]=1,uo[24]=uo[146]=0,lo[24]=lo[146]=-1,co[24]=co[146]=1,_o[24]=_o[146]=1,mo[24]=mo[146]=0,xo[24]=xo[146]=1,go[24]=go[146]=0,yo[24]=yo[146]=1,vo[24]=vo[146]=1,oo[24]=oo[146]=0,so[24]=so[146]=-1,ao[24]=ao[146]=0,ho[6]=ho[164]=-1,po[6]=po[164]=0,fo[6]=fo[164]=1,_o[6]=_o[164]=-1,mo[6]=mo[164]=0,xo[6]=xo[164]=0,Io[6]=Io[164]=0,No[6]=No[164]=-1,So[6]=So[164]=1,Eo[6]=Eo[164]=1,bo[6]=bo[164]=0,wo[6]=wo[164]=0,go[129]=go[41]=0,yo[129]=yo[41]=1,vo[129]=vo[41]=1,Io[129]=Io[41]=0,No[129]=No[41]=1,So[129]=So[41]=0,no[129]=no[41]=-1,ro[129]=ro[41]=0,io[129]=io[41]=0,oo[129]=oo[41]=0,so[129]=so[41]=-1,ao[129]=ao[41]=0,_o[66]=_o[104]=0,mo[66]=mo[104]=1,xo[66]=xo[104]=0,go[66]=go[104]=-1,yo[66]=yo[104]=0,vo[66]=vo[104]=1,Eo[66]=Eo[104]=0,bo[66]=bo[104]=-1,wo[66]=wo[104]=0,no[66]=no[104]=0,ro[66]=ro[104]=-1,io[66]=io[104]=1,uo[144]=uo[26]=-1,lo[144]=lo[26]=0,co[144]=co[26]=0,Io[144]=Io[26]=1,No[144]=No[26]=0,So[144]=So[26]=1,Eo[144]=Eo[26]=0,bo[144]=bo[26]=1,wo[144]=wo[26]=1,oo[144]=oo[26]=-1,so[144]=so[26]=0,ao[144]=ao[26]=1,ho[36]=ho[134]=0,po[36]=po[134]=1,fo[36]=fo[134]=1,_o[36]=_o[134]=0,mo[36]=mo[134]=1,xo[36]=xo[134]=0,no[36]=no[134]=0,ro[36]=ro[134]=-1,io[36]=io[134]=1,oo[36]=oo[134]=1,so[36]=so[134]=0,ao[36]=ao[134]=0,uo[9]=uo[161]=-1,lo[9]=lo[161]=0,co[9]=co[161]=0,ho[9]=ho[161]=0,po[9]=po[161]=-1,fo[9]=fo[161]=0,go[9]=go[161]=1,yo[9]=yo[161]=0,vo[9]=vo[161]=0,Io[9]=Io[161]=1,No[9]=No[161]=0,So[9]=So[161]=1,uo[136]=0,lo[136]=1,co[136]=1,ho[136]=0,po[136]=1,fo[136]=0,_o[136]=-1,mo[136]=0,xo[136]=1,go[136]=-1,yo[136]=0,vo[136]=0,Io[136]=0,No[136]=-1,So[136]=0,Eo[136]=0,bo[136]=-1,wo[136]=1,no[136]=1,ro[136]=0,io[136]=0,oo[136]=1,so[136]=0,ao[136]=1,uo[34]=0,lo[34]=-1,co[34]=0,ho[34]=0,po[34]=-1,fo[34]=1,_o[34]=1,mo[34]=0,xo[34]=0,go[34]=1,yo[34]=0,vo[34]=1,Io[34]=0,No[34]=1,So[34]=1,Eo[34]=0,bo[34]=1,wo[34]=0,no[34]=-1,ro[34]=0,io[34]=1,oo[34]=-1,so[34]=0,ao[34]=0,uo[35]=0,lo[35]=1,co[35]=1,ho[35]=0,po[35]=-1,fo[35]=1,_o[35]=1,mo[35]=0,xo[35]=0,go[35]=-1,yo[35]=0,vo[35]=0,Io[35]=0,No[35]=-1,So[35]=0,Eo[35]=0,bo[35]=1,wo[35]=0,no[35]=-1,ro[35]=0,io[35]=1,oo[35]=1,so[35]=0,ao[35]=1,uo[153]=0,lo[153]=1,co[153]=1,go[153]=-1,yo[153]=0,vo[153]=0,Io[153]=0,No[153]=-1,So[153]=0,oo[153]=1,so[153]=0,ao[153]=1,ho[102]=0,po[102]=-1,fo[102]=1,_o[102]=1,mo[102]=0,xo[102]=0,Eo[102]=0,bo[102]=1,wo[102]=0,no[102]=-1,ro[102]=0,io[102]=1,uo[155]=0,lo[155]=-1,co[155]=0,go[155]=1,yo[155]=0,vo[155]=1,Io[155]=0,No[155]=1,So[155]=1,oo[155]=-1,so[155]=0,ao[155]=0,ho[103]=0,po[103]=1,fo[103]=0,_o[103]=-1,mo[103]=0,xo[103]=1,Eo[103]=0,bo[103]=-1,wo[103]=1,no[103]=1,ro[103]=0,io[103]=0,uo[152]=0,lo[152]=1,co[152]=1,_o[152]=-1,mo[152]=0,xo[152]=1,go[152]=-1,yo[152]=0,vo[152]=0,Io[152]=0,No[152]=-1,So[152]=0,Eo[152]=0,bo[152]=-1,wo[152]=1,oo[152]=1,so[152]=0,ao[152]=1,uo[156]=0,lo[156]=-1,co[156]=1,_o[156]=1,mo[156]=0,xo[156]=1,go[156]=-1,yo[156]=0,vo[156]=0,Io[156]=0,No[156]=-1,So[156]=0,Eo[156]=0,bo[156]=1,wo[156]=1,oo[156]=-1,so[156]=0,ao[156]=1,uo[137]=0,lo[137]=1,co[137]=1,ho[137]=0,po[137]=1,fo[137]=0,go[137]=-1,yo[137]=0,vo[137]=0,Io[137]=0,No[137]=-1,So[137]=0,no[137]=1,ro[137]=0,io[137]=0,oo[137]=1,so[137]=0,ao[137]=1,uo[139]=0,lo[139]=1,co[139]=1,ho[139]=0,po[139]=-1,fo[139]=0,go[139]=1,yo[139]=0,vo[139]=0,Io[139]=0,No[139]=1,So[139]=0,no[139]=-1,ro[139]=0,io[139]=0,oo[139]=1,so[139]=0,ao[139]=1,uo[98]=0,lo[98]=-1,co[98]=0,ho[98]=0,po[98]=-1,fo[98]=1,_o[98]=1,mo[98]=0,xo[98]=0,go[98]=1,yo[98]=0,vo[98]=1,Eo[98]=0,bo[98]=1,wo[98]=0,no[98]=-1,ro[98]=0,io[98]=1,uo[99]=0,lo[99]=1,co[99]=0,ho[99]=0,po[99]=-1,fo[99]=1,_o[99]=1,mo[99]=0,xo[99]=0,go[99]=-1,yo[99]=0,vo[99]=1,Eo[99]=0,bo[99]=-1,wo[99]=0,no[99]=1,ro[99]=0,io[99]=1,ho[38]=0,po[38]=-1,fo[38]=1,_o[38]=1,mo[38]=0,xo[38]=0,Io[38]=0,No[38]=1,So[38]=1,Eo[38]=0,bo[38]=1,wo[38]=0,no[38]=-1,ro[38]=0,io[38]=1,oo[38]=-1,so[38]=0,ao[38]=0,ho[39]=0,po[39]=1,fo[39]=1,_o[39]=-1,mo[39]=0,xo[39]=0,Io[39]=0,No[39]=-1,So[39]=1,Eo[39]=0,bo[39]=1,wo[39]=0,no[39]=-1,ro[39]=0,io[39]=1,oo[39]=1,so[39]=0,ao[39]=0;var Co=function(t){return[[t.bottomleft,0],[0,0],[0,t.leftbottom]]},Po=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0]]},Mo=function(t){return[[t.topright,1],[1,1],[1,t.righttop]]},Lo=function(t){return[[0,t.lefttop],[0,1],[t.topleft,1]]},Oo=function(t){return[[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop]]},Ro=function(t){return[[t.bottomright,0],[t.bottomleft,0],[1,t.righttop],[1,t.rightbottom]]},To=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.topleft,1],[t.topright,1]]},Ao=function(t){return[[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]},Do=[],Fo=[],ko=[],Go=[],qo=[],Bo=[],zo=[],jo=[];Go[1]=qo[1]=18,Go[169]=qo[169]=18,ko[4]=Fo[4]=12,ko[166]=Fo[166]=12,Do[16]=jo[16]=4,Do[154]=jo[154]=4,Bo[64]=zo[64]=22,Bo[106]=zo[106]=22,ko[2]=Bo[2]=17,Go[2]=qo[2]=18,ko[168]=Bo[168]=17,Go[168]=qo[168]=18,Do[8]=Go[8]=9,Fo[8]=ko[8]=12,Do[162]=Go[162]=9,Fo[162]=ko[162]=12,Do[32]=jo[32]=4,Fo[32]=zo[32]=1,Do[138]=jo[138]=4,Fo[138]=zo[138]=1,qo[128]=jo[128]=21,Bo[128]=zo[128]=22,qo[42]=jo[42]=21,Bo[42]=zo[42]=22,Fo[5]=qo[5]=14,Fo[165]=qo[165]=14,ko[20]=jo[20]=6,ko[150]=jo[150]=6,Do[80]=Bo[80]=11,Do[90]=Bo[90]=11,Go[65]=zo[65]=3,Go[105]=zo[105]=3,Do[160]=Bo[160]=11,Fo[160]=qo[160]=14,Do[10]=Bo[10]=11,Fo[10]=qo[10]=14,ko[130]=jo[130]=6,Go[130]=zo[130]=3,ko[40]=jo[40]=6,Go[40]=zo[40]=3,Fo[101]=zo[101]=1,Fo[69]=zo[69]=1,qo[149]=jo[149]=21,qo[21]=jo[21]=21,ko[86]=Bo[86]=17,ko[84]=Bo[84]=17,Do[89]=Go[89]=9,Do[81]=Go[81]=9,Do[96]=zo[96]=0,Fo[96]=Bo[96]=15,Do[74]=zo[74]=0,Fo[74]=Bo[74]=15,Do[24]=ko[24]=8,Go[24]=jo[24]=7,Do[146]=ko[146]=8,Go[146]=jo[146]=7,Fo[6]=Bo[6]=15,ko[6]=qo[6]=16,Fo[164]=Bo[164]=15,ko[164]=qo[164]=16,Go[129]=jo[129]=7,qo[129]=zo[129]=20,Go[41]=jo[41]=7,qo[41]=zo[41]=20,ko[66]=zo[66]=2,Go[66]=Bo[66]=19,ko[104]=zo[104]=2,Go[104]=Bo[104]=19,Do[144]=qo[144]=10,Bo[144]=jo[144]=23,Do[26]=qo[26]=10,Bo[26]=jo[26]=23,Fo[36]=jo[36]=5,ko[36]=zo[36]=2,Fo[134]=jo[134]=5,ko[134]=zo[134]=2,Do[9]=qo[9]=10,Fo[9]=Go[9]=13,Do[161]=qo[161]=10,Fo[161]=Go[161]=13,Fo[37]=jo[37]=5,qo[37]=zo[37]=20,Fo[133]=jo[133]=5,qo[133]=zo[133]=20,ko[148]=qo[148]=16,Bo[148]=jo[148]=23,ko[22]=qo[22]=16,Bo[22]=jo[22]=23,Do[82]=ko[82]=8,Go[82]=Bo[82]=19,Do[88]=ko[88]=8,Go[88]=Bo[88]=19,Do[73]=zo[73]=0,Fo[73]=Go[73]=13,Do[97]=zo[97]=0,Fo[97]=Go[97]=13,Do[145]=Go[145]=9,qo[145]=jo[145]=21,Do[25]=Go[25]=9,qo[25]=jo[25]=21,Fo[70]=zo[70]=1,ko[70]=Bo[70]=17,Fo[100]=zo[100]=1,ko[100]=Bo[100]=17,Do[34]=Go[34]=9,Fo[34]=ko[34]=12,qo[34]=jo[34]=21,Bo[34]=zo[34]=22,Do[136]=jo[136]=4,Fo[136]=zo[136]=1,ko[136]=Bo[136]=17,Go[136]=qo[136]=18,Do[35]=jo[35]=4,Fo[35]=ko[35]=12,Go[35]=qo[35]=18,Bo[35]=zo[35]=22,Do[153]=jo[153]=4,Go[153]=qo[153]=18,Fo[102]=ko[102]=12,Bo[102]=zo[102]=22,Do[155]=Go[155]=9,qo[155]=jo[155]=23,Fo[103]=zo[103]=1,ko[103]=Bo[103]=17,Do[152]=jo[152]=4,ko[152]=Bo[152]=17,Go[152]=qo[152]=18,Do[156]=ko[156]=8,Go[156]=qo[156]=18,Bo[156]=jo[156]=23,Do[137]=jo[137]=4,Fo[137]=zo[137]=1,Go[137]=qo[137]=18,Do[139]=jo[139]=4,Fo[139]=Go[139]=13,qo[139]=zo[139]=20,Do[98]=Go[98]=9,Fo[98]=ko[98]=12,Bo[98]=zo[98]=22,Do[99]=zo[99]=0,Fo[99]=ko[99]=12,Go[99]=Bo[99]=19,Fo[38]=ko[38]=12,qo[38]=jo[38]=21,Bo[38]=zo[38]=22,Fo[39]=jo[39]=5,ko[39]=qo[39]=16,Bo[39]=zo[39]=22;var Uo=[];function Vo(t,e,n){return(t-e)/(n-e)}function Xo(t){return t.constructor.toString().indexOf("Array")>-1}function Yo(t,e,n,r,i,o){for(var s=t.cells[n][e],a=s.cval_real,u=e+r,l=n+i,c=[],h=!1;!h;){if(void 0===t.cells[l]||void 0===t.cells[l][u])if(l-=i,u-=r,a=(s=t.cells[l][u]).cval_real,-1===i)if(0===o)if(1&a)c.push([u,l]),r=-1,i=0,o=0;else{if(!(4&a)){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u+1,l]),r=1,i=0,o=0}else{if(!(1&a)){if(4&a){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u+s.bottomleft,l]),r=0,i=1,o=0,h=!0;break}c.push([u,l]),r=-1,i=0,o=0}else if(1===i)if(0===o){if(!(a&eo)){if(a&to){c.push([u+s.topleft,l+1]),r=0,i=-1,o=0,h=!0;break}c.push([u+s.topright,l+1]),r=0,i=-1,o=1,h=!0;break}c.push([u+1,l+1]),r=1,i=0,o=1}else c.push([u+1,l+1]),r=1,i=0,o=1;else if(-1===r)if(0===o){if(!(a&to)){if(1&a){c.push([u,l+s.leftbottom]),r=1,i=0,o=0,h=!0;break}c.push([u,l+s.lefttop]),r=1,i=0,o=1,h=!0;break}c.push([u,l+1]),r=0,i=1,o=0}else{if(!(a&to)){console.log("MarchingSquaresJS-isoBands: wtf");break}c.push([u,l+1]),r=0,i=1,o=0}else{if(1!==r){console.log("MarchingSquaresJS-isoBands: we came from nowhere!");break}if(0===o){if(!(4&a)){c.push([u+1,l+s.rightbottom]),r=-1,i=0,o=0,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}else{if(!(4&a)){if(a&eo){c.push([u+1,l+s.righttop]),r=-1,i=0,o=1;break}c.push([u+1,l+s.rightbottom]),r=-1,i=0,o=0,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}}else if(a=(s=t.cells[l][u]).cval_real,-1===r)if(0===o)if(void 0!==t.cells[l-1]&&void 0!==t.cells[l-1][u])r=0,i=-1,o=1;else{if(!(1&a)){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u,l])}else{if(!(a&to)){console.log("MarchingSquaresJS-isoBands: found entry from top at "+u+","+l);break}console.log("MarchingSquaresJS-isoBands: proceeding in x-direction!")}else if(1===r){if(0===o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l+1]&&void 0!==t.cells[l+1][u])r=0,i=1,o=0;else{if(!(a&eo)){c.push([u+s.topleft,l+1]),r=0,i=-1,o=0,h=!0;break}c.push([u+1,l+1]),r=1,i=0,o=1}}else if(-1===i){if(1!==o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l][u+1])r=1,i=0,o=1;else{if(!(4&a)){c.push([u+1,l+s.righttop]),r=-1,i=0,o=1,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}}else{if(1!==i){console.log("MarchingSquaresJS-isoBands: where did we came from???");break}if(0!==o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l][u-1])r=-1,i=0,o=0;else{if(!(a&to)){c.push([u,l+s.leftbottom]),r=1,i=0,o=0,h=!0;break}c.push([u,l+1]),r=0,i=1,o=0}}if(l+=i,(u+=r)===e&&l===n)break}return{path:c,i:u,j:l,x:r,y:i,o:o}}function Ho(t){if(t.edges.length>0){var e=t.edges[t.edges.length-1],n=t.cval_real;switch(e){case 0:return n&eo?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.topleft,1],x:0,y:-1,o:0};case 1:return 4&n?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 2:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[t.topleft,1],x:0,y:-1,o:0};case 3:return 1&n?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 4:return n&eo?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};case 5:return 4&n?{p:[t.topright,1],x:0,y:-1,o:1}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 6:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};case 7:return 1&n?{p:[t.topright,1],x:0,y:-1,o:1}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 8:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[1,t.righttop],x:-1,y:0,o:1};case 9:return 1&n?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 10:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[1,t.righttop],x:-1,y:0,o:1};case 11:return n&to?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[0,t.lefttop],x:1,y:0,o:1};case 12:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 13:return 1&n?{p:[1,t.rightbottom],x:-1,y:0,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 14:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 15:return n&to?{p:[1,t.rightbottom],x:-1,y:0,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 16:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[0,t.leftbottom],x:1,y:0,o:0};case 17:return n&to?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[0,t.lefttop],x:1,y:0,o:1};case 18:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 19:return n&to?{p:[t.bottomleft,0],x:0,y:1,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 20:return n&to?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[0,t.leftbottom],x:1,y:0,o:0};case 21:return n&eo?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[t.topright,1],x:0,y:-1,o:1};case 22:return n&to?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 23:return n&eo?{p:[0,t.lefttop],x:1,y:0,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};default:console.log("MarchingSquaresJS-isoBands: edge index out of range!"),console.log(t)}}return null}function Wo(t,e,n,r){var i,o,s,a,u,l=t.cval;switch(e){case-1:switch(r){case 0:i=Fo[l],s=ho[l],a=po[l],u=fo[l];break;default:i=Do[l],s=uo[l],a=lo[l],u=co[l]}break;case 1:switch(r){case 0:i=qo[l],s=Io[l],a=No[l],u=So[l];break;default:i=Bo[l],s=Eo[l],a=bo[l],u=wo[l]}break;default:switch(n){case-1:switch(r){case 0:i=zo[l],s=no[l],a=ro[l],u=io[l];break;default:i=jo[l],s=oo[l],a=so[l],u=ao[l]}break;case 1:switch(r){case 0:i=Go[l],s=go[l],a=yo[l],u=vo[l];break;default:i=ko[l],s=_o[l],a=mo[l],u=xo[l]}}}if(o=t.edges.indexOf(i),void 0===t.edges[o])return null;switch(function(t,e){delete t.edges[e];for(var n=e+1;n<t.edges.length;n++)t.edges[n-1]=t.edges[n];t.edges.pop()}(t,o),l=t.cval_real,i){case 0:l&eo?(e=t.topleft,n=1):(e=1,n=t.righttop);break;case 1:4&l?(e=1,n=t.rightbottom):(e=t.topleft,n=1);break;case 2:4&l?(e=t.topleft,n=1):(e=t.bottomright,n=0);break;case 3:1&l?(e=t.bottomleft,n=0):(e=t.topleft,n=1);break;case 4:l&eo?(e=t.topright,n=1):(e=1,n=t.righttop);break;case 5:4&l?(e=1,n=t.rightbottom):(e=t.topright,n=1);break;case 6:4&l?(e=t.topright,n=1):(e=t.bottomright,n=0);break;case 7:1&l?(e=t.bottomleft,n=0):(e=t.topright,n=1);break;case 8:4&l?(e=1,n=t.righttop):(e=t.bottomright,n=0);break;case 9:1&l?(e=t.bottomleft,n=0):(e=1,n=t.righttop);break;case 10:1&l?(e=1,n=t.righttop):(e=0,n=t.leftbottom);break;case 11:l&to?(e=0,n=t.lefttop):(e=1,n=t.righttop);break;case 12:4&l?(e=1,n=t.rightbottom):(e=t.bottomright,n=0);break;case 13:1&l?(e=t.bottomleft,n=0):(e=1,n=t.rightbottom);break;case 14:1&l?(e=1,n=t.rightbottom):(e=0,n=t.leftbottom);break;case 15:l&to?(e=0,n=t.lefttop):(e=1,n=t.rightbottom);break;case 16:4&l?(e=0,n=t.leftbottom):(e=t.bottomright,n=0);break;case 17:l&to?(e=0,n=t.lefttop):(e=t.bottomright,n=0);break;case 18:1&l?(e=t.bottomleft,n=0):(e=0,n=t.leftbottom);break;case 19:l&to?(e=0,n=t.lefttop):(e=t.bottomleft,n=0);break;case 20:l&to?(e=0,n=t.leftbottom):(e=t.topleft,n=1);break;case 21:l&eo?(e=t.topright,n=1):(e=0,n=t.leftbottom);break;case 22:l&to?(e=0,n=t.lefttop):(e=t.topleft,n=1);break;case 23:l&eo?(e=t.topright,n=1):(e=0,n=t.lefttop);break;default:return console.log("MarchingSquaresJS-isoBands: edge index out of range!"),console.log(t),null}return void 0!==e&&void 0!==n&&void 0!==s&&void 0!==a&&void 0!==u||(console.log("MarchingSquaresJS-isoBands: undefined value!"),console.log(t),console.log(e+" "+n+" "+s+" "+a+" "+u)),{p:[e,n],x:s,y:a,o:u}}function Jo(t){var e=[],n=[];t.forEach((function(t){var r=jr(l([t]));n.push(r),e.push({ring:t,area:r})})),n.sort((function(t,e){return e-t}));var r=[];return n.forEach((function(t){for(var n=0;n<e.length;n++)if(e[n].area===t){r.push(e[n].ring),e.splice(n,1);break}})),r}function Zo(t){for(var e=t.map((function(t){return{lrCoordinates:t,grouped:!1}})),n=[];!Qo(e);)for(var r=0;r<e.length;r++)if(!e[r].grouped){var i=[];i.push(e[r].lrCoordinates),e[r].grouped=!0;for(var o=l([e[r].lrCoordinates]),s=r+1;s<e.length;s++){if(!e[s].grouped)Ko(l([e[s].lrCoordinates]),o)&&(i.push(e[s].lrCoordinates),e[s].grouped=!0)}n.push(i)}return n}function Ko(t,e){for(var n=bn(t),r=0;r<n.features.length;r++)if(!ye(n.features[r],e))return!1;return!0}function Qo(t){for(var e=0;e<t.length;e++)if(!1===t[e].grouped)return!1;return!0}function $o(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.pivot,i=n.mutate;if(!t)throw new Error("geojson is required");if(null==e||isNaN(e))throw new Error("angle is required");return 0===e||(r||(r=En(t)),!1!==i&&void 0!==i||(t=Ie(t)),R(t,(function(t){var n=Bi(r,t)+e,i=Ar(r,t),o=Q(ji(r,i,n));t[0]=o[0],t[1]=o[1]}))),t}function ts(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.origin,i=n.mutate;if(!t)throw new Error("geojson required");if("number"!=typeof e||0===e)throw new Error("invalid factor");var o=Array.isArray(r)||"object"==typeof r;return!0!==i&&(t=Ie(t)),"FeatureCollection"!==t.type||o?es(t,e,r):(F(t,(function(n,i){t.features[i]=es(n,e,r)})),t)}function es(t,e,n){var r="Point"===it(t);return n=function(t,e){null==e&&(e="centroid");if(Array.isArray(e)||"object"==typeof e)return K(e);var n=t.bbox?t.bbox:Z(t),r=n[0],i=n[1],o=n[2],s=n[3];switch(e){case"sw":case"southwest":case"westsouth":case"bottomleft":return a([r,i]);case"se":case"southeast":case"eastsouth":case"bottomright":return a([o,i]);case"nw":case"northwest":case"westnorth":case"topleft":return a([r,s]);case"ne":case"northeast":case"eastnorth":case"topright":return a([o,s]);case"center":return xn(t);case void 0:case null:case"centroid":return En(t);default:throw new Error("invalid origin")}}(t,n),1===e||r||R(t,(function(t){var r=Ar(n,t),i=Bi(n,t),o=Q(ji(n,r*e,i));t[0]=o[0],t[1]=o[1],3===t.length&&(t[2]*=e)})),t}function ns(t){var e=t[0],n=t[1];return[n[0]-e[0],n[1]-e[1]]}function rs(t,e){return t[0]*e[1]-e[0]*t[1]}function is(t,e){return!function(t,e){return 0===rs(ns(t),ns(e))}(t,e)&&function(t,e){var n,r,i=t[0],o=ns(t),s=e[0],a=ns(e),u=rs(o,a);return function(t,e){return[t[0]+e[0],t[1]+e[1]]}(i,function(t,e){return[t*e[0],t*e[1]]}(rs((r=i,[(n=s)[0]-r[0],n[1]-r[1]]),a)/u,o))}(t,e)}function os(t,e,n){var r=[],i=E(e,n),o=Q(t),s=[];return o.forEach((function(t,e){if(e!==o.length-1){var n=(l=t,c=o[e+1],h=i,p=Math.sqrt((l[0]-c[0])*(l[0]-c[0])+(l[1]-c[1])*(l[1]-c[1])),f=l[0]+h*(c[1]-l[1])/p,g=c[0]+h*(c[1]-l[1])/p,d=l[1]+h*(l[0]-c[0])/p,y=c[1]+h*(l[0]-c[0])/p,[[f,d],[g,y]]);if(r.push(n),e>0){var a=r[e-1],u=is(n,a);!1!==u&&(a[1]=u,n[0]=u),s.push(a[0]),e===o.length-2&&(s.push(n[0]),s.push(n[1]))}2===o.length&&(s.push(n[0]),s.push(n[1]))}var l,c,h,p,f,g,d,y})),h(s,t.properties)}function ss(t,e,n){var r=e[0]-t[0],i=e[1]-t[1],o=n[0]-e[0];return function(t){return(t>0)-(t<0)||+t}(r*(n[1]-e[1])-o*i)}function as(t,e){return e.geometry.coordinates[0].every((function(e){return ye(a(e),t)}))}Uo[1]=Uo[169]=Co,Uo[4]=Uo[166]=Po,Uo[16]=Uo[154]=Mo,Uo[64]=Uo[106]=Lo,Uo[168]=Uo[2]=Oo,Uo[162]=Uo[8]=Ro,Uo[138]=Uo[32]=To,Uo[42]=Uo[128]=Ao,Uo[5]=Uo[165]=function(t){return[[0,0],[0,t.leftbottom],[1,t.rightbottom],[1,0]]},Uo[20]=Uo[150]=function(t){return[[1,0],[t.bottomright,0],[t.topright,1],[1,1]]},Uo[80]=Uo[90]=function(t){return[[1,1],[1,t.righttop],[0,t.lefttop],[0,1]]},Uo[65]=Uo[105]=function(t){return[[t.bottomleft,0],[0,0],[0,1],[t.topleft,1]]},Uo[160]=Uo[10]=function(t){return[[1,t.righttop],[1,t.rightbottom],[0,t.leftbottom],[0,t.lefttop]]},Uo[130]=Uo[40]=function(t){return[[t.topleft,1],[t.topright,1],[t.bottomright,0],[t.bottomleft,0]]},Uo[85]=function(){return[[0,0],[0,1],[1,1],[1,0]]},Uo[101]=Uo[69]=function(t){return[[1,t.rightbottom],[1,0],[0,0],[0,1],[t.topleft,1]]},Uo[149]=Uo[21]=function(t){return[[t.topright,1],[1,1],[1,0],[0,0],[0,t.leftbottom]]},Uo[86]=Uo[84]=function(t){return[[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[1,1]]},Uo[89]=Uo[81]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,1]]},Uo[96]=Uo[74]=function(t){return[[1,t.righttop],[1,t.rightbottom],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[24]=Uo[146]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[t.topright,1]]},Uo[6]=Uo[164]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop]]},Uo[129]=Uo[41]=function(t){return[[t.topright,1],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topleft,1]]},Uo[66]=Uo[104]=function(t){return[[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[144]=Uo[26]=function(t){return[[1,1],[1,t.righttop],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[36]=Uo[134]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[t.topleft,1],[t.topright,1]]},Uo[9]=Uo[161]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,t.leftbottom]]},Uo[37]=Uo[133]=function(t){return[[1,t.rightbottom],[1,0],[0,0],[0,t.leftbottom],[t.topleft,1],[t.topright,1]]},Uo[148]=Uo[22]=function(t){return[[1,1],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[82]=Uo[88]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1]]},Uo[73]=Uo[97]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,1],[t.topleft,1]]},Uo[145]=Uo[25]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topright,1]]},Uo[70]=Uo[100]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[34]=function(t){return[Ao(t),Ro(t)]},Uo[35]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]},Uo[136]=function(t){return[To(t),Oo(t)]},Uo[153]=function(t){return[Mo(t),Co(t)]},Uo[102]=function(t){return[Po(t),Lo(t)]},Uo[155]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topright,1]]},Uo[103]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[152]=function(t){return[Mo(t),Oo(t)]},Uo[156]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[137]=function(t){return[To(t),Co(t)]},Uo[139]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topleft,1],[t.topright,1]]},Uo[98]=function(t){return[Ro(t),Lo(t)]},Uo[99]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[38]=function(t){return[Po(t),Ao(t)]},Uo[39]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]};var us=function(){function t(e){this.id=t.buildId(e),this.coordinates=e,this.innerEdges=[],this.outerEdges=[],this.outerEdgesSorted=!1}return t.buildId=function(t){return t.join(",")},t.prototype.removeInnerEdge=function(t){this.innerEdges=this.innerEdges.filter((function(e){return e.from.id!==t.from.id}))},t.prototype.removeOuterEdge=function(t){this.outerEdges=this.outerEdges.filter((function(e){return e.to.id!==t.to.id}))},t.prototype.addOuterEdge=function(t){this.outerEdges.push(t),this.outerEdgesSorted=!1},t.prototype.sortOuterEdges=function(){var t=this;this.outerEdgesSorted||(this.outerEdges.sort((function(e,n){var r=e.to,i=n.to;if(r.coordinates[0]-t.coordinates[0]>=0&&i.coordinates[0]-t.coordinates[0]<0)return 1;if(r.coordinates[0]-t.coordinates[0]<0&&i.coordinates[0]-t.coordinates[0]>=0)return-1;if(r.coordinates[0]-t.coordinates[0]==0&&i.coordinates[0]-t.coordinates[0]==0)return r.coordinates[1]-t.coordinates[1]>=0||i.coordinates[1]-t.coordinates[1]>=0?r.coordinates[1]-i.coordinates[1]:i.coordinates[1]-r.coordinates[1];var o=ss(t.coordinates,r.coordinates,i.coordinates);return o<0?1:o>0?-1:Math.pow(r.coordinates[0]-t.coordinates[0],2)+Math.pow(r.coordinates[1]-t.coordinates[1],2)-(Math.pow(i.coordinates[0]-t.coordinates[0],2)+Math.pow(i.coordinates[1]-t.coordinates[1],2))})),this.outerEdgesSorted=!0)},t.prototype.getOuterEdges=function(){return this.sortOuterEdges(),this.outerEdges},t.prototype.getOuterEdge=function(t){return this.sortOuterEdges(),this.outerEdges[t]},t.prototype.addInnerEdge=function(t){this.innerEdges.push(t)},t}(),ls=function(){function t(t,e){this.from=t,this.to=e,this.next=void 0,this.label=void 0,this.symetric=void 0,this.ring=void 0,this.from.addOuterEdge(this),this.to.addInnerEdge(this)}return t.prototype.getSymetric=function(){return this.symetric||(this.symetric=new t(this.to,this.from),this.symetric.symetric=this),this.symetric},t.prototype.deleteEdge=function(){this.from.removeOuterEdge(this),this.to.removeInnerEdge(this)},t.prototype.isEqual=function(t){return this.from.id===t.from.id&&this.to.id===t.to.id},t.prototype.toString=function(){return"Edge { "+this.from.id+" -> "+this.to.id+" }"},t.prototype.toLineString=function(){return h([this.from.coordinates,this.to.coordinates])},t.prototype.compareTo=function(t){return ss(t.from.coordinates,t.to.coordinates,this.to.coordinates)},t}(),cs=function(){function t(){this.edges=[],this.polygon=void 0,this.envelope=void 0}return t.prototype.push=function(t){this.edges.push(t),this.polygon=this.envelope=void 0},t.prototype.get=function(t){return this.edges[t]},Object.defineProperty(t.prototype,"length",{get:function(){return this.edges.length},enumerable:!0,configurable:!0}),t.prototype.forEach=function(t){this.edges.forEach(t)},t.prototype.map=function(t){return this.edges.map(t)},t.prototype.some=function(t){return this.edges.some(t)},t.prototype.isValid=function(){return!0},t.prototype.isHole=function(){var t=this,e=this.edges.reduce((function(e,n,r){return n.from.coordinates[1]>t.edges[e].from.coordinates[1]&&(e=r),e}),0),n=(0===e?this.length:e)-1,r=(e+1)%this.length,i=ss(this.edges[n].from.coordinates,this.edges[e].from.coordinates,this.edges[r].from.coordinates);return 0===i?this.edges[n].from.coordinates[0]>this.edges[r].from.coordinates[0]:i>0},t.prototype.toMultiPoint=function(){return d(this.edges.map((function(t){return t.from.coordinates})))},t.prototype.toPolygon=function(){if(this.polygon)return this.polygon;var t=this.edges.map((function(t){return t.from.coordinates}));return t.push(this.edges[0].from.coordinates),this.polygon=l([t])},t.prototype.getEnvelope=function(){return this.envelope?this.envelope:this.envelope=dn(this.toPolygon())},t.findEdgeRingContaining=function(t,e){var n,r,i=t.getEnvelope();return e.forEach((function(e){var o,s,u,l,c,h,p=e.getEnvelope();if((r&&(n=r.getEnvelope()),s=i,u=(o=p).geometry.coordinates[0].map((function(t){return t[0]})),l=o.geometry.coordinates[0].map((function(t){return t[1]})),c=s.geometry.coordinates[0].map((function(t){return t[0]})),h=s.geometry.coordinates[0].map((function(t){return t[1]})),Math.max.apply(null,u)!==Math.max.apply(null,c)||Math.max.apply(null,l)!==Math.max.apply(null,h)||Math.min.apply(null,u)!==Math.min.apply(null,c)||Math.min.apply(null,l)!==Math.min.apply(null,h))&&as(p,i)){for(var f=t.map((function(t){return t.from.coordinates})),g=void 0,d=function(t){e.some((function(e){return n=t,r=e.from.coordinates,n[0]===r[0]&&n[1]===r[1];var n,r}))||(g=t)},y=0,v=f;y<v.length;y++){d(v[y])}g&&e.inside(a(g))&&(r&&!as(n,p)||(r=e))}})),r},t.prototype.inside=function(t){return ye(t,this.toPolygon())},t}();var hs=function(){function t(){this.edges=[],this.nodes={}}return t.fromGeoJson=function(e){!function(t){if(!t)throw new Error("No geojson passed");if("FeatureCollection"!==t.type&&"GeometryCollection"!==t.type&&"MultiLineString"!==t.type&&"LineString"!==t.type&&"Feature"!==t.type)throw new Error("Invalid input type '"+t.type+"'. Geojson must be FeatureCollection, GeometryCollection, LineString, MultiLineString or Feature")}(e);var n=new t;return z(e,(function(t){et(t,"LineString","Graph::fromGeoJson"),T(t,(function(t,e){if(t){var r=n.getNode(t),i=n.getNode(e);n.addEdge(r,i)}return e}))})),n},t.prototype.getNode=function(t){var e=us.buildId(t),n=this.nodes[e];return n||(n=this.nodes[e]=new us(t)),n},t.prototype.addEdge=function(t,e){var n=new ls(t,e),r=n.getSymetric();this.edges.push(n),this.edges.push(r)},t.prototype.deleteDangles=function(){var t=this;Object.keys(this.nodes).map((function(e){return t.nodes[e]})).forEach((function(e){return t._removeIfDangle(e)}))},t.prototype._removeIfDangle=function(t){var e=this;if(t.innerEdges.length<=1){var n=t.getOuterEdges().map((function(t){return t.to}));this.removeNode(t),n.forEach((function(t){return e._removeIfDangle(t)}))}},t.prototype.deleteCutEdges=function(){var t=this;this._computeNextCWEdges(),this._findLabeledEdgeRings(),this.edges.forEach((function(e){e.label===e.symetric.label&&(t.removeEdge(e.symetric),t.removeEdge(e))}))},t.prototype._computeNextCWEdges=function(t){var e=this;void 0===t?Object.keys(this.nodes).forEach((function(t){return e._computeNextCWEdges(e.nodes[t])})):t.getOuterEdges().forEach((function(e,n){t.getOuterEdge((0===n?t.getOuterEdges().length:n)-1).symetric.next=e}))},t.prototype._computeNextCCWEdges=function(t,e){for(var n,r,i=t.getOuterEdges(),o=i.length-1;o>=0;--o){var s=i[o],a=s.symetric,u=void 0,l=void 0;s.label===e&&(u=s),a.label===e&&(l=a),u&&l&&(l&&(r=l),u&&(r&&(r.next=u,r=void 0),n||(n=u)))}r&&(r.next=n)},t.prototype._findLabeledEdgeRings=function(){var t=[],e=0;return this.edges.forEach((function(n){if(!(n.label>=0)){t.push(n);var r=n;do{r.label=e,r=r.next}while(!n.isEqual(r));e++}})),t},t.prototype.getEdgeRings=function(){var t=this;this._computeNextCWEdges(),this.edges.forEach((function(t){t.label=void 0})),this._findLabeledEdgeRings().forEach((function(e){t._findIntersectionNodes(e).forEach((function(n){t._computeNextCCWEdges(n,e.label)}))}));var e=[];return this.edges.forEach((function(n){n.ring||e.push(t._findEdgeRing(n))})),e},t.prototype._findIntersectionNodes=function(t){var e=[],n=t,r=function(){var r=0;n.from.getOuterEdges().forEach((function(e){e.label===t.label&&++r})),r>1&&e.push(n.from),n=n.next};do{r()}while(!t.isEqual(n));return e},t.prototype._findEdgeRing=function(t){var e=t,n=new cs;do{n.push(e),e.ring=n,e=e.next}while(!t.isEqual(e));return n},t.prototype.removeNode=function(t){var e=this;t.getOuterEdges().forEach((function(t){return e.removeEdge(t)})),t.innerEdges.forEach((function(t){return e.removeEdge(t)})),delete this.nodes[t.id]},t.prototype.removeEdge=function(t){this.edges=this.edges.filter((function(e){return!e.isEqual(t)})),t.deleteEdge()},t}();function ps(t,e){var n=!0;return z(t,(function(t){z(e,(function(e){if(!1===n)return!1;n=function(t,e){switch(t.type){case"Point":switch(e.type){case"Point":return n=t.coordinates,r=e.coordinates,!(n[0]===r[0]&&n[1]===r[1]);case"LineString":return!fs(e,t);case"Polygon":return!ye(t,e)}break;case"LineString":switch(e.type){case"Point":return!fs(t,e);case"LineString":return!function(t,e){if(Or(t,e).features.length>0)return!0;return!1}(t,e);case"Polygon":return!gs(e,t)}break;case"Polygon":switch(e.type){case"Point":return!ye(e,t);case"LineString":return!gs(t,e);case"Polygon":return!function(t,e){for(var n=0,r=t.coordinates[0];n<r.length;n++){if(ye(r[n],e))return!0}for(var i=0,o=e.coordinates[0];i<o.length;i++){if(ye(o[i],t))return!0}if(Or(Ii(t),Ii(e)).features.length>0)return!0;return!1}(e,t)}}var n,r;return!1}(t.geometry,e.geometry)}))})),n}function fs(t,e){for(var n=0;n<t.coordinates.length-1;n++)if(ds(t.coordinates[n],t.coordinates[n+1],e.coordinates))return!0;return!1}function gs(t,e){for(var n=0,r=e.coordinates;n<r.length;n++){if(ye(r[n],t))return!0}return Or(e,Ii(t)).features.length>0}function ds(t,e,n){var r=n[0]-t[0],i=n[1]-t[1],o=e[0]-t[0],s=e[1]-t[1];return 0==r*s-i*o&&(Math.abs(o)>=Math.abs(s)?o>0?t[0]<=n[0]&&n[0]<=e[0]:e[0]<=n[0]&&n[0]<=t[0]:s>0?t[1]<=n[1]&&n[1]<=e[1]:e[1]<=n[1]&&n[1]<=t[1])}function ys(t,e){return!(t[0]>e[0])&&(!(t[2]<e[2])&&(!(t[1]>e[1])&&!(t[3]<e[3])))}function vs(t,e){return t[0]===e[0]&&t[1]===e[1]}function _s(t,e){return[(t[0]+e[0])/2,(t[1]+e[1])/2]}function ms(t,e){for(var n=!1,r=!1,i=t.coordinates.length,o=0;o<i&&!n&&!r;){for(var s=0;s<e.coordinates.length-1;s++){var a=!0;0!==s&&s!==e.coordinates.length-2||(a=!1),bs(e.coordinates[s],e.coordinates[s+1],t.coordinates[o],a)?n=!0:r=!0}o++}return n&&r}function xs(t,e){return Or(t,Ni(e)).features.length>0}function Es(t,e){for(var n=!1,r=!1,i=t.coordinates.length,o=0;o<i&&(!n||!r);o++)ye(a(t.coordinates[o]),e)?n=!0:r=!0;return r&&n}function bs(t,e,n,r){var i=n[0]-t[0],o=n[1]-t[1],s=e[0]-t[0],a=e[1]-t[1];return 0==i*a-o*s&&(r?Math.abs(s)>=Math.abs(a)?s>0?t[0]<=n[0]&&n[0]<=e[0]:e[0]<=n[0]&&n[0]<=t[0]:a>0?t[1]<=n[1]&&n[1]<=e[1]:e[1]<=n[1]&&n[1]<=t[1]:Math.abs(s)>=Math.abs(a)?s>0?t[0]<n[0]&&n[0]<e[0]:e[0]<n[0]&&n[0]<t[0]:a>0?t[1]<n[1]&&n[1]<e[1]:e[1]<n[1]&&n[1]<t[1])}var ws=function(t){this.precision=t&&t.precision?t.precision:17,this.direction=!(!t||!t.direction)&&t.direction,this.pseudoNode=!(!t||!t.pseudoNode)&&t.pseudoNode,this.objectComparator=t&&t.objectComparator?t.objectComparator:Ss};function Is(t){return t.coordinates.map((function(e){return{type:t.type.replace("Multi",""),coordinates:e}}))}function Ns(t,e){return t.hasOwnProperty("coordinates")?t.coordinates.length===e.coordinates.length:t.length===e.length}function Ss(t,e){return Fi(t,e,{strict:!0})}ws.prototype.compare=function(t,e){if(t.type!==e.type||!Ns(t,e))return!1;switch(t.type){case"Point":return this.compareCoord(t.coordinates,e.coordinates);case"LineString":return this.compareLine(t.coordinates,e.coordinates,0,!1);case"Polygon":return this.comparePolygon(t,e);case"Feature":return this.compareFeature(t,e);default:if(0===t.type.indexOf("Multi")){var n=this,r=Is(t),i=Is(e);return r.every((function(t){return this.some((function(e){return n.compare(t,e)}))}),i)}}return!1},ws.prototype.compareCoord=function(t,e){if(t.length!==e.length)return!1;for(var n=0;n<t.length;n++)if(t[n].toFixed(this.precision)!==e[n].toFixed(this.precision))return!1;return!0},ws.prototype.compareLine=function(t,e,n,r){if(!Ns(t,e))return!1;var i=this.pseudoNode?t:this.removePseudo(t),o=this.pseudoNode?e:this.removePseudo(e);if(!r||this.compareCoord(i[0],o[0])||(o=this.fixStartIndex(o,i))){var s=this.compareCoord(i[n],o[n]);return this.direction||s?this.comparePath(i,o):!!this.compareCoord(i[n],o[o.length-(1+n)])&&this.comparePath(i.slice().reverse(),o)}},ws.prototype.fixStartIndex=function(t,e){for(var n,r=-1,i=0;i<t.length;i++)if(this.compareCoord(t[i],e[0])){r=i;break}return r>=0&&(n=[].concat(t.slice(r,t.length),t.slice(1,r+1))),n},ws.prototype.comparePath=function(t,e){var n=this;return t.every((function(t,e){return n.compareCoord(t,this[e])}),e)},ws.prototype.comparePolygon=function(t,e){if(this.compareLine(t.coordinates[0],e.coordinates[0],1,!0)){var n=t.coordinates.slice(1,t.coordinates.length),r=e.coordinates.slice(1,e.coordinates.length),i=this;return n.every((function(t){return this.some((function(e){return i.compareLine(t,e,1,!0)}))}),r)}return!1},ws.prototype.compareFeature=function(t,e){return!(t.id!==e.id||!this.objectComparator(t.properties,e.properties)||!this.compareBBox(t,e))&&this.compare(t.geometry,e.geometry)},ws.prototype.compareBBox=function(t,e){return!!(!t.bbox&&!e.bbox||t.bbox&&e.bbox&&this.compareCoord(t.bbox,e.bbox))},ws.prototype.removePseudo=function(t){return t};var Cs=ws;function Ps(t,e){var n=!1;return z(t,(function(t){z(e,(function(e){if(!0===n)return!0;n=!ps(t.geometry,e.geometry)}))})),n}var Ms=Bt((function(t){function e(t,e,n,r){this.dataset=[],this.epsilon=1,this.minPts=2,this.distance=this._euclideanDistance,this.clusters=[],this.noise=[],this._visited=[],this._assigned=[],this._datasetLength=0,this._init(t,e,n,r)}e.prototype.run=function(t,e,n,r){this._init(t,e,n,r);for(var i=0;i<this._datasetLength;i++)if(1!==this._visited[i]){this._visited[i]=1;var o=this._regionQuery(i);if(o.length<this.minPts)this.noise.push(i);else{var s=this.clusters.length;this.clusters.push([]),this._addToCluster(i,s),this._expandCluster(s,o)}}return this.clusters},e.prototype._init=function(t,e,n,r){if(t){if(!(t instanceof Array))throw Error("Dataset must be of type array, "+typeof t+" given");this.dataset=t,this.clusters=[],this.noise=[],this._datasetLength=t.length,this._visited=new Array(this._datasetLength),this._assigned=new Array(this._datasetLength)}e&&(this.epsilon=e),n&&(this.minPts=n),r&&(this.distance=r)},e.prototype._expandCluster=function(t,e){for(var n=0;n<e.length;n++){var r=e[n];if(1!==this._visited[r]){this._visited[r]=1;var i=this._regionQuery(r);i.length>=this.minPts&&(e=this._mergeArrays(e,i))}1!==this._assigned[r]&&this._addToCluster(r,t)}},e.prototype._addToCluster=function(t,e){this.clusters[e].push(t),this._assigned[t]=1},e.prototype._regionQuery=function(t){for(var e=[],n=0;n<this._datasetLength;n++){this.distance(this.dataset[t],this.dataset[n])<this.epsilon&&e.push(n)}return e},e.prototype._mergeArrays=function(t,e){for(var n=e.length,r=0;r<n;r++){var i=e[r];t.indexOf(i)<0&&t.push(i)}return t},e.prototype._euclideanDistance=function(t,e){for(var n=0,r=Math.min(t.length,e.length);r--;)n+=(t[r]-e[r])*(t[r]-e[r]);return Math.sqrt(n)},t.exports&&(t.exports=e)})),Ls=Bt((function(t){function e(t,e,n){this.k=3,this.dataset=[],this.assignments=[],this.centroids=[],this.init(t,e,n)}e.prototype.init=function(t,e,n){this.assignments=[],this.centroids=[],void 0!==t&&(this.dataset=t),void 0!==e&&(this.k=e),void 0!==n&&(this.distance=n)},e.prototype.run=function(t,e){this.init(t,e);for(var n=this.dataset.length,r=0;r<this.k;r++)this.centroids[r]=this.randomCentroid();for(var i=!0;i;){i=this.assign();for(var o=0;o<this.k;o++){for(var s=new Array(c),a=0,u=0;u<c;u++)s[u]=0;for(var l=0;l<n;l++){var c=this.dataset[l].length;if(o===this.assignments[l]){for(u=0;u<c;u++)s[u]+=this.dataset[l][u];a++}}if(a>0){for(u=0;u<c;u++)s[u]/=a;this.centroids[o]=s}else this.centroids[o]=this.randomCentroid(),i=!0}}return this.getClusters()},e.prototype.randomCentroid=function(){var t,e,n=this.dataset.length-1;do{e=Math.round(Math.random()*n),t=this.dataset[e]}while(this.centroids.indexOf(t)>=0);return t},e.prototype.assign=function(){for(var t,e=!1,n=this.dataset.length,r=0;r<n;r++)(t=this.argmin(this.dataset[r],this.centroids,this.distance))!=this.assignments[r]&&(this.assignments[r]=t,e=!0);return e},e.prototype.getClusters=function(){for(var t,e=new Array(this.k),n=0;n<this.assignments.length;n++)void 0===e[t=this.assignments[n]]&&(e[t]=[]),e[t].push(n);return e},e.prototype.argmin=function(t,e,n){for(var r,i=Number.MAX_VALUE,o=0,s=e.length,a=0;a<s;a++)(r=n(t,e[a]))<i&&(i=r,o=a);return o},e.prototype.distance=function(t,e){for(var n=0,r=Math.min(t.length,e.length);r--;){var i=t[r]-e[r];n+=i*i}return Math.sqrt(n)},t.exports&&(t.exports=e)})),Os=Bt((function(t){function e(t,e,n){this._queue=[],this._priorities=[],this._sorting="desc",this._init(t,e,n)}e.prototype.insert=function(t,e){for(var n=this._queue.length,r=n;r--;){var i=this._priorities[r];"desc"===this._sorting?e>i&&(n=r):e<i&&(n=r)}this._insertAt(t,e,n)},e.prototype.remove=function(t){for(var e=this._queue.length;e--;){if(t===this._queue[e]){this._queue.splice(e,1),this._priorities.splice(e,1);break}}},e.prototype.forEach=function(t){this._queue.forEach(t)},e.prototype.getElements=function(){return this._queue},e.prototype.getElementPriority=function(t){return this._priorities[t]},e.prototype.getPriorities=function(){return this._priorities},e.prototype.getElementsWithPriorities=function(){for(var t=[],e=0,n=this._queue.length;e<n;e++)t.push([this._queue[e],this._priorities[e]]);return t},e.prototype._init=function(t,e,n){if(t&&e){if(this._queue=[],this._priorities=[],t.length!==e.length)throw new Error("Arrays must have the same length");for(var r=0;r<t.length;r++)this.insert(t[r],e[r])}n&&(this._sorting=n)},e.prototype._insertAt=function(t,e,n){this._queue.length===n?(this._queue.push(t),this._priorities.push(e)):(this._queue.splice(n,0,t),this._priorities.splice(n,0,e))},t.exports&&(t.exports=e)})),Rs=Bt((function(t){if(t.exports)var e=Os;function n(t,e,n,r){this.epsilon=1,this.minPts=1,this.distance=this._euclideanDistance,this._reachability=[],this._processed=[],this._coreDistance=0,this._orderedList=[],this._init(t,e,n,r)}n.prototype.run=function(t,n,r,i){this._init(t,n,r,i);for(var o=0,s=this.dataset.length;o<s;o++)if(1!==this._processed[o]){this._processed[o]=1,this.clusters.push([o]);var a=this.clusters.length-1;this._orderedList.push(o);var u=new e(null,null,"asc"),l=this._regionQuery(o);void 0!==this._distanceToCore(o)&&(this._updateQueue(o,l,u),this._expandCluster(a,u))}return this.clusters},n.prototype.getReachabilityPlot=function(){for(var t=[],e=0,n=this._orderedList.length;e<n;e++){var r=this._orderedList[e],i=this._reachability[r];t.push([r,i])}return t},n.prototype._init=function(t,e,n,r){if(t){if(!(t instanceof Array))throw Error("Dataset must be of type array, "+typeof t+" given");this.dataset=t,this.clusters=[],this._reachability=new Array(this.dataset.length),this._processed=new Array(this.dataset.length),this._coreDistance=0,this._orderedList=[]}e&&(this.epsilon=e),n&&(this.minPts=n),r&&(this.distance=r)},n.prototype._updateQueue=function(t,e,n){var r=this;this._coreDistance=this._distanceToCore(t),e.forEach((function(e){if(void 0===r._processed[e]){var i=r.distance(r.dataset[t],r.dataset[e]),o=Math.max(r._coreDistance,i);void 0===r._reachability[e]?(r._reachability[e]=o,n.insert(e,o)):o<r._reachability[e]&&(r._reachability[e]=o,n.remove(e),n.insert(e,o))}}))},n.prototype._expandCluster=function(t,e){for(var n=e.getElements(),r=0,i=n.length;r<i;r++){var o=n[r];if(void 0===this._processed[o]){var s=this._regionQuery(o);this._processed[o]=1,this.clusters[t].push(o),this._orderedList.push(o),void 0!==this._distanceToCore(o)&&(this._updateQueue(o,s,e),this._expandCluster(t,e))}}},n.prototype._distanceToCore=function(t){for(var e=this.epsilon,n=0;n<e;n++){if(this._regionQuery(t,n).length>=this.minPts)return n}},n.prototype._regionQuery=function(t,e){e=e||this.epsilon;for(var n=[],r=0,i=this.dataset.length;r<i;r++)this.distance(this.dataset[t],this.dataset[r])<e&&n.push(r);return n},n.prototype._euclideanDistance=function(t,e){for(var n=0,r=Math.min(t.length,e.length);r--;)n+=(t[r]-e[r])*(t[r]-e[r]);return Math.sqrt(n)},t.exports&&(t.exports=n)})),Ts=Bt((function(t){t.exports&&(t.exports={DBSCAN:Ms,KMEANS:Ls,OPTICS:Rs,PriorityQueue:Os})}));var As=function(t,e,n){for(var r=t.length,i=0,o=0;o<r;o++){var s=(t[o]||0)-(e[o]||0);i+=s*s}return n?Math.sqrt(i):i},Ds=As,Fs=function(t,e,n){var r=Math.abs(t-e);return n?r:r*r},ks=As,Gs=function(t,e){for(var n={},r=[],i=e<<2,o=t.length,s=t[0].length>0;r.length<e&&i-- >0;){var a=t[Math.floor(Math.random()*o)],u=s?a.join("_"):""+a;n[u]||(n[u]=!0,r.push(a))}if(r.length<e)throw new Error("Error initializating clusters");return r},qs=function(t,e){var n=t[0].length?Ds:Fs,r=[],i=t.length,o=t[0].length>0,s=t[Math.floor(Math.random()*i)];o&&s.join("_");for(r.push(s);r.length<e;){for(var a=[],u=r.length,l=0,c=[],h=0;h<i;h++){for(var p=1/0,f=0;f<u;f++){var g=n(t[h],r[f]);g<=p&&(p=g)}a[h]=p}for(var d=0;d<i;d++)l+=a[d];for(var y=0;y<i;y++)c[y]={i:y,v:t[y],pr:a[y]/l,cs:0};c.sort((function(t,e){return t.pr-e.pr})),c[0].cs=c[0].pr;for(var v=1;v<i;v++)c[v].cs=c[v-1].cs+c[v].pr;for(var _=Math.random(),m=0;m<i-1&&c[m++].cs<_;);r.push(c[m-1].v)}return r};function Bs(t,e,n){n=n||[];for(var r=0;r<t;r++)n[r]=e;return n}var zs=function(t,e,n,r){var i=[],o=[],s=[],a=[],u=!1,l=r||1e4,c=t.length,h=t[0].length,p=h>0,f=[];if(n)i="kmrand"==n?Gs(t,e):"kmpp"==n?qs(t,e):n;else for(var g={};i.length<e;){var d=Math.floor(Math.random()*c);g[d]||(g[d]=!0,i.push(t[d]))}do{Bs(e,0,f);for(var y=0;y<c;y++){for(var v=1/0,_=0,m=0;m<e;m++){(a=p?ks(t[y],i[m]):Math.abs(t[y]-i[m]))<=v&&(v=a,_=m)}s[y]=_,f[_]++}for(var x=[],E=(o=[],0);E<e;E++)x[E]=p?Bs(h,0,x[E]):0,o[E]=i[E];if(p){for(var b=0;b<e;b++)i[b]=[];for(var w=0;w<c;w++)for(var I=x[s[w]],N=t[w],S=0;S<h;S++)I[S]+=N[S];u=!0;for(var C=0;C<e;C++){for(var P=i[C],M=x[C],L=o[C],O=f[C],R=0;R<h;R++)P[R]=M[R]/O||0;if(u)for(var T=0;T<h;T++)if(L[T]!=P[T]){u=!1;break}}}else{for(var A=0;A<c;A++){x[s[A]]+=t[A]}for(var D=0;D<e;D++)i[D]=x[D]/f[D]||0;u=!0;for(var F=0;F<e;F++)if(o[F]!=i[F]){u=!1;break}}u=u||--l<=0}while(!u);return{it:1e4-l,k:e,idxs:s,centroids:i}};function js(t,e){return b(Bi(t[0],t[1]))===b(Bi(e[0],e[1]))}function Us(t,e){if(t.geometry&&t.geometry.type)return t.geometry.type;if(t.type)return t.type;throw new Error("Invalid GeoJSON object for "+e)}function Vs(t){for(var e=t,n=[];e.parent;)n.unshift(e),e=e.parent;return n}var Xs={search:function(t,e,n,r){t.cleanDirty();var i=(r=r||{}).heuristic||Xs.heuristics.manhattan,o=r.closest||!1,s=new Ws((function(t){return t.f})),a=e;for(e.h=i(e,n),s.push(e);s.size()>0;){var u=s.pop();if(u===n)return Vs(u);u.closed=!0;for(var l=t.neighbors(u),c=0,h=l.length;c<h;++c){var p=l[c];if(!p.closed&&!p.isWall()){var f=u.g+p.getCost(u),g=p.visited;(!g||f<p.g)&&(p.visited=!0,p.parent=u,p.h=p.h||i(p,n),p.g=f,p.f=p.g+p.h,t.markDirty(p),o&&(p.h<a.h||p.h===a.h&&p.g<a.g)&&(a=p),g?s.rescoreElement(p):s.push(p))}}}return o?Vs(a):[]},heuristics:{manhattan:function(t,e){return Math.abs(e.x-t.x)+Math.abs(e.y-t.y)},diagonal:function(t,e){var n=Math.sqrt(2),r=Math.abs(e.x-t.x),i=Math.abs(e.y-t.y);return 1*(r+i)+(n-2)*Math.min(r,i)}},cleanNode:function(t){t.f=0,t.g=0,t.h=0,t.visited=!1,t.closed=!1,t.parent=null}};function Ys(t,e){e=e||{},this.nodes=[],this.diagonal=!!e.diagonal,this.grid=[];for(var n=0;n<t.length;n++){this.grid[n]=[];for(var r=0,i=t[n];r<i.length;r++){var o=new Hs(n,r,i[r]);this.grid[n][r]=o,this.nodes.push(o)}}this.init()}function Hs(t,e,n){this.x=t,this.y=e,this.weight=n}function Ws(t){this.content=[],this.scoreFunction=t}function Js(t,e){for(var n=0;n<e.features.length;n++)if(ye(t,e.features[n]))return!0;return!1}function Zs(t){return function(){return t}}function Ks(t){return t[0]}function Qs(t){return t[1]}function $s(){this._=null}function ta(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function ea(t,e){var n=e,r=e.R,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.R=r.L,n.R&&(n.R.U=n),r.L=n}function na(t,e){var n=e,r=e.L,i=n.U;i?i.L===n?i.L=r:i.R=r:t._=r,r.U=i,n.U=r,n.L=r.R,n.L&&(n.L.U=n),r.R=n}function ra(t){for(;t.L;)t=t.L;return t}function ia(t,e,n,r){var i=[null,null],o=Pa.push(i)-1;return i.left=t,i.right=e,n&&sa(i,t,e,n),r&&sa(i,e,t,r),Sa[t.index].halfedges.push(o),Sa[e.index].halfedges.push(o),i}function oa(t,e,n){var r=[e,n];return r.left=t,r}function sa(t,e,n,r){t[0]||t[1]?t.left===n?t[1]=r:t[0]=r:(t[0]=r,t.left=e,t.right=n)}function aa(t,e,n,r,i){var o,s=t[0],a=t[1],u=s[0],l=s[1],c=0,h=1,p=a[0]-u,f=a[1]-l;if(o=e-u,p||!(o>0)){if(o/=p,p<0){if(o<c)return;o<h&&(h=o)}else if(p>0){if(o>h)return;o>c&&(c=o)}if(o=r-u,p||!(o<0)){if(o/=p,p<0){if(o>h)return;o>c&&(c=o)}else if(p>0){if(o<c)return;o<h&&(h=o)}if(o=n-l,f||!(o>0)){if(o/=f,f<0){if(o<c)return;o<h&&(h=o)}else if(f>0){if(o>h)return;o>c&&(c=o)}if(o=i-l,f||!(o<0)){if(o/=f,f<0){if(o>h)return;o>c&&(c=o)}else if(f>0){if(o<c)return;o<h&&(h=o)}return!(c>0||h<1)||(c>0&&(t[0]=[u+c*p,l+c*f]),h<1&&(t[1]=[u+h*p,l+h*f]),!0)}}}}}function ua(t,e,n,r,i){var o=t[1];if(o)return!0;var s,a,u=t[0],l=t.left,c=t.right,h=l[0],p=l[1],f=c[0],g=c[1],d=(h+f)/2,y=(p+g)/2;if(g===p){if(d<e||d>=r)return;if(h>f){if(u){if(u[1]>=i)return}else u=[d,n];o=[d,i]}else{if(u){if(u[1]<n)return}else u=[d,i];o=[d,n]}}else if(a=y-(s=(h-f)/(g-p))*d,s<-1||s>1)if(h>f){if(u){if(u[1]>=i)return}else u=[(n-a)/s,n];o=[(i-a)/s,i]}else{if(u){if(u[1]<n)return}else u=[(i-a)/s,i];o=[(n-a)/s,n]}else if(p<g){if(u){if(u[0]>=r)return}else u=[e,s*e+a];o=[r,s*r+a]}else{if(u){if(u[0]<e)return}else u=[r,s*r+a];o=[e,s*e+a]}return t[0]=u,t[1]=o,!0}function la(t,e){var n=t.site,r=e.left,i=e.right;return n===i&&(i=r,r=n),i?Math.atan2(i[1]-r[1],i[0]-r[0]):(n===r?(r=e[1],i=e[0]):(r=e[0],i=e[1]),Math.atan2(r[0]-i[0],i[1]-r[1]))}function ca(t,e){return e[+(e.left!==t.site)]}function ha(t,e){return e[+(e.left===t.site)]}Ys.prototype.init=function(){this.dirtyNodes=[];for(var t=0;t<this.nodes.length;t++)Xs.cleanNode(this.nodes[t])},Ys.prototype.cleanDirty=function(){for(var t=0;t<this.dirtyNodes.length;t++)Xs.cleanNode(this.dirtyNodes[t]);this.dirtyNodes=[]},Ys.prototype.markDirty=function(t){this.dirtyNodes.push(t)},Ys.prototype.neighbors=function(t){var e=[],n=t.x,r=t.y,i=this.grid;return i[n-1]&&i[n-1][r]&&e.push(i[n-1][r]),i[n+1]&&i[n+1][r]&&e.push(i[n+1][r]),i[n]&&i[n][r-1]&&e.push(i[n][r-1]),i[n]&&i[n][r+1]&&e.push(i[n][r+1]),this.diagonal&&(i[n-1]&&i[n-1][r-1]&&e.push(i[n-1][r-1]),i[n+1]&&i[n+1][r-1]&&e.push(i[n+1][r-1]),i[n-1]&&i[n-1][r+1]&&e.push(i[n-1][r+1]),i[n+1]&&i[n+1][r+1]&&e.push(i[n+1][r+1])),e},Ys.prototype.toString=function(){for(var t,e,n,r,i=[],o=this.grid,s=0,a=o.length;s<a;s++){for(t=[],n=0,r=(e=o[s]).length;n<r;n++)t.push(e[n].weight);i.push(t.join(" "))}return i.join("\n")},Hs.prototype.toString=function(){return"["+this.x+" "+this.y+"]"},Hs.prototype.getCost=function(t){return t&&t.x!==this.x&&t.y!==this.y?1.41421*this.weight:this.weight},Hs.prototype.isWall=function(){return 0===this.weight},Ws.prototype={push:function(t){this.content.push(t),this.sinkDown(this.content.length-1)},pop:function(){var t=this.content[0],e=this.content.pop();return this.content.length>0&&(this.content[0]=e,this.bubbleUp(0)),t},remove:function(t){var e=this.content.indexOf(t),n=this.content.pop();e!==this.content.length-1&&(this.content[e]=n,this.scoreFunction(n)<this.scoreFunction(t)?this.sinkDown(e):this.bubbleUp(e))},size:function(){return this.content.length},rescoreElement:function(t){this.sinkDown(this.content.indexOf(t))},sinkDown:function(t){for(var e=this.content[t];t>0;){var n=(t+1>>1)-1,r=this.content[n];if(!(this.scoreFunction(e)<this.scoreFunction(r)))break;this.content[n]=e,this.content[t]=r,t=n}},bubbleUp:function(t){for(var e=this.content.length,n=this.content[t],r=this.scoreFunction(n);;){var i,o=t+1<<1,s=o-1,a=null;if(s<e){var u=this.content[s];(i=this.scoreFunction(u))<r&&(a=s)}if(o<e){var l=this.content[o];this.scoreFunction(l)<(null===a?r:i)&&(a=o)}if(null===a)break;this.content[t]=this.content[a],this.content[a]=n,t=a}}},$s.prototype={constructor:$s,insert:function(t,e){var n,r,i;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;n=t}else this._?(t=ra(this._),e.P=null,e.N=t,t.P=t.L=e,n=t):(e.P=e.N=null,this._=e,n=null);for(e.L=e.R=null,e.U=n,e.C=!0,t=e;n&&n.C;)n===(r=n.U).L?(i=r.R)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.R&&(ea(this,n),n=(t=n).U),n.C=!1,r.C=!0,na(this,r)):(i=r.L)&&i.C?(n.C=i.C=!1,r.C=!0,t=r):(t===n.L&&(na(this,n),n=(t=n).U),n.C=!1,r.C=!0,ea(this,r)),n=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,n,r,i=t.U,o=t.L,s=t.R;if(n=o?s?ra(s):o:s,i?i.L===t?i.L=n:i.R=n:this._=n,o&&s?(r=n.C,n.C=t.C,n.L=o,o.U=n,n!==s?(i=n.U,n.U=t.U,t=n.R,i.L=t,n.R=s,s.U=n):(n.U=i,i=n,t=n.R)):(r=t.C,t=n),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((e=i.R).C&&(e.C=!1,i.C=!0,ea(this,i),e=i.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,na(this,e),e=i.R),e.C=i.C,i.C=e.R.C=!1,ea(this,i),t=this._;break}}else if((e=i.L).C&&(e.C=!1,i.C=!0,na(this,i),e=i.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,ea(this,e),e=i.L),e.C=i.C,i.C=e.L.C=!1,na(this,i),t=this._;break}e.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};var pa,fa=[];function ga(){ta(this),this.x=this.y=this.arc=this.site=this.cy=null}function da(t){var e=t.P,n=t.N;if(e&&n){var r=e.site,i=t.site,o=n.site;if(r!==o){var s=i[0],a=i[1],u=r[0]-s,l=r[1]-a,c=o[0]-s,h=o[1]-a,p=2*(u*h-l*c);if(!(p>=-La)){var f=u*u+l*l,g=c*c+h*h,d=(h*f-l*g)/p,y=(u*g-c*f)/p,v=fa.pop()||new ga;v.arc=t,v.site=i,v.x=d+s,v.y=(v.cy=y+a)+Math.sqrt(d*d+y*y),t.circle=v;for(var _=null,m=Ca._;m;)if(v.y<m.y||v.y===m.y&&v.x<=m.x){if(!m.L){_=m.P;break}m=m.L}else{if(!m.R){_=m;break}m=m.R}Ca.insert(_,v),_||(pa=v)}}}}function ya(t){var e=t.circle;e&&(e.P||(pa=e.N),Ca.remove(e),fa.push(e),ta(e),t.circle=null)}var va=[];function _a(){ta(this),this.edge=this.site=this.circle=null}function ma(t){var e=va.pop()||new _a;return e.site=t,e}function xa(t){ya(t),Na.remove(t),va.push(t),ta(t)}function Ea(t){var e=t.circle,n=e.x,r=e.cy,i=[n,r],o=t.P,s=t.N,a=[t];xa(t);for(var u=o;u.circle&&Math.abs(n-u.circle.x)<Ma&&Math.abs(r-u.circle.cy)<Ma;)o=u.P,a.unshift(u),xa(u),u=o;a.unshift(u),ya(u);for(var l=s;l.circle&&Math.abs(n-l.circle.x)<Ma&&Math.abs(r-l.circle.cy)<Ma;)s=l.N,a.push(l),xa(l),l=s;a.push(l),ya(l);var c,h=a.length;for(c=1;c<h;++c)l=a[c],u=a[c-1],sa(l.edge,u.site,l.site,i);u=a[0],(l=a[h-1]).edge=ia(u.site,l.site,null,i),da(u),da(l)}function ba(t){for(var e,n,r,i,o=t[0],s=t[1],a=Na._;a;)if((r=wa(a,s)-o)>Ma)a=a.L;else{if(!((i=o-Ia(a,s))>Ma)){r>-Ma?(e=a.P,n=a):i>-Ma?(e=a,n=a.N):e=n=a;break}if(!a.R){e=a;break}a=a.R}!function(t){Sa[t.index]={site:t,halfedges:[]}}(t);var u=ma(t);if(Na.insert(e,u),e||n){if(e===n)return ya(e),n=ma(e.site),Na.insert(u,n),u.edge=n.edge=ia(e.site,u.site),da(e),void da(n);if(n){ya(e),ya(n);var l=e.site,c=l[0],h=l[1],p=t[0]-c,f=t[1]-h,g=n.site,d=g[0]-c,y=g[1]-h,v=2*(p*y-f*d),_=p*p+f*f,m=d*d+y*y,x=[(y*_-f*m)/v+c,(p*m-d*_)/v+h];sa(n.edge,l,g,x),u.edge=ia(l,t,null,x),n.edge=ia(t,g,null,x),da(e),da(n)}else u.edge=ia(e.site,u.site)}}function wa(t,e){var n=t.site,r=n[0],i=n[1],o=i-e;if(!o)return r;var s=t.P;if(!s)return-1/0;var a=(n=s.site)[0],u=n[1],l=u-e;if(!l)return a;var c=a-r,h=1/o-1/l,p=c/l;return h?(-p+Math.sqrt(p*p-2*h*(c*c/(-2*l)-u+l/2+i-o/2)))/h+r:(r+a)/2}function Ia(t,e){var n=t.N;if(n)return wa(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var Na,Sa,Ca,Pa,Ma=1e-6,La=1e-12;function Oa(t,e){return e[1]-t[1]||e[0]-t[0]}function Ra(t,e){var n,r,i,o=t.sort(Oa).pop();for(Pa=[],Sa=new Array(t.length),Na=new $s,Ca=new $s;;)if(i=pa,o&&(!i||o[1]<i.y||o[1]===i.y&&o[0]<i.x))o[0]===n&&o[1]===r||(ba(o),n=o[0],r=o[1]),o=t.pop();else{if(!i)break;Ea(i.arc)}if(function(){for(var t,e,n,r,i=0,o=Sa.length;i<o;++i)if((t=Sa[i])&&(r=(e=t.halfedges).length)){var s=new Array(r),a=new Array(r);for(n=0;n<r;++n)s[n]=n,a[n]=la(t,Pa[e[n]]);for(s.sort((function(t,e){return a[e]-a[t]})),n=0;n<r;++n)a[n]=e[s[n]];for(n=0;n<r;++n)e[n]=a[n]}}(),e){var s=+e[0][0],a=+e[0][1],u=+e[1][0],l=+e[1][1];!function(t,e,n,r){for(var i,o=Pa.length;o--;)ua(i=Pa[o],t,e,n,r)&&aa(i,t,e,n,r)&&(Math.abs(i[0][0]-i[1][0])>Ma||Math.abs(i[0][1]-i[1][1])>Ma)||delete Pa[o]}(s,a,u,l),function(t,e,n,r){var i,o,s,a,u,l,c,h,p,f,g,d,y=Sa.length,v=!0;for(i=0;i<y;++i)if(o=Sa[i]){for(s=o.site,a=(u=o.halfedges).length;a--;)Pa[u[a]]||u.splice(a,1);for(a=0,l=u.length;a<l;)g=(f=ha(o,Pa[u[a]]))[0],d=f[1],h=(c=ca(o,Pa[u[++a%l]]))[0],p=c[1],(Math.abs(g-h)>Ma||Math.abs(d-p)>Ma)&&(u.splice(a,0,Pa.push(oa(s,f,Math.abs(g-t)<Ma&&r-d>Ma?[t,Math.abs(h-t)<Ma?p:r]:Math.abs(d-r)<Ma&&n-g>Ma?[Math.abs(p-r)<Ma?h:n,r]:Math.abs(g-n)<Ma&&d-e>Ma?[n,Math.abs(h-n)<Ma?p:e]:Math.abs(d-e)<Ma&&g-t>Ma?[Math.abs(p-e)<Ma?h:t,e]:null))-1),++l);l&&(v=!1)}if(v){var _,m,x,E=1/0;for(i=0,v=null;i<y;++i)(o=Sa[i])&&(x=(_=(s=o.site)[0]-t)*_+(m=s[1]-e)*m)<E&&(E=x,v=o);if(v){var b=[t,e],w=[t,r],I=[n,r],N=[n,e];v.halfedges.push(Pa.push(oa(s=v.site,b,w))-1,Pa.push(oa(s,w,I))-1,Pa.push(oa(s,I,N))-1,Pa.push(oa(s,N,b))-1)}}for(i=0;i<y;++i)(o=Sa[i])&&(o.halfedges.length||delete Sa[i])}(s,a,u,l)}this.edges=Pa,this.cells=Sa,Na=Ca=Pa=Sa=null}function Ta(t){return(t=t.slice()).push(t[0]),l([t])}function Aa(t,e,n,r){var i=(r=r||{}).steps||64,o=r.units||"kilometers",s=r.angle||0,a=r.pivot||t,u=r.properties||t.properties||{};if(!t)throw new Error("center is required");if(!e)throw new Error("xSemiAxis is required");if(!n)throw new Error("ySemiAxis is required");if(!P(r))throw new Error("options must be an object");if(!C(i))throw new Error("steps must be a number");if(!C(s))throw new Error("angle must be a number");var c=K(t);if("degrees"===o)var h=I(s);else e=ji(t,e,90,{units:o}),n=ji(t,n,0,{units:o}),e=K(e)[0]-c[0],n=K(n)[1]-c[1];for(var p=[],f=0;f<i;f+=1){var g=-360*f/i,d=e*n/Math.sqrt(Math.pow(n,2)+Math.pow(e,2)*Math.pow(Da(g),2)),y=e*n/Math.sqrt(Math.pow(e,2)+Math.pow(n,2)/Math.pow(Da(g),2));if(g<-90&&g>=-270&&(d=-d),g<-180&&g>=-360&&(y=-y),"degrees"===o){var v=d*Math.cos(h)+y*Math.sin(h),_=y*Math.cos(h)-d*Math.sin(h);d=v,y=_}p.push([d+c[0],y+c[1]])}return p.push(p[0]),"degrees"===o?l([p],u):$o(l([p],u),s,{pivot:a})}function Da(t){var e=t*Math.PI/180;return Math.tan(e)}function Fa(t,e){void 0===e&&(e={});var n=0,r=0,i=0;return q(t,(function(t,o,s){var a=e.weight?null==s?void 0:s[e.weight]:void 0;if(!C(a=null==a?1:a))throw new Error("weight value must be a number for feature index "+o);(a=Number(a))>0&&R(t,(function(t){n+=t[0]*a,r+=t[1]*a,i+=a}))})),a([n/i,r/i],e.properties,e)}function ka(t,e,n,r,i){var o=r.tolerance||.001,s=0,u=0,l=0,c=0;if(F(n,(function(e){var n,r=null===(n=e.properties)||void 0===n?void 0:n.weight,i=null==r?1:r;if(!C(i=Number(i)))throw new Error("weight value must be a number");if(i>0){c+=1;var o=i*me(e,t);0===o&&(o=1);var a=i/o;s+=e.geometry.coordinates[0]*a,u+=e.geometry.coordinates[1]*a,l+=a}})),c<1)throw new Error("no features to measure");var h=s/l,p=u/l;return 1===c||0===i||Math.abs(h-e[0])<o&&Math.abs(p-e[1])<o?a([h,p],{medianCandidates:r.medianCandidates}):(r.medianCandidates.push([h,p]),ka([h,p],t,n,r,i-1))}function Ga(t,e){return{x:t[0]-e[0],y:t[1]-e[1]}}function qa(t,e){var n=0,r=0;R(t,(function(i,o,s,a,u){u>n&&(n=u,r=o,e.push([]));var l=o-r,c=t.coordinates[u][l+1],h=i[0],p=i[1],f=c[0],g=c[1];e[u].push([.75*h+.25*f,.75*p+.25*g]),e[u].push([.25*h+.75*f,.25*p+.75*g])}),!0),e.forEach((function(t){t.push(t[0])}))}function Ba(t,e){var n=0,r=0,i=0;R(t,(function(o,s,a,u,l){u>i&&(i=u,r=s,e.push([[]])),l>n&&(n=l,r=s,e[u].push([]));var c=s-r,h=t.coordinates[u][l][c+1],p=o[0],f=o[1],g=h[0],d=h[1];e[u][l].push([.75*p+.25*g,.75*f+.25*d]),e[u][l].push([.25*p+.75*g,.25*f+.75*d])}),!0),e.forEach((function(t){t.forEach((function(t){t.push(t[0])}))}))}function za(t,e,n){void 0===n&&(n=2);var r=K(t),i=K(e),o=r[0]-i[0],s=r[1]-i[1];return 1===n?Math.abs(o)+Math.abs(s):Math.pow(Math.pow(o,n)+Math.pow(s,n),1/n)}function ja(t,e){var n=(e=e||{}).threshold||1e4,r=e.p||2,i=e.binary||!1,o=e.alpha||-1,s=e.standardization||!1,a=[];F(t,(function(t){a.push(En(t))}));for(var u=[],l=0;l<a.length;l++)u[l]=[];for(l=0;l<a.length;l++)for(var c=l;c<a.length;c++){l===c&&(u[l][c]=0);var h=za(a[l],a[c],r);u[l][c]=h,u[c][l]=h}for(l=0;l<a.length;l++)for(c=0;c<a.length;c++){0!==(h=u[l][c])&&(u[l][c]=i?h<=n?1:0:h<=n?Math.pow(h,o):0)}if(s)for(l=0;l<a.length;l++){var p=u[l].reduce((function(t,e){return t+e}),0);for(c=0;c<a.length;c++)u[l][c]=u[l][c]/p}return u}function Ua(t){for(var e=0,n=0,r=t;n<r.length;n++){e+=r[n]}return e/t.length}function Va(t,e){return void 0===e&&(e={}),Ya(t,"mercator",e)}function Xa(t,e){return void 0===e&&(e={}),Ya(t,"wgs84",e)}function Ya(t,e,n){void 0===n&&(n={});var r=(n=n||{}).mutate;if(!t)throw new Error("geojson is required");return Array.isArray(t)&&C(t[0])?t="mercator"===e?Ha(t):Wa(t):(!0!==r&&(t=Ie(t)),R(t,(function(t){var n="mercator"===e?Ha(t):Wa(t);t[0]=n[0],t[1]=n[1]}))),t}function Ha(t){var e=Math.PI/180,n=6378137,r=20037508.342789244,i=[n*(Math.abs(t[0])<=180?t[0]:t[0]-360*function(t){return t<0?-1:t>0?1:0}(t[0]))*e,n*Math.log(Math.tan(.25*Math.PI+.5*t[1]*e))];return i[0]>r&&(i[0]=r),i[0]<-r&&(i[0]=-r),i[1]>r&&(i[1]=r),i[1]<-r&&(i[1]=-r),i}function Wa(t){var e=180/Math.PI,n=6378137;return[t[0]*e/n,(.5*Math.PI-2*Math.atan(Math.exp(-t[1]/n)))*e]}Ra.prototype={constructor:Ra,polygons:function(){var t=this.edges;return this.cells.map((function(e){var n=e.halfedges.map((function(n){return ca(e,t[n])}));return n.data=e.site.data,n}))},triangles:function(){var t=[],e=this.edges;return this.cells.forEach((function(n,r){if(o=(i=n.halfedges).length)for(var i,o,s,a,u,l,c=n.site,h=-1,p=e[i[o-1]],f=p.left===c?p.right:p.left;++h<o;)s=f,f=(p=e[i[h]]).left===c?p.right:p.left,s&&f&&r<s.index&&r<f.index&&(u=s,l=f,((a=c)[0]-l[0])*(u[1]-a[1])-(a[0]-u[0])*(l[1]-a[1])<0)&&t.push([c.data,s.data,f.data])})),t},links:function(){return this.edges.filter((function(t){return t.right})).map((function(t){return{source:t.left.data,target:t.right.data}}))},find:function(t,e,n){for(var r,i,o=this,s=o._found||0,a=o.cells.length;!(i=o.cells[s]);)if(++s>=a)return null;var u=t-i.site[0],l=e-i.site[1],c=u*u+l*l;do{i=o.cells[r=s],s=null,i.halfedges.forEach((function(n){var r=o.edges[n],a=r.left;if(a!==i.site&&a||(a=r.right)){var u=t-a[0],l=e-a[1],h=u*u+l*l;h<c&&(c=h,s=a.index)}}))}while(null!==s);return o._found=r,null==n||c<=n*n?i.site:null}};var Ja=Object.freeze({__proto__:null,toMercator:Va,toWgs84:Xa}),Za=function(){for(var t=0,e=0,n=arguments.length;e<n;e++)t+=arguments[e].length;var r=Array(t),i=0;for(e=0;e<n;e++)for(var o=arguments[e],s=0,a=o.length;s<a;s++,i++)r[i]=o[s];return r};function Ka(t){return Array.isArray(t)?nu(t):t&&t.bbox?nu(t.bbox):[360*eu(),180*eu()]}function Qa(t,e){void 0===e&&(e={}),null==t&&(t=1);for(var n=[],r=0;r<t;r++)n.push(a(Ka(e.bbox)));return f(n)}function $a(t,e){void 0===e&&(e={}),null==t&&(t=1),C(e.num_vertices)&&void 0!==e.num_vertices||(e.num_vertices=10),C(e.max_radial_length)&&void 0!==e.max_radial_length||(e.max_radial_length=10);for(var n=[],r=function(t){var r,i=[],o=Za(Array(e.num_vertices+1)).map(Math.random);o.forEach((function(t,e,n){n[e]=e>0?t+n[e-1]:t})),o.forEach((function(t){t=2*t*Math.PI/o[o.length-1];var n=Math.random();i.push([n*(e.max_radial_length||10)*Math.sin(t),n*(e.max_radial_length||10)*Math.cos(t)])})),i[i.length-1]=i[0],i=i.map((r=Ka(e.bbox),function(t){return[t[0]+r[0],t[1]+r[1]]})),n.push(l([i]))},i=0;i<t;i++)r();return f(n)}function tu(t,e){if(void 0===e&&(e={}),!P(e=e||{}))throw new Error("options is invalid");var n=e.bbox,r=e.num_vertices,i=e.max_length,o=e.max_rotation;null==t&&(t=1),(!C(r)||void 0===r||r<2)&&(r=10),C(i)&&void 0!==i||(i=1e-4),C(o)&&void 0!==o||(o=Math.PI/8);for(var s=[],a=0;a<t;a++){for(var u=[Ka(n)],l=0;l<r-1;l++){var c=(0===l?2*Math.random()*Math.PI:Math.tan((u[l][1]-u[l-1][1])/(u[l][0]-u[l-1][0])))+(Math.random()-.5)*o*2,p=Math.random()*i;u.push([u[l][0]+p*Math.cos(c),u[l][1]+p*Math.sin(c)])}s.push(h(u))}return f(s)}function eu(){return Math.random()-.5}function nu(t){return[Math.random()*(t[2]-t[0])+t[0],Math.random()*(t[3]-t[1])+t[1]]}var ru=Object.freeze({__proto__:null,randomPosition:Ka,randomPoint:Qa,randomPolygon:$a,randomLineString:tu});function iu(t,e){if(!t)throw new Error("geojson is required");if("FeatureCollection"!==t.type)throw new Error("geojson must be a FeatureCollection");if(null==e)throw new Error("filter is required");var n=[];return F(t,(function(t){uu(t.properties,e)&&n.push(t)})),f(n)}function ou(t,e,n){if(!t)throw new Error("geojson is required");if("FeatureCollection"!==t.type)throw new Error("geojson must be a FeatureCollection");if(null==e)throw new Error("property is required");for(var r=au(t,e),i=Object.keys(r),o=0;o<i.length;o++){for(var s=i[o],a=r[s],u=[],l=0;l<a.length;l++)u.push(t.features[a[l]]);n(f(u),s,o)}}function su(t,e,n,r){var i=r;return ou(t,e,(function(t,e,o){i=0===o&&void 0===r?t:n(i,t,e,o)})),i}function au(t,e){var n={};return F(t,(function(t,r){var i=t.properties||{};if(Object.prototype.hasOwnProperty.call(i,String(e))){var o=i[e];Object.prototype.hasOwnProperty.call(n,o)?n[o].push(r):n[o]=[r]}})),n}function uu(t,e){if(void 0===t)return!1;var n=typeof e;if("number"===n||"string"===n)return Object.prototype.hasOwnProperty.call(t,e);if(Array.isArray(e)){for(var r=0;r<e.length;r++)if(!uu(t,e[r]))return!1;return!0}return lu(t,e)}function lu(t,e){for(var n=Object.keys(e),r=0;r<n.length;r++){var i=n[r];if(t[i]!==e[i])return!1}return!0}function cu(t,e){if(!e)return{};if(!e.length)return{};for(var n={},r=0;r<e.length;r++){var i=e[r];Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=t[i])}return n}var hu=Object.freeze({__proto__:null,getCluster:iu,clusterEach:ou,clusterReduce:su,createBins:au,applyFilter:uu,propertiesContainsFilter:lu,filterProperties:cu}),pu=function(t,e){this.next=null,this.key=t,this.data=e,this.left=null,this.right=null}; /** * splaytree v3.1.0 * Fast Splay tree for Node and browser * * @author Alexander Milevski <[email protected]> * @license MIT * @preserve */function fu(t,e){return t>e?1:t<e?-1:0}function gu(t,e,n){for(var r=new pu(null,null),i=r,o=r;;){var s=n(t,e.key);if(s<0){if(null===e.left)break;if(n(t,e.left.key)<0){var a=e.left;if(e.left=a.right,a.right=e,null===(e=a).left)break}o.left=e,o=e,e=e.left}else{if(!(s>0))break;if(null===e.right)break;if(n(t,e.right.key)>0){a=e.right;if(e.right=a.left,a.left=e,null===(e=a).right)break}i.right=e,i=e,e=e.right}}return i.right=e.left,o.left=e.right,e.left=r.right,e.right=r.left,e}function du(t,e,n,r){var i=new pu(t,e);if(null===n)return i.left=i.right=null,i;var o=r(t,(n=gu(t,n,r)).key);return o<0?(i.left=n.left,i.right=n,n.left=null):o>=0&&(i.right=n.right,i.left=n,n.right=null),i}function yu(t,e,n){var r=null,i=null;if(e){var o=n((e=gu(t,e,n)).key,t);0===o?(r=e.left,i=e.right):o<0?(i=e.right,e.right=null,r=e):(r=e.left,e.left=null,i=e)}return{left:r,right:i}}function vu(t,e,n,r,i){if(t){r(e+(n?"└── ":"├── ")+i(t)+"\n");var o=e+(n?" ":"│ ");t.left&&vu(t.left,o,!1,r,i),t.right&&vu(t.right,o,!0,r,i)}}var _u=function(){function t(t){void 0===t&&(t=fu),this._root=null,this._size=0,this._comparator=t}return t.prototype.insert=function(t,e){return this._size++,this._root=du(t,e,this._root,this._comparator)},t.prototype.add=function(t,e){var n=new pu(t,e);null===this._root&&(n.left=n.right=null,this._size++,this._root=n);var r=this._comparator,i=gu(t,this._root,r),o=r(t,i.key);return 0===o?this._root=i:(o<0?(n.left=i.left,n.right=i,i.left=null):o>0&&(n.right=i.right,n.left=i,i.right=null),this._size++,this._root=n),this._root},t.prototype.remove=function(t){this._root=this._remove(t,this._root,this._comparator)},t.prototype._remove=function(t,e,n){var r;return null===e?null:0===n(t,(e=gu(t,e,n)).key)?(null===e.left?r=e.right:(r=gu(t,e.left,n)).right=e.right,this._size--,r):e},t.prototype.pop=function(){var t=this._root;if(t){for(;t.left;)t=t.left;return this._root=gu(t.key,this._root,this._comparator),this._root=this._remove(t.key,this._root,this._comparator),{key:t.key,data:t.data}}return null},t.prototype.findStatic=function(t){for(var e=this._root,n=this._comparator;e;){var r=n(t,e.key);if(0===r)return e;e=r<0?e.left:e.right}return null},t.prototype.find=function(t){return this._root&&(this._root=gu(t,this._root,this._comparator),0!==this._comparator(t,this._root.key))?null:this._root},t.prototype.contains=function(t){for(var e=this._root,n=this._comparator;e;){var r=n(t,e.key);if(0===r)return!0;e=r<0?e.left:e.right}return!1},t.prototype.forEach=function(t,e){for(var n=this._root,r=[],i=!1;!i;)null!==n?(r.push(n),n=n.left):0!==r.length?(n=r.pop(),t.call(e,n),n=n.right):i=!0;return this},t.prototype.range=function(t,e,n,r){for(var i=[],o=this._comparator,s=this._root;0!==i.length||s;)if(s)i.push(s),s=s.left;else{if(o((s=i.pop()).key,e)>0)break;if(o(s.key,t)>=0&&n.call(r,s))return this;s=s.right}return this},t.prototype.keys=function(){var t=[];return this.forEach((function(e){var n=e.key;return t.push(n)})),t},t.prototype.values=function(){var t=[];return this.forEach((function(e){var n=e.data;return t.push(n)})),t},t.prototype.min=function(){return this._root?this.minNode(this._root).key:null},t.prototype.max=function(){return this._root?this.maxNode(this._root).key:null},t.prototype.minNode=function(t){if(void 0===t&&(t=this._root),t)for(;t.left;)t=t.left;return t},t.prototype.maxNode=function(t){if(void 0===t&&(t=this._root),t)for(;t.right;)t=t.right;return t},t.prototype.at=function(t){for(var e=this._root,n=!1,r=0,i=[];!n;)if(e)i.push(e),e=e.left;else if(i.length>0){if(e=i.pop(),r===t)return e;r++,e=e.right}else n=!0;return null},t.prototype.next=function(t){var e=this._root,n=null;if(t.right){for(n=t.right;n.left;)n=n.left;return n}for(var r=this._comparator;e;){var i=r(t.key,e.key);if(0===i)break;i<0?(n=e,e=e.left):e=e.right}return n},t.prototype.prev=function(t){var e=this._root,n=null;if(null!==t.left){for(n=t.left;n.right;)n=n.right;return n}for(var r=this._comparator;e;){var i=r(t.key,e.key);if(0===i)break;i<0?e=e.left:(n=e,e=e.right)}return n},t.prototype.clear=function(){return this._root=null,this._size=0,this},t.prototype.toList=function(){return function(t){var e=t,n=[],r=!1,i=new pu(null,null),o=i;for(;!r;)e?(n.push(e),e=e.left):n.length>0?e=(e=o=o.next=n.pop()).right:r=!0;return o.next=null,i.next}(this._root)},t.prototype.load=function(t,e,n){void 0===e&&(e=[]),void 0===n&&(n=!1);var r=t.length,i=this._comparator;if(n&&Eu(t,e,0,r-1,i),null===this._root)this._root=mu(t,e,0,r),this._size=r;else{var o=function(t,e,n){var r=new pu(null,null),i=r,o=t,s=e;for(;null!==o&&null!==s;)n(o.key,s.key)<0?(i.next=o,o=o.next):(i.next=s,s=s.next),i=i.next;null!==o?i.next=o:null!==s&&(i.next=s);return r.next}(this.toList(),function(t,e){for(var n=new pu(null,null),r=n,i=0;i<t.length;i++)r=r.next=new pu(t[i],e[i]);return r.next=null,n.next}(t,e),i);r=this._size+r,this._root=xu({head:o},0,r)}return this},t.prototype.isEmpty=function(){return null===this._root},Object.defineProperty(t.prototype,"size",{get:function(){return this._size},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"root",{get:function(){return this._root},enumerable:!0,configurable:!0}),t.prototype.toString=function(t){void 0===t&&(t=function(t){return String(t.key)});var e=[];return vu(this._root,"",!0,(function(t){return e.push(t)}),t),e.join("")},t.prototype.update=function(t,e,n){var r=this._comparator,i=yu(t,this._root,r),o=i.left,s=i.right;r(t,e)<0?s=du(e,n,s,r):o=du(e,n,o,r),this._root=function(t,e,n){return null===e?t:(null===t||((e=gu(t.key,e,n)).left=t),e)}(o,s,r)},t.prototype.split=function(t){return yu(t,this._root,this._comparator)},t}();function mu(t,e,n,r){var i=r-n;if(i>0){var o=n+Math.floor(i/2),s=t[o],a=e[o],u=new pu(s,a);return u.left=mu(t,e,n,o),u.right=mu(t,e,o+1,r),u}return null}function xu(t,e,n){var r=n-e;if(r>0){var i=e+Math.floor(r/2),o=xu(t,e,i),s=t.head;return s.left=o,t.head=t.head.next,s.right=xu(t,i+1,n),s}return null}function Eu(t,e,n,r,i){if(!(n>=r)){for(var o=t[n+r>>1],s=n-1,a=r+1;;){do{s++}while(i(t[s],o)<0);do{a--}while(i(t[a],o)>0);if(s>=a)break;var u=t[s];t[s]=t[a],t[a]=u,u=e[s],e[s]=e[a],e[a]=u}Eu(t,e,n,a,i),Eu(t,e,a+1,r,i)}}function bu(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function wu(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function Iu(t,e,n){return e&&wu(t.prototype,e),n&&wu(t,n),t}var Nu=function(t,e){return t.ll.x<=e.x&&e.x<=t.ur.x&&t.ll.y<=e.y&&e.y<=t.ur.y},Su=function(t,e){if(e.ur.x<t.ll.x||t.ur.x<e.ll.x||e.ur.y<t.ll.y||t.ur.y<e.ll.y)return null;var n=t.ll.x<e.ll.x?e.ll.x:t.ll.x,r=t.ur.x<e.ur.x?t.ur.x:e.ur.x;return{ll:{x:n,y:t.ll.y<e.ll.y?e.ll.y:t.ll.y},ur:{x:r,y:t.ur.y<e.ur.y?t.ur.y:e.ur.y}}},Cu=Number.EPSILON;void 0===Cu&&(Cu=Math.pow(2,-52));var Pu=Cu*Cu,Mu=function(t,e){if(-Cu<t&&t<Cu&&-Cu<e&&e<Cu)return 0;var n=t-e;return n*n<Pu*t*e?0:t<e?-1:1},Lu=function(){function t(){bu(this,t),this.reset()}return Iu(t,[{key:"reset",value:function(){this.xRounder=new Ou,this.yRounder=new Ou}},{key:"round",value:function(t,e){return{x:this.xRounder.round(t),y:this.yRounder.round(e)}}}]),t}(),Ou=function(){function t(){bu(this,t),this.tree=new _u,this.round(0)}return Iu(t,[{key:"round",value:function(t){var e=this.tree.add(t),n=this.tree.prev(e);if(null!==n&&0===Mu(e.key,n.key))return this.tree.remove(t),n.key;var r=this.tree.next(e);return null!==r&&0===Mu(e.key,r.key)?(this.tree.remove(t),r.key):t}}]),t}(),Ru=new Lu,Tu=function(t,e){return t.x*e.y-t.y*e.x},Au=function(t,e){return t.x*e.x+t.y*e.y},Du=function(t,e,n){var r={x:e.x-t.x,y:e.y-t.y},i={x:n.x-t.x,y:n.y-t.y},o=Tu(r,i);return Mu(o,0)},Fu=function(t){return Math.sqrt(Au(t,t))},ku=function(t,e,n){var r={x:e.x-t.x,y:e.y-t.y},i={x:n.x-t.x,y:n.y-t.y};return Au(i,r)/Fu(i)/Fu(r)},Gu=function(t,e,n){return 0===e.y?null:{x:t.x+e.x/e.y*(n-t.y),y:n}},qu=function(t,e,n){return 0===e.x?null:{x:n,y:t.y+e.y/e.x*(n-t.x)}},Bu=function(){function t(e,n){bu(this,t),void 0===e.events?e.events=[this]:e.events.push(this),this.point=e,this.isLeft=n}return Iu(t,null,[{key:"compare",value:function(e,n){var r=t.comparePoints(e.point,n.point);return 0!==r?r:(e.point!==n.point&&e.link(n),e.isLeft!==n.isLeft?e.isLeft?1:-1:ju.compare(e.segment,n.segment))}},{key:"comparePoints",value:function(t,e){return t.x<e.x?-1:t.x>e.x?1:t.y<e.y?-1:t.y>e.y?1:0}}]),Iu(t,[{key:"link",value:function(t){if(t.point===this.point)throw new Error("Tried to link already linked events");for(var e=t.point.events,n=0,r=e.length;n<r;n++){var i=e[n];this.point.events.push(i),i.point=this.point}this.checkForConsuming()}},{key:"checkForConsuming",value:function(){for(var t=this.point.events.length,e=0;e<t;e++){var n=this.point.events[e];if(void 0===n.segment.consumedBy)for(var r=e+1;r<t;r++){var i=this.point.events[r];void 0===i.consumedBy&&(n.otherSE.point.events===i.otherSE.point.events&&n.segment.consume(i.segment))}}}},{key:"getAvailableLinkedEvents",value:function(){for(var t=[],e=0,n=this.point.events.length;e<n;e++){var r=this.point.events[e];r!==this&&!r.segment.ringOut&&r.segment.isInResult()&&t.push(r)}return t}},{key:"getLeftmostComparator",value:function(t){var e=this,n=new Map,r=function(r){var i,o,s,a,u,l=r.otherSE;n.set(r,{sine:(i=e.point,o=t.point,s=l.point,a={x:o.x-i.x,y:o.y-i.y},u={x:s.x-i.x,y:s.y-i.y},Tu(u,a)/Fu(u)/Fu(a)),cosine:ku(e.point,t.point,l.point)})};return function(t,e){n.has(t)||r(t),n.has(e)||r(e);var i=n.get(t),o=i.sine,s=i.cosine,a=n.get(e),u=a.sine,l=a.cosine;return o>=0&&u>=0?s<l?1:s>l?-1:0:o<0&&u<0?s<l?-1:s>l?1:0:u<o?-1:u>o?1:0}}}]),t}(),zu=0,ju=function(){function t(e,n,r,i){bu(this,t),this.id=++zu,this.leftSE=e,e.segment=this,e.otherSE=n,this.rightSE=n,n.segment=this,n.otherSE=e,this.rings=r,this.windings=i}return Iu(t,null,[{key:"compare",value:function(t,e){var n=t.leftSE.point.x,r=e.leftSE.point.x,i=t.rightSE.point.x,o=e.rightSE.point.x;if(o<n)return 1;if(i<r)return-1;var s=t.leftSE.point.y,a=e.leftSE.point.y,u=t.rightSE.point.y,l=e.rightSE.point.y;if(n<r){if(a<s&&a<u)return 1;if(a>s&&a>u)return-1;var c=t.comparePoint(e.leftSE.point);if(c<0)return 1;if(c>0)return-1;var h=e.comparePoint(t.rightSE.point);return 0!==h?h:-1}if(n>r){if(s<a&&s<l)return-1;if(s>a&&s>l)return 1;var p=e.comparePoint(t.leftSE.point);if(0!==p)return p;var f=t.comparePoint(e.rightSE.point);return f<0?1:f>0?-1:1}if(s<a)return-1;if(s>a)return 1;if(i<o){var g=e.comparePoint(t.rightSE.point);if(0!==g)return g}if(i>o){var d=t.comparePoint(e.rightSE.point);if(d<0)return 1;if(d>0)return-1}if(i!==o){var y=u-s,v=i-n,_=l-a,m=o-r;if(y>v&&_<m)return 1;if(y<v&&_>m)return-1}return i>o?1:i<o||u<l?-1:u>l?1:t.id<e.id?-1:t.id>e.id?1:0}}]),Iu(t,[{key:"replaceRightSE",value:function(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}},{key:"bbox",value:function(){var t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:t<e?t:e},ur:{x:this.rightSE.point.x,y:t>e?t:e}}}},{key:"vector",value:function(){return{x:this.rightSE.point.x-this.leftSE.point.x,y:this.rightSE.point.y-this.leftSE.point.y}}},{key:"isAnEndpoint",value:function(t){return t.x===this.leftSE.point.x&&t.y===this.leftSE.point.y||t.x===this.rightSE.point.x&&t.y===this.rightSE.point.y}},{key:"comparePoint",value:function(t){if(this.isAnEndpoint(t))return 0;var e=this.leftSE.point,n=this.rightSE.point,r=this.vector();if(e.x===n.x)return t.x===e.x?0:t.x<e.x?1:-1;var i=(t.y-e.y)/r.y,o=e.x+i*r.x;if(t.x===o)return 0;var s=(t.x-e.x)/r.x,a=e.y+s*r.y;return t.y===a?0:t.y<a?-1:1}},{key:"getIntersection",value:function(t){var e=this.bbox(),n=t.bbox(),r=Su(e,n);if(null===r)return null;var i=this.leftSE.point,o=this.rightSE.point,s=t.leftSE.point,a=t.rightSE.point,u=Nu(e,s)&&0===this.comparePoint(s),l=Nu(n,i)&&0===t.comparePoint(i),c=Nu(e,a)&&0===this.comparePoint(a),h=Nu(n,o)&&0===t.comparePoint(o);if(l&&u)return h&&!c?o:!h&&c?a:null;if(l)return c&&i.x===a.x&&i.y===a.y?null:i;if(u)return h&&o.x===s.x&&o.y===s.y?null:s;if(h&&c)return null;if(h)return o;if(c)return a;var p=function(t,e,n,r){if(0===e.x)return qu(n,r,t.x);if(0===r.x)return qu(t,e,n.x);if(0===e.y)return Gu(n,r,t.y);if(0===r.y)return Gu(t,e,n.y);var i=Tu(e,r);if(0==i)return null;var o={x:n.x-t.x,y:n.y-t.y},s=Tu(o,e)/i,a=Tu(o,r)/i;return{x:(t.x+a*e.x+(n.x+s*r.x))/2,y:(t.y+a*e.y+(n.y+s*r.y))/2}}(i,this.vector(),s,t.vector());return null===p?null:Nu(r,p)?Ru.round(p.x,p.y):null}},{key:"split",value:function(e){var n=[],r=void 0!==e.events,i=new Bu(e,!0),o=new Bu(e,!1),s=this.rightSE;this.replaceRightSE(o),n.push(o),n.push(i);var a=new t(i,s,this.rings.slice(),this.windings.slice());return Bu.comparePoints(a.leftSE.point,a.rightSE.point)>0&&a.swapEvents(),Bu.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),r&&(i.checkForConsuming(),o.checkForConsuming()),n}},{key:"swapEvents",value:function(){var t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(var e=0,n=this.windings.length;e<n;e++)this.windings[e]*=-1}},{key:"consume",value:function(e){for(var n=this,r=e;n.consumedBy;)n=n.consumedBy;for(;r.consumedBy;)r=r.consumedBy;var i=t.compare(n,r);if(0!==i){if(i>0){var o=n;n=r,r=o}if(n.prev===r){var s=n;n=r,r=s}for(var a=0,u=r.rings.length;a<u;a++){var l=r.rings[a],c=r.windings[a],h=n.rings.indexOf(l);-1===h?(n.rings.push(l),n.windings.push(c)):n.windings[h]+=c}r.rings=null,r.windings=null,r.consumedBy=n,r.leftSE.consumedBy=n.leftSE,r.rightSE.consumedBy=n.rightSE}}},{key:"prevInResult",value:function(){return void 0!==this._prevInResult||(this.prev?this.prev.isInResult()?this._prevInResult=this.prev:this._prevInResult=this.prev.prevInResult():this._prevInResult=null),this._prevInResult}},{key:"beforeState",value:function(){if(void 0!==this._beforeState)return this._beforeState;if(this.prev){var t=this.prev.consumedBy||this.prev;this._beforeState=t.afterState()}else this._beforeState={rings:[],windings:[],multiPolys:[]};return this._beforeState}},{key:"afterState",value:function(){if(void 0!==this._afterState)return this._afterState;var t=this.beforeState();this._afterState={rings:t.rings.slice(0),windings:t.windings.slice(0),multiPolys:[]};for(var e=this._afterState.rings,n=this._afterState.windings,r=this._afterState.multiPolys,i=0,o=this.rings.length;i<o;i++){var s=this.rings[i],a=this.windings[i],u=e.indexOf(s);-1===u?(e.push(s),n.push(a)):n[u]+=a}for(var l=[],c=[],h=0,p=e.length;h<p;h++)if(0!==n[h]){var f=e[h],g=f.poly;if(-1===c.indexOf(g))if(f.isExterior)l.push(g);else{-1===c.indexOf(g)&&c.push(g);var d=l.indexOf(f.poly);-1!==d&&l.splice(d,1)}}for(var y=0,v=l.length;y<v;y++){var _=l[y].multiPoly;-1===r.indexOf(_)&&r.push(_)}return this._afterState}},{key:"isInResult",value:function(){if(this.consumedBy)return!1;if(void 0!==this._isInResult)return this._isInResult;var t=this.beforeState().multiPolys,e=this.afterState().multiPolys;switch(Qu.type){case"union":var n=0===t.length,r=0===e.length;this._isInResult=n!==r;break;case"intersection":var i,o;t.length<e.length?(i=t.length,o=e.length):(i=e.length,o=t.length),this._isInResult=o===Qu.numMultiPolys&&i<o;break;case"xor":var s=Math.abs(t.length-e.length);this._isInResult=s%2==1;break;case"difference":var a=function(t){return 1===t.length&&t[0].isSubject};this._isInResult=a(t)!==a(e);break;default:throw new Error("Unrecognized operation type found ".concat(Qu.type))}return this._isInResult}}],[{key:"fromRing",value:function(e,n,r){var i,o,s,a=Bu.comparePoints(e,n);if(a<0)i=e,o=n,s=1;else{if(!(a>0))throw new Error("Tried to create degenerate segment at [".concat(e.x,", ").concat(e.y,"]"));i=n,o=e,s=-1}return new t(new Bu(i,!0),new Bu(o,!1),[r],[s])}}]),t}(),Uu=function(){function t(e,n,r){if(bu(this,t),!Array.isArray(e)||0===e.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=n,this.isExterior=r,this.segments=[],"number"!=typeof e[0][0]||"number"!=typeof e[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");var i=Ru.round(e[0][0],e[0][1]);this.bbox={ll:{x:i.x,y:i.y},ur:{x:i.x,y:i.y}};for(var o=i,s=1,a=e.length;s<a;s++){if("number"!=typeof e[s][0]||"number"!=typeof e[s][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");var u=Ru.round(e[s][0],e[s][1]);u.x===o.x&&u.y===o.y||(this.segments.push(ju.fromRing(o,u,this)),u.x<this.bbox.ll.x&&(this.bbox.ll.x=u.x),u.y<this.bbox.ll.y&&(this.bbox.ll.y=u.y),u.x>this.bbox.ur.x&&(this.bbox.ur.x=u.x),u.y>this.bbox.ur.y&&(this.bbox.ur.y=u.y),o=u)}i.x===o.x&&i.y===o.y||this.segments.push(ju.fromRing(o,i,this))}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=[],e=0,n=this.segments.length;e<n;e++){var r=this.segments[e];t.push(r.leftSE),t.push(r.rightSE)}return t}}]),t}(),Vu=function(){function t(e,n){if(bu(this,t),!Array.isArray(e))throw new Error("Input geometry is not a valid Polygon or MultiPolygon");this.exteriorRing=new Uu(e[0],this,!0),this.bbox={ll:{x:this.exteriorRing.bbox.ll.x,y:this.exteriorRing.bbox.ll.y},ur:{x:this.exteriorRing.bbox.ur.x,y:this.exteriorRing.bbox.ur.y}},this.interiorRings=[];for(var r=1,i=e.length;r<i;r++){var o=new Uu(e[r],this,!1);o.bbox.ll.x<this.bbox.ll.x&&(this.bbox.ll.x=o.bbox.ll.x),o.bbox.ll.y<this.bbox.ll.y&&(this.bbox.ll.y=o.bbox.ll.y),o.bbox.ur.x>this.bbox.ur.x&&(this.bbox.ur.x=o.bbox.ur.x),o.bbox.ur.y>this.bbox.ur.y&&(this.bbox.ur.y=o.bbox.ur.y),this.interiorRings.push(o)}this.multiPoly=n}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=this.exteriorRing.getSweepEvents(),e=0,n=this.interiorRings.length;e<n;e++)for(var r=this.interiorRings[e].getSweepEvents(),i=0,o=r.length;i<o;i++)t.push(r[i]);return t}}]),t}(),Xu=function(){function t(e,n){if(bu(this,t),!Array.isArray(e))throw new Error("Input geometry is not a valid Polygon or MultiPolygon");try{"number"==typeof e[0][0][0]&&(e=[e])}catch(t){}this.polys=[],this.bbox={ll:{x:Number.POSITIVE_INFINITY,y:Number.POSITIVE_INFINITY},ur:{x:Number.NEGATIVE_INFINITY,y:Number.NEGATIVE_INFINITY}};for(var r=0,i=e.length;r<i;r++){var o=new Vu(e[r],this);o.bbox.ll.x<this.bbox.ll.x&&(this.bbox.ll.x=o.bbox.ll.x),o.bbox.ll.y<this.bbox.ll.y&&(this.bbox.ll.y=o.bbox.ll.y),o.bbox.ur.x>this.bbox.ur.x&&(this.bbox.ur.x=o.bbox.ur.x),o.bbox.ur.y>this.bbox.ur.y&&(this.bbox.ur.y=o.bbox.ur.y),this.polys.push(o)}this.isSubject=n}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=[],e=0,n=this.polys.length;e<n;e++)for(var r=this.polys[e].getSweepEvents(),i=0,o=r.length;i<o;i++)t.push(r[i]);return t}}]),t}(),Yu=function(){function t(e){bu(this,t),this.events=e;for(var n=0,r=e.length;n<r;n++)e[n].segment.ringOut=this;this.poly=null}return Iu(t,null,[{key:"factory",value:function(e){for(var n=[],r=0,i=e.length;r<i;r++){var o=e[r];if(o.isInResult()&&!o.ringOut){for(var s=null,a=o.leftSE,u=o.rightSE,l=[a],c=a.point,h=[];s=a,a=u,l.push(a),a.point!==c;)for(;;){var p=a.getAvailableLinkedEvents();if(0===p.length){var f=l[0].point,g=l[l.length-1].point;throw new Error("Unable to complete output ring starting at [".concat(f.x,",")+" ".concat(f.y,"]. Last matching segment found ends at")+" [".concat(g.x,", ").concat(g.y,"]."))}if(1===p.length){u=p[0].otherSE;break}for(var d=null,y=0,v=h.length;y<v;y++)if(h[y].point===a.point){d=y;break}if(null===d){h.push({index:l.length,point:a.point});var _=a.getLeftmostComparator(s);u=p.sort(_)[0].otherSE;break}var m=h.splice(d)[0],x=l.splice(m.index);x.unshift(x[0].otherSE),n.push(new t(x.reverse()))}n.push(new t(l))}}return n}}]),Iu(t,[{key:"getGeom",value:function(){for(var t=this.events[0].point,e=[t],n=1,r=this.events.length-1;n<r;n++){var i=this.events[n].point,o=this.events[n+1].point;0!==Du(i,t,o)&&(e.push(i),t=i)}if(1===e.length)return null;var s=e[0],a=e[1];0===Du(s,t,a)&&e.shift(),e.push(e[0]);for(var u=this.isExteriorRing()?1:-1,l=this.isExteriorRing()?0:e.length-1,c=this.isExteriorRing()?e.length:-1,h=[],p=l;p!=c;p+=u)h.push([e[p].x,e[p].y]);return h}},{key:"isExteriorRing",value:function(){if(void 0===this._isExteriorRing){var t=this.enclosingRing();this._isExteriorRing=!t||!t.isExteriorRing()}return this._isExteriorRing}},{key:"enclosingRing",value:function(){return void 0===this._enclosingRing&&(this._enclosingRing=this._calcEnclosingRing()),this._enclosingRing}},{key:"_calcEnclosingRing",value:function(){for(var t=this.events[0],e=1,n=this.events.length;e<n;e++){var r=this.events[e];Bu.compare(t,r)>0&&(t=r)}for(var i=t.segment.prevInResult(),o=i?i.prevInResult():null;;){if(!i)return null;if(!o)return i.ringOut;if(o.ringOut!==i.ringOut)return o.ringOut.enclosingRing()!==i.ringOut?i.ringOut:i.ringOut.enclosingRing();i=o.prevInResult(),o=i?i.prevInResult():null}}}]),t}(),Hu=function(){function t(e){bu(this,t),this.exteriorRing=e,e.poly=this,this.interiorRings=[]}return Iu(t,[{key:"addInterior",value:function(t){this.interiorRings.push(t),t.poly=this}},{key:"getGeom",value:function(){var t=[this.exteriorRing.getGeom()];if(null===t[0])return null;for(var e=0,n=this.interiorRings.length;e<n;e++){var r=this.interiorRings[e].getGeom();null!==r&&t.push(r)}return t}}]),t}(),Wu=function(){function t(e){bu(this,t),this.rings=e,this.polys=this._composePolys(e)}return Iu(t,[{key:"getGeom",value:function(){for(var t=[],e=0,n=this.polys.length;e<n;e++){var r=this.polys[e].getGeom();null!==r&&t.push(r)}return t}},{key:"_composePolys",value:function(t){for(var e=[],n=0,r=t.length;n<r;n++){var i=t[n];if(!i.poly)if(i.isExteriorRing())e.push(new Hu(i));else{var o=i.enclosingRing();o.poly||e.push(new Hu(o)),o.poly.addInterior(i)}}return e}}]),t}(),Ju=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ju.compare;bu(this,t),this.queue=e,this.tree=new _u(n),this.segments=[]}return Iu(t,[{key:"process",value:function(t){var e=t.segment,n=[];if(t.consumedBy)return t.isLeft?this.queue.remove(t.otherSE):this.tree.remove(e),n;var r=t.isLeft?this.tree.insert(e):this.tree.find(e);if(!r)throw new Error("Unable to find segment #".concat(e.id," ")+"[".concat(e.leftSE.point.x,", ").concat(e.leftSE.point.y,"] -> ")+"[".concat(e.rightSE.point.x,", ").concat(e.rightSE.point.y,"] ")+"in SweepLine tree. Please submit a bug report.");for(var i=r,o=r,s=void 0,a=void 0;void 0===s;)null===(i=this.tree.prev(i))?s=null:void 0===i.key.consumedBy&&(s=i.key);for(;void 0===a;)null===(o=this.tree.next(o))?a=null:void 0===o.key.consumedBy&&(a=o.key);if(t.isLeft){var u=null;if(s){var l=s.getIntersection(e);if(null!==l&&(e.isAnEndpoint(l)||(u=l),!s.isAnEndpoint(l)))for(var c=this._splitSafely(s,l),h=0,p=c.length;h<p;h++)n.push(c[h])}var f=null;if(a){var g=a.getIntersection(e);if(null!==g&&(e.isAnEndpoint(g)||(f=g),!a.isAnEndpoint(g)))for(var d=this._splitSafely(a,g),y=0,v=d.length;y<v;y++)n.push(d[y])}if(null!==u||null!==f){var _=null;if(null===u)_=f;else if(null===f)_=u;else{_=Bu.comparePoints(u,f)<=0?u:f}this.queue.remove(e.rightSE),n.push(e.rightSE);for(var m=e.split(_),x=0,E=m.length;x<E;x++)n.push(m[x])}n.length>0?(this.tree.remove(e),n.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&a){var b=s.getIntersection(a);if(null!==b){if(!s.isAnEndpoint(b))for(var w=this._splitSafely(s,b),I=0,N=w.length;I<N;I++)n.push(w[I]);if(!a.isAnEndpoint(b))for(var S=this._splitSafely(a,b),C=0,P=S.length;C<P;C++)n.push(S[C])}}this.tree.remove(e)}return n}},{key:"_splitSafely",value:function(t,e){this.tree.remove(t);var n=t.rightSE;this.queue.remove(n);var r=t.split(e);return r.push(n),void 0===t.consumedBy&&this.tree.insert(t),r}}]),t}(),Zu="undefined"!=typeof process&&process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE||1e6,Ku="undefined"!=typeof process&&process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS||1e6,Qu=new(function(){function t(){bu(this,t)}return Iu(t,[{key:"run",value:function(t,e,n){Qu.type=t,Ru.reset();for(var r=[new Xu(e,!0)],i=0,o=n.length;i<o;i++)r.push(new Xu(n[i],!1));if(Qu.numMultiPolys=r.length,"difference"===Qu.type)for(var s=r[0],a=1;a<r.length;)null!==Su(r[a].bbox,s.bbox)?a++:r.splice(a,1);if("intersection"===Qu.type)for(var u=0,l=r.length;u<l;u++)for(var c=r[u],h=u+1,p=r.length;h<p;h++)if(null===Su(c.bbox,r[h].bbox))return[];for(var f=new _u(Bu.compare),g=0,d=r.length;g<d;g++)for(var y=r[g].getSweepEvents(),v=0,_=y.length;v<_;v++)if(f.insert(y[v]),f.size>Zu)throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");for(var m=new Ju(f),x=f.size,E=f.pop();E;){var b=E.key;if(f.size===x){var w=b.segment;throw new Error("Unable to pop() ".concat(b.isLeft?"left":"right"," SweepEvent ")+"[".concat(b.point.x,", ").concat(b.point.y,"] from segment #").concat(w.id," ")+"[".concat(w.leftSE.point.x,", ").concat(w.leftSE.point.y,"] -> ")+"[".concat(w.rightSE.point.x,", ").concat(w.rightSE.point.y,"] from queue. ")+"Please file a bug report.")}if(f.size>Zu)throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");if(m.segments.length>Ku)throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");for(var I=m.process(b),N=0,S=I.length;N<S;N++){var C=I[N];void 0===C.consumedBy&&f.insert(C)}x=f.size,E=f.pop()}Ru.reset();var P=Yu.factory(m.segments);return new Wu(P).getGeom()}}]),t}()),$u={union:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];return Qu.run("union",t,n)},intersection:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];return Qu.run("intersection",t,n)},xor:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];return Qu.run("xor",t,n)},difference:function(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];return Qu.run("difference",t,n)}};"fill"in Array.prototype||Object.defineProperty(Array.prototype,"fill",{configurable:!0,value:function(t){if(null==this)throw new TypeError(this+" is not an object");var e=Object(this),n=Math.max(Math.min(e.length,9007199254740991),0)||0,r=1 in arguments&&parseInt(Number(arguments[1]),10)||0;r=r<0?Math.max(n+r,0):Math.min(r,n);var i=2 in arguments&&void 0!==arguments[2]?parseInt(Number(arguments[2]),10)||0:n;for(i=i<0?Math.max(n+arguments[2],0):Math.min(i,n);r<i;)e[r]=t,++r;return e},writable:!0}),Number.isFinite=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},Number.isInteger=Number.isInteger||function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t},Number.parseFloat=Number.parseFloat||parseFloat,Number.isNaN=Number.isNaN||function(t){return t!=t},Math.trunc=Math.trunc||function(t){return t<0?Math.ceil(t):Math.floor(t)};var tl=function(){};tl.prototype.interfaces_=function(){return[]},tl.prototype.getClass=function(){return tl},tl.prototype.equalsWithTolerance=function(t,e,n){return Math.abs(t-e)<=n};var el=function(t){function e(e){t.call(this,e),this.name="IllegalArgumentException",this.message=e,this.stack=(new t).stack}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Error),nl=function(){},rl={MAX_VALUE:{configurable:!0}};nl.isNaN=function(t){return Number.isNaN(t)},nl.doubleToLongBits=function(t){return t},nl.longBitsToDouble=function(t){return t},nl.isInfinite=function(t){return!Number.isFinite(t)},rl.MAX_VALUE.get=function(){return Number.MAX_VALUE},Object.defineProperties(nl,rl);var il=function(){},ol=function(){},sl=function(){};function al(){}var ul=function t(){if(this.x=null,this.y=null,this.z=null,0===arguments.length)this.x=0,this.y=0,this.z=t.NULL_ORDINATE;else if(1===arguments.length){var e=arguments[0];this.x=e.x,this.y=e.y,this.z=e.z}else 2===arguments.length?(this.x=arguments[0],this.y=arguments[1],this.z=t.NULL_ORDINATE):3===arguments.length&&(this.x=arguments[0],this.y=arguments[1],this.z=arguments[2])},ll={DimensionalComparator:{configurable:!0},serialVersionUID:{configurable:!0},NULL_ORDINATE:{configurable:!0},X:{configurable:!0},Y:{configurable:!0},Z:{configurable:!0}};ul.prototype.setOrdinate=function(t,e){switch(t){case ul.X:this.x=e;break;case ul.Y:this.y=e;break;case ul.Z:this.z=e;break;default:throw new el("Invalid ordinate index: "+t)}},ul.prototype.equals2D=function(){if(1===arguments.length){var t=arguments[0];return this.x===t.x&&this.y===t.y}if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!tl.equalsWithTolerance(this.x,e.x,n)&&!!tl.equalsWithTolerance(this.y,e.y,n)}},ul.prototype.getOrdinate=function(t){switch(t){case ul.X:return this.x;case ul.Y:return this.y;case ul.Z:return this.z}throw new el("Invalid ordinate index: "+t)},ul.prototype.equals3D=function(t){return this.x===t.x&&this.y===t.y&&(this.z===t.z||nl.isNaN(this.z))&&nl.isNaN(t.z)},ul.prototype.equals=function(t){return t instanceof ul&&this.equals2D(t)},ul.prototype.equalInZ=function(t,e){return tl.equalsWithTolerance(this.z,t.z,e)},ul.prototype.compareTo=function(t){var e=t;return this.x<e.x?-1:this.x>e.x?1:this.y<e.y?-1:this.y>e.y?1:0},ul.prototype.clone=function(){},ul.prototype.copy=function(){return new ul(this)},ul.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+")"},ul.prototype.distance3D=function(t){var e=this.x-t.x,n=this.y-t.y,r=this.z-t.z;return Math.sqrt(e*e+n*n+r*r)},ul.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},ul.prototype.hashCode=function(){var t=17;return t=37*(t=37*t+ul.hashCode(this.x))+ul.hashCode(this.y)},ul.prototype.setCoordinate=function(t){this.x=t.x,this.y=t.y,this.z=t.z},ul.prototype.interfaces_=function(){return[il,ol,al]},ul.prototype.getClass=function(){return ul},ul.hashCode=function(){if(1===arguments.length){var t=arguments[0],e=nl.doubleToLongBits(t);return Math.trunc((e^e)>>>32)}},ll.DimensionalComparator.get=function(){return cl},ll.serialVersionUID.get=function(){return 0x5cbf2c235c7e5800},ll.NULL_ORDINATE.get=function(){return nl.NaN},ll.X.get=function(){return 0},ll.Y.get=function(){return 1},ll.Z.get=function(){return 2},Object.defineProperties(ul,ll);var cl=function(t){if(this._dimensionsToTest=2,0===arguments.length);else if(1===arguments.length){var e=arguments[0];if(2!==e&&3!==e)throw new el("only 2 or 3 dimensions may be specified");this._dimensionsToTest=e}};cl.prototype.compare=function(t,e){var n=t,r=e,i=cl.compare(n.x,r.x);if(0!==i)return i;var o=cl.compare(n.y,r.y);return 0!==o?o:this._dimensionsToTest<=2?0:cl.compare(n.z,r.z)},cl.prototype.interfaces_=function(){return[sl]},cl.prototype.getClass=function(){return cl},cl.compare=function(t,e){return t<e?-1:t>e?1:nl.isNaN(t)?nl.isNaN(e)?0:-1:nl.isNaN(e)?1:0};var hl=function(){};hl.prototype.create=function(){},hl.prototype.interfaces_=function(){return[]},hl.prototype.getClass=function(){return hl};var pl=function(){},fl={INTERIOR:{configurable:!0},BOUNDARY:{configurable:!0},EXTERIOR:{configurable:!0},NONE:{configurable:!0}};pl.prototype.interfaces_=function(){return[]},pl.prototype.getClass=function(){return pl},pl.toLocationSymbol=function(t){switch(t){case pl.EXTERIOR:return"e";case pl.BOUNDARY:return"b";case pl.INTERIOR:return"i";case pl.NONE:return"-"}throw new el("Unknown location value: "+t)},fl.INTERIOR.get=function(){return 0},fl.BOUNDARY.get=function(){return 1},fl.EXTERIOR.get=function(){return 2},fl.NONE.get=function(){return-1},Object.defineProperties(pl,fl);var gl=function(t,e){return t.interfaces_&&t.interfaces_().indexOf(e)>-1},dl=function(){},yl={LOG_10:{configurable:!0}};dl.prototype.interfaces_=function(){return[]},dl.prototype.getClass=function(){return dl},dl.log10=function(t){var e=Math.log(t);return nl.isInfinite(e)||nl.isNaN(e)?e:e/dl.LOG_10},dl.min=function(t,e,n,r){var i=t;return e<i&&(i=e),n<i&&(i=n),r<i&&(i=r),i},dl.clamp=function(){if("number"==typeof arguments[2]&&"number"==typeof arguments[0]&&"number"==typeof arguments[1]){var t=arguments[0],e=arguments[1],n=arguments[2];return t<e?e:t>n?n:t}if(Number.isInteger(arguments[2])&&Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){var r=arguments[0],i=arguments[1],o=arguments[2];return r<i?i:r>o?o:r}},dl.wrap=function(t,e){return t<0?e- -t%e:t%e},dl.max=function(){if(3===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2],r=t;return e>r&&(r=e),n>r&&(r=n),r}if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3],u=i;return o>u&&(u=o),s>u&&(u=s),a>u&&(u=a),u}},dl.average=function(t,e){return(t+e)/2},yl.LOG_10.get=function(){return Math.log(10)},Object.defineProperties(dl,yl);var vl=function(t){this.str=t};vl.prototype.append=function(t){this.str+=t},vl.prototype.setCharAt=function(t,e){this.str=this.str.substr(0,t)+e+this.str.substr(t+1)},vl.prototype.toString=function(t){return this.str};var _l=function(t){this.value=t};_l.prototype.intValue=function(){return this.value},_l.prototype.compareTo=function(t){return this.value<t?-1:this.value>t?1:0},_l.isNaN=function(t){return Number.isNaN(t)};var ml=function(){};ml.isWhitespace=function(t){return t<=32&&t>=0||127===t},ml.toUpperCase=function(t){return t.toUpperCase()};var xl=function t(){if(this._hi=0,this._lo=0,0===arguments.length)this.init(0);else if(1===arguments.length){if("number"==typeof arguments[0]){var e=arguments[0];this.init(e)}else if(arguments[0]instanceof t){var n=arguments[0];this.init(n)}else if("string"==typeof arguments[0]){var r=arguments[0];t.call(this,t.parse(r))}}else if(2===arguments.length){var i=arguments[0],o=arguments[1];this.init(i,o)}},El={PI:{configurable:!0},TWO_PI:{configurable:!0},PI_2:{configurable:!0},E:{configurable:!0},NaN:{configurable:!0},EPS:{configurable:!0},SPLIT:{configurable:!0},MAX_PRINT_DIGITS:{configurable:!0},TEN:{configurable:!0},ONE:{configurable:!0},SCI_NOT_EXPONENT_CHAR:{configurable:!0},SCI_NOT_ZERO:{configurable:!0}};xl.prototype.le=function(t){return(this._hi<t._hi||this._hi===t._hi)&&this._lo<=t._lo},xl.prototype.extractSignificantDigits=function(t,e){var n=this.abs(),r=xl.magnitude(n._hi),i=xl.TEN.pow(r);(n=n.divide(i)).gt(xl.TEN)?(n=n.divide(xl.TEN),r+=1):n.lt(xl.ONE)&&(n=n.multiply(xl.TEN),r-=1);for(var o=r+1,s=new vl,a=xl.MAX_PRINT_DIGITS-1,u=0;u<=a;u++){t&&u===o&&s.append(".");var l=Math.trunc(n._hi);if(l<0)break;var c=!1,h=0;l>9?(c=!0,h="9"):h="0"+l,s.append(h),n=n.subtract(xl.valueOf(l)).multiply(xl.TEN),c&&n.selfAdd(xl.TEN);var p=!0,f=xl.magnitude(n._hi);if(f<0&&Math.abs(f)>=a-u&&(p=!1),!p)break}return e[0]=r,s.toString()},xl.prototype.sqr=function(){return this.multiply(this)},xl.prototype.doubleValue=function(){return this._hi+this._lo},xl.prototype.subtract=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.add(t.negate())}if("number"==typeof arguments[0]){var e=arguments[0];return this.add(-e)}},xl.prototype.equals=function(){if(1===arguments.length){var t=arguments[0];return this._hi===t._hi&&this._lo===t._lo}},xl.prototype.isZero=function(){return 0===this._hi&&0===this._lo},xl.prototype.selfSubtract=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.isNaN()?this:this.selfAdd(-t._hi,-t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.isNaN()?this:this.selfAdd(-e,0)}},xl.prototype.getSpecialNumberString=function(){return this.isZero()?"0.0":this.isNaN()?"NaN ":null},xl.prototype.min=function(t){return this.le(t)?this:t},xl.prototype.selfDivide=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfDivide(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.selfDivide(e,0)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=null,o=null,s=null,a=null,u=null,l=null,c=null,h=null;return u=this._hi/n,h=(i=(l=xl.SPLIT*u)-(i=l-u))*(s=(h=xl.SPLIT*n)-(s=h-n))-(c=u*n)+i*(a=n-s)+(o=u-i)*s+o*a,h=u+(l=(this._hi-c-h+this._lo-u*r)/n),this._hi=h,this._lo=u-h+l,this}},xl.prototype.dump=function(){return"DD<"+this._hi+", "+this._lo+">"},xl.prototype.divide=function(){if(arguments[0]instanceof xl){var t=arguments[0],e=null,n=null,r=null,i=null,o=null,s=null,a=null,u=null;n=(o=this._hi/t._hi)-(e=(s=xl.SPLIT*o)-(e=s-o)),u=e*(r=(u=xl.SPLIT*t._hi)-(r=u-t._hi))-(a=o*t._hi)+e*(i=t._hi-r)+n*r+n*i;var l=u=o+(s=(this._hi-a-u+this._lo-o*t._lo)/t._hi),c=o-u+s;return new xl(l,c)}if("number"==typeof arguments[0]){var h=arguments[0];return nl.isNaN(h)?xl.createNaN():xl.copy(this).selfDivide(h,0)}},xl.prototype.ge=function(t){return(this._hi>t._hi||this._hi===t._hi)&&this._lo>=t._lo},xl.prototype.pow=function(t){if(0===t)return xl.valueOf(1);var e=new xl(this),n=xl.valueOf(1),r=Math.abs(t);if(r>1)for(;r>0;)r%2==1&&n.selfMultiply(e),(r/=2)>0&&(e=e.sqr());else n=e;return t<0?n.reciprocal():n},xl.prototype.ceil=function(){if(this.isNaN())return xl.NaN;var t=Math.ceil(this._hi),e=0;return t===this._hi&&(e=Math.ceil(this._lo)),new xl(t,e)},xl.prototype.compareTo=function(t){var e=t;return this._hi<e._hi?-1:this._hi>e._hi?1:this._lo<e._lo?-1:this._lo>e._lo?1:0},xl.prototype.rint=function(){return this.isNaN()?this:this.add(.5).floor()},xl.prototype.setValue=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.init(t),this}if("number"==typeof arguments[0]){var e=arguments[0];return this.init(e),this}},xl.prototype.max=function(t){return this.ge(t)?this:t},xl.prototype.sqrt=function(){if(this.isZero())return xl.valueOf(0);if(this.isNegative())return xl.NaN;var t=1/Math.sqrt(this._hi),e=this._hi*t,n=xl.valueOf(e),r=this.subtract(n.sqr())._hi*(.5*t);return n.add(r)},xl.prototype.selfAdd=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfAdd(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0],n=null,r=null,i=null,o=null,s=null,a=null;return o=(i=this._hi+e)-(s=i-this._hi),r=(a=(o=e-s+(this._hi-o))+this._lo)+(i-(n=i+a)),this._hi=n+r,this._lo=r+(n-this._hi),this}}else if(2===arguments.length){var u=arguments[0],l=arguments[1],c=null,h=null,p=null,f=null,g=null,d=null,y=null;f=this._hi+u,h=this._lo+l,g=f-(d=f-this._hi),p=h-(y=h-this._lo);var v=(c=f+(d=(g=u-d+(this._hi-g))+h))+(d=(p=l-y+(this._lo-p))+(d+(f-c))),_=d+(c-v);return this._hi=v,this._lo=_,this}},xl.prototype.selfMultiply=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfMultiply(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.selfMultiply(e,0)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=null,o=null,s=null,a=null,u=null,l=null;i=(u=xl.SPLIT*this._hi)-this._hi,l=xl.SPLIT*n,i=u-i,o=this._hi-i,s=l-n;var c=(u=this._hi*n)+(l=i*(s=l-s)-u+i*(a=n-s)+o*s+o*a+(this._hi*r+this._lo*n)),h=l+(i=u-c);return this._hi=c,this._lo=h,this}},xl.prototype.selfSqr=function(){return this.selfMultiply(this)},xl.prototype.floor=function(){if(this.isNaN())return xl.NaN;var t=Math.floor(this._hi),e=0;return t===this._hi&&(e=Math.floor(this._lo)),new xl(t,e)},xl.prototype.negate=function(){return this.isNaN()?this:new xl(-this._hi,-this._lo)},xl.prototype.clone=function(){},xl.prototype.multiply=function(){if(arguments[0]instanceof xl){var t=arguments[0];return t.isNaN()?xl.createNaN():xl.copy(this).selfMultiply(t)}if("number"==typeof arguments[0]){var e=arguments[0];return nl.isNaN(e)?xl.createNaN():xl.copy(this).selfMultiply(e,0)}},xl.prototype.isNaN=function(){return nl.isNaN(this._hi)},xl.prototype.intValue=function(){return Math.trunc(this._hi)},xl.prototype.toString=function(){var t=xl.magnitude(this._hi);return t>=-3&&t<=20?this.toStandardNotation():this.toSciNotation()},xl.prototype.toStandardNotation=function(){var t=this.getSpecialNumberString();if(null!==t)return t;var e=new Array(1).fill(null),n=this.extractSignificantDigits(!0,e),r=e[0]+1,i=n;if("."===n.charAt(0))i="0"+n;else if(r<0)i="0."+xl.stringOfChar("0",-r)+n;else if(-1===n.indexOf(".")){var o=r-n.length;i=n+xl.stringOfChar("0",o)+".0"}return this.isNegative()?"-"+i:i},xl.prototype.reciprocal=function(){var t,e,n,r,i=null,o=null,s=null,a=null;t=(n=1/this._hi)-(i=(s=xl.SPLIT*n)-(i=s-n)),o=(a=xl.SPLIT*this._hi)-this._hi;var u=n+(s=(1-(r=n*this._hi)-(a=i*(o=a-o)-r+i*(e=this._hi-o)+t*o+t*e)-n*this._lo)/this._hi);return new xl(u,n-u+s)},xl.prototype.toSciNotation=function(){if(this.isZero())return xl.SCI_NOT_ZERO;var t=this.getSpecialNumberString();if(null!==t)return t;var e=new Array(1).fill(null),n=this.extractSignificantDigits(!1,e),r=xl.SCI_NOT_EXPONENT_CHAR+e[0];if("0"===n.charAt(0))throw new Error("Found leading zero: "+n);var i="";n.length>1&&(i=n.substring(1));var o=n.charAt(0)+"."+i;return this.isNegative()?"-"+o+r:o+r},xl.prototype.abs=function(){return this.isNaN()?xl.NaN:this.isNegative()?this.negate():new xl(this)},xl.prototype.isPositive=function(){return(this._hi>0||0===this._hi)&&this._lo>0},xl.prototype.lt=function(t){return(this._hi<t._hi||this._hi===t._hi)&&this._lo<t._lo},xl.prototype.add=function(){if(arguments[0]instanceof xl){var t=arguments[0];return xl.copy(this).selfAdd(t)}if("number"==typeof arguments[0]){var e=arguments[0];return xl.copy(this).selfAdd(e)}},xl.prototype.init=function(){if(1===arguments.length){if("number"==typeof arguments[0]){var t=arguments[0];this._hi=t,this._lo=0}else if(arguments[0]instanceof xl){var e=arguments[0];this._hi=e._hi,this._lo=e._lo}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this._hi=n,this._lo=r}},xl.prototype.gt=function(t){return(this._hi>t._hi||this._hi===t._hi)&&this._lo>t._lo},xl.prototype.isNegative=function(){return(this._hi<0||0===this._hi)&&this._lo<0},xl.prototype.trunc=function(){return this.isNaN()?xl.NaN:this.isPositive()?this.floor():this.ceil()},xl.prototype.signum=function(){return this._hi>0?1:this._hi<0?-1:this._lo>0?1:this._lo<0?-1:0},xl.prototype.interfaces_=function(){return[al,il,ol]},xl.prototype.getClass=function(){return xl},xl.sqr=function(t){return xl.valueOf(t).selfMultiply(t)},xl.valueOf=function(){if("string"==typeof arguments[0]){var t=arguments[0];return xl.parse(t)}if("number"==typeof arguments[0]){var e=arguments[0];return new xl(e)}},xl.sqrt=function(t){return xl.valueOf(t).sqrt()},xl.parse=function(t){for(var e=0,n=t.length;ml.isWhitespace(t.charAt(e));)e++;var r=!1;if(e<n){var i=t.charAt(e);"-"!==i&&"+"!==i||(e++,"-"===i&&(r=!0))}for(var o=new xl,s=0,a=0,u=0;!(e>=n);){var l=t.charAt(e);if(e++,ml.isDigit(l)){var c=l-"0";o.selfMultiply(xl.TEN),o.selfAdd(c),s++}else{if("."!==l){if("e"===l||"E"===l){var h=t.substring(e);try{u=_l.parseInt(h)}catch(e){throw e instanceof Error?new Error("Invalid exponent "+h+" in string "+t):e}break}throw new Error("Unexpected character '"+l+"' at position "+e+" in string "+t)}a=s}}var p=o,f=s-a-u;if(0===f)p=o;else if(f>0){var g=xl.TEN.pow(f);p=o.divide(g)}else if(f<0){var d=xl.TEN.pow(-f);p=o.multiply(d)}return r?p.negate():p},xl.createNaN=function(){return new xl(nl.NaN,nl.NaN)},xl.copy=function(t){return new xl(t)},xl.magnitude=function(t){var e=Math.abs(t),n=Math.log(e)/Math.log(10),r=Math.trunc(Math.floor(n));return 10*Math.pow(10,r)<=e&&(r+=1),r},xl.stringOfChar=function(t,e){for(var n=new vl,r=0;r<e;r++)n.append(t);return n.toString()},El.PI.get=function(){return new xl(3.141592653589793,12246467991473532e-32)},El.TWO_PI.get=function(){return new xl(6.283185307179586,24492935982947064e-32)},El.PI_2.get=function(){return new xl(1.5707963267948966,6123233995736766e-32)},El.E.get=function(){return new xl(2.718281828459045,14456468917292502e-32)},El.NaN.get=function(){return new xl(nl.NaN,nl.NaN)},El.EPS.get=function(){return 123259516440783e-46},El.SPLIT.get=function(){return 134217729},El.MAX_PRINT_DIGITS.get=function(){return 32},El.TEN.get=function(){return xl.valueOf(10)},El.ONE.get=function(){return xl.valueOf(1)},El.SCI_NOT_EXPONENT_CHAR.get=function(){return"E"},El.SCI_NOT_ZERO.get=function(){return"0.0E0"},Object.defineProperties(xl,El);var bl=function(){},wl={DP_SAFE_EPSILON:{configurable:!0}};bl.prototype.interfaces_=function(){return[]},bl.prototype.getClass=function(){return bl},bl.orientationIndex=function(t,e,n){var r=bl.orientationIndexFilter(t,e,n);if(r<=1)return r;var i=xl.valueOf(e.x).selfAdd(-t.x),o=xl.valueOf(e.y).selfAdd(-t.y),s=xl.valueOf(n.x).selfAdd(-e.x),a=xl.valueOf(n.y).selfAdd(-e.y);return i.selfMultiply(a).selfSubtract(o.selfMultiply(s)).signum()},bl.signOfDet2x2=function(t,e,n,r){return t.multiply(r).selfSubtract(e.multiply(n)).signum()},bl.intersection=function(t,e,n,r){var i=xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(xl.valueOf(e.x).selfSubtract(t.x)),o=xl.valueOf(r.x).selfSubtract(n.x).selfMultiply(xl.valueOf(e.y).selfSubtract(t.y)),s=i.subtract(o),a=xl.valueOf(r.x).selfSubtract(n.x).selfMultiply(xl.valueOf(t.y).selfSubtract(n.y)),u=xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(xl.valueOf(t.x).selfSubtract(n.x)),l=a.subtract(u).selfDivide(s).doubleValue(),c=xl.valueOf(t.x).selfAdd(xl.valueOf(e.x).selfSubtract(t.x).selfMultiply(l)).doubleValue(),h=xl.valueOf(e.x).selfSubtract(t.x).selfMultiply(xl.valueOf(t.y).selfSubtract(n.y)),p=xl.valueOf(e.y).selfSubtract(t.y).selfMultiply(xl.valueOf(t.x).selfSubtract(n.x)),f=h.subtract(p).selfDivide(s).doubleValue(),g=xl.valueOf(n.y).selfAdd(xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(f)).doubleValue();return new ul(c,g)},bl.orientationIndexFilter=function(t,e,n){var r=null,i=(t.x-n.x)*(e.y-n.y),o=(t.y-n.y)*(e.x-n.x),s=i-o;if(i>0){if(o<=0)return bl.signum(s);r=i+o}else{if(!(i<0))return bl.signum(s);if(o>=0)return bl.signum(s);r=-i-o}var a=bl.DP_SAFE_EPSILON*r;return s>=a||-s>=a?bl.signum(s):2},bl.signum=function(t){return t>0?1:t<0?-1:0},wl.DP_SAFE_EPSILON.get=function(){return 1e-15},Object.defineProperties(bl,wl);var Il=function(){},Nl={X:{configurable:!0},Y:{configurable:!0},Z:{configurable:!0},M:{configurable:!0}};Nl.X.get=function(){return 0},Nl.Y.get=function(){return 1},Nl.Z.get=function(){return 2},Nl.M.get=function(){return 3},Il.prototype.setOrdinate=function(t,e,n){},Il.prototype.size=function(){},Il.prototype.getOrdinate=function(t,e){},Il.prototype.getCoordinate=function(){},Il.prototype.getCoordinateCopy=function(t){},Il.prototype.getDimension=function(){},Il.prototype.getX=function(t){},Il.prototype.clone=function(){},Il.prototype.expandEnvelope=function(t){},Il.prototype.copy=function(){},Il.prototype.getY=function(t){},Il.prototype.toCoordinateArray=function(){},Il.prototype.interfaces_=function(){return[ol]},Il.prototype.getClass=function(){return Il},Object.defineProperties(Il,Nl);var Sl=function(){},Cl=function(t){function e(){t.call(this,"Projective point not representable on the Cartesian plane.")}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Sl),Pl=function(){};Pl.arraycopy=function(t,e,n,r,i){for(var o=0,s=e;s<e+i;s++)n[r+o]=t[s],o++},Pl.getProperty=function(t){return{"line.separator":"\n"}[t]};var Ml=function t(){if(this.x=null,this.y=null,this.w=null,0===arguments.length)this.x=0,this.y=0,this.w=1;else if(1===arguments.length){var e=arguments[0];this.x=e.x,this.y=e.y,this.w=1}else if(2===arguments.length){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){var n=arguments[0],r=arguments[1];this.x=n,this.y=r,this.w=1}else if(arguments[0]instanceof t&&arguments[1]instanceof t){var i=arguments[0],o=arguments[1];this.x=i.y*o.w-o.y*i.w,this.y=o.x*i.w-i.x*o.w,this.w=i.x*o.y-o.x*i.y}else if(arguments[0]instanceof ul&&arguments[1]instanceof ul){var s=arguments[0],a=arguments[1];this.x=s.y-a.y,this.y=a.x-s.x,this.w=s.x*a.y-a.x*s.y}}else if(3===arguments.length){var u=arguments[0],l=arguments[1],c=arguments[2];this.x=u,this.y=l,this.w=c}else if(4===arguments.length){var h=arguments[0],p=arguments[1],f=arguments[2],g=arguments[3],d=h.y-p.y,y=p.x-h.x,v=h.x*p.y-p.x*h.y,_=f.y-g.y,m=g.x-f.x,x=f.x*g.y-g.x*f.y;this.x=y*x-m*v,this.y=_*v-d*x,this.w=d*m-_*y}};Ml.prototype.getY=function(){var t=this.y/this.w;if(nl.isNaN(t)||nl.isInfinite(t))throw new Cl;return t},Ml.prototype.getX=function(){var t=this.x/this.w;if(nl.isNaN(t)||nl.isInfinite(t))throw new Cl;return t},Ml.prototype.getCoordinate=function(){var t=new ul;return t.x=this.getX(),t.y=this.getY(),t},Ml.prototype.interfaces_=function(){return[]},Ml.prototype.getClass=function(){return Ml},Ml.intersection=function(t,e,n,r){var i=t.y-e.y,o=e.x-t.x,s=t.x*e.y-e.x*t.y,a=n.y-r.y,u=r.x-n.x,l=n.x*r.y-r.x*n.y,c=i*u-a*o,h=(o*l-u*s)/c,p=(a*s-i*l)/c;if(nl.isNaN(h)||nl.isInfinite(h)||nl.isNaN(p)||nl.isInfinite(p))throw new Cl;return new ul(h,p)};var Ll=function t(){if(this._minx=null,this._maxx=null,this._miny=null,this._maxy=null,0===arguments.length)this.init();else if(1===arguments.length){if(arguments[0]instanceof ul){var e=arguments[0];this.init(e.x,e.x,e.y,e.y)}else if(arguments[0]instanceof t){var n=arguments[0];this.init(n)}}else if(2===arguments.length){var r=arguments[0],i=arguments[1];this.init(r.x,i.x,r.y,i.y)}else if(4===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2],u=arguments[3];this.init(o,s,a,u)}},Ol={serialVersionUID:{configurable:!0}};Ll.prototype.getArea=function(){return this.getWidth()*this.getHeight()},Ll.prototype.equals=function(t){if(!(t instanceof Ll))return!1;var e=t;return this.isNull()?e.isNull():this._maxx===e.getMaxX()&&this._maxy===e.getMaxY()&&this._minx===e.getMinX()&&this._miny===e.getMinY()},Ll.prototype.intersection=function(t){if(this.isNull()||t.isNull()||!this.intersects(t))return new Ll;var e=this._minx>t._minx?this._minx:t._minx,n=this._miny>t._miny?this._miny:t._miny,r=this._maxx<t._maxx?this._maxx:t._maxx,i=this._maxy<t._maxy?this._maxy:t._maxy;return new Ll(e,r,n,i)},Ll.prototype.isNull=function(){return this._maxx<this._minx},Ll.prototype.getMaxX=function(){return this._maxx},Ll.prototype.covers=function(){if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];return this.covers(t.x,t.y)}if(arguments[0]instanceof Ll){var e=arguments[0];return!this.isNull()&&!e.isNull()&&(e.getMinX()>=this._minx&&e.getMaxX()<=this._maxx&&e.getMinY()>=this._miny&&e.getMaxY()<=this._maxy)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return!this.isNull()&&(n>=this._minx&&n<=this._maxx&&r>=this._miny&&r<=this._maxy)}},Ll.prototype.intersects=function(){if(1===arguments.length){if(arguments[0]instanceof Ll){var t=arguments[0];return!this.isNull()&&!t.isNull()&&!(t._minx>this._maxx||t._maxx<this._minx||t._miny>this._maxy||t._maxy<this._miny)}if(arguments[0]instanceof ul){var e=arguments[0];return this.intersects(e.x,e.y)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return!this.isNull()&&!(n>this._maxx||n<this._minx||r>this._maxy||r<this._miny)}},Ll.prototype.getMinY=function(){return this._miny},Ll.prototype.getMinX=function(){return this._minx},Ll.prototype.expandToInclude=function(){if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];this.expandToInclude(t.x,t.y)}else if(arguments[0]instanceof Ll){var e=arguments[0];if(e.isNull())return null;this.isNull()?(this._minx=e.getMinX(),this._maxx=e.getMaxX(),this._miny=e.getMinY(),this._maxy=e.getMaxY()):(e._minx<this._minx&&(this._minx=e._minx),e._maxx>this._maxx&&(this._maxx=e._maxx),e._miny<this._miny&&(this._miny=e._miny),e._maxy>this._maxy&&(this._maxy=e._maxy))}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.isNull()?(this._minx=n,this._maxx=n,this._miny=r,this._maxy=r):(n<this._minx&&(this._minx=n),n>this._maxx&&(this._maxx=n),r<this._miny&&(this._miny=r),r>this._maxy&&(this._maxy=r))}},Ll.prototype.minExtent=function(){if(this.isNull())return 0;var t=this.getWidth(),e=this.getHeight();return t<e?t:e},Ll.prototype.getWidth=function(){return this.isNull()?0:this._maxx-this._minx},Ll.prototype.compareTo=function(t){var e=t;return this.isNull()?e.isNull()?0:-1:e.isNull()?1:this._minx<e._minx?-1:this._minx>e._minx?1:this._miny<e._miny?-1:this._miny>e._miny?1:this._maxx<e._maxx?-1:this._maxx>e._maxx?1:this._maxy<e._maxy?-1:this._maxy>e._maxy?1:0},Ll.prototype.translate=function(t,e){if(this.isNull())return null;this.init(this.getMinX()+t,this.getMaxX()+t,this.getMinY()+e,this.getMaxY()+e)},Ll.prototype.toString=function(){return"Env["+this._minx+" : "+this._maxx+", "+this._miny+" : "+this._maxy+"]"},Ll.prototype.setToNull=function(){this._minx=0,this._maxx=-1,this._miny=0,this._maxy=-1},Ll.prototype.getHeight=function(){return this.isNull()?0:this._maxy-this._miny},Ll.prototype.maxExtent=function(){if(this.isNull())return 0;var t=this.getWidth(),e=this.getHeight();return t>e?t:e},Ll.prototype.expandBy=function(){if(1===arguments.length){var t=arguments[0];this.expandBy(t,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this.isNull())return null;this._minx-=e,this._maxx+=e,this._miny-=n,this._maxy+=n,(this._minx>this._maxx||this._miny>this._maxy)&&this.setToNull()}},Ll.prototype.contains=function(){if(1===arguments.length){if(arguments[0]instanceof Ll){var t=arguments[0];return this.covers(t)}if(arguments[0]instanceof ul){var e=arguments[0];return this.covers(e)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return this.covers(n,r)}},Ll.prototype.centre=function(){return this.isNull()?null:new ul((this.getMinX()+this.getMaxX())/2,(this.getMinY()+this.getMaxY())/2)},Ll.prototype.init=function(){if(0===arguments.length)this.setToNull();else if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];this.init(t.x,t.x,t.y,t.y)}else if(arguments[0]instanceof Ll){var e=arguments[0];this._minx=e._minx,this._maxx=e._maxx,this._miny=e._miny,this._maxy=e._maxy}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.init(n.x,r.x,n.y,r.y)}else if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3];i<o?(this._minx=i,this._maxx=o):(this._minx=o,this._maxx=i),s<a?(this._miny=s,this._maxy=a):(this._miny=a,this._maxy=s)}},Ll.prototype.getMaxY=function(){return this._maxy},Ll.prototype.distance=function(t){if(this.intersects(t))return 0;var e=0;this._maxx<t._minx?e=t._minx-this._maxx:this._minx>t._maxx&&(e=this._minx-t._maxx);var n=0;return this._maxy<t._miny?n=t._miny-this._maxy:this._miny>t._maxy&&(n=this._miny-t._maxy),0===e?n:0===n?e:Math.sqrt(e*e+n*n)},Ll.prototype.hashCode=function(){var t=17;return t=37*(t=37*(t=37*(t=37*t+ul.hashCode(this._minx))+ul.hashCode(this._maxx))+ul.hashCode(this._miny))+ul.hashCode(this._maxy)},Ll.prototype.interfaces_=function(){return[il,al]},Ll.prototype.getClass=function(){return Ll},Ll.intersects=function(){if(3===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2];return n.x>=(t.x<e.x?t.x:e.x)&&n.x<=(t.x>e.x?t.x:e.x)&&n.y>=(t.y<e.y?t.y:e.y)&&n.y<=(t.y>e.y?t.y:e.y)}if(4===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=arguments[3],a=Math.min(o.x,s.x),u=Math.max(o.x,s.x),l=Math.min(r.x,i.x),c=Math.max(r.x,i.x);return!(l>u)&&(!(c<a)&&(a=Math.min(o.y,s.y),u=Math.max(o.y,s.y),l=Math.min(r.y,i.y),c=Math.max(r.y,i.y),!(l>u)&&!(c<a)))}},Ol.serialVersionUID.get=function(){return 0x51845cd552189800},Object.defineProperties(Ll,Ol);var Rl={typeStr:/^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,emptyTypeStr:/^\s*(\w+)\s*EMPTY\s*$/,spaces:/\s+/,parenComma:/\)\s*,\s*\(/,doubleParenComma:/\)\s*\)\s*,\s*\(\s*\(/,trimParens:/^\s*\(?(.*?)\)?\s*$/},Tl=function(t){this.geometryFactory=t||new _h};Tl.prototype.read=function(t){var e,n,r;t=t.replace(/[\n\r]/g," ");var i=Rl.typeStr.exec(t);if(-1!==t.search("EMPTY")&&((i=Rl.emptyTypeStr.exec(t))[2]=void 0),i&&(n=i[1].toLowerCase(),r=i[2],Dl[n]&&(e=Dl[n].apply(this,[r]))),void 0===e)throw new Error("Could not parse WKT "+t);return e},Tl.prototype.write=function(t){return this.extractGeometry(t)},Tl.prototype.extractGeometry=function(t){var e=t.getGeometryType().toLowerCase();if(!Al[e])return null;var n=e.toUpperCase();return t.isEmpty()?n+" EMPTY":n+"("+Al[e].apply(this,[t])+")"};var Al={coordinate:function(t){return t.x+" "+t.y},point:function(t){return Al.coordinate.call(this,t._coordinates._coordinates[0])},multipoint:function(t){for(var e=[],n=0,r=t._geometries.length;n<r;++n)e.push("("+Al.point.apply(this,[t._geometries[n]])+")");return e.join(",")},linestring:function(t){for(var e=[],n=0,r=t._points._coordinates.length;n<r;++n)e.push(Al.coordinate.apply(this,[t._points._coordinates[n]]));return e.join(",")},linearring:function(t){for(var e=[],n=0,r=t._points._coordinates.length;n<r;++n)e.push(Al.coordinate.apply(this,[t._points._coordinates[n]]));return e.join(",")},multilinestring:function(t){for(var e=[],n=0,r=t._geometries.length;n<r;++n)e.push("("+Al.linestring.apply(this,[t._geometries[n]])+")");return e.join(",")},polygon:function(t){var e=[];e.push("("+Al.linestring.apply(this,[t._shell])+")");for(var n=0,r=t._holes.length;n<r;++n)e.push("("+Al.linestring.apply(this,[t._holes[n]])+")");return e.join(",")},multipolygon:function(t){for(var e=[],n=0,r=t._geometries.length;n<r;++n)e.push("("+Al.polygon.apply(this,[t._geometries[n]])+")");return e.join(",")},geometrycollection:function(t){for(var e=[],n=0,r=t._geometries.length;n<r;++n)e.push(this.extractGeometry(t._geometries[n]));return e.join(",")}},Dl={point:function(t){if(void 0===t)return this.geometryFactory.createPoint();var e=t.trim().split(Rl.spaces);return this.geometryFactory.createPoint(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])))},multipoint:function(t){var e;if(void 0===t)return this.geometryFactory.createMultiPoint();for(var n=t.trim().split(","),r=[],i=0,o=n.length;i<o;++i)e=n[i].replace(Rl.trimParens,"$1"),r.push(Dl.point.apply(this,[e]));return this.geometryFactory.createMultiPoint(r)},linestring:function(t){if(void 0===t)return this.geometryFactory.createLineString();for(var e,n=t.trim().split(","),r=[],i=0,o=n.length;i<o;++i)e=n[i].trim().split(Rl.spaces),r.push(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])));return this.geometryFactory.createLineString(r)},linearring:function(t){if(void 0===t)return this.geometryFactory.createLinearRing();for(var e,n=t.trim().split(","),r=[],i=0,o=n.length;i<o;++i)e=n[i].trim().split(Rl.spaces),r.push(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])));return this.geometryFactory.createLinearRing(r)},multilinestring:function(t){var e;if(void 0===t)return this.geometryFactory.createMultiLineString();for(var n=t.trim().split(Rl.parenComma),r=[],i=0,o=n.length;i<o;++i)e=n[i].replace(Rl.trimParens,"$1"),r.push(Dl.linestring.apply(this,[e]));return this.geometryFactory.createMultiLineString(r)},polygon:function(t){var e,n,r;if(void 0===t)return this.geometryFactory.createPolygon();for(var i,o=t.trim().split(Rl.parenComma),s=[],a=0,u=o.length;a<u;++a)e=o[a].replace(Rl.trimParens,"$1"),n=Dl.linestring.apply(this,[e]),r=this.geometryFactory.createLinearRing(n._points),0===a?i=r:s.push(r);return this.geometryFactory.createPolygon(i,s)},multipolygon:function(t){var e;if(void 0===t)return this.geometryFactory.createMultiPolygon();for(var n=t.trim().split(Rl.doubleParenComma),r=[],i=0,o=n.length;i<o;++i)e=n[i].replace(Rl.trimParens,"$1"),r.push(Dl.polygon.apply(this,[e]));return this.geometryFactory.createMultiPolygon(r)},geometrycollection:function(t){if(void 0===t)return this.geometryFactory.createGeometryCollection();for(var e=(t=t.replace(/,\s*([A-Za-z])/g,"|$1")).trim().split("|"),n=[],r=0,i=e.length;r<i;++r)n.push(this.read(e[r]));return this.geometryFactory.createGeometryCollection(n)}},Fl=function(t){this.parser=new Tl(t)};Fl.prototype.write=function(t){return this.parser.write(t)},Fl.toLineString=function(t,e){if(2!==arguments.length)throw new Error("Not implemented");return"LINESTRING ( "+t.x+" "+t.y+", "+e.x+" "+e.y+" )"};var kl=function(t){function e(e){t.call(this,e),this.name="RuntimeException",this.message=e,this.stack=(new t).stack}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Error),Gl=function(t){function e(){if(t.call(this),0===arguments.length)t.call(this);else if(1===arguments.length){var e=arguments[0];t.call(this,e)}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(kl),ql=function(){};ql.prototype.interfaces_=function(){return[]},ql.prototype.getClass=function(){return ql},ql.shouldNeverReachHere=function(){if(0===arguments.length)ql.shouldNeverReachHere(null);else if(1===arguments.length){var t=arguments[0];throw new Gl("Should never reach here"+(null!==t?": "+t:""))}},ql.isTrue=function(){var t;if(1===arguments.length)ql.isTrue(arguments[0],null);else if(2===arguments.length&&(t=arguments[1],!arguments[0]))throw null===t?new Gl:new Gl(t)},ql.equals=function(){var t,e,n;if(2===arguments.length)ql.equals(t=arguments[0],e=arguments[1],null);else if(3===arguments.length&&(t=arguments[0],n=arguments[2],!(e=arguments[1]).equals(t)))throw new Gl("Expected "+t+" but encountered "+e+(null!==n?": "+n:""))};var Bl=function(){this._result=null,this._inputLines=Array(2).fill().map((function(){return Array(2)})),this._intPt=new Array(2).fill(null),this._intLineIndex=null,this._isProper=null,this._pa=null,this._pb=null,this._precisionModel=null,this._intPt[0]=new ul,this._intPt[1]=new ul,this._pa=this._intPt[0],this._pb=this._intPt[1],this._result=0},zl={DONT_INTERSECT:{configurable:!0},DO_INTERSECT:{configurable:!0},COLLINEAR:{configurable:!0},NO_INTERSECTION:{configurable:!0},POINT_INTERSECTION:{configurable:!0},COLLINEAR_INTERSECTION:{configurable:!0}};Bl.prototype.getIndexAlongSegment=function(t,e){return this.computeIntLineIndex(),this._intLineIndex[t][e]},Bl.prototype.getTopologySummary=function(){var t=new vl;return this.isEndPoint()&&t.append(" endpoint"),this._isProper&&t.append(" proper"),this.isCollinear()&&t.append(" collinear"),t.toString()},Bl.prototype.computeIntersection=function(t,e,n,r){this._inputLines[0][0]=t,this._inputLines[0][1]=e,this._inputLines[1][0]=n,this._inputLines[1][1]=r,this._result=this.computeIntersect(t,e,n,r)},Bl.prototype.getIntersectionNum=function(){return this._result},Bl.prototype.computeIntLineIndex=function(){if(0===arguments.length)null===this._intLineIndex&&(this._intLineIndex=Array(2).fill().map((function(){return Array(2)})),this.computeIntLineIndex(0),this.computeIntLineIndex(1));else if(1===arguments.length){var t=arguments[0],e=this.getEdgeDistance(t,0),n=this.getEdgeDistance(t,1);e>n?(this._intLineIndex[t][0]=0,this._intLineIndex[t][1]=1):(this._intLineIndex[t][0]=1,this._intLineIndex[t][1]=0)}},Bl.prototype.isProper=function(){return this.hasIntersection()&&this._isProper},Bl.prototype.setPrecisionModel=function(t){this._precisionModel=t},Bl.prototype.isInteriorIntersection=function(){var t=this;if(0===arguments.length)return!!this.isInteriorIntersection(0)||!!this.isInteriorIntersection(1);if(1===arguments.length){for(var e=arguments[0],n=0;n<this._result;n++)if(!t._intPt[n].equals2D(t._inputLines[e][0])&&!t._intPt[n].equals2D(t._inputLines[e][1]))return!0;return!1}},Bl.prototype.getIntersection=function(t){return this._intPt[t]},Bl.prototype.isEndPoint=function(){return this.hasIntersection()&&!this._isProper},Bl.prototype.hasIntersection=function(){return this._result!==Bl.NO_INTERSECTION},Bl.prototype.getEdgeDistance=function(t,e){return Bl.computeEdgeDistance(this._intPt[e],this._inputLines[t][0],this._inputLines[t][1])},Bl.prototype.isCollinear=function(){return this._result===Bl.COLLINEAR_INTERSECTION},Bl.prototype.toString=function(){return Fl.toLineString(this._inputLines[0][0],this._inputLines[0][1])+" - "+Fl.toLineString(this._inputLines[1][0],this._inputLines[1][1])+this.getTopologySummary()},Bl.prototype.getEndpoint=function(t,e){return this._inputLines[t][e]},Bl.prototype.isIntersection=function(t){for(var e=0;e<this._result;e++)if(this._intPt[e].equals2D(t))return!0;return!1},Bl.prototype.getIntersectionAlongSegment=function(t,e){return this.computeIntLineIndex(),this._intPt[this._intLineIndex[t][e]]},Bl.prototype.interfaces_=function(){return[]},Bl.prototype.getClass=function(){return Bl},Bl.computeEdgeDistance=function(t,e,n){var r=Math.abs(n.x-e.x),i=Math.abs(n.y-e.y),o=-1;if(t.equals(e))o=0;else if(t.equals(n))o=r>i?r:i;else{var s=Math.abs(t.x-e.x),a=Math.abs(t.y-e.y);0!==(o=r>i?s:a)||t.equals(e)||(o=Math.max(s,a))}return ql.isTrue(!(0===o&&!t.equals(e)),"Bad distance calculation"),o},Bl.nonRobustComputeEdgeDistance=function(t,e,n){var r=t.x-e.x,i=t.y-e.y,o=Math.sqrt(r*r+i*i);return ql.isTrue(!(0===o&&!t.equals(e)),"Invalid distance calculation"),o},zl.DONT_INTERSECT.get=function(){return 0},zl.DO_INTERSECT.get=function(){return 1},zl.COLLINEAR.get=function(){return 2},zl.NO_INTERSECTION.get=function(){return 0},zl.POINT_INTERSECTION.get=function(){return 1},zl.COLLINEAR_INTERSECTION.get=function(){return 2},Object.defineProperties(Bl,zl);var jl=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isInSegmentEnvelopes=function(t){var e=new Ll(this._inputLines[0][0],this._inputLines[0][1]),n=new Ll(this._inputLines[1][0],this._inputLines[1][1]);return e.contains(t)&&n.contains(t)},e.prototype.computeIntersection=function(){if(3!==arguments.length)return t.prototype.computeIntersection.apply(this,arguments);var e=arguments[0],n=arguments[1],r=arguments[2];if(this._isProper=!1,Ll.intersects(n,r,e)&&0===Xl.orientationIndex(n,r,e)&&0===Xl.orientationIndex(r,n,e))return this._isProper=!0,(e.equals(n)||e.equals(r))&&(this._isProper=!1),this._result=t.POINT_INTERSECTION,null;this._result=t.NO_INTERSECTION},e.prototype.normalizeToMinimum=function(t,e,n,r,i){i.x=this.smallestInAbsValue(t.x,e.x,n.x,r.x),i.y=this.smallestInAbsValue(t.y,e.y,n.y,r.y),t.x-=i.x,t.y-=i.y,e.x-=i.x,e.y-=i.y,n.x-=i.x,n.y-=i.y,r.x-=i.x,r.y-=i.y},e.prototype.safeHCoordinateIntersection=function(t,n,r,i){var o=null;try{o=Ml.intersection(t,n,r,i)}catch(s){if(!(s instanceof Cl))throw s;o=e.nearestEndpoint(t,n,r,i)}return o},e.prototype.intersection=function(t,n,r,i){var o=this.intersectionWithNormalization(t,n,r,i);return this.isInSegmentEnvelopes(o)||(o=new ul(e.nearestEndpoint(t,n,r,i))),null!==this._precisionModel&&this._precisionModel.makePrecise(o),o},e.prototype.smallestInAbsValue=function(t,e,n,r){var i=t,o=Math.abs(i);return Math.abs(e)<o&&(i=e,o=Math.abs(e)),Math.abs(n)<o&&(i=n,o=Math.abs(n)),Math.abs(r)<o&&(i=r),i},e.prototype.checkDD=function(t,e,n,r,i){var o=bl.intersection(t,e,n,r),s=this.isInSegmentEnvelopes(o);Pl.out.println("DD in env = "+s+" --------------------- "+o),i.distance(o)>1e-4&&Pl.out.println("Distance = "+i.distance(o))},e.prototype.intersectionWithNormalization=function(t,e,n,r){var i=new ul(t),o=new ul(e),s=new ul(n),a=new ul(r),u=new ul;this.normalizeToEnvCentre(i,o,s,a,u);var l=this.safeHCoordinateIntersection(i,o,s,a);return l.x+=u.x,l.y+=u.y,l},e.prototype.computeCollinearIntersection=function(e,n,r,i){var o=Ll.intersects(e,n,r),s=Ll.intersects(e,n,i),a=Ll.intersects(r,i,e),u=Ll.intersects(r,i,n);return o&&s?(this._intPt[0]=r,this._intPt[1]=i,t.COLLINEAR_INTERSECTION):a&&u?(this._intPt[0]=e,this._intPt[1]=n,t.COLLINEAR_INTERSECTION):o&&a?(this._intPt[0]=r,this._intPt[1]=e,!r.equals(e)||s||u?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):o&&u?(this._intPt[0]=r,this._intPt[1]=n,!r.equals(n)||s||a?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):s&&a?(this._intPt[0]=i,this._intPt[1]=e,!i.equals(e)||o||u?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):s&&u?(this._intPt[0]=i,this._intPt[1]=n,!i.equals(n)||o||a?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):t.NO_INTERSECTION},e.prototype.normalizeToEnvCentre=function(t,e,n,r,i){var o=t.x<e.x?t.x:e.x,s=t.y<e.y?t.y:e.y,a=t.x>e.x?t.x:e.x,u=t.y>e.y?t.y:e.y,l=n.x<r.x?n.x:r.x,c=n.y<r.y?n.y:r.y,h=n.x>r.x?n.x:r.x,p=n.y>r.y?n.y:r.y,f=((o>l?o:l)+(a<h?a:h))/2,g=((s>c?s:c)+(u<p?u:p))/2;i.x=f,i.y=g,t.x-=i.x,t.y-=i.y,e.x-=i.x,e.y-=i.y,n.x-=i.x,n.y-=i.y,r.x-=i.x,r.y-=i.y},e.prototype.computeIntersect=function(e,n,r,i){if(this._isProper=!1,!Ll.intersects(e,n,r,i))return t.NO_INTERSECTION;var o=Xl.orientationIndex(e,n,r),s=Xl.orientationIndex(e,n,i);if(o>0&&s>0||o<0&&s<0)return t.NO_INTERSECTION;var a=Xl.orientationIndex(r,i,e),u=Xl.orientationIndex(r,i,n);return a>0&&u>0||a<0&&u<0?t.NO_INTERSECTION:0===o&&0===s&&0===a&&0===u?this.computeCollinearIntersection(e,n,r,i):(0===o||0===s||0===a||0===u?(this._isProper=!1,e.equals2D(r)||e.equals2D(i)?this._intPt[0]=e:n.equals2D(r)||n.equals2D(i)?this._intPt[0]=n:0===o?this._intPt[0]=new ul(r):0===s?this._intPt[0]=new ul(i):0===a?this._intPt[0]=new ul(e):0===u&&(this._intPt[0]=new ul(n))):(this._isProper=!0,this._intPt[0]=this.intersection(e,n,r,i)),t.POINT_INTERSECTION)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.nearestEndpoint=function(t,e,n,r){var i=t,o=Xl.distancePointLine(t,n,r),s=Xl.distancePointLine(e,n,r);return s<o&&(o=s,i=e),(s=Xl.distancePointLine(n,t,e))<o&&(o=s,i=n),(s=Xl.distancePointLine(r,t,e))<o&&(o=s,i=r),i},e}(Bl),Ul=function(){};Ul.prototype.interfaces_=function(){return[]},Ul.prototype.getClass=function(){return Ul},Ul.orientationIndex=function(t,e,n){var r=e.x-t.x,i=e.y-t.y,o=n.x-e.x,s=n.y-e.y;return Ul.signOfDet2x2(r,i,o,s)},Ul.signOfDet2x2=function(t,e,n,r){var i=null,o=null,s=null;if(i=1,0===t||0===r)return 0===e||0===n?0:e>0?n>0?-i:i:n>0?i:-i;if(0===e||0===n)return r>0?t>0?i:-i:t>0?-i:i;if(e>0?r>0?e<=r||(i=-i,o=t,t=n,n=o,o=e,e=r,r=o):e<=-r?(i=-i,n=-n,r=-r):(o=t,t=-n,n=o,o=e,e=-r,r=o):r>0?-e<=r?(i=-i,t=-t,e=-e):(o=-t,t=n,n=o,o=-e,e=r,r=o):e>=r?(t=-t,e=-e,n=-n,r=-r):(i=-i,o=-t,t=-n,n=o,o=-e,e=-r,r=o),t>0){if(!(n>0))return i;if(!(t<=n))return i}else{if(n>0)return-i;if(!(t>=n))return-i;i=-i,t=-t,n=-n}for(;;){if((r-=(s=Math.floor(n/t))*e)<0)return-i;if(r>e)return i;if(t>(n-=s*t)+n){if(e<r+r)return i}else{if(e>r+r)return-i;n=t-n,r=e-r,i=-i}if(0===r)return 0===n?0:-i;if(0===n)return i;if((e-=(s=Math.floor(t/n))*r)<0)return i;if(e>r)return-i;if(n>(t-=s*n)+t){if(r<e+e)return-i}else{if(r>e+e)return i;t=n-t,e=r-e,i=-i}if(0===e)return 0===t?0:i;if(0===t)return-i}};var Vl=function(){this._p=null,this._crossingCount=0,this._isPointOnSegment=!1;var t=arguments[0];this._p=t};Vl.prototype.countSegment=function(t,e){if(t.x<this._p.x&&e.x<this._p.x)return null;if(this._p.x===e.x&&this._p.y===e.y)return this._isPointOnSegment=!0,null;if(t.y===this._p.y&&e.y===this._p.y){var n=t.x,r=e.x;return n>r&&(n=e.x,r=t.x),this._p.x>=n&&this._p.x<=r&&(this._isPointOnSegment=!0),null}if(t.y>this._p.y&&e.y<=this._p.y||e.y>this._p.y&&t.y<=this._p.y){var i=t.x-this._p.x,o=t.y-this._p.y,s=e.x-this._p.x,a=e.y-this._p.y,u=Ul.signOfDet2x2(i,o,s,a);if(0===u)return this._isPointOnSegment=!0,null;a<o&&(u=-u),u>0&&this._crossingCount++}},Vl.prototype.isPointInPolygon=function(){return this.getLocation()!==pl.EXTERIOR},Vl.prototype.getLocation=function(){return this._isPointOnSegment?pl.BOUNDARY:this._crossingCount%2==1?pl.INTERIOR:pl.EXTERIOR},Vl.prototype.isOnSegment=function(){return this._isPointOnSegment},Vl.prototype.interfaces_=function(){return[]},Vl.prototype.getClass=function(){return Vl},Vl.locatePointInRing=function(){if(arguments[0]instanceof ul&&gl(arguments[1],Il)){for(var t=arguments[0],e=arguments[1],n=new Vl(t),r=new ul,i=new ul,o=1;o<e.size();o++)if(e.getCoordinate(o,r),e.getCoordinate(o-1,i),n.countSegment(r,i),n.isOnSegment())return n.getLocation();return n.getLocation()}if(arguments[0]instanceof ul&&arguments[1]instanceof Array){for(var s=arguments[0],a=arguments[1],u=new Vl(s),l=1;l<a.length;l++){var c=a[l],h=a[l-1];if(u.countSegment(c,h),u.isOnSegment())return u.getLocation()}return u.getLocation()}};var Xl=function(){},Yl={CLOCKWISE:{configurable:!0},RIGHT:{configurable:!0},COUNTERCLOCKWISE:{configurable:!0},LEFT:{configurable:!0},COLLINEAR:{configurable:!0},STRAIGHT:{configurable:!0}};Xl.prototype.interfaces_=function(){return[]},Xl.prototype.getClass=function(){return Xl},Xl.orientationIndex=function(t,e,n){return bl.orientationIndex(t,e,n)},Xl.signedArea=function(){if(arguments[0]instanceof Array){var t=arguments[0];if(t.length<3)return 0;for(var e=0,n=t[0].x,r=1;r<t.length-1;r++){var i=t[r].x-n,o=t[r+1].y,s=t[r-1].y;e+=i*(s-o)}return e/2}if(gl(arguments[0],Il)){var a=arguments[0],u=a.size();if(u<3)return 0;var l=new ul,c=new ul,h=new ul;a.getCoordinate(0,c),a.getCoordinate(1,h);var p=c.x;h.x-=p;for(var f=0,g=1;g<u-1;g++)l.y=c.y,c.x=h.x,c.y=h.y,a.getCoordinate(g+1,h),h.x-=p,f+=c.x*(l.y-h.y);return f/2}},Xl.distanceLineLine=function(t,e,n,r){if(t.equals(e))return Xl.distancePointLine(t,n,r);if(n.equals(r))return Xl.distancePointLine(r,t,e);var i=!1;if(Ll.intersects(t,e,n,r)){var o=(e.x-t.x)*(r.y-n.y)-(e.y-t.y)*(r.x-n.x);if(0===o)i=!0;else{var s=(t.y-n.y)*(r.x-n.x)-(t.x-n.x)*(r.y-n.y),a=((t.y-n.y)*(e.x-t.x)-(t.x-n.x)*(e.y-t.y))/o,u=s/o;(u<0||u>1||a<0||a>1)&&(i=!0)}}else i=!0;return i?dl.min(Xl.distancePointLine(t,n,r),Xl.distancePointLine(e,n,r),Xl.distancePointLine(n,t,e),Xl.distancePointLine(r,t,e)):0},Xl.isPointInRing=function(t,e){return Xl.locatePointInRing(t,e)!==pl.EXTERIOR},Xl.computeLength=function(t){var e=t.size();if(e<=1)return 0;var n=0,r=new ul;t.getCoordinate(0,r);for(var i=r.x,o=r.y,s=1;s<e;s++){t.getCoordinate(s,r);var a=r.x,u=r.y,l=a-i,c=u-o;n+=Math.sqrt(l*l+c*c),i=a,o=u}return n},Xl.isCCW=function(t){var e=t.length-1;if(e<3)throw new el("Ring has fewer than 4 points, so orientation cannot be determined");for(var n=t[0],r=0,i=1;i<=e;i++){var o=t[i];o.y>n.y&&(n=o,r=i)}var s=r;do{(s-=1)<0&&(s=e)}while(t[s].equals2D(n)&&s!==r);var a=r;do{a=(a+1)%e}while(t[a].equals2D(n)&&a!==r);var u=t[s],l=t[a];if(u.equals2D(n)||l.equals2D(n)||u.equals2D(l))return!1;var c=Xl.computeOrientation(u,n,l),h=!1;return h=0===c?u.x>l.x:c>0,h},Xl.locatePointInRing=function(t,e){return Vl.locatePointInRing(t,e)},Xl.distancePointLinePerpendicular=function(t,e,n){var r=(n.x-e.x)*(n.x-e.x)+(n.y-e.y)*(n.y-e.y),i=((e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y))/r;return Math.abs(i)*Math.sqrt(r)},Xl.computeOrientation=function(t,e,n){return Xl.orientationIndex(t,e,n)},Xl.distancePointLine=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];if(0===e.length)throw new el("Line array must contain at least one vertex");for(var n=t.distance(e[0]),r=0;r<e.length-1;r++){var i=Xl.distancePointLine(t,e[r],e[r+1]);i<n&&(n=i)}return n}if(3===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2];if(s.x===a.x&&s.y===a.y)return o.distance(s);var u=(a.x-s.x)*(a.x-s.x)+(a.y-s.y)*(a.y-s.y),l=((o.x-s.x)*(a.x-s.x)+(o.y-s.y)*(a.y-s.y))/u;if(l<=0)return o.distance(s);if(l>=1)return o.distance(a);var c=((s.y-o.y)*(a.x-s.x)-(s.x-o.x)*(a.y-s.y))/u;return Math.abs(c)*Math.sqrt(u)}},Xl.isOnLine=function(t,e){for(var n=new jl,r=1;r<e.length;r++){var i=e[r-1],o=e[r];if(n.computeIntersection(t,i,o),n.hasIntersection())return!0}return!1},Yl.CLOCKWISE.get=function(){return-1},Yl.RIGHT.get=function(){return Xl.CLOCKWISE},Yl.COUNTERCLOCKWISE.get=function(){return 1},Yl.LEFT.get=function(){return Xl.COUNTERCLOCKWISE},Yl.COLLINEAR.get=function(){return 0},Yl.STRAIGHT.get=function(){return Xl.COLLINEAR},Object.defineProperties(Xl,Yl);var Hl=function(){};Hl.prototype.filter=function(t){},Hl.prototype.interfaces_=function(){return[]},Hl.prototype.getClass=function(){return Hl};var Wl=function(){var t=arguments[0];this._envelope=null,this._factory=null,this._SRID=null,this._userData=null,this._factory=t,this._SRID=t.getSRID()},Jl={serialVersionUID:{configurable:!0},SORTINDEX_POINT:{configurable:!0},SORTINDEX_MULTIPOINT:{configurable:!0},SORTINDEX_LINESTRING:{configurable:!0},SORTINDEX_LINEARRING:{configurable:!0},SORTINDEX_MULTILINESTRING:{configurable:!0},SORTINDEX_POLYGON:{configurable:!0},SORTINDEX_MULTIPOLYGON:{configurable:!0},SORTINDEX_GEOMETRYCOLLECTION:{configurable:!0},geometryChangedFilter:{configurable:!0}};Wl.prototype.isGeometryCollection=function(){return this.getSortIndex()===Wl.SORTINDEX_GEOMETRYCOLLECTION},Wl.prototype.getFactory=function(){return this._factory},Wl.prototype.getGeometryN=function(t){return this},Wl.prototype.getArea=function(){return 0},Wl.prototype.isRectangle=function(){return!1},Wl.prototype.equals=function(){if(arguments[0]instanceof Wl){var t=arguments[0];return null!==t&&this.equalsTopo(t)}if(arguments[0]instanceof Object){var e=arguments[0];if(!(e instanceof Wl))return!1;var n=e;return this.equalsExact(n)}},Wl.prototype.equalsExact=function(t){return this===t||this.equalsExact(t,0)},Wl.prototype.geometryChanged=function(){this.apply(Wl.geometryChangedFilter)},Wl.prototype.geometryChangedAction=function(){this._envelope=null},Wl.prototype.equalsNorm=function(t){return null!==t&&this.norm().equalsExact(t.norm())},Wl.prototype.getLength=function(){return 0},Wl.prototype.getNumGeometries=function(){return 1},Wl.prototype.compareTo=function(){if(1===arguments.length){var t=arguments[0],e=t;return this.getSortIndex()!==e.getSortIndex()?this.getSortIndex()-e.getSortIndex():this.isEmpty()&&e.isEmpty()?0:this.isEmpty()?-1:e.isEmpty()?1:this.compareToSameClass(t)}if(2===arguments.length){var n=arguments[0],r=arguments[1];return this.getSortIndex()!==n.getSortIndex()?this.getSortIndex()-n.getSortIndex():this.isEmpty()&&n.isEmpty()?0:this.isEmpty()?-1:n.isEmpty()?1:this.compareToSameClass(n,r)}},Wl.prototype.getUserData=function(){return this._userData},Wl.prototype.getSRID=function(){return this._SRID},Wl.prototype.getEnvelope=function(){return this.getFactory().toGeometry(this.getEnvelopeInternal())},Wl.prototype.checkNotGeometryCollection=function(t){if(t.getSortIndex()===Wl.SORTINDEX_GEOMETRYCOLLECTION)throw new el("This method does not support GeometryCollection arguments")},Wl.prototype.equal=function(t,e,n){return 0===n?t.equals(e):t.distance(e)<=n},Wl.prototype.norm=function(){var t=this.copy();return t.normalize(),t},Wl.prototype.getPrecisionModel=function(){return this._factory.getPrecisionModel()},Wl.prototype.getEnvelopeInternal=function(){return null===this._envelope&&(this._envelope=this.computeEnvelopeInternal()),new Ll(this._envelope)},Wl.prototype.setSRID=function(t){this._SRID=t},Wl.prototype.setUserData=function(t){this._userData=t},Wl.prototype.compare=function(t,e){for(var n=t.iterator(),r=e.iterator();n.hasNext()&&r.hasNext();){var i=n.next(),o=r.next(),s=i.compareTo(o);if(0!==s)return s}return n.hasNext()?1:r.hasNext()?-1:0},Wl.prototype.hashCode=function(){return this.getEnvelopeInternal().hashCode()},Wl.prototype.isGeometryCollectionOrDerived=function(){return this.getSortIndex()===Wl.SORTINDEX_GEOMETRYCOLLECTION||this.getSortIndex()===Wl.SORTINDEX_MULTIPOINT||this.getSortIndex()===Wl.SORTINDEX_MULTILINESTRING||this.getSortIndex()===Wl.SORTINDEX_MULTIPOLYGON},Wl.prototype.interfaces_=function(){return[ol,il,al]},Wl.prototype.getClass=function(){return Wl},Wl.hasNonEmptyElements=function(t){for(var e=0;e<t.length;e++)if(!t[e].isEmpty())return!0;return!1},Wl.hasNullElements=function(t){for(var e=0;e<t.length;e++)if(null===t[e])return!0;return!1},Jl.serialVersionUID.get=function(){return 0x799ea46522854c00},Jl.SORTINDEX_POINT.get=function(){return 0},Jl.SORTINDEX_MULTIPOINT.get=function(){return 1},Jl.SORTINDEX_LINESTRING.get=function(){return 2},Jl.SORTINDEX_LINEARRING.get=function(){return 3},Jl.SORTINDEX_MULTILINESTRING.get=function(){return 4},Jl.SORTINDEX_POLYGON.get=function(){return 5},Jl.SORTINDEX_MULTIPOLYGON.get=function(){return 6},Jl.SORTINDEX_GEOMETRYCOLLECTION.get=function(){return 7},Jl.geometryChangedFilter.get=function(){return Zl},Object.defineProperties(Wl,Jl);var Zl=function(){};Zl.interfaces_=function(){return[Hl]},Zl.filter=function(t){t.geometryChangedAction()};var Kl=function(){};Kl.prototype.filter=function(t){},Kl.prototype.interfaces_=function(){return[]},Kl.prototype.getClass=function(){return Kl};var Ql=function(){},$l={Mod2BoundaryNodeRule:{configurable:!0},EndPointBoundaryNodeRule:{configurable:!0},MultiValentEndPointBoundaryNodeRule:{configurable:!0},MonoValentEndPointBoundaryNodeRule:{configurable:!0},MOD2_BOUNDARY_RULE:{configurable:!0},ENDPOINT_BOUNDARY_RULE:{configurable:!0},MULTIVALENT_ENDPOINT_BOUNDARY_RULE:{configurable:!0},MONOVALENT_ENDPOINT_BOUNDARY_RULE:{configurable:!0},OGC_SFS_BOUNDARY_RULE:{configurable:!0}};Ql.prototype.isInBoundary=function(t){},Ql.prototype.interfaces_=function(){return[]},Ql.prototype.getClass=function(){return Ql},$l.Mod2BoundaryNodeRule.get=function(){return tc},$l.EndPointBoundaryNodeRule.get=function(){return ec},$l.MultiValentEndPointBoundaryNodeRule.get=function(){return nc},$l.MonoValentEndPointBoundaryNodeRule.get=function(){return rc},$l.MOD2_BOUNDARY_RULE.get=function(){return new tc},$l.ENDPOINT_BOUNDARY_RULE.get=function(){return new ec},$l.MULTIVALENT_ENDPOINT_BOUNDARY_RULE.get=function(){return new nc},$l.MONOVALENT_ENDPOINT_BOUNDARY_RULE.get=function(){return new rc},$l.OGC_SFS_BOUNDARY_RULE.get=function(){return Ql.MOD2_BOUNDARY_RULE},Object.defineProperties(Ql,$l);var tc=function(){};tc.prototype.isInBoundary=function(t){return t%2==1},tc.prototype.interfaces_=function(){return[Ql]},tc.prototype.getClass=function(){return tc};var ec=function(){};ec.prototype.isInBoundary=function(t){return t>0},ec.prototype.interfaces_=function(){return[Ql]},ec.prototype.getClass=function(){return ec};var nc=function(){};nc.prototype.isInBoundary=function(t){return t>1},nc.prototype.interfaces_=function(){return[Ql]},nc.prototype.getClass=function(){return nc};var rc=function(){};rc.prototype.isInBoundary=function(t){return 1===t},rc.prototype.interfaces_=function(){return[Ql]},rc.prototype.getClass=function(){return rc};var ic=function(){};function oc(t){this.message=t||""}ic.prototype.add=function(){},ic.prototype.addAll=function(){},ic.prototype.isEmpty=function(){},ic.prototype.iterator=function(){},ic.prototype.size=function(){},ic.prototype.toArray=function(){},ic.prototype.remove=function(){},oc.prototype=new Error,oc.prototype.name="IndexOutOfBoundsException";var sc=function(){};sc.prototype.hasNext=function(){},sc.prototype.next=function(){},sc.prototype.remove=function(){};var ac=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(){},e.prototype.set=function(){},e.prototype.isEmpty=function(){},e}(ic);function uc(t){this.message=t||""}uc.prototype=new Error,uc.prototype.name="NoSuchElementException";var lc=function(t){function e(){t.call(this),this.array_=[],arguments[0]instanceof ic&&this.addAll(arguments[0])}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.ensureCapacity=function(){},e.prototype.interfaces_=function(){return[t,ic]},e.prototype.add=function(t){return 1===arguments.length?this.array_.push(t):this.array_.splice(arguments[0],arguments[1]),!0},e.prototype.clear=function(){this.array_=[]},e.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next());return!0},e.prototype.set=function(t,e){var n=this.array_[t];return this.array_[t]=e,n},e.prototype.iterator=function(){return new cc(this)},e.prototype.get=function(t){if(t<0||t>=this.size())throw new oc;return this.array_[t]},e.prototype.isEmpty=function(){return 0===this.array_.length},e.prototype.size=function(){return this.array_.length},e.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e<n;e++)t.push(this.array_[e]);return t},e.prototype.remove=function(t){for(var e=!1,n=0,r=this.array_.length;n<r;n++)if(this.array_[n]===t){this.array_.splice(n,1),e=!0;break}return e},e}(ac),cc=function(t){function e(e){t.call(this),this.arrayList_=e,this.position_=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.next=function(){if(this.position_===this.arrayList_.size())throw new uc;return this.arrayList_.get(this.position_++)},e.prototype.hasNext=function(){return this.position_<this.arrayList_.size()},e.prototype.set=function(t){return this.arrayList_.set(this.position_-1,t)},e.prototype.remove=function(){this.arrayList_.remove(this.arrayList_.get(this.position_))},e}(sc),hc=function(t){function e(){if(t.call(this),0===arguments.length);else if(1===arguments.length){var e=arguments[0];this.ensureCapacity(e.length),this.add(e,!0)}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.ensureCapacity(n.length),this.add(n,r)}}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={coordArrayType:{configurable:!0}};return n.coordArrayType.get=function(){return new Array(0).fill(null)},e.prototype.getCoordinate=function(t){return this.get(t)},e.prototype.addAll=function(){var e=this;if(2===arguments.length){for(var n=arguments[0],r=arguments[1],i=!1,o=n.iterator();o.hasNext();)e.add(o.next(),r),i=!0;return i}return t.prototype.addAll.apply(this,arguments)},e.prototype.clone=function(){for(var e=t.prototype.clone.call(this),n=0;n<this.size();n++)e.add(n,this.get(n).copy());return e},e.prototype.toCoordinateArray=function(){return this.toArray(e.coordArrayType)},e.prototype.add=function(){var e=this;if(1===arguments.length){var n=arguments[0];t.prototype.add.call(this,n)}else if(2===arguments.length){if(arguments[0]instanceof Array&&"boolean"==typeof arguments[1]){var r=arguments[0],i=arguments[1];return this.add(r,i,!0),!0}if(arguments[0]instanceof ul&&"boolean"==typeof arguments[1]){var o=arguments[0],s=arguments[1];if(!s&&this.size()>=1){var a=this.get(this.size()-1);if(a.equals2D(o))return null}t.prototype.add.call(this,o)}else if(arguments[0]instanceof Object&&"boolean"==typeof arguments[1]){var u=arguments[0],l=arguments[1];return this.add(u,l),!0}}else if(3===arguments.length){if("boolean"==typeof arguments[2]&&arguments[0]instanceof Array&&"boolean"==typeof arguments[1]){var c=arguments[0],h=arguments[1],p=arguments[2];if(p)for(var f=0;f<c.length;f++)e.add(c[f],h);else for(var g=c.length-1;g>=0;g--)e.add(c[g],h);return!0}if("boolean"==typeof arguments[2]&&Number.isInteger(arguments[0])&&arguments[1]instanceof ul){var d=arguments[0],y=arguments[1],v=arguments[2];if(!v){var _=this.size();if(_>0){if(d>0){var m=this.get(d-1);if(m.equals2D(y))return null}if(d<_){var x=this.get(d);if(x.equals2D(y))return null}}}t.prototype.add.call(this,d,y)}}else if(4===arguments.length){var E=arguments[0],b=arguments[1],w=arguments[2],I=arguments[3],N=1;w>I&&(N=-1);for(var S=w;S!==I;S+=N)e.add(E[S],b);return!0}},e.prototype.closeRing=function(){this.size()>0&&this.add(new ul(this.get(0)),!1)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},Object.defineProperties(e,n),e}(lc),pc=function(){},fc={ForwardComparator:{configurable:!0},BidirectionalComparator:{configurable:!0},coordArrayType:{configurable:!0}};fc.ForwardComparator.get=function(){return gc},fc.BidirectionalComparator.get=function(){return dc},fc.coordArrayType.get=function(){return new Array(0).fill(null)},pc.prototype.interfaces_=function(){return[]},pc.prototype.getClass=function(){return pc},pc.isRing=function(t){return!(t.length<4)&&!!t[0].equals2D(t[t.length-1])},pc.ptNotInList=function(t,e){for(var n=0;n<t.length;n++){var r=t[n];if(pc.indexOf(r,e)<0)return r}return null},pc.scroll=function(t,e){var n=pc.indexOf(e,t);if(n<0)return null;var r=new Array(t.length).fill(null);Pl.arraycopy(t,n,r,0,t.length-n),Pl.arraycopy(t,0,r,t.length-n,n),Pl.arraycopy(r,0,t,0,t.length)},pc.equals=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];if(t===e)return!0;if(null===t||null===e)return!1;if(t.length!==e.length)return!1;for(var n=0;n<t.length;n++)if(!t[n].equals(e[n]))return!1;return!0}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];if(r===i)return!0;if(null===r||null===i)return!1;if(r.length!==i.length)return!1;for(var s=0;s<r.length;s++)if(0!==o.compare(r[s],i[s]))return!1;return!0}},pc.intersection=function(t,e){for(var n=new hc,r=0;r<t.length;r++)e.intersects(t[r])&&n.add(t[r],!0);return n.toCoordinateArray()},pc.hasRepeatedPoints=function(t){for(var e=1;e<t.length;e++)if(t[e-1].equals(t[e]))return!0;return!1},pc.removeRepeatedPoints=function(t){return pc.hasRepeatedPoints(t)?new hc(t,!1).toCoordinateArray():t},pc.reverse=function(t){for(var e=t.length-1,n=Math.trunc(e/2),r=0;r<=n;r++){var i=t[r];t[r]=t[e-r],t[e-r]=i}},pc.removeNull=function(t){for(var e=0,n=0;n<t.length;n++)null!==t[n]&&e++;var r=new Array(e).fill(null);if(0===e)return r;for(var i=0,o=0;o<t.length;o++)null!==t[o]&&(r[i++]=t[o]);return r},pc.copyDeep=function(){if(1===arguments.length){for(var t=arguments[0],e=new Array(t.length).fill(null),n=0;n<t.length;n++)e[n]=new ul(t[n]);return e}if(5===arguments.length)for(var r=arguments[0],i=arguments[1],o=arguments[2],s=arguments[3],a=arguments[4],u=0;u<a;u++)o[s+u]=new ul(r[i+u])},pc.isEqualReversed=function(t,e){for(var n=0;n<t.length;n++){var r=t[n],i=e[t.length-n-1];if(0!==r.compareTo(i))return!1}return!0},pc.envelope=function(t){for(var e=new Ll,n=0;n<t.length;n++)e.expandToInclude(t[n]);return e},pc.toCoordinateArray=function(t){return t.toArray(pc.coordArrayType)},pc.atLeastNCoordinatesOrNothing=function(t,e){return e.length>=t?e:[]},pc.indexOf=function(t,e){for(var n=0;n<e.length;n++)if(t.equals(e[n]))return n;return-1},pc.increasingDirection=function(t){for(var e=0;e<Math.trunc(t.length/2);e++){var n=t.length-1-e,r=t[e].compareTo(t[n]);if(0!==r)return r}return 1},pc.compare=function(t,e){for(var n=0;n<t.length&&n<e.length;){var r=t[n].compareTo(e[n]);if(0!==r)return r;n++}return n<e.length?-1:n<t.length?1:0},pc.minCoordinate=function(t){for(var e=null,n=0;n<t.length;n++)(null===e||e.compareTo(t[n])>0)&&(e=t[n]);return e},pc.extract=function(t,e,n){e=dl.clamp(e,0,t.length);var r=(n=dl.clamp(n,-1,t.length))-e+1;n<0&&(r=0),e>=t.length&&(r=0),n<e&&(r=0);var i=new Array(r).fill(null);if(0===r)return i;for(var o=0,s=e;s<=n;s++)i[o++]=t[s];return i},Object.defineProperties(pc,fc);var gc=function(){};gc.prototype.compare=function(t,e){return pc.compare(t,e)},gc.prototype.interfaces_=function(){return[sl]},gc.prototype.getClass=function(){return gc};var dc=function(){};dc.prototype.compare=function(t,e){var n=t,r=e;if(n.length<r.length)return-1;if(n.length>r.length)return 1;if(0===n.length)return 0;var i=pc.compare(n,r);return pc.isEqualReversed(n,r)?0:i},dc.prototype.OLDcompare=function(t,e){var n=t,r=e;if(n.length<r.length)return-1;if(n.length>r.length)return 1;if(0===n.length)return 0;for(var i=pc.increasingDirection(n),o=pc.increasingDirection(r),s=i>0?0:n.length-1,a=o>0?0:n.length-1,u=0;u<n.length;u++){var l=n[s].compareTo(r[a]);if(0!==l)return l;s+=i,a+=o}return 0},dc.prototype.interfaces_=function(){return[sl]},dc.prototype.getClass=function(){return dc};var yc=function(){};yc.prototype.get=function(){},yc.prototype.put=function(){},yc.prototype.size=function(){},yc.prototype.values=function(){},yc.prototype.entrySet=function(){};var vc=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(yc);function _c(t){this.message=t||""}function mc(){}_c.prototype=new Error,_c.prototype.name="OperationNotSupported",mc.prototype=new ic,mc.prototype.contains=function(){};var xc=function(t){function e(){t.call(this),this.array_=[],arguments[0]instanceof ic&&this.addAll(arguments[0])}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.contains=function(t){for(var e=0,n=this.array_.length;e<n;e++){if(this.array_[e]===t)return!0}return!1},e.prototype.add=function(t){return!this.contains(t)&&(this.array_.push(t),!0)},e.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next());return!0},e.prototype.remove=function(t){throw new Error},e.prototype.size=function(){return this.array_.length},e.prototype.isEmpty=function(){return 0===this.array_.length},e.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e<n;e++)t.push(this.array_[e]);return t},e.prototype.iterator=function(){return new Ec(this)},e}(mc),Ec=function(t){function e(e){t.call(this),this.hashSet_=e,this.position_=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.next=function(){if(this.position_===this.hashSet_.size())throw new uc;return this.hashSet_.array_[this.position_++]},e.prototype.hasNext=function(){return this.position_<this.hashSet_.size()},e.prototype.remove=function(){throw new _c},e}(sc);function bc(t){return null===t?0:t.color}function wc(t){return null===t?null:t.parent}function Ic(t,e){null!==t&&(t.color=e)}function Nc(t){return null===t?null:t.left}function Sc(t){return null===t?null:t.right}function Cc(){this.root_=null,this.size_=0}Cc.prototype=new vc,Cc.prototype.get=function(t){for(var e=this.root_;null!==e;){var n=t.compareTo(e.key);if(n<0)e=e.left;else{if(!(n>0))return e.value;e=e.right}}return null},Cc.prototype.put=function(t,e){if(null===this.root_)return this.root_={key:t,value:e,left:null,right:null,parent:null,color:0,getValue:function(){return this.value},getKey:function(){return this.key}},this.size_=1,null;var n,r,i=this.root_;do{if(n=i,(r=t.compareTo(i.key))<0)i=i.left;else{if(!(r>0)){var o=i.value;return i.value=e,o}i=i.right}}while(null!==i);var s={key:t,left:null,right:null,value:e,parent:n,color:0,getValue:function(){return this.value},getKey:function(){return this.key}};return r<0?n.left=s:n.right=s,this.fixAfterInsertion(s),this.size_++,null},Cc.prototype.fixAfterInsertion=function(t){var e=this;for(t.color=1;null!=t&&t!==this.root_&&1===t.parent.color;)if(wc(t)===Nc(wc(wc(t)))){var n=Sc(wc(wc(t)));1===bc(n)?(Ic(wc(t),0),Ic(n,0),Ic(wc(wc(t)),1),t=wc(wc(t))):(t===Sc(wc(t))&&(t=wc(t),e.rotateLeft(t)),Ic(wc(t),0),Ic(wc(wc(t)),1),e.rotateRight(wc(wc(t))))}else{var r=Nc(wc(wc(t)));1===bc(r)?(Ic(wc(t),0),Ic(r,0),Ic(wc(wc(t)),1),t=wc(wc(t))):(t===Nc(wc(t))&&(t=wc(t),e.rotateRight(t)),Ic(wc(t),0),Ic(wc(wc(t)),1),e.rotateLeft(wc(wc(t))))}this.root_.color=0},Cc.prototype.values=function(){var t=new lc,e=this.getFirstEntry();if(null!==e)for(t.add(e.value);null!==(e=Cc.successor(e));)t.add(e.value);return t},Cc.prototype.entrySet=function(){var t=new xc,e=this.getFirstEntry();if(null!==e)for(t.add(e);null!==(e=Cc.successor(e));)t.add(e);return t},Cc.prototype.rotateLeft=function(t){if(null!=t){var e=t.right;t.right=e.left,null!=e.left&&(e.left.parent=t),e.parent=t.parent,null===t.parent?this.root_=e:t.parent.left===t?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e}},Cc.prototype.rotateRight=function(t){if(null!=t){var e=t.left;t.left=e.right,null!=e.right&&(e.right.parent=t),e.parent=t.parent,null===t.parent?this.root_=e:t.parent.right===t?t.parent.right=e:t.parent.left=e,e.right=t,t.parent=e}},Cc.prototype.getFirstEntry=function(){var t=this.root_;if(null!=t)for(;null!=t.left;)t=t.left;return t},Cc.successor=function(t){if(null===t)return null;if(null!==t.right){for(var e=t.right;null!==e.left;)e=e.left;return e}for(var n=t.parent,r=t;null!==n&&r===n.right;)r=n,n=n.parent;return n},Cc.prototype.size=function(){return this.size_};var Pc=function(){};function Mc(){}function Lc(){this.array_=[],arguments[0]instanceof ic&&this.addAll(arguments[0])}Pc.prototype.interfaces_=function(){return[]},Pc.prototype.getClass=function(){return Pc},Mc.prototype=new mc,Lc.prototype=new Mc,Lc.prototype.contains=function(t){for(var e=0,n=this.array_.length;e<n;e++){if(0===this.array_[e].compareTo(t))return!0}return!1},Lc.prototype.add=function(t){if(this.contains(t))return!1;for(var e=0,n=this.array_.length;e<n;e++){if(1===this.array_[e].compareTo(t))return this.array_.splice(e,0,t),!0}return this.array_.push(t),!0},Lc.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next());return!0},Lc.prototype.remove=function(t){throw new _c},Lc.prototype.size=function(){return this.array_.length},Lc.prototype.isEmpty=function(){return 0===this.array_.length},Lc.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e<n;e++)t.push(this.array_[e]);return t},Lc.prototype.iterator=function(){return new Oc(this)};var Oc=function(t){this.treeSet_=t,this.position_=0};Oc.prototype.next=function(){if(this.position_===this.treeSet_.size())throw new uc;return this.treeSet_.array_[this.position_++]},Oc.prototype.hasNext=function(){return this.position_<this.treeSet_.size()},Oc.prototype.remove=function(){throw new _c};var Rc=function(){};Rc.sort=function(){var t,e,n,r,i=arguments[0];if(1===arguments.length)r=function(t,e){return t.compareTo(e)},i.sort(r);else if(2===arguments.length)n=arguments[1],r=function(t,e){return n.compare(t,e)},i.sort(r);else if(3===arguments.length){(e=i.slice(arguments[1],arguments[2])).sort();var o=i.slice(0,arguments[1]).concat(e,i.slice(arguments[2],i.length));for(i.splice(0,i.length),t=0;t<o.length;t++)i.push(o[t])}else if(4===arguments.length)for(e=i.slice(arguments[1],arguments[2]),n=arguments[3],r=function(t,e){return n.compare(t,e)},e.sort(r),o=i.slice(0,arguments[1]).concat(e,i.slice(arguments[2],i.length)),i.splice(0,i.length),t=0;t<o.length;t++)i.push(o[t])},Rc.asList=function(t){for(var e=new lc,n=0,r=t.length;n<r;n++)e.add(t[n]);return e};var Tc=function(){},Ac={P:{configurable:!0},L:{configurable:!0},A:{configurable:!0},FALSE:{configurable:!0},TRUE:{configurable:!0},DONTCARE:{configurable:!0},SYM_FALSE:{configurable:!0},SYM_TRUE:{configurable:!0},SYM_DONTCARE:{configurable:!0},SYM_P:{configurable:!0},SYM_L:{configurable:!0},SYM_A:{configurable:!0}};Ac.P.get=function(){return 0},Ac.L.get=function(){return 1},Ac.A.get=function(){return 2},Ac.FALSE.get=function(){return-1},Ac.TRUE.get=function(){return-2},Ac.DONTCARE.get=function(){return-3},Ac.SYM_FALSE.get=function(){return"F"},Ac.SYM_TRUE.get=function(){return"T"},Ac.SYM_DONTCARE.get=function(){return"*"},Ac.SYM_P.get=function(){return"0"},Ac.SYM_L.get=function(){return"1"},Ac.SYM_A.get=function(){return"2"},Tc.prototype.interfaces_=function(){return[]},Tc.prototype.getClass=function(){return Tc},Tc.toDimensionSymbol=function(t){switch(t){case Tc.FALSE:return Tc.SYM_FALSE;case Tc.TRUE:return Tc.SYM_TRUE;case Tc.DONTCARE:return Tc.SYM_DONTCARE;case Tc.P:return Tc.SYM_P;case Tc.L:return Tc.SYM_L;case Tc.A:return Tc.SYM_A}throw new el("Unknown dimension value: "+t)},Tc.toDimensionValue=function(t){switch(ml.toUpperCase(t)){case Tc.SYM_FALSE:return Tc.FALSE;case Tc.SYM_TRUE:return Tc.TRUE;case Tc.SYM_DONTCARE:return Tc.DONTCARE;case Tc.SYM_P:return Tc.P;case Tc.SYM_L:return Tc.L;case Tc.SYM_A:return Tc.A}throw new el("Unknown dimension symbol: "+t)},Object.defineProperties(Tc,Ac);var Dc=function(){};Dc.prototype.filter=function(t){},Dc.prototype.interfaces_=function(){return[]},Dc.prototype.getClass=function(){return Dc};var Fc=function(){};Fc.prototype.filter=function(t,e){},Fc.prototype.isDone=function(){},Fc.prototype.isGeometryChanged=function(){},Fc.prototype.interfaces_=function(){return[]},Fc.prototype.getClass=function(){return Fc};var kc=function(t){function e(e,n){if(t.call(this,n),this._geometries=e||[],t.hasNullElements(this._geometries))throw new el("geometries must not contain null elements")}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.computeEnvelopeInternal=function(){for(var t=new Ll,e=0;e<this._geometries.length;e++)t.expandToInclude(this._geometries[e].getEnvelopeInternal());return t},e.prototype.getGeometryN=function(t){return this._geometries[t]},e.prototype.getSortIndex=function(){return t.SORTINDEX_GEOMETRYCOLLECTION},e.prototype.getCoordinates=function(){for(var t=new Array(this.getNumPoints()).fill(null),e=-1,n=0;n<this._geometries.length;n++)for(var r=this._geometries[n].getCoordinates(),i=0;i<r.length;i++)t[++e]=r[i];return t},e.prototype.getArea=function(){for(var t=0,e=0;e<this._geometries.length;e++)t+=this._geometries[e].getArea();return t},e.prototype.equalsExact=function(){var e=this;if(2===arguments.length){var n=arguments[0],r=arguments[1];if(!this.isEquivalentClass(n))return!1;var i=n;if(this._geometries.length!==i._geometries.length)return!1;for(var o=0;o<this._geometries.length;o++)if(!e._geometries[o].equalsExact(i._geometries[o],r))return!1;return!0}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.normalize=function(){for(var t=0;t<this._geometries.length;t++)this._geometries[t].normalize();Rc.sort(this._geometries)},e.prototype.getCoordinate=function(){return this.isEmpty()?null:this._geometries[0].getCoordinate()},e.prototype.getBoundaryDimension=function(){for(var t=Tc.FALSE,e=0;e<this._geometries.length;e++)t=Math.max(t,this._geometries[e].getBoundaryDimension());return t},e.prototype.getDimension=function(){for(var t=Tc.FALSE,e=0;e<this._geometries.length;e++)t=Math.max(t,this._geometries[e].getDimension());return t},e.prototype.getLength=function(){for(var t=0,e=0;e<this._geometries.length;e++)t+=this._geometries[e].getLength();return t},e.prototype.getNumPoints=function(){for(var t=0,e=0;e<this._geometries.length;e++)t+=this._geometries[e].getNumPoints();return t},e.prototype.getNumGeometries=function(){return this._geometries.length},e.prototype.reverse=function(){for(var t=this._geometries.length,e=new Array(t).fill(null),n=0;n<this._geometries.length;n++)e[n]=this._geometries[n].reverse();return this.getFactory().createGeometryCollection(e)},e.prototype.compareToSameClass=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=new Lc(Rc.asList(this._geometries)),r=new Lc(Rc.asList(e._geometries));return this.compare(n,r)}if(2===arguments.length){for(var i=arguments[0],o=arguments[1],s=i,a=this.getNumGeometries(),u=s.getNumGeometries(),l=0;l<a&&l<u;){var c=t.getGeometryN(l),h=s.getGeometryN(l),p=c.compareToSameClass(h,o);if(0!==p)return p;l++}return l<a?1:l<u?-1:0}},e.prototype.apply=function(){var t=this;if(gl(arguments[0],Kl))for(var e=arguments[0],n=0;n<this._geometries.length;n++)t._geometries[n].apply(e);else if(gl(arguments[0],Fc)){var r=arguments[0];if(0===this._geometries.length)return null;for(var i=0;i<this._geometries.length&&(t._geometries[i].apply(r),!r.isDone());i++);r.isGeometryChanged()&&this.geometryChanged()}else if(gl(arguments[0],Dc)){var o=arguments[0];o.filter(this);for(var s=0;s<this._geometries.length;s++)t._geometries[s].apply(o)}else if(gl(arguments[0],Hl)){var a=arguments[0];a.filter(this);for(var u=0;u<this._geometries.length;u++)t._geometries[u].apply(a)}},e.prototype.getBoundary=function(){return this.checkNotGeometryCollection(this),ql.shouldNeverReachHere(),null},e.prototype.clone=function(){var e=t.prototype.clone.call(this);e._geometries=new Array(this._geometries.length).fill(null);for(var n=0;n<this._geometries.length;n++)e._geometries[n]=this._geometries[n].clone();return e},e.prototype.getGeometryType=function(){return"GeometryCollection"},e.prototype.copy=function(){for(var t=new Array(this._geometries.length).fill(null),n=0;n<t.length;n++)t[n]=this._geometries[n].copy();return new e(t,this._factory)},e.prototype.isEmpty=function(){for(var t=0;t<this._geometries.length;t++)if(!this._geometries[t].isEmpty())return!1;return!0},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return-0x4f07bcb1f857d800},Object.defineProperties(e,n),e}(Wl),Gc=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.getSortIndex=function(){return Wl.SORTINDEX_MULTILINESTRING},e.prototype.equalsExact=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!this.isEquivalentClass(e)&&t.prototype.equalsExact.call(this,e,n)}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.getBoundaryDimension=function(){return this.isClosed()?Tc.FALSE:0},e.prototype.isClosed=function(){if(this.isEmpty())return!1;for(var t=0;t<this._geometries.length;t++)if(!this._geometries[t].isClosed())return!1;return!0},e.prototype.getDimension=function(){return 1},e.prototype.reverse=function(){for(var t=this._geometries.length,e=new Array(t).fill(null),n=0;n<this._geometries.length;n++)e[t-1-n]=this._geometries[n].reverse();return this.getFactory().createMultiLineString(e)},e.prototype.getBoundary=function(){return new qc(this).getBoundary()},e.prototype.getGeometryType=function(){return"MultiLineString"},e.prototype.copy=function(){for(var t=new Array(this._geometries.length).fill(null),n=0;n<t.length;n++)t[n]=this._geometries[n].copy();return new e(t,this._factory)},e.prototype.interfaces_=function(){return[Pc]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return 0x7155d2ab4afa8000},Object.defineProperties(e,n),e}(kc),qc=function(){if(this._geom=null,this._geomFact=null,this._bnRule=null,this._endpointMap=null,1===arguments.length){var t=arguments[0],e=Ql.MOD2_BOUNDARY_RULE;this._geom=t,this._geomFact=t.getFactory(),this._bnRule=e}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this._geom=n,this._geomFact=n.getFactory(),this._bnRule=r}};qc.prototype.boundaryMultiLineString=function(t){if(this._geom.isEmpty())return this.getEmptyMultiPoint();var e=this.computeBoundaryCoordinates(t);return 1===e.length?this._geomFact.createPoint(e[0]):this._geomFact.createMultiPointFromCoords(e)},qc.prototype.getBoundary=function(){return this._geom instanceof Zc?this.boundaryLineString(this._geom):this._geom instanceof Gc?this.boundaryMultiLineString(this._geom):this._geom.getBoundary()},qc.prototype.boundaryLineString=function(t){return this._geom.isEmpty()?this.getEmptyMultiPoint():t.isClosed()?this._bnRule.isInBoundary(2)?t.getStartPoint():this._geomFact.createMultiPoint():this._geomFact.createMultiPoint([t.getStartPoint(),t.getEndPoint()])},qc.prototype.getEmptyMultiPoint=function(){return this._geomFact.createMultiPoint()},qc.prototype.computeBoundaryCoordinates=function(t){var e=this,n=new lc;this._endpointMap=new Cc;for(var r=0;r<t.getNumGeometries();r++){var i=t.getGeometryN(r);0!==i.getNumPoints()&&(e.addEndpoint(i.getCoordinateN(0)),e.addEndpoint(i.getCoordinateN(i.getNumPoints()-1)))}for(var o=this._endpointMap.entrySet().iterator();o.hasNext();){var s=o.next(),a=s.getValue().count;e._bnRule.isInBoundary(a)&&n.add(s.getKey())}return pc.toCoordinateArray(n)},qc.prototype.addEndpoint=function(t){var e=this._endpointMap.get(t);null===e&&(e=new Bc,this._endpointMap.put(t,e)),e.count++},qc.prototype.interfaces_=function(){return[]},qc.prototype.getClass=function(){return qc},qc.getBoundary=function(){if(1===arguments.length){var t=arguments[0],e=new qc(t);return e.getBoundary()}if(2===arguments.length){var n=arguments[0],r=arguments[1],i=new qc(n,r);return i.getBoundary()}};var Bc=function(){this.count=null};function zc(){}function jc(){}Bc.prototype.interfaces_=function(){return[]},Bc.prototype.getClass=function(){return Bc};var Uc=function(){};function Vc(){}function Xc(){}function Yc(){}var Hc=function(){},Wc={NEWLINE:{configurable:!0},SIMPLE_ORDINATE_FORMAT:{configurable:!0}};Hc.prototype.interfaces_=function(){return[]},Hc.prototype.getClass=function(){return Hc},Hc.chars=function(t,e){for(var n=new Array(e).fill(null),r=0;r<e;r++)n[r]=t;return String(n)},Hc.getStackTrace=function(){if(1===arguments.length){var t=arguments[0],e=new Vc,n=new zc(e);return t.printStackTrace(n),e.toString()}if(2===arguments.length){for(var r=arguments[0],i=arguments[1],o="",s=new jc(Hc.getStackTrace(r)),a=new Yc(s),u=0;u<i;u++)try{o+=a.readLine()+Hc.NEWLINE}catch(t){if(!(t instanceof Xc))throw t;ql.shouldNeverReachHere()}return o}},Hc.split=function(t,e){for(var n=e.length,r=new lc,i=""+t,o=i.indexOf(e);o>=0;){var s=i.substring(0,o);r.add(s),o=(i=i.substring(o+n)).indexOf(e)}i.length>0&&r.add(i);for(var a=new Array(r.size()).fill(null),u=0;u<a.length;u++)a[u]=r.get(u);return a},Hc.toString=function(){if(1===arguments.length){var t=arguments[0];return Hc.SIMPLE_ORDINATE_FORMAT.format(t)}},Hc.spaces=function(t){return Hc.chars(" ",t)},Wc.NEWLINE.get=function(){return Pl.getProperty("line.separator")},Wc.SIMPLE_ORDINATE_FORMAT.get=function(){return new Uc("0.#")},Object.defineProperties(Hc,Wc);var Jc=function(){};Jc.prototype.interfaces_=function(){return[]},Jc.prototype.getClass=function(){return Jc},Jc.copyCoord=function(t,e,n,r){for(var i=Math.min(t.getDimension(),n.getDimension()),o=0;o<i;o++)n.setOrdinate(r,o,t.getOrdinate(e,o))},Jc.isRing=function(t){var e=t.size();return 0===e||!(e<=3)&&(t.getOrdinate(0,Il.X)===t.getOrdinate(e-1,Il.X)&&t.getOrdinate(0,Il.Y)===t.getOrdinate(e-1,Il.Y))},Jc.isEqual=function(t,e){var n=t.size();if(n!==e.size())return!1;for(var r=Math.min(t.getDimension(),e.getDimension()),i=0;i<n;i++)for(var o=0;o<r;o++){var s=t.getOrdinate(i,o),a=e.getOrdinate(i,o);if(t.getOrdinate(i,o)!==e.getOrdinate(i,o)&&(!nl.isNaN(s)||!nl.isNaN(a)))return!1}return!0},Jc.extend=function(t,e,n){var r=t.create(n,e.getDimension()),i=e.size();if(Jc.copy(e,0,r,0,i),i>0)for(var o=i;o<n;o++)Jc.copy(e,i-1,r,o,1);return r},Jc.reverse=function(t){for(var e=t.size()-1,n=Math.trunc(e/2),r=0;r<=n;r++)Jc.swap(t,r,e-r)},Jc.swap=function(t,e,n){if(e===n)return null;for(var r=0;r<t.getDimension();r++){var i=t.getOrdinate(e,r);t.setOrdinate(e,r,t.getOrdinate(n,r)),t.setOrdinate(n,r,i)}},Jc.copy=function(t,e,n,r,i){for(var o=0;o<i;o++)Jc.copyCoord(t,e+o,n,r+o)},Jc.toString=function(){if(1===arguments.length){var t=arguments[0],e=t.size();if(0===e)return"()";var n=t.getDimension(),r=new vl;r.append("(");for(var i=0;i<e;i++){i>0&&r.append(" ");for(var o=0;o<n;o++)o>0&&r.append(","),r.append(Hc.toString(t.getOrdinate(i,o)))}return r.append(")"),r.toString()}},Jc.ensureValidRing=function(t,e){var n=e.size();return 0===n?e:n<=3?Jc.createClosedRing(t,e,4):e.getOrdinate(0,Il.X)===e.getOrdinate(n-1,Il.X)&&e.getOrdinate(0,Il.Y)===e.getOrdinate(n-1,Il.Y)?e:Jc.createClosedRing(t,e,n+1)},Jc.createClosedRing=function(t,e,n){var r=t.create(n,e.getDimension()),i=e.size();Jc.copy(e,0,r,0,i);for(var o=i;o<n;o++)Jc.copy(e,0,r,o,1);return r};var Zc=function(t){function e(e,n){t.call(this,n),this._points=null,this.init(e)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.computeEnvelopeInternal=function(){return this.isEmpty()?new Ll:this._points.expandEnvelope(new Ll)},e.prototype.isRing=function(){return this.isClosed()&&this.isSimple()},e.prototype.getSortIndex=function(){return t.SORTINDEX_LINESTRING},e.prototype.getCoordinates=function(){return this._points.toCoordinateArray()},e.prototype.equalsExact=function(){var e=this;if(2===arguments.length){var n=arguments[0],r=arguments[1];if(!this.isEquivalentClass(n))return!1;var i=n;if(this._points.size()!==i._points.size())return!1;for(var o=0;o<this._points.size();o++)if(!e.equal(e._points.getCoordinate(o),i._points.getCoordinate(o),r))return!1;return!0}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.normalize=function(){for(var t=this,e=0;e<Math.trunc(this._points.size()/2);e++){var n=t._points.size()-1-e;if(!t._points.getCoordinate(e).equals(t._points.getCoordinate(n)))return t._points.getCoordinate(e).compareTo(t._points.getCoordinate(n))>0&&Jc.reverse(t._points),null}},e.prototype.getCoordinate=function(){return this.isEmpty()?null:this._points.getCoordinate(0)},e.prototype.getBoundaryDimension=function(){return this.isClosed()?Tc.FALSE:0},e.prototype.isClosed=function(){return!this.isEmpty()&&this.getCoordinateN(0).equals2D(this.getCoordinateN(this.getNumPoints()-1))},e.prototype.getEndPoint=function(){return this.isEmpty()?null:this.getPointN(this.getNumPoints()-1)},e.prototype.getDimension=function(){return 1},e.prototype.getLength=function(){return Xl.computeLength(this._points)},e.prototype.getNumPoints=function(){return this._points.size()},e.prototype.reverse=function(){var t=this._points.copy();return Jc.reverse(t),this.getFactory().createLineString(t)},e.prototype.compareToSameClass=function(){var t=this;if(1===arguments.length){for(var e=arguments[0],n=e,r=0,i=0;r<this._points.size()&&i<n._points.size();){var o=t._points.getCoordinate(r).compareTo(n._points.getCoordinate(i));if(0!==o)return o;r++,i++}return r<this._points.size()?1:i<n._points.size()?-1:0}if(2===arguments.length){var s=arguments[0],a=arguments[1],u=s;return a.compare(this._points,u._points)}},e.prototype.apply=function(){var t=this;if(gl(arguments[0],Kl))for(var e=arguments[0],n=0;n<this._points.size();n++)e.filter(t._points.getCoordinate(n));else if(gl(arguments[0],Fc)){var r=arguments[0];if(0===this._points.size())return null;for(var i=0;i<this._points.size()&&(r.filter(t._points,i),!r.isDone());i++);r.isGeometryChanged()&&this.geometryChanged()}else if(gl(arguments[0],Dc)){var o=arguments[0];o.filter(this)}else if(gl(arguments[0],Hl)){var s=arguments[0];s.filter(this)}},e.prototype.getBoundary=function(){return new qc(this).getBoundary()},e.prototype.isEquivalentClass=function(t){return t instanceof e},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e._points=this._points.clone(),e},e.prototype.getCoordinateN=function(t){return this._points.getCoordinate(t)},e.prototype.getGeometryType=function(){return"LineString"},e.prototype.copy=function(){return new e(this._points.copy(),this._factory)},e.prototype.getCoordinateSequence=function(){return this._points},e.prototype.isEmpty=function(){return 0===this._points.size()},e.prototype.init=function(t){if(null===t&&(t=this.getFactory().getCoordinateSequenceFactory().create([])),1===t.size())throw new el("Invalid number of points in LineString (found "+t.size()+" - must be 0 or >= 2)");this._points=t},e.prototype.isCoordinate=function(t){for(var e=0;e<this._points.size();e++)if(this._points.getCoordinate(e).equals(t))return!0;return!1},e.prototype.getStartPoint=function(){return this.isEmpty()?null:this.getPointN(0)},e.prototype.getPointN=function(t){return this.getFactory().createPoint(this._points.getCoordinate(t))},e.prototype.interfaces_=function(){return[Pc]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return 0x2b2b51ba435c8e00},Object.defineProperties(e,n),e}(Wl),Kc=function(){};Kc.prototype.interfaces_=function(){return[]},Kc.prototype.getClass=function(){return Kc};var Qc=function(t){function e(e,n){t.call(this,n),this._coordinates=e||null,this.init(this._coordinates)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.computeEnvelopeInternal=function(){if(this.isEmpty())return new Ll;var t=new Ll;return t.expandToInclude(this._coordinates.getX(0),this._coordinates.getY(0)),t},e.prototype.getSortIndex=function(){return t.SORTINDEX_POINT},e.prototype.getCoordinates=function(){return this.isEmpty()?[]:[this.getCoordinate()]},e.prototype.equalsExact=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!this.isEquivalentClass(e)&&(!(!this.isEmpty()||!e.isEmpty())||this.isEmpty()===e.isEmpty()&&this.equal(e.getCoordinate(),this.getCoordinate(),n))}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.normalize=function(){},e.prototype.getCoordinate=function(){return 0!==this._coordinates.size()?this._coordinates.getCoordinate(0):null},e.prototype.getBoundaryDimension=function(){return Tc.FALSE},e.prototype.getDimension=function(){return 0},e.prototype.getNumPoints=function(){return this.isEmpty()?0:1},e.prototype.reverse=function(){return this.copy()},e.prototype.getX=function(){if(null===this.getCoordinate())throw new Error("getX called on empty Point");return this.getCoordinate().x},e.prototype.compareToSameClass=function(){if(1===arguments.length){var t=arguments[0],e=t;return this.getCoordinate().compareTo(e.getCoordinate())}if(2===arguments.length){var n=arguments[0],r=arguments[1],i=n;return r.compare(this._coordinates,i._coordinates)}},e.prototype.apply=function(){if(gl(arguments[0],Kl)){var t=arguments[0];if(this.isEmpty())return null;t.filter(this.getCoordinate())}else if(gl(arguments[0],Fc)){var e=arguments[0];if(this.isEmpty())return null;e.filter(this._coordinates,0),e.isGeometryChanged()&&this.geometryChanged()}else if(gl(arguments[0],Dc)){var n=arguments[0];n.filter(this)}else if(gl(arguments[0],Hl)){var r=arguments[0];r.filter(this)}},e.prototype.getBoundary=function(){return this.getFactory().createGeometryCollection(null)},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e._coordinates=this._coordinates.clone(),e},e.prototype.getGeometryType=function(){return"Point"},e.prototype.copy=function(){return new e(this._coordinates.copy(),this._factory)},e.prototype.getCoordinateSequence=function(){return this._coordinates},e.prototype.getY=function(){if(null===this.getCoordinate())throw new Error("getY called on empty Point");return this.getCoordinate().y},e.prototype.isEmpty=function(){return 0===this._coordinates.size()},e.prototype.init=function(t){null===t&&(t=this.getFactory().getCoordinateSequenceFactory().create([])),ql.isTrue(t.size()<=1),this._coordinates=t},e.prototype.isSimple=function(){return!0},e.prototype.interfaces_=function(){return[Kc]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return 0x44077bad161cbc00},Object.defineProperties(e,n),e}(Wl),$c=function(){};$c.prototype.interfaces_=function(){return[]},$c.prototype.getClass=function(){return $c};var th=function(t){function e(e,n,r){if(t.call(this,r),this._shell=null,this._holes=null,null===e&&(e=this.getFactory().createLinearRing()),null===n&&(n=[]),t.hasNullElements(n))throw new el("holes must not contain null elements");if(e.isEmpty()&&t.hasNonEmptyElements(n))throw new el("shell is empty but holes are not");this._shell=e,this._holes=n}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.computeEnvelopeInternal=function(){return this._shell.getEnvelopeInternal()},e.prototype.getSortIndex=function(){return t.SORTINDEX_POLYGON},e.prototype.getCoordinates=function(){if(this.isEmpty())return[];for(var t=new Array(this.getNumPoints()).fill(null),e=-1,n=this._shell.getCoordinates(),r=0;r<n.length;r++)t[++e]=n[r];for(var i=0;i<this._holes.length;i++)for(var o=this._holes[i].getCoordinates(),s=0;s<o.length;s++)t[++e]=o[s];return t},e.prototype.getArea=function(){var t=0;t+=Math.abs(Xl.signedArea(this._shell.getCoordinateSequence()));for(var e=0;e<this._holes.length;e++)t-=Math.abs(Xl.signedArea(this._holes[e].getCoordinateSequence()));return t},e.prototype.isRectangle=function(){if(0!==this.getNumInteriorRing())return!1;if(null===this._shell)return!1;if(5!==this._shell.getNumPoints())return!1;for(var t=this._shell.getCoordinateSequence(),e=this.getEnvelopeInternal(),n=0;n<5;n++){var r=t.getX(n);if(r!==e.getMinX()&&r!==e.getMaxX())return!1;var i=t.getY(n);if(i!==e.getMinY()&&i!==e.getMaxY())return!1}for(var o=t.getX(0),s=t.getY(0),a=1;a<=4;a++){var u=t.getX(a),l=t.getY(a);if(u!==o===(l!==s))return!1;o=u,s=l}return!0},e.prototype.equalsExact=function(){var e=this;if(2===arguments.length){var n=arguments[0],r=arguments[1];if(!this.isEquivalentClass(n))return!1;var i=n,o=this._shell,s=i._shell;if(!o.equalsExact(s,r))return!1;if(this._holes.length!==i._holes.length)return!1;for(var a=0;a<this._holes.length;a++)if(!e._holes[a].equalsExact(i._holes[a],r))return!1;return!0}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.normalize=function(){var t=this;if(0===arguments.length){this.normalize(this._shell,!0);for(var e=0;e<this._holes.length;e++)t.normalize(t._holes[e],!1);Rc.sort(this._holes)}else if(2===arguments.length){var n=arguments[0],r=arguments[1];if(n.isEmpty())return null;var i=new Array(n.getCoordinates().length-1).fill(null);Pl.arraycopy(n.getCoordinates(),0,i,0,i.length);var o=pc.minCoordinate(n.getCoordinates());pc.scroll(i,o),Pl.arraycopy(i,0,n.getCoordinates(),0,i.length),n.getCoordinates()[i.length]=i[0],Xl.isCCW(n.getCoordinates())===r&&pc.reverse(n.getCoordinates())}},e.prototype.getCoordinate=function(){return this._shell.getCoordinate()},e.prototype.getNumInteriorRing=function(){return this._holes.length},e.prototype.getBoundaryDimension=function(){return 1},e.prototype.getDimension=function(){return 2},e.prototype.getLength=function(){var t=0;t+=this._shell.getLength();for(var e=0;e<this._holes.length;e++)t+=this._holes[e].getLength();return t},e.prototype.getNumPoints=function(){for(var t=this._shell.getNumPoints(),e=0;e<this._holes.length;e++)t+=this._holes[e].getNumPoints();return t},e.prototype.reverse=function(){var t=this.copy();t._shell=this._shell.copy().reverse(),t._holes=new Array(this._holes.length).fill(null);for(var e=0;e<this._holes.length;e++)t._holes[e]=this._holes[e].copy().reverse();return t},e.prototype.convexHull=function(){return this.getExteriorRing().convexHull()},e.prototype.compareToSameClass=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=this._shell,r=e._shell;return n.compareToSameClass(r)}if(2===arguments.length){var i=arguments[0],o=arguments[1],s=i,a=this._shell,u=s._shell,l=a.compareToSameClass(u,o);if(0!==l)return l;for(var c=this.getNumInteriorRing(),h=s.getNumInteriorRing(),p=0;p<c&&p<h;){var f=t.getInteriorRingN(p),g=s.getInteriorRingN(p),d=f.compareToSameClass(g,o);if(0!==d)return d;p++}return p<c?1:p<h?-1:0}},e.prototype.apply=function(t){var e=this;if(gl(t,Kl)){this._shell.apply(t);for(var n=0;n<this._holes.length;n++)e._holes[n].apply(t)}else if(gl(t,Fc)){if(this._shell.apply(t),!t.isDone())for(var r=0;r<this._holes.length&&(e._holes[r].apply(t),!t.isDone());r++);t.isGeometryChanged()&&this.geometryChanged()}else if(gl(t,Dc))t.filter(this);else if(gl(t,Hl)){t.filter(this),this._shell.apply(t);for(var i=0;i<this._holes.length;i++)e._holes[i].apply(t)}},e.prototype.getBoundary=function(){if(this.isEmpty())return this.getFactory().createMultiLineString();var t=new Array(this._holes.length+1).fill(null);t[0]=this._shell;for(var e=0;e<this._holes.length;e++)t[e+1]=this._holes[e];return t.length<=1?this.getFactory().createLinearRing(t[0].getCoordinateSequence()):this.getFactory().createMultiLineString(t)},e.prototype.clone=function(){var e=t.prototype.clone.call(this);e._shell=this._shell.clone(),e._holes=new Array(this._holes.length).fill(null);for(var n=0;n<this._holes.length;n++)e._holes[n]=this._holes[n].clone();return e},e.prototype.getGeometryType=function(){return"Polygon"},e.prototype.copy=function(){for(var t=this._shell.copy(),n=new Array(this._holes.length).fill(null),r=0;r<n.length;r++)n[r]=this._holes[r].copy();return new e(t,n,this._factory)},e.prototype.getExteriorRing=function(){return this._shell},e.prototype.isEmpty=function(){return this._shell.isEmpty()},e.prototype.getInteriorRingN=function(t){return this._holes[t]},e.prototype.interfaces_=function(){return[$c]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return-0x307ffefd8dc97200},Object.defineProperties(e,n),e}(Wl),eh=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.getSortIndex=function(){return Wl.SORTINDEX_MULTIPOINT},e.prototype.isValid=function(){return!0},e.prototype.equalsExact=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!this.isEquivalentClass(e)&&t.prototype.equalsExact.call(this,e,n)}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.getCoordinate=function(){if(1===arguments.length){var e=arguments[0];return this._geometries[e].getCoordinate()}return t.prototype.getCoordinate.apply(this,arguments)},e.prototype.getBoundaryDimension=function(){return Tc.FALSE},e.prototype.getDimension=function(){return 0},e.prototype.getBoundary=function(){return this.getFactory().createGeometryCollection(null)},e.prototype.getGeometryType=function(){return"MultiPoint"},e.prototype.copy=function(){for(var t=new Array(this._geometries.length).fill(null),n=0;n<t.length;n++)t[n]=this._geometries[n].copy();return new e(t,this._factory)},e.prototype.interfaces_=function(){return[Kc]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return-0x6fb1ed4162e0fc00},Object.defineProperties(e,n),e}(kc),nh=function(t){function e(e,n){e instanceof ul&&n instanceof _h&&(e=n.getCoordinateSequenceFactory().create(e)),t.call(this,e,n),this.validateConstruction()}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={MINIMUM_VALID_SIZE:{configurable:!0},serialVersionUID:{configurable:!0}};return e.prototype.getSortIndex=function(){return Wl.SORTINDEX_LINEARRING},e.prototype.getBoundaryDimension=function(){return Tc.FALSE},e.prototype.isClosed=function(){return!!this.isEmpty()||t.prototype.isClosed.call(this)},e.prototype.reverse=function(){var t=this._points.copy();return Jc.reverse(t),this.getFactory().createLinearRing(t)},e.prototype.validateConstruction=function(){if(!this.isEmpty()&&!t.prototype.isClosed.call(this))throw new el("Points of LinearRing do not form a closed linestring");if(this.getCoordinateSequence().size()>=1&&this.getCoordinateSequence().size()<e.MINIMUM_VALID_SIZE)throw new el("Invalid number of points in LinearRing (found "+this.getCoordinateSequence().size()+" - must be 0 or >= 4)")},e.prototype.getGeometryType=function(){return"LinearRing"},e.prototype.copy=function(){return new e(this._points.copy(),this._factory)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},n.MINIMUM_VALID_SIZE.get=function(){return 4},n.serialVersionUID.get=function(){return-0x3b229e262367a600},Object.defineProperties(e,n),e}(Zc),rh=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.getSortIndex=function(){return Wl.SORTINDEX_MULTIPOLYGON},e.prototype.equalsExact=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!this.isEquivalentClass(e)&&t.prototype.equalsExact.call(this,e,n)}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.getBoundaryDimension=function(){return 1},e.prototype.getDimension=function(){return 2},e.prototype.reverse=function(){for(var t=this._geometries.length,e=new Array(t).fill(null),n=0;n<this._geometries.length;n++)e[n]=this._geometries[n].reverse();return this.getFactory().createMultiPolygon(e)},e.prototype.getBoundary=function(){if(this.isEmpty())return this.getFactory().createMultiLineString();for(var t=new lc,e=0;e<this._geometries.length;e++)for(var n=this._geometries[e].getBoundary(),r=0;r<n.getNumGeometries();r++)t.add(n.getGeometryN(r));var i=new Array(t.size()).fill(null);return this.getFactory().createMultiLineString(t.toArray(i))},e.prototype.getGeometryType=function(){return"MultiPolygon"},e.prototype.copy=function(){for(var t=new Array(this._geometries.length).fill(null),n=0;n<t.length;n++)t[n]=this._geometries[n].copy();return new e(t,this._factory)},e.prototype.interfaces_=function(){return[$c]},e.prototype.getClass=function(){return e},n.serialVersionUID.get=function(){return-0x7a5aa1369171980},Object.defineProperties(e,n),e}(kc),ih=function(t){this._factory=t||null,this._isUserDataCopied=!1},oh={NoOpGeometryOperation:{configurable:!0},CoordinateOperation:{configurable:!0},CoordinateSequenceOperation:{configurable:!0}};ih.prototype.setCopyUserData=function(t){this._isUserDataCopied=t},ih.prototype.edit=function(t,e){if(null===t)return null;var n=this.editInternal(t,e);return this._isUserDataCopied&&n.setUserData(t.getUserData()),n},ih.prototype.editInternal=function(t,e){return null===this._factory&&(this._factory=t.getFactory()),t instanceof kc?this.editGeometryCollection(t,e):t instanceof th?this.editPolygon(t,e):t instanceof Qc||t instanceof Zc?e.edit(t,this._factory):(ql.shouldNeverReachHere("Unsupported Geometry class: "+t.getClass().getName()),null)},ih.prototype.editGeometryCollection=function(t,e){for(var n=e.edit(t,this._factory),r=new lc,i=0;i<n.getNumGeometries();i++){var o=this.edit(n.getGeometryN(i),e);null===o||o.isEmpty()||r.add(o)}return n.getClass()===eh?this._factory.createMultiPoint(r.toArray([])):n.getClass()===Gc?this._factory.createMultiLineString(r.toArray([])):n.getClass()===rh?this._factory.createMultiPolygon(r.toArray([])):this._factory.createGeometryCollection(r.toArray([]))},ih.prototype.editPolygon=function(t,e){var n=e.edit(t,this._factory);if(null===n&&(n=this._factory.createPolygon(null)),n.isEmpty())return n;var r=this.edit(n.getExteriorRing(),e);if(null===r||r.isEmpty())return this._factory.createPolygon();for(var i=new lc,o=0;o<n.getNumInteriorRing();o++){var s=this.edit(n.getInteriorRingN(o),e);null===s||s.isEmpty()||i.add(s)}return this._factory.createPolygon(r,i.toArray([]))},ih.prototype.interfaces_=function(){return[]},ih.prototype.getClass=function(){return ih},ih.GeometryEditorOperation=function(){},oh.NoOpGeometryOperation.get=function(){return sh},oh.CoordinateOperation.get=function(){return ah},oh.CoordinateSequenceOperation.get=function(){return uh},Object.defineProperties(ih,oh);var sh=function(){};sh.prototype.edit=function(t,e){return t},sh.prototype.interfaces_=function(){return[ih.GeometryEditorOperation]},sh.prototype.getClass=function(){return sh};var ah=function(){};ah.prototype.edit=function(t,e){var n=this.editCoordinates(t.getCoordinates(),t);return null===n?t:t instanceof nh?e.createLinearRing(n):t instanceof Zc?e.createLineString(n):t instanceof Qc?n.length>0?e.createPoint(n[0]):e.createPoint():t},ah.prototype.interfaces_=function(){return[ih.GeometryEditorOperation]},ah.prototype.getClass=function(){return ah};var uh=function(){};uh.prototype.edit=function(t,e){return t instanceof nh?e.createLinearRing(this.edit(t.getCoordinateSequence(),t)):t instanceof Zc?e.createLineString(this.edit(t.getCoordinateSequence(),t)):t instanceof Qc?e.createPoint(this.edit(t.getCoordinateSequence(),t)):t},uh.prototype.interfaces_=function(){return[ih.GeometryEditorOperation]},uh.prototype.getClass=function(){return uh};var lh=function(){var t=this;if(this._dimension=3,this._coordinates=null,1===arguments.length){if(arguments[0]instanceof Array)this._coordinates=arguments[0],this._dimension=3;else if(Number.isInteger(arguments[0])){var e=arguments[0];this._coordinates=new Array(e).fill(null);for(var n=0;n<e;n++)t._coordinates[n]=new ul}else if(gl(arguments[0],Il)){var r=arguments[0];if(null===r)return this._coordinates=new Array(0).fill(null),null;this._dimension=r.getDimension(),this._coordinates=new Array(r.size()).fill(null);for(var i=0;i<this._coordinates.length;i++)t._coordinates[i]=r.getCoordinateCopy(i)}}else if(2===arguments.length)if(arguments[0]instanceof Array&&Number.isInteger(arguments[1])){var o=arguments[0],s=arguments[1];this._coordinates=o,this._dimension=s,null===o&&(this._coordinates=new Array(0).fill(null))}else if(Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){var a=arguments[0],u=arguments[1];this._coordinates=new Array(a).fill(null),this._dimension=u;for(var l=0;l<a;l++)t._coordinates[l]=new ul}},ch={serialVersionUID:{configurable:!0}};lh.prototype.setOrdinate=function(t,e,n){switch(e){case Il.X:this._coordinates[t].x=n;break;case Il.Y:this._coordinates[t].y=n;break;case Il.Z:this._coordinates[t].z=n;break;default:throw new el("invalid ordinateIndex")}},lh.prototype.size=function(){return this._coordinates.length},lh.prototype.getOrdinate=function(t,e){switch(e){case Il.X:return this._coordinates[t].x;case Il.Y:return this._coordinates[t].y;case Il.Z:return this._coordinates[t].z}return nl.NaN},lh.prototype.getCoordinate=function(){if(1===arguments.length){var t=arguments[0];return this._coordinates[t]}if(2===arguments.length){var e=arguments[0],n=arguments[1];n.x=this._coordinates[e].x,n.y=this._coordinates[e].y,n.z=this._coordinates[e].z}},lh.prototype.getCoordinateCopy=function(t){return new ul(this._coordinates[t])},lh.prototype.getDimension=function(){return this._dimension},lh.prototype.getX=function(t){return this._coordinates[t].x},lh.prototype.clone=function(){for(var t=new Array(this.size()).fill(null),e=0;e<this._coordinates.length;e++)t[e]=this._coordinates[e].clone();return new lh(t,this._dimension)},lh.prototype.expandEnvelope=function(t){for(var e=0;e<this._coordinates.length;e++)t.expandToInclude(this._coordinates[e]);return t},lh.prototype.copy=function(){for(var t=new Array(this.size()).fill(null),e=0;e<this._coordinates.length;e++)t[e]=this._coordinates[e].copy();return new lh(t,this._dimension)},lh.prototype.toString=function(){if(this._coordinates.length>0){var t=new vl(17*this._coordinates.length);t.append("("),t.append(this._coordinates[0]);for(var e=1;e<this._coordinates.length;e++)t.append(", "),t.append(this._coordinates[e]);return t.append(")"),t.toString()}return"()"},lh.prototype.getY=function(t){return this._coordinates[t].y},lh.prototype.toCoordinateArray=function(){return this._coordinates},lh.prototype.interfaces_=function(){return[Il,al]},lh.prototype.getClass=function(){return lh},ch.serialVersionUID.get=function(){return-0xcb44a778db18e00},Object.defineProperties(lh,ch);var hh=function(){},ph={serialVersionUID:{configurable:!0},instanceObject:{configurable:!0}};hh.prototype.readResolve=function(){return hh.instance()},hh.prototype.create=function(){if(1===arguments.length){if(arguments[0]instanceof Array){var t=arguments[0];return new lh(t)}if(gl(arguments[0],Il)){var e=arguments[0];return new lh(e)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return r>3&&(r=3),r<2?new lh(n):new lh(n,r)}},hh.prototype.interfaces_=function(){return[hl,al]},hh.prototype.getClass=function(){return hh},hh.instance=function(){return hh.instanceObject},ph.serialVersionUID.get=function(){return-0x38e49fa6cf6f2e00},ph.instanceObject.get=function(){return new hh},Object.defineProperties(hh,ph);var fh=function(t){function e(){t.call(this),this.map_=new Map}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return this.map_.get(t)||null},e.prototype.put=function(t,e){return this.map_.set(t,e),e},e.prototype.values=function(){for(var t=new lc,e=this.map_.values(),n=e.next();!n.done;)t.add(n.value),n=e.next();return t},e.prototype.entrySet=function(){var t=new xc;return this.map_.entries().forEach((function(e){return t.add(e)})),t},e.prototype.size=function(){return this.map_.size()},e}(yc),gh=function t(){if(this._modelType=null,this._scale=null,0===arguments.length)this._modelType=t.FLOATING;else if(1===arguments.length)if(arguments[0]instanceof yh){var e=arguments[0];this._modelType=e,e===t.FIXED&&this.setScale(1)}else if("number"==typeof arguments[0]){var n=arguments[0];this._modelType=t.FIXED,this.setScale(n)}else if(arguments[0]instanceof t){var r=arguments[0];this._modelType=r._modelType,this._scale=r._scale}},dh={serialVersionUID:{configurable:!0},maximumPreciseValue:{configurable:!0}};gh.prototype.equals=function(t){if(!(t instanceof gh))return!1;var e=t;return this._modelType===e._modelType&&this._scale===e._scale},gh.prototype.compareTo=function(t){var e=t,n=this.getMaximumSignificantDigits(),r=e.getMaximumSignificantDigits();return new _l(n).compareTo(new _l(r))},gh.prototype.getScale=function(){return this._scale},gh.prototype.isFloating=function(){return this._modelType===gh.FLOATING||this._modelType===gh.FLOATING_SINGLE},gh.prototype.getType=function(){return this._modelType},gh.prototype.toString=function(){var t="UNKNOWN";return this._modelType===gh.FLOATING?t="Floating":this._modelType===gh.FLOATING_SINGLE?t="Floating-Single":this._modelType===gh.FIXED&&(t="Fixed (Scale="+this.getScale()+")"),t},gh.prototype.makePrecise=function(){if("number"==typeof arguments[0]){var t=arguments[0];if(nl.isNaN(t))return t;if(this._modelType===gh.FLOATING_SINGLE){return t}return this._modelType===gh.FIXED?Math.round(t*this._scale)/this._scale:t}if(arguments[0]instanceof ul){var e=arguments[0];if(this._modelType===gh.FLOATING)return null;e.x=this.makePrecise(e.x),e.y=this.makePrecise(e.y)}},gh.prototype.getMaximumSignificantDigits=function(){var t=16;return this._modelType===gh.FLOATING?t=16:this._modelType===gh.FLOATING_SINGLE?t=6:this._modelType===gh.FIXED&&(t=1+Math.trunc(Math.ceil(Math.log(this.getScale())/Math.log(10)))),t},gh.prototype.setScale=function(t){this._scale=Math.abs(t)},gh.prototype.interfaces_=function(){return[al,il]},gh.prototype.getClass=function(){return gh},gh.mostPrecise=function(t,e){return t.compareTo(e)>=0?t:e},dh.serialVersionUID.get=function(){return 0x6bee6404e9a25c00},dh.maximumPreciseValue.get=function(){return 9007199254740992},Object.defineProperties(gh,dh);var yh=function t(e){this._name=e||null,t.nameToTypeMap.put(e,this)},vh={serialVersionUID:{configurable:!0},nameToTypeMap:{configurable:!0}};yh.prototype.readResolve=function(){return yh.nameToTypeMap.get(this._name)},yh.prototype.toString=function(){return this._name},yh.prototype.interfaces_=function(){return[al]},yh.prototype.getClass=function(){return yh},vh.serialVersionUID.get=function(){return-552860263173159e4},vh.nameToTypeMap.get=function(){return new fh},Object.defineProperties(yh,vh),gh.Type=yh,gh.FIXED=new yh("FIXED"),gh.FLOATING=new yh("FLOATING"),gh.FLOATING_SINGLE=new yh("FLOATING SINGLE");var _h=function t(){this._precisionModel=new gh,this._SRID=0,this._coordinateSequenceFactory=t.getDefaultCoordinateSequenceFactory(),0===arguments.length||(1===arguments.length?gl(arguments[0],hl)?this._coordinateSequenceFactory=arguments[0]:arguments[0]instanceof gh&&(this._precisionModel=arguments[0]):2===arguments.length?(this._precisionModel=arguments[0],this._SRID=arguments[1]):3===arguments.length&&(this._precisionModel=arguments[0],this._SRID=arguments[1],this._coordinateSequenceFactory=arguments[2]))},mh={serialVersionUID:{configurable:!0}};_h.prototype.toGeometry=function(t){return t.isNull()?this.createPoint(null):t.getMinX()===t.getMaxX()&&t.getMinY()===t.getMaxY()?this.createPoint(new ul(t.getMinX(),t.getMinY())):t.getMinX()===t.getMaxX()||t.getMinY()===t.getMaxY()?this.createLineString([new ul(t.getMinX(),t.getMinY()),new ul(t.getMaxX(),t.getMaxY())]):this.createPolygon(this.createLinearRing([new ul(t.getMinX(),t.getMinY()),new ul(t.getMinX(),t.getMaxY()),new ul(t.getMaxX(),t.getMaxY()),new ul(t.getMaxX(),t.getMinY()),new ul(t.getMinX(),t.getMinY())]),null)},_h.prototype.createLineString=function(t){return t?t instanceof Array?new Zc(this.getCoordinateSequenceFactory().create(t),this):gl(t,Il)?new Zc(t,this):void 0:new Zc(this.getCoordinateSequenceFactory().create([]),this)},_h.prototype.createMultiLineString=function(){if(0===arguments.length)return new Gc(null,this);if(1===arguments.length){var t=arguments[0];return new Gc(t,this)}},_h.prototype.buildGeometry=function(t){for(var e=null,n=!1,r=!1,i=t.iterator();i.hasNext();){var o=i.next(),s=o.getClass();null===e&&(e=s),s!==e&&(n=!0),o.isGeometryCollectionOrDerived()&&(r=!0)}if(null===e)return this.createGeometryCollection();if(n||r)return this.createGeometryCollection(_h.toGeometryArray(t));var a=t.iterator().next();if(t.size()>1){if(a instanceof th)return this.createMultiPolygon(_h.toPolygonArray(t));if(a instanceof Zc)return this.createMultiLineString(_h.toLineStringArray(t));if(a instanceof Qc)return this.createMultiPoint(_h.toPointArray(t));ql.shouldNeverReachHere("Unhandled class: "+a.getClass().getName())}return a},_h.prototype.createMultiPointFromCoords=function(t){return this.createMultiPoint(null!==t?this.getCoordinateSequenceFactory().create(t):null)},_h.prototype.createPoint=function(){if(0===arguments.length)return this.createPoint(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];return this.createPoint(null!==t?this.getCoordinateSequenceFactory().create([t]):null)}if(gl(arguments[0],Il)){var e=arguments[0];return new Qc(e,this)}}},_h.prototype.getCoordinateSequenceFactory=function(){return this._coordinateSequenceFactory},_h.prototype.createPolygon=function(){if(0===arguments.length)return new th(null,null,this);if(1===arguments.length){if(gl(arguments[0],Il)){var t=arguments[0];return this.createPolygon(this.createLinearRing(t))}if(arguments[0]instanceof Array){var e=arguments[0];return this.createPolygon(this.createLinearRing(e))}if(arguments[0]instanceof nh){var n=arguments[0];return this.createPolygon(n,null)}}else if(2===arguments.length){var r=arguments[0],i=arguments[1];return new th(r,i,this)}},_h.prototype.getSRID=function(){return this._SRID},_h.prototype.createGeometryCollection=function(){if(0===arguments.length)return new kc(null,this);if(1===arguments.length){var t=arguments[0];return new kc(t,this)}},_h.prototype.createGeometry=function(t){return new ih(this).edit(t,{edit:function(){if(2===arguments.length){var t=arguments[0];return this._coordinateSequenceFactory.create(t)}}})},_h.prototype.getPrecisionModel=function(){return this._precisionModel},_h.prototype.createLinearRing=function(){if(0===arguments.length)return this.createLinearRing(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof Array){var t=arguments[0];return this.createLinearRing(null!==t?this.getCoordinateSequenceFactory().create(t):null)}if(gl(arguments[0],Il)){var e=arguments[0];return new nh(e,this)}}},_h.prototype.createMultiPolygon=function(){if(0===arguments.length)return new rh(null,this);if(1===arguments.length){var t=arguments[0];return new rh(t,this)}},_h.prototype.createMultiPoint=function(){var t=this;if(0===arguments.length)return new eh(null,this);if(1===arguments.length){if(arguments[0]instanceof Array){var e=arguments[0];return new eh(e,this)}if(arguments[0]instanceof Array){var n=arguments[0];return this.createMultiPoint(null!==n?this.getCoordinateSequenceFactory().create(n):null)}if(gl(arguments[0],Il)){var r=arguments[0];if(null===r)return this.createMultiPoint(new Array(0).fill(null));for(var i=new Array(r.size()).fill(null),o=0;o<r.size();o++){var s=t.getCoordinateSequenceFactory().create(1,r.getDimension());Jc.copy(r,o,s,0,1),i[o]=t.createPoint(s)}return this.createMultiPoint(i)}}},_h.prototype.interfaces_=function(){return[al]},_h.prototype.getClass=function(){return _h},_h.toMultiPolygonArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toGeometryArray=function(t){if(null===t)return null;var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.getDefaultCoordinateSequenceFactory=function(){return hh.instance()},_h.toMultiLineStringArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toLineStringArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toMultiPointArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toLinearRingArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toPointArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.toPolygonArray=function(t){var e=new Array(t.size()).fill(null);return t.toArray(e)},_h.createPointFromInternalCoord=function(t,e){return e.getPrecisionModel().makePrecise(t),e.getFactory().createPoint(t)},mh.serialVersionUID.get=function(){return-0x5ea75f2051eeb400},Object.defineProperties(_h,mh);var xh=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],Eh=function(t){this.geometryFactory=t||new _h};Eh.prototype.read=function(t){var e,n=(e="string"==typeof t?JSON.parse(t):t).type;if(!bh[n])throw new Error("Unknown GeoJSON type: "+e.type);return-1!==xh.indexOf(n)?bh[n].apply(this,[e.coordinates]):"GeometryCollection"===n?bh[n].apply(this,[e.geometries]):bh[n].apply(this,[e])},Eh.prototype.write=function(t){var e=t.getGeometryType();if(!wh[e])throw new Error("Geometry is not supported");return wh[e].apply(this,[t])};var bh={Feature:function(t){var e={};for(var n in t)e[n]=t[n];if(t.geometry){var r=t.geometry.type;if(!bh[r])throw new Error("Unknown GeoJSON type: "+t.type);e.geometry=this.read(t.geometry)}return t.bbox&&(e.bbox=bh.bbox.apply(this,[t.bbox])),e},FeatureCollection:function(t){var e={};if(t.features){e.features=[];for(var n=0;n<t.features.length;++n)e.features.push(this.read(t.features[n]))}return t.bbox&&(e.bbox=this.parse.bbox.apply(this,[t.bbox])),e},coordinates:function(t){for(var e=[],n=0;n<t.length;++n){var r=t[n];e.push(new ul(r[0],r[1]))}return e},bbox:function(t){return this.geometryFactory.createLinearRing([new ul(t[0],t[1]),new ul(t[2],t[1]),new ul(t[2],t[3]),new ul(t[0],t[3]),new ul(t[0],t[1])])},Point:function(t){var e=new ul(t[0],t[1]);return this.geometryFactory.createPoint(e)},MultiPoint:function(t){for(var e=[],n=0;n<t.length;++n)e.push(bh.Point.apply(this,[t[n]]));return this.geometryFactory.createMultiPoint(e)},LineString:function(t){var e=bh.coordinates.apply(this,[t]);return this.geometryFactory.createLineString(e)},MultiLineString:function(t){for(var e=[],n=0;n<t.length;++n)e.push(bh.LineString.apply(this,[t[n]]));return this.geometryFactory.createMultiLineString(e)},Polygon:function(t){for(var e=bh.coordinates.apply(this,[t[0]]),n=this.geometryFactory.createLinearRing(e),r=[],i=1;i<t.length;++i){var o=t[i],s=bh.coordinates.apply(this,[o]),a=this.geometryFactory.createLinearRing(s);r.push(a)}return this.geometryFactory.createPolygon(n,r)},MultiPolygon:function(t){for(var e=[],n=0;n<t.length;++n){var r=t[n];e.push(bh.Polygon.apply(this,[r]))}return this.geometryFactory.createMultiPolygon(e)},GeometryCollection:function(t){for(var e=[],n=0;n<t.length;++n){var r=t[n];e.push(this.read(r))}return this.geometryFactory.createGeometryCollection(e)}},wh={coordinate:function(t){return[t.x,t.y]},Point:function(t){return{type:"Point",coordinates:wh.coordinate.apply(this,[t.getCoordinate()])}},MultiPoint:function(t){for(var e=[],n=0;n<t._geometries.length;++n){var r=t._geometries[n],i=wh.Point.apply(this,[r]);e.push(i.coordinates)}return{type:"MultiPoint",coordinates:e}},LineString:function(t){for(var e=[],n=t.getCoordinates(),r=0;r<n.length;++r){var i=n[r];e.push(wh.coordinate.apply(this,[i]))}return{type:"LineString",coordinates:e}},MultiLineString:function(t){for(var e=[],n=0;n<t._geometries.length;++n){var r=t._geometries[n],i=wh.LineString.apply(this,[r]);e.push(i.coordinates)}return{type:"MultiLineString",coordinates:e}},Polygon:function(t){var e=[],n=wh.LineString.apply(this,[t._shell]);e.push(n.coordinates);for(var r=0;r<t._holes.length;++r){var i=t._holes[r],o=wh.LineString.apply(this,[i]);e.push(o.coordinates)}return{type:"Polygon",coordinates:e}},MultiPolygon:function(t){for(var e=[],n=0;n<t._geometries.length;++n){var r=t._geometries[n],i=wh.Polygon.apply(this,[r]);e.push(i.coordinates)}return{type:"MultiPolygon",coordinates:e}},GeometryCollection:function(t){for(var e=[],n=0;n<t._geometries.length;++n){var r=t._geometries[n],i=r.getGeometryType();e.push(wh[i].apply(this,[r]))}return{type:"GeometryCollection",geometries:e}}},Ih=function(t){this.geometryFactory=t||new _h,this.precisionModel=this.geometryFactory.getPrecisionModel(),this.parser=new Eh(this.geometryFactory)};Ih.prototype.read=function(t){var e=this.parser.read(t);return this.precisionModel.getType()===gh.FIXED&&this.reducePrecision(e),e},Ih.prototype.reducePrecision=function(t){var e,n;if(t.coordinate)this.precisionModel.makePrecise(t.coordinate);else if(t.points)for(e=0,n=t.points.length;e<n;e++)this.precisionModel.makePrecise(t.points[e]);else if(t.geometries)for(e=0,n=t.geometries.length;e<n;e++)this.reducePrecision(t.geometries[e])};var Nh=function(){this.parser=new Eh(this.geometryFactory)};Nh.prototype.write=function(t){return this.parser.write(t)};var Sh=function(){},Ch={ON:{configurable:!0},LEFT:{configurable:!0},RIGHT:{configurable:!0}};function Ph(t){this.message=t||""}function Mh(){this.array_=[]}Sh.prototype.interfaces_=function(){return[]},Sh.prototype.getClass=function(){return Sh},Sh.opposite=function(t){return t===Sh.LEFT?Sh.RIGHT:t===Sh.RIGHT?Sh.LEFT:t},Ch.ON.get=function(){return 0},Ch.LEFT.get=function(){return 1},Ch.RIGHT.get=function(){return 2},Object.defineProperties(Sh,Ch),Ph.prototype=new Error,Ph.prototype.name="EmptyStackException",Mh.prototype=new ac,Mh.prototype.add=function(t){return this.array_.push(t),!0},Mh.prototype.get=function(t){if(t<0||t>=this.size())throw new Error;return this.array_[t]},Mh.prototype.push=function(t){return this.array_.push(t),t},Mh.prototype.pop=function(t){if(0===this.array_.length)throw new Ph;return this.array_.pop()},Mh.prototype.peek=function(){if(0===this.array_.length)throw new Ph;return this.array_[this.array_.length-1]},Mh.prototype.empty=function(){return 0===this.array_.length},Mh.prototype.isEmpty=function(){return this.empty()},Mh.prototype.search=function(t){return this.array_.indexOf(t)},Mh.prototype.size=function(){return this.array_.length},Mh.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e<n;e++)t.push(this.array_[e]);return t};var Lh=function(){this._minIndex=-1,this._minCoord=null,this._minDe=null,this._orientedDe=null};Lh.prototype.getCoordinate=function(){return this._minCoord},Lh.prototype.getRightmostSide=function(t,e){var n=this.getRightmostSideOfSegment(t,e);return n<0&&(n=this.getRightmostSideOfSegment(t,e-1)),n<0&&(this._minCoord=null,this.checkForRightmostCoordinate(t)),n},Lh.prototype.findRightmostEdgeAtVertex=function(){var t=this._minDe.getEdge().getCoordinates();ql.isTrue(this._minIndex>0&&this._minIndex<t.length,"rightmost point expected to be interior vertex of edge");var e=t[this._minIndex-1],n=t[this._minIndex+1],r=Xl.computeOrientation(this._minCoord,n,e),i=!1;(e.y<this._minCoord.y&&n.y<this._minCoord.y&&r===Xl.COUNTERCLOCKWISE||e.y>this._minCoord.y&&n.y>this._minCoord.y&&r===Xl.CLOCKWISE)&&(i=!0),i&&(this._minIndex=this._minIndex-1)},Lh.prototype.getRightmostSideOfSegment=function(t,e){var n=t.getEdge().getCoordinates();if(e<0||e+1>=n.length)return-1;if(n[e].y===n[e+1].y)return-1;var r=Sh.LEFT;return n[e].y<n[e+1].y&&(r=Sh.RIGHT),r},Lh.prototype.getEdge=function(){return this._orientedDe},Lh.prototype.checkForRightmostCoordinate=function(t){for(var e=this,n=t.getEdge().getCoordinates(),r=0;r<n.length-1;r++)(null===e._minCoord||n[r].x>e._minCoord.x)&&(e._minDe=t,e._minIndex=r,e._minCoord=n[r])},Lh.prototype.findRightmostEdgeAtNode=function(){var t=this._minDe.getNode().getEdges();this._minDe=t.getRightmostEdge(),this._minDe.isForward()||(this._minDe=this._minDe.getSym(),this._minIndex=this._minDe.getEdge().getCoordinates().length-1)},Lh.prototype.findEdge=function(t){for(var e=t.iterator();e.hasNext();){var n=e.next();n.isForward()&&this.checkForRightmostCoordinate(n)}ql.isTrue(0!==this._minIndex||this._minCoord.equals(this._minDe.getCoordinate()),"inconsistency in rightmost processing"),0===this._minIndex?this.findRightmostEdgeAtNode():this.findRightmostEdgeAtVertex(),this._orientedDe=this._minDe,this.getRightmostSide(this._minDe,this._minIndex)===Sh.LEFT&&(this._orientedDe=this._minDe.getSym())},Lh.prototype.interfaces_=function(){return[]},Lh.prototype.getClass=function(){return Lh};var Oh=function(t){function e(n,r){t.call(this,e.msgWithCoord(n,r)),this.pt=r?new ul(r):null,this.name="TopologyException"}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCoordinate=function(){return this.pt},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.msgWithCoord=function(t,e){return e?t:t+" [ "+e+" ]"},e}(kl),Rh=function(){this.array_=[]};Rh.prototype.addLast=function(t){this.array_.push(t)},Rh.prototype.removeFirst=function(){return this.array_.shift()},Rh.prototype.isEmpty=function(){return 0===this.array_.length};var Th=function(){this._finder=null,this._dirEdgeList=new lc,this._nodes=new lc,this._rightMostCoord=null,this._env=null,this._finder=new Lh};Th.prototype.clearVisitedEdges=function(){for(var t=this._dirEdgeList.iterator();t.hasNext();){t.next().setVisited(!1)}},Th.prototype.getRightmostCoordinate=function(){return this._rightMostCoord},Th.prototype.computeNodeDepth=function(t){for(var e=null,n=t.getEdges().iterator();n.hasNext();){var r=n.next();if(r.isVisited()||r.getSym().isVisited()){e=r;break}}if(null===e)throw new Oh("unable to find edge to compute depths at "+t.getCoordinate());t.getEdges().computeDepths(e);for(var i=t.getEdges().iterator();i.hasNext();){var o=i.next();o.setVisited(!0),this.copySymDepths(o)}},Th.prototype.computeDepth=function(t){this.clearVisitedEdges();var e=this._finder.getEdge();e.setEdgeDepths(Sh.RIGHT,t),this.copySymDepths(e),this.computeDepths(e)},Th.prototype.create=function(t){this.addReachable(t),this._finder.findEdge(this._dirEdgeList),this._rightMostCoord=this._finder.getCoordinate()},Th.prototype.findResultEdges=function(){for(var t=this._dirEdgeList.iterator();t.hasNext();){var e=t.next();e.getDepth(Sh.RIGHT)>=1&&e.getDepth(Sh.LEFT)<=0&&!e.isInteriorAreaEdge()&&e.setInResult(!0)}},Th.prototype.computeDepths=function(t){var e=new xc,n=new Rh,r=t.getNode();for(n.addLast(r),e.add(r),t.setVisited(!0);!n.isEmpty();){var i=n.removeFirst();e.add(i),this.computeNodeDepth(i);for(var o=i.getEdges().iterator();o.hasNext();){var s=o.next().getSym();if(!s.isVisited()){var a=s.getNode();e.contains(a)||(n.addLast(a),e.add(a))}}}},Th.prototype.compareTo=function(t){var e=t;return this._rightMostCoord.x<e._rightMostCoord.x?-1:this._rightMostCoord.x>e._rightMostCoord.x?1:0},Th.prototype.getEnvelope=function(){if(null===this._env){for(var t=new Ll,e=this._dirEdgeList.iterator();e.hasNext();)for(var n=e.next().getEdge().getCoordinates(),r=0;r<n.length-1;r++)t.expandToInclude(n[r]);this._env=t}return this._env},Th.prototype.addReachable=function(t){var e=new Mh;for(e.add(t);!e.empty();){var n=e.pop();this.add(n,e)}},Th.prototype.copySymDepths=function(t){var e=t.getSym();e.setDepth(Sh.LEFT,t.getDepth(Sh.RIGHT)),e.setDepth(Sh.RIGHT,t.getDepth(Sh.LEFT))},Th.prototype.add=function(t,e){t.setVisited(!0),this._nodes.add(t);for(var n=t.getEdges().iterator();n.hasNext();){var r=n.next();this._dirEdgeList.add(r);var i=r.getSym().getNode();i.isVisited()||e.push(i)}},Th.prototype.getNodes=function(){return this._nodes},Th.prototype.getDirectedEdges=function(){return this._dirEdgeList},Th.prototype.interfaces_=function(){return[il]},Th.prototype.getClass=function(){return Th};var Ah=function t(){var e=this;if(this.location=null,1===arguments.length){if(arguments[0]instanceof Array){var n=arguments[0];this.init(n.length)}else if(Number.isInteger(arguments[0])){var r=arguments[0];this.init(1),this.location[Sh.ON]=r}else if(arguments[0]instanceof t){var i=arguments[0];if(this.init(i.location.length),null!==i)for(var o=0;o<this.location.length;o++)e.location[o]=i.location[o]}}else if(3===arguments.length){var s=arguments[0],a=arguments[1],u=arguments[2];this.init(3),this.location[Sh.ON]=s,this.location[Sh.LEFT]=a,this.location[Sh.RIGHT]=u}};Ah.prototype.setAllLocations=function(t){for(var e=0;e<this.location.length;e++)this.location[e]=t},Ah.prototype.isNull=function(){for(var t=0;t<this.location.length;t++)if(this.location[t]!==pl.NONE)return!1;return!0},Ah.prototype.setAllLocationsIfNull=function(t){for(var e=0;e<this.location.length;e++)this.location[e]===pl.NONE&&(this.location[e]=t)},Ah.prototype.isLine=function(){return 1===this.location.length},Ah.prototype.merge=function(t){if(t.location.length>this.location.length){var e=new Array(3).fill(null);e[Sh.ON]=this.location[Sh.ON],e[Sh.LEFT]=pl.NONE,e[Sh.RIGHT]=pl.NONE,this.location=e}for(var n=0;n<this.location.length;n++)this.location[n]===pl.NONE&&n<t.location.length&&(this.location[n]=t.location[n])},Ah.prototype.getLocations=function(){return this.location},Ah.prototype.flip=function(){if(this.location.length<=1)return null;var t=this.location[Sh.LEFT];this.location[Sh.LEFT]=this.location[Sh.RIGHT],this.location[Sh.RIGHT]=t},Ah.prototype.toString=function(){var t=new vl;return this.location.length>1&&t.append(pl.toLocationSymbol(this.location[Sh.LEFT])),t.append(pl.toLocationSymbol(this.location[Sh.ON])),this.location.length>1&&t.append(pl.toLocationSymbol(this.location[Sh.RIGHT])),t.toString()},Ah.prototype.setLocations=function(t,e,n){this.location[Sh.ON]=t,this.location[Sh.LEFT]=e,this.location[Sh.RIGHT]=n},Ah.prototype.get=function(t){return t<this.location.length?this.location[t]:pl.NONE},Ah.prototype.isArea=function(){return this.location.length>1},Ah.prototype.isAnyNull=function(){for(var t=0;t<this.location.length;t++)if(this.location[t]===pl.NONE)return!0;return!1},Ah.prototype.setLocation=function(){if(1===arguments.length){var t=arguments[0];this.setLocation(Sh.ON,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1];this.location[e]=n}},Ah.prototype.init=function(t){this.location=new Array(t).fill(null),this.setAllLocations(pl.NONE)},Ah.prototype.isEqualOnSide=function(t,e){return this.location[e]===t.location[e]},Ah.prototype.allPositionsEqual=function(t){for(var e=0;e<this.location.length;e++)if(this.location[e]!==t)return!1;return!0},Ah.prototype.interfaces_=function(){return[]},Ah.prototype.getClass=function(){return Ah};var Dh=function t(){if(this.elt=new Array(2).fill(null),1===arguments.length){if(Number.isInteger(arguments[0])){var e=arguments[0];this.elt[0]=new Ah(e),this.elt[1]=new Ah(e)}else if(arguments[0]instanceof t){var n=arguments[0];this.elt[0]=new Ah(n.elt[0]),this.elt[1]=new Ah(n.elt[1])}}else if(2===arguments.length){var r=arguments[0],i=arguments[1];this.elt[0]=new Ah(pl.NONE),this.elt[1]=new Ah(pl.NONE),this.elt[r].setLocation(i)}else if(3===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2];this.elt[0]=new Ah(o,s,a),this.elt[1]=new Ah(o,s,a)}else if(4===arguments.length){var u=arguments[0],l=arguments[1],c=arguments[2],h=arguments[3];this.elt[0]=new Ah(pl.NONE,pl.NONE,pl.NONE),this.elt[1]=new Ah(pl.NONE,pl.NONE,pl.NONE),this.elt[u].setLocations(l,c,h)}};Dh.prototype.getGeometryCount=function(){var t=0;return this.elt[0].isNull()||t++,this.elt[1].isNull()||t++,t},Dh.prototype.setAllLocations=function(t,e){this.elt[t].setAllLocations(e)},Dh.prototype.isNull=function(t){return this.elt[t].isNull()},Dh.prototype.setAllLocationsIfNull=function(){if(1===arguments.length){var t=arguments[0];this.setAllLocationsIfNull(0,t),this.setAllLocationsIfNull(1,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1];this.elt[e].setAllLocationsIfNull(n)}},Dh.prototype.isLine=function(t){return this.elt[t].isLine()},Dh.prototype.merge=function(t){for(var e=this,n=0;n<2;n++)null===e.elt[n]&&null!==t.elt[n]?e.elt[n]=new Ah(t.elt[n]):e.elt[n].merge(t.elt[n])},Dh.prototype.flip=function(){this.elt[0].flip(),this.elt[1].flip()},Dh.prototype.getLocation=function(){if(1===arguments.length){var t=arguments[0];return this.elt[t].get(Sh.ON)}if(2===arguments.length){var e=arguments[0],n=arguments[1];return this.elt[e].get(n)}},Dh.prototype.toString=function(){var t=new vl;return null!==this.elt[0]&&(t.append("A:"),t.append(this.elt[0].toString())),null!==this.elt[1]&&(t.append(" B:"),t.append(this.elt[1].toString())),t.toString()},Dh.prototype.isArea=function(){if(0===arguments.length)return this.elt[0].isArea()||this.elt[1].isArea();if(1===arguments.length){var t=arguments[0];return this.elt[t].isArea()}},Dh.prototype.isAnyNull=function(t){return this.elt[t].isAnyNull()},Dh.prototype.setLocation=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];this.elt[t].setLocation(Sh.ON,e)}else if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2];this.elt[n].setLocation(r,i)}},Dh.prototype.isEqualOnSide=function(t,e){return this.elt[0].isEqualOnSide(t.elt[0],e)&&this.elt[1].isEqualOnSide(t.elt[1],e)},Dh.prototype.allPositionsEqual=function(t,e){return this.elt[t].allPositionsEqual(e)},Dh.prototype.toLine=function(t){this.elt[t].isArea()&&(this.elt[t]=new Ah(this.elt[t].location[0]))},Dh.prototype.interfaces_=function(){return[]},Dh.prototype.getClass=function(){return Dh},Dh.toLineLabel=function(t){for(var e=new Dh(pl.NONE),n=0;n<2;n++)e.setLocation(n,t.getLocation(n));return e};var Fh=function(){this._startDe=null,this._maxNodeDegree=-1,this._edges=new lc,this._pts=new lc,this._label=new Dh(pl.NONE),this._ring=null,this._isHole=null,this._shell=null,this._holes=new lc,this._geometryFactory=null;var t=arguments[0],e=arguments[1];this._geometryFactory=e,this.computePoints(t),this.computeRing()};Fh.prototype.computeRing=function(){if(null!==this._ring)return null;for(var t=new Array(this._pts.size()).fill(null),e=0;e<this._pts.size();e++)t[e]=this._pts.get(e);this._ring=this._geometryFactory.createLinearRing(t),this._isHole=Xl.isCCW(this._ring.getCoordinates())},Fh.prototype.isIsolated=function(){return 1===this._label.getGeometryCount()},Fh.prototype.computePoints=function(t){var e=this;this._startDe=t;var n=t,r=!0;do{if(null===n)throw new Oh("Found null DirectedEdge");if(n.getEdgeRing()===e)throw new Oh("Directed Edge visited twice during ring-building at "+n.getCoordinate());e._edges.add(n);var i=n.getLabel();ql.isTrue(i.isArea()),e.mergeLabel(i),e.addPoints(n.getEdge(),n.isForward(),r),r=!1,e.setEdgeRing(n,e),n=e.getNext(n)}while(n!==this._startDe)},Fh.prototype.getLinearRing=function(){return this._ring},Fh.prototype.getCoordinate=function(t){return this._pts.get(t)},Fh.prototype.computeMaxNodeDegree=function(){var t=this;this._maxNodeDegree=0;var e=this._startDe;do{var n=e.getNode().getEdges().getOutgoingDegree(t);n>t._maxNodeDegree&&(t._maxNodeDegree=n),e=t.getNext(e)}while(e!==this._startDe);this._maxNodeDegree*=2},Fh.prototype.addPoints=function(t,e,n){var r=t.getCoordinates();if(e){var i=1;n&&(i=0);for(var o=i;o<r.length;o++)this._pts.add(r[o])}else{var s=r.length-2;n&&(s=r.length-1);for(var a=s;a>=0;a--)this._pts.add(r[a])}},Fh.prototype.isHole=function(){return this._isHole},Fh.prototype.setInResult=function(){var t=this._startDe;do{t.getEdge().setInResult(!0),t=t.getNext()}while(t!==this._startDe)},Fh.prototype.containsPoint=function(t){var e=this.getLinearRing();if(!e.getEnvelopeInternal().contains(t))return!1;if(!Xl.isPointInRing(t,e.getCoordinates()))return!1;for(var n=this._holes.iterator();n.hasNext();){if(n.next().containsPoint(t))return!1}return!0},Fh.prototype.addHole=function(t){this._holes.add(t)},Fh.prototype.isShell=function(){return null===this._shell},Fh.prototype.getLabel=function(){return this._label},Fh.prototype.getEdges=function(){return this._edges},Fh.prototype.getMaxNodeDegree=function(){return this._maxNodeDegree<0&&this.computeMaxNodeDegree(),this._maxNodeDegree},Fh.prototype.getShell=function(){return this._shell},Fh.prototype.mergeLabel=function(){if(1===arguments.length){var t=arguments[0];this.mergeLabel(t,0),this.mergeLabel(t,1)}else if(2===arguments.length){var e=arguments[0],n=arguments[1],r=e.getLocation(n,Sh.RIGHT);if(r===pl.NONE)return null;if(this._label.getLocation(n)===pl.NONE)return this._label.setLocation(n,r),null}},Fh.prototype.setShell=function(t){this._shell=t,null!==t&&t.addHole(this)},Fh.prototype.toPolygon=function(t){for(var e=new Array(this._holes.size()).fill(null),n=0;n<this._holes.size();n++)e[n]=this._holes.get(n).getLinearRing();return t.createPolygon(this.getLinearRing(),e)},Fh.prototype.interfaces_=function(){return[]},Fh.prototype.getClass=function(){return Fh};var kh=function(t){function e(){var e=arguments[0],n=arguments[1];t.call(this,e,n)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setEdgeRing=function(t,e){t.setMinEdgeRing(e)},e.prototype.getNext=function(t){return t.getNextMin()},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Fh),Gh=function(t){function e(){var e=arguments[0],n=arguments[1];t.call(this,e,n)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.buildMinimalRings=function(){var t=new lc,e=this._startDe;do{if(null===e.getMinEdgeRing()){var n=new kh(e,this._geometryFactory);t.add(n)}e=e.getNext()}while(e!==this._startDe);return t},e.prototype.setEdgeRing=function(t,e){t.setEdgeRing(e)},e.prototype.linkDirectedEdgesForMinimalEdgeRings=function(){var t=this._startDe;do{t.getNode().getEdges().linkMinimalDirectedEdges(this),t=t.getNext()}while(t!==this._startDe)},e.prototype.getNext=function(t){return t.getNext()},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Fh),qh=function(){if(this._label=null,this._isInResult=!1,this._isCovered=!1,this._isCoveredSet=!1,this._isVisited=!1,0===arguments.length);else if(1===arguments.length){var t=arguments[0];this._label=t}};qh.prototype.setVisited=function(t){this._isVisited=t},qh.prototype.setInResult=function(t){this._isInResult=t},qh.prototype.isCovered=function(){return this._isCovered},qh.prototype.isCoveredSet=function(){return this._isCoveredSet},qh.prototype.setLabel=function(t){this._label=t},qh.prototype.getLabel=function(){return this._label},qh.prototype.setCovered=function(t){this._isCovered=t,this._isCoveredSet=!0},qh.prototype.updateIM=function(t){ql.isTrue(this._label.getGeometryCount()>=2,"found partial label"),this.computeIM(t)},qh.prototype.isInResult=function(){return this._isInResult},qh.prototype.isVisited=function(){return this._isVisited},qh.prototype.interfaces_=function(){return[]},qh.prototype.getClass=function(){return qh};var Bh=function(t){function e(){t.call(this),this._coord=null,this._edges=null;var e=arguments[0],n=arguments[1];this._coord=e,this._edges=n,this._label=new Dh(0,pl.NONE)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isIncidentEdgeInResult=function(){for(var t=this.getEdges().getEdges().iterator();t.hasNext();){if(t.next().getEdge().isInResult())return!0}return!1},e.prototype.isIsolated=function(){return 1===this._label.getGeometryCount()},e.prototype.getCoordinate=function(){return this._coord},e.prototype.print=function(t){t.println("node "+this._coord+" lbl: "+this._label)},e.prototype.computeIM=function(t){},e.prototype.computeMergedLocation=function(t,e){var n=pl.NONE;if(n=this._label.getLocation(e),!t.isNull(e)){var r=t.getLocation(e);n!==pl.BOUNDARY&&(n=r)}return n},e.prototype.setLabel=function(){if(2!==arguments.length)return t.prototype.setLabel.apply(this,arguments);var e=arguments[0],n=arguments[1];null===this._label?this._label=new Dh(e,n):this._label.setLocation(e,n)},e.prototype.getEdges=function(){return this._edges},e.prototype.mergeLabel=function(){var t=this;if(arguments[0]instanceof e){var n=arguments[0];this.mergeLabel(n._label)}else if(arguments[0]instanceof Dh)for(var r=arguments[0],i=0;i<2;i++){var o=t.computeMergedLocation(r,i),s=t._label.getLocation(i);s===pl.NONE&&t._label.setLocation(i,o)}},e.prototype.add=function(t){this._edges.insert(t),t.setNode(this)},e.prototype.setLabelBoundary=function(t){if(null===this._label)return null;var e=pl.NONE;null!==this._label&&(e=this._label.getLocation(t));var n=null;switch(e){case pl.BOUNDARY:n=pl.INTERIOR;break;case pl.INTERIOR:default:n=pl.BOUNDARY}this._label.setLocation(t,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(qh),zh=function(){this.nodeMap=new Cc,this.nodeFact=null;var t=arguments[0];this.nodeFact=t};zh.prototype.find=function(t){return this.nodeMap.get(t)},zh.prototype.addNode=function(){if(arguments[0]instanceof ul){var t=arguments[0],e=this.nodeMap.get(t);return null===e&&(e=this.nodeFact.createNode(t),this.nodeMap.put(t,e)),e}if(arguments[0]instanceof Bh){var n=arguments[0],r=this.nodeMap.get(n.getCoordinate());return null===r?(this.nodeMap.put(n.getCoordinate(),n),n):(r.mergeLabel(n),r)}},zh.prototype.print=function(t){for(var e=this.iterator();e.hasNext();){e.next().print(t)}},zh.prototype.iterator=function(){return this.nodeMap.values().iterator()},zh.prototype.values=function(){return this.nodeMap.values()},zh.prototype.getBoundaryNodes=function(t){for(var e=new lc,n=this.iterator();n.hasNext();){var r=n.next();r.getLabel().getLocation(t)===pl.BOUNDARY&&e.add(r)}return e},zh.prototype.add=function(t){var e=t.getCoordinate();this.addNode(e).add(t)},zh.prototype.interfaces_=function(){return[]},zh.prototype.getClass=function(){return zh};var jh=function(){},Uh={NE:{configurable:!0},NW:{configurable:!0},SW:{configurable:!0},SE:{configurable:!0}};jh.prototype.interfaces_=function(){return[]},jh.prototype.getClass=function(){return jh},jh.isNorthern=function(t){return t===jh.NE||t===jh.NW},jh.isOpposite=function(t,e){return t!==e&&2===(t-e+4)%4},jh.commonHalfPlane=function(t,e){if(t===e)return t;if(2===(t-e+4)%4)return-1;var n=t<e?t:e;return 0===n&&3===(t>e?t:e)?3:n},jh.isInHalfPlane=function(t,e){return e===jh.SE?t===jh.SE||t===jh.SW:t===e||t===e+1},jh.quadrant=function(){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){var t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new el("Cannot compute the quadrant for point ( "+t+", "+e+" )");return t>=0?e>=0?jh.NE:jh.SE:e>=0?jh.NW:jh.SW}if(arguments[0]instanceof ul&&arguments[1]instanceof ul){var n=arguments[0],r=arguments[1];if(r.x===n.x&&r.y===n.y)throw new el("Cannot compute the quadrant for two identical points "+n);return r.x>=n.x?r.y>=n.y?jh.NE:jh.SE:r.y>=n.y?jh.NW:jh.SW}},Uh.NE.get=function(){return 0},Uh.NW.get=function(){return 1},Uh.SW.get=function(){return 2},Uh.SE.get=function(){return 3},Object.defineProperties(jh,Uh);var Vh=function(){if(this._edge=null,this._label=null,this._node=null,this._p0=null,this._p1=null,this._dx=null,this._dy=null,this._quadrant=null,1===arguments.length){var t=arguments[0];this._edge=t}else if(3===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2],i=null;this._edge=e,this.init(n,r),this._label=i}else if(4===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2],u=arguments[3];this._edge=o,this.init(s,a),this._label=u}};Vh.prototype.compareDirection=function(t){return this._dx===t._dx&&this._dy===t._dy?0:this._quadrant>t._quadrant?1:this._quadrant<t._quadrant?-1:Xl.computeOrientation(t._p0,t._p1,this._p1)},Vh.prototype.getDy=function(){return this._dy},Vh.prototype.getCoordinate=function(){return this._p0},Vh.prototype.setNode=function(t){this._node=t},Vh.prototype.print=function(t){var e=Math.atan2(this._dy,this._dx),n=this.getClass().getName(),r=n.lastIndexOf("."),i=n.substring(r+1);t.print(" "+i+": "+this._p0+" - "+this._p1+" "+this._quadrant+":"+e+" "+this._label)},Vh.prototype.compareTo=function(t){var e=t;return this.compareDirection(e)},Vh.prototype.getDirectedCoordinate=function(){return this._p1},Vh.prototype.getDx=function(){return this._dx},Vh.prototype.getLabel=function(){return this._label},Vh.prototype.getEdge=function(){return this._edge},Vh.prototype.getQuadrant=function(){return this._quadrant},Vh.prototype.getNode=function(){return this._node},Vh.prototype.toString=function(){var t=Math.atan2(this._dy,this._dx),e=this.getClass().getName(),n=e.lastIndexOf(".");return" "+e.substring(n+1)+": "+this._p0+" - "+this._p1+" "+this._quadrant+":"+t+" "+this._label},Vh.prototype.computeLabel=function(t){},Vh.prototype.init=function(t,e){this._p0=t,this._p1=e,this._dx=e.x-t.x,this._dy=e.y-t.y,this._quadrant=jh.quadrant(this._dx,this._dy),ql.isTrue(!(0===this._dx&&0===this._dy),"EdgeEnd with identical endpoints found")},Vh.prototype.interfaces_=function(){return[il]},Vh.prototype.getClass=function(){return Vh};var Xh=function(t){function e(){var e=arguments[0],n=arguments[1];if(t.call(this,e),this._isForward=null,this._isInResult=!1,this._isVisited=!1,this._sym=null,this._next=null,this._nextMin=null,this._edgeRing=null,this._minEdgeRing=null,this._depth=[0,-999,-999],this._isForward=n,n)this.init(e.getCoordinate(0),e.getCoordinate(1));else{var r=e.getNumPoints()-1;this.init(e.getCoordinate(r),e.getCoordinate(r-1))}this.computeDirectedLabel()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getNextMin=function(){return this._nextMin},e.prototype.getDepth=function(t){return this._depth[t]},e.prototype.setVisited=function(t){this._isVisited=t},e.prototype.computeDirectedLabel=function(){this._label=new Dh(this._edge.getLabel()),this._isForward||this._label.flip()},e.prototype.getNext=function(){return this._next},e.prototype.setDepth=function(t,e){if(-999!==this._depth[t]&&this._depth[t]!==e)throw new Oh("assigned depths do not match",this.getCoordinate());this._depth[t]=e},e.prototype.isInteriorAreaEdge=function(){for(var t=this,e=!0,n=0;n<2;n++)t._label.isArea(n)&&t._label.getLocation(n,Sh.LEFT)===pl.INTERIOR&&t._label.getLocation(n,Sh.RIGHT)===pl.INTERIOR||(e=!1);return e},e.prototype.setNextMin=function(t){this._nextMin=t},e.prototype.print=function(e){t.prototype.print.call(this,e),e.print(" "+this._depth[Sh.LEFT]+"/"+this._depth[Sh.RIGHT]),e.print(" ("+this.getDepthDelta()+")"),this._isInResult&&e.print(" inResult")},e.prototype.setMinEdgeRing=function(t){this._minEdgeRing=t},e.prototype.isLineEdge=function(){var t=this._label.isLine(0)||this._label.isLine(1),e=!this._label.isArea(0)||this._label.allPositionsEqual(0,pl.EXTERIOR),n=!this._label.isArea(1)||this._label.allPositionsEqual(1,pl.EXTERIOR);return t&&e&&n},e.prototype.setEdgeRing=function(t){this._edgeRing=t},e.prototype.getMinEdgeRing=function(){return this._minEdgeRing},e.prototype.getDepthDelta=function(){var t=this._edge.getDepthDelta();return this._isForward||(t=-t),t},e.prototype.setInResult=function(t){this._isInResult=t},e.prototype.getSym=function(){return this._sym},e.prototype.isForward=function(){return this._isForward},e.prototype.getEdge=function(){return this._edge},e.prototype.printEdge=function(t){this.print(t),t.print(" "),this._isForward?this._edge.print(t):this._edge.printReverse(t)},e.prototype.setSym=function(t){this._sym=t},e.prototype.setVisitedEdge=function(t){this.setVisited(t),this._sym.setVisited(t)},e.prototype.setEdgeDepths=function(t,e){var n=this.getEdge().getDepthDelta();this._isForward||(n=-n);var r=1;t===Sh.LEFT&&(r=-1);var i=Sh.opposite(t),o=e+n*r;this.setDepth(t,e),this.setDepth(i,o)},e.prototype.getEdgeRing=function(){return this._edgeRing},e.prototype.isInResult=function(){return this._isInResult},e.prototype.setNext=function(t){this._next=t},e.prototype.isVisited=function(){return this._isVisited},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.depthFactor=function(t,e){return t===pl.EXTERIOR&&e===pl.INTERIOR?1:t===pl.INTERIOR&&e===pl.EXTERIOR?-1:0},e}(Vh),Yh=function(){};Yh.prototype.createNode=function(t){return new Bh(t,null)},Yh.prototype.interfaces_=function(){return[]},Yh.prototype.getClass=function(){return Yh};var Hh=function(){if(this._edges=new lc,this._nodes=null,this._edgeEndList=new lc,0===arguments.length)this._nodes=new zh(new Yh);else if(1===arguments.length){var t=arguments[0];this._nodes=new zh(t)}};Hh.prototype.printEdges=function(t){t.println("Edges:");for(var e=0;e<this._edges.size();e++){t.println("edge "+e+":");var n=this._edges.get(e);n.print(t),n.eiList.print(t)}},Hh.prototype.find=function(t){return this._nodes.find(t)},Hh.prototype.addNode=function(){if(arguments[0]instanceof Bh){var t=arguments[0];return this._nodes.addNode(t)}if(arguments[0]instanceof ul){var e=arguments[0];return this._nodes.addNode(e)}},Hh.prototype.getNodeIterator=function(){return this._nodes.iterator()},Hh.prototype.linkResultDirectedEdges=function(){for(var t=this._nodes.iterator();t.hasNext();){t.next().getEdges().linkResultDirectedEdges()}},Hh.prototype.debugPrintln=function(t){Pl.out.println(t)},Hh.prototype.isBoundaryNode=function(t,e){var n=this._nodes.find(e);if(null===n)return!1;var r=n.getLabel();return null!==r&&r.getLocation(t)===pl.BOUNDARY},Hh.prototype.linkAllDirectedEdges=function(){for(var t=this._nodes.iterator();t.hasNext();){t.next().getEdges().linkAllDirectedEdges()}},Hh.prototype.matchInSameDirection=function(t,e,n,r){return!!t.equals(n)&&(Xl.computeOrientation(t,e,r)===Xl.COLLINEAR&&jh.quadrant(t,e)===jh.quadrant(n,r))},Hh.prototype.getEdgeEnds=function(){return this._edgeEndList},Hh.prototype.debugPrint=function(t){Pl.out.print(t)},Hh.prototype.getEdgeIterator=function(){return this._edges.iterator()},Hh.prototype.findEdgeInSameDirection=function(t,e){for(var n=this,r=0;r<this._edges.size();r++){var i=n._edges.get(r),o=i.getCoordinates();if(n.matchInSameDirection(t,e,o[0],o[1]))return i;if(n.matchInSameDirection(t,e,o[o.length-1],o[o.length-2]))return i}return null},Hh.prototype.insertEdge=function(t){this._edges.add(t)},Hh.prototype.findEdgeEnd=function(t){for(var e=this.getEdgeEnds().iterator();e.hasNext();){var n=e.next();if(n.getEdge()===t)return n}return null},Hh.prototype.addEdges=function(t){for(var e=this,n=t.iterator();n.hasNext();){var r=n.next();e._edges.add(r);var i=new Xh(r,!0),o=new Xh(r,!1);i.setSym(o),o.setSym(i),e.add(i),e.add(o)}},Hh.prototype.add=function(t){this._nodes.add(t),this._edgeEndList.add(t)},Hh.prototype.getNodes=function(){return this._nodes.values()},Hh.prototype.findEdge=function(t,e){for(var n=0;n<this._edges.size();n++){var r=this._edges.get(n),i=r.getCoordinates();if(t.equals(i[0])&&e.equals(i[1]))return r}return null},Hh.prototype.interfaces_=function(){return[]},Hh.prototype.getClass=function(){return Hh},Hh.linkResultDirectedEdges=function(t){for(var e=t.iterator();e.hasNext();){e.next().getEdges().linkResultDirectedEdges()}};var Wh=function(){this._geometryFactory=null,this._shellList=new lc;var t=arguments[0];this._geometryFactory=t};Wh.prototype.sortShellsAndHoles=function(t,e,n){for(var r=t.iterator();r.hasNext();){var i=r.next();i.isHole()?n.add(i):e.add(i)}},Wh.prototype.computePolygons=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next().toPolygon(this._geometryFactory);e.add(r)}return e},Wh.prototype.placeFreeHoles=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next();if(null===r.getShell()){var i=this.findEdgeRingContaining(r,t);if(null===i)throw new Oh("unable to assign hole to a shell",r.getCoordinate(0));r.setShell(i)}}},Wh.prototype.buildMinimalEdgeRings=function(t,e,n){for(var r=new lc,i=t.iterator();i.hasNext();){var o=i.next();if(o.getMaxNodeDegree()>2){o.linkDirectedEdgesForMinimalEdgeRings();var s=o.buildMinimalRings(),a=this.findShell(s);null!==a?(this.placePolygonHoles(a,s),e.add(a)):n.addAll(s)}else r.add(o)}return r},Wh.prototype.containsPoint=function(t){for(var e=this._shellList.iterator();e.hasNext();){if(e.next().containsPoint(t))return!0}return!1},Wh.prototype.buildMaximalEdgeRings=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next();if(r.isInResult()&&r.getLabel().isArea()&&null===r.getEdgeRing()){var i=new Gh(r,this._geometryFactory);e.add(i),i.setInResult()}}return e},Wh.prototype.placePolygonHoles=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next();r.isHole()&&r.setShell(t)}},Wh.prototype.getPolygons=function(){return this.computePolygons(this._shellList)},Wh.prototype.findEdgeRingContaining=function(t,e){for(var n=t.getLinearRing(),r=n.getEnvelopeInternal(),i=n.getCoordinateN(0),o=null,s=null,a=e.iterator();a.hasNext();){var u=a.next(),l=u.getLinearRing(),c=l.getEnvelopeInternal();null!==o&&(s=o.getLinearRing().getEnvelopeInternal());var h=!1;c.contains(r)&&Xl.isPointInRing(i,l.getCoordinates())&&(h=!0),h&&(null===o||s.contains(c))&&(o=u)}return o},Wh.prototype.findShell=function(t){for(var e=0,n=null,r=t.iterator();r.hasNext();){var i=r.next();i.isHole()||(n=i,e++)}return ql.isTrue(e<=1,"found two shells in MinimalEdgeRing list"),n},Wh.prototype.add=function(){if(1===arguments.length){var t=arguments[0];this.add(t.getEdgeEnds(),t.getNodes())}else if(2===arguments.length){var e=arguments[0],n=arguments[1];Hh.linkResultDirectedEdges(n);var r=this.buildMaximalEdgeRings(e),i=new lc,o=this.buildMinimalEdgeRings(r,this._shellList,i);this.sortShellsAndHoles(o,this._shellList,i),this.placeFreeHoles(this._shellList,i)}},Wh.prototype.interfaces_=function(){return[]},Wh.prototype.getClass=function(){return Wh};var Jh=function(){};Jh.prototype.getBounds=function(){},Jh.prototype.interfaces_=function(){return[]},Jh.prototype.getClass=function(){return Jh};var Zh=function(){this._bounds=null,this._item=null;var t=arguments[0],e=arguments[1];this._bounds=t,this._item=e};Zh.prototype.getItem=function(){return this._item},Zh.prototype.getBounds=function(){return this._bounds},Zh.prototype.interfaces_=function(){return[Jh,al]},Zh.prototype.getClass=function(){return Zh};var Kh=function(){this._size=null,this._items=null,this._size=0,this._items=new lc,this._items.add(null)};Kh.prototype.poll=function(){if(this.isEmpty())return null;var t=this._items.get(1);return this._items.set(1,this._items.get(this._size)),this._size-=1,this.reorder(1),t},Kh.prototype.size=function(){return this._size},Kh.prototype.reorder=function(t){for(var e=this,n=null,r=this._items.get(t);2*t<=this._size&&((n=2*t)!==e._size&&e._items.get(n+1).compareTo(e._items.get(n))<0&&n++,e._items.get(n).compareTo(r)<0);t=n)e._items.set(t,e._items.get(n));this._items.set(t,r)},Kh.prototype.clear=function(){this._size=0,this._items.clear()},Kh.prototype.isEmpty=function(){return 0===this._size},Kh.prototype.add=function(t){this._items.add(null),this._size+=1;var e=this._size;for(this._items.set(0,t);t.compareTo(this._items.get(Math.trunc(e/2)))<0;e/=2)this._items.set(e,this._items.get(Math.trunc(e/2)));this._items.set(e,t)},Kh.prototype.interfaces_=function(){return[]},Kh.prototype.getClass=function(){return Kh};var Qh=function(){};Qh.prototype.visitItem=function(t){},Qh.prototype.interfaces_=function(){return[]},Qh.prototype.getClass=function(){return Qh};var $h=function(){};$h.prototype.insert=function(t,e){},$h.prototype.remove=function(t,e){},$h.prototype.query=function(){},$h.prototype.interfaces_=function(){return[]},$h.prototype.getClass=function(){return $h};var tp=function(){if(this._childBoundables=new lc,this._bounds=null,this._level=null,0===arguments.length);else if(1===arguments.length){var t=arguments[0];this._level=t}},ep={serialVersionUID:{configurable:!0}};tp.prototype.getLevel=function(){return this._level},tp.prototype.size=function(){return this._childBoundables.size()},tp.prototype.getChildBoundables=function(){return this._childBoundables},tp.prototype.addChildBoundable=function(t){ql.isTrue(null===this._bounds),this._childBoundables.add(t)},tp.prototype.isEmpty=function(){return this._childBoundables.isEmpty()},tp.prototype.getBounds=function(){return null===this._bounds&&(this._bounds=this.computeBounds()),this._bounds},tp.prototype.interfaces_=function(){return[Jh,al]},tp.prototype.getClass=function(){return tp},ep.serialVersionUID.get=function(){return 0x5a1e55ec41369800},Object.defineProperties(tp,ep);var np=function(){};np.reverseOrder=function(){return{compare:function(t,e){return e.compareTo(t)}}},np.min=function(t){return np.sort(t),t.get(0)},np.sort=function(t,e){var n=t.toArray();e?Rc.sort(n,e):Rc.sort(n);for(var r=t.iterator(),i=0,o=n.length;i<o;i++)r.next(),r.set(n[i])},np.singletonList=function(t){var e=new lc;return e.add(t),e};var rp=function(){this._boundable1=null,this._boundable2=null,this._distance=null,this._itemDistance=null;var t=arguments[0],e=arguments[1],n=arguments[2];this._boundable1=t,this._boundable2=e,this._itemDistance=n,this._distance=this.distance()};rp.prototype.expandToQueue=function(t,e){var n=rp.isComposite(this._boundable1),r=rp.isComposite(this._boundable2);if(n&&r)return rp.area(this._boundable1)>rp.area(this._boundable2)?(this.expand(this._boundable1,this._boundable2,t,e),null):(this.expand(this._boundable2,this._boundable1,t,e),null);if(n)return this.expand(this._boundable1,this._boundable2,t,e),null;if(r)return this.expand(this._boundable2,this._boundable1,t,e),null;throw new el("neither boundable is composite")},rp.prototype.isLeaves=function(){return!(rp.isComposite(this._boundable1)||rp.isComposite(this._boundable2))},rp.prototype.compareTo=function(t){var e=t;return this._distance<e._distance?-1:this._distance>e._distance?1:0},rp.prototype.expand=function(t,e,n,r){for(var i=t.getChildBoundables().iterator();i.hasNext();){var o=i.next(),s=new rp(o,e,this._itemDistance);s.getDistance()<r&&n.add(s)}},rp.prototype.getBoundable=function(t){return 0===t?this._boundable1:this._boundable2},rp.prototype.getDistance=function(){return this._distance},rp.prototype.distance=function(){return this.isLeaves()?this._itemDistance.distance(this._boundable1,this._boundable2):this._boundable1.getBounds().distance(this._boundable2.getBounds())},rp.prototype.interfaces_=function(){return[il]},rp.prototype.getClass=function(){return rp},rp.area=function(t){return t.getBounds().getArea()},rp.isComposite=function(t){return t instanceof tp};var ip=function t(){if(this._root=null,this._built=!1,this._itemBoundables=new lc,this._nodeCapacity=null,0===arguments.length){var e=t.DEFAULT_NODE_CAPACITY;this._nodeCapacity=e}else if(1===arguments.length){var n=arguments[0];ql.isTrue(n>1,"Node capacity must be greater than 1"),this._nodeCapacity=n}},op={IntersectsOp:{configurable:!0},serialVersionUID:{configurable:!0},DEFAULT_NODE_CAPACITY:{configurable:!0}};ip.prototype.getNodeCapacity=function(){return this._nodeCapacity},ip.prototype.lastNode=function(t){return t.get(t.size()-1)},ip.prototype.size=function(){var t=this;if(0===arguments.length)return this.isEmpty()?0:(this.build(),this.size(this._root));if(1===arguments.length){for(var e=arguments[0],n=0,r=e.getChildBoundables().iterator();r.hasNext();){var i=r.next();i instanceof tp?n+=t.size(i):i instanceof Zh&&(n+=1)}return n}},ip.prototype.removeItem=function(t,e){for(var n=null,r=t.getChildBoundables().iterator();r.hasNext();){var i=r.next();i instanceof Zh&&i.getItem()===e&&(n=i)}return null!==n&&(t.getChildBoundables().remove(n),!0)},ip.prototype.itemsTree=function(){var t=this;if(0===arguments.length){this.build();var e=this.itemsTree(this._root);return null===e?new lc:e}if(1===arguments.length){for(var n=arguments[0],r=new lc,i=n.getChildBoundables().iterator();i.hasNext();){var o=i.next();if(o instanceof tp){var s=t.itemsTree(o);null!==s&&r.add(s)}else o instanceof Zh?r.add(o.getItem()):ql.shouldNeverReachHere()}return r.size()<=0?null:r}},ip.prototype.insert=function(t,e){ql.isTrue(!this._built,"Cannot insert items into an STR packed R-tree after it has been built."),this._itemBoundables.add(new Zh(t,e))},ip.prototype.boundablesAtLevel=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=new lc;return this.boundablesAtLevel(e,this._root,n),n}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];if(ql.isTrue(r>-2),i.getLevel()===r)return o.add(i),null;for(var s=i.getChildBoundables().iterator();s.hasNext();){var a=s.next();a instanceof tp?t.boundablesAtLevel(r,a,o):(ql.isTrue(a instanceof Zh),-1===r&&o.add(a))}return null}},ip.prototype.query=function(){var t=this;if(1===arguments.length){var e=arguments[0];this.build();var n=new lc;return this.isEmpty()||this.getIntersectsOp().intersects(this._root.getBounds(),e)&&this.query(e,this._root,n),n}if(2===arguments.length){var r=arguments[0],i=arguments[1];if(this.build(),this.isEmpty())return null;this.getIntersectsOp().intersects(this._root.getBounds(),r)&&this.query(r,this._root,i)}else if(3===arguments.length)if(gl(arguments[2],Qh)&&arguments[0]instanceof Object&&arguments[1]instanceof tp)for(var o=arguments[0],s=arguments[1],a=arguments[2],u=s.getChildBoundables(),l=0;l<u.size();l++){var c=u.get(l);t.getIntersectsOp().intersects(c.getBounds(),o)&&(c instanceof tp?t.query(o,c,a):c instanceof Zh?a.visitItem(c.getItem()):ql.shouldNeverReachHere())}else if(gl(arguments[2],ac)&&arguments[0]instanceof Object&&arguments[1]instanceof tp)for(var h=arguments[0],p=arguments[1],f=arguments[2],g=p.getChildBoundables(),d=0;d<g.size();d++){var y=g.get(d);t.getIntersectsOp().intersects(y.getBounds(),h)&&(y instanceof tp?t.query(h,y,f):y instanceof Zh?f.add(y.getItem()):ql.shouldNeverReachHere())}},ip.prototype.build=function(){if(this._built)return null;this._root=this._itemBoundables.isEmpty()?this.createNode(0):this.createHigherLevels(this._itemBoundables,-1),this._itemBoundables=null,this._built=!0},ip.prototype.getRoot=function(){return this.build(),this._root},ip.prototype.remove=function(){var t=this;if(2===arguments.length){var e=arguments[0],n=arguments[1];return this.build(),!!this.getIntersectsOp().intersects(this._root.getBounds(),e)&&this.remove(e,this._root,n)}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=this.removeItem(i,o);if(s)return!0;for(var a=null,u=i.getChildBoundables().iterator();u.hasNext();){var l=u.next();if(t.getIntersectsOp().intersects(l.getBounds(),r)&&(l instanceof tp&&(s=t.remove(r,l,o)))){a=l;break}}return null!==a&&a.getChildBoundables().isEmpty()&&i.getChildBoundables().remove(a),s}},ip.prototype.createHigherLevels=function(t,e){ql.isTrue(!t.isEmpty());var n=this.createParentBoundables(t,e+1);return 1===n.size()?n.get(0):this.createHigherLevels(n,e+1)},ip.prototype.depth=function(){var t=this;if(0===arguments.length)return this.isEmpty()?0:(this.build(),this.depth(this._root));if(1===arguments.length){for(var e=arguments[0],n=0,r=e.getChildBoundables().iterator();r.hasNext();){var i=r.next();if(i instanceof tp){var o=t.depth(i);o>n&&(n=o)}}return n+1}},ip.prototype.createParentBoundables=function(t,e){var n=this;ql.isTrue(!t.isEmpty());var r=new lc;r.add(this.createNode(e));var i=new lc(t);np.sort(i,this.getComparator());for(var o=i.iterator();o.hasNext();){var s=o.next();n.lastNode(r).getChildBoundables().size()===n.getNodeCapacity()&&r.add(n.createNode(e)),n.lastNode(r).addChildBoundable(s)}return r},ip.prototype.isEmpty=function(){return this._built?this._root.isEmpty():this._itemBoundables.isEmpty()},ip.prototype.interfaces_=function(){return[al]},ip.prototype.getClass=function(){return ip},ip.compareDoubles=function(t,e){return t>e?1:t<e?-1:0},op.IntersectsOp.get=function(){return sp},op.serialVersionUID.get=function(){return-0x35ef64c82d4c5400},op.DEFAULT_NODE_CAPACITY.get=function(){return 10},Object.defineProperties(ip,op);var sp=function(){},ap=function(){};ap.prototype.distance=function(t,e){},ap.prototype.interfaces_=function(){return[]},ap.prototype.getClass=function(){return ap};var up=function(t){function e(n){n=n||e.DEFAULT_NODE_CAPACITY,t.call(this,n)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={STRtreeNode:{configurable:!0},serialVersionUID:{configurable:!0},xComparator:{configurable:!0},yComparator:{configurable:!0},intersectsOp:{configurable:!0},DEFAULT_NODE_CAPACITY:{configurable:!0}};return e.prototype.createParentBoundablesFromVerticalSlices=function(t,e){ql.isTrue(t.length>0);for(var n=new lc,r=0;r<t.length;r++)n.addAll(this.createParentBoundablesFromVerticalSlice(t[r],e));return n},e.prototype.createNode=function(t){return new lp(t)},e.prototype.size=function(){return 0===arguments.length?t.prototype.size.call(this):t.prototype.size.apply(this,arguments)},e.prototype.insert=function(){if(2!==arguments.length)return t.prototype.insert.apply(this,arguments);var e=arguments[0],n=arguments[1];if(e.isNull())return null;t.prototype.insert.call(this,e,n)},e.prototype.getIntersectsOp=function(){return e.intersectsOp},e.prototype.verticalSlices=function(t,e){for(var n=Math.trunc(Math.ceil(t.size()/e)),r=new Array(e).fill(null),i=t.iterator(),o=0;o<e;o++){r[o]=new lc;for(var s=0;i.hasNext()&&s<n;){var a=i.next();r[o].add(a),s++}}return r},e.prototype.query=function(){if(1===arguments.length){var e=arguments[0];return t.prototype.query.call(this,e)}if(2===arguments.length){var n=arguments[0],r=arguments[1];t.prototype.query.call(this,n,r)}else if(3===arguments.length)if(gl(arguments[2],Qh)&&arguments[0]instanceof Object&&arguments[1]instanceof tp){var i=arguments[0],o=arguments[1],s=arguments[2];t.prototype.query.call(this,i,o,s)}else if(gl(arguments[2],ac)&&arguments[0]instanceof Object&&arguments[1]instanceof tp){var a=arguments[0],u=arguments[1],l=arguments[2];t.prototype.query.call(this,a,u,l)}},e.prototype.getComparator=function(){return e.yComparator},e.prototype.createParentBoundablesFromVerticalSlice=function(e,n){return t.prototype.createParentBoundables.call(this,e,n)},e.prototype.remove=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return t.prototype.remove.call(this,e,n)}return t.prototype.remove.apply(this,arguments)},e.prototype.depth=function(){return 0===arguments.length?t.prototype.depth.call(this):t.prototype.depth.apply(this,arguments)},e.prototype.createParentBoundables=function(t,n){ql.isTrue(!t.isEmpty());var r=Math.trunc(Math.ceil(t.size()/this.getNodeCapacity())),i=new lc(t);np.sort(i,e.xComparator);var o=this.verticalSlices(i,Math.trunc(Math.ceil(Math.sqrt(r))));return this.createParentBoundablesFromVerticalSlices(o,n)},e.prototype.nearestNeighbour=function(){if(1===arguments.length){if(gl(arguments[0],ap)){var t=arguments[0],n=new rp(this.getRoot(),this.getRoot(),t);return this.nearestNeighbour(n)}if(arguments[0]instanceof rp){var r=arguments[0];return this.nearestNeighbour(r,nl.POSITIVE_INFINITY)}}else if(2===arguments.length){if(arguments[0]instanceof e&&gl(arguments[1],ap)){var i=arguments[0],o=arguments[1],s=new rp(this.getRoot(),i.getRoot(),o);return this.nearestNeighbour(s)}if(arguments[0]instanceof rp&&"number"==typeof arguments[1]){var a=arguments[0],u=arguments[1],l=u,c=null,h=new Kh;for(h.add(a);!h.isEmpty()&&l>0;){var p=h.poll(),f=p.getDistance();if(f>=l)break;p.isLeaves()?(l=f,c=p):p.expandToQueue(h,l)}return[c.getBoundable(0).getItem(),c.getBoundable(1).getItem()]}}else if(3===arguments.length){var g=arguments[0],d=arguments[1],y=arguments[2],v=new Zh(g,d),_=new rp(this.getRoot(),v,y);return this.nearestNeighbour(_)[0]}},e.prototype.interfaces_=function(){return[$h,al]},e.prototype.getClass=function(){return e},e.centreX=function(t){return e.avg(t.getMinX(),t.getMaxX())},e.avg=function(t,e){return(t+e)/2},e.centreY=function(t){return e.avg(t.getMinY(),t.getMaxY())},n.STRtreeNode.get=function(){return lp},n.serialVersionUID.get=function(){return 0x39920f7d5f261e0},n.xComparator.get=function(){return{interfaces_:function(){return[sl]},compare:function(n,r){return t.compareDoubles(e.centreX(n.getBounds()),e.centreX(r.getBounds()))}}},n.yComparator.get=function(){return{interfaces_:function(){return[sl]},compare:function(n,r){return t.compareDoubles(e.centreY(n.getBounds()),e.centreY(r.getBounds()))}}},n.intersectsOp.get=function(){return{interfaces_:function(){return[t.IntersectsOp]},intersects:function(t,e){return t.intersects(e)}}},n.DEFAULT_NODE_CAPACITY.get=function(){return 10},Object.defineProperties(e,n),e}(ip),lp=function(t){function e(){var e=arguments[0];t.call(this,e)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.computeBounds=function(){for(var t=null,e=this.getChildBoundables().iterator();e.hasNext();){var n=e.next();null===t?t=new Ll(n.getBounds()):t.expandToInclude(n.getBounds())}return t},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(tp),cp=function(){};cp.prototype.interfaces_=function(){return[]},cp.prototype.getClass=function(){return cp},cp.relativeSign=function(t,e){return t<e?-1:t>e?1:0},cp.compare=function(t,e,n){if(e.equals2D(n))return 0;var r=cp.relativeSign(e.x,n.x),i=cp.relativeSign(e.y,n.y);switch(t){case 0:return cp.compareValue(r,i);case 1:return cp.compareValue(i,r);case 2:return cp.compareValue(i,-r);case 3:return cp.compareValue(-r,i);case 4:return cp.compareValue(-r,-i);case 5:return cp.compareValue(-i,-r);case 6:return cp.compareValue(-i,r);case 7:return cp.compareValue(r,-i)}return ql.shouldNeverReachHere("invalid octant value"),0},cp.compareValue=function(t,e){return t<0?-1:t>0?1:e<0?-1:e>0?1:0};var hp=function(){this._segString=null,this.coord=null,this.segmentIndex=null,this._segmentOctant=null,this._isInterior=null;var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];this._segString=t,this.coord=new ul(e),this.segmentIndex=n,this._segmentOctant=r,this._isInterior=!e.equals2D(t.getCoordinate(n))};hp.prototype.getCoordinate=function(){return this.coord},hp.prototype.print=function(t){t.print(this.coord),t.print(" seg # = "+this.segmentIndex)},hp.prototype.compareTo=function(t){var e=t;return this.segmentIndex<e.segmentIndex?-1:this.segmentIndex>e.segmentIndex?1:this.coord.equals2D(e.coord)?0:cp.compare(this._segmentOctant,this.coord,e.coord)},hp.prototype.isEndPoint=function(t){return 0===this.segmentIndex&&!this._isInterior||this.segmentIndex===t},hp.prototype.isInterior=function(){return this._isInterior},hp.prototype.interfaces_=function(){return[il]},hp.prototype.getClass=function(){return hp};var pp=function(){this._nodeMap=new Cc,this._edge=null;var t=arguments[0];this._edge=t};pp.prototype.getSplitCoordinates=function(){var t=new hc;this.addEndpoints();for(var e=this.iterator(),n=e.next();e.hasNext();){var r=e.next();this.addEdgeCoordinates(n,r,t),n=r}return t.toCoordinateArray()},pp.prototype.addCollapsedNodes=function(){var t=new lc;this.findCollapsesFromInsertedNodes(t),this.findCollapsesFromExistingVertices(t);for(var e=t.iterator();e.hasNext();){var n=e.next().intValue();this.add(this._edge.getCoordinate(n),n)}},pp.prototype.print=function(t){t.println("Intersections:");for(var e=this.iterator();e.hasNext();){e.next().print(t)}},pp.prototype.findCollapsesFromExistingVertices=function(t){for(var e=0;e<this._edge.size()-2;e++){var n=this._edge.getCoordinate(e),r=this._edge.getCoordinate(e+2);n.equals2D(r)&&t.add(new _l(e+1))}},pp.prototype.addEdgeCoordinates=function(t,e,n){var r=this._edge.getCoordinate(e.segmentIndex),i=e.isInterior()||!e.coord.equals2D(r);n.add(new ul(t.coord),!1);for(var o=t.segmentIndex+1;o<=e.segmentIndex;o++)n.add(this._edge.getCoordinate(o));i&&n.add(new ul(e.coord))},pp.prototype.iterator=function(){return this._nodeMap.values().iterator()},pp.prototype.addSplitEdges=function(t){this.addEndpoints(),this.addCollapsedNodes();for(var e=this.iterator(),n=e.next();e.hasNext();){var r=e.next(),i=this.createSplitEdge(n,r);t.add(i),n=r}},pp.prototype.findCollapseIndex=function(t,e,n){if(!t.coord.equals2D(e.coord))return!1;var r=e.segmentIndex-t.segmentIndex;return e.isInterior()||r--,1===r&&(n[0]=t.segmentIndex+1,!0)},pp.prototype.findCollapsesFromInsertedNodes=function(t){for(var e=new Array(1).fill(null),n=this.iterator(),r=n.next();n.hasNext();){var i=n.next();this.findCollapseIndex(r,i,e)&&t.add(new _l(e[0])),r=i}},pp.prototype.getEdge=function(){return this._edge},pp.prototype.addEndpoints=function(){var t=this._edge.size()-1;this.add(this._edge.getCoordinate(0),0),this.add(this._edge.getCoordinate(t),t)},pp.prototype.createSplitEdge=function(t,e){var n=e.segmentIndex-t.segmentIndex+2,r=this._edge.getCoordinate(e.segmentIndex),i=e.isInterior()||!e.coord.equals2D(r);i||n--;var o=new Array(n).fill(null),s=0;o[s++]=new ul(t.coord);for(var a=t.segmentIndex+1;a<=e.segmentIndex;a++)o[s++]=this._edge.getCoordinate(a);return i&&(o[s]=new ul(e.coord)),new yp(o,this._edge.getData())},pp.prototype.add=function(t,e){var n=new hp(this._edge,t,e,this._edge.getSegmentOctant(e)),r=this._nodeMap.get(n);return null!==r?(ql.isTrue(r.coord.equals2D(t),"Found equal nodes with different coordinates"),r):(this._nodeMap.put(n,n),n)},pp.prototype.checkSplitEdgesCorrectness=function(t){var e=this._edge.getCoordinates(),n=t.get(0).getCoordinate(0);if(!n.equals2D(e[0]))throw new kl("bad split edge start point at "+n);var r=t.get(t.size()-1).getCoordinates(),i=r[r.length-1];if(!i.equals2D(e[e.length-1]))throw new kl("bad split edge end point at "+i)},pp.prototype.interfaces_=function(){return[]},pp.prototype.getClass=function(){return pp};var fp=function(){};fp.prototype.interfaces_=function(){return[]},fp.prototype.getClass=function(){return fp},fp.octant=function(){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){var t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new el("Cannot compute the octant for point ( "+t+", "+e+" )");var n=Math.abs(t),r=Math.abs(e);return t>=0?e>=0?n>=r?0:1:n>=r?7:6:e>=0?n>=r?3:2:n>=r?4:5}if(arguments[0]instanceof ul&&arguments[1]instanceof ul){var i=arguments[0],o=arguments[1],s=o.x-i.x,a=o.y-i.y;if(0===s&&0===a)throw new el("Cannot compute the octant for two identical points "+i);return fp.octant(s,a)}};var gp=function(){};gp.prototype.getCoordinates=function(){},gp.prototype.size=function(){},gp.prototype.getCoordinate=function(t){},gp.prototype.isClosed=function(){},gp.prototype.setData=function(t){},gp.prototype.getData=function(){},gp.prototype.interfaces_=function(){return[]},gp.prototype.getClass=function(){return gp};var dp=function(){};dp.prototype.addIntersection=function(t,e){},dp.prototype.interfaces_=function(){return[gp]},dp.prototype.getClass=function(){return dp};var yp=function(){this._nodeList=new pp(this),this._pts=null,this._data=null;var t=arguments[0],e=arguments[1];this._pts=t,this._data=e};yp.prototype.getCoordinates=function(){return this._pts},yp.prototype.size=function(){return this._pts.length},yp.prototype.getCoordinate=function(t){return this._pts[t]},yp.prototype.isClosed=function(){return this._pts[0].equals(this._pts[this._pts.length-1])},yp.prototype.getSegmentOctant=function(t){return t===this._pts.length-1?-1:this.safeOctant(this.getCoordinate(t),this.getCoordinate(t+1))},yp.prototype.setData=function(t){this._data=t},yp.prototype.safeOctant=function(t,e){return t.equals2D(e)?0:fp.octant(t,e)},yp.prototype.getData=function(){return this._data},yp.prototype.addIntersection=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];this.addIntersectionNode(t,e)}else if(4===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[3],o=new ul(n.getIntersection(i));this.addIntersection(o,r)}},yp.prototype.toString=function(){return Fl.toLineString(new lh(this._pts))},yp.prototype.getNodeList=function(){return this._nodeList},yp.prototype.addIntersectionNode=function(t,e){var n=e,r=n+1;if(r<this._pts.length){var i=this._pts[r];t.equals2D(i)&&(n=r)}return this._nodeList.add(t,n)},yp.prototype.addIntersections=function(t,e,n){for(var r=0;r<t.getIntersectionNum();r++)this.addIntersection(t,e,n,r)},yp.prototype.interfaces_=function(){return[dp]},yp.prototype.getClass=function(){return yp},yp.getNodedSubstrings=function(){if(1===arguments.length){var t=arguments[0],e=new lc;return yp.getNodedSubstrings(t,e),e}if(2===arguments.length)for(var n=arguments[0],r=arguments[1],i=n.iterator();i.hasNext();){var o=i.next();o.getNodeList().addSplitEdges(r)}};var vp=function(){if(this.p0=null,this.p1=null,0===arguments.length)this.p0=new ul,this.p1=new ul;else if(1===arguments.length){var t=arguments[0];this.p0=new ul(t.p0),this.p1=new ul(t.p1)}else if(2===arguments.length)this.p0=arguments[0],this.p1=arguments[1];else if(4===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2],i=arguments[3];this.p0=new ul(e,n),this.p1=new ul(r,i)}},_p={serialVersionUID:{configurable:!0}};vp.prototype.minX=function(){return Math.min(this.p0.x,this.p1.x)},vp.prototype.orientationIndex=function(){if(arguments[0]instanceof vp){var t=arguments[0],e=Xl.orientationIndex(this.p0,this.p1,t.p0),n=Xl.orientationIndex(this.p0,this.p1,t.p1);return e>=0&&n>=0||e<=0&&n<=0?Math.max(e,n):0}if(arguments[0]instanceof ul){var r=arguments[0];return Xl.orientationIndex(this.p0,this.p1,r)}},vp.prototype.toGeometry=function(t){return t.createLineString([this.p0,this.p1])},vp.prototype.isVertical=function(){return this.p0.x===this.p1.x},vp.prototype.equals=function(t){if(!(t instanceof vp))return!1;var e=t;return this.p0.equals(e.p0)&&this.p1.equals(e.p1)},vp.prototype.intersection=function(t){var e=new jl;return e.computeIntersection(this.p0,this.p1,t.p0,t.p1),e.hasIntersection()?e.getIntersection(0):null},vp.prototype.project=function(){if(arguments[0]instanceof ul){var t=arguments[0];if(t.equals(this.p0)||t.equals(this.p1))return new ul(t);var e=this.projectionFactor(t),n=new ul;return n.x=this.p0.x+e*(this.p1.x-this.p0.x),n.y=this.p0.y+e*(this.p1.y-this.p0.y),n}if(arguments[0]instanceof vp){var r=arguments[0],i=this.projectionFactor(r.p0),o=this.projectionFactor(r.p1);if(i>=1&&o>=1)return null;if(i<=0&&o<=0)return null;var s=this.project(r.p0);i<0&&(s=this.p0),i>1&&(s=this.p1);var a=this.project(r.p1);return o<0&&(a=this.p0),o>1&&(a=this.p1),new vp(s,a)}},vp.prototype.normalize=function(){this.p1.compareTo(this.p0)<0&&this.reverse()},vp.prototype.angle=function(){return Math.atan2(this.p1.y-this.p0.y,this.p1.x-this.p0.x)},vp.prototype.getCoordinate=function(t){return 0===t?this.p0:this.p1},vp.prototype.distancePerpendicular=function(t){return Xl.distancePointLinePerpendicular(t,this.p0,this.p1)},vp.prototype.minY=function(){return Math.min(this.p0.y,this.p1.y)},vp.prototype.midPoint=function(){return vp.midPoint(this.p0,this.p1)},vp.prototype.projectionFactor=function(t){if(t.equals(this.p0))return 0;if(t.equals(this.p1))return 1;var e=this.p1.x-this.p0.x,n=this.p1.y-this.p0.y,r=e*e+n*n;return r<=0?nl.NaN:((t.x-this.p0.x)*e+(t.y-this.p0.y)*n)/r},vp.prototype.closestPoints=function(t){var e=this.intersection(t);if(null!==e)return[e,e];var n=new Array(2).fill(null),r=nl.MAX_VALUE,i=null,o=this.closestPoint(t.p0);r=o.distance(t.p0),n[0]=o,n[1]=t.p0;var s=this.closestPoint(t.p1);(i=s.distance(t.p1))<r&&(r=i,n[0]=s,n[1]=t.p1);var a=t.closestPoint(this.p0);(i=a.distance(this.p0))<r&&(r=i,n[0]=this.p0,n[1]=a);var u=t.closestPoint(this.p1);return(i=u.distance(this.p1))<r&&(r=i,n[0]=this.p1,n[1]=u),n},vp.prototype.closestPoint=function(t){var e=this.projectionFactor(t);return e>0&&e<1?this.project(t):this.p0.distance(t)<this.p1.distance(t)?this.p0:this.p1},vp.prototype.maxX=function(){return Math.max(this.p0.x,this.p1.x)},vp.prototype.getLength=function(){return this.p0.distance(this.p1)},vp.prototype.compareTo=function(t){var e=t,n=this.p0.compareTo(e.p0);return 0!==n?n:this.p1.compareTo(e.p1)},vp.prototype.reverse=function(){var t=this.p0;this.p0=this.p1,this.p1=t},vp.prototype.equalsTopo=function(t){return this.p0.equals(t.p0)&&(this.p1.equals(t.p1)||this.p0.equals(t.p1))&&this.p1.equals(t.p0)},vp.prototype.lineIntersection=function(t){try{return Ml.intersection(this.p0,this.p1,t.p0,t.p1)}catch(t){if(!(t instanceof Cl))throw t}return null},vp.prototype.maxY=function(){return Math.max(this.p0.y,this.p1.y)},vp.prototype.pointAlongOffset=function(t,e){var n=this.p0.x+t*(this.p1.x-this.p0.x),r=this.p0.y+t*(this.p1.y-this.p0.y),i=this.p1.x-this.p0.x,o=this.p1.y-this.p0.y,s=Math.sqrt(i*i+o*o),a=0,u=0;if(0!==e){if(s<=0)throw new Error("Cannot compute offset from zero-length line segment");a=e*i/s,u=e*o/s}return new ul(n-u,r+a)},vp.prototype.setCoordinates=function(){if(1===arguments.length){var t=arguments[0];this.setCoordinates(t.p0,t.p1)}else if(2===arguments.length){var e=arguments[0],n=arguments[1];this.p0.x=e.x,this.p0.y=e.y,this.p1.x=n.x,this.p1.y=n.y}},vp.prototype.segmentFraction=function(t){var e=this.projectionFactor(t);return e<0?e=0:(e>1||nl.isNaN(e))&&(e=1),e},vp.prototype.toString=function(){return"LINESTRING( "+this.p0.x+" "+this.p0.y+", "+this.p1.x+" "+this.p1.y+")"},vp.prototype.isHorizontal=function(){return this.p0.y===this.p1.y},vp.prototype.distance=function(){if(arguments[0]instanceof vp){var t=arguments[0];return Xl.distanceLineLine(this.p0,this.p1,t.p0,t.p1)}if(arguments[0]instanceof ul){var e=arguments[0];return Xl.distancePointLine(e,this.p0,this.p1)}},vp.prototype.pointAlong=function(t){var e=new ul;return e.x=this.p0.x+t*(this.p1.x-this.p0.x),e.y=this.p0.y+t*(this.p1.y-this.p0.y),e},vp.prototype.hashCode=function(){var t=nl.doubleToLongBits(this.p0.x);t^=31*nl.doubleToLongBits(this.p0.y);var e=Math.trunc(t)^Math.trunc(t>>32),n=nl.doubleToLongBits(this.p1.x);return n^=31*nl.doubleToLongBits(this.p1.y),e^(Math.trunc(n)^Math.trunc(n>>32))},vp.prototype.interfaces_=function(){return[il,al]},vp.prototype.getClass=function(){return vp},vp.midPoint=function(t,e){return new ul((t.x+e.x)/2,(t.y+e.y)/2)},_p.serialVersionUID.get=function(){return 0x2d2172135f411c00},Object.defineProperties(vp,_p);var mp=function(){this.tempEnv1=new Ll,this.tempEnv2=new Ll,this._overlapSeg1=new vp,this._overlapSeg2=new vp};mp.prototype.overlap=function(){if(2===arguments.length);else if(4===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];t.getLineSegment(e,this._overlapSeg1),n.getLineSegment(r,this._overlapSeg2),this.overlap(this._overlapSeg1,this._overlapSeg2)}},mp.prototype.interfaces_=function(){return[]},mp.prototype.getClass=function(){return mp};var xp=function(){this._pts=null,this._start=null,this._end=null,this._env=null,this._context=null,this._id=null;var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];this._pts=t,this._start=e,this._end=n,this._context=r};xp.prototype.getLineSegment=function(t,e){e.p0=this._pts[t],e.p1=this._pts[t+1]},xp.prototype.computeSelect=function(t,e,n,r){var i=this._pts[e],o=this._pts[n];if(r.tempEnv1.init(i,o),n-e==1)return r.select(this,e),null;if(!t.intersects(r.tempEnv1))return null;var s=Math.trunc((e+n)/2);e<s&&this.computeSelect(t,e,s,r),s<n&&this.computeSelect(t,s,n,r)},xp.prototype.getCoordinates=function(){for(var t=new Array(this._end-this._start+1).fill(null),e=0,n=this._start;n<=this._end;n++)t[e++]=this._pts[n];return t},xp.prototype.computeOverlaps=function(t,e){this.computeOverlapsInternal(this._start,this._end,t,t._start,t._end,e)},xp.prototype.setId=function(t){this._id=t},xp.prototype.select=function(t,e){this.computeSelect(t,this._start,this._end,e)},xp.prototype.getEnvelope=function(){if(null===this._env){var t=this._pts[this._start],e=this._pts[this._end];this._env=new Ll(t,e)}return this._env},xp.prototype.getEndIndex=function(){return this._end},xp.prototype.getStartIndex=function(){return this._start},xp.prototype.getContext=function(){return this._context},xp.prototype.getId=function(){return this._id},xp.prototype.computeOverlapsInternal=function(t,e,n,r,i,o){var s=this._pts[t],a=this._pts[e],u=n._pts[r],l=n._pts[i];if(e-t==1&&i-r==1)return o.overlap(this,t,n,r),null;if(o.tempEnv1.init(s,a),o.tempEnv2.init(u,l),!o.tempEnv1.intersects(o.tempEnv2))return null;var c=Math.trunc((t+e)/2),h=Math.trunc((r+i)/2);t<c&&(r<h&&this.computeOverlapsInternal(t,c,n,r,h,o),h<i&&this.computeOverlapsInternal(t,c,n,h,i,o)),c<e&&(r<h&&this.computeOverlapsInternal(c,e,n,r,h,o),h<i&&this.computeOverlapsInternal(c,e,n,h,i,o))},xp.prototype.interfaces_=function(){return[]},xp.prototype.getClass=function(){return xp};var Ep=function(){};Ep.prototype.interfaces_=function(){return[]},Ep.prototype.getClass=function(){return Ep},Ep.getChainStartIndices=function(t){var e=0,n=new lc;n.add(new _l(e));do{var r=Ep.findChainEnd(t,e);n.add(new _l(r)),e=r}while(e<t.length-1);return Ep.toIntArray(n)},Ep.findChainEnd=function(t,e){for(var n=e;n<t.length-1&&t[n].equals2D(t[n+1]);)n++;if(n>=t.length-1)return t.length-1;for(var r=jh.quadrant(t[n],t[n+1]),i=e+1;i<t.length;){if(!t[i-1].equals2D(t[i]))if(jh.quadrant(t[i-1],t[i])!==r)break;i++}return i-1},Ep.getChains=function(){if(1===arguments.length){var t=arguments[0];return Ep.getChains(t,null)}if(2===arguments.length){for(var e=arguments[0],n=arguments[1],r=new lc,i=Ep.getChainStartIndices(e),o=0;o<i.length-1;o++){var s=new xp(e,i[o],i[o+1],n);r.add(s)}return r}},Ep.toIntArray=function(t){for(var e=new Array(t.size()).fill(null),n=0;n<e.length;n++)e[n]=t.get(n).intValue();return e};var bp=function(){};bp.prototype.computeNodes=function(t){},bp.prototype.getNodedSubstrings=function(){},bp.prototype.interfaces_=function(){return[]},bp.prototype.getClass=function(){return bp};var wp=function(){if(this._segInt=null,0===arguments.length);else if(1===arguments.length){var t=arguments[0];this.setSegmentIntersector(t)}};wp.prototype.setSegmentIntersector=function(t){this._segInt=t},wp.prototype.interfaces_=function(){return[bp]},wp.prototype.getClass=function(){return wp};var Ip=function(t){function e(e){e?t.call(this,e):t.call(this),this._monoChains=new lc,this._index=new up,this._idCounter=0,this._nodedSegStrings=null,this._nOverlaps=0}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={SegmentOverlapAction:{configurable:!0}};return e.prototype.getMonotoneChains=function(){return this._monoChains},e.prototype.getNodedSubstrings=function(){return yp.getNodedSubstrings(this._nodedSegStrings)},e.prototype.getIndex=function(){return this._index},e.prototype.add=function(t){for(var e=this,n=Ep.getChains(t.getCoordinates(),t).iterator();n.hasNext();){var r=n.next();r.setId(e._idCounter++),e._index.insert(r.getEnvelope(),r),e._monoChains.add(r)}},e.prototype.computeNodes=function(t){this._nodedSegStrings=t;for(var e=t.iterator();e.hasNext();)this.add(e.next());this.intersectChains()},e.prototype.intersectChains=function(){for(var t=this,e=new Np(this._segInt),n=this._monoChains.iterator();n.hasNext();)for(var r=n.next(),i=t._index.query(r.getEnvelope()).iterator();i.hasNext();){var o=i.next();if(o.getId()>r.getId()&&(r.computeOverlaps(o,e),t._nOverlaps++),t._segInt.isDone())return null}},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},n.SegmentOverlapAction.get=function(){return Np},Object.defineProperties(e,n),e}(wp),Np=function(t){function e(){t.call(this),this._si=null;var e=arguments[0];this._si=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.overlap=function(){if(4!==arguments.length)return t.prototype.overlap.apply(this,arguments);var e=arguments[0],n=arguments[1],r=arguments[2],i=arguments[3],o=e.getContext(),s=r.getContext();this._si.processIntersections(o,n,s,i)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(mp),Sp=function t(){if(this._quadrantSegments=t.DEFAULT_QUADRANT_SEGMENTS,this._endCapStyle=t.CAP_ROUND,this._joinStyle=t.JOIN_ROUND,this._mitreLimit=t.DEFAULT_MITRE_LIMIT,this._isSingleSided=!1,this._simplifyFactor=t.DEFAULT_SIMPLIFY_FACTOR,0===arguments.length);else if(1===arguments.length){var e=arguments[0];this.setQuadrantSegments(e)}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.setQuadrantSegments(n),this.setEndCapStyle(r)}else if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3];this.setQuadrantSegments(i),this.setEndCapStyle(o),this.setJoinStyle(s),this.setMitreLimit(a)}},Cp={CAP_ROUND:{configurable:!0},CAP_FLAT:{configurable:!0},CAP_SQUARE:{configurable:!0},JOIN_ROUND:{configurable:!0},JOIN_MITRE:{configurable:!0},JOIN_BEVEL:{configurable:!0},DEFAULT_QUADRANT_SEGMENTS:{configurable:!0},DEFAULT_MITRE_LIMIT:{configurable:!0},DEFAULT_SIMPLIFY_FACTOR:{configurable:!0}};Sp.prototype.getEndCapStyle=function(){return this._endCapStyle},Sp.prototype.isSingleSided=function(){return this._isSingleSided},Sp.prototype.setQuadrantSegments=function(t){this._quadrantSegments=t,0===this._quadrantSegments&&(this._joinStyle=Sp.JOIN_BEVEL),this._quadrantSegments<0&&(this._joinStyle=Sp.JOIN_MITRE,this._mitreLimit=Math.abs(this._quadrantSegments)),t<=0&&(this._quadrantSegments=1),this._joinStyle!==Sp.JOIN_ROUND&&(this._quadrantSegments=Sp.DEFAULT_QUADRANT_SEGMENTS)},Sp.prototype.getJoinStyle=function(){return this._joinStyle},Sp.prototype.setJoinStyle=function(t){this._joinStyle=t},Sp.prototype.setSimplifyFactor=function(t){this._simplifyFactor=t<0?0:t},Sp.prototype.getSimplifyFactor=function(){return this._simplifyFactor},Sp.prototype.getQuadrantSegments=function(){return this._quadrantSegments},Sp.prototype.setEndCapStyle=function(t){this._endCapStyle=t},Sp.prototype.getMitreLimit=function(){return this._mitreLimit},Sp.prototype.setMitreLimit=function(t){this._mitreLimit=t},Sp.prototype.setSingleSided=function(t){this._isSingleSided=t},Sp.prototype.interfaces_=function(){return[]},Sp.prototype.getClass=function(){return Sp},Sp.bufferDistanceError=function(t){var e=Math.PI/2/t;return 1-Math.cos(e/2)},Cp.CAP_ROUND.get=function(){return 1},Cp.CAP_FLAT.get=function(){return 2},Cp.CAP_SQUARE.get=function(){return 3},Cp.JOIN_ROUND.get=function(){return 1},Cp.JOIN_MITRE.get=function(){return 2},Cp.JOIN_BEVEL.get=function(){return 3},Cp.DEFAULT_QUADRANT_SEGMENTS.get=function(){return 8},Cp.DEFAULT_MITRE_LIMIT.get=function(){return 5},Cp.DEFAULT_SIMPLIFY_FACTOR.get=function(){return.01},Object.defineProperties(Sp,Cp);var Pp=function(t){this._distanceTol=null,this._isDeleted=null,this._angleOrientation=Xl.COUNTERCLOCKWISE,this._inputLine=t||null},Mp={INIT:{configurable:!0},DELETE:{configurable:!0},KEEP:{configurable:!0},NUM_PTS_TO_CHECK:{configurable:!0}};Pp.prototype.isDeletable=function(t,e,n,r){var i=this._inputLine[t],o=this._inputLine[e],s=this._inputLine[n];return!!this.isConcave(i,o,s)&&(!!this.isShallow(i,o,s,r)&&this.isShallowSampled(i,o,t,n,r))},Pp.prototype.deleteShallowConcavities=function(){for(var t=this,e=1,n=this.findNextNonDeletedIndex(e),r=this.findNextNonDeletedIndex(n),i=!1;r<this._inputLine.length;){var o=!1;t.isDeletable(e,n,r,t._distanceTol)&&(t._isDeleted[n]=Pp.DELETE,o=!0,i=!0),e=o?r:n,n=t.findNextNonDeletedIndex(e),r=t.findNextNonDeletedIndex(n)}return i},Pp.prototype.isShallowConcavity=function(t,e,n,r){return Xl.computeOrientation(t,e,n)===this._angleOrientation&&Xl.distancePointLine(e,t,n)<r},Pp.prototype.isShallowSampled=function(t,e,n,r,i){var o=Math.trunc((r-n)/Pp.NUM_PTS_TO_CHECK);o<=0&&(o=1);for(var s=n;s<r;s+=o)if(!this.isShallow(t,e,this._inputLine[s],i))return!1;return!0},Pp.prototype.isConcave=function(t,e,n){var r=Xl.computeOrientation(t,e,n)===this._angleOrientation;return r},Pp.prototype.simplify=function(t){this._distanceTol=Math.abs(t),t<0&&(this._angleOrientation=Xl.CLOCKWISE),this._isDeleted=new Array(this._inputLine.length).fill(null);var e=!1;do{e=this.deleteShallowConcavities()}while(e);return this.collapseLine()},Pp.prototype.findNextNonDeletedIndex=function(t){for(var e=t+1;e<this._inputLine.length&&this._isDeleted[e]===Pp.DELETE;)e++;return e},Pp.prototype.isShallow=function(t,e,n,r){return Xl.distancePointLine(e,t,n)<r},Pp.prototype.collapseLine=function(){for(var t=new hc,e=0;e<this._inputLine.length;e++)this._isDeleted[e]!==Pp.DELETE&&t.add(this._inputLine[e]);return t.toCoordinateArray()},Pp.prototype.interfaces_=function(){return[]},Pp.prototype.getClass=function(){return Pp},Pp.simplify=function(t,e){return new Pp(t).simplify(e)},Mp.INIT.get=function(){return 0},Mp.DELETE.get=function(){return 1},Mp.KEEP.get=function(){return 1},Mp.NUM_PTS_TO_CHECK.get=function(){return 10},Object.defineProperties(Pp,Mp);var Lp=function(){this._ptList=null,this._precisionModel=null,this._minimimVertexDistance=0,this._ptList=new lc},Op={COORDINATE_ARRAY_TYPE:{configurable:!0}};Lp.prototype.getCoordinates=function(){return this._ptList.toArray(Lp.COORDINATE_ARRAY_TYPE)},Lp.prototype.setPrecisionModel=function(t){this._precisionModel=t},Lp.prototype.addPt=function(t){var e=new ul(t);if(this._precisionModel.makePrecise(e),this.isRedundant(e))return null;this._ptList.add(e)},Lp.prototype.revere=function(){},Lp.prototype.addPts=function(t,e){if(e)for(var n=0;n<t.length;n++)this.addPt(t[n]);else for(var r=t.length-1;r>=0;r--)this.addPt(t[r])},Lp.prototype.isRedundant=function(t){if(this._ptList.size()<1)return!1;var e=this._ptList.get(this._ptList.size()-1);return t.distance(e)<this._minimimVertexDistance},Lp.prototype.toString=function(){return(new _h).createLineString(this.getCoordinates()).toString()},Lp.prototype.closeRing=function(){if(this._ptList.size()<1)return null;var t=new ul(this._ptList.get(0)),e=this._ptList.get(this._ptList.size()-1);if(t.equals(e))return null;this._ptList.add(t)},Lp.prototype.setMinimumVertexDistance=function(t){this._minimimVertexDistance=t},Lp.prototype.interfaces_=function(){return[]},Lp.prototype.getClass=function(){return Lp},Op.COORDINATE_ARRAY_TYPE.get=function(){return new Array(0).fill(null)},Object.defineProperties(Lp,Op);var Rp=function(){},Tp={PI_TIMES_2:{configurable:!0},PI_OVER_2:{configurable:!0},PI_OVER_4:{configurable:!0},COUNTERCLOCKWISE:{configurable:!0},CLOCKWISE:{configurable:!0},NONE:{configurable:!0}};Rp.prototype.interfaces_=function(){return[]},Rp.prototype.getClass=function(){return Rp},Rp.toDegrees=function(t){return 180*t/Math.PI},Rp.normalize=function(t){for(;t>Math.PI;)t-=Rp.PI_TIMES_2;for(;t<=-Math.PI;)t+=Rp.PI_TIMES_2;return t},Rp.angle=function(){if(1===arguments.length){var t=arguments[0];return Math.atan2(t.y,t.x)}if(2===arguments.length){var e=arguments[0],n=arguments[1],r=n.x-e.x,i=n.y-e.y;return Math.atan2(i,r)}},Rp.isAcute=function(t,e,n){var r=t.x-e.x,i=t.y-e.y;return r*(n.x-e.x)+i*(n.y-e.y)>0},Rp.isObtuse=function(t,e,n){var r=t.x-e.x,i=t.y-e.y;return r*(n.x-e.x)+i*(n.y-e.y)<0},Rp.interiorAngle=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n);return Math.abs(i-r)},Rp.normalizePositive=function(t){if(t<0){for(;t<0;)t+=Rp.PI_TIMES_2;t>=Rp.PI_TIMES_2&&(t=0)}else{for(;t>=Rp.PI_TIMES_2;)t-=Rp.PI_TIMES_2;t<0&&(t=0)}return t},Rp.angleBetween=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n);return Rp.diff(r,i)},Rp.diff=function(t,e){var n=null;return(n=t<e?e-t:t-e)>Math.PI&&(n=2*Math.PI-n),n},Rp.toRadians=function(t){return t*Math.PI/180},Rp.getTurn=function(t,e){var n=Math.sin(e-t);return n>0?Rp.COUNTERCLOCKWISE:n<0?Rp.CLOCKWISE:Rp.NONE},Rp.angleBetweenOriented=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n)-r;return i<=-Math.PI?i+Rp.PI_TIMES_2:i>Math.PI?i-Rp.PI_TIMES_2:i},Tp.PI_TIMES_2.get=function(){return 2*Math.PI},Tp.PI_OVER_2.get=function(){return Math.PI/2},Tp.PI_OVER_4.get=function(){return Math.PI/4},Tp.COUNTERCLOCKWISE.get=function(){return Xl.COUNTERCLOCKWISE},Tp.CLOCKWISE.get=function(){return Xl.CLOCKWISE},Tp.NONE.get=function(){return Xl.COLLINEAR},Object.defineProperties(Rp,Tp);var Ap=function t(){this._maxCurveSegmentError=0,this._filletAngleQuantum=null,this._closingSegLengthFactor=1,this._segList=null,this._distance=0,this._precisionModel=null,this._bufParams=null,this._li=null,this._s0=null,this._s1=null,this._s2=null,this._seg0=new vp,this._seg1=new vp,this._offset0=new vp,this._offset1=new vp,this._side=0,this._hasNarrowConcaveAngle=!1;var e=arguments[0],n=arguments[1],r=arguments[2];this._precisionModel=e,this._bufParams=n,this._li=new jl,this._filletAngleQuantum=Math.PI/2/n.getQuadrantSegments(),n.getQuadrantSegments()>=8&&n.getJoinStyle()===Sp.JOIN_ROUND&&(this._closingSegLengthFactor=t.MAX_CLOSING_SEG_LEN_FACTOR),this.init(r)},Dp={OFFSET_SEGMENT_SEPARATION_FACTOR:{configurable:!0},INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR:{configurable:!0},CURVE_VERTEX_SNAP_DISTANCE_FACTOR:{configurable:!0},MAX_CLOSING_SEG_LEN_FACTOR:{configurable:!0}};Ap.prototype.addNextSegment=function(t,e){if(this._s0=this._s1,this._s1=this._s2,this._s2=t,this._seg0.setCoordinates(this._s0,this._s1),this.computeOffsetSegment(this._seg0,this._side,this._distance,this._offset0),this._seg1.setCoordinates(this._s1,this._s2),this.computeOffsetSegment(this._seg1,this._side,this._distance,this._offset1),this._s1.equals(this._s2))return null;var n=Xl.computeOrientation(this._s0,this._s1,this._s2),r=n===Xl.CLOCKWISE&&this._side===Sh.LEFT||n===Xl.COUNTERCLOCKWISE&&this._side===Sh.RIGHT;0===n?this.addCollinear(e):r?this.addOutsideTurn(n,e):this.addInsideTurn(n,e)},Ap.prototype.addLineEndCap=function(t,e){var n=new vp(t,e),r=new vp;this.computeOffsetSegment(n,Sh.LEFT,this._distance,r);var i=new vp;this.computeOffsetSegment(n,Sh.RIGHT,this._distance,i);var o=e.x-t.x,s=e.y-t.y,a=Math.atan2(s,o);switch(this._bufParams.getEndCapStyle()){case Sp.CAP_ROUND:this._segList.addPt(r.p1),this.addFilletArc(e,a+Math.PI/2,a-Math.PI/2,Xl.CLOCKWISE,this._distance),this._segList.addPt(i.p1);break;case Sp.CAP_FLAT:this._segList.addPt(r.p1),this._segList.addPt(i.p1);break;case Sp.CAP_SQUARE:var u=new ul;u.x=Math.abs(this._distance)*Math.cos(a),u.y=Math.abs(this._distance)*Math.sin(a);var l=new ul(r.p1.x+u.x,r.p1.y+u.y),c=new ul(i.p1.x+u.x,i.p1.y+u.y);this._segList.addPt(l),this._segList.addPt(c)}},Ap.prototype.getCoordinates=function(){return this._segList.getCoordinates()},Ap.prototype.addMitreJoin=function(t,e,n,r){var i=!0,o=null;try{o=Ml.intersection(e.p0,e.p1,n.p0,n.p1),(r<=0?1:o.distance(t)/Math.abs(r))>this._bufParams.getMitreLimit()&&(i=!1)}catch(t){if(!(t instanceof Cl))throw t;o=new ul(0,0),i=!1}i?this._segList.addPt(o):this.addLimitedMitreJoin(e,n,r,this._bufParams.getMitreLimit())},Ap.prototype.addFilletCorner=function(t,e,n,r,i){var o=e.x-t.x,s=e.y-t.y,a=Math.atan2(s,o),u=n.x-t.x,l=n.y-t.y,c=Math.atan2(l,u);r===Xl.CLOCKWISE?a<=c&&(a+=2*Math.PI):a>=c&&(a-=2*Math.PI),this._segList.addPt(e),this.addFilletArc(t,a,c,r,i),this._segList.addPt(n)},Ap.prototype.addOutsideTurn=function(t,e){if(this._offset0.p1.distance(this._offset1.p0)<this._distance*Ap.OFFSET_SEGMENT_SEPARATION_FACTOR)return this._segList.addPt(this._offset0.p1),null;this._bufParams.getJoinStyle()===Sp.JOIN_MITRE?this.addMitreJoin(this._s1,this._offset0,this._offset1,this._distance):this._bufParams.getJoinStyle()===Sp.JOIN_BEVEL?this.addBevelJoin(this._offset0,this._offset1):(e&&this._segList.addPt(this._offset0.p1),this.addFilletCorner(this._s1,this._offset0.p1,this._offset1.p0,t,this._distance),this._segList.addPt(this._offset1.p0))},Ap.prototype.createSquare=function(t){this._segList.addPt(new ul(t.x+this._distance,t.y+this._distance)),this._segList.addPt(new ul(t.x+this._distance,t.y-this._distance)),this._segList.addPt(new ul(t.x-this._distance,t.y-this._distance)),this._segList.addPt(new ul(t.x-this._distance,t.y+this._distance)),this._segList.closeRing()},Ap.prototype.addSegments=function(t,e){this._segList.addPts(t,e)},Ap.prototype.addFirstSegment=function(){this._segList.addPt(this._offset1.p0)},Ap.prototype.addLastSegment=function(){this._segList.addPt(this._offset1.p1)},Ap.prototype.initSideSegments=function(t,e,n){this._s1=t,this._s2=e,this._side=n,this._seg1.setCoordinates(t,e),this.computeOffsetSegment(this._seg1,n,this._distance,this._offset1)},Ap.prototype.addLimitedMitreJoin=function(t,e,n,r){var i=this._seg0.p1,o=Rp.angle(i,this._seg0.p0),s=Rp.angleBetweenOriented(this._seg0.p0,i,this._seg1.p1)/2,a=Rp.normalize(o+s),u=Rp.normalize(a+Math.PI),l=r*n,c=n-l*Math.abs(Math.sin(s)),h=i.x+l*Math.cos(u),p=i.y+l*Math.sin(u),f=new ul(h,p),g=new vp(i,f),d=g.pointAlongOffset(1,c),y=g.pointAlongOffset(1,-c);this._side===Sh.LEFT?(this._segList.addPt(d),this._segList.addPt(y)):(this._segList.addPt(y),this._segList.addPt(d))},Ap.prototype.computeOffsetSegment=function(t,e,n,r){var i=e===Sh.LEFT?1:-1,o=t.p1.x-t.p0.x,s=t.p1.y-t.p0.y,a=Math.sqrt(o*o+s*s),u=i*n*o/a,l=i*n*s/a;r.p0.x=t.p0.x-l,r.p0.y=t.p0.y+u,r.p1.x=t.p1.x-l,r.p1.y=t.p1.y+u},Ap.prototype.addFilletArc=function(t,e,n,r,i){var o=r===Xl.CLOCKWISE?-1:1,s=Math.abs(e-n),a=Math.trunc(s/this._filletAngleQuantum+.5);if(a<1)return null;for(var u=s/a,l=0,c=new ul;l<s;){var h=e+o*l;c.x=t.x+i*Math.cos(h),c.y=t.y+i*Math.sin(h),this._segList.addPt(c),l+=u}},Ap.prototype.addInsideTurn=function(t,e){if(this._li.computeIntersection(this._offset0.p0,this._offset0.p1,this._offset1.p0,this._offset1.p1),this._li.hasIntersection())this._segList.addPt(this._li.getIntersection(0));else if(this._hasNarrowConcaveAngle=!0,this._offset0.p1.distance(this._offset1.p0)<this._distance*Ap.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR)this._segList.addPt(this._offset0.p1);else{if(this._segList.addPt(this._offset0.p1),this._closingSegLengthFactor>0){var n=new ul((this._closingSegLengthFactor*this._offset0.p1.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset0.p1.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(n);var r=new ul((this._closingSegLengthFactor*this._offset1.p0.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset1.p0.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(r)}else this._segList.addPt(this._s1);this._segList.addPt(this._offset1.p0)}},Ap.prototype.createCircle=function(t){var e=new ul(t.x+this._distance,t.y);this._segList.addPt(e),this.addFilletArc(t,0,2*Math.PI,-1,this._distance),this._segList.closeRing()},Ap.prototype.addBevelJoin=function(t,e){this._segList.addPt(t.p1),this._segList.addPt(e.p0)},Ap.prototype.init=function(t){this._distance=t,this._maxCurveSegmentError=t*(1-Math.cos(this._filletAngleQuantum/2)),this._segList=new Lp,this._segList.setPrecisionModel(this._precisionModel),this._segList.setMinimumVertexDistance(t*Ap.CURVE_VERTEX_SNAP_DISTANCE_FACTOR)},Ap.prototype.addCollinear=function(t){this._li.computeIntersection(this._s0,this._s1,this._s1,this._s2),this._li.getIntersectionNum()>=2&&(this._bufParams.getJoinStyle()===Sp.JOIN_BEVEL||this._bufParams.getJoinStyle()===Sp.JOIN_MITRE?(t&&this._segList.addPt(this._offset0.p1),this._segList.addPt(this._offset1.p0)):this.addFilletCorner(this._s1,this._offset0.p1,this._offset1.p0,Xl.CLOCKWISE,this._distance))},Ap.prototype.closeRing=function(){this._segList.closeRing()},Ap.prototype.hasNarrowConcaveAngle=function(){return this._hasNarrowConcaveAngle},Ap.prototype.interfaces_=function(){return[]},Ap.prototype.getClass=function(){return Ap},Dp.OFFSET_SEGMENT_SEPARATION_FACTOR.get=function(){return.001},Dp.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR.get=function(){return.001},Dp.CURVE_VERTEX_SNAP_DISTANCE_FACTOR.get=function(){return 1e-6},Dp.MAX_CLOSING_SEG_LEN_FACTOR.get=function(){return 80},Object.defineProperties(Ap,Dp);var Fp=function(){this._distance=0,this._precisionModel=null,this._bufParams=null;var t=arguments[0],e=arguments[1];this._precisionModel=t,this._bufParams=e};Fp.prototype.getOffsetCurve=function(t,e){if(this._distance=e,0===e)return null;var n=e<0,r=Math.abs(e),i=this.getSegGen(r);t.length<=1?this.computePointCurve(t[0],i):this.computeOffsetCurve(t,n,i);var o=i.getCoordinates();return n&&pc.reverse(o),o},Fp.prototype.computeSingleSidedBufferCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);if(e){n.addSegments(t,!0);var i=Pp.simplify(t,-r),o=i.length-1;n.initSideSegments(i[o],i[o-1],Sh.LEFT),n.addFirstSegment();for(var s=o-2;s>=0;s--)n.addNextSegment(i[s],!0)}else{n.addSegments(t,!1);var a=Pp.simplify(t,r),u=a.length-1;n.initSideSegments(a[0],a[1],Sh.LEFT),n.addFirstSegment();for(var l=2;l<=u;l++)n.addNextSegment(a[l],!0)}n.addLastSegment(),n.closeRing()},Fp.prototype.computeRingBufferCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);e===Sh.RIGHT&&(r=-r);var i=Pp.simplify(t,r),o=i.length-1;n.initSideSegments(i[o-1],i[0],e);for(var s=1;s<=o;s++){var a=1!==s;n.addNextSegment(i[s],a)}n.closeRing()},Fp.prototype.computeLineBufferCurve=function(t,e){var n=this.simplifyTolerance(this._distance),r=Pp.simplify(t,n),i=r.length-1;e.initSideSegments(r[0],r[1],Sh.LEFT);for(var o=2;o<=i;o++)e.addNextSegment(r[o],!0);e.addLastSegment(),e.addLineEndCap(r[i-1],r[i]);var s=Pp.simplify(t,-n),a=s.length-1;e.initSideSegments(s[a],s[a-1],Sh.LEFT);for(var u=a-2;u>=0;u--)e.addNextSegment(s[u],!0);e.addLastSegment(),e.addLineEndCap(s[1],s[0]),e.closeRing()},Fp.prototype.computePointCurve=function(t,e){switch(this._bufParams.getEndCapStyle()){case Sp.CAP_ROUND:e.createCircle(t);break;case Sp.CAP_SQUARE:e.createSquare(t)}},Fp.prototype.getLineCurve=function(t,e){if(this._distance=e,e<0&&!this._bufParams.isSingleSided())return null;if(0===e)return null;var n=Math.abs(e),r=this.getSegGen(n);if(t.length<=1)this.computePointCurve(t[0],r);else if(this._bufParams.isSingleSided()){var i=e<0;this.computeSingleSidedBufferCurve(t,i,r)}else this.computeLineBufferCurve(t,r);return r.getCoordinates()},Fp.prototype.getBufferParameters=function(){return this._bufParams},Fp.prototype.simplifyTolerance=function(t){return t*this._bufParams.getSimplifyFactor()},Fp.prototype.getRingCurve=function(t,e,n){if(this._distance=n,t.length<=2)return this.getLineCurve(t,n);if(0===n)return Fp.copyCoordinates(t);var r=this.getSegGen(n);return this.computeRingBufferCurve(t,e,r),r.getCoordinates()},Fp.prototype.computeOffsetCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);if(e){var i=Pp.simplify(t,-r),o=i.length-1;n.initSideSegments(i[o],i[o-1],Sh.LEFT),n.addFirstSegment();for(var s=o-2;s>=0;s--)n.addNextSegment(i[s],!0)}else{var a=Pp.simplify(t,r),u=a.length-1;n.initSideSegments(a[0],a[1],Sh.LEFT),n.addFirstSegment();for(var l=2;l<=u;l++)n.addNextSegment(a[l],!0)}n.addLastSegment()},Fp.prototype.getSegGen=function(t){return new Ap(this._precisionModel,this._bufParams,t)},Fp.prototype.interfaces_=function(){return[]},Fp.prototype.getClass=function(){return Fp},Fp.copyCoordinates=function(t){for(var e=new Array(t.length).fill(null),n=0;n<e.length;n++)e[n]=new ul(t[n]);return e};var kp=function(){this._subgraphs=null,this._seg=new vp,this._cga=new Xl;var t=arguments[0];this._subgraphs=t},Gp={DepthSegment:{configurable:!0}};kp.prototype.findStabbedSegments=function(){var t=this;if(1===arguments.length){for(var e=arguments[0],n=new lc,r=this._subgraphs.iterator();r.hasNext();){var i=r.next(),o=i.getEnvelope();e.y<o.getMinY()||e.y>o.getMaxY()||t.findStabbedSegments(e,i.getDirectedEdges(),n)}return n}if(3===arguments.length)if(gl(arguments[2],ac)&&arguments[0]instanceof ul&&arguments[1]instanceof Xh)for(var s=arguments[0],a=arguments[1],u=arguments[2],l=a.getEdge().getCoordinates(),c=0;c<l.length-1;c++){t._seg.p0=l[c],t._seg.p1=l[c+1],t._seg.p0.y>t._seg.p1.y&&t._seg.reverse();var h=Math.max(t._seg.p0.x,t._seg.p1.x);if(!(h<s.x)&&!(t._seg.isHorizontal()||s.y<t._seg.p0.y||s.y>t._seg.p1.y||Xl.computeOrientation(t._seg.p0,t._seg.p1,s)===Xl.RIGHT)){var p=a.getDepth(Sh.LEFT);t._seg.p0.equals(l[c])||(p=a.getDepth(Sh.RIGHT));var f=new qp(t._seg,p);u.add(f)}}else if(gl(arguments[2],ac)&&arguments[0]instanceof ul&&gl(arguments[1],ac))for(var g=arguments[0],d=arguments[1],y=arguments[2],v=d.iterator();v.hasNext();){var _=v.next();_.isForward()&&t.findStabbedSegments(g,_,y)}},kp.prototype.getDepth=function(t){var e=this.findStabbedSegments(t);return 0===e.size()?0:np.min(e)._leftDepth},kp.prototype.interfaces_=function(){return[]},kp.prototype.getClass=function(){return kp},Gp.DepthSegment.get=function(){return qp},Object.defineProperties(kp,Gp);var qp=function(){this._upwardSeg=null,this._leftDepth=null;var t=arguments[0],e=arguments[1];this._upwardSeg=new vp(t),this._leftDepth=e};qp.prototype.compareTo=function(t){var e=t;if(this._upwardSeg.minX()>=e._upwardSeg.maxX())return 1;if(this._upwardSeg.maxX()<=e._upwardSeg.minX())return-1;var n=this._upwardSeg.orientationIndex(e._upwardSeg);return 0!==n||0!==(n=-1*e._upwardSeg.orientationIndex(this._upwardSeg))?n:this._upwardSeg.compareTo(e._upwardSeg)},qp.prototype.compareX=function(t,e){var n=t.p0.compareTo(e.p0);return 0!==n?n:t.p1.compareTo(e.p1)},qp.prototype.toString=function(){return this._upwardSeg.toString()},qp.prototype.interfaces_=function(){return[il]},qp.prototype.getClass=function(){return qp};var Bp=function(t,e,n){this.p0=t||null,this.p1=e||null,this.p2=n||null};Bp.prototype.area=function(){return Bp.area(this.p0,this.p1,this.p2)},Bp.prototype.signedArea=function(){return Bp.signedArea(this.p0,this.p1,this.p2)},Bp.prototype.interpolateZ=function(t){if(null===t)throw new el("Supplied point is null.");return Bp.interpolateZ(t,this.p0,this.p1,this.p2)},Bp.prototype.longestSideLength=function(){return Bp.longestSideLength(this.p0,this.p1,this.p2)},Bp.prototype.isAcute=function(){return Bp.isAcute(this.p0,this.p1,this.p2)},Bp.prototype.circumcentre=function(){return Bp.circumcentre(this.p0,this.p1,this.p2)},Bp.prototype.area3D=function(){return Bp.area3D(this.p0,this.p1,this.p2)},Bp.prototype.centroid=function(){return Bp.centroid(this.p0,this.p1,this.p2)},Bp.prototype.inCentre=function(){return Bp.inCentre(this.p0,this.p1,this.p2)},Bp.prototype.interfaces_=function(){return[]},Bp.prototype.getClass=function(){return Bp},Bp.area=function(t,e,n){return Math.abs(((n.x-t.x)*(e.y-t.y)-(e.x-t.x)*(n.y-t.y))/2)},Bp.signedArea=function(t,e,n){return((n.x-t.x)*(e.y-t.y)-(e.x-t.x)*(n.y-t.y))/2},Bp.det=function(t,e,n,r){return t*r-e*n},Bp.interpolateZ=function(t,e,n,r){var i=e.x,o=e.y,s=n.x-i,a=r.x-i,u=n.y-o,l=r.y-o,c=s*l-a*u,h=t.x-i,p=t.y-o,f=(l*h-a*p)/c,g=(-u*h+s*p)/c;return e.z+f*(n.z-e.z)+g*(r.z-e.z)},Bp.longestSideLength=function(t,e,n){var r=t.distance(e),i=e.distance(n),o=n.distance(t),s=r;return i>s&&(s=i),o>s&&(s=o),s},Bp.isAcute=function(t,e,n){return!!Rp.isAcute(t,e,n)&&(!!Rp.isAcute(e,n,t)&&!!Rp.isAcute(n,t,e))},Bp.circumcentre=function(t,e,n){var r=n.x,i=n.y,o=t.x-r,s=t.y-i,a=e.x-r,u=e.y-i,l=2*Bp.det(o,s,a,u),c=Bp.det(s,o*o+s*s,u,a*a+u*u),h=Bp.det(o,o*o+s*s,a,a*a+u*u);return new ul(r-c/l,i+h/l)},Bp.perpendicularBisector=function(t,e){var n=e.x-t.x,r=e.y-t.y,i=new Ml(t.x+n/2,t.y+r/2,1),o=new Ml(t.x-r+n/2,t.y+n+r/2,1);return new Ml(i,o)},Bp.angleBisector=function(t,e,n){var r=e.distance(t),i=r/(r+e.distance(n)),o=n.x-t.x,s=n.y-t.y;return new ul(t.x+i*o,t.y+i*s)},Bp.area3D=function(t,e,n){var r=e.x-t.x,i=e.y-t.y,o=e.z-t.z,s=n.x-t.x,a=n.y-t.y,u=n.z-t.z,l=i*u-o*a,c=o*s-r*u,h=r*a-i*s,p=l*l+c*c+h*h,f=Math.sqrt(p)/2;return f},Bp.centroid=function(t,e,n){var r=(t.x+e.x+n.x)/3,i=(t.y+e.y+n.y)/3;return new ul(r,i)},Bp.inCentre=function(t,e,n){var r=e.distance(n),i=t.distance(n),o=t.distance(e),s=r+i+o,a=(r*t.x+i*e.x+o*n.x)/s,u=(r*t.y+i*e.y+o*n.y)/s;return new ul(a,u)};var zp=function(){this._inputGeom=null,this._distance=null,this._curveBuilder=null,this._curveList=new lc;var t=arguments[0],e=arguments[1],n=arguments[2];this._inputGeom=t,this._distance=e,this._curveBuilder=n};zp.prototype.addPoint=function(t){if(this._distance<=0)return null;var e=t.getCoordinates(),n=this._curveBuilder.getLineCurve(e,this._distance);this.addCurve(n,pl.EXTERIOR,pl.INTERIOR)},zp.prototype.addPolygon=function(t){var e=this,n=this._distance,r=Sh.LEFT;this._distance<0&&(n=-this._distance,r=Sh.RIGHT);var i=t.getExteriorRing(),o=pc.removeRepeatedPoints(i.getCoordinates());if(this._distance<0&&this.isErodedCompletely(i,this._distance))return null;if(this._distance<=0&&o.length<3)return null;this.addPolygonRing(o,n,r,pl.EXTERIOR,pl.INTERIOR);for(var s=0;s<t.getNumInteriorRing();s++){var a=t.getInteriorRingN(s),u=pc.removeRepeatedPoints(a.getCoordinates());e._distance>0&&e.isErodedCompletely(a,-e._distance)||e.addPolygonRing(u,n,Sh.opposite(r),pl.INTERIOR,pl.EXTERIOR)}},zp.prototype.isTriangleErodedCompletely=function(t,e){var n=new Bp(t[0],t[1],t[2]),r=n.inCentre();return Xl.distancePointLine(r,n.p0,n.p1)<Math.abs(e)},zp.prototype.addLineString=function(t){if(this._distance<=0&&!this._curveBuilder.getBufferParameters().isSingleSided())return null;var e=pc.removeRepeatedPoints(t.getCoordinates()),n=this._curveBuilder.getLineCurve(e,this._distance);this.addCurve(n,pl.EXTERIOR,pl.INTERIOR)},zp.prototype.addCurve=function(t,e,n){if(null===t||t.length<2)return null;var r=new yp(t,new Dh(0,pl.BOUNDARY,e,n));this._curveList.add(r)},zp.prototype.getCurves=function(){return this.add(this._inputGeom),this._curveList},zp.prototype.addPolygonRing=function(t,e,n,r,i){if(0===e&&t.length<nh.MINIMUM_VALID_SIZE)return null;var o=r,s=i;t.length>=nh.MINIMUM_VALID_SIZE&&Xl.isCCW(t)&&(o=i,s=r,n=Sh.opposite(n));var a=this._curveBuilder.getRingCurve(t,n,e);this.addCurve(a,o,s)},zp.prototype.add=function(t){if(t.isEmpty())return null;t instanceof th?this.addPolygon(t):t instanceof Zc?this.addLineString(t):t instanceof Qc?this.addPoint(t):(t instanceof eh||t instanceof Gc||t instanceof rh||t instanceof kc)&&this.addCollection(t)},zp.prototype.isErodedCompletely=function(t,e){var n=t.getCoordinates();if(n.length<4)return e<0;if(4===n.length)return this.isTriangleErodedCompletely(n,e);var r=t.getEnvelopeInternal(),i=Math.min(r.getHeight(),r.getWidth());return e<0&&2*Math.abs(e)>i},zp.prototype.addCollection=function(t){for(var e=0;e<t.getNumGeometries();e++){var n=t.getGeometryN(e);this.add(n)}},zp.prototype.interfaces_=function(){return[]},zp.prototype.getClass=function(){return zp};var jp=function(){};jp.prototype.locate=function(t){},jp.prototype.interfaces_=function(){return[]},jp.prototype.getClass=function(){return jp};var Up=function(){this._parent=null,this._atStart=null,this._max=null,this._index=null,this._subcollectionIterator=null;var t=arguments[0];this._parent=t,this._atStart=!0,this._index=0,this._max=t.getNumGeometries()};Up.prototype.next=function(){if(this._atStart)return this._atStart=!1,Up.isAtomic(this._parent)&&this._index++,this._parent;if(null!==this._subcollectionIterator){if(this._subcollectionIterator.hasNext())return this._subcollectionIterator.next();this._subcollectionIterator=null}if(this._index>=this._max)throw new uc;var t=this._parent.getGeometryN(this._index++);return t instanceof kc?(this._subcollectionIterator=new Up(t),this._subcollectionIterator.next()):t},Up.prototype.remove=function(){throw new Error(this.getClass().getName())},Up.prototype.hasNext=function(){if(this._atStart)return!0;if(null!==this._subcollectionIterator){if(this._subcollectionIterator.hasNext())return!0;this._subcollectionIterator=null}return!(this._index>=this._max)},Up.prototype.interfaces_=function(){return[sc]},Up.prototype.getClass=function(){return Up},Up.isAtomic=function(t){return!(t instanceof kc)};var Vp=function(){this._geom=null;var t=arguments[0];this._geom=t};Vp.prototype.locate=function(t){return Vp.locate(t,this._geom)},Vp.prototype.interfaces_=function(){return[jp]},Vp.prototype.getClass=function(){return Vp},Vp.isPointInRing=function(t,e){return!!e.getEnvelopeInternal().intersects(t)&&Xl.isPointInRing(t,e.getCoordinates())},Vp.containsPointInPolygon=function(t,e){if(e.isEmpty())return!1;var n=e.getExteriorRing();if(!Vp.isPointInRing(t,n))return!1;for(var r=0;r<e.getNumInteriorRing();r++){var i=e.getInteriorRingN(r);if(Vp.isPointInRing(t,i))return!1}return!0},Vp.containsPoint=function(t,e){if(e instanceof th)return Vp.containsPointInPolygon(t,e);if(e instanceof kc)for(var n=new Up(e);n.hasNext();){var r=n.next();if(r!==e&&Vp.containsPoint(t,r))return!0}return!1},Vp.locate=function(t,e){return e.isEmpty()?pl.EXTERIOR:Vp.containsPoint(t,e)?pl.INTERIOR:pl.EXTERIOR};var Xp=function(){this._edgeMap=new Cc,this._edgeList=null,this._ptInAreaLocation=[pl.NONE,pl.NONE]};Xp.prototype.getNextCW=function(t){this.getEdges();var e=this._edgeList.indexOf(t),n=e-1;return 0===e&&(n=this._edgeList.size()-1),this._edgeList.get(n)},Xp.prototype.propagateSideLabels=function(t){for(var e=pl.NONE,n=this.iterator();n.hasNext();){var r=n.next().getLabel();r.isArea(t)&&r.getLocation(t,Sh.LEFT)!==pl.NONE&&(e=r.getLocation(t,Sh.LEFT))}if(e===pl.NONE)return null;for(var i=e,o=this.iterator();o.hasNext();){var s=o.next(),a=s.getLabel();if(a.getLocation(t,Sh.ON)===pl.NONE&&a.setLocation(t,Sh.ON,i),a.isArea(t)){var u=a.getLocation(t,Sh.LEFT),l=a.getLocation(t,Sh.RIGHT);if(l!==pl.NONE){if(l!==i)throw new Oh("side location conflict",s.getCoordinate());u===pl.NONE&&ql.shouldNeverReachHere("found single null side (at "+s.getCoordinate()+")"),i=u}else ql.isTrue(a.getLocation(t,Sh.LEFT)===pl.NONE,"found single null side"),a.setLocation(t,Sh.RIGHT,i),a.setLocation(t,Sh.LEFT,i)}}},Xp.prototype.getCoordinate=function(){var t=this.iterator();return t.hasNext()?t.next().getCoordinate():null},Xp.prototype.print=function(t){Pl.out.println("EdgeEndStar: "+this.getCoordinate());for(var e=this.iterator();e.hasNext();){e.next().print(t)}},Xp.prototype.isAreaLabelsConsistent=function(t){return this.computeEdgeEndLabels(t.getBoundaryNodeRule()),this.checkAreaLabelsConsistent(0)},Xp.prototype.checkAreaLabelsConsistent=function(t){var e=this.getEdges();if(e.size()<=0)return!0;var n=e.size()-1,r=e.get(n).getLabel().getLocation(t,Sh.LEFT);ql.isTrue(r!==pl.NONE,"Found unlabelled area edge");for(var i=r,o=this.iterator();o.hasNext();){var s=o.next().getLabel();ql.isTrue(s.isArea(t),"Found non-area edge");var a=s.getLocation(t,Sh.LEFT),u=s.getLocation(t,Sh.RIGHT);if(a===u)return!1;if(u!==i)return!1;i=a}return!0},Xp.prototype.findIndex=function(t){this.iterator();for(var e=0;e<this._edgeList.size();e++){if(this._edgeList.get(e)===t)return e}return-1},Xp.prototype.iterator=function(){return this.getEdges().iterator()},Xp.prototype.getEdges=function(){return null===this._edgeList&&(this._edgeList=new lc(this._edgeMap.values())),this._edgeList},Xp.prototype.getLocation=function(t,e,n){return this._ptInAreaLocation[t]===pl.NONE&&(this._ptInAreaLocation[t]=Vp.locate(e,n[t].getGeometry())),this._ptInAreaLocation[t]},Xp.prototype.toString=function(){var t=new vl;t.append("EdgeEndStar: "+this.getCoordinate()),t.append("\n");for(var e=this.iterator();e.hasNext();){var n=e.next();t.append(n),t.append("\n")}return t.toString()},Xp.prototype.computeEdgeEndLabels=function(t){for(var e=this.iterator();e.hasNext();){e.next().computeLabel(t)}},Xp.prototype.computeLabelling=function(t){this.computeEdgeEndLabels(t[0].getBoundaryNodeRule()),this.propagateSideLabels(0),this.propagateSideLabels(1);for(var e=[!1,!1],n=this.iterator();n.hasNext();)for(var r=n.next().getLabel(),i=0;i<2;i++)r.isLine(i)&&r.getLocation(i)===pl.BOUNDARY&&(e[i]=!0);for(var o=this.iterator();o.hasNext();)for(var s=o.next(),a=s.getLabel(),u=0;u<2;u++)if(a.isAnyNull(u)){var l=pl.NONE;if(e[u])l=pl.EXTERIOR;else{var c=s.getCoordinate();l=this.getLocation(u,c,t)}a.setAllLocationsIfNull(u,l)}},Xp.prototype.getDegree=function(){return this._edgeMap.size()},Xp.prototype.insertEdgeEnd=function(t,e){this._edgeMap.put(t,e),this._edgeList=null},Xp.prototype.interfaces_=function(){return[]},Xp.prototype.getClass=function(){return Xp};var Yp=function(t){function e(){t.call(this),this._resultAreaEdgeList=null,this._label=null,this._SCANNING_FOR_INCOMING=1,this._LINKING_TO_OUTGOING=2}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.linkResultDirectedEdges=function(){var t=this;this.getResultAreaEdges();for(var e=null,n=null,r=this._SCANNING_FOR_INCOMING,i=0;i<this._resultAreaEdgeList.size();i++){var o=t._resultAreaEdgeList.get(i),s=o.getSym();if(o.getLabel().isArea())switch(null===e&&o.isInResult()&&(e=o),r){case t._SCANNING_FOR_INCOMING:if(!s.isInResult())continue;n=s,r=t._LINKING_TO_OUTGOING;break;case t._LINKING_TO_OUTGOING:if(!o.isInResult())continue;n.setNext(o),r=t._SCANNING_FOR_INCOMING}}if(r===this._LINKING_TO_OUTGOING){if(null===e)throw new Oh("no outgoing dirEdge found",this.getCoordinate());ql.isTrue(e.isInResult(),"unable to link last incoming dirEdge"),n.setNext(e)}},e.prototype.insert=function(t){var e=t;this.insertEdgeEnd(e,e)},e.prototype.getRightmostEdge=function(){var t=this.getEdges(),e=t.size();if(e<1)return null;var n=t.get(0);if(1===e)return n;var r=t.get(e-1),i=n.getQuadrant(),o=r.getQuadrant();return jh.isNorthern(i)&&jh.isNorthern(o)?n:jh.isNorthern(i)||jh.isNorthern(o)?0!==n.getDy()?n:0!==r.getDy()?r:(ql.shouldNeverReachHere("found two horizontal edges incident on node"),null):r},e.prototype.print=function(t){Pl.out.println("DirectedEdgeStar: "+this.getCoordinate());for(var e=this.iterator();e.hasNext();){var n=e.next();t.print("out "),n.print(t),t.println(),t.print("in "),n.getSym().print(t),t.println()}},e.prototype.getResultAreaEdges=function(){if(null!==this._resultAreaEdgeList)return this._resultAreaEdgeList;this._resultAreaEdgeList=new lc;for(var t=this.iterator();t.hasNext();){var e=t.next();(e.isInResult()||e.getSym().isInResult())&&this._resultAreaEdgeList.add(e)}return this._resultAreaEdgeList},e.prototype.updateLabelling=function(t){for(var e=this.iterator();e.hasNext();){var n=e.next().getLabel();n.setAllLocationsIfNull(0,t.getLocation(0)),n.setAllLocationsIfNull(1,t.getLocation(1))}},e.prototype.linkAllDirectedEdges=function(){this.getEdges();for(var t=null,e=null,n=this._edgeList.size()-1;n>=0;n--){var r=this._edgeList.get(n),i=r.getSym();null===e&&(e=i),null!==t&&i.setNext(t),t=r}e.setNext(t)},e.prototype.computeDepths=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=this.findIndex(e),r=e.getDepth(Sh.LEFT),i=e.getDepth(Sh.RIGHT),o=this.computeDepths(n+1,this._edgeList.size(),r),s=this.computeDepths(0,n,o);if(s!==i)throw new Oh("depth mismatch at "+e.getCoordinate())}else if(3===arguments.length){for(var a=arguments[0],u=arguments[1],l=arguments[2],c=l,h=a;h<u;h++){var p=t._edgeList.get(h);p.setEdgeDepths(Sh.RIGHT,c),c=p.getDepth(Sh.LEFT)}return c}},e.prototype.mergeSymLabels=function(){for(var t=this.iterator();t.hasNext();){var e=t.next();e.getLabel().merge(e.getSym().getLabel())}},e.prototype.linkMinimalDirectedEdges=function(t){for(var e=this,n=null,r=null,i=this._SCANNING_FOR_INCOMING,o=this._resultAreaEdgeList.size()-1;o>=0;o--){var s=e._resultAreaEdgeList.get(o),a=s.getSym();switch(null===n&&s.getEdgeRing()===t&&(n=s),i){case e._SCANNING_FOR_INCOMING:if(a.getEdgeRing()!==t)continue;r=a,i=e._LINKING_TO_OUTGOING;break;case e._LINKING_TO_OUTGOING:if(s.getEdgeRing()!==t)continue;r.setNextMin(s),i=e._SCANNING_FOR_INCOMING}}i===this._LINKING_TO_OUTGOING&&(ql.isTrue(null!==n,"found null for first outgoing dirEdge"),ql.isTrue(n.getEdgeRing()===t,"unable to link last incoming dirEdge"),r.setNextMin(n))},e.prototype.getOutgoingDegree=function(){if(0===arguments.length){for(var t=0,e=this.iterator();e.hasNext();){var n=e.next();n.isInResult()&&t++}return t}if(1===arguments.length){for(var r=arguments[0],i=0,o=this.iterator();o.hasNext();){var s=o.next();s.getEdgeRing()===r&&i++}return i}},e.prototype.getLabel=function(){return this._label},e.prototype.findCoveredLineEdges=function(){for(var t=pl.NONE,e=this.iterator();e.hasNext();){var n=e.next(),r=n.getSym();if(!n.isLineEdge()){if(n.isInResult()){t=pl.INTERIOR;break}if(r.isInResult()){t=pl.EXTERIOR;break}}}if(t===pl.NONE)return null;for(var i=t,o=this.iterator();o.hasNext();){var s=o.next(),a=s.getSym();s.isLineEdge()?s.getEdge().setCovered(i===pl.INTERIOR):(s.isInResult()&&(i=pl.EXTERIOR),a.isInResult()&&(i=pl.INTERIOR))}},e.prototype.computeLabelling=function(e){t.prototype.computeLabelling.call(this,e),this._label=new Dh(pl.NONE);for(var n=this.iterator();n.hasNext();)for(var r=n.next().getEdge().getLabel(),i=0;i<2;i++){var o=r.getLocation(i);o!==pl.INTERIOR&&o!==pl.BOUNDARY||this._label.setLocation(i,pl.INTERIOR)}},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Xp),Hp=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createNode=function(t){return new Bh(t,new Yp)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Yh),Wp=function t(){this._pts=null,this._orientation=null;var e=arguments[0];this._pts=e,this._orientation=t.orientation(e)};Wp.prototype.compareTo=function(t){var e=t;return Wp.compareOriented(this._pts,this._orientation,e._pts,e._orientation)},Wp.prototype.interfaces_=function(){return[il]},Wp.prototype.getClass=function(){return Wp},Wp.orientation=function(t){return 1===pc.increasingDirection(t)},Wp.compareOriented=function(t,e,n,r){for(var i=e?1:-1,o=r?1:-1,s=e?t.length:-1,a=r?n.length:-1,u=e?0:t.length-1,l=r?0:n.length-1;;){var c=t[u].compareTo(n[l]);if(0!==c)return c;var h=(u+=i)===s,p=(l+=o)===a;if(h&&!p)return-1;if(!h&&p)return 1;if(h&&p)return 0}};var Jp=function(){this._edges=new lc,this._ocaMap=new Cc};Jp.prototype.print=function(t){t.print("MULTILINESTRING ( ");for(var e=0;e<this._edges.size();e++){var n=this._edges.get(e);e>0&&t.print(","),t.print("(");for(var r=n.getCoordinates(),i=0;i<r.length;i++)i>0&&t.print(","),t.print(r[i].x+" "+r[i].y);t.println(")")}t.print(") ")},Jp.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next())},Jp.prototype.findEdgeIndex=function(t){for(var e=0;e<this._edges.size();e++)if(this._edges.get(e).equals(t))return e;return-1},Jp.prototype.iterator=function(){return this._edges.iterator()},Jp.prototype.getEdges=function(){return this._edges},Jp.prototype.get=function(t){return this._edges.get(t)},Jp.prototype.findEqualEdge=function(t){var e=new Wp(t.getCoordinates());return this._ocaMap.get(e)},Jp.prototype.add=function(t){this._edges.add(t);var e=new Wp(t.getCoordinates());this._ocaMap.put(e,t)},Jp.prototype.interfaces_=function(){return[]},Jp.prototype.getClass=function(){return Jp};var Zp=function(){};Zp.prototype.processIntersections=function(t,e,n,r){},Zp.prototype.isDone=function(){},Zp.prototype.interfaces_=function(){return[]},Zp.prototype.getClass=function(){return Zp};var Kp=function(){this._hasIntersection=!1,this._hasProper=!1,this._hasProperInterior=!1,this._hasInterior=!1,this._properIntersectionPoint=null,this._li=null,this._isSelfIntersection=null,this.numIntersections=0,this.numInteriorIntersections=0,this.numProperIntersections=0,this.numTests=0;var t=arguments[0];this._li=t};Kp.prototype.isTrivialIntersection=function(t,e,n,r){if(t===n&&1===this._li.getIntersectionNum()){if(Kp.isAdjacentSegments(e,r))return!0;if(t.isClosed()){var i=t.size()-1;if(0===e&&r===i||0===r&&e===i)return!0}}return!1},Kp.prototype.getProperIntersectionPoint=function(){return this._properIntersectionPoint},Kp.prototype.hasProperInteriorIntersection=function(){return this._hasProperInterior},Kp.prototype.getLineIntersector=function(){return this._li},Kp.prototype.hasProperIntersection=function(){return this._hasProper},Kp.prototype.processIntersections=function(t,e,n,r){if(t===n&&e===r)return null;this.numTests++;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&(this.numIntersections++,this._li.isInteriorIntersection()&&(this.numInteriorIntersections++,this._hasInterior=!0),this.isTrivialIntersection(t,e,n,r)||(this._hasIntersection=!0,t.addIntersections(this._li,e,0),n.addIntersections(this._li,r,1),this._li.isProper()&&(this.numProperIntersections++,this._hasProper=!0,this._hasProperInterior=!0)))},Kp.prototype.hasIntersection=function(){return this._hasIntersection},Kp.prototype.isDone=function(){return!1},Kp.prototype.hasInteriorIntersection=function(){return this._hasInterior},Kp.prototype.interfaces_=function(){return[Zp]},Kp.prototype.getClass=function(){return Kp},Kp.isAdjacentSegments=function(t,e){return 1===Math.abs(t-e)};var Qp=function(){this.coord=null,this.segmentIndex=null,this.dist=null;var t=arguments[0],e=arguments[1],n=arguments[2];this.coord=new ul(t),this.segmentIndex=e,this.dist=n};Qp.prototype.getSegmentIndex=function(){return this.segmentIndex},Qp.prototype.getCoordinate=function(){return this.coord},Qp.prototype.print=function(t){t.print(this.coord),t.print(" seg # = "+this.segmentIndex),t.println(" dist = "+this.dist)},Qp.prototype.compareTo=function(t){var e=t;return this.compare(e.segmentIndex,e.dist)},Qp.prototype.isEndPoint=function(t){return 0===this.segmentIndex&&0===this.dist||this.segmentIndex===t},Qp.prototype.toString=function(){return this.coord+" seg # = "+this.segmentIndex+" dist = "+this.dist},Qp.prototype.getDistance=function(){return this.dist},Qp.prototype.compare=function(t,e){return this.segmentIndex<t?-1:this.segmentIndex>t?1:this.dist<e?-1:this.dist>e?1:0},Qp.prototype.interfaces_=function(){return[il]},Qp.prototype.getClass=function(){return Qp};var $p=function(){this._nodeMap=new Cc,this.edge=null;var t=arguments[0];this.edge=t};$p.prototype.print=function(t){t.println("Intersections:");for(var e=this.iterator();e.hasNext();){e.next().print(t)}},$p.prototype.iterator=function(){return this._nodeMap.values().iterator()},$p.prototype.addSplitEdges=function(t){this.addEndpoints();for(var e=this.iterator(),n=e.next();e.hasNext();){var r=e.next(),i=this.createSplitEdge(n,r);t.add(i),n=r}},$p.prototype.addEndpoints=function(){var t=this.edge.pts.length-1;this.add(this.edge.pts[0],0,0),this.add(this.edge.pts[t],t,0)},$p.prototype.createSplitEdge=function(t,e){var n=e.segmentIndex-t.segmentIndex+2,r=this.edge.pts[e.segmentIndex],i=e.dist>0||!e.coord.equals2D(r);i||n--;var o=new Array(n).fill(null),s=0;o[s++]=new ul(t.coord);for(var a=t.segmentIndex+1;a<=e.segmentIndex;a++)o[s++]=this.edge.pts[a];return i&&(o[s]=e.coord),new of(o,new Dh(this.edge._label))},$p.prototype.add=function(t,e,n){var r=new Qp(t,e,n),i=this._nodeMap.get(r);return null!==i?i:(this._nodeMap.put(r,r),r)},$p.prototype.isIntersection=function(t){for(var e=this.iterator();e.hasNext();){if(e.next().coord.equals(t))return!0}return!1},$p.prototype.interfaces_=function(){return[]},$p.prototype.getClass=function(){return $p};var tf=function(){};tf.prototype.getChainStartIndices=function(t){var e=0,n=new lc;n.add(new _l(e));do{var r=this.findChainEnd(t,e);n.add(new _l(r)),e=r}while(e<t.length-1);return tf.toIntArray(n)},tf.prototype.findChainEnd=function(t,e){for(var n=jh.quadrant(t[e],t[e+1]),r=e+1;r<t.length;){if(jh.quadrant(t[r-1],t[r])!==n)break;r++}return r-1},tf.prototype.interfaces_=function(){return[]},tf.prototype.getClass=function(){return tf},tf.toIntArray=function(t){for(var e=new Array(t.size()).fill(null),n=0;n<e.length;n++)e[n]=t.get(n).intValue();return e};var ef=function(){this.e=null,this.pts=null,this.startIndex=null,this.env1=new Ll,this.env2=new Ll;var t=arguments[0];this.e=t,this.pts=t.getCoordinates();var e=new tf;this.startIndex=e.getChainStartIndices(this.pts)};ef.prototype.getCoordinates=function(){return this.pts},ef.prototype.getMaxX=function(t){var e=this.pts[this.startIndex[t]].x,n=this.pts[this.startIndex[t+1]].x;return e>n?e:n},ef.prototype.getMinX=function(t){var e=this.pts[this.startIndex[t]].x,n=this.pts[this.startIndex[t+1]].x;return e<n?e:n},ef.prototype.computeIntersectsForChain=function(){if(4===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];this.computeIntersectsForChain(this.startIndex[t],this.startIndex[t+1],e,e.startIndex[n],e.startIndex[n+1],r)}else if(6===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3],u=arguments[4],l=arguments[5],c=this.pts[i],h=this.pts[o],p=s.pts[a],f=s.pts[u];if(o-i==1&&u-a==1)return l.addIntersections(this.e,i,s.e,a),null;if(this.env1.init(c,h),this.env2.init(p,f),!this.env1.intersects(this.env2))return null;var g=Math.trunc((i+o)/2),d=Math.trunc((a+u)/2);i<g&&(a<d&&this.computeIntersectsForChain(i,g,s,a,d,l),d<u&&this.computeIntersectsForChain(i,g,s,d,u,l)),g<o&&(a<d&&this.computeIntersectsForChain(g,o,s,a,d,l),d<u&&this.computeIntersectsForChain(g,o,s,d,u,l))}},ef.prototype.getStartIndexes=function(){return this.startIndex},ef.prototype.computeIntersects=function(t,e){for(var n=0;n<this.startIndex.length-1;n++)for(var r=0;r<t.startIndex.length-1;r++)this.computeIntersectsForChain(n,t,r,e)},ef.prototype.interfaces_=function(){return[]},ef.prototype.getClass=function(){return ef};var nf=function t(){this._depth=Array(2).fill().map((function(){return Array(3)}));for(var e=0;e<2;e++)for(var n=0;n<3;n++)this._depth[e][n]=t.NULL_VALUE},rf={NULL_VALUE:{configurable:!0}};nf.prototype.getDepth=function(t,e){return this._depth[t][e]},nf.prototype.setDepth=function(t,e,n){this._depth[t][e]=n},nf.prototype.isNull=function(){var t=this;if(0===arguments.length){for(var e=0;e<2;e++)for(var n=0;n<3;n++)if(t._depth[e][n]!==nf.NULL_VALUE)return!1;return!0}if(1===arguments.length){var r=arguments[0];return this._depth[r][1]===nf.NULL_VALUE}if(2===arguments.length){var i=arguments[0],o=arguments[1];return this._depth[i][o]===nf.NULL_VALUE}},nf.prototype.normalize=function(){for(var t=this,e=0;e<2;e++)if(!t.isNull(e)){var n=t._depth[e][1];t._depth[e][2]<n&&(n=t._depth[e][2]),n<0&&(n=0);for(var r=1;r<3;r++){var i=0;t._depth[e][r]>n&&(i=1),t._depth[e][r]=i}}},nf.prototype.getDelta=function(t){return this._depth[t][Sh.RIGHT]-this._depth[t][Sh.LEFT]},nf.prototype.getLocation=function(t,e){return this._depth[t][e]<=0?pl.EXTERIOR:pl.INTERIOR},nf.prototype.toString=function(){return"A: "+this._depth[0][1]+","+this._depth[0][2]+" B: "+this._depth[1][1]+","+this._depth[1][2]},nf.prototype.add=function(){var t=this;if(1===arguments.length)for(var e=arguments[0],n=0;n<2;n++)for(var r=1;r<3;r++){var i=e.getLocation(n,r);i!==pl.EXTERIOR&&i!==pl.INTERIOR||(t.isNull(n,r)?t._depth[n][r]=nf.depthAtLocation(i):t._depth[n][r]+=nf.depthAtLocation(i))}else if(3===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2];a===pl.INTERIOR&&this._depth[o][s]++}},nf.prototype.interfaces_=function(){return[]},nf.prototype.getClass=function(){return nf},nf.depthAtLocation=function(t){return t===pl.EXTERIOR?0:t===pl.INTERIOR?1:nf.NULL_VALUE},rf.NULL_VALUE.get=function(){return-1},Object.defineProperties(nf,rf);var of=function(t){function e(){if(t.call(this),this.pts=null,this._env=null,this.eiList=new $p(this),this._name=null,this._mce=null,this._isIsolated=!0,this._depth=new nf,this._depthDelta=0,1===arguments.length){var n=arguments[0];e.call(this,n,null)}else if(2===arguments.length){var r=arguments[0],i=arguments[1];this.pts=r,this._label=i}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getDepth=function(){return this._depth},e.prototype.getCollapsedEdge=function(){var t=new Array(2).fill(null);return t[0]=this.pts[0],t[1]=this.pts[1],new e(t,Dh.toLineLabel(this._label))},e.prototype.isIsolated=function(){return this._isIsolated},e.prototype.getCoordinates=function(){return this.pts},e.prototype.setIsolated=function(t){this._isIsolated=t},e.prototype.setName=function(t){this._name=t},e.prototype.equals=function(t){if(!(t instanceof e))return!1;var n=t;if(this.pts.length!==n.pts.length)return!1;for(var r=!0,i=!0,o=this.pts.length,s=0;s<this.pts.length;s++)if(this.pts[s].equals2D(n.pts[s])||(r=!1),this.pts[s].equals2D(n.pts[--o])||(i=!1),!r&&!i)return!1;return!0},e.prototype.getCoordinate=function(){if(0===arguments.length)return this.pts.length>0?this.pts[0]:null;if(1===arguments.length){var t=arguments[0];return this.pts[t]}},e.prototype.print=function(t){t.print("edge "+this._name+": "),t.print("LINESTRING (");for(var e=0;e<this.pts.length;e++)e>0&&t.print(","),t.print(this.pts[e].x+" "+this.pts[e].y);t.print(") "+this._label+" "+this._depthDelta)},e.prototype.computeIM=function(t){e.updateIM(this._label,t)},e.prototype.isCollapsed=function(){return!!this._label.isArea()&&(3===this.pts.length&&!!this.pts[0].equals(this.pts[2]))},e.prototype.isClosed=function(){return this.pts[0].equals(this.pts[this.pts.length-1])},e.prototype.getMaximumSegmentIndex=function(){return this.pts.length-1},e.prototype.getDepthDelta=function(){return this._depthDelta},e.prototype.getNumPoints=function(){return this.pts.length},e.prototype.printReverse=function(t){t.print("edge "+this._name+": ");for(var e=this.pts.length-1;e>=0;e--)t.print(this.pts[e]+" ");t.println("")},e.prototype.getMonotoneChainEdge=function(){return null===this._mce&&(this._mce=new ef(this)),this._mce},e.prototype.getEnvelope=function(){if(null===this._env){this._env=new Ll;for(var t=0;t<this.pts.length;t++)this._env.expandToInclude(this.pts[t])}return this._env},e.prototype.addIntersection=function(t,e,n,r){var i=new ul(t.getIntersection(r)),o=e,s=t.getEdgeDistance(n,r),a=o+1;if(a<this.pts.length){var u=this.pts[a];i.equals2D(u)&&(o=a,s=0)}this.eiList.add(i,o,s)},e.prototype.toString=function(){var t=new vl;t.append("edge "+this._name+": "),t.append("LINESTRING (");for(var e=0;e<this.pts.length;e++)e>0&&t.append(","),t.append(this.pts[e].x+" "+this.pts[e].y);return t.append(") "+this._label+" "+this._depthDelta),t.toString()},e.prototype.isPointwiseEqual=function(t){if(this.pts.length!==t.pts.length)return!1;for(var e=0;e<this.pts.length;e++)if(!this.pts[e].equals2D(t.pts[e]))return!1;return!0},e.prototype.setDepthDelta=function(t){this._depthDelta=t},e.prototype.getEdgeIntersectionList=function(){return this.eiList},e.prototype.addIntersections=function(t,e,n){for(var r=0;r<t.getIntersectionNum();r++)this.addIntersection(t,e,n,r)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.updateIM=function(){if(2!==arguments.length)return t.prototype.updateIM.apply(this,arguments);var e=arguments[0],n=arguments[1];n.setAtLeastIfValid(e.getLocation(0,Sh.ON),e.getLocation(1,Sh.ON),1),e.isArea()&&(n.setAtLeastIfValid(e.getLocation(0,Sh.LEFT),e.getLocation(1,Sh.LEFT),2),n.setAtLeastIfValid(e.getLocation(0,Sh.RIGHT),e.getLocation(1,Sh.RIGHT),2))},e}(qh),sf=function(t){this._workingPrecisionModel=null,this._workingNoder=null,this._geomFact=null,this._graph=null,this._edgeList=new Jp,this._bufParams=t||null};sf.prototype.setWorkingPrecisionModel=function(t){this._workingPrecisionModel=t},sf.prototype.insertUniqueEdge=function(t){var e=this._edgeList.findEqualEdge(t);if(null!==e){var n=e.getLabel(),r=t.getLabel();e.isPointwiseEqual(t)||(r=new Dh(t.getLabel())).flip(),n.merge(r);var i=sf.depthDelta(r),o=e.getDepthDelta()+i;e.setDepthDelta(o)}else this._edgeList.add(t),t.setDepthDelta(sf.depthDelta(t.getLabel()))},sf.prototype.buildSubgraphs=function(t,e){for(var n=new lc,r=t.iterator();r.hasNext();){var i=r.next(),o=i.getRightmostCoordinate(),s=new kp(n).getDepth(o);i.computeDepth(s),i.findResultEdges(),n.add(i),e.add(i.getDirectedEdges(),i.getNodes())}},sf.prototype.createSubgraphs=function(t){for(var e=new lc,n=t.getNodes().iterator();n.hasNext();){var r=n.next();if(!r.isVisited()){var i=new Th;i.create(r),e.add(i)}}return np.sort(e,np.reverseOrder()),e},sf.prototype.createEmptyResultGeometry=function(){return this._geomFact.createPolygon()},sf.prototype.getNoder=function(t){if(null!==this._workingNoder)return this._workingNoder;var e=new Ip,n=new jl;return n.setPrecisionModel(t),e.setSegmentIntersector(new Kp(n)),e},sf.prototype.buffer=function(t,e){var n=this._workingPrecisionModel;null===n&&(n=t.getPrecisionModel()),this._geomFact=t.getFactory();var r=new Fp(n,this._bufParams),i=new zp(t,e,r).getCurves();if(i.size()<=0)return this.createEmptyResultGeometry();this.computeNodedEdges(i,n),this._graph=new Hh(new Hp),this._graph.addEdges(this._edgeList.getEdges());var o=this.createSubgraphs(this._graph),s=new Wh(this._geomFact);this.buildSubgraphs(o,s);var a=s.getPolygons();return a.size()<=0?this.createEmptyResultGeometry():this._geomFact.buildGeometry(a)},sf.prototype.computeNodedEdges=function(t,e){var n=this.getNoder(e);n.computeNodes(t);for(var r=n.getNodedSubstrings().iterator();r.hasNext();){var i=r.next(),o=i.getCoordinates();if(2!==o.length||!o[0].equals2D(o[1])){var s=i.getData(),a=new of(i.getCoordinates(),new Dh(s));this.insertUniqueEdge(a)}}},sf.prototype.setNoder=function(t){this._workingNoder=t},sf.prototype.interfaces_=function(){return[]},sf.prototype.getClass=function(){return sf},sf.depthDelta=function(t){var e=t.getLocation(0,Sh.LEFT),n=t.getLocation(0,Sh.RIGHT);return e===pl.INTERIOR&&n===pl.EXTERIOR?1:e===pl.EXTERIOR&&n===pl.INTERIOR?-1:0},sf.convertSegStrings=function(t){for(var e=new _h,n=new lc;t.hasNext();){var r=t.next(),i=e.createLineString(r.getCoordinates());n.add(i)}return e.buildGeometry(n)};var af=function(){if(this._noder=null,this._scaleFactor=null,this._offsetX=null,this._offsetY=null,this._isScaled=!1,2===arguments.length){var t=arguments[0],e=arguments[1];this._noder=t,this._scaleFactor=e,this._offsetX=0,this._offsetY=0,this._isScaled=!this.isIntegerPrecision()}else if(4===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2],o=arguments[3];this._noder=n,this._scaleFactor=r,this._offsetX=i,this._offsetY=o,this._isScaled=!this.isIntegerPrecision()}};af.prototype.rescale=function(){var t=this;if(gl(arguments[0],ic))for(var e=arguments[0],n=e.iterator();n.hasNext();){var r=n.next();t.rescale(r.getCoordinates())}else if(arguments[0]instanceof Array){for(var i=arguments[0],o=0;o<i.length;o++)i[o].x=i[o].x/t._scaleFactor+t._offsetX,i[o].y=i[o].y/t._scaleFactor+t._offsetY;2===i.length&&i[0].equals2D(i[1])&&Pl.out.println(i)}},af.prototype.scale=function(){var t=this;if(gl(arguments[0],ic)){for(var e=arguments[0],n=new lc,r=e.iterator();r.hasNext();){var i=r.next();n.add(new yp(t.scale(i.getCoordinates()),i.getData()))}return n}if(arguments[0]instanceof Array){for(var o=arguments[0],s=new Array(o.length).fill(null),a=0;a<o.length;a++)s[a]=new ul(Math.round((o[a].x-t._offsetX)*t._scaleFactor),Math.round((o[a].y-t._offsetY)*t._scaleFactor),o[a].z);var u=pc.removeRepeatedPoints(s);return u}},af.prototype.isIntegerPrecision=function(){return 1===this._scaleFactor},af.prototype.getNodedSubstrings=function(){var t=this._noder.getNodedSubstrings();return this._isScaled&&this.rescale(t),t},af.prototype.computeNodes=function(t){var e=t;this._isScaled&&(e=this.scale(t)),this._noder.computeNodes(e)},af.prototype.interfaces_=function(){return[bp]},af.prototype.getClass=function(){return af};var uf=function(){this._li=new jl,this._segStrings=null;var t=arguments[0];this._segStrings=t},lf={fact:{configurable:!0}};uf.prototype.checkEndPtVertexIntersections=function(){var t=this;if(0===arguments.length)for(var e=this._segStrings.iterator();e.hasNext();){var n=e.next(),r=n.getCoordinates();t.checkEndPtVertexIntersections(r[0],t._segStrings),t.checkEndPtVertexIntersections(r[r.length-1],t._segStrings)}else if(2===arguments.length)for(var i=arguments[0],o=arguments[1],s=o.iterator();s.hasNext();)for(var a=s.next(),u=a.getCoordinates(),l=1;l<u.length-1;l++)if(u[l].equals(i))throw new kl("found endpt/interior pt intersection at index "+l+" :pt "+i)},uf.prototype.checkInteriorIntersections=function(){var t=this;if(0===arguments.length)for(var e=this._segStrings.iterator();e.hasNext();)for(var n=e.next(),r=this._segStrings.iterator();r.hasNext();){var i=r.next();t.checkInteriorIntersections(n,i)}else if(2===arguments.length)for(var o=arguments[0],s=arguments[1],a=o.getCoordinates(),u=s.getCoordinates(),l=0;l<a.length-1;l++)for(var c=0;c<u.length-1;c++)t.checkInteriorIntersections(o,l,s,c);else if(4===arguments.length){var h=arguments[0],p=arguments[1],f=arguments[2],g=arguments[3];if(h===f&&p===g)return null;var d=h.getCoordinates()[p],y=h.getCoordinates()[p+1],v=f.getCoordinates()[g],_=f.getCoordinates()[g+1];if(this._li.computeIntersection(d,y,v,_),this._li.hasIntersection()&&(this._li.isProper()||this.hasInteriorIntersection(this._li,d,y)||this.hasInteriorIntersection(this._li,v,_)))throw new kl("found non-noded intersection at "+d+"-"+y+" and "+v+"-"+_)}},uf.prototype.checkValid=function(){this.checkEndPtVertexIntersections(),this.checkInteriorIntersections(),this.checkCollapses()},uf.prototype.checkCollapses=function(){var t=this;if(0===arguments.length)for(var e=this._segStrings.iterator();e.hasNext();){var n=e.next();t.checkCollapses(n)}else if(1===arguments.length)for(var r=arguments[0],i=r.getCoordinates(),o=0;o<i.length-2;o++)t.checkCollapse(i[o],i[o+1],i[o+2])},uf.prototype.hasInteriorIntersection=function(t,e,n){for(var r=0;r<t.getIntersectionNum();r++){var i=t.getIntersection(r);if(!i.equals(e)&&!i.equals(n))return!0}return!1},uf.prototype.checkCollapse=function(t,e,n){if(t.equals(n))throw new kl("found non-noded collapse at "+uf.fact.createLineString([t,e,n]))},uf.prototype.interfaces_=function(){return[]},uf.prototype.getClass=function(){return uf},lf.fact.get=function(){return new _h},Object.defineProperties(uf,lf);var cf=function(){this._li=null,this._pt=null,this._originalPt=null,this._ptScaled=null,this._p0Scaled=null,this._p1Scaled=null,this._scaleFactor=null,this._minx=null,this._maxx=null,this._miny=null,this._maxy=null,this._corner=new Array(4).fill(null),this._safeEnv=null;var t=arguments[0],e=arguments[1],n=arguments[2];if(this._originalPt=t,this._pt=t,this._scaleFactor=e,this._li=n,e<=0)throw new el("Scale factor must be non-zero");1!==e&&(this._pt=new ul(this.scale(t.x),this.scale(t.y)),this._p0Scaled=new ul,this._p1Scaled=new ul),this.initCorners(this._pt)},hf={SAFE_ENV_EXPANSION_FACTOR:{configurable:!0}};cf.prototype.intersectsScaled=function(t,e){var n=Math.min(t.x,e.x),r=Math.max(t.x,e.x),i=Math.min(t.y,e.y),o=Math.max(t.y,e.y),s=this._maxx<n||this._minx>r||this._maxy<i||this._miny>o;if(s)return!1;var a=this.intersectsToleranceSquare(t,e);return ql.isTrue(!(s&&a),"Found bad envelope test"),a},cf.prototype.initCorners=function(t){var e=.5;this._minx=t.x-e,this._maxx=t.x+e,this._miny=t.y-e,this._maxy=t.y+e,this._corner[0]=new ul(this._maxx,this._maxy),this._corner[1]=new ul(this._minx,this._maxy),this._corner[2]=new ul(this._minx,this._miny),this._corner[3]=new ul(this._maxx,this._miny)},cf.prototype.intersects=function(t,e){return 1===this._scaleFactor?this.intersectsScaled(t,e):(this.copyScaled(t,this._p0Scaled),this.copyScaled(e,this._p1Scaled),this.intersectsScaled(this._p0Scaled,this._p1Scaled))},cf.prototype.scale=function(t){return Math.round(t*this._scaleFactor)},cf.prototype.getCoordinate=function(){return this._originalPt},cf.prototype.copyScaled=function(t,e){e.x=this.scale(t.x),e.y=this.scale(t.y)},cf.prototype.getSafeEnvelope=function(){if(null===this._safeEnv){var t=cf.SAFE_ENV_EXPANSION_FACTOR/this._scaleFactor;this._safeEnv=new Ll(this._originalPt.x-t,this._originalPt.x+t,this._originalPt.y-t,this._originalPt.y+t)}return this._safeEnv},cf.prototype.intersectsPixelClosure=function(t,e){return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.hasIntersection())))},cf.prototype.intersectsToleranceSquare=function(t,e){var n=!1,r=!1;return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.isProper()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.isProper()||(this._li.hasIntersection()&&(n=!0),this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.isProper()||(this._li.hasIntersection()&&(r=!0),this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.isProper()||(!(!n||!r)||(!!t.equals(this._pt)||!!e.equals(this._pt))))))},cf.prototype.addSnappedNode=function(t,e){var n=t.getCoordinate(e),r=t.getCoordinate(e+1);return!!this.intersects(n,r)&&(t.addIntersection(this.getCoordinate(),e),!0)},cf.prototype.interfaces_=function(){return[]},cf.prototype.getClass=function(){return cf},hf.SAFE_ENV_EXPANSION_FACTOR.get=function(){return.75},Object.defineProperties(cf,hf);var pf=function(){this.tempEnv1=new Ll,this.selectedSegment=new vp};pf.prototype.select=function(){if(1===arguments.length);else if(2===arguments.length){var t=arguments[0],e=arguments[1];t.getLineSegment(e,this.selectedSegment),this.select(this.selectedSegment)}},pf.prototype.interfaces_=function(){return[]},pf.prototype.getClass=function(){return pf};var ff=function(){this._index=null;var t=arguments[0];this._index=t},gf={HotPixelSnapAction:{configurable:!0}};ff.prototype.snap=function(){if(1===arguments.length){var t=arguments[0];return this.snap(t,null,-1)}if(3===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2],i=e.getSafeEnvelope(),o=new df(e,n,r);return this._index.query(i,{interfaces_:function(){return[Qh]},visitItem:function(t){t.select(i,o)}}),o.isNodeAdded()}},ff.prototype.interfaces_=function(){return[]},ff.prototype.getClass=function(){return ff},gf.HotPixelSnapAction.get=function(){return df},Object.defineProperties(ff,gf);var df=function(t){function e(){t.call(this),this._hotPixel=null,this._parentEdge=null,this._hotPixelVertexIndex=null,this._isNodeAdded=!1;var e=arguments[0],n=arguments[1],r=arguments[2];this._hotPixel=e,this._parentEdge=n,this._hotPixelVertexIndex=r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isNodeAdded=function(){return this._isNodeAdded},e.prototype.select=function(){if(2!==arguments.length)return t.prototype.select.apply(this,arguments);var e=arguments[0],n=arguments[1],r=e.getContext();if(null!==this._parentEdge&&r===this._parentEdge&&n===this._hotPixelVertexIndex)return null;this._isNodeAdded=this._hotPixel.addSnappedNode(r,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(pf),yf=function(){this._li=null,this._interiorIntersections=null;var t=arguments[0];this._li=t,this._interiorIntersections=new lc};yf.prototype.processIntersections=function(t,e,n,r){if(t===n&&e===r)return null;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];if(this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&this._li.isInteriorIntersection()){for(var u=0;u<this._li.getIntersectionNum();u++)this._interiorIntersections.add(this._li.getIntersection(u));t.addIntersections(this._li,e,0),n.addIntersections(this._li,r,1)}},yf.prototype.isDone=function(){return!1},yf.prototype.getInteriorIntersections=function(){return this._interiorIntersections},yf.prototype.interfaces_=function(){return[Zp]},yf.prototype.getClass=function(){return yf};var vf=function(){this._pm=null,this._li=null,this._scaleFactor=null,this._noder=null,this._pointSnapper=null,this._nodedSegStrings=null;var t=arguments[0];this._pm=t,this._li=new jl,this._li.setPrecisionModel(t),this._scaleFactor=t.getScale()};vf.prototype.checkCorrectness=function(t){var e=yp.getNodedSubstrings(t),n=new uf(e);try{n.checkValid()}catch(t){if(!(t instanceof Sl))throw t;t.printStackTrace()}},vf.prototype.getNodedSubstrings=function(){return yp.getNodedSubstrings(this._nodedSegStrings)},vf.prototype.snapRound=function(t,e){var n=this.findInteriorIntersections(t,e);this.computeIntersectionSnaps(n),this.computeVertexSnaps(t)},vf.prototype.findInteriorIntersections=function(t,e){var n=new yf(e);return this._noder.setSegmentIntersector(n),this._noder.computeNodes(t),n.getInteriorIntersections()},vf.prototype.computeVertexSnaps=function(){var t=this;if(gl(arguments[0],ic))for(var e=arguments[0],n=e.iterator();n.hasNext();){var r=n.next();t.computeVertexSnaps(r)}else if(arguments[0]instanceof yp)for(var i=arguments[0],o=i.getCoordinates(),s=0;s<o.length;s++){var a=new cf(o[s],t._scaleFactor,t._li),u=t._pointSnapper.snap(a,i,s);u&&i.addIntersection(o[s],s)}},vf.prototype.computeNodes=function(t){this._nodedSegStrings=t,this._noder=new Ip,this._pointSnapper=new ff(this._noder.getIndex()),this.snapRound(t,this._li)},vf.prototype.computeIntersectionSnaps=function(t){for(var e=this,n=t.iterator();n.hasNext();){var r=n.next(),i=new cf(r,e._scaleFactor,e._li);e._pointSnapper.snap(i)}},vf.prototype.interfaces_=function(){return[bp]},vf.prototype.getClass=function(){return vf};var _f=function(){if(this._argGeom=null,this._distance=null,this._bufParams=new Sp,this._resultGeometry=null,this._saveException=null,1===arguments.length){var t=arguments[0];this._argGeom=t}else if(2===arguments.length){var e=arguments[0],n=arguments[1];this._argGeom=e,this._bufParams=n}},mf={CAP_ROUND:{configurable:!0},CAP_BUTT:{configurable:!0},CAP_FLAT:{configurable:!0},CAP_SQUARE:{configurable:!0},MAX_PRECISION_DIGITS:{configurable:!0}};_f.prototype.bufferFixedPrecision=function(t){var e=new af(new vf(new gh(1)),t.getScale()),n=new sf(this._bufParams);n.setWorkingPrecisionModel(t),n.setNoder(e),this._resultGeometry=n.buffer(this._argGeom,this._distance)},_f.prototype.bufferReducedPrecision=function(){var t=this;if(0===arguments.length){for(var e=_f.MAX_PRECISION_DIGITS;e>=0;e--){try{t.bufferReducedPrecision(e)}catch(e){if(!(e instanceof Oh))throw e;t._saveException=e}if(null!==t._resultGeometry)return null}throw this._saveException}if(1===arguments.length){var n=arguments[0],r=_f.precisionScaleFactor(this._argGeom,this._distance,n),i=new gh(r);this.bufferFixedPrecision(i)}},_f.prototype.computeGeometry=function(){if(this.bufferOriginalPrecision(),null!==this._resultGeometry)return null;var t=this._argGeom.getFactory().getPrecisionModel();t.getType()===gh.FIXED?this.bufferFixedPrecision(t):this.bufferReducedPrecision()},_f.prototype.setQuadrantSegments=function(t){this._bufParams.setQuadrantSegments(t)},_f.prototype.bufferOriginalPrecision=function(){try{var t=new sf(this._bufParams);this._resultGeometry=t.buffer(this._argGeom,this._distance)}catch(t){if(!(t instanceof kl))throw t;this._saveException=t}},_f.prototype.getResultGeometry=function(t){return this._distance=t,this.computeGeometry(),this._resultGeometry},_f.prototype.setEndCapStyle=function(t){this._bufParams.setEndCapStyle(t)},_f.prototype.interfaces_=function(){return[]},_f.prototype.getClass=function(){return _f},_f.bufferOp=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new _f(t),r=n.getResultGeometry(e);return r}if(3===arguments.length){if(Number.isInteger(arguments[2])&&arguments[0]instanceof Wl&&"number"==typeof arguments[1]){var i=arguments[0],o=arguments[1],s=arguments[2],a=new _f(i);a.setQuadrantSegments(s);var u=a.getResultGeometry(o);return u}if(arguments[2]instanceof Sp&&arguments[0]instanceof Wl&&"number"==typeof arguments[1]){var l=arguments[0],c=arguments[1],h=arguments[2],p=new _f(l,h),f=p.getResultGeometry(c);return f}}else if(4===arguments.length){var g=arguments[0],d=arguments[1],y=arguments[2],v=arguments[3],_=new _f(g);_.setQuadrantSegments(y),_.setEndCapStyle(v);var m=_.getResultGeometry(d);return m}},_f.precisionScaleFactor=function(t,e,n){var r=t.getEnvelopeInternal(),i=dl.max(Math.abs(r.getMaxX()),Math.abs(r.getMaxY()),Math.abs(r.getMinX()),Math.abs(r.getMinY()))+2*(e>0?e:0),o=n-Math.trunc(Math.log(i)/Math.log(10)+1);return Math.pow(10,o)},mf.CAP_ROUND.get=function(){return Sp.CAP_ROUND},mf.CAP_BUTT.get=function(){return Sp.CAP_FLAT},mf.CAP_FLAT.get=function(){return Sp.CAP_FLAT},mf.CAP_SQUARE.get=function(){return Sp.CAP_SQUARE},mf.MAX_PRECISION_DIGITS.get=function(){return 12},Object.defineProperties(_f,mf);var xf=function(){this._pt=[new ul,new ul],this._distance=nl.NaN,this._isNull=!0};xf.prototype.getCoordinates=function(){return this._pt},xf.prototype.getCoordinate=function(t){return this._pt[t]},xf.prototype.setMinimum=function(){if(1===arguments.length){var t=arguments[0];this.setMinimum(t._pt[0],t._pt[1])}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this._isNull)return this.initialize(e,n),null;var r=e.distance(n);r<this._distance&&this.initialize(e,n,r)}},xf.prototype.initialize=function(){if(0===arguments.length)this._isNull=!0;else if(2===arguments.length){var t=arguments[0],e=arguments[1];this._pt[0].setCoordinate(t),this._pt[1].setCoordinate(e),this._distance=t.distance(e),this._isNull=!1}else if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2];this._pt[0].setCoordinate(n),this._pt[1].setCoordinate(r),this._distance=i,this._isNull=!1}},xf.prototype.getDistance=function(){return this._distance},xf.prototype.setMaximum=function(){if(1===arguments.length){var t=arguments[0];this.setMaximum(t._pt[0],t._pt[1])}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this._isNull)return this.initialize(e,n),null;var r=e.distance(n);r>this._distance&&this.initialize(e,n,r)}},xf.prototype.interfaces_=function(){return[]},xf.prototype.getClass=function(){return xf};var Ef=function(){};Ef.prototype.interfaces_=function(){return[]},Ef.prototype.getClass=function(){return Ef},Ef.computeDistance=function(){if(arguments[2]instanceof xf&&arguments[0]instanceof Zc&&arguments[1]instanceof ul)for(var t=arguments[0],e=arguments[1],n=arguments[2],r=t.getCoordinates(),i=new vp,o=0;o<r.length-1;o++){i.setCoordinates(r[o],r[o+1]);var s=i.closestPoint(e);n.setMinimum(s,e)}else if(arguments[2]instanceof xf&&arguments[0]instanceof th&&arguments[1]instanceof ul){var a=arguments[0],u=arguments[1],l=arguments[2];Ef.computeDistance(a.getExteriorRing(),u,l);for(var c=0;c<a.getNumInteriorRing();c++)Ef.computeDistance(a.getInteriorRingN(c),u,l)}else if(arguments[2]instanceof xf&&arguments[0]instanceof Wl&&arguments[1]instanceof ul){var h=arguments[0],p=arguments[1],f=arguments[2];if(h instanceof Zc)Ef.computeDistance(h,p,f);else if(h instanceof th)Ef.computeDistance(h,p,f);else if(h instanceof kc)for(var g=h,d=0;d<g.getNumGeometries();d++){var y=g.getGeometryN(d);Ef.computeDistance(y,p,f)}else f.setMinimum(h.getCoordinate(),p)}else if(arguments[2]instanceof xf&&arguments[0]instanceof vp&&arguments[1]instanceof ul){var v=arguments[0],_=arguments[1],m=arguments[2],x=v.closestPoint(_);m.setMinimum(x,_)}};var bf=function(t){this._maxPtDist=new xf,this._inputGeom=t||null},wf={MaxPointDistanceFilter:{configurable:!0},MaxMidpointDistanceFilter:{configurable:!0}};bf.prototype.computeMaxMidpointDistance=function(t){var e=new Nf(this._inputGeom);t.apply(e),this._maxPtDist.setMaximum(e.getMaxPointDistance())},bf.prototype.computeMaxVertexDistance=function(t){var e=new If(this._inputGeom);t.apply(e),this._maxPtDist.setMaximum(e.getMaxPointDistance())},bf.prototype.findDistance=function(t){return this.computeMaxVertexDistance(t),this.computeMaxMidpointDistance(t),this._maxPtDist.getDistance()},bf.prototype.getDistancePoints=function(){return this._maxPtDist},bf.prototype.interfaces_=function(){return[]},bf.prototype.getClass=function(){return bf},wf.MaxPointDistanceFilter.get=function(){return If},wf.MaxMidpointDistanceFilter.get=function(){return Nf},Object.defineProperties(bf,wf);var If=function(t){this._maxPtDist=new xf,this._minPtDist=new xf,this._geom=t||null};If.prototype.filter=function(t){this._minPtDist.initialize(),Ef.computeDistance(this._geom,t,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)},If.prototype.getMaxPointDistance=function(){return this._maxPtDist},If.prototype.interfaces_=function(){return[Kl]},If.prototype.getClass=function(){return If};var Nf=function(t){this._maxPtDist=new xf,this._minPtDist=new xf,this._geom=t||null};Nf.prototype.filter=function(t,e){if(0===e)return null;var n=t.getCoordinate(e-1),r=t.getCoordinate(e),i=new ul((n.x+r.x)/2,(n.y+r.y)/2);this._minPtDist.initialize(),Ef.computeDistance(this._geom,i,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)},Nf.prototype.isDone=function(){return!1},Nf.prototype.isGeometryChanged=function(){return!1},Nf.prototype.getMaxPointDistance=function(){return this._maxPtDist},Nf.prototype.interfaces_=function(){return[Fc]},Nf.prototype.getClass=function(){return Nf};var Sf=function(t){this._comps=t||null};Sf.prototype.filter=function(t){t instanceof th&&this._comps.add(t)},Sf.prototype.interfaces_=function(){return[Dc]},Sf.prototype.getClass=function(){return Sf},Sf.getPolygons=function(){if(1===arguments.length){var t=arguments[0];return Sf.getPolygons(t,new lc)}if(2===arguments.length){var e=arguments[0],n=arguments[1];return e instanceof th?n.add(e):e instanceof kc&&e.apply(new Sf(n)),n}};var Cf=function(){if(this._lines=null,this._isForcedToLineString=!1,1===arguments.length){var t=arguments[0];this._lines=t}else if(2===arguments.length){var e=arguments[0],n=arguments[1];this._lines=e,this._isForcedToLineString=n}};Cf.prototype.filter=function(t){if(this._isForcedToLineString&&t instanceof nh){var e=t.getFactory().createLineString(t.getCoordinateSequence());return this._lines.add(e),null}t instanceof Zc&&this._lines.add(t)},Cf.prototype.setForceToLineString=function(t){this._isForcedToLineString=t},Cf.prototype.interfaces_=function(){return[Hl]},Cf.prototype.getClass=function(){return Cf},Cf.getGeometry=function(){if(1===arguments.length){var t=arguments[0];return t.getFactory().buildGeometry(Cf.getLines(t))}if(2===arguments.length){var e=arguments[0],n=arguments[1];return e.getFactory().buildGeometry(Cf.getLines(e,n))}},Cf.getLines=function(){if(1===arguments.length){var t=arguments[0];return Cf.getLines(t,!1)}if(2===arguments.length){if(gl(arguments[0],ic)&&gl(arguments[1],ic)){for(var e=arguments[0],n=arguments[1],r=e.iterator();r.hasNext();){var i=r.next();Cf.getLines(i,n)}return n}if(arguments[0]instanceof Wl&&"boolean"==typeof arguments[1]){var o=arguments[0],s=arguments[1],a=new lc;return o.apply(new Cf(a,s)),a}if(arguments[0]instanceof Wl&&gl(arguments[1],ic)){var u=arguments[0],l=arguments[1];return u instanceof Zc?l.add(u):u.apply(new Cf(l)),l}}else if(3===arguments.length){if("boolean"==typeof arguments[2]&&gl(arguments[0],ic)&&gl(arguments[1],ic)){for(var c=arguments[0],h=arguments[1],p=arguments[2],f=c.iterator();f.hasNext();){var g=f.next();Cf.getLines(g,h,p)}return h}if("boolean"==typeof arguments[2]&&arguments[0]instanceof Wl&&gl(arguments[1],ic)){var d=arguments[0],y=arguments[1],v=arguments[2];return d.apply(new Cf(y,v)),y}}};var Pf=function(){if(this._boundaryRule=Ql.OGC_SFS_BOUNDARY_RULE,this._isIn=null,this._numBoundaries=null,0===arguments.length);else if(1===arguments.length){var t=arguments[0];if(null===t)throw new el("Rule must be non-null");this._boundaryRule=t}};Pf.prototype.locateInternal=function(){var t=this;if(arguments[0]instanceof ul&&arguments[1]instanceof th){var e=arguments[0],n=arguments[1];if(n.isEmpty())return pl.EXTERIOR;var r=n.getExteriorRing(),i=this.locateInPolygonRing(e,r);if(i===pl.EXTERIOR)return pl.EXTERIOR;if(i===pl.BOUNDARY)return pl.BOUNDARY;for(var o=0;o<n.getNumInteriorRing();o++){var s=n.getInteriorRingN(o),a=t.locateInPolygonRing(e,s);if(a===pl.INTERIOR)return pl.EXTERIOR;if(a===pl.BOUNDARY)return pl.BOUNDARY}return pl.INTERIOR}if(arguments[0]instanceof ul&&arguments[1]instanceof Zc){var u=arguments[0],l=arguments[1];if(!l.getEnvelopeInternal().intersects(u))return pl.EXTERIOR;var c=l.getCoordinates();return l.isClosed()||!u.equals(c[0])&&!u.equals(c[c.length-1])?Xl.isOnLine(u,c)?pl.INTERIOR:pl.EXTERIOR:pl.BOUNDARY}if(arguments[0]instanceof ul&&arguments[1]instanceof Qc){var h=arguments[0],p=arguments[1],f=p.getCoordinate();return f.equals2D(h)?pl.INTERIOR:pl.EXTERIOR}},Pf.prototype.locateInPolygonRing=function(t,e){return e.getEnvelopeInternal().intersects(t)?Xl.locatePointInRing(t,e.getCoordinates()):pl.EXTERIOR},Pf.prototype.intersects=function(t,e){return this.locate(t,e)!==pl.EXTERIOR},Pf.prototype.updateLocationInfo=function(t){t===pl.INTERIOR&&(this._isIn=!0),t===pl.BOUNDARY&&this._numBoundaries++},Pf.prototype.computeLocation=function(t,e){var n=this;if(e instanceof Qc&&this.updateLocationInfo(this.locateInternal(t,e)),e instanceof Zc)this.updateLocationInfo(this.locateInternal(t,e));else if(e instanceof th)this.updateLocationInfo(this.locateInternal(t,e));else if(e instanceof Gc)for(var r=e,i=0;i<r.getNumGeometries();i++){var o=r.getGeometryN(i);n.updateLocationInfo(n.locateInternal(t,o))}else if(e instanceof rh)for(var s=e,a=0;a<s.getNumGeometries();a++){var u=s.getGeometryN(a);n.updateLocationInfo(n.locateInternal(t,u))}else if(e instanceof kc)for(var l=new Up(e);l.hasNext();){var c=l.next();c!==e&&n.computeLocation(t,c)}},Pf.prototype.locate=function(t,e){return e.isEmpty()?pl.EXTERIOR:e instanceof Zc||e instanceof th?this.locateInternal(t,e):(this._isIn=!1,this._numBoundaries=0,this.computeLocation(t,e),this._boundaryRule.isInBoundary(this._numBoundaries)?pl.BOUNDARY:this._numBoundaries>0||this._isIn?pl.INTERIOR:pl.EXTERIOR)},Pf.prototype.interfaces_=function(){return[]},Pf.prototype.getClass=function(){return Pf};var Mf=function t(){if(this._component=null,this._segIndex=null,this._pt=null,2===arguments.length){var e=arguments[0],n=arguments[1];t.call(this,e,t.INSIDE_AREA,n)}else if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];this._component=r,this._segIndex=i,this._pt=o}},Lf={INSIDE_AREA:{configurable:!0}};Mf.prototype.isInsideArea=function(){return this._segIndex===Mf.INSIDE_AREA},Mf.prototype.getCoordinate=function(){return this._pt},Mf.prototype.getGeometryComponent=function(){return this._component},Mf.prototype.getSegmentIndex=function(){return this._segIndex},Mf.prototype.interfaces_=function(){return[]},Mf.prototype.getClass=function(){return Mf},Lf.INSIDE_AREA.get=function(){return-1},Object.defineProperties(Mf,Lf);var Of=function(t){this._pts=t||null};Of.prototype.filter=function(t){t instanceof Qc&&this._pts.add(t)},Of.prototype.interfaces_=function(){return[Dc]},Of.prototype.getClass=function(){return Of},Of.getPoints=function(){if(1===arguments.length){var t=arguments[0];return t instanceof Qc?np.singletonList(t):Of.getPoints(t,new lc)}if(2===arguments.length){var e=arguments[0],n=arguments[1];return e instanceof Qc?n.add(e):e instanceof kc&&e.apply(new Of(n)),n}};var Rf=function(){this._locations=null;var t=arguments[0];this._locations=t};Rf.prototype.filter=function(t){(t instanceof Qc||t instanceof Zc||t instanceof th)&&this._locations.add(new Mf(t,0,t.getCoordinate()))},Rf.prototype.interfaces_=function(){return[Dc]},Rf.prototype.getClass=function(){return Rf},Rf.getLocations=function(t){var e=new lc;return t.apply(new Rf(e)),e};var Tf=function(){if(this._geom=null,this._terminateDistance=0,this._ptLocator=new Pf,this._minDistanceLocation=null,this._minDistance=nl.MAX_VALUE,2===arguments.length){var t=arguments[0],e=arguments[1];this._geom=[t,e],this._terminateDistance=0}else if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2];this._geom=new Array(2).fill(null),this._geom[0]=n,this._geom[1]=r,this._terminateDistance=i}};Tf.prototype.computeContainmentDistance=function(){var t=this;if(0===arguments.length){var e=new Array(2).fill(null);if(this.computeContainmentDistance(0,e),this._minDistance<=this._terminateDistance)return null;this.computeContainmentDistance(1,e)}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=1-n,o=Sf.getPolygons(this._geom[n]);if(o.size()>0){var s=Rf.getLocations(this._geom[i]);if(this.computeContainmentDistance(s,o,r),this._minDistance<=this._terminateDistance)return this._minDistanceLocation[i]=r[0],this._minDistanceLocation[n]=r[1],null}}else if(3===arguments.length)if(arguments[2]instanceof Array&&gl(arguments[0],ac)&&gl(arguments[1],ac)){for(var a=arguments[0],u=arguments[1],l=arguments[2],c=0;c<a.size();c++)for(var h=a.get(c),p=0;p<u.size();p++)if(t.computeContainmentDistance(h,u.get(p),l),t._minDistance<=t._terminateDistance)return null}else if(arguments[2]instanceof Array&&arguments[0]instanceof Mf&&arguments[1]instanceof th){var f=arguments[0],g=arguments[1],d=arguments[2],y=f.getCoordinate();if(pl.EXTERIOR!==this._ptLocator.locate(y,g))return this._minDistance=0,d[0]=f,d[1]=new Mf(g,y),null}},Tf.prototype.computeMinDistanceLinesPoints=function(t,e,n){for(var r=this,i=0;i<t.size();i++)for(var o=t.get(i),s=0;s<e.size();s++){var a=e.get(s);if(r.computeMinDistance(o,a,n),r._minDistance<=r._terminateDistance)return null}},Tf.prototype.computeFacetDistance=function(){var t=new Array(2).fill(null),e=Cf.getLines(this._geom[0]),n=Cf.getLines(this._geom[1]),r=Of.getPoints(this._geom[0]),i=Of.getPoints(this._geom[1]);return this.computeMinDistanceLines(e,n,t),this.updateMinDistance(t,!1),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistanceLinesPoints(e,i,t),this.updateMinDistance(t,!1),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistanceLinesPoints(n,r,t),this.updateMinDistance(t,!0),this._minDistance<=this._terminateDistance?null:(t[0]=null,t[1]=null,this.computeMinDistancePoints(r,i,t),void this.updateMinDistance(t,!1))))},Tf.prototype.nearestLocations=function(){return this.computeMinDistance(),this._minDistanceLocation},Tf.prototype.updateMinDistance=function(t,e){if(null===t[0])return null;e?(this._minDistanceLocation[0]=t[1],this._minDistanceLocation[1]=t[0]):(this._minDistanceLocation[0]=t[0],this._minDistanceLocation[1]=t[1])},Tf.prototype.nearestPoints=function(){return this.computeMinDistance(),[this._minDistanceLocation[0].getCoordinate(),this._minDistanceLocation[1].getCoordinate()]},Tf.prototype.computeMinDistance=function(){var t=this;if(0===arguments.length){if(null!==this._minDistanceLocation)return null;if(this._minDistanceLocation=new Array(2).fill(null),this.computeContainmentDistance(),this._minDistance<=this._terminateDistance)return null;this.computeFacetDistance()}else if(3===arguments.length)if(arguments[2]instanceof Array&&arguments[0]instanceof Zc&&arguments[1]instanceof Qc){var e=arguments[0],n=arguments[1],r=arguments[2];if(e.getEnvelopeInternal().distance(n.getEnvelopeInternal())>this._minDistance)return null;for(var i=e.getCoordinates(),o=n.getCoordinate(),s=0;s<i.length-1;s++){var a=Xl.distancePointLine(o,i[s],i[s+1]);if(a<t._minDistance){t._minDistance=a;var u=new vp(i[s],i[s+1]),l=u.closestPoint(o);r[0]=new Mf(e,s,l),r[1]=new Mf(n,0,o)}if(t._minDistance<=t._terminateDistance)return null}}else if(arguments[2]instanceof Array&&arguments[0]instanceof Zc&&arguments[1]instanceof Zc){var c=arguments[0],h=arguments[1],p=arguments[2];if(c.getEnvelopeInternal().distance(h.getEnvelopeInternal())>this._minDistance)return null;for(var f=c.getCoordinates(),g=h.getCoordinates(),d=0;d<f.length-1;d++)for(var y=0;y<g.length-1;y++){var v=Xl.distanceLineLine(f[d],f[d+1],g[y],g[y+1]);if(v<t._minDistance){t._minDistance=v;var _=new vp(f[d],f[d+1]),m=new vp(g[y],g[y+1]),x=_.closestPoints(m);p[0]=new Mf(c,d,x[0]),p[1]=new Mf(h,y,x[1])}if(t._minDistance<=t._terminateDistance)return null}}},Tf.prototype.computeMinDistancePoints=function(t,e,n){for(var r=this,i=0;i<t.size();i++)for(var o=t.get(i),s=0;s<e.size();s++){var a=e.get(s),u=o.getCoordinate().distance(a.getCoordinate());if(u<r._minDistance&&(r._minDistance=u,n[0]=new Mf(o,0,o.getCoordinate()),n[1]=new Mf(a,0,a.getCoordinate())),r._minDistance<=r._terminateDistance)return null}},Tf.prototype.distance=function(){if(null===this._geom[0]||null===this._geom[1])throw new el("null geometries are not supported");return this._geom[0].isEmpty()||this._geom[1].isEmpty()?0:(this.computeMinDistance(),this._minDistance)},Tf.prototype.computeMinDistanceLines=function(t,e,n){for(var r=this,i=0;i<t.size();i++)for(var o=t.get(i),s=0;s<e.size();s++){var a=e.get(s);if(r.computeMinDistance(o,a,n),r._minDistance<=r._terminateDistance)return null}},Tf.prototype.interfaces_=function(){return[]},Tf.prototype.getClass=function(){return Tf},Tf.distance=function(t,e){return new Tf(t,e).distance()},Tf.isWithinDistance=function(t,e,n){return new Tf(t,e,n).distance()<=n},Tf.nearestPoints=function(t,e){return new Tf(t,e).nearestPoints()};var Af=function(){this._pt=[new ul,new ul],this._distance=nl.NaN,this._isNull=!0};Af.prototype.getCoordinates=function(){return this._pt},Af.prototype.getCoordinate=function(t){return this._pt[t]},Af.prototype.setMinimum=function(){if(1===arguments.length){var t=arguments[0];this.setMinimum(t._pt[0],t._pt[1])}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this._isNull)return this.initialize(e,n),null;var r=e.distance(n);r<this._distance&&this.initialize(e,n,r)}},Af.prototype.initialize=function(){if(0===arguments.length)this._isNull=!0;else if(2===arguments.length){var t=arguments[0],e=arguments[1];this._pt[0].setCoordinate(t),this._pt[1].setCoordinate(e),this._distance=t.distance(e),this._isNull=!1}else if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2];this._pt[0].setCoordinate(n),this._pt[1].setCoordinate(r),this._distance=i,this._isNull=!1}},Af.prototype.toString=function(){return Fl.toLineString(this._pt[0],this._pt[1])},Af.prototype.getDistance=function(){return this._distance},Af.prototype.setMaximum=function(){if(1===arguments.length){var t=arguments[0];this.setMaximum(t._pt[0],t._pt[1])}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this._isNull)return this.initialize(e,n),null;var r=e.distance(n);r>this._distance&&this.initialize(e,n,r)}},Af.prototype.interfaces_=function(){return[]},Af.prototype.getClass=function(){return Af};var Df=function(){};Df.prototype.interfaces_=function(){return[]},Df.prototype.getClass=function(){return Df},Df.computeDistance=function(){if(arguments[2]instanceof Af&&arguments[0]instanceof Zc&&arguments[1]instanceof ul)for(var t=arguments[0],e=arguments[1],n=arguments[2],r=new vp,i=t.getCoordinates(),o=0;o<i.length-1;o++){r.setCoordinates(i[o],i[o+1]);var s=r.closestPoint(e);n.setMinimum(s,e)}else if(arguments[2]instanceof Af&&arguments[0]instanceof th&&arguments[1]instanceof ul){var a=arguments[0],u=arguments[1],l=arguments[2];Df.computeDistance(a.getExteriorRing(),u,l);for(var c=0;c<a.getNumInteriorRing();c++)Df.computeDistance(a.getInteriorRingN(c),u,l)}else if(arguments[2]instanceof Af&&arguments[0]instanceof Wl&&arguments[1]instanceof ul){var h=arguments[0],p=arguments[1],f=arguments[2];if(h instanceof Zc)Df.computeDistance(h,p,f);else if(h instanceof th)Df.computeDistance(h,p,f);else if(h instanceof kc)for(var g=h,d=0;d<g.getNumGeometries();d++){var y=g.getGeometryN(d);Df.computeDistance(y,p,f)}else f.setMinimum(h.getCoordinate(),p)}else if(arguments[2]instanceof Af&&arguments[0]instanceof vp&&arguments[1]instanceof ul){var v=arguments[0],_=arguments[1],m=arguments[2],x=v.closestPoint(_);m.setMinimum(x,_)}};var Ff=function(){this._g0=null,this._g1=null,this._ptDist=new Af,this._densifyFrac=0;var t=arguments[0],e=arguments[1];this._g0=t,this._g1=e},kf={MaxPointDistanceFilter:{configurable:!0},MaxDensifiedByFractionDistanceFilter:{configurable:!0}};Ff.prototype.getCoordinates=function(){return this._ptDist.getCoordinates()},Ff.prototype.setDensifyFraction=function(t){if(t>1||t<=0)throw new el("Fraction is not in range (0.0 - 1.0]");this._densifyFrac=t},Ff.prototype.compute=function(t,e){this.computeOrientedDistance(t,e,this._ptDist),this.computeOrientedDistance(e,t,this._ptDist)},Ff.prototype.distance=function(){return this.compute(this._g0,this._g1),this._ptDist.getDistance()},Ff.prototype.computeOrientedDistance=function(t,e,n){var r=new Gf(e);if(t.apply(r),n.setMaximum(r.getMaxPointDistance()),this._densifyFrac>0){var i=new qf(e,this._densifyFrac);t.apply(i),n.setMaximum(i.getMaxPointDistance())}},Ff.prototype.orientedDistance=function(){return this.computeOrientedDistance(this._g0,this._g1,this._ptDist),this._ptDist.getDistance()},Ff.prototype.interfaces_=function(){return[]},Ff.prototype.getClass=function(){return Ff},Ff.distance=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new Ff(t,e);return n.distance()}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=new Ff(r,i);return s.setDensifyFraction(o),s.distance()}},kf.MaxPointDistanceFilter.get=function(){return Gf},kf.MaxDensifiedByFractionDistanceFilter.get=function(){return qf},Object.defineProperties(Ff,kf);var Gf=function(){this._maxPtDist=new Af,this._minPtDist=new Af,this._euclideanDist=new Df,this._geom=null;var t=arguments[0];this._geom=t};Gf.prototype.filter=function(t){this._minPtDist.initialize(),Df.computeDistance(this._geom,t,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)},Gf.prototype.getMaxPointDistance=function(){return this._maxPtDist},Gf.prototype.interfaces_=function(){return[Kl]},Gf.prototype.getClass=function(){return Gf};var qf=function(){this._maxPtDist=new Af,this._minPtDist=new Af,this._geom=null,this._numSubSegs=0;var t=arguments[0],e=arguments[1];this._geom=t,this._numSubSegs=Math.trunc(Math.round(1/e))};qf.prototype.filter=function(t,e){var n=this;if(0===e)return null;for(var r=t.getCoordinate(e-1),i=t.getCoordinate(e),o=(i.x-r.x)/this._numSubSegs,s=(i.y-r.y)/this._numSubSegs,a=0;a<this._numSubSegs;a++){var u=r.x+a*o,l=r.y+a*s,c=new ul(u,l);n._minPtDist.initialize(),Df.computeDistance(n._geom,c,n._minPtDist),n._maxPtDist.setMaximum(n._minPtDist)}},qf.prototype.isDone=function(){return!1},qf.prototype.isGeometryChanged=function(){return!1},qf.prototype.getMaxPointDistance=function(){return this._maxPtDist},qf.prototype.interfaces_=function(){return[Fc]},qf.prototype.getClass=function(){return qf};var Bf=function(t,e,n){this._minValidDistance=null,this._maxValidDistance=null,this._minDistanceFound=null,this._maxDistanceFound=null,this._isValid=!0,this._errMsg=null,this._errorLocation=null,this._errorIndicator=null,this._input=t||null,this._bufDistance=e||null,this._result=n||null},zf={VERBOSE:{configurable:!0},MAX_DISTANCE_DIFF_FRAC:{configurable:!0}};Bf.prototype.checkMaximumDistance=function(t,e,n){var r=new Ff(e,t);if(r.setDensifyFraction(.25),this._maxDistanceFound=r.orientedDistance(),this._maxDistanceFound>n){this._isValid=!1;var i=r.getCoordinates();this._errorLocation=i[1],this._errorIndicator=t.getFactory().createLineString(i),this._errMsg="Distance between buffer curve and input is too large ("+this._maxDistanceFound+" at "+Fl.toLineString(i[0],i[1])+")"}},Bf.prototype.isValid=function(){var t=Math.abs(this._bufDistance),e=Bf.MAX_DISTANCE_DIFF_FRAC*t;return this._minValidDistance=t-e,this._maxValidDistance=t+e,!(!this._input.isEmpty()&&!this._result.isEmpty())||(this._bufDistance>0?this.checkPositiveValid():this.checkNegativeValid(),Bf.VERBOSE&&Pl.out.println("Min Dist= "+this._minDistanceFound+" err= "+(1-this._minDistanceFound/this._bufDistance)+" Max Dist= "+this._maxDistanceFound+" err= "+(this._maxDistanceFound/this._bufDistance-1)),this._isValid)},Bf.prototype.checkNegativeValid=function(){if(!(this._input instanceof th||this._input instanceof rh||this._input instanceof kc))return null;var t=this.getPolygonLines(this._input);if(this.checkMinimumDistance(t,this._result,this._minValidDistance),!this._isValid)return null;this.checkMaximumDistance(t,this._result,this._maxValidDistance)},Bf.prototype.getErrorIndicator=function(){return this._errorIndicator},Bf.prototype.checkMinimumDistance=function(t,e,n){var r=new Tf(t,e,n);if(this._minDistanceFound=r.distance(),this._minDistanceFound<n){this._isValid=!1;var i=r.nearestPoints();this._errorLocation=r.nearestPoints()[1],this._errorIndicator=t.getFactory().createLineString(i),this._errMsg="Distance between buffer curve and input is too small ("+this._minDistanceFound+" at "+Fl.toLineString(i[0],i[1])+" )"}},Bf.prototype.checkPositiveValid=function(){var t=this._result.getBoundary();if(this.checkMinimumDistance(this._input,t,this._minValidDistance),!this._isValid)return null;this.checkMaximumDistance(this._input,t,this._maxValidDistance)},Bf.prototype.getErrorLocation=function(){return this._errorLocation},Bf.prototype.getPolygonLines=function(t){for(var e=new lc,n=new Cf(e),r=Sf.getPolygons(t).iterator();r.hasNext();){r.next().apply(n)}return t.getFactory().buildGeometry(e)},Bf.prototype.getErrorMessage=function(){return this._errMsg},Bf.prototype.interfaces_=function(){return[]},Bf.prototype.getClass=function(){return Bf},zf.VERBOSE.get=function(){return!1},zf.MAX_DISTANCE_DIFF_FRAC.get=function(){return.012},Object.defineProperties(Bf,zf);var jf=function(t,e,n){this._isValid=!0,this._errorMsg=null,this._errorLocation=null,this._errorIndicator=null,this._input=t||null,this._distance=e||null,this._result=n||null},Uf={VERBOSE:{configurable:!0},MAX_ENV_DIFF_FRAC:{configurable:!0}};jf.prototype.isValid=function(){return this.checkPolygonal(),this._isValid?(this.checkExpectedEmpty(),this._isValid?(this.checkEnvelope(),this._isValid?(this.checkArea(),this._isValid?(this.checkDistance(),this._isValid):this._isValid):this._isValid):this._isValid):this._isValid},jf.prototype.checkEnvelope=function(){if(this._distance<0)return null;var t=this._distance*jf.MAX_ENV_DIFF_FRAC;0===t&&(t=.001);var e=new Ll(this._input.getEnvelopeInternal());e.expandBy(this._distance);var n=new Ll(this._result.getEnvelopeInternal());n.expandBy(t),n.contains(e)||(this._isValid=!1,this._errorMsg="Buffer envelope is incorrect",this._errorIndicator=this._input.getFactory().toGeometry(n)),this.report("Envelope")},jf.prototype.checkDistance=function(){var t=new Bf(this._input,this._distance,this._result);t.isValid()||(this._isValid=!1,this._errorMsg=t.getErrorMessage(),this._errorLocation=t.getErrorLocation(),this._errorIndicator=t.getErrorIndicator()),this.report("Distance")},jf.prototype.checkArea=function(){var t=this._input.getArea(),e=this._result.getArea();this._distance>0&&t>e&&(this._isValid=!1,this._errorMsg="Area of positive buffer is smaller than input",this._errorIndicator=this._result),this._distance<0&&t<e&&(this._isValid=!1,this._errorMsg="Area of negative buffer is larger than input",this._errorIndicator=this._result),this.report("Area")},jf.prototype.checkPolygonal=function(){this._result instanceof th||this._result instanceof rh||(this._isValid=!1),this._errorMsg="Result is not polygonal",this._errorIndicator=this._result,this.report("Polygonal")},jf.prototype.getErrorIndicator=function(){return this._errorIndicator},jf.prototype.getErrorLocation=function(){return this._errorLocation},jf.prototype.checkExpectedEmpty=function(){return this._input.getDimension()>=2||this._distance>0?null:(this._result.isEmpty()||(this._isValid=!1,this._errorMsg="Result is non-empty",this._errorIndicator=this._result),void this.report("ExpectedEmpty"))},jf.prototype.report=function(t){if(!jf.VERBOSE)return null;Pl.out.println("Check "+t+": "+(this._isValid?"passed":"FAILED"))},jf.prototype.getErrorMessage=function(){return this._errorMsg},jf.prototype.interfaces_=function(){return[]},jf.prototype.getClass=function(){return jf},jf.isValidMsg=function(t,e,n){var r=new jf(t,e,n);return r.isValid()?null:r.getErrorMessage()},jf.isValid=function(t,e,n){return!!new jf(t,e,n).isValid()},Uf.VERBOSE.get=function(){return!1},Uf.MAX_ENV_DIFF_FRAC.get=function(){return.012},Object.defineProperties(jf,Uf);var Vf=function(){this._pts=null,this._data=null;var t=arguments[0],e=arguments[1];this._pts=t,this._data=e};Vf.prototype.getCoordinates=function(){return this._pts},Vf.prototype.size=function(){return this._pts.length},Vf.prototype.getCoordinate=function(t){return this._pts[t]},Vf.prototype.isClosed=function(){return this._pts[0].equals(this._pts[this._pts.length-1])},Vf.prototype.getSegmentOctant=function(t){return t===this._pts.length-1?-1:fp.octant(this.getCoordinate(t),this.getCoordinate(t+1))},Vf.prototype.setData=function(t){this._data=t},Vf.prototype.getData=function(){return this._data},Vf.prototype.toString=function(){return Fl.toLineString(new lh(this._pts))},Vf.prototype.interfaces_=function(){return[gp]},Vf.prototype.getClass=function(){return Vf};var Xf=function(){this._findAllIntersections=!1,this._isCheckEndSegmentsOnly=!1,this._li=null,this._interiorIntersection=null,this._intSegments=null,this._intersections=new lc,this._intersectionCount=0,this._keepIntersections=!0;var t=arguments[0];this._li=t,this._interiorIntersection=null};Xf.prototype.getInteriorIntersection=function(){return this._interiorIntersection},Xf.prototype.setCheckEndSegmentsOnly=function(t){this._isCheckEndSegmentsOnly=t},Xf.prototype.getIntersectionSegments=function(){return this._intSegments},Xf.prototype.count=function(){return this._intersectionCount},Xf.prototype.getIntersections=function(){return this._intersections},Xf.prototype.setFindAllIntersections=function(t){this._findAllIntersections=t},Xf.prototype.setKeepIntersections=function(t){this._keepIntersections=t},Xf.prototype.processIntersections=function(t,e,n,r){if(!this._findAllIntersections&&this.hasIntersection())return null;if(t===n&&e===r)return null;if(this._isCheckEndSegmentsOnly&&!(this.isEndSegment(t,e)||this.isEndSegment(n,r)))return null;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&this._li.isInteriorIntersection()&&(this._intSegments=new Array(4).fill(null),this._intSegments[0]=i,this._intSegments[1]=o,this._intSegments[2]=s,this._intSegments[3]=a,this._interiorIntersection=this._li.getIntersection(0),this._keepIntersections&&this._intersections.add(this._interiorIntersection),this._intersectionCount++)},Xf.prototype.isEndSegment=function(t,e){return 0===e||e>=t.size()-2},Xf.prototype.hasIntersection=function(){return null!==this._interiorIntersection},Xf.prototype.isDone=function(){return!this._findAllIntersections&&null!==this._interiorIntersection},Xf.prototype.interfaces_=function(){return[Zp]},Xf.prototype.getClass=function(){return Xf},Xf.createAllIntersectionsFinder=function(t){var e=new Xf(t);return e.setFindAllIntersections(!0),e},Xf.createAnyIntersectionFinder=function(t){return new Xf(t)},Xf.createIntersectionCounter=function(t){var e=new Xf(t);return e.setFindAllIntersections(!0),e.setKeepIntersections(!1),e};var Yf=function(){this._li=new jl,this._segStrings=null,this._findAllIntersections=!1,this._segInt=null,this._isValid=!0;var t=arguments[0];this._segStrings=t};Yf.prototype.execute=function(){if(null!==this._segInt)return null;this.checkInteriorIntersections()},Yf.prototype.getIntersections=function(){return this._segInt.getIntersections()},Yf.prototype.isValid=function(){return this.execute(),this._isValid},Yf.prototype.setFindAllIntersections=function(t){this._findAllIntersections=t},Yf.prototype.checkInteriorIntersections=function(){this._isValid=!0,this._segInt=new Xf(this._li),this._segInt.setFindAllIntersections(this._findAllIntersections);var t=new Ip;if(t.setSegmentIntersector(this._segInt),t.computeNodes(this._segStrings),this._segInt.hasIntersection())return this._isValid=!1,null},Yf.prototype.checkValid=function(){if(this.execute(),!this._isValid)throw new Oh(this.getErrorMessage(),this._segInt.getInteriorIntersection())},Yf.prototype.getErrorMessage=function(){if(this._isValid)return"no intersections found";var t=this._segInt.getIntersectionSegments();return"found non-noded intersection between "+Fl.toLineString(t[0],t[1])+" and "+Fl.toLineString(t[2],t[3])},Yf.prototype.interfaces_=function(){return[]},Yf.prototype.getClass=function(){return Yf},Yf.computeIntersections=function(t){var e=new Yf(t);return e.setFindAllIntersections(!0),e.isValid(),e.getIntersections()};var Hf=function t(){this._nv=null;var e=arguments[0];this._nv=new Yf(t.toSegmentStrings(e))};Hf.prototype.checkValid=function(){this._nv.checkValid()},Hf.prototype.interfaces_=function(){return[]},Hf.prototype.getClass=function(){return Hf},Hf.toSegmentStrings=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next();e.add(new Vf(r.getCoordinates(),r))}return e},Hf.checkValid=function(t){new Hf(t).checkValid()};var Wf=function(t){this._mapOp=t};Wf.prototype.map=function(t){for(var e=new lc,n=0;n<t.getNumGeometries();n++){var r=this._mapOp.map(t.getGeometryN(n));r.isEmpty()||e.add(r)}return t.getFactory().createGeometryCollection(_h.toGeometryArray(e))},Wf.prototype.interfaces_=function(){return[]},Wf.prototype.getClass=function(){return Wf},Wf.map=function(t,e){return new Wf(e).map(t)};var Jf=function(){this._op=null,this._geometryFactory=null,this._ptLocator=null,this._lineEdgesList=new lc,this._resultLineList=new lc;var t=arguments[0],e=arguments[1],n=arguments[2];this._op=t,this._geometryFactory=e,this._ptLocator=n};Jf.prototype.collectLines=function(t){for(var e=this,n=this._op.getGraph().getEdgeEnds().iterator();n.hasNext();){var r=n.next();e.collectLineEdge(r,t,e._lineEdgesList),e.collectBoundaryTouchEdge(r,t,e._lineEdgesList)}},Jf.prototype.labelIsolatedLine=function(t,e){var n=this._ptLocator.locate(t.getCoordinate(),this._op.getArgGeometry(e));t.getLabel().setLocation(e,n)},Jf.prototype.build=function(t){return this.findCoveredLineEdges(),this.collectLines(t),this.buildLines(t),this._resultLineList},Jf.prototype.collectLineEdge=function(t,e,n){var r=t.getLabel(),i=t.getEdge();t.isLineEdge()&&(t.isVisited()||!Mg.isResultOfOp(r,e)||i.isCovered()||(n.add(i),t.setVisitedEdge(!0)))},Jf.prototype.findCoveredLineEdges=function(){for(var t=this._op.getGraph().getNodes().iterator();t.hasNext();){t.next().getEdges().findCoveredLineEdges()}for(var e=this._op.getGraph().getEdgeEnds().iterator();e.hasNext();){var n=e.next(),r=n.getEdge();if(n.isLineEdge()&&!r.isCoveredSet()){var i=this._op.isCoveredByA(n.getCoordinate());r.setCovered(i)}}},Jf.prototype.labelIsolatedLines=function(t){for(var e=t.iterator();e.hasNext();){var n=e.next(),r=n.getLabel();n.isIsolated()&&(r.isNull(0)?this.labelIsolatedLine(n,0):this.labelIsolatedLine(n,1))}},Jf.prototype.buildLines=function(t){for(var e=this._lineEdgesList.iterator();e.hasNext();){var n=e.next(),r=this._geometryFactory.createLineString(n.getCoordinates());this._resultLineList.add(r),n.setInResult(!0)}},Jf.prototype.collectBoundaryTouchEdge=function(t,e,n){var r=t.getLabel();return t.isLineEdge()||t.isVisited()||t.isInteriorAreaEdge()||t.getEdge().isInResult()?null:(ql.isTrue(!(t.isInResult()||t.getSym().isInResult())||!t.getEdge().isInResult()),void(Mg.isResultOfOp(r,e)&&e===Mg.INTERSECTION&&(n.add(t.getEdge()),t.setVisitedEdge(!0))))},Jf.prototype.interfaces_=function(){return[]},Jf.prototype.getClass=function(){return Jf};var Zf=function(){this._op=null,this._geometryFactory=null,this._resultPointList=new lc;var t=arguments[0],e=arguments[1];this._op=t,this._geometryFactory=e};Zf.prototype.filterCoveredNodeToPoint=function(t){var e=t.getCoordinate();if(!this._op.isCoveredByLA(e)){var n=this._geometryFactory.createPoint(e);this._resultPointList.add(n)}},Zf.prototype.extractNonCoveredResultNodes=function(t){for(var e=this._op.getGraph().getNodes().iterator();e.hasNext();){var n=e.next();if(!n.isInResult()&&(!n.isIncidentEdgeInResult()&&(0===n.getEdges().getDegree()||t===Mg.INTERSECTION))){var r=n.getLabel();Mg.isResultOfOp(r,t)&&this.filterCoveredNodeToPoint(n)}}},Zf.prototype.build=function(t){return this.extractNonCoveredResultNodes(t),this._resultPointList},Zf.prototype.interfaces_=function(){return[]},Zf.prototype.getClass=function(){return Zf};var Kf=function(){this._inputGeom=null,this._factory=null,this._pruneEmptyGeometry=!0,this._preserveGeometryCollectionType=!0,this._preserveCollections=!1,this._preserveType=!1};Kf.prototype.transformPoint=function(t,e){return this._factory.createPoint(this.transformCoordinates(t.getCoordinateSequence(),t))},Kf.prototype.transformPolygon=function(t,e){var n=!0,r=this.transformLinearRing(t.getExteriorRing(),t);null!==r&&r instanceof nh&&!r.isEmpty()||(n=!1);for(var i=new lc,o=0;o<t.getNumInteriorRing();o++){var s=this.transformLinearRing(t.getInteriorRingN(o),t);null===s||s.isEmpty()||(s instanceof nh||(n=!1),i.add(s))}if(n)return this._factory.createPolygon(r,i.toArray([]));var a=new lc;return null!==r&&a.add(r),a.addAll(i),this._factory.buildGeometry(a)},Kf.prototype.createCoordinateSequence=function(t){return this._factory.getCoordinateSequenceFactory().create(t)},Kf.prototype.getInputGeometry=function(){return this._inputGeom},Kf.prototype.transformMultiLineString=function(t,e){for(var n=new lc,r=0;r<t.getNumGeometries();r++){var i=this.transformLineString(t.getGeometryN(r),t);null!==i&&(i.isEmpty()||n.add(i))}return this._factory.buildGeometry(n)},Kf.prototype.transformCoordinates=function(t,e){return this.copy(t)},Kf.prototype.transformLineString=function(t,e){return this._factory.createLineString(this.transformCoordinates(t.getCoordinateSequence(),t))},Kf.prototype.transformMultiPoint=function(t,e){for(var n=new lc,r=0;r<t.getNumGeometries();r++){var i=this.transformPoint(t.getGeometryN(r),t);null!==i&&(i.isEmpty()||n.add(i))}return this._factory.buildGeometry(n)},Kf.prototype.transformMultiPolygon=function(t,e){for(var n=new lc,r=0;r<t.getNumGeometries();r++){var i=this.transformPolygon(t.getGeometryN(r),t);null!==i&&(i.isEmpty()||n.add(i))}return this._factory.buildGeometry(n)},Kf.prototype.copy=function(t){return t.copy()},Kf.prototype.transformGeometryCollection=function(t,e){for(var n=new lc,r=0;r<t.getNumGeometries();r++){var i=this.transform(t.getGeometryN(r));null!==i&&(this._pruneEmptyGeometry&&i.isEmpty()||n.add(i))}return this._preserveGeometryCollectionType?this._factory.createGeometryCollection(_h.toGeometryArray(n)):this._factory.buildGeometry(n)},Kf.prototype.transform=function(t){if(this._inputGeom=t,this._factory=t.getFactory(),t instanceof Qc)return this.transformPoint(t,null);if(t instanceof eh)return this.transformMultiPoint(t,null);if(t instanceof nh)return this.transformLinearRing(t,null);if(t instanceof Zc)return this.transformLineString(t,null);if(t instanceof Gc)return this.transformMultiLineString(t,null);if(t instanceof th)return this.transformPolygon(t,null);if(t instanceof rh)return this.transformMultiPolygon(t,null);if(t instanceof kc)return this.transformGeometryCollection(t,null);throw new el("Unknown Geometry subtype: "+t.getClass().getName())},Kf.prototype.transformLinearRing=function(t,e){var n=this.transformCoordinates(t.getCoordinateSequence(),t);if(null===n)return this._factory.createLinearRing(null);var r=n.size();return r>0&&r<4&&!this._preserveType?this._factory.createLineString(n):this._factory.createLinearRing(n)},Kf.prototype.interfaces_=function(){return[]},Kf.prototype.getClass=function(){return Kf};var Qf=function t(){if(this._snapTolerance=0,this._srcPts=null,this._seg=new vp,this._allowSnappingToSourceVertices=!1,this._isClosed=!1,arguments[0]instanceof Zc&&"number"==typeof arguments[1]){var e=arguments[0],n=arguments[1];t.call(this,e.getCoordinates(),n)}else if(arguments[0]instanceof Array&&"number"==typeof arguments[1]){var r=arguments[0],i=arguments[1];this._srcPts=r,this._isClosed=t.isClosed(r),this._snapTolerance=i}};Qf.prototype.snapVertices=function(t,e){for(var n=this._isClosed?t.size()-1:t.size(),r=0;r<n;r++){var i=t.get(r),o=this.findSnapForVertex(i,e);null!==o&&(t.set(r,new ul(o)),0===r&&this._isClosed&&t.set(t.size()-1,new ul(o)))}},Qf.prototype.findSnapForVertex=function(t,e){for(var n=0;n<e.length;n++){if(t.equals2D(e[n]))return null;if(t.distance(e[n])<this._snapTolerance)return e[n]}return null},Qf.prototype.snapTo=function(t){var e=new hc(this._srcPts);return this.snapVertices(e,t),this.snapSegments(e,t),e.toCoordinateArray()},Qf.prototype.snapSegments=function(t,e){if(0===e.length)return null;var n=e.length;e[0].equals2D(e[e.length-1])&&(n=e.length-1);for(var r=0;r<n;r++){var i=e[r],o=this.findSegmentIndexToSnap(i,t);o>=0&&t.add(o+1,new ul(i),!1)}},Qf.prototype.findSegmentIndexToSnap=function(t,e){for(var n=this,r=nl.MAX_VALUE,i=-1,o=0;o<e.size()-1;o++){if(n._seg.p0=e.get(o),n._seg.p1=e.get(o+1),n._seg.p0.equals2D(t)||n._seg.p1.equals2D(t)){if(n._allowSnappingToSourceVertices)continue;return-1}var s=n._seg.distance(t);s<n._snapTolerance&&s<r&&(r=s,i=o)}return i},Qf.prototype.setAllowSnappingToSourceVertices=function(t){this._allowSnappingToSourceVertices=t},Qf.prototype.interfaces_=function(){return[]},Qf.prototype.getClass=function(){return Qf},Qf.isClosed=function(t){return!(t.length<=1)&&t[0].equals2D(t[t.length-1])};var $f=function(t){this._srcGeom=t||null},tg={SNAP_PRECISION_FACTOR:{configurable:!0}};$f.prototype.snapTo=function(t,e){var n=this.extractTargetCoordinates(t);return new eg(e,n).transform(this._srcGeom)},$f.prototype.snapToSelf=function(t,e){var n=this.extractTargetCoordinates(this._srcGeom),r=new eg(t,n,!0).transform(this._srcGeom),i=r;return e&&gl(i,$c)&&(i=r.buffer(0)),i},$f.prototype.computeSnapTolerance=function(t){return this.computeMinimumSegmentLength(t)/10},$f.prototype.extractTargetCoordinates=function(t){for(var e=new Lc,n=t.getCoordinates(),r=0;r<n.length;r++)e.add(n[r]);return e.toArray(new Array(0).fill(null))},$f.prototype.computeMinimumSegmentLength=function(t){for(var e=nl.MAX_VALUE,n=0;n<t.length-1;n++){var r=t[n].distance(t[n+1]);r<e&&(e=r)}return e},$f.prototype.interfaces_=function(){return[]},$f.prototype.getClass=function(){return $f},$f.snap=function(t,e,n){var r=new Array(2).fill(null),i=new $f(t);r[0]=i.snapTo(e,n);var o=new $f(e);return r[1]=o.snapTo(r[0],n),r},$f.computeOverlaySnapTolerance=function(){if(1===arguments.length){var t=arguments[0],e=$f.computeSizeBasedSnapTolerance(t),n=t.getPrecisionModel();if(n.getType()===gh.FIXED){var r=1/n.getScale()*2/1.415;r>e&&(e=r)}return e}if(2===arguments.length){var i=arguments[0],o=arguments[1];return Math.min($f.computeOverlaySnapTolerance(i),$f.computeOverlaySnapTolerance(o))}},$f.computeSizeBasedSnapTolerance=function(t){var e=t.getEnvelopeInternal();return Math.min(e.getHeight(),e.getWidth())*$f.SNAP_PRECISION_FACTOR},$f.snapToSelf=function(t,e,n){return new $f(t).snapToSelf(e,n)},tg.SNAP_PRECISION_FACTOR.get=function(){return 1e-9},Object.defineProperties($f,tg);var eg=function(t){function e(e,n,r){t.call(this),this._snapTolerance=e||null,this._snapPts=n||null,this._isSelfSnap=void 0!==r&&r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.snapLine=function(t,e){var n=new Qf(t,this._snapTolerance);return n.setAllowSnappingToSourceVertices(this._isSelfSnap),n.snapTo(e)},e.prototype.transformCoordinates=function(t,e){var n=t.toCoordinateArray(),r=this.snapLine(n,this._snapPts);return this._factory.getCoordinateSequenceFactory().create(r)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Kf),ng=function(){this._isFirst=!0,this._commonMantissaBitsCount=53,this._commonBits=0,this._commonSignExp=null};ng.prototype.getCommon=function(){return nl.longBitsToDouble(this._commonBits)},ng.prototype.add=function(t){var e=nl.doubleToLongBits(t);return this._isFirst?(this._commonBits=e,this._commonSignExp=ng.signExpBits(this._commonBits),this._isFirst=!1,null):ng.signExpBits(e)!==this._commonSignExp?(this._commonBits=0,null):(this._commonMantissaBitsCount=ng.numCommonMostSigMantissaBits(this._commonBits,e),void(this._commonBits=ng.zeroLowerBits(this._commonBits,64-(12+this._commonMantissaBitsCount))))},ng.prototype.toString=function(){if(1===arguments.length){var t=arguments[0],e=nl.longBitsToDouble(t),n=nl.toBinaryString(t),r="0000000000000000000000000000000000000000000000000000000000000000"+n,i=r.substring(r.length-64),o=i.substring(0,1)+" "+i.substring(1,12)+"(exp) "+i.substring(12)+" [ "+e+" ]";return o}},ng.prototype.interfaces_=function(){return[]},ng.prototype.getClass=function(){return ng},ng.getBit=function(t,e){return 0!=(t&1<<e)?1:0},ng.signExpBits=function(t){return t>>52},ng.zeroLowerBits=function(t,e){return t&~((1<<e)-1)},ng.numCommonMostSigMantissaBits=function(t,e){for(var n=0,r=52;r>=0;r--){if(ng.getBit(t,r)!==ng.getBit(e,r))return n;n++}return 52};var rg=function(){this._commonCoord=null,this._ccFilter=new og},ig={CommonCoordinateFilter:{configurable:!0},Translater:{configurable:!0}};rg.prototype.addCommonBits=function(t){var e=new sg(this._commonCoord);t.apply(e),t.geometryChanged()},rg.prototype.removeCommonBits=function(t){if(0===this._commonCoord.x&&0===this._commonCoord.y)return t;var e=new ul(this._commonCoord);e.x=-e.x,e.y=-e.y;var n=new sg(e);return t.apply(n),t.geometryChanged(),t},rg.prototype.getCommonCoordinate=function(){return this._commonCoord},rg.prototype.add=function(t){t.apply(this._ccFilter),this._commonCoord=this._ccFilter.getCommonCoordinate()},rg.prototype.interfaces_=function(){return[]},rg.prototype.getClass=function(){return rg},ig.CommonCoordinateFilter.get=function(){return og},ig.Translater.get=function(){return sg},Object.defineProperties(rg,ig);var og=function(){this._commonBitsX=new ng,this._commonBitsY=new ng};og.prototype.filter=function(t){this._commonBitsX.add(t.x),this._commonBitsY.add(t.y)},og.prototype.getCommonCoordinate=function(){return new ul(this._commonBitsX.getCommon(),this._commonBitsY.getCommon())},og.prototype.interfaces_=function(){return[Kl]},og.prototype.getClass=function(){return og};var sg=function(){this.trans=null;var t=arguments[0];this.trans=t};sg.prototype.filter=function(t,e){var n=t.getOrdinate(e,0)+this.trans.x,r=t.getOrdinate(e,1)+this.trans.y;t.setOrdinate(e,0,n),t.setOrdinate(e,1,r)},sg.prototype.isDone=function(){return!1},sg.prototype.isGeometryChanged=function(){return!0},sg.prototype.interfaces_=function(){return[Fc]},sg.prototype.getClass=function(){return sg};var ag=function(t,e){this._geom=new Array(2).fill(null),this._snapTolerance=null,this._cbr=null,this._geom[0]=t,this._geom[1]=e,this.computeSnapTolerance()};ag.prototype.selfSnap=function(t){return new $f(t).snapTo(t,this._snapTolerance)},ag.prototype.removeCommonBits=function(t){this._cbr=new rg,this._cbr.add(t[0]),this._cbr.add(t[1]);var e=new Array(2).fill(null);return e[0]=this._cbr.removeCommonBits(t[0].copy()),e[1]=this._cbr.removeCommonBits(t[1].copy()),e},ag.prototype.prepareResult=function(t){return this._cbr.addCommonBits(t),t},ag.prototype.getResultGeometry=function(t){var e=this.snap(this._geom),n=Mg.overlayOp(e[0],e[1],t);return this.prepareResult(n)},ag.prototype.checkValid=function(t){t.isValid()||Pl.out.println("Snapped geometry is invalid")},ag.prototype.computeSnapTolerance=function(){this._snapTolerance=$f.computeOverlaySnapTolerance(this._geom[0],this._geom[1])},ag.prototype.snap=function(t){var e=this.removeCommonBits(t);return $f.snap(e[0],e[1],this._snapTolerance)},ag.prototype.interfaces_=function(){return[]},ag.prototype.getClass=function(){return ag},ag.overlayOp=function(t,e,n){return new ag(t,e).getResultGeometry(n)},ag.union=function(t,e){return ag.overlayOp(t,e,Mg.UNION)},ag.intersection=function(t,e){return ag.overlayOp(t,e,Mg.INTERSECTION)},ag.symDifference=function(t,e){return ag.overlayOp(t,e,Mg.SYMDIFFERENCE)},ag.difference=function(t,e){return ag.overlayOp(t,e,Mg.DIFFERENCE)};var ug=function(t,e){this._geom=new Array(2).fill(null),this._geom[0]=t,this._geom[1]=e};ug.prototype.getResultGeometry=function(t){var e=null,n=!1,r=null;try{e=Mg.overlayOp(this._geom[0],this._geom[1],t);n=!0}catch(t){if(!(t instanceof kl))throw t;r=t}if(!n)try{e=ag.overlayOp(this._geom[0],this._geom[1],t)}catch(t){throw t instanceof kl?r:t}return e},ug.prototype.interfaces_=function(){return[]},ug.prototype.getClass=function(){return ug},ug.overlayOp=function(t,e,n){return new ug(t,e).getResultGeometry(n)},ug.union=function(t,e){return ug.overlayOp(t,e,Mg.UNION)},ug.intersection=function(t,e){return ug.overlayOp(t,e,Mg.INTERSECTION)},ug.symDifference=function(t,e){return ug.overlayOp(t,e,Mg.SYMDIFFERENCE)},ug.difference=function(t,e){return ug.overlayOp(t,e,Mg.DIFFERENCE)};var lg=function(){this.mce=null,this.chainIndex=null;var t=arguments[0],e=arguments[1];this.mce=t,this.chainIndex=e};lg.prototype.computeIntersections=function(t,e){this.mce.computeIntersectsForChain(this.chainIndex,t.mce,t.chainIndex,e)},lg.prototype.interfaces_=function(){return[]},lg.prototype.getClass=function(){return lg};var cg=function t(){if(this._label=null,this._xValue=null,this._eventType=null,this._insertEvent=null,this._deleteEventIndex=null,this._obj=null,2===arguments.length){var e=arguments[0],n=arguments[1];this._eventType=t.DELETE,this._xValue=e,this._insertEvent=n}else if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];this._eventType=t.INSERT,this._label=r,this._xValue=i,this._obj=o}},hg={INSERT:{configurable:!0},DELETE:{configurable:!0}};cg.prototype.isDelete=function(){return this._eventType===cg.DELETE},cg.prototype.setDeleteEventIndex=function(t){this._deleteEventIndex=t},cg.prototype.getObject=function(){return this._obj},cg.prototype.compareTo=function(t){var e=t;return this._xValue<e._xValue?-1:this._xValue>e._xValue?1:this._eventType<e._eventType?-1:this._eventType>e._eventType?1:0},cg.prototype.getInsertEvent=function(){return this._insertEvent},cg.prototype.isInsert=function(){return this._eventType===cg.INSERT},cg.prototype.isSameLabel=function(t){return null!==this._label&&this._label===t._label},cg.prototype.getDeleteEventIndex=function(){return this._deleteEventIndex},cg.prototype.interfaces_=function(){return[il]},cg.prototype.getClass=function(){return cg},hg.INSERT.get=function(){return 1},hg.DELETE.get=function(){return 2},Object.defineProperties(cg,hg);var pg=function(){};pg.prototype.interfaces_=function(){return[]},pg.prototype.getClass=function(){return pg};var fg=function(){this._hasIntersection=!1,this._hasProper=!1,this._hasProperInterior=!1,this._properIntersectionPoint=null,this._li=null,this._includeProper=null,this._recordIsolated=null,this._isSelfIntersection=null,this._numIntersections=0,this.numTests=0,this._bdyNodes=null,this._isDone=!1,this._isDoneWhenProperInt=!1;var t=arguments[0],e=arguments[1],n=arguments[2];this._li=t,this._includeProper=e,this._recordIsolated=n};fg.prototype.isTrivialIntersection=function(t,e,n,r){if(t===n&&1===this._li.getIntersectionNum()){if(fg.isAdjacentSegments(e,r))return!0;if(t.isClosed()){var i=t.getNumPoints()-1;if(0===e&&r===i||0===r&&e===i)return!0}}return!1},fg.prototype.getProperIntersectionPoint=function(){return this._properIntersectionPoint},fg.prototype.setIsDoneIfProperInt=function(t){this._isDoneWhenProperInt=t},fg.prototype.hasProperInteriorIntersection=function(){return this._hasProperInterior},fg.prototype.isBoundaryPointInternal=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next().getCoordinate();if(t.isIntersection(r))return!0}return!1},fg.prototype.hasProperIntersection=function(){return this._hasProper},fg.prototype.hasIntersection=function(){return this._hasIntersection},fg.prototype.isDone=function(){return this._isDone},fg.prototype.isBoundaryPoint=function(t,e){return null!==e&&(!!this.isBoundaryPointInternal(t,e[0])||!!this.isBoundaryPointInternal(t,e[1]))},fg.prototype.setBoundaryNodes=function(t,e){this._bdyNodes=new Array(2).fill(null),this._bdyNodes[0]=t,this._bdyNodes[1]=e},fg.prototype.addIntersections=function(t,e,n,r){if(t===n&&e===r)return null;this.numTests++;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&(this._recordIsolated&&(t.setIsolated(!1),n.setIsolated(!1)),this._numIntersections++,this.isTrivialIntersection(t,e,n,r)||(this._hasIntersection=!0,!this._includeProper&&this._li.isProper()||(t.addIntersections(this._li,e,0),n.addIntersections(this._li,r,1)),this._li.isProper()&&(this._properIntersectionPoint=this._li.getIntersection(0).copy(),this._hasProper=!0,this._isDoneWhenProperInt&&(this._isDone=!0),this.isBoundaryPoint(this._li,this._bdyNodes)||(this._hasProperInterior=!0))))},fg.prototype.interfaces_=function(){return[]},fg.prototype.getClass=function(){return fg},fg.isAdjacentSegments=function(t,e){return 1===Math.abs(t-e)};var gg=function(t){function e(){t.call(this),this.events=new lc,this.nOverlaps=null}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.prepareEvents=function(){np.sort(this.events);for(var t=0;t<this.events.size();t++){var e=this.events.get(t);e.isDelete()&&e.getInsertEvent().setDeleteEventIndex(t)}},e.prototype.computeIntersections=function(){var t=this;if(1===arguments.length){var e=arguments[0];this.nOverlaps=0,this.prepareEvents();for(var n=0;n<this.events.size();n++){var r=t.events.get(n);if(r.isInsert()&&t.processOverlaps(n,r.getDeleteEventIndex(),r,e),e.isDone())break}}else if(3===arguments.length)if(arguments[2]instanceof fg&&gl(arguments[0],ac)&&gl(arguments[1],ac)){var i=arguments[0],o=arguments[1],s=arguments[2];this.addEdges(i,i),this.addEdges(o,o),this.computeIntersections(s)}else if("boolean"==typeof arguments[2]&&gl(arguments[0],ac)&&arguments[1]instanceof fg){var a=arguments[0],u=arguments[1],l=arguments[2];l?this.addEdges(a,null):this.addEdges(a),this.computeIntersections(u)}},e.prototype.addEdge=function(t,e){for(var n=t.getMonotoneChainEdge(),r=n.getStartIndexes(),i=0;i<r.length-1;i++){var o=new lg(n,i),s=new cg(e,n.getMinX(i),o);this.events.add(s),this.events.add(new cg(n.getMaxX(i),s))}},e.prototype.processOverlaps=function(t,e,n,r){for(var i=n.getObject(),o=t;o<e;o++){var s=this.events.get(o);if(s.isInsert()){var a=s.getObject();n.isSameLabel(s)||(i.computeIntersections(a,r),this.nOverlaps++)}}},e.prototype.addEdges=function(){var t=this;if(1===arguments.length)for(var e=arguments[0],n=e.iterator();n.hasNext();){var r=n.next();t.addEdge(r,r)}else if(2===arguments.length)for(var i=arguments[0],o=arguments[1],s=i.iterator();s.hasNext();){var a=s.next();t.addEdge(a,o)}},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(pg),dg=function(){this._min=nl.POSITIVE_INFINITY,this._max=nl.NEGATIVE_INFINITY},yg={NodeComparator:{configurable:!0}};dg.prototype.getMin=function(){return this._min},dg.prototype.intersects=function(t,e){return!(this._min>e||this._max<t)},dg.prototype.getMax=function(){return this._max},dg.prototype.toString=function(){return Fl.toLineString(new ul(this._min,0),new ul(this._max,0))},dg.prototype.interfaces_=function(){return[]},dg.prototype.getClass=function(){return dg},yg.NodeComparator.get=function(){return vg},Object.defineProperties(dg,yg);var vg=function(){};vg.prototype.compare=function(t,e){var n=t,r=e,i=(n._min+n._max)/2,o=(r._min+r._max)/2;return i<o?-1:i>o?1:0},vg.prototype.interfaces_=function(){return[sl]},vg.prototype.getClass=function(){return vg};var _g=function(t){function e(){t.call(this),this._item=null;var e=arguments[0],n=arguments[1],r=arguments[2];this._min=e,this._max=n,this._item=r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.query=function(t,e,n){if(!this.intersects(t,e))return null;n.visitItem(this._item)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(dg),mg=function(t){function e(){t.call(this),this._node1=null,this._node2=null;var e=arguments[0],n=arguments[1];this._node1=e,this._node2=n,this.buildExtent(this._node1,this._node2)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.buildExtent=function(t,e){this._min=Math.min(t._min,e._min),this._max=Math.max(t._max,e._max)},e.prototype.query=function(t,e,n){if(!this.intersects(t,e))return null;null!==this._node1&&this._node1.query(t,e,n),null!==this._node2&&this._node2.query(t,e,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(dg),xg=function(){this._leaves=new lc,this._root=null,this._level=0};xg.prototype.buildTree=function(){np.sort(this._leaves,new dg.NodeComparator);for(var t=this._leaves,e=null,n=new lc;;){if(this.buildLevel(t,n),1===n.size())return n.get(0);e=t,t=n,n=e}},xg.prototype.insert=function(t,e,n){if(null!==this._root)throw new Error("Index cannot be added to once it has been queried");this._leaves.add(new _g(t,e,n))},xg.prototype.query=function(t,e,n){this.init(),this._root.query(t,e,n)},xg.prototype.buildRoot=function(){if(null!==this._root)return null;this._root=this.buildTree()},xg.prototype.printNode=function(t){Pl.out.println(Fl.toLineString(new ul(t._min,this._level),new ul(t._max,this._level)))},xg.prototype.init=function(){if(null!==this._root)return null;this.buildRoot()},xg.prototype.buildLevel=function(t,e){this._level++,e.clear();for(var n=0;n<t.size();n+=2){var r=t.get(n);if(null===(n+1<t.size()?t.get(n):null))e.add(r);else{var i=new mg(t.get(n),t.get(n+1));e.add(i)}}},xg.prototype.interfaces_=function(){return[]},xg.prototype.getClass=function(){return xg};var Eg=function(){this._items=new lc};Eg.prototype.visitItem=function(t){this._items.add(t)},Eg.prototype.getItems=function(){return this._items},Eg.prototype.interfaces_=function(){return[Qh]},Eg.prototype.getClass=function(){return Eg};var bg=function(){this._index=null;var t=arguments[0];if(!gl(t,$c))throw new el("Argument must be Polygonal");this._index=new Ng(t)},wg={SegmentVisitor:{configurable:!0},IntervalIndexedGeometry:{configurable:!0}};bg.prototype.locate=function(t){var e=new Vl(t),n=new Ig(e);return this._index.query(t.y,t.y,n),e.getLocation()},bg.prototype.interfaces_=function(){return[jp]},bg.prototype.getClass=function(){return bg},wg.SegmentVisitor.get=function(){return Ig},wg.IntervalIndexedGeometry.get=function(){return Ng},Object.defineProperties(bg,wg);var Ig=function(){this._counter=null;var t=arguments[0];this._counter=t};Ig.prototype.visitItem=function(t){var e=t;this._counter.countSegment(e.getCoordinate(0),e.getCoordinate(1))},Ig.prototype.interfaces_=function(){return[Qh]},Ig.prototype.getClass=function(){return Ig};var Ng=function(){this._index=new xg;var t=arguments[0];this.init(t)};Ng.prototype.init=function(t){for(var e=Cf.getLines(t).iterator();e.hasNext();){var n=e.next().getCoordinates();this.addLine(n)}},Ng.prototype.addLine=function(t){for(var e=1;e<t.length;e++){var n=new vp(t[e-1],t[e]),r=Math.min(n.p0.y,n.p1.y),i=Math.max(n.p0.y,n.p1.y);this._index.insert(r,i,n)}},Ng.prototype.query=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new Eg;return this._index.query(t,e,n),n.getItems()}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];this._index.query(r,i,o)}},Ng.prototype.interfaces_=function(){return[]},Ng.prototype.getClass=function(){return Ng};var Sg=function(t){function e(){if(t.call(this),this._parentGeom=null,this._lineEdgeMap=new fh,this._boundaryNodeRule=null,this._useBoundaryDeterminationRule=!0,this._argIndex=null,this._boundaryNodes=null,this._hasTooFewPoints=!1,this._invalidPoint=null,this._areaPtLocator=null,this._ptLocator=new Pf,2===arguments.length){var e=arguments[0],n=arguments[1],r=Ql.OGC_SFS_BOUNDARY_RULE;this._argIndex=e,this._parentGeom=n,this._boundaryNodeRule=r,null!==n&&this.add(n)}else if(3===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2];this._argIndex=i,this._parentGeom=o,this._boundaryNodeRule=s,null!==o&&this.add(o)}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.insertBoundaryPoint=function(t,n){var r=this._nodes.addNode(n).getLabel(),i=1;r.getLocation(t,Sh.ON)===pl.BOUNDARY&&i++;var o=e.determineBoundary(this._boundaryNodeRule,i);r.setLocation(t,o)},e.prototype.computeSelfNodes=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];return this.computeSelfNodes(t,e,!1)}if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2],o=new fg(n,!0,!1);o.setIsDoneIfProperInt(i);var s=this.createEdgeSetIntersector(),a=this._parentGeom instanceof nh||this._parentGeom instanceof th||this._parentGeom instanceof rh,u=r||!a;return s.computeIntersections(this._edges,o,u),this.addSelfIntersectionNodes(this._argIndex),o}},e.prototype.computeSplitEdges=function(t){for(var e=this._edges.iterator();e.hasNext();){e.next().eiList.addSplitEdges(t)}},e.prototype.computeEdgeIntersections=function(t,e,n){var r=new fg(e,n,!0);return r.setBoundaryNodes(this.getBoundaryNodes(),t.getBoundaryNodes()),this.createEdgeSetIntersector().computeIntersections(this._edges,t._edges,r),r},e.prototype.getGeometry=function(){return this._parentGeom},e.prototype.getBoundaryNodeRule=function(){return this._boundaryNodeRule},e.prototype.hasTooFewPoints=function(){return this._hasTooFewPoints},e.prototype.addPoint=function(){if(arguments[0]instanceof Qc){var t=arguments[0],e=t.getCoordinate();this.insertPoint(this._argIndex,e,pl.INTERIOR)}else if(arguments[0]instanceof ul){var n=arguments[0];this.insertPoint(this._argIndex,n,pl.INTERIOR)}},e.prototype.addPolygon=function(t){this.addPolygonRing(t.getExteriorRing(),pl.EXTERIOR,pl.INTERIOR);for(var e=0;e<t.getNumInteriorRing();e++){var n=t.getInteriorRingN(e);this.addPolygonRing(n,pl.INTERIOR,pl.EXTERIOR)}},e.prototype.addEdge=function(t){this.insertEdge(t);var e=t.getCoordinates();this.insertPoint(this._argIndex,e[0],pl.BOUNDARY),this.insertPoint(this._argIndex,e[e.length-1],pl.BOUNDARY)},e.prototype.addLineString=function(t){var e=pc.removeRepeatedPoints(t.getCoordinates());if(e.length<2)return this._hasTooFewPoints=!0,this._invalidPoint=e[0],null;var n=new of(e,new Dh(this._argIndex,pl.INTERIOR));this._lineEdgeMap.put(t,n),this.insertEdge(n),ql.isTrue(e.length>=2,"found LineString with single point"),this.insertBoundaryPoint(this._argIndex,e[0]),this.insertBoundaryPoint(this._argIndex,e[e.length-1])},e.prototype.getInvalidPoint=function(){return this._invalidPoint},e.prototype.getBoundaryPoints=function(){for(var t=this.getBoundaryNodes(),e=new Array(t.size()).fill(null),n=0,r=t.iterator();r.hasNext();){var i=r.next();e[n++]=i.getCoordinate().copy()}return e},e.prototype.getBoundaryNodes=function(){return null===this._boundaryNodes&&(this._boundaryNodes=this._nodes.getBoundaryNodes(this._argIndex)),this._boundaryNodes},e.prototype.addSelfIntersectionNode=function(t,e,n){if(this.isBoundaryNode(t,e))return null;n===pl.BOUNDARY&&this._useBoundaryDeterminationRule?this.insertBoundaryPoint(t,e):this.insertPoint(t,e,n)},e.prototype.addPolygonRing=function(t,e,n){if(t.isEmpty())return null;var r=pc.removeRepeatedPoints(t.getCoordinates());if(r.length<4)return this._hasTooFewPoints=!0,this._invalidPoint=r[0],null;var i=e,o=n;Xl.isCCW(r)&&(i=n,o=e);var s=new of(r,new Dh(this._argIndex,pl.BOUNDARY,i,o));this._lineEdgeMap.put(t,s),this.insertEdge(s),this.insertPoint(this._argIndex,r[0],pl.BOUNDARY)},e.prototype.insertPoint=function(t,e,n){var r=this._nodes.addNode(e),i=r.getLabel();null===i?r._label=new Dh(t,n):i.setLocation(t,n)},e.prototype.createEdgeSetIntersector=function(){return new gg},e.prototype.addSelfIntersectionNodes=function(t){for(var e=this._edges.iterator();e.hasNext();)for(var n=e.next(),r=n.getLabel().getLocation(t),i=n.eiList.iterator();i.hasNext();){var o=i.next();this.addSelfIntersectionNode(t,o.coord,r)}},e.prototype.add=function(){if(1!==arguments.length)return t.prototype.add.apply(this,arguments);var e=arguments[0];if(e.isEmpty())return null;if(e instanceof rh&&(this._useBoundaryDeterminationRule=!1),e instanceof th)this.addPolygon(e);else if(e instanceof Zc)this.addLineString(e);else if(e instanceof Qc)this.addPoint(e);else if(e instanceof eh)this.addCollection(e);else if(e instanceof Gc)this.addCollection(e);else if(e instanceof rh)this.addCollection(e);else{if(!(e instanceof kc))throw new Error(e.getClass().getName());this.addCollection(e)}},e.prototype.addCollection=function(t){for(var e=0;e<t.getNumGeometries();e++){var n=t.getGeometryN(e);this.add(n)}},e.prototype.locate=function(t){return gl(this._parentGeom,$c)&&this._parentGeom.getNumGeometries()>50?(null===this._areaPtLocator&&(this._areaPtLocator=new bg(this._parentGeom)),this._areaPtLocator.locate(t)):this._ptLocator.locate(t,this._parentGeom)},e.prototype.findEdge=function(){if(1===arguments.length){var e=arguments[0];return this._lineEdgeMap.get(e)}return t.prototype.findEdge.apply(this,arguments)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.determineBoundary=function(t,e){return t.isInBoundary(e)?pl.BOUNDARY:pl.INTERIOR},e}(Hh),Cg=function(){if(this._li=new jl,this._resultPrecisionModel=null,this._arg=null,1===arguments.length){var t=arguments[0];this.setComputationPrecision(t.getPrecisionModel()),this._arg=new Array(1).fill(null),this._arg[0]=new Sg(0,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1],r=Ql.OGC_SFS_BOUNDARY_RULE;e.getPrecisionModel().compareTo(n.getPrecisionModel())>=0?this.setComputationPrecision(e.getPrecisionModel()):this.setComputationPrecision(n.getPrecisionModel()),this._arg=new Array(2).fill(null),this._arg[0]=new Sg(0,e,r),this._arg[1]=new Sg(1,n,r)}else if(3===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2];i.getPrecisionModel().compareTo(o.getPrecisionModel())>=0?this.setComputationPrecision(i.getPrecisionModel()):this.setComputationPrecision(o.getPrecisionModel()),this._arg=new Array(2).fill(null),this._arg[0]=new Sg(0,i,s),this._arg[1]=new Sg(1,o,s)}};Cg.prototype.getArgGeometry=function(t){return this._arg[t].getGeometry()},Cg.prototype.setComputationPrecision=function(t){this._resultPrecisionModel=t,this._li.setPrecisionModel(this._resultPrecisionModel)},Cg.prototype.interfaces_=function(){return[]},Cg.prototype.getClass=function(){return Cg};var Pg=function(){};Pg.prototype.interfaces_=function(){return[]},Pg.prototype.getClass=function(){return Pg},Pg.map=function(){if(arguments[0]instanceof Wl&&gl(arguments[1],Pg.MapOp)){for(var t=arguments[0],e=arguments[1],n=new lc,r=0;r<t.getNumGeometries();r++){var i=e.map(t.getGeometryN(r));null!==i&&n.add(i)}return t.getFactory().buildGeometry(n)}if(gl(arguments[0],ic)&&gl(arguments[1],Pg.MapOp)){for(var o=arguments[0],s=arguments[1],a=new lc,u=o.iterator();u.hasNext();){var l=u.next(),c=s.map(l);null!==c&&a.add(c)}return a}},Pg.MapOp=function(){};var Mg=function(t){function e(){var e=arguments[0],n=arguments[1];t.call(this,e,n),this._ptLocator=new Pf,this._geomFact=null,this._resultGeom=null,this._graph=null,this._edgeList=new Jp,this._resultPolyList=new lc,this._resultLineList=new lc,this._resultPointList=new lc,this._graph=new Hh(new Hp),this._geomFact=e.getFactory()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.insertUniqueEdge=function(t){var e=this._edgeList.findEqualEdge(t);if(null!==e){var n=e.getLabel(),r=t.getLabel();e.isPointwiseEqual(t)||(r=new Dh(t.getLabel())).flip();var i=e.getDepth();i.isNull()&&i.add(n),i.add(r),n.merge(r)}else this._edgeList.add(t)},e.prototype.getGraph=function(){return this._graph},e.prototype.cancelDuplicateResultEdges=function(){for(var t=this._graph.getEdgeEnds().iterator();t.hasNext();){var e=t.next(),n=e.getSym();e.isInResult()&&n.isInResult()&&(e.setInResult(!1),n.setInResult(!1))}},e.prototype.isCoveredByLA=function(t){return!!this.isCovered(t,this._resultLineList)||!!this.isCovered(t,this._resultPolyList)},e.prototype.computeGeometry=function(t,n,r,i){var o=new lc;return o.addAll(t),o.addAll(n),o.addAll(r),o.isEmpty()?e.createEmptyResult(i,this._arg[0].getGeometry(),this._arg[1].getGeometry(),this._geomFact):this._geomFact.buildGeometry(o)},e.prototype.mergeSymLabels=function(){for(var t=this._graph.getNodes().iterator();t.hasNext();){t.next().getEdges().mergeSymLabels()}},e.prototype.isCovered=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next();if(this._ptLocator.locate(t,r)!==pl.EXTERIOR)return!0}return!1},e.prototype.replaceCollapsedEdges=function(){for(var t=new lc,e=this._edgeList.iterator();e.hasNext();){var n=e.next();n.isCollapsed()&&(e.remove(),t.add(n.getCollapsedEdge()))}this._edgeList.addAll(t)},e.prototype.updateNodeLabelling=function(){for(var t=this._graph.getNodes().iterator();t.hasNext();){var e=t.next(),n=e.getEdges().getLabel();e.getLabel().merge(n)}},e.prototype.getResultGeometry=function(t){return this.computeOverlay(t),this._resultGeom},e.prototype.insertUniqueEdges=function(t){for(var e=t.iterator();e.hasNext();){var n=e.next();this.insertUniqueEdge(n)}},e.prototype.computeOverlay=function(t){this.copyPoints(0),this.copyPoints(1),this._arg[0].computeSelfNodes(this._li,!1),this._arg[1].computeSelfNodes(this._li,!1),this._arg[0].computeEdgeIntersections(this._arg[1],this._li,!0);var e=new lc;this._arg[0].computeSplitEdges(e),this._arg[1].computeSplitEdges(e),this.insertUniqueEdges(e),this.computeLabelsFromDepths(),this.replaceCollapsedEdges(),Hf.checkValid(this._edgeList.getEdges()),this._graph.addEdges(this._edgeList.getEdges()),this.computeLabelling(),this.labelIncompleteNodes(),this.findResultAreaEdges(t),this.cancelDuplicateResultEdges();var n=new Wh(this._geomFact);n.add(this._graph),this._resultPolyList=n.getPolygons();var r=new Jf(this,this._geomFact,this._ptLocator);this._resultLineList=r.build(t);var i=new Zf(this,this._geomFact,this._ptLocator);this._resultPointList=i.build(t),this._resultGeom=this.computeGeometry(this._resultPointList,this._resultLineList,this._resultPolyList,t)},e.prototype.labelIncompleteNode=function(t,e){var n=this._ptLocator.locate(t.getCoordinate(),this._arg[e].getGeometry());t.getLabel().setLocation(e,n)},e.prototype.copyPoints=function(t){for(var e=this._arg[t].getNodeIterator();e.hasNext();){var n=e.next();this._graph.addNode(n.getCoordinate()).setLabel(t,n.getLabel().getLocation(t))}},e.prototype.findResultAreaEdges=function(t){for(var n=this._graph.getEdgeEnds().iterator();n.hasNext();){var r=n.next(),i=r.getLabel();i.isArea()&&!r.isInteriorAreaEdge()&&e.isResultOfOp(i.getLocation(0,Sh.RIGHT),i.getLocation(1,Sh.RIGHT),t)&&r.setInResult(!0)}},e.prototype.computeLabelsFromDepths=function(){for(var t=this._edgeList.iterator();t.hasNext();){var e=t.next(),n=e.getLabel(),r=e.getDepth();if(!r.isNull()){r.normalize();for(var i=0;i<2;i++)n.isNull(i)||!n.isArea()||r.isNull(i)||(0===r.getDelta(i)?n.toLine(i):(ql.isTrue(!r.isNull(i,Sh.LEFT),"depth of LEFT side has not been initialized"),n.setLocation(i,Sh.LEFT,r.getLocation(i,Sh.LEFT)),ql.isTrue(!r.isNull(i,Sh.RIGHT),"depth of RIGHT side has not been initialized"),n.setLocation(i,Sh.RIGHT,r.getLocation(i,Sh.RIGHT))))}}},e.prototype.computeLabelling=function(){for(var t=this._graph.getNodes().iterator();t.hasNext();){t.next().getEdges().computeLabelling(this._arg)}this.mergeSymLabels(),this.updateNodeLabelling()},e.prototype.labelIncompleteNodes=function(){for(var t=this._graph.getNodes().iterator();t.hasNext();){var e=t.next(),n=e.getLabel();e.isIsolated()&&(n.isNull(0)?this.labelIncompleteNode(e,0):this.labelIncompleteNode(e,1)),e.getEdges().updateLabelling(n)}},e.prototype.isCoveredByA=function(t){return!!this.isCovered(t,this._resultPolyList)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Cg);Mg.overlayOp=function(t,e,n){return new Mg(t,e).getResultGeometry(n)},Mg.intersection=function(t,e){if(t.isEmpty()||e.isEmpty())return Mg.createEmptyResult(Mg.INTERSECTION,t,e,t.getFactory());if(t.isGeometryCollection()){var n=e;return Wf.map(t,{interfaces_:function(){return[Pg.MapOp]},map:function(t){return t.intersection(n)}})}return t.checkNotGeometryCollection(t),t.checkNotGeometryCollection(e),ug.overlayOp(t,e,Mg.INTERSECTION)},Mg.symDifference=function(t,e){if(t.isEmpty()||e.isEmpty()){if(t.isEmpty()&&e.isEmpty())return Mg.createEmptyResult(Mg.SYMDIFFERENCE,t,e,t.getFactory());if(t.isEmpty())return e.copy();if(e.isEmpty())return t.copy()}return t.checkNotGeometryCollection(t),t.checkNotGeometryCollection(e),ug.overlayOp(t,e,Mg.SYMDIFFERENCE)},Mg.resultDimension=function(t,e,n){var r=e.getDimension(),i=n.getDimension(),o=-1;switch(t){case Mg.INTERSECTION:o=Math.min(r,i);break;case Mg.UNION:o=Math.max(r,i);break;case Mg.DIFFERENCE:o=r;break;case Mg.SYMDIFFERENCE:o=Math.max(r,i)}return o},Mg.createEmptyResult=function(t,e,n,r){var i=null;switch(Mg.resultDimension(t,e,n)){case-1:i=r.createGeometryCollection(new Array(0).fill(null));break;case 0:i=r.createPoint();break;case 1:i=r.createLineString();break;case 2:i=r.createPolygon()}return i},Mg.difference=function(t,e){return t.isEmpty()?Mg.createEmptyResult(Mg.DIFFERENCE,t,e,t.getFactory()):e.isEmpty()?t.copy():(t.checkNotGeometryCollection(t),t.checkNotGeometryCollection(e),ug.overlayOp(t,e,Mg.DIFFERENCE))},Mg.isResultOfOp=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=t.getLocation(0),r=t.getLocation(1);return Mg.isResultOfOp(n,r,e)}if(3===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2];switch(i===pl.BOUNDARY&&(i=pl.INTERIOR),o===pl.BOUNDARY&&(o=pl.INTERIOR),s){case Mg.INTERSECTION:return i===pl.INTERIOR&&o===pl.INTERIOR;case Mg.UNION:return i===pl.INTERIOR||o===pl.INTERIOR;case Mg.DIFFERENCE:return i===pl.INTERIOR&&o!==pl.INTERIOR;case Mg.SYMDIFFERENCE:return i===pl.INTERIOR&&o!==pl.INTERIOR||i!==pl.INTERIOR&&o===pl.INTERIOR}return!1}},Mg.INTERSECTION=1,Mg.UNION=2,Mg.DIFFERENCE=3,Mg.SYMDIFFERENCE=4;var Lg=function(){this._g=null,this._boundaryDistanceTolerance=null,this._linework=null,this._ptLocator=new Pf,this._seg=new vp;var t=arguments[0],e=arguments[1];this._g=t,this._boundaryDistanceTolerance=e,this._linework=this.extractLinework(t)};Lg.prototype.isWithinToleranceOfBoundary=function(t){for(var e=this,n=0;n<this._linework.getNumGeometries();n++)for(var r=e._linework.getGeometryN(n).getCoordinateSequence(),i=0;i<r.size()-1;i++){if(r.getCoordinate(i,e._seg.p0),r.getCoordinate(i+1,e._seg.p1),e._seg.distance(t)<=e._boundaryDistanceTolerance)return!0}return!1},Lg.prototype.getLocation=function(t){return this.isWithinToleranceOfBoundary(t)?pl.BOUNDARY:this._ptLocator.locate(t,this._g)},Lg.prototype.extractLinework=function(t){var e=new Og;t.apply(e);var n=e.getLinework(),r=_h.toLineStringArray(n);return t.getFactory().createMultiLineString(r)},Lg.prototype.interfaces_=function(){return[]},Lg.prototype.getClass=function(){return Lg};var Og=function(){this._linework=null,this._linework=new lc};Og.prototype.getLinework=function(){return this._linework},Og.prototype.filter=function(t){if(t instanceof th){var e=t;this._linework.add(e.getExteriorRing());for(var n=0;n<e.getNumInteriorRing();n++)this._linework.add(e.getInteriorRingN(n))}},Og.prototype.interfaces_=function(){return[Dc]},Og.prototype.getClass=function(){return Og};var Rg=function(){this._g=null,this._doLeft=!0,this._doRight=!0;var t=arguments[0];this._g=t};Rg.prototype.extractPoints=function(t,e,n){for(var r=t.getCoordinates(),i=0;i<r.length-1;i++)this.computeOffsetPoints(r[i],r[i+1],e,n)},Rg.prototype.setSidesToGenerate=function(t,e){this._doLeft=t,this._doRight=e},Rg.prototype.getPoints=function(t){for(var e=new lc,n=Cf.getLines(this._g).iterator();n.hasNext();){var r=n.next();this.extractPoints(r,t,e)}return e},Rg.prototype.computeOffsetPoints=function(t,e,n,r){var i=e.x-t.x,o=e.y-t.y,s=Math.sqrt(i*i+o*o),a=n*i/s,u=n*o/s,l=(e.x+t.x)/2,c=(e.y+t.y)/2;if(this._doLeft){var h=new ul(l-u,c+a);r.add(h)}if(this._doRight){var p=new ul(l+u,c-a);r.add(p)}},Rg.prototype.interfaces_=function(){return[]},Rg.prototype.getClass=function(){return Rg};var Tg=function t(){this._geom=null,this._locFinder=null,this._location=new Array(3).fill(null),this._invalidLocation=null,this._boundaryDistanceTolerance=t.TOLERANCE,this._testCoords=new lc;var e=arguments[0],n=arguments[1],r=arguments[2];this._boundaryDistanceTolerance=t.computeBoundaryDistanceTolerance(e,n),this._geom=[e,n,r],this._locFinder=[new Lg(this._geom[0],this._boundaryDistanceTolerance),new Lg(this._geom[1],this._boundaryDistanceTolerance),new Lg(this._geom[2],this._boundaryDistanceTolerance)]},Ag={TOLERANCE:{configurable:!0}};Tg.prototype.reportResult=function(t,e,n){Pl.out.println("Overlay result invalid - A:"+pl.toLocationSymbol(e[0])+" B:"+pl.toLocationSymbol(e[1])+" expected:"+(n?"i":"e")+" actual:"+pl.toLocationSymbol(e[2]))},Tg.prototype.isValid=function(t){this.addTestPts(this._geom[0]),this.addTestPts(this._geom[1]);var e=this.checkValid(t);return e},Tg.prototype.checkValid=function(){var t=this;if(1===arguments.length){for(var e=arguments[0],n=0;n<this._testCoords.size();n++){var r=t._testCoords.get(n);if(!t.checkValid(e,r))return t._invalidLocation=r,!1}return!0}if(2===arguments.length){var i=arguments[0],o=arguments[1];return this._location[0]=this._locFinder[0].getLocation(o),this._location[1]=this._locFinder[1].getLocation(o),this._location[2]=this._locFinder[2].getLocation(o),!!Tg.hasLocation(this._location,pl.BOUNDARY)||this.isValidResult(i,this._location)}},Tg.prototype.addTestPts=function(t){var e=new Rg(t);this._testCoords.addAll(e.getPoints(5*this._boundaryDistanceTolerance))},Tg.prototype.isValidResult=function(t,e){var n=Mg.isResultOfOp(e[0],e[1],t),r=!(n^e[2]===pl.INTERIOR);return r||this.reportResult(t,e,n),r},Tg.prototype.getInvalidLocation=function(){return this._invalidLocation},Tg.prototype.interfaces_=function(){return[]},Tg.prototype.getClass=function(){return Tg},Tg.hasLocation=function(t,e){for(var n=0;n<3;n++)if(t[n]===e)return!0;return!1},Tg.computeBoundaryDistanceTolerance=function(t,e){return Math.min($f.computeSizeBasedSnapTolerance(t),$f.computeSizeBasedSnapTolerance(e))},Tg.isValid=function(t,e,n,r){return new Tg(t,e,r).isValid(n)},Ag.TOLERANCE.get=function(){return 1e-6},Object.defineProperties(Tg,Ag);var Dg=function t(e){this._geomFactory=null,this._skipEmpty=!1,this._inputGeoms=null,this._geomFactory=t.extractFactory(e),this._inputGeoms=e};Dg.prototype.extractElements=function(t,e){if(null===t)return null;for(var n=0;n<t.getNumGeometries();n++){var r=t.getGeometryN(n);this._skipEmpty&&r.isEmpty()||e.add(r)}},Dg.prototype.combine=function(){for(var t=new lc,e=this._inputGeoms.iterator();e.hasNext();){var n=e.next();this.extractElements(n,t)}return 0===t.size()?null!==this._geomFactory?this._geomFactory.createGeometryCollection(null):null:this._geomFactory.buildGeometry(t)},Dg.prototype.interfaces_=function(){return[]},Dg.prototype.getClass=function(){return Dg},Dg.combine=function(){if(1===arguments.length){var t=arguments[0],e=new Dg(t);return e.combine()}if(2===arguments.length){var n=arguments[0],r=arguments[1],i=new Dg(Dg.createList(n,r));return i.combine()}if(3===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2],u=new Dg(Dg.createList(o,s,a));return u.combine()}},Dg.extractFactory=function(t){return t.isEmpty()?null:t.iterator().next().getFactory()},Dg.createList=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new lc;return n.add(t),n.add(e),n}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=new lc;return s.add(r),s.add(i),s.add(o),s}};var Fg=function(){this._inputPolys=null,this._geomFactory=null;var t=arguments[0];this._inputPolys=t,null===this._inputPolys&&(this._inputPolys=new lc)},kg={STRTREE_NODE_CAPACITY:{configurable:!0}};Fg.prototype.reduceToGeometries=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next(),i=null;gl(r,ac)?i=this.unionTree(r):r instanceof Wl&&(i=r),e.add(i)}return e},Fg.prototype.extractByEnvelope=function(t,e,n){for(var r=new lc,i=0;i<e.getNumGeometries();i++){var o=e.getGeometryN(i);o.getEnvelopeInternal().intersects(t)?r.add(o):n.add(o)}return this._geomFactory.buildGeometry(r)},Fg.prototype.unionOptimized=function(t,e){var n=t.getEnvelopeInternal(),r=e.getEnvelopeInternal();if(!n.intersects(r))return Dg.combine(t,e);if(t.getNumGeometries()<=1&&e.getNumGeometries()<=1)return this.unionActual(t,e);var i=n.intersection(r);return this.unionUsingEnvelopeIntersection(t,e,i)},Fg.prototype.union=function(){if(null===this._inputPolys)throw new Error("union() method cannot be called twice");if(this._inputPolys.isEmpty())return null;this._geomFactory=this._inputPolys.iterator().next().getFactory();for(var t=new up(Fg.STRTREE_NODE_CAPACITY),e=this._inputPolys.iterator();e.hasNext();){var n=e.next();t.insert(n.getEnvelopeInternal(),n)}this._inputPolys=null;var r=t.itemsTree();return this.unionTree(r)},Fg.prototype.binaryUnion=function(){if(1===arguments.length){var t=arguments[0];return this.binaryUnion(t,0,t.size())}if(3===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2];if(r-n<=1){var i=Fg.getGeometry(e,n);return this.unionSafe(i,null)}if(r-n==2)return this.unionSafe(Fg.getGeometry(e,n),Fg.getGeometry(e,n+1));var o=Math.trunc((r+n)/2),s=this.binaryUnion(e,n,o),a=this.binaryUnion(e,o,r);return this.unionSafe(s,a)}},Fg.prototype.repeatedUnion=function(t){for(var e=null,n=t.iterator();n.hasNext();){var r=n.next();e=null===e?r.copy():e.union(r)}return e},Fg.prototype.unionSafe=function(t,e){return null===t&&null===e?null:null===t?e.copy():null===e?t.copy():this.unionOptimized(t,e)},Fg.prototype.unionActual=function(t,e){return Fg.restrictToPolygons(t.union(e))},Fg.prototype.unionTree=function(t){var e=this.reduceToGeometries(t);return this.binaryUnion(e)},Fg.prototype.unionUsingEnvelopeIntersection=function(t,e,n){var r=new lc,i=this.extractByEnvelope(n,t,r),o=this.extractByEnvelope(n,e,r),s=this.unionActual(i,o);return r.add(s),Dg.combine(r)},Fg.prototype.bufferUnion=function(){if(1===arguments.length){var t=arguments[0],e=t.get(0).getFactory(),n=e.buildGeometry(t),r=n.buffer(0);return r}if(2===arguments.length){var i=arguments[0],o=arguments[1],s=i.getFactory(),a=s.createGeometryCollection([i,o]),u=a.buffer(0);return u}},Fg.prototype.interfaces_=function(){return[]},Fg.prototype.getClass=function(){return Fg},Fg.restrictToPolygons=function(t){if(gl(t,$c))return t;var e=Sf.getPolygons(t);return 1===e.size()?e.get(0):t.getFactory().createMultiPolygon(_h.toPolygonArray(e))},Fg.getGeometry=function(t,e){return e>=t.size()?null:t.get(e)},Fg.union=function(t){return new Fg(t).union()},kg.STRTREE_NODE_CAPACITY.get=function(){return 4},Object.defineProperties(Fg,kg);var Gg=function(){};function qg(){return new Bg}function Bg(){this.reset()}Gg.prototype.interfaces_=function(){return[]},Gg.prototype.getClass=function(){return Gg},Gg.union=function(t,e){if(t.isEmpty()||e.isEmpty()){if(t.isEmpty()&&e.isEmpty())return Mg.createEmptyResult(Mg.UNION,t,e,t.getFactory());if(t.isEmpty())return e.copy();if(e.isEmpty())return t.copy()}return t.checkNotGeometryCollection(t),t.checkNotGeometryCollection(e),ug.overlayOp(t,e,Mg.UNION)},Bg.prototype={constructor:Bg,reset:function(){this.s=this.t=0},add:function(t){jg(zg,t,this.t),jg(this,zg.s,this.s),this.s?this.t+=zg.t:this.s=zg.t},valueOf:function(){return this.s}};var zg=new Bg;function jg(t,e,n){var r=t.s=e+n,i=r-e,o=r-i;t.t=e-o+(n-i)}var Ug=1e-6,Vg=Math.PI,Xg=Vg/2,Yg=Vg/4,Hg=2*Vg,Wg=180/Vg,Jg=Vg/180,Zg=Math.abs,Kg=Math.atan,Qg=Math.atan2,$g=Math.cos,td=Math.sin,ed=Math.sqrt;function nd(t){return t>1?0:t<-1?Vg:Math.acos(t)}function rd(t){return t>1?Xg:t<-1?-Xg:Math.asin(t)}function id(){}function od(t,e){t&&ad.hasOwnProperty(t.type)&&ad[t.type](t,e)}var sd={Feature:function(t,e){od(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++r<i;)od(n[r].geometry,e)}},ad={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)t=n[r],e.point(t[0],t[1],t[2])},LineString:function(t,e){ud(t.coordinates,e,0)},MultiLineString:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)ud(n[r],e,0)},Polygon:function(t,e){ld(t.coordinates,e)},MultiPolygon:function(t,e){for(var n=t.coordinates,r=-1,i=n.length;++r<i;)ld(n[r],e)},GeometryCollection:function(t,e){for(var n=t.geometries,r=-1,i=n.length;++r<i;)od(n[r],e)}};function ud(t,e,n){var r,i=-1,o=t.length-n;for(e.lineStart();++i<o;)r=t[i],e.point(r[0],r[1],r[2]);e.lineEnd()}function ld(t,e){var n=-1,r=t.length;for(e.polygonStart();++n<r;)ud(t[n],e,1);e.polygonEnd()}qg(),qg();function cd(t){return[Qg(t[1],t[0]),rd(t[2])]}function hd(t){var e=t[0],n=t[1],r=$g(n);return[r*$g(e),r*td(e),td(n)]}function pd(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function fd(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function gd(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function dd(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function yd(t){var e=ed(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}qg();function vd(t,e){function n(n,r){return n=t(n,r),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,r){return(n=e.invert(n,r))&&t.invert(n[0],n[1])}),n}function _d(t,e){return[t>Vg?t-Hg:t<-Vg?t+Hg:t,e]}function md(t){return function(e,n){return[(e+=t)>Vg?e-Hg:e<-Vg?e+Hg:e,n]}}function xd(t){var e=md(t);return e.invert=md(-t),e}function Ed(t,e){var n=$g(t),r=td(t),i=$g(e),o=td(e);function s(t,e){var s=$g(e),a=$g(t)*s,u=td(t)*s,l=td(e),c=l*n+a*r;return[Qg(u*i-c*o,a*n-l*r),rd(c*i+u*o)]}return s.invert=function(t,e){var s=$g(e),a=$g(t)*s,u=td(t)*s,l=td(e),c=l*i-u*o;return[Qg(u*i+l*o,a*n+c*r),rd(c*n-a*r)]},s}function bd(t,e){(e=hd(e))[0]-=t,yd(e);var n=nd(-e[1]);return((-e[2]<0?-n:n)+Hg-Ug)%Hg}function wd(){var t,e=[];return{point:function(e,n){t.push([e,n])},lineStart:function(){e.push(t=[])},lineEnd:id,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Id(t,e){return Zg(t[0]-e[0])<Ug&&Zg(t[1]-e[1])<Ug}function Nd(t,e,n,r){this.x=t,this.z=e,this.o=n,this.e=r,this.v=!1,this.n=this.p=null}function Sd(t,e,n,r,i){var o,s,a=[],u=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,n,r=t[0],s=t[e];if(Id(r,s)){for(i.lineStart(),o=0;o<e;++o)i.point((r=t[o])[0],r[1]);i.lineEnd()}else a.push(n=new Nd(r,t,null,!0)),u.push(n.o=new Nd(r,null,n,!1)),a.push(n=new Nd(s,t,null,!1)),u.push(n.o=new Nd(s,null,n,!0))}})),a.length){for(u.sort(e),Cd(a),Cd(u),o=0,s=u.length;o<s;++o)u[o].e=n=!n;for(var l,c,h=a[0];;){for(var p=h,f=!0;p.v;)if((p=p.n)===h)return;l=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(f)for(o=0,s=l.length;o<s;++o)i.point((c=l[o])[0],c[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(f)for(l=p.p.z,o=l.length-1;o>=0;--o)i.point((c=l[o])[0],c[1]);else r(p.x,p.p.x,-1,i);p=p.p}l=(p=p.o).z,f=!f}while(!p.v);i.lineEnd()}}}function Cd(t){if(e=t.length){for(var e,n,r=0,i=t[0];++r<e;)i.n=n=t[r],n.p=i,i=n;i.n=n=t[0],n.p=i}}function Pd(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}_d.invert=_d;var Md,Ld;1===(Md=Pd).length&&(Ld=Md,Md=function(t,e){return Pd(Ld(t),e)});function Od(t){for(var e,n,r,i=t.length,o=-1,s=0;++o<i;)s+=t[o].length;for(n=new Array(s);--i>=0;)for(e=(r=t[i]).length;--e>=0;)n[--s]=r[e];return n}var Rd=1e9,Td=-Rd;function Ad(t,e,n,r){function i(i,o){return t<=i&&i<=n&&e<=o&&o<=r}function o(i,o,a,l){var c=0,h=0;if(null==i||(c=s(i,a))!==(h=s(o,a))||u(i,o)<0^a>0)do{l.point(0===c||3===c?t:n,c>1?r:e)}while((c=(c+a+4)%4)!==h);else l.point(o[0],o[1])}function s(r,i){return Zg(r[0]-t)<Ug?i>0?0:3:Zg(r[0]-n)<Ug?i>0?2:1:Zg(r[1]-e)<Ug?i>0?1:0:i>0?3:2}function a(t,e){return u(t.x,e.x)}function u(t,e){var n=s(t,1),r=s(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(s){var u,l,c,h,p,f,g,d,y,v,_,m=s,x=wd(),E={point:b,lineStart:function(){E.point=w,l&&l.push(c=[]);v=!0,y=!1,g=d=NaN},lineEnd:function(){u&&(w(h,p),f&&y&&x.rejoin(),u.push(x.result()));E.point=b,y&&m.lineEnd()},polygonStart:function(){m=x,u=[],l=[],_=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=l.length;n<i;++n)for(var o,s,a=l[n],u=1,c=a.length,h=a[0],p=h[0],f=h[1];u<c;++u)o=p,s=f,p=(h=a[u])[0],f=h[1],s<=r?f>r&&(p-o)*(r-s)>(f-s)*(t-o)&&++e:f<=r&&(p-o)*(r-s)<(f-s)*(t-o)&&--e;return e}(),n=_&&e,i=(u=Od(u)).length;(n||i)&&(s.polygonStart(),n&&(s.lineStart(),o(null,null,1,s),s.lineEnd()),i&&Sd(u,a,e,o,s),s.polygonEnd());m=s,u=l=c=null}};function b(t,e){i(t,e)&&m.point(t,e)}function w(o,s){var a=i(o,s);if(l&&c.push([o,s]),v)h=o,p=s,f=a,v=!1,a&&(m.lineStart(),m.point(o,s));else if(a&&y)m.point(o,s);else{var u=[g=Math.max(Td,Math.min(Rd,g)),d=Math.max(Td,Math.min(Rd,d))],x=[o=Math.max(Td,Math.min(Rd,o)),s=Math.max(Td,Math.min(Rd,s))];!function(t,e,n,r,i,o){var s,a=t[0],u=t[1],l=0,c=1,h=e[0]-a,p=e[1]-u;if(s=n-a,h||!(s>0)){if(s/=h,h<0){if(s<l)return;s<c&&(c=s)}else if(h>0){if(s>c)return;s>l&&(l=s)}if(s=i-a,h||!(s<0)){if(s/=h,h<0){if(s>c)return;s>l&&(l=s)}else if(h>0){if(s<l)return;s<c&&(c=s)}if(s=r-u,p||!(s>0)){if(s/=p,p<0){if(s<l)return;s<c&&(c=s)}else if(p>0){if(s>c)return;s>l&&(l=s)}if(s=o-u,p||!(s<0)){if(s/=p,p<0){if(s>c)return;s>l&&(l=s)}else if(p>0){if(s<l)return;s<c&&(c=s)}return l>0&&(t[0]=a+l*h,t[1]=u+l*p),c<1&&(e[0]=a+c*h,e[1]=u+c*p),!0}}}}}(u,x,t,e,n,r)?a&&(m.lineStart(),m.point(o,s),_=!1):(y||(m.lineStart(),m.point(u[0],u[1])),m.point(x[0],x[1]),a||m.lineEnd(),_=!1)}g=o,d=s,y=a}return E}}var Dd=qg();qg();function Fd(t){return t}qg(),qg();var kd=1/0,Gd=kd,qd=-kd,Bd=qd,zd={point:function(t,e){t<kd&&(kd=t);t>qd&&(qd=t);e<Gd&&(Gd=e);e>Bd&&(Bd=e)},lineStart:id,lineEnd:id,polygonStart:id,polygonEnd:id,result:function(){var t=[[kd,Gd],[qd,Bd]];return qd=Bd=-(Gd=kd=1/0),t}};qg();function jd(t,e,n,r){return function(i,o){var s,a,u,l=e(o),c=i.invert(r[0],r[1]),h=wd(),p=e(h),f=!1,g={point:d,lineStart:v,lineEnd:_,polygonStart:function(){g.point=m,g.lineStart=x,g.lineEnd=E,a=[],s=[]},polygonEnd:function(){g.point=d,g.lineStart=v,g.lineEnd=_,a=Od(a);var t=function(t,e){var n=e[0],r=e[1],i=[td(n),-$g(n),0],o=0,s=0;Dd.reset();for(var a=0,u=t.length;a<u;++a)if(c=(l=t[a]).length)for(var l,c,h=l[c-1],p=h[0],f=h[1]/2+Yg,g=td(f),d=$g(f),y=0;y<c;++y,p=_,g=x,d=E,h=v){var v=l[y],_=v[0],m=v[1]/2+Yg,x=td(m),E=$g(m),b=_-p,w=b>=0?1:-1,I=w*b,N=I>Vg,S=g*x;if(Dd.add(Qg(S*w*td(I),d*E+S*$g(I))),o+=N?b+w*Hg:b,N^p>=n^_>=n){var C=fd(hd(h),hd(v));yd(C);var P=fd(i,C);yd(P);var M=(N^b>=0?-1:1)*rd(P[2]);(r>M||r===M&&(C[0]||C[1]))&&(s+=N^b>=0?1:-1)}}return(o<-1e-6||o<Ug&&Dd<-1e-6)^1&s}(s,c);a.length?(f||(o.polygonStart(),f=!0),Sd(a,Vd,t,n,o)):t&&(f||(o.polygonStart(),f=!0),o.lineStart(),n(null,null,1,o),o.lineEnd()),f&&(o.polygonEnd(),f=!1),a=s=null},sphere:function(){o.polygonStart(),o.lineStart(),n(null,null,1,o),o.lineEnd(),o.polygonEnd()}};function d(e,n){var r=i(e,n);t(e=r[0],n=r[1])&&o.point(e,n)}function y(t,e){var n=i(t,e);l.point(n[0],n[1])}function v(){g.point=y,l.lineStart()}function _(){g.point=d,l.lineEnd()}function m(t,e){u.push([t,e]);var n=i(t,e);p.point(n[0],n[1])}function x(){p.lineStart(),u=[]}function E(){m(u[0][0],u[0][1]),p.lineEnd();var t,e,n,r,i=p.clean(),l=h.result(),c=l.length;if(u.pop(),s.push(u),u=null,c)if(1&i){if((e=(n=l[0]).length-1)>0){for(f||(o.polygonStart(),f=!0),o.lineStart(),t=0;t<e;++t)o.point((r=n[t])[0],r[1]);o.lineEnd()}}else c>1&&2&i&&l.push(l.pop().concat(l.shift())),a.push(l.filter(Ud))}return g}}function Ud(t){return t.length>1}function Vd(t,e){return((t=t.x)[0]<0?t[1]-Xg-Ug:Xg-t[1])-((e=e.x)[0]<0?e[1]-Xg-Ug:Xg-e[1])}var Xd=jd((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(o,s){var a=o>0?Vg:-Vg,u=Zg(o-n);Zg(u-Vg)<Ug?(t.point(n,r=(r+s)/2>0?Xg:-Xg),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),e=0):i!==a&&u>=Vg&&(Zg(n-i)<Ug&&(n-=i*Ug),Zg(o-a)<Ug&&(o-=a*Ug),r=function(t,e,n,r){var i,o,s=td(t-n);return Zg(s)>Ug?Kg((td(e)*(o=$g(r))*td(n)-td(r)*(i=$g(e))*td(t))/(i*o*s)):(e+r)/2}(n,r,o,s),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),e=0),t.point(n=o,r=s),i=a},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*Xg,r.point(-Vg,i),r.point(0,i),r.point(Vg,i),r.point(Vg,0),r.point(Vg,-i),r.point(0,-i),r.point(-Vg,-i),r.point(-Vg,0),r.point(-Vg,i);else if(Zg(t[0]-e[0])>Ug){var o=t[0]<e[0]?Vg:-Vg;i=n*o/2,r.point(-o,i),r.point(0,i),r.point(o,i)}else r.point(e[0],e[1])}),[-Vg,-Xg]);function Yd(t,e){var n=$g(t),r=n>0,i=Zg(n)>Ug;function o(t,e){return $g(t)*$g(e)>n}function s(t,e,r){var i=[1,0,0],o=fd(hd(t),hd(e)),s=pd(o,o),a=o[0],u=s-a*a;if(!u)return!r&&t;var l=n*s/u,c=-n*a/u,h=fd(i,o),p=dd(i,l);gd(p,dd(o,c));var f=h,g=pd(p,f),d=pd(f,f),y=g*g-d*(pd(p,p)-1);if(!(y<0)){var v=ed(y),_=dd(f,(-g-v)/d);if(gd(_,p),_=cd(_),!r)return _;var m,x=t[0],E=e[0],b=t[1],w=e[1];E<x&&(m=x,x=E,E=m);var I=E-x,N=Zg(I-Vg)<Ug;if(!N&&w<b&&(m=b,b=w,w=m),N||I<Ug?N?b+w>0^_[1]<(Zg(_[0]-x)<Ug?b:w):b<=_[1]&&_[1]<=w:I>Vg^(x<=_[0]&&_[0]<=E)){var S=dd(f,(-g+v)/d);return gd(S,p),[_,cd(S)]}}}function a(e,n){var i=r?t:Vg-t,o=0;return e<-i?o|=1:e>i&&(o|=2),n<-i?o|=4:n>i&&(o|=8),o}return jd(o,(function(t){var e,n,u,l,c;return{lineStart:function(){l=u=!1,c=1},point:function(h,p){var f,g=[h,p],d=o(h,p),y=r?d?0:a(h,p):d?a(h+(h<0?Vg:-Vg),p):0;if(!e&&(l=u=d)&&t.lineStart(),d!==u&&(!(f=s(e,g))||Id(e,f)||Id(g,f))&&(g[0]+=Ug,g[1]+=Ug,d=o(g[0],g[1])),d!==u)c=0,d?(t.lineStart(),f=s(g,e),t.point(f[0],f[1])):(f=s(e,g),t.point(f[0],f[1]),t.lineEnd()),e=f;else if(i&&e&&r^d){var v;y&n||!(v=s(g,e,!0))||(c=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1])))}!d||e&&Id(e,g)||t.point(g[0],g[1]),e=g,u=d,n=y},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return c|(l&&u)<<1}}}),(function(n,r,i,o){!function(t,e,n,r,i,o){if(n){var s=$g(e),a=td(e),u=r*n;null==i?(i=e+r*Hg,o=e-u/2):(i=bd(s,i),o=bd(s,o),(r>0?i<o:i>o)&&(i+=r*Hg));for(var l,c=i;r>0?c>o:c<o;c-=u)l=cd([s,-a*$g(c),-a*td(c)]),t.point(l[0],l[1])}}(o,t,e,i,n,r)}),r?[0,-t]:[-Vg,t-Vg])}function Hd(t){return function(e){var n=new Wd;for(var r in t)n[r]=t[r];return n.stream=e,n}}function Wd(){}function Jd(t,e,n){var r=e[1][0]-e[0][0],i=e[1][1]-e[0][1],o=t.clipExtent&&t.clipExtent();t.scale(150).translate([0,0]),null!=o&&t.clipExtent(null),function(t,e){t&&sd.hasOwnProperty(t.type)?sd[t.type](t,e):od(t,e)}(n,t.stream(zd));var s=zd.result(),a=Math.min(r/(s[1][0]-s[0][0]),i/(s[1][1]-s[0][1])),u=+e[0][0]+(r-a*(s[1][0]+s[0][0]))/2,l=+e[0][1]+(i-a*(s[1][1]+s[0][1]))/2;return null!=o&&t.clipExtent(o),t.scale(150*a).translate([u,l])}Wd.prototype={constructor:Wd,point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Zd=$g(30*Jg);function Kd(t,e){return+e?function(t,e){function n(r,i,o,s,a,u,l,c,h,p,f,g,d,y){var v=l-r,_=c-i,m=v*v+_*_;if(m>4*e&&d--){var x=s+p,E=a+f,b=u+g,w=ed(x*x+E*E+b*b),I=rd(b/=w),N=Zg(Zg(b)-1)<Ug||Zg(o-h)<Ug?(o+h)/2:Qg(E,x),S=t(N,I),C=S[0],P=S[1],M=C-r,L=P-i,O=_*M-v*L;(O*O/m>e||Zg((v*M+_*L)/m-.5)>.3||s*p+a*f+u*g<Zd)&&(n(r,i,o,s,a,u,C,P,N,x/=w,E/=w,b,d,y),y.point(C,P),n(C,P,N,x,E,b,l,c,h,p,f,g,d,y))}}return function(e){var r,i,o,s,a,u,l,c,h,p,f,g,d={point:y,lineStart:v,lineEnd:m,polygonStart:function(){e.polygonStart(),d.lineStart=x},polygonEnd:function(){e.polygonEnd(),d.lineStart=v}};function y(n,r){n=t(n,r),e.point(n[0],n[1])}function v(){c=NaN,d.point=_,e.lineStart()}function _(r,i){var o=hd([r,i]),s=t(r,i);n(c,h,l,p,f,g,c=s[0],h=s[1],l=r,p=o[0],f=o[1],g=o[2],16,e),e.point(c,h)}function m(){d.point=y,e.lineEnd()}function x(){v(),d.point=E,d.lineEnd=b}function E(t,e){_(r=t,e),i=c,o=h,s=p,a=f,u=g,d.point=_}function b(){n(c,h,l,p,f,g,i,o,r,s,a,u,16,e),d.lineEnd=m,m()}return d}}(t,e):function(t){return Hd({point:function(e,n){e=t(e,n),this.stream.point(e[0],e[1])}})}(t)}var Qd=Hd({point:function(t,e){this.stream.point(t*Jg,e*Jg)}});function $d(t){return function(t){var e,n,r,i,o,s,a,u,l,c,h=150,p=480,f=250,g=0,d=0,y=0,v=0,_=0,m=null,x=Xd,E=null,b=Fd,w=.5,I=Kd(C,w);function N(t){return[(t=o(t[0]*Jg,t[1]*Jg))[0]*h+n,r-t[1]*h]}function S(t){return(t=o.invert((t[0]-n)/h,(r-t[1])/h))&&[t[0]*Wg,t[1]*Wg]}function C(t,i){return[(t=e(t,i))[0]*h+n,r-t[1]*h]}function P(){o=vd(i=function(t,e,n){return(t%=Hg)?e||n?vd(xd(t),Ed(e,n)):xd(t):e||n?Ed(e,n):_d}(y,v,_),e);var t=e(g,d);return n=p-t[0]*h,r=f+t[1]*h,M()}function M(){return l=c=null,N}return N.stream=function(t){return l&&c===t?l:l=Qd(x(i,I(b(c=t))))},N.clipAngle=function(t){return arguments.length?(x=+t?Yd(m=t*Jg,6*Jg):(m=null,Xd),M()):m*Wg},N.clipExtent=function(t){return arguments.length?(b=null==t?(E=s=a=u=null,Fd):Ad(E=+t[0][0],s=+t[0][1],a=+t[1][0],u=+t[1][1]),M()):null==E?null:[[E,s],[a,u]]},N.scale=function(t){return arguments.length?(h=+t,P()):h},N.translate=function(t){return arguments.length?(p=+t[0],f=+t[1],P()):[p,f]},N.center=function(t){return arguments.length?(g=t[0]%360*Jg,d=t[1]%360*Jg,P()):[g*Wg,d*Wg]},N.rotate=function(t){return arguments.length?(y=t[0]%360*Jg,v=t[1]%360*Jg,_=t.length>2?t[2]%360*Jg:0,P()):[y*Wg,v*Wg,_*Wg]},N.precision=function(t){return arguments.length?(I=Kd(C,w=t*t),M()):ed(w)},N.fitExtent=function(t,e){return Jd(N,t,e)},N.fitSize=function(t,e){return function(t,e,n){return Jd(t,[[0,0],e],n)}(N,t,e)},function(){return e=t.apply(this,arguments),N.invert=e.invert&&S,P()}}((function(){return t}))()}var ty=function(t){return function(e,n){var r=$g(e),i=$g(n),o=t(r*i);return[o*i*td(e),o*td(n)]}}((function(t){return(t=nd(t))&&t/td(t)}));function ey(){return $d(ty).scale(79.4188).clipAngle(179.999)}function ny(t,n,r,i){var s=t.properties||{},a="Feature"===t.type?t.geometry:t;if("GeometryCollection"===a.type){var u=[];return q(t,(function(t){var e=ny(t,n,r,i);e&&u.push(e)})),f(u)}var l=function(t){var n=xn(t).geometry.coordinates,r=[-n[0],-n[1]];return ey().rotate(r).scale(e)}(a),c={type:a.type,coordinates:iy(a.coordinates,l)},h=(new Ih).read(c),p=m(x(n,r),"meters"),g=_f.bufferOp(h,p,i);if(!ry((g=(new Nh).write(g)).coordinates))return o({type:g.type,coordinates:oy(g.coordinates,l)},s)}function ry(t){return Array.isArray(t[0])?ry(t[0]):isNaN(t[0])}function iy(t,e){return"object"!=typeof t[0]?e(t):t.map((function(t){return iy(t,e)}))}function oy(t,e){return"object"!=typeof t[0]?e.invert(t):t.map((function(t){return oy(t,e)}))}function sy(t,e,n){void 0===n&&(n={});var r=rt(t),i=rt(e),o=$u.intersection(r.coordinates,i.coordinates);return 0===o.length?null:1===o.length?l(o[0],n.properties):y(o,n.properties)}function ay(t,e,n){void 0===n&&(n={});var r=JSON.stringify(n.properties||{}),i=t[0],o=t[1],s=t[2],a=t[3],u=(o+a)/2,l=(i+s)/2,c=2*e/me([i,u],[s,u],n)*(s-i),h=2*e/me([l,o],[l,a],n)*(a-o),p=c/2,g=2*p,d=Math.sqrt(3)/2*h,y=s-i,v=a-o,_=3/4*g,m=d,x=(y-g)/(g-p/2),E=Math.floor(x),b=(E*_-p/2-y)/2-p/2+_/2,w=Math.floor((v-d)/d),I=(v-w*d)/2,N=w*d-v>d/2;N&&(I-=d/4);for(var S=[],C=[],P=0;P<6;P++){var M=2*Math.PI/6*P;S.push(Math.cos(M)),C.push(Math.sin(M))}for(var L=[],O=0;O<=E;O++)for(var R=0;R<=w;R++){var T=O%2==1;if((0!==R||!T)&&(0!==R||!N)){var A=O*_+i-b,D=R*m+o+I;if(T&&(D-=d/2),!0===n.triangles)ly([A,D],c/2,h/2,JSON.parse(r),S,C).forEach((function(t){n.mask?sy(n.mask,t)&&L.push(t):L.push(t)}));else{var F=uy([A,D],c/2,h/2,JSON.parse(r),S,C);n.mask?sy(n.mask,F)&&L.push(F):L.push(F)}}}return f(L)}function uy(t,e,n,r,i,o){for(var s=[],a=0;a<6;a++){var u=t[0]+e*i[a],c=t[1]+n*o[a];s.push([u,c])}return s.push(s[0].slice()),l([s],r)}function ly(t,e,n,r,i,o){for(var s=[],a=0;a<6;a++){var u=[];u.push(t),u.push([t[0]+e*i[a],t[1]+n*o[a]]),u.push([t[0]+e*i[(a+1)%6],t[1]+n*o[(a+1)%6]]),u.push(t),s.push(l([u],r))}return s}function cy(t){return y(t)}function hy(t){return l(t&&t.geometry.coordinates||[[[180,90],[-180,90],[-180,-90],[180,-90],[180,90]]])}function py(t,e,n){return void 0===n&&(n={}),function(t,e,n,r){void 0===r&&(r={});for(var i=[],o=t[0],s=t[1],a=t[2],u=t[3],c=e/me([o,s],[a,s],r)*(a-o),h=n/me([o,s],[o,u],r)*(u-s),p=a-o,g=u-s,d=Math.floor(p/c),y=Math.floor(g/h),v=(g-y*h)/2,_=o+(p-d*c)/2,m=0;m<d;m++){for(var x=s+v,E=0;E<y;E++){var b=l([[[_,x],[_,x+h],[_+c,x+h],[_+c,x],[_,x]]],r.properties);r.mask?Ps(r.mask,b)&&i.push(b):i.push(b),x+=h}_+=c}return f(i)}(t,e,e,n)}function fy(t,e,n){void 0===n&&(n={});for(var r=[],i=e/me([t[0],t[1]],[t[2],t[1]],n)*(t[2]-t[0]),o=e/me([t[0],t[1]],[t[0],t[3]],n)*(t[3]-t[1]),s=0,a=t[0];a<=t[2];){for(var u=0,c=t[1];c<=t[3];){var h=null,p=null;s%2==0&&u%2==0?(h=l([[[a,c],[a,c+o],[a+i,c],[a,c]]],n.properties),p=l([[[a,c+o],[a+i,c+o],[a+i,c],[a,c+o]]],n.properties)):s%2==0&&u%2==1?(h=l([[[a,c],[a+i,c+o],[a+i,c],[a,c]]],n.properties),p=l([[[a,c],[a,c+o],[a+i,c+o],[a,c]]],n.properties)):u%2==0&&s%2==1?(h=l([[[a,c],[a,c+o],[a+i,c+o],[a,c]]],n.properties),p=l([[[a,c],[a+i,c+o],[a+i,c],[a,c]]],n.properties)):u%2==1&&s%2==1&&(h=l([[[a,c],[a,c+o],[a+i,c],[a,c]]],n.properties),p=l([[[a,c+o],[a+i,c+o],[a+i,c],[a,c+o]]],n.properties)),n.mask?(sy(n.mask,h)&&r.push(h),sy(n.mask,p)&&r.push(p)):(r.push(h),r.push(p)),c+=o,u++}s++,a+=i}return f(r)}ty.invert=function(t){return function(e,n){var r=ed(e*e+n*n),i=t(r),o=td(i),s=$g(i);return[Qg(e*o,r*s),rd(r&&n*o/r)]}}((function(t){return t})),t.along=function(t,e,n){void 0===n&&(n={});for(var r=rt(t).coordinates,i=0,o=0;o<r.length&&!(e>=i&&o===r.length-1);o++){if(i>=e){var s=e-i;if(s){var u=mn(r[o],r[o-1])-180;return vn(r[o],s,u,n)}return a(r[o])}i+=me(r[o],r[o+1],n)}return a(r[r.length-1])},t.angle=function(t,e,n,r){if(void 0===r&&(r={}),!P(r))throw new Error("options is invalid");if(!t)throw new Error("startPoint is required");if(!e)throw new Error("midPoint is required");if(!n)throw new Error("endPoint is required");var i=t,o=e,s=n,a=b(!0!==r.mercator?mn(i,o):Bi(i,o)),u=b(!0!==r.mercator?mn(s,o):Bi(s,o)),l=Math.abs(a-u);return!0===r.explementary?360-l:l},t.applyFilter=uu,t.area=jr,t.areaFactors=i,t.bbox=Z,t.bboxClip=function(t,e){var n=rt(t),r=n.type,i="Feature"===t.type?t.properties:{},o=n.coordinates;switch(r){case"LineString":case"MultiLineString":var s=[];return"LineString"===r&&(o=[o]),o.forEach((function(t){!function(t,e,n){var r,i,o,s,a,u=t.length,l=Ri(t[0],e),c=[];for(n||(n=[]),r=1;r<u;r++){for(s=t[r-1],i=o=Ri(a=t[r],e);;){if(!(l|i)){c.push(s),i!==o?(c.push(a),r<u-1&&(n.push(c),c=[])):r===u-1&&c.push(a);break}if(l&i)break;l?l=Ri(s=Oi(s,a,l,e),e):i=Ri(a=Oi(s,a,i,e),e)}l=o}c.length&&n.push(c)}(t,e,s)})),1===s.length?h(s[0],i):g(s,i);case"Polygon":return l(Ti(o,e),i);case"MultiPolygon":return y(o.map((function(t){return Ti(t,e)})),i);default:throw new Error("geometry "+r+" not supported")}},t.bboxPolygon=gn,t.bearing=mn,t.bearingToAngle=b,t.bearingToAzimuth=b,t.bezier=fn,t.bezierSpline=fn,t.booleanClockwise=Yi,t.booleanContains=function(t,e){var n=rt(t),r=rt(e),i=n.type,o=r.type,s=n.coordinates,a=r.coordinates;switch(i){case"Point":switch(o){case"Point":return vs(s,a);default:throw new Error("feature2 "+o+" geometry not supported")}case"MultiPoint":switch(o){case"Point":return function(t,e){var n,r=!1;for(n=0;n<t.coordinates.length;n++)if(vs(t.coordinates[n],e.coordinates)){r=!0;break}return r}(n,r);case"MultiPoint":return function(t,e){for(var n=0,r=e.coordinates;n<r.length;n++){for(var i=r[n],o=!1,s=0,a=t.coordinates;s<a.length;s++){if(vs(i,a[s])){o=!0;break}}if(!o)return!1}return!0}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"LineString":switch(o){case"Point":return Wr(r,n,{ignoreEndVertices:!0});case"LineString":return function(t,e){for(var n=!1,r=0,i=e.coordinates;r<i.length;r++){var o=i[r];if(Wr({type:"Point",coordinates:o},t,{ignoreEndVertices:!0})&&(n=!0),!Wr({type:"Point",coordinates:o},t,{ignoreEndVertices:!1}))return!1}return n}(n,r);case"MultiPoint":return function(t,e){for(var n=!1,r=0,i=e.coordinates;r<i.length;r++){var o=i[r];if(Wr(o,t,{ignoreEndVertices:!0})&&(n=!0),!Wr(o,t))return!1}if(n)return!0;return!1}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"Polygon":switch(o){case"Point":return ye(r,n,{ignoreBoundary:!0});case"LineString":return function(t,e){var n=!1,r=0,i=Z(t),o=Z(e);if(!ys(i,o))return!1;for(;r<e.coordinates.length-1;r++){if(ye({type:"Point",coordinates:_s(e.coordinates[r],e.coordinates[r+1])},t,{ignoreBoundary:!0})){n=!0;break}}return n}(n,r);case"Polygon":return function(t,e){if("Feature"===t.type&&null===t.geometry)return!1;if("Feature"===e.type&&null===e.geometry)return!1;var n=Z(t),r=Z(e);if(!ys(n,r))return!1;for(var i=rt(e).coordinates,o=0,s=i;o<s.length;o++)for(var a=0,u=s[o];a<u.length;a++){if(!ye(u[a],t))return!1}return!0}(n,r);case"MultiPoint":return function(t,e){for(var n=0,r=e.coordinates;n<r.length;n++){if(!ye(r[n],t,{ignoreBoundary:!0}))return!1}return!0}(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}default:throw new Error("feature1 "+i+" geometry not supported")}},t.booleanCrosses=function(t,e){var n=rt(t),r=rt(e),i=n.type,o=r.type;switch(i){case"MultiPoint":switch(o){case"LineString":return ms(n,r);case"Polygon":return Es(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"LineString":switch(o){case"MultiPoint":return ms(r,n);case"LineString":return function(t,e){if(Or(t,e).features.length>0)for(var n=0;n<t.coordinates.length-1;n++)for(var r=0;r<e.coordinates.length-1;r++){var i=!0;if(0!==r&&r!==e.coordinates.length-2||(i=!1),bs(t.coordinates[n],t.coordinates[n+1],e.coordinates[r],i))return!0}return!1}(n,r);case"Polygon":return xs(n,r);default:throw new Error("feature2 "+o+" geometry not supported")}case"Polygon":switch(o){case"MultiPoint":return Es(r,n);case"LineString":return xs(r,n);default:throw new Error("feature2 "+o+" geometry not supported")}default:throw new Error("feature1 "+i+" geometry not supported")}},t.booleanDisjoint=ps,t.booleanEqual=function(t,e){return rt(t).type===rt(e).type&&new Cs({precision:6}).compare(tn(t),tn(e))},t.booleanIntersects=Ps,t.booleanOverlap=function(t,e){var n=rt(t),r=rt(e),i=n.type,o=r.type;if("MultiPoint"===i&&"MultiPoint"!==o||("LineString"===i||"MultiLineString"===i)&&"LineString"!==o&&"MultiLineString"!==o||("Polygon"===i||"MultiPolygon"===i)&&"Polygon"!==o&&"MultiPolygon"!==o)throw new Error("features must be of the same type");if("Point"===i)throw new Error("Point geometry not supported");if(new Cs({precision:6}).compare(t,e))return!1;var s=0;switch(i){case"MultiPoint":for(var a=0;a<n.coordinates.length;a++)for(var u=0;u<r.coordinates.length;u++){var l=n.coordinates[a],c=r.coordinates[u];if(l[0]===c[0]&&l[1]===c[1])return!0}return!1;case"LineString":case"MultiLineString":U(t,(function(t){U(e,(function(e){ki(t,e).features.length&&s++}))}));break;case"Polygon":case"MultiPolygon":U(t,(function(t){U(e,(function(e){Or(t,e).features.length&&s++}))}))}return s>0},t.booleanParallel=function(t,e){if(!t)throw new Error("line1 is required");if(!e)throw new Error("line2 is required");if("LineString"!==Us(t,"line1"))throw new Error("line1 must be a LineString");if("LineString"!==Us(e,"line2"))throw new Error("line2 must be a LineString");for(var n=Zn(tn(t)).features,r=Zn(tn(e)).features,i=0;i<n.length;i++){var o=n[i].geometry.coordinates;if(!r[i])break;if(!js(o,r[i].geometry.coordinates))return!1}return!0},t.booleanPointInPolygon=ye,t.booleanPointOnLine=Wr,t.booleanWithin=Zr,t.buffer=function(t,e,n){var r=(n=n||{}).units||"kilometers",i=n.steps||8;if(!t)throw new Error("geojson is required");if("object"!=typeof n)throw new Error("options must be an object");if("number"!=typeof i)throw new Error("steps must be an number");if(void 0===e)throw new Error("radius is required");if(i<=0)throw new Error("steps must be greater than 0");var o=[];switch(t.type){case"GeometryCollection":return q(t,(function(t){var n=ny(t,e,r,i);n&&o.push(n)})),f(o);case"FeatureCollection":return F(t,(function(t){var n=ny(t,e,r,i);n&&F(n,(function(t){t&&o.push(t)}))})),f(o)}return ny(t,e,r,i)},t.center=xn,t.centerMean=Fa,t.centerMedian=function(t,e){if(void 0===e&&(e={}),!P(e=e||{}))throw new Error("options is invalid");var n=e.counter||10;if(!C(n))throw new Error("counter must be a number");var r=e.weight,i=Fa(t,{weight:e.weight}),o=f([]);F(t,(function(t){var e;o.features.push(En(t,{properties:{weight:null===(e=t.properties)||void 0===e?void 0:e[r]}}))}));var s={tolerance:e.tolerance,medianCandidates:[]};return ka(i.geometry.coordinates,[0,0],o,s,n)},t.centerOfMass=function t(e,n){switch(void 0===n&&(n={}),it(e)){case"Point":return a(K(e),n.properties);case"Polygon":var r=[];R(e,(function(t){r.push(t)}));var i,o,s,u,l,c,h,p,f=En(e,{properties:n.properties}),g=f.geometry.coordinates,d=0,y=0,v=0,_=r.map((function(t){return[t[0]-g[0],t[1]-g[1]]}));for(i=0;i<r.length-1;i++)u=(o=_[i])[0],c=o[1],l=(s=_[i+1])[0],v+=p=u*(h=s[1])-l*c,d+=(u+l)*p,y+=(c+h)*p;if(0===v)return f;var m=1/(6*(.5*v));return a([g[0]+m*d,g[1]+m*y],n.properties);default:var x=de(e);return x?t(x,{properties:n.properties}):En(e,{properties:n.properties})}},t.centroid=En,t.circle=_n,t.cleanCoords=tn,t.clone=Ie,t.clusterEach=ou,t.clusterReduce=su,t.clusters=hu,t.clustersDbscan=function(t,e,n){void 0===n&&(n={}),!0!==n.mutate&&(t=Ie(t)),n.minPoints=n.minPoints||3;var r=new Ts.DBSCAN,i=r.run(G(t),N(e,n.units),n.minPoints,me),o=-1;return i.forEach((function(e){o++,e.forEach((function(e){var n=t.features[e];n.properties||(n.properties={}),n.properties.cluster=o,n.properties.dbscan="core"}))})),r.noise.forEach((function(e){var n=t.features[e];n.properties||(n.properties={}),n.properties.cluster?n.properties.dbscan="edge":n.properties.dbscan="noise"})),t},t.clustersKmeans=function(t,e){void 0===e&&(e={});var n=t.features.length;e.numberOfClusters=e.numberOfClusters||Math.round(Math.sqrt(n/2)),e.numberOfClusters>n&&(e.numberOfClusters=n),!0!==e.mutate&&(t=Ie(t));var r=G(t),i=r.slice(0,e.numberOfClusters),o=zs(r,e.numberOfClusters,i),s={};return o.centroids.forEach((function(t,e){s[e]=t})),F(t,(function(t,e){var n=o.idxs[e];t.properties.cluster=n,t.properties.centroid=s[n]})),t},t.collect=function(t,e,n,r){var i=Nt(6),o=e.features.map((function(t){var e;return{minX:t.geometry.coordinates[0],minY:t.geometry.coordinates[1],maxX:t.geometry.coordinates[0],maxY:t.geometry.coordinates[1],property:null===(e=t.properties)||void 0===e?void 0:e[n]}}));return i.load(o),t.features.forEach((function(t){t.properties||(t.properties={});var e=Z(t),n=i.search({minX:e[0],minY:e[1],maxX:e[2],maxY:e[3]}),o=[];n.forEach((function(e){ye([e.minX,e.minY],t)&&o.push(e.property)})),t.properties[r]=o})),t},t.collectionOf=nt,t.combine=function(t){var e={MultiPoint:{coordinates:[],properties:[]},MultiLineString:{coordinates:[],properties:[]},MultiPolygon:{coordinates:[],properties:[]}};return F(t,(function(t){var n,r,i,o;switch(null===(o=t.geometry)||void 0===o?void 0:o.type){case"Point":e.MultiPoint.coordinates.push(t.geometry.coordinates),e.MultiPoint.properties.push(t.properties);break;case"MultiPoint":(n=e.MultiPoint.coordinates).push.apply(n,t.geometry.coordinates),e.MultiPoint.properties.push(t.properties);break;case"LineString":e.MultiLineString.coordinates.push(t.geometry.coordinates),e.MultiLineString.properties.push(t.properties);break;case"MultiLineString":(r=e.MultiLineString.coordinates).push.apply(r,t.geometry.coordinates),e.MultiLineString.properties.push(t.properties);break;case"Polygon":e.MultiPolygon.coordinates.push(t.geometry.coordinates),e.MultiPolygon.properties.push(t.properties);break;case"MultiPolygon":(i=e.MultiPolygon.coordinates).push.apply(i,t.geometry.coordinates),e.MultiPolygon.properties.push(t.properties)}})),f(Object.keys(e).filter((function(t){return e[t].coordinates.length})).sort().map((function(t){return o({type:t,coordinates:e[t].coordinates},{collectedProperties:e[t].properties})})))},t.concave=function(t,e){void 0===e&&(e={});var n=e.maxEdge||1/0,r=xe(function(t){var e=[],n={};return F(t,(function(t){if(t.geometry){var r=t.geometry.coordinates.join("-");Object.prototype.hasOwnProperty.call(n,r)||(e.push(t),n[r]=!0)}})),f(e)}(t));if(r.features=r.features.filter((function(t){var r=t.geometry.coordinates[0][0],i=t.geometry.coordinates[0][1],o=t.geometry.coordinates[0][2],s=me(r,i,e),a=me(i,o,e),u=me(r,o,e);return s<=n&&a<=n&&u<=n})),r.features.length<1)return null;var i=$e(r);return 1===i.coordinates.length&&(i.coordinates=i.coordinates[0],i.type="Polygon"),o(i)},t.containsNumber=$,t.convertArea=S,t.convertDistance=N,t.convertLength=N,t.convex=de,t.coordAll=G,t.coordEach=R,t.coordReduce=T,t.createBins=au,t.degrees2radians=I,t.degreesToRadians=I,t.destination=vn,t.difference=function(t,e){var n=rt(t),r=rt(e),i=t.properties||{},o=$u.difference(n.coordinates,r.coordinates);return 0===o.length?null:1===o.length?l(o[0],i):y(o,i)},t.dissolve=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.propertyName;nt(t,"Polygon","dissolve");var r=[];if(!e.propertyName)return ni(y($u.union.apply(null,t.features.map((function(t){return t.geometry.coordinates})))));var i={};F(t,(function(t){Object.prototype.hasOwnProperty.call(i,t.properties[n])||(i[t.properties[n]]=[]),i[t.properties[n]].push(t)}));for(var o=Object.keys(i),s=0;s<o.length;s++){var a=y($u.union.apply(null,i[o[s]].map((function(t){return t.geometry.coordinates}))));a.properties[n]=o[s],r.push(a)}return ni(f(r))},t.distance=me,t.distanceToDegrees=E,t.distanceToRadians=x,t.distanceWeight=ja,t.earthRadius=e,t.ellipse=Aa,t.envelope=dn,t.explode=bn,t.factors=n,t.feature=o,t.featureCollection=f,t.featureEach=F,t.featureOf=et,t.featureReduce=k,t.filterProperties=cu,t.findPoint=W,t.findSegment=H,t.flatten=ni,t.flattenEach=z,t.flattenReduce=j,t.flip=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.mutate;if(!t)throw new Error("geojson is required");return!1!==n&&void 0!==n||(t=Ie(t)),R(t,(function(t){var e=t[0],n=t[1];t[0]=n,t[1]=e})),t},t.geojsonType=tt,t.geomEach=q,t.geomReduce=B,t.geometry=s,t.geometryCollection=v,t.getCluster=iu,t.getCoord=K,t.getCoords=Q,t.getGeom=rt,t.getType=it,t.greatCircle=function(t,e,n){if("object"!=typeof(n=n||{}))throw new Error("options is invalid");var r=n.properties,i=n.npoints,o=n.offset;return t=K(t),e=K(e),r=r||{},i=i||100,o=o||10,new vi({x:t[0],y:t[1]},{x:e[0],y:e[1]},r).Arc(i,{offset:o}).json()},t.helpers=O,t.hexGrid=ay,t.inside=ye,t.interpolate=function(t,e,n){if("object"!=typeof(n=n||{}))throw new Error("options is invalid");var r=n.gridType,i=n.property,o=n.weight;if(!t)throw new Error("points is required");if(nt(t,"Point","input must contain Points"),!e)throw new Error("cellSize is required");if(void 0!==o&&"number"!=typeof o)throw new Error("weight must be a number");i=i||"elevation",r=r||"square",o=o||1;var s,a=Z(t);switch(r){case"point":case"points":s=ti(a,e,n);break;case"square":case"squares":s=py(a,e,n);break;case"hex":case"hexes":s=ay(a,e,n);break;case"triangle":case"triangles":s=fy(a,e,n);break;default:throw new Error("invalid gridType")}var u=[];return F(s,(function(e){var s=0,a=0;F(t,(function(t){var u,l=me("point"===r?e:En(e),t,n);if(void 0!==i&&(u=t.properties[i]),void 0===u&&(u=t.geometry.coordinates[2]),void 0===u)throw new Error("zValue is missing");0===l&&(s=u);var c=1/Math.pow(l,o);a+=c,s+=c*u}));var l=Ie(e);l.properties[i]=s/a,u.push(l)})),f(u)},t.intersect=sy,t.invariant=ot,t.isNumber=C,t.isObject=P,t.isobands=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.zProperty||"elevation",i=n.commonProperties||{},o=n.breaksProperties||[];if(nt(t,"Point","Input must contain Points"),!e)throw new Error("breaks is required");if(!Array.isArray(e))throw new Error("breaks is not an Array");if(!P(i))throw new Error("commonProperties is not an Object");if(!Array.isArray(o))throw new Error("breaksProperties is not an Array");var s=Zi(t,{zProperty:r,flip:!0}),a=function(t,e,n){for(var r=[],i=1;i<e.length;i++){var o=+e[i-1],s=+e[i],a=Zo(Jo($i(t,o,s-o))),u={};u.groupedRings=a,u[n]=o+"-"+s,r.push(u)}return r}(s,e,r);return f((a=function(t,e,n){var r=Z(n),i=r[2]-r[0],o=r[3]-r[1],s=r[0],a=r[1],u=e[0].length-1,l=e.length-1,c=i/u,h=o/l,p=function(t){t[0]=t[0]*c+s,t[1]=t[1]*h+a};return t.forEach((function(t){t.groupedRings.forEach((function(t){t.forEach((function(t){t.forEach(p)}))}))})),t}(a,s,t)).map((function(t,e){if(o[e]&&!P(o[e]))throw new Error("Each mappedProperty is required to be an Object");var n=ct({},i,o[e]);return n[r]=t[r],y(t.groupedRings,n)})))},t.isolines=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.zProperty||"elevation",i=n.commonProperties||{},o=n.breaksProperties||[];if(nt(t,"Point","Input must contain Points"),!e)throw new Error("breaks is required");if(!Array.isArray(e))throw new Error("breaks must be an Array");if(!P(i))throw new Error("commonProperties must be an Object");if(!Array.isArray(o))throw new Error("breaksProperties must be an Array");var s=_t(t,{zProperty:r,flip:!0});return f(function(t,e,n){var r=Z(n),i=r[2]-r[0],o=r[3]-r[1],s=r[0],a=r[1],u=e[0].length-1,l=e.length-1,c=i/u,h=o/l,p=function(t){t[0]=t[0]*c+s,t[1]=t[1]*h+a};return t.forEach((function(t){R(t,p)})),t}(function(t,e,n,r,i){for(var o=[],s=1;s<e.length;s++){var a=+e[s],u=ct({},r,i[s]);u[n]=a;var l=g(ft(t,a),u);o.push(l)}return o}(s,e,r,i,o),s,t))},t.kinks=function(t){var e,n,r={type:"FeatureCollection",features:[]};if("LineString"===(n="Feature"===t.type?t.geometry:t).type)e=[n.coordinates];else if("MultiLineString"===n.type)e=n.coordinates;else if("MultiPolygon"===n.type)e=[].concat.apply([],n.coordinates);else{if("Polygon"!==n.type)throw new Error("Input must be a LineString, MultiLineString, Polygon, or MultiPolygon Feature or Geometry");e=n.coordinates}return e.forEach((function(t){e.forEach((function(e){for(var n=0;n<t.length-1;n++)for(var i=n;i<e.length-1;i++){if(t===e){if(1===Math.abs(n-i))continue;if(0===n&&i===t.length-2&&t[n][0]===t[t.length-1][0]&&t[n][1]===t[t.length-1][1])continue}var o=Gr(t[n][0],t[n][1],t[n+1][0],t[n+1][1],e[i][0],e[i][1],e[i+1][0],e[i+1][1]);o&&r.features.push(a([o[0],o[1]]))}}))})),r},t.length=Yr,t.lengthToDegrees=E,t.lengthToRadians=x,t.lineArc=bi,t.lineChunk=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.units,i=n.reverse;if(!t)throw new Error("geojson is required");if(e<=0)throw new Error("segmentLength must be greater than 0");var o=[];return z(t,(function(t){i&&(t.geometry.coordinates=t.geometry.coordinates.reverse()),function(t,e,n,r){var i=Yr(t,{units:n});if(i<=e)return r(t);var o=i/e;Number.isInteger(o)||(o=Math.floor(o)+1);for(var s=0;s<o;s++){r(Hr(t,e*s,e*(s+1),{units:n}),s)}}(t,e,r,(function(t){o.push(t)}))})),f(o)},t.lineDistance=Yr,t.lineEach=X,t.lineIntersect=Or,t.lineOffset=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.units;if(!t)throw new Error("geojson is required");if(null==e||isNaN(e))throw new Error("distance is required");var i=it(t),o=t.properties;switch(i){case"LineString":return os(t,e,r);case"MultiLineString":var s=[];return z(t,(function(t){s.push(os(t,e,r).geometry.coordinates)})),g(s,o);default:throw new Error("geometry "+i+" is not supported")}},t.lineOverlap=ki,t.lineReduce=Y,t.lineSegment=Zn,t.lineSlice=function(t,e,n){var r=Q(n);if("LineString"!==it(n))throw new Error("line must be a LineString");for(var i,o=Tr(n,t),s=Tr(n,e),a=[(i=o.properties.index<=s.properties.index?[o,s]:[s,o])[0].geometry.coordinates],u=i[0].properties.index+1;u<i[1].properties.index+1;u++)a.push(r[u]);return a.push(i[1].geometry.coordinates),h(a,n.properties)},t.lineSliceAlong=Hr,t.lineSplit=function(t,e){if(!t)throw new Error("line is required");if(!e)throw new Error("splitter is required");var n=it(t),r=it(e);if("LineString"!==n)throw new Error("line must be LineString");if("FeatureCollection"===r)throw new Error("splitter cannot be a FeatureCollection");if("GeometryCollection"===r)throw new Error("splitter cannot be a GeometryCollection");var i=ei(e,{precision:7});switch(r){case"Point":return mi(t,i);case"MultiPoint":return _i(t,i);case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":return _i(t,Or(t,i))}},t.lineString=h,t.lineStringToPolygon=Ci,t.lineStrings=p,t.lineToPolygon=Ci,t.mask=function(t,e){var n,r=hy(e),i=null;return"FeatureCollection"===t.type?i=cy(2===(n=t).features.length?$u.union(n.features[0].geometry.coordinates,n.features[1].geometry.coordinates):$u.union.apply($u,n.features.map((function(t){return t.geometry.coordinates})))):i=cy($u.union(t.geometry.coordinates)),i.geometry.coordinates.forEach((function(t){r.geometry.coordinates.push(t[0])})),r},t.meta=J,t.midpoint=function(t,e){return vn(t,me(t,e)/2,mn(t,e))},t.moranIndex=function(t,e){var n=e.inputField,r=e.threshold||1e5,i=e.p||2,o=e.binary||!1,s=ja(t,{alpha:e.alpha||-1,binary:o,p:i,standardization:e.standardization||!0,threshold:r}),a=[];F(t,(function(t){var e=t.properties||{};a.push(e[n])}));for(var u=Ua(a),l=function(t){for(var e=Ua(t),n=0,r=0,i=t;r<i.length;r++){var o=i[r];n+=Math.pow(o-e,2)}return n/t.length}(a),c=0,h=0,p=0,f=0,g=s.length,d=0;d<g;d++){for(var y=0,v=0;v<g;v++)c+=s[d][v]*(a[d]-u)*(a[v]-u),h+=s[d][v],p+=Math.pow(s[d][v]+s[v][d],2),y+=s[d][v]+s[v][d];f+=Math.pow(y,2)}var _=c/h/l,m=-1/(g-1),x=(g*g*(p*=.5)-g*f+h*h*3)/((g-1)*(g+1)*(h*h))-m*m,E=Math.sqrt(x);return{expectedMoranIndex:m,moranIndex:_,stdNorm:E,zNorm:(_-m)/E}},t.multiLineString=g,t.multiPoint=d,t.multiPolygon=y,t.nearest=Jn,t.nearestPoint=Jn,t.nearestPointOnLine=Tr,t.nearestPointToLine=function(t,e,n){void 0===n&&(n={});var r=n.units,i=n.properties||{},o=function(t){var e=[];switch(t.geometry?t.geometry.type:t.type){case"GeometryCollection":return q(t,(function(t){"Point"===t.type&&e.push({type:"Feature",properties:{},geometry:t})})),{type:"FeatureCollection",features:e};case"FeatureCollection":return t.features=t.features.filter((function(t){return"Point"===t.geometry.type})),t;default:throw new Error("points must be a Point Collection")}}(t);if(!o.features.length)throw new Error("points must contain features");if(!e)throw new Error("line is required");if("LineString"!==it(e))throw new Error("line must be a LineString");var s=1/0,a=null;return F(o,(function(t){var n=Dr(t,e,{units:r});n<s&&(s=n,a=t)})),a&&(a.properties=ct({dist:s},a.properties,i)),a},t.planepoint=function(t,e){var n=K(t),r=rt(e).coordinates[0];if(r.length<4)throw new Error("OuterRing of a Polygon must have 4 or more Positions.");var i=e.properties||{},o=i.a,s=i.b,a=i.c,u=n[0],l=n[1],c=r[0][0],h=r[0][1],p=void 0!==o?o:r[0][2],f=r[1][0],g=r[1][1],d=void 0!==s?s:r[1][2],y=r[2][0],v=r[2][1],_=void 0!==a?a:r[2][2];return(_*(u-c)*(l-g)+p*(u-f)*(l-v)+d*(u-y)*(l-h)-d*(u-c)*(l-v)-_*(u-f)*(l-h)-p*(u-y)*(l-g))/((u-c)*(l-g)+(u-f)*(l-v)+(u-y)*(l-h)-(u-c)*(l-v)-(u-f)*(l-h)-(u-y)*(l-g))},t.point=a,t.pointGrid=ti,t.pointOnFeature=qr,t.pointOnLine=Tr,t.pointOnSurface=qr,t.pointToLineDistance=Dr,t.points=u,t.pointsWithinPolygon=_e,t.polygon=l,t.polygonSmooth=function(t,e){var n=[],r=e.iterations||1;if(!t)throw new Error("inputPolys is required");return q(t,(function(t,e,i){var o,s,a;switch(t.type){case"Polygon":o=[[]];for(var u=0;u<r;u++)a=[[]],s=t,u>0&&(s=l(o).geometry),qa(s,a),o=a.slice(0);n.push(l(o,i));break;case"MultiPolygon":o=[[[]]];for(var c=0;c<r;c++)a=[[[]]],s=t,c>0&&(s=y(o).geometry),Ba(s,a),o=a.slice(0);n.push(y(o,i));break;default:throw new Error("geometry is invalid, must be Polygon or MultiPolygon")}})),f(n)},t.polygonTangents=function(t,e){var n,r,i,o,s=Q(t),u=Q(e),l=Z(e),c=0,h=null;switch(s[0]>l[0]&&s[0]<l[2]&&s[1]>l[1]&&s[1]<l[3]&&(c=(h=Jn(t,bn(e))).properties.featureIndex),it(e)){case"Polygon":n=u[0][c],r=u[0][0],null!==h&&h.geometry.coordinates[1]<s[1]&&(r=u[0][c]),o=Xi(u[0][0],u[0][u[0].length-1],s);var p=Ui(u[0],s,o,i,n,r);n=p[0],r=p[1];break;case"MultiPolygon":for(var g=0,d=0,y=0,v=0;v<u[0].length;v++){g=v;for(var _=!1,m=0;m<u[0][v].length;m++){if(d=m,y===c){_=!0;break}y++}if(_)break}n=u[0][g][d],r=u[0][g][d],o=Xi(u[0][0][0],u[0][0][u[0][0].length-1],s),u.forEach((function(t){var e=Ui(t[0],s,o,i,n,r);n=e[0],r=e[1]}))}return f([a(n),a(r)])},t.polygonToLine=Ii,t.polygonToLineString=Ii,t.polygonize=function(t){var e=hs.fromGeoJson(t);e.deleteDangles(),e.deleteCutEdges();var n=[],r=[];return e.getEdgeRings().filter((function(t){return t.isValid()})).forEach((function(t){t.isHole()?n.push(t):r.push(t)})),n.forEach((function(t){cs.findEdgeRingContaining(t,r)&&r.push(t)})),f(r.map((function(t){return t.toPolygon()})))},t.polygons=c,t.projection=Ja,t.propEach=A,t.propReduce=D,t.propertiesContainsFilter=lu,t.radians2degrees=w,t.radiansToDegrees=w,t.radiansToDistance=m,t.radiansToLength=m,t.random=ru,t.randomLineString=tu,t.randomPoint=Qa,t.randomPolygon=$a,t.randomPosition=Ka,t.rewind=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.reverse||!1,r=e.mutate||!1;if(!t)throw new Error("<geojson> is required");if("boolean"!=typeof n)throw new Error("<reverse> must be a boolean");if("boolean"!=typeof r)throw new Error("<mutate> must be a boolean");!1===r&&(t=Ie(t));var i=[];switch(t.type){case"GeometryCollection":return q(t,(function(t){Hi(t,n)})),t;case"FeatureCollection":return F(t,(function(t){F(Hi(t,n),(function(t){i.push(t)}))})),f(i)}return Hi(t,n)},t.rhumbBearing=Bi,t.rhumbDestination=ji,t.rhumbDistance=Ar,t.round=_,t.sample=function(t,e){if(!t)throw new Error("featurecollection is required");if(null==e)throw new Error("num is required");if("number"!=typeof e)throw new Error("num must be a number");return f(function(t,e){var n,r,i=t.slice(0),o=t.length,s=o-e;for(;o-- >s;)n=i[r=Math.floor((o+1)*Math.random())],i[r]=i[o],i[o]=n;return i.slice(s)}(t.features,e))},t.sector=function(t,e,n,r,i){if(!P(i=i||{}))throw new Error("options is invalid");var o=i.properties;if(!t)throw new Error("center is required");if(null==n)throw new Error("bearing1 is required");if(null==r)throw new Error("bearing2 is required");if(!e)throw new Error("radius is required");if("object"!=typeof i)throw new Error("options must be an object");if(qi(n)===qi(r))return _n(t,e,i);var s=Q(t),a=bi(t,e,n,r,i),u=[[s]];return R(a,(function(t){u[0].push(t)})),u[0].push(s),l(u,o)},t.segmentEach=U,t.segmentReduce=V,t.shortestPath=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.resolution,i=n.minDistance,s=n.obstacles||f([]);if(!t)throw new Error("start is required");if(!e)throw new Error("end is required");if(r&&!C(r)||r<=0)throw new Error("options.resolution must be a number, greater than 0");if(i)throw new Error("options.minDistance is not yet implemented");var u=K(t),l=K(e);switch(t=a(u),e=a(l),it(s)){case"FeatureCollection":if(0===s.features.length)return h([u,l]);break;case"Polygon":s=f([o(rt(s))]);break;default:throw new Error("invalid obstacles")}var c=s;c.features.push(t),c.features.push(e);var p=Z(ts(gn(Z(c)),1.15));r||(r=me([p[0],p[1]],[p[2],p[1]],n)/100),c.features.pop(),c.features.pop();for(var g=p[0],d=p[1],y=p[2],v=p[3],_=r/me([g,d],[y,d],n)*(y-g),m=r/me([g,d],[g,v],n)*(v-d),x=y-g,E=v-d,b=Math.floor(x/_),w=Math.floor(E/m),I=(x-b*_)/2,N=[],S=[],M=[],L=[],O=1/0,R=1/0,T=v-(E-w*m)/2,A=0;T>=d;){for(var D=[],F=[],k=g+I,G=0;k<=y;){var q=a([k,T]),B=Js(q,s);D.push(B?0:1),F.push(k+"|"+T);var z=me(q,t);!B&&z<O&&(O=z,M={x:G,y:A});var j=me(q,e);!B&&j<R&&(R=j,L={x:G,y:A}),k+=_,G++}S.push(D),N.push(F),T-=m,A++}var U=new Ys(S,{diagonal:!0}),V=U.grid[M.y][M.x],X=U.grid[L.y][L.x],Y=Xs.search(U,V,X),H=[u];return Y.forEach((function(t){var e=N[t.x][t.y].split("|");H.push([+e[0],+e[1]])})),H.push(l),tn(h(H))},t.simplify=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=void 0!==e.tolerance?e.tolerance:1,r=e.highQuality||!1,i=e.mutate||!1;if(!t)throw new Error("geojson is required");if(n&&n<0)throw new Error("invalid tolerance");return!0!==i&&(t=Ie(t)),q(t,(function(t){!function(t,e,n){var r=t.type;if("Point"===r||"MultiPoint"===r)return t;tn(t,!0);var i=t.coordinates;switch(r){case"LineString":t.coordinates=ln(i,e,n);break;case"MultiLineString":t.coordinates=i.map((function(t){return ln(t,e,n)}));break;case"Polygon":t.coordinates=cn(i,e,n);break;case"MultiPolygon":t.coordinates=i.map((function(t){return cn(t,e,n)}))}}(t,n,r)})),t},t.square=yn,t.squareGrid=py,t.standardDeviationalEllipse=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.steps||64,r=e.weight,i=e.properties||{};if(!C(n))throw new Error("steps must be a number");if(!P(i))throw new Error("properties must be a number");var o=G(t).length,s=Fa(t,{weight:r}),a=0,u=0,l=0;F(t,(function(t){var e=t.properties[r]||1,n=Ga(Q(t),Q(s));a+=Math.pow(n.x,2)*e,u+=Math.pow(n.y,2)*e,l+=n.x*n.y*e}));var c=a-u,h=Math.sqrt(Math.pow(c,2)+4*Math.pow(l,2)),p=2*l,g=Math.atan((c+h)/p),d=180*g/Math.PI,y=0,v=0,_=0;F(t,(function(t){var e=t.properties[r]||1,n=Ga(Q(t),Q(s));y+=Math.pow(n.x*Math.cos(g)-n.y*Math.sin(g),2)*e,v+=Math.pow(n.x*Math.sin(g)+n.y*Math.cos(g),2)*e,_+=e}));var m=Math.sqrt(2*y/_),x=Math.sqrt(2*v/_),E=Aa(s,m,x,{units:"degrees",angle:d,steps:n,properties:i}),b=_e(t,f([E])),w={meanCenterCoordinates:Q(s),semiMajorAxis:m,semiMinorAxis:x,numberOfFeatures:o,angle:d,percentageWithinEllipse:100*G(b).length/o};return E.properties.standardDeviationalEllipse=w,E},t.tag=function(t,e,n,r){return t=Ie(t),e=Ie(e),F(t,(function(t){t.properties||(t.properties={}),F(e,(function(e){void 0===t.properties[r]&&ye(t,e)&&(t.properties[r]=e.properties[n])}))})),t},t.tesselate=function(t){if(!t.geometry||"Polygon"!==t.geometry.type&&"MultiPolygon"!==t.geometry.type)throw new Error("input must be a Polygon or MultiPolygon");var e={type:"FeatureCollection",features:[]};return"Polygon"===t.geometry.type?e.features=Wn(t.geometry.coordinates):t.geometry.coordinates.forEach((function(t){e.features=e.features.concat(Wn(t))})),e},t.tin=xe,t.toMercator=Va,t.toWgs84=Xa,t.transformRotate=$o,t.transformScale=ts,t.transformTranslate=function(t,e,n,r){if(!P(r=r||{}))throw new Error("options is invalid");var i=r.units,o=r.zTranslation,s=r.mutate;if(!t)throw new Error("geojson is required");if(null==e||isNaN(e))throw new Error("distance is required");if(o&&"number"!=typeof o&&isNaN(o))throw new Error("zTranslation is not a number");if(o=void 0!==o?o:0,0===e&&0===o)return t;if(null==n||isNaN(n))throw new Error("direction is required");return e<0&&(e=-e,n+=180),!1!==s&&void 0!==s||(t=Ie(t)),R(t,(function(t){var r=Q(ji(t,e,n,{units:i}));t[0]=r[0],t[1]=r[1],o&&3===t.length&&(t[2]+=o)})),t},t.triangleGrid=fy,t.truncate=ei,t.union=function(t,e,n){void 0===n&&(n={});var r=rt(t),i=rt(e),o=$u.union(r.coordinates,i.coordinates);return 0===o.length?null:1===o.length?l(o[0],n.properties):y(o,n.properties)},t.unitsFactors=r,t.unkinkPolygon=function(t){var e=[];return z(t,(function(t){"Polygon"===t.geometry.type&&F(oi(t),(function(n){e.push(l(n.geometry.coordinates,t.properties))}))})),f(e)},t.validateBBox=M,t.validateId=L,t.voronoi=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.bbox||[-180,-85,180,85];if(!t)throw new Error("points is required");if(!Array.isArray(n))throw new Error("bbox is invalid");return nt(t,"Point","points"),f(function(){var t=Ks,e=Qs,n=null;function r(r){return new Ra(r.map((function(n,i){var o=[Math.round(t(n,i,r)/Ma)*Ma,Math.round(e(n,i,r)/Ma)*Ma];return o.index=i,o.data=n,o})),n)}return r.polygons=function(t){return r(t).polygons()},r.links=function(t){return r(t).links()},r.triangles=function(t){return r(t).triangles()},r.x=function(e){return arguments.length?(t="function"==typeof e?e:Zs(+e),r):t},r.y=function(t){return arguments.length?(e="function"==typeof t?t:Zs(+t),r):e},r.extent=function(t){return arguments.length?(n=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],r):n&&[[n[0][0],n[0][1]],[n[1][0],n[1][1]]]},r.size=function(t){return arguments.length?(n=null==t?null:[[0,0],[+t[0],+t[1]]],r):n&&[n[1][0]-n[0][0],n[1][1]-n[0][1]]},r}().x((function(t){return t.geometry.coordinates[0]})).y((function(t){return t.geometry.coordinates[1]})).extent([[n[0],n[1]],[n[2],n[3]]]).polygons(t.features).map(Ta))},t.within=_e,Object.defineProperty(t,"__esModule",{value:!0})})); })(); // Función reutilizable para mostrar el spinner de carga function showLoadingSpinner() { const scanSpinner = document.createElement("div"); scanSpinner.id = "scanSpinnerOverlay"; scanSpinner.style.position = "fixed"; scanSpinner.style.top = "0"; scanSpinner.style.left = "0"; scanSpinner.style.width = "100%"; scanSpinner.style.height = "100%"; scanSpinner.style.background = "rgba(0, 0, 0, 0.5)"; scanSpinner.style.zIndex = "10000"; scanSpinner.style.display = "flex"; scanSpinner.style.justifyContent = "center"; scanSpinner.style.alignItems = "center"; // Estilos para centrar el contenido const scanContent = document.createElement("div"); scanContent.style.background = "#fff"; scanContent.style.padding = "20px"; scanContent.style.borderRadius = "8px"; scanContent.style.textAlign = "center"; // Spinner de carga const spinner = document.createElement("div"); spinner.classList.add("spinner"); spinner.style.border = "6px solid #f3f3f3"; spinner.style.borderTop = "6px solid #3498db"; spinner.style.borderRadius = "50%"; spinner.style.width = "40px"; spinner.style.height = "40px"; spinner.style.animation = "spin 1s linear infinite"; spinner.style.margin = "0 auto 10px auto"; // Texto de progreso const progressText = document.createElement("div"); progressText.id = "scanProgressText"; progressText.textContent = "Analizando lugares: 0%"; progressText.style.fontSize = "14px"; progressText.style.color = "#333"; // Añadir spinner y texto al contenido scanContent.appendChild(spinner); scanContent.appendChild(progressText); scanSpinner.appendChild(scanContent); document.body.appendChild(scanSpinner); // Añadir estilos de animación al documento const style = document.createElement("style"); style.textContent = `@keyframes spin {0%{ transform: rotate(0deg); } 100% { transform: rotate(360deg); }}`; document.head.appendChild(style); }// showLoadingSpinner // Función para obtener el ícono de categoría function getCategoryIcon(categoryName) { // Mapa de categorías a íconos con soporte bilingüe const categoryIcons = { // Comida y Restaurantes / Food & Restaurants "FOOD_AND_DRINK": { icon: "🦞🍷", es: "Comida y Bebidas", en: "Food and Drinks" }, "RESTAURANT": { icon: "🍽️", es: "Restaurante", en: "Restaurant" }, "FAST_FOOD": { icon: "🍔", es: "Comida rápida", en: "Fast Food" }, "CAFE": { icon: "☕", es: "Cafetería", en: "Cafe" }, "BAR": { icon: "🍺", es: "Bar", en: "Bar" }, "BAKERY": { icon: "🥖", es: "Panadería", en: "Bakery" }, "ICE_CREAM": { icon: "🍦", es: "Heladería", en: "Ice Cream Shop" }, "DEPARTMENT_STORE": { icon: "🏬", es: "Tienda por departamentos", en: "Department Store" }, "PARK": { icon: "🌳", es: "Parque", en: "Park" }, // Compras y Servicios / Shopping & Services "FASHION_AND_CLOTHING": { icon: "👗", es: "Moda y Ropa", en: "Fashion and Clothing" }, "SHOPPING_AND_SERVICES": { icon: "👜👝", es: "Mercado o Tienda", en: "Shopping and Services" }, "SHOPPING_CENTER": { icon: "🛍️", es: "Centro comercial", en: "Shopping Center" }, "SUPERMARKET_GROCERY": { icon: "🛒", es: "Supermercado", en: "Supermarket" }, "MARKET": { icon: "🛒", es: "Mercado", en: "Market" }, "CONVENIENCE_STORE": { icon: "🏪", es: "Tienda", en: "Convenience Store" }, "PHARMACY": { icon: "💊", es: "Farmacia", en: "Pharmacy" }, "BANK": { icon: "🏦", es: "Banco", en: "Bank" }, "ATM": { icon: "💳", es: "Cajero automático", en: "ATM" }, "HARDWARE_STORE": { icon: "🔧", es: "Ferretería", en: "Hardware Store" }, "COURTHOUSE": { icon: "⚖️", es: "Corte", en: "Courthouse" }, "FURNITURE_HOME_STORE": { icon: "🛋️", es: "Tienda de muebles", en: "Furniture Store" }, "TOURIST_ATTRACTION_HISTORIC_SITE": { icon: "🗿", es: "Atracción turística o Sitio histórico", en: "Tourist Attraction or Historic Site" }, "PET_STORE_VETERINARIAN_SERVICES": { icon: "🦮🐈", es: "Tienda de mascotas o Veterinaria", en: "Pet Store or Veterinary Services" }, "CEMETERY": { icon: "🪦", es: "Cementerio", en: "Cemetery" }, "KINDERGARDEN": { icon: "🍼", es: "Jardín Infantil", en: "Kindergarten" }, "JUNCTION_INTERCHANGE": { icon: "🔀", es: "Cruce o Intercambio", en: "Junction or Interchange" }, "OUTDOORS": { icon: "🏞️", es: "Aire libre", en: "Outdoors" }, "ORGANIZATION_OR_ASSOCIATION": { icon: "👔", es: "Organización o Asociación", en: "Organization or Association" }, "TRAVEL_AGENCY": { icon: "🧳", es: "Agencia de viajes", en: "Travel Agency" }, "BANK_FINANCIAL": { icon: "💰", es: "Banco o Financiera", en: "Bank or Financial Institution" }, "SPORTING_GOODS": { icon: "🛼🏀🏐", es: "Artículos deportivos", en: "Sporting Goods" }, "TOY_STORE": { icon: "🧸", es: "Tienda de juguetes", en: "Toy Store" }, "CURRENCY_EXCHANGE": { icon: "💶💱", es: "Casa de cambio", en: "Currency Exchange" }, "PHOTOGRAPHY": { icon: "📸", es: "Fotografía", en: "Photography" }, "DESSERT": { icon: "🍰", es: "Postre", en: "Dessert" }, "FOOD_COURT": { icon: "🥗", es: "Comedor o Patio de comidas", en: "Food Court" }, "CANAL": { icon: "〰", es: "Canal", en: "Canal" }, "JEWELRY": { icon: "💍", es: "Joyería", en: "Jewelry" }, // Transporte / Transportation "TRAIN_STATION": { icon: "🚂", es: "Estación de tren", en: "Train Station" }, "GAS_STATION": { icon: "⛽", es: "Estación de servicio", en: "Gas Station" }, "PARKING_LOT": { icon: "🅿️", es: "Estacionamiento", en: "Parking Lot" }, "BUS_STATION": { icon: "🚍", es: "Terminal de bus", en: "Bus Station" }, "AIRPORT": { icon: "✈️", es: "Aeropuerto", en: "Airport" }, "CAR_WASH": { icon: "🚗💦", es: "Lavado de autos", en: "Car Wash" }, "CAR_RENTAL": { icon: "🚘🛺🛻🚙", es: "Alquiler de Vehículos", en: "Car Rental" }, "TAXI_STATION": { icon: "🚕", es: "Estación de taxis", en: "Taxi Station" }, "FOREST_GROVE": { icon: "🌳", es: "Bosque", en: "Forest Grove" }, "GARAGE_AUTOMOTIVE_SHOP": { icon: "🔧🚗", es: "Taller mecánico", en: "Automotive Garage" }, "GIFTS": { icon: "🎁", es: "Tienda de regalos", en: "Gift Shop" }, "TOLL_BOOTH": { icon: "🚧", es: "Peaje", en: "Toll Booth" }, "CHARGING_STATION": { icon: "🔋", es: "Estación de carga", en: "Charging Station" }, "CAR_SERVICES": { icon: "🚗🔧", es: "Servicios de automóviles", en: "Car Services" }, "STADIUM_ARENA": { icon: "🏟️", es: "Estadio o Arena", en: "Stadium or Arena" }, "CAR_DEALERSHIP": { icon: "🚘🏢", es: "Concesionario de autos", en: "Car Dealership" }, "FERRY_PIER": { icon: "⛴️", es: "Muelle de ferry", en: "Ferry Pier" }, "INFORMATION_POINT": { icon: "ℹ️", es: "Punto de información", en: "Information Point" }, "REST_AREAS": { icon: "🏜", es: "Áreas de descanso", en: "Rest Areas" }, "MUSIC_VENUE": { icon: "🎶", es: "Lugar de música", en: "Music Venue" }, "CASINO": { icon: "🎰", es: "Casino", en: "Casino" }, "CITY_HALL": { icon: "🎩", es: "Ayuntamiento", en: "City Hall" }, "PERFORMING_ARTS_VENUE": { icon: "🎭", es: "Lugar de artes escénicas", en: "Performing Arts Venue" }, "TUNNEL": { icon: "🔳", es: "Túnel", en: "Tunnel" }, "SEAPORT_MARINA_HARBOR": { icon: "⚓", es: "Puerto o Marina", en: "Seaport or Marina" }, // Alojamiento / Lodging "HOTEL": { icon: "🏨", es: "Hotel", en: "Hotel" }, "HOSTEL": { icon: "🛏️", es: "Hostal", en: "Hostel" }, "LODGING": { icon: "⛺", es: "Alojamiento", en: "Lodging" }, "MOTEL": { icon: "🛕", es: "Motel", en: "Motel" }, "SWIMMING_POOL": { icon: "🏊", es: "Piscina", en: "Swimming Pool" }, "RIVER_STREAM": { icon: "🌊", es: "Río o Arroyo", en: "River or Stream" }, "CAMPING_TRAILER_PARK": { icon: "🏕️", es: "Camping o Parque de Trailers", en: "Camping or Trailer Park" }, "SEA_LAKE_POOL": { icon: "🏖️", es: "Mar, Lago o Piscina", en: "Sea, Lake or Pool" }, "FARM": { icon: "🚜", es: "Granja", en: "Farm" }, "NATURAL_FEATURES": { icon: "🌲", es: "Características naturales", en: "Natural Features" }, // Salud / Healthcare "HOSPITAL": { icon: "🏥", es: "Hospital", en: "Hospital" }, "HOSPITAL_URGENT_CARE": { icon: "🏥🚑", es: "Urgencias", en: "Urgent Care" }, "DOCTOR_CLINIC": { icon: "🏥⚕️", es: "Clínica", en: "Clinic" }, "DOCTOR": { icon: "👨⚕️", es: "Consultorio médico", en: "Doctor's Office" }, "VETERINARY": { icon: "🐾", es: "Veterinaria", en: "Veterinary" }, "PERSONAL_CARE": { icon: "💅💇🦷", es: "Cuidado personal", en: "Personal Care" }, "FACTORY_INDUSTRIAL": { icon: "🏭", es: "Fábrica o Industrial", en: "Factory or Industrial" }, "MILITARY": { icon: "🪖", es: "Militar", en: "Military" }, "LAUNDRY_DRY_CLEAN": { icon: "🧺", es: "Lavandería o Tintorería", en: "Laundry or Dry Clean" }, "PLAYGROUND": { icon: "🛝", es: "Parque infantil", en: "Playground" }, "TRASH_AND_RECYCLING_FACILITIES": { icon: "🗑️♻️", es: "Instalaciones de basura y reciclaje", en: "Trash and Recycling Facilities" }, // Educación / Education "UNIVERSITY": { icon: "🎓", es: "Universidad", en: "University" }, "COLLEGE_UNIVERSITY": { icon: "🏫", es: "Colegio", en: "College" }, "SCHOOL": { icon: "🎒", es: "Escuela", en: "School" }, "LIBRARY": { icon: "📖", es: "Biblioteca", en: "Library" }, "FLOWERS": { icon: "💐", es: "Floristería", en: "Flower Shop" }, "CONVENTIONS_EVENT_CENTER": { icon: "🎤🥂", es: "Centro de convenciones o eventos", en: "Convention or Event Center" }, "CLUB": { icon: "♣", es: "Club", en: "Club" }, "ART_GALLERY": { icon: "🖼️", es: "Galería de arte", en: "Art Gallery" }, "NATURAL_FEATURES": { icon: "🌄", es: "Características naturales", en: "Natural Features" }, // Entretenimiento / Entertainment "CINEMA": { icon: "🎬", es: "Cine", en: "Cinema" }, "THEATER": { icon: "🎭", es: "Teatro", en: "Theater" }, "MUSEUM": { icon: "🖼", es: "Museo", en: "Museum" }, "CULTURE_AND_ENTERTAINEMENT": { icon: "🎨", es: "Cultura y Entretenimiento", en: "Culture and Entertainment" }, "STADIUM": { icon: "🏟️", es: "Estadio", en: "Stadium" }, "GYM": { icon: "💪", es: "Gimnasio", en: "Gym" }, "GYM_FITNESS": { icon: "🏋️", es: "Gimnasio o Fitness", en: "Gym or Fitness" }, "GAME_CLUB": { icon: "⚽🏓", es: "Club de juegos", en: "Game Club" }, "BOOKSTORE": { icon: "📖📚", es: "Librería", en: "Bookstore" }, "ELECTRONICS": { icon: "📱💻", es: "Electrónica", en: "Electronics" }, "SPORTS_COURT": { icon: "⚽🏀", es: "Cancha deportiva", en: "Sports Court" }, "GOLF_COURSE": { icon: "⛳", es: "Campo de golf", en: "Golf Course" }, "SKI_AREA": { icon: "⛷️", es: "Área de esquí", en: "Ski Area" }, "RACING_TRACK": { icon: "🛷⛸🏎️", es: "Pista de carreras", en: "Racing Track" }, // Gobierno y Servicios Públicos / Government & Public Services "GOVERNMENT": { icon: "🏛️", es: "Oficina gubernamental", en: "Government Office" }, "POLICE_STATION": { icon: "👮", es: "Estación de policía", en: "Police Station" }, "FIRE_STATION": { icon: "🚒", es: "Estación de bomberos", en: "Fire Station" }, "FIRE_DEPARTMENT": { icon: "🚒", es: "Departamento de bomberos", en: "Fire Department" }, "POST_OFFICE": { icon: "📫", es: "Correo", en: "Post Office" }, "TRANSPORTATION": { icon: "🚌", es: "Transporte", en: "Transportation" }, "PRISON_CORRECTIONAL_FACILITY": { icon: "👁️🗨️", es: "Prisión o Centro Correccional", en: "Prison or Correctional Facility" }, // Religión / Religion "RELIGIOUS_CENTER": { icon: "⛪", es: "Iglesia", en: "Church" }, // Otros / Others "RESIDENTIAL": { icon: "🏘️", es: "Residencial", en: "Residential" }, "RESIDENCE_HOME": { icon: "🏠", es: "Residencia o Hogar", en: "Residence or Home" }, "OFFICES": { icon: "🏢", es: "Oficina", en: "Office" }, "FACTORY": { icon: "🏭", es: "Fábrica", en: "Factory" }, "CONSTRUCTION_SITE": { icon: "🏗️", es: "Construcción", en: "Construction" }, "MONUMENT": { icon: "🗽", es: "Monumento", en: "Monument" }, "BRIDGE": { icon: "🌉", es: "Puente", en: "Bridge" }, "PROFESSIONAL_AND_PUBLIC": { icon: "🗄💼", es: "Profesional y Público", en: "Professional and Public" }, "OTHER": { icon: "🚪", es: "Otro", en: "Other" }, "ARTS_AND_CRAFTS": { icon: "🎨", es: "Artes y Manualidades", en: "Arts and Crafts" }, "COTTAGE_CABIN": { icon: "🏡", es: "Cabaña", en: "Cottage Cabin" }, "TELECOM": { icon: "📡", es: "Telecomunicaciones", en: "Telecommunications" } }; // Si no hay categoría, devolver ícono por defecto if (!categoryName) { return { icon: "❓", title: "Sin categoría / No category" }; } // Normalizar el nombre de la categoría const normalizedInput = categoryName.toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .trim(); //console.log("[WME_PLN][DEBUG] Buscando ícono para categoría:", categoryName); //console.log("[WME_PLN][DEBUG] Nombre normalizado:", normalizedInput); // 1. Buscar coincidencia exacta por clave interna (ej: "PARK") for (const [key, data] of Object.entries(categoryIcons)) { if (key.toLowerCase() === normalizedInput) { return { icon: data.icon, title: `${data.es} / ${data.en}` }; } } // Buscar coincidencia en el mapa de categorías for (const [key, data] of Object.entries(categoryIcons)) { // Normalizar los nombres en español e inglés para la comparación const normalizedES = data.es.toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .trim(); const normalizedEN = data.en.toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .trim(); if (normalizedInput === normalizedES || normalizedInput === normalizedEN) { return { icon: data.icon, title: `${data.es} / ${data.en}` }; } } // Si no se encuentra coincidencia, devolver ícono por defecto //console.log("[WME_PLN][DEBUG] No se encontró coincidencia, usando ícono por defecto"); return { icon: "⚪", title: `${categoryName} (Sin coincidencia / No match)` }; }// getCategoryIcon // Función para agregar una palabra al diccionario function addWordToDictionary(input) { const newWord = input.value.trim().toLowerCase(); if (!newWord) { alert("La palabra no puede estar vacía."); return; } // Validaciones básicas antes de añadir if (newWord.length === 1 && !newWord.match(/[a-zA-Z0-9]/)) { alert("No se permite agregar un solo carácter que no sea alfanumérico."); return; } if (commonWords.includes(newWord)) { alert("Esa palabra es muy común y no debe agregarse al diccionario."); return; } if (excludedWords.has(newWord)) { alert("Esa palabra ya existe en la lista de especiales (excluidas)."); return; } if (window.dictionaryWords.has(newWord)) { alert("La palabra ya existe en el diccionario."); return; } if (!window.dictionaryWords) window.dictionaryWords = new Set(); if (!window.dictionaryIndex) window.dictionaryIndex = {}; window.dictionaryWords.add(newWord); // Añadir al Set // === AÑADIR AL ÍNDICE === const firstChar = newWord.charAt(0).toLowerCase(); if (!window.dictionaryIndex[firstChar]) { window.dictionaryIndex[firstChar] = []; } window.dictionaryIndex[firstChar].push(newWord); // Añadir al índice input.value = ""; // Limpiar el input renderDictionaryList(document.getElementById("dictionaryWordsList")); // Re-renderizar la lista // Guardar en localStorage después de añadir try { localStorage.setItem("dictionaryWordsList", JSON.stringify(Array.from(window.dictionaryWords))); } catch (e) { console.error("[WME PLN] Error guardando diccionario en localStorage después de añadir manualmente:", e); } }// addWordToDictionary
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址