From f6962134d9bc27e848a02e4e1d0aafd850498819 Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:06:58 +0530 Subject: [PATCH 01/19] =?UTF-8?q?feat:=20add=20Risk=20Portfolio=20dashboar?= =?UTF-8?q?d=20(insights3)=20=E2=80=94=20domain-segmented=20due-diligence?= =?UTF-8?q?=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design philosophy: three-column risk-domain breakdown (Security / Operational / Compliance) each with score bar, key stats, and traffic-light badge. Overall grade header with plain-English verdict. - Security Posture: vulns, CVE dwell, malware, dep confusion - Operational Health: EOL, version drift, repo activity, SBOM coverage - License & Compliance: copyleft risk, unknown licenses, pinned actions - Each domain scored 0-100 with color-coded progress bar - Plain-English overall verdict tailored to risk level --- insights3.html | 182 ++++++++++++++++++++++++++++++++++++++ js/insights3-page.js | 203 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 385 insertions(+) create mode 100644 insights3.html create mode 100644 js/insights3-page.js diff --git a/insights3.html b/insights3.html new file mode 100644 index 0000000..151170a --- /dev/null +++ b/insights3.html @@ -0,0 +1,182 @@ + + + + + + SBOM Play — Risk Portfolio + + + + + + + + + + + Skip to content + + +
+

Risk Portfolio

+

Risk-domain segmentation for due-diligence reviews

+ +
+ +
+ +
+ No analysis data found. Run a scan first. +
+ +

Assessing risk portfolio…

+
+
+ + + + + + + + + + + + + diff --git a/js/insights3-page.js b/js/insights3-page.js new file mode 100644 index 0000000..6d99244 --- /dev/null +++ b/js/insights3-page.js @@ -0,0 +1,203 @@ +/** + * Risk Portfolio (insights3-page.js) — domain-segmented risk view. + * Three columns: Security, Operational, Compliance. + * Each has a score bar, key stats, and traffic-light badge. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('Portfolio: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + renderPortfolio(Agg.buildInsights(data.data)); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + await loadAnalysesList(); + + /* ------------------------------------------------------------------ */ + /* Helpers */ + /* ------------------------------------------------------------------ */ + function badge(val, good, warn) { + if (val <= good) return 'Good'; + if (val <= warn) return 'Moderate'; + return 'Needs Attention'; + } + + function scoreBar(pct, color) { + return `
+
+
0${pct}/100
+
`; + } + + function statRow(label, value, colorClass) { + return `
${esc(label)}${value}
`; + } + + /* ------------------------------------------------------------------ */ + /* Render */ + /* ------------------------------------------------------------------ */ + function renderPortfolio(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const drift = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const dwell = ins.vulnAgeStats.directDwellMedian; + const hyg = ins.repoHygiene; + + /* ---- Security domain ---- */ + const secScore = Math.max(0, 100 - + (ch.critical * 20 + ch.high * 8 + + (sc.malwareCount * 25) + + (dwell !== null && dwell > 90 ? 15 : dwell !== null && dwell > 30 ? 8 : 0))); + const secColor = secScore >= 70 ? 'var(--color-green)' : secScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + let secHtml = ` +
+

Security Posture

+ ${scoreBar(secScore, secColor)} + ${statRow('Crit + High Vulns', ch.total, ch.total > 0 ? 'text-danger fw-bold' : '')} + ${statRow('CVE Dwell (median)', dwell !== null ? dwell + ' days' : '--')} + ${statRow('Malware Advisories', sc.malwareCount, sc.malwareCount > 0 ? 'text-danger fw-bold' : '')} + ${statRow('Dep Confusion Risks', sc.depConfusionCount, sc.depConfusionCount > 0 ? 'text-warning' : '')} +
${badge(100 - secScore, 30, 55)}
+
`; + + /* ---- Operational domain ---- */ + const staleRepos = hyg.activityBuckets['> 1 year'] || 0; + const opScore = Math.max(0, 100 - + (eol.eolCount * 3) + + (drift.buckets.major.total * 2) + + (staleRepos * 5) + + (hyg.noSbom * 3)); + const opScoreClamped = Math.max(0, Math.min(100, opScore)); + const opColor = opScoreClamped >= 70 ? 'var(--color-green)' : opScoreClamped >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + let opHtml = ` +
+

Operational Health

+ ${scoreBar(opScoreClamped, opColor)} + ${statRow('Repositories Analyzed', ins.totalRepos)} + ${statRow('With SBOM', ins.reposWithSbom)} + ${statRow('EOL Components', eol.eolCount, eol.eolCount > 0 ? 'text-danger fw-bold' : '')} + ${statRow('Major Drift', drift.buckets.major.total, drift.buckets.major.total > 0 ? 'text-warning' : '')} + ${statRow('Repos Inactive >1yr', staleRepos, staleRepos > 0 ? 'text-warning' : '')} +
${badge(100 - opScoreClamped, 30, 55)}
+
`; + + /* ---- Compliance domain ---- */ + const compScore = Math.max(0, 100 - (lic.highRisk * 8) - (sc.unpinnedActions * 2)); + const compColor = compScore >= 70 ? 'var(--color-green)' : compScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + let compHtml = ` +
+

License & Compliance

+ ${scoreBar(compScore, compColor)} + ${statRow('High-Risk Licenses', lic.highRisk, lic.highRisk > 0 ? 'text-warning fw-bold' : '')} + ${statRow('Copyleft (direct)', lic.copyleft.direct, lic.copyleft.direct > 0 ? 'text-warning' : '')} + ${statRow('Copyleft (transitive)', lic.copyleft.transitive)} + ${statRow('Unknown Licenses', lic.unknown.total, lic.unknown.total > 0 ? 'text-muted' : '')} + ${statRow('Unpinned GH Actions', sc.unpinnedActions, sc.unpinnedActions > 0 ? 'text-warning' : '')} +
${badge(100 - compScore, 30, 55)}
+
`; + + /* ---- Overall verdict ---- */ + const overallScore = td.score100; + const verdictClass = overallScore >= 75 ? 'text-success' : overallScore >= 55 ? 'text-warning' : 'text-danger'; + const verdictText = overallScore >= 75 ? 'Low risk profile — standard monitoring advised.' + : overallScore >= 55 ? 'Moderate risk — review flagged items and set remediation plan.' + : 'Elevated risk — active remediation recommended before proceeding.'; + + const legendHtml = `
+ Good + Moderate + Needs Attention +
`; + + const verdictHtml = `
+
${esc(verdictText)}
+
Tech-Health Score ${overallScore}/100 (Grade ${td.grade})
+
`; + + safe(content, ` +
+
+
${td.grade}
+
Tech-Health${td.score100}/100
+
+
+ ${legendHtml} +
+
${secHtml}
+
${opHtml}
+
${compHtml}
+
+ ${verdictHtml} + `); + } + +})(); From c3d30ec5ecb3fec07b4a943fada43949b5bfa3d4 Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:07:47 +0530 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20add=20Org=20Report=20Card=20dashb?= =?UTF-8?q?oard=20(insights4)=20=E2=80=94=20school-report=20format=20for?= =?UTF-8?q?=20execs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design philosophy: universal report-card metaphor. Overall GPA + 6 subjects with letter grades, status badges (Excellent/Good/Fair/Poor), and plain-English comments. Everyone understands a report card. - Vulnerability Management - Dependency Freshness - License Compliance - Code Activity - Supply Chain Security - Maintenance Hygiene - Overall GPA computed from subject grades --- insights4.html | 199 ++++++++++++++++++++++++++++++++++ js/insights4-page.js | 252 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 451 insertions(+) create mode 100644 insights4.html create mode 100644 js/insights4-page.js diff --git a/insights4.html b/insights4.html new file mode 100644 index 0000000..839b5fc --- /dev/null +++ b/insights4.html @@ -0,0 +1,199 @@ + + + + + + SBOM Play — Org Report Card + + + + + + + + + + + Skip to content + + +
+
+

Org Health Report Card

+
+
+
+ +
+ +
+ +
+ No analysis data found. Run a scan first. +
+ +

Preparing report card…

+
+
+ +
+
© Cyfinoid Research.
+
+ + + + + + + + + + + diff --git a/js/insights4-page.js b/js/insights4-page.js new file mode 100644 index 0000000..ae9a15d --- /dev/null +++ b/js/insights4-page.js @@ -0,0 +1,252 @@ +/** + * Org Report Card (insights4-page.js) — school-report format. + * Overall GPA + subject-level letter grades with plain-English comments. + * Everyone understands a report card. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + const dateEl = document.getElementById('reportDate'); + const scopeEl = document.getElementById('reportScope'); + + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('ReportCard: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + const scope = !name || name === '' ? 'All Analyses (combined)' : name; + scopeEl.textContent = scope; + dateEl.textContent = 'Generated ' + new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); + + renderReportCard(Agg.buildInsights(data.data)); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + document.getElementById('reportDate').textContent = 'Generated ' + new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); + await loadAnalysesList(); + + /* ------------------------------------------------------------------ */ + /* Subject grade logic */ + /* ------------------------------------------------------------------ */ + function subjectGrade(score100) { + if (score100 >= 90) return { grade: 'A', status: 'Excellent', statusClass: 'excellent' }; + if (score100 >= 75) return { grade: 'B', status: 'Good', statusClass: 'good' }; + if (score100 >= 55) return { grade: 'C', status: 'Fair', statusClass: 'fair' }; + if (score100 >= 35) return { grade: 'D', status: 'Poor', statusClass: 'poor' }; + return { grade: 'F', status: 'Needs Work', statusClass: 'poor' }; + } + + function computeSubjectGrades(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const drift = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + + /* Vulnerability Management */ + const vulnScore = Math.max(0, 100 - (ch.critical * 20 + ch.high * 8)); + const vg = subjectGrade(vulnScore); + + /* Version Freshness (drift) */ + const driftPct = drift.total > 0 ? (drift.covered / drift.total) : 1; + const driftGrade = Math.max(0, 100 - + (drift.buckets.major.total * 4) - + (drift.buckets.minor.total) + + Math.round(driftPct * 10)); + const dg = subjectGrade(Math.min(100, driftGrade)); + + /* License Compliance */ + const licCoverage = lic.permissive.total + lic.copyleft.total + lic.unknown.total; + const licScore = licCoverage > 0 + ? Math.max(0, 100 - (lic.highRisk / licCoverage) * 80) + : 100; + const lg = subjectGrade(licScore); + + /* Code Activity (hygiene) */ + const hyg = ins.repoHygiene; + const activeRatio = ins.totalRepos > 0 + ? (hyg.activityBuckets['Last 30 days'] + hyg.activityBuckets['30-90 days'] + hyg.activityBuckets['90-180 days']) / ins.totalRepos + : 0; + const activityScore = Math.round(activeRatio * 100); + const ag = subjectGrade(activityScore); + + /* Supply Chain Security */ + const scScore = Math.max(0, 100 - + (sc.malwareCount * 30) - + (sc.depConfusionCount * 10) - + (eol.eolCount * 3) - + (sc.unpinnedActions * 2)); + const sg = subjectGrade(scScore); + + /* Maintenance Hygiene (EOL + age + drift) */ + const oldDeps = ins.ageStats.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0); + const maintScore = ins.totalDeps > 0 + ? Math.max(0, 100 - ((oldDeps / ins.totalDeps) * 50) - ((drift.buckets.major.total / (ins.totalDeps || 1)) * 30)) + : 100; + const mg = subjectGrade(maintScore); + + return { + vulnerability: { ...vg, icon: 'fas fa-shield-alt', label: 'Vulnerability Management', comment: vulnComment(ch, ins.vulnAgeStats.directDwellMedian) }, + freshness: { ...dg, icon: 'fas fa-sync-alt', label: 'Dependency Freshness', comment: driftComment(drift) }, + license: { ...lg, icon: 'fas fa-balance-scale', label: 'License Compliance', comment: licenseComment(lic) }, + activity: { ...ag, icon: 'fas fa-code-branch', label: 'Code Activity', comment: activityComment(hyg, ins.totalRepos) }, + supplyChain: { ...sg, icon: 'fas fa-shield-virus', label: 'Supply Chain Security', comment: supplyChainComment(sc, eol) }, + maintenance: { ...mg, icon: 'fas fa-tools', label: 'Maintenance Hygiene', comment: maintenanceComment(oldDeps, ins.totalDeps) } + }; + } + + /* Comments */ + function vulnComment(ch, dwell) { + if (ch.total === 0) return 'No critical or high vulnerabilities.'; + let c = `${ch.total} critical/high vulns`; + if (dwell !== null) c += `, median dwell ${dwell} days`; + return c + '.'; + } + function driftComment(drift) { + if (drift.total === 0) return 'No dependency data.'; + if (drift.buckets.major.total === 0) return 'All dependencies at current versions.'; + return `${drift.buckets.major.total} major updates behind — ${drift.coveragePct}% coverage.`; + } + function licenseComment(lic) { + const total = lic.permissive.total + lic.copyleft.total + lic.unknown.total; + if (total === 0) return 'No license data.'; + if (lic.highRisk === 0) return `All ${total} dependencies have permissive licenses.`; + return `${lic.highRisk} high-risk license(s) among ${total} dependencies.`; + } + function activityComment(hyg, total) { + const active = hyg.activityBuckets['Last 30 days'] + hyg.activityBuckets['30-90 days'] + hyg.activityBuckets['90-180 days']; + const pct = total > 0 ? Math.round(active / total * 100) : 0; + if (total === 0) return 'No repositories.'; + return `${pct}% of repos pushed within 6 months (${active}/${total}).`; + } + function supplyChainComment(sc, eol) { + const issues = []; + if (sc.malwareCount > 0) issues.push(`${sc.malwareCount} malware`); + if (sc.depConfusionCount > 0) issues.push(`${sc.depConfusionCount} dep confusion`); + if (eol.eolCount > 0) issues.push(`${eol.eolCount} EOL`); + if (sc.unpinnedActions > 0) issues.push(`${sc.unpinnedActions} unpinned actions`); + if (issues.length === 0) return 'No supply chain red flags.'; + return issues.join(', ') + '.'; + } + function maintenanceComment(oldDeps, total) { + if (total === 0) return 'No dependencies.'; + const pct = Math.round(oldDeps / total * 100); + if (oldDeps === 0) return 'All dependencies are recent (< 2 years old).'; + return `${oldDeps} deps (${pct}%) are over 2 years old.`; + } + + /* ------------------------------------------------------------------ */ + /* Render */ + /* ------------------------------------------------------------------ */ + function renderReportCard(ins) { + const td = ins.techDebt; + const subjects = computeSubjectGrades(ins); + + /* GPA */ + const gpaMap = { A: 4, B: 3, C: 2, D: 1, F: 0 }; + const points = Object.values(subjects).map(s => gpaMap[s.grade] || 0); + const gpa = (points.reduce((a, b) => a + b, 0) / points.length).toFixed(1); + + const gpaHtml = ` +
+
${td.grade}
+
+
${td.score100}/100
+
Tech-Health Score · GPA ${gpa}
+
+
`; + + /* Table */ + const rows = Object.values(subjects).map(s => ` + + ${esc(s.label)} + ${s.grade} + ${esc(s.status)} + ${esc(s.comment)} + `).join(''); + + const tableHtml = ` + + + + + + + + + + ${rows} +
SubjectGradeStatusNotes
`; + + /* Legend */ + const legendHtml = ` + `; + + safe(content, gpaHtml + tableHtml + legendHtml); + } + +})(); From 61030986d6fd208dbda915f83e0c0f2c2b562994 Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:08:27 +0530 Subject: [PATCH 03/19] =?UTF-8?q?feat:=20add=20One-Pager=20Snapshot=20dash?= =?UTF-8?q?board=20(insights5)=20=E2=80=94=20single-viewport=20exec=20summ?= =?UTF-8?q?ary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design philosophy: absolute minimal — one screen, 6 tiles, one verdict line. No scrolling, no tables, no charts. Designed to fit on a laptop screen or slide within a deck. - Giant grade letter with health score and one-line verdict - 6 metric tiles in 3x2 grid: repos, C+H vulns, EOL, licenses, drift, CVE dwell - Color-coded left-border indicator on each tile (green/yellow/red) - 'Top Concerns' tag cloud shown only when issues exist - 'All clear' message when nothing needs attention --- insights5.html | 199 +++++++++++++++++++++++++++++++++++++++++++ js/insights5-page.js | 154 +++++++++++++++++++++++++++++++++ 2 files changed, 353 insertions(+) create mode 100644 insights5.html create mode 100644 js/insights5-page.js diff --git a/insights5.html b/insights5.html new file mode 100644 index 0000000..3895f65 --- /dev/null +++ b/insights5.html @@ -0,0 +1,199 @@ + + + + + + SBOM Play — Snapshot + + + + + + + + + + + Skip to content + + +
+
+ +
+ +
+ No analysis data found. Run a scan first. +
+ +

Taking snapshot…

+
+
+ +
+
© Cyfinoid Research.
+
+ + + + + + + + + + + diff --git a/js/insights5-page.js b/js/insights5-page.js new file mode 100644 index 0000000..dc42967 --- /dev/null +++ b/js/insights5-page.js @@ -0,0 +1,154 @@ +/** + * Snapshot (insights5-page.js) — single-viewport executive summary. + * One glance, everything fits on screen. 6 metric tiles + verdict + concerns. + * The most minimal of the four variants. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('Snapshot: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + renderSnapshot(Agg.buildInsights(data.data)); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + await loadAnalysesList(); + + /* ------------------------------------------------------------------ */ + /* Render */ + /* ------------------------------------------------------------------ */ + function renderSnapshot(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const drift = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const hyg = ins.repoHygiene; + const dwell = ins.vulnAgeStats.directDwellMedian; + + /* ---- Verdict line ---- */ + const verdictColor = td.score100 >= 75 ? 'success' + : td.score100 >= 55 ? 'warning' + : 'danger'; + const verdictText = td.score100 >= 75 ? 'Org is in good shape' + : td.score100 >= 55 ? 'Moderate concerns' + : 'Needs attention'; + + const verdictHtml = ` +
+
${td.grade}
+
Health Score ${td.score100}/100
+
${verdictText}
+
`; + + /* ---- 6 metric tiles ---- */ + function metric(value, label, icon, status) { + return `
+
+
${value}
+
${label}
+
`; + } + + const vulnStatus = ch.total === 0 ? 'good' : (ch.critical > 0 ? 'bad' : 'warn'); + const eolStatus = eol.eolCount === 0 ? 'good' : (eol.eolCount > 10 ? 'bad' : 'warn'); + const licStatus = lic.highRisk === 0 ? 'good' : 'warn'; + const driftStatus = drift.buckets.major.total === 0 ? 'good' : (drift.buckets.major.total > 20 ? 'bad' : 'warn'); + const hygStatus = ins.reposWithoutSbom > ins.totalRepos / 2 ? 'warn' : 'good'; + const dwellStatus = dwell === null ? 'neutral' : (dwell > 90 ? 'bad' : (dwell > 30 ? 'warn' : 'good')); + + const metricsHtml = ` +
+ ${metric(ins.totalRepos, 'Repositories', 'fas fa-database', hygStatus)} + ${metric(ch.total, 'C+H Vulns', 'fas fa-shield-alt', vulnStatus)} + ${metric(eol.eolCount, 'EOL Components', 'fas fa-hourglass-end', eolStatus)} + ${metric(lic.highRisk, 'High-Risk Licenses', 'fas fa-balance-scale', licStatus)} + ${metric(drift.buckets.major.total, 'Major Drift', 'fas fa-code-branch', driftStatus)} + ${metric(dwell !== null ? dwell + 'd' : '--', 'CVE Dwell (median)', 'fas fa-clock', dwellStatus)} +
`; + + /* ---- Concerns line ---- */ + const concerns = []; + if (ch.critical > 0) concerns.push(`${ch.critical} crit vulns`); + if (sc.malwareCount > 0) concerns.push(`${sc.malwareCount} malware`); + if (eol.eolCount > 5) concerns.push(`${eol.eolCount} EOL`); + if (lic.highRisk > 3) concerns.push(`${lic.highRisk} high-risk licenses`); + if (sc.depConfusionCount > 0) concerns.push(`${sc.depConfusionCount} dep confusion`); + if (dwell !== null && dwell > 90) concerns.push(`CVE dwell ${dwell}d`); + + const concernsHtml = concerns.length > 0 + ? `
+
Top Concerns
+
${concerns.map(c => `${esc(c)}`).join('')}
+
` + : `
+
No major concerns identified
+
`; + + safe(content, verdictHtml + metricsHtml + concernsHtml); + } + +})(); From ae93b9fdbffdd957849bf6283fa2985bddfda786 Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:12:18 +0530 Subject: [PATCH 04/19] =?UTF-8?q?feat:=20add=20AI=20Insights=20dashboard?= =?UTF-8?q?=20(insights-ai)=20=E2=80=94=20Chrome=20Gemini=20Nano-powered?= =?UTF-8?q?=20executive=20analysis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uses Chrome's built-in Prompt API (window.ai.languageModel) to generate natural-language executive briefs from SBOM data. Four analysis modes: - Executive Summary — 2-3 paragraph CISO-facing overview - Risk Deep-Dive — prioritized risk identification with severity context - Recommendations — actionable, data-backed remediation steps - M&A Due Diligence — acquisition-target assessment with deal recommendation Design: - Compact KPI strip always visible - 4 mode-selector pills trigger on-device AI generation - Streaming output with typing cursor - Graceful fallback when AI API unavailable - All processing on-device — zero data leaves the browser - Nav links added across all insight pages for easy access --- insights-ai.html | 207 +++++++++++++++++++++ insights.html | 1 + insights2.html | 185 +++++++++++++++++++ insights3.html | 366 ++++++++++++++++++------------------ insights4.html | 400 ++++++++++++++++++++-------------------- insights5.html | 400 ++++++++++++++++++++-------------------- js/insights-ai.js | 428 +++++++++++++++++++++++++++++++++++++++++++ js/insights2-page.js | 197 ++++++++++++++++++++ 8 files changed, 1604 insertions(+), 580 deletions(-) create mode 100644 insights-ai.html create mode 100644 insights2.html create mode 100644 js/insights-ai.js create mode 100644 js/insights2-page.js diff --git a/insights-ai.html b/insights-ai.html new file mode 100644 index 0000000..dd2127b --- /dev/null +++ b/insights-ai.html @@ -0,0 +1,207 @@ + + + + + + SBOM Play — AI Insights + + + + + + + + + + + Skip to content + + +
+
+

AI Insights

+
Natural-language analysis powered by Chrome built-in AI (Gemini Nano)
+
+ +
+
+ + Checking AI availability... +
+
+ +
+ +
+ +
+ No analysis data found. Run a scan first. +
+ +

Loading data…

+
+
+ +
+
© Cyfinoid Research. · AI analysis runs entirely on-device — no data leaves your browser.
+
+ + + + + + + + + + + diff --git a/insights.html b/insights.html index 28d5956..e7ea5f5 100644 --- a/insights.html +++ b/insights.html @@ -36,6 +36,7 @@ Audit Findings Insights + AI Deps Repos Authors diff --git a/insights2.html b/insights2.html new file mode 100644 index 0000000..78d1330 --- /dev/null +++ b/insights2.html @@ -0,0 +1,185 @@ + 1| + 2| + 3| + 4| + 5| + 6| SBOM Play — Executive Pulse + 7| + 8| + 9| + 10| + 11| + 12| + 13| + 14| + 118| + 119| + 120| Skip to content + 121| + 149| + 150|
+ 151|

Executive Pulse

+ 152|

At-a-glance health assessment for decision-makers

+ 153| + 154|
+ 155| + 158|
+ 159| + 160|
+ 161| No analysis data found. Run a scan first. + 162|
+ 163| + 164|
+ 165|
Loading...

Assessing org health…

+ 166|
+ 167| + 168|
+ 169|
© Cyfinoid Research. All rights reserved.
+ 170|
+ 171| + 172| + 173| + 174| + 175| + 176| + 177| + 178| + 179| + 180| + 181| + 182| \ No newline at end of file diff --git a/insights3.html b/insights3.html index 151170a..51e504e 100644 --- a/insights3.html +++ b/insights3.html @@ -1,182 +1,184 @@ - - - - - - SBOM Play — Risk Portfolio - - - - - - - - - - - Skip to content - - -
-

Risk Portfolio

-

Risk-domain segmentation for due-diligence reviews

- -
- -
- -
- No analysis data found. Run a scan first. -
- -

Assessing risk portfolio…

-
-
- -
-
© Cyfinoid Research.
-
- - - - - - - - - - - + 1| + 2| + 3| + 4| + 5| + 6| SBOM Play — Risk Portfolio + 7| + 8| + 9| + 10| + 11| + 12| + 13| + 14| + 119| + 120| + 121| Skip to content + 122| + 150| + 151|
+ 152|

Risk Portfolio

+ 153|

Risk-domain segmentation for due-diligence reviews

+ 154| + 155|
+ 156| + 159|
+ 160| + 161|
+ 162| No analysis data found. Run a scan first. + 163|
+ 164| + 165|

Assessing risk portfolio…

+ 166|
+ 167|
+ 168| + 169|
+ 170|
© Cyfinoid Research.
+ 171|
+ 172| + 173| + 174| + 175| + 176| + 177| + 178| + 179| + 180| + 181| + 182| + 183| \ No newline at end of file diff --git a/insights4.html b/insights4.html index 839b5fc..df91ef9 100644 --- a/insights4.html +++ b/insights4.html @@ -1,199 +1,201 @@ - - - - - - SBOM Play — Org Report Card - - - - - - - - - - - Skip to content - - -
-
-

Org Health Report Card

-
-
-
- -
- -
- -
- No analysis data found. Run a scan first. -
- -

Preparing report card…

-
-
- -
-
© Cyfinoid Research.
-
- - - - - - - - - - - + 1| + 2| + 3| + 4| + 5| + 6| SBOM Play — Org Report Card + 7| + 8| + 9| + 10| + 11| + 12| + 13| + 14| + 133| + 134| + 135| Skip to content + 136| + 164| + 165|
+ 166|
+ 167|

Org Health Report Card

+ 168|
+ 169|
+ 170|
+ 171| + 172|
+ 173| + 176|
+ 177| + 178|
+ 179| No analysis data found. Run a scan first. + 180|
+ 181| + 182|

Preparing report card…

+ 183|
+ 184|
+ 185| + 186|
+ 187|
© Cyfinoid Research.
+ 188|
+ 189| + 190| + 191| + 192| + 193| + 194| + 195| + 196| + 197| + 198| + 199| + 200| \ No newline at end of file diff --git a/insights5.html b/insights5.html index 3895f65..437ae8d 100644 --- a/insights5.html +++ b/insights5.html @@ -1,199 +1,201 @@ - - - - - - SBOM Play — Snapshot - - - - - - - - - - - Skip to content - - -
-
- -
- -
- No analysis data found. Run a scan first. -
- -

Taking snapshot…

-
-
- -
-
© Cyfinoid Research.
-
- - - - - - - - - - - + 1| + 2| + 3| + 4| + 5| + 6| SBOM Play — Snapshot + 7| + 8| + 9| + 10| + 11| + 12| + 13| + 14| + 142| + 143| + 144| Skip to content + 145| + 170| + 171|
+ 172|
+ 173| + 176|
+ 177| + 178|
+ 179| No analysis data found. Run a scan first. + 180|
+ 181| + 182|

Taking snapshot…

+ 183|
+ 184|
+ 185| + 186|
+ 187|
© Cyfinoid Research.
+ 188|
+ 189| + 190| + 191| + 192| + 193| + 194| + 195| + 196| + 197| + 198| + 199| + 200| \ No newline at end of file diff --git a/js/insights-ai.js b/js/insights-ai.js new file mode 100644 index 0000000..0023725 --- /dev/null +++ b/js/insights-ai.js @@ -0,0 +1,428 @@ +/** + * AI Insights (insights-ai.js) — natural-language executive analysis + * using Chrome's built-in Gemini Nano (Prompt API). + * + * All AI processing happens on-device — no data ever leaves the browser. + * Falls back gracefully if the API is not available. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + const statusDot = document.getElementById('aiStatusDot'); + const statusTxt = document.getElementById('aiStatusText'); + + /* ---- State ---- */ + let currentInsights = null; + let aiCapabilities = null; // null = unavailable + let abortController = null; + + /* ---- Check AI availability ---- */ + async function checkAi() { + try { + if (window.ai && window.ai.languageModel) { + const caps = await window.ai.languageModel.capabilities(); + aiCapabilities = caps; + if (caps.available === 'readily') { + statusDot.className = 'dot ready'; + statusTxt.textContent = 'Gemini Nano ready'; + return true; + } else if (caps.available === 'after-download') { + statusDot.className = 'dot downloading'; + statusTxt.textContent = 'Gemini Nano — download needed (click generate to start)'; + return true; + } else { + statusDot.className = 'dot unavailable'; + statusTxt.textContent = 'Gemini Nano not available on this browser'; + return false; + } + } else { + statusDot.className = 'dot unavailable'; + statusTxt.textContent = 'Chrome Prompt API not found'; + return false; + } + } catch (e) { + console.warn('AI check failed:', e); + statusDot.className = 'dot unavailable'; + statusTxt.textContent = 'AI unavailable'; + return false; + } + } + + /* ---- Bootstrap analysis ---- */ + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('AI: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + currentInsights = Agg.buildInsights(data.data); + renderMetrics(currentInsights); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + await checkAi(); + await loadAnalysesList(); + + /* ---- Build compact data for AI ---- */ + function buildAiContext(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const dr = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const hyg = ins.repoHygiene; + const va = ins.vulnAgeStats; + const dw = va.directDwellMedian; + const age = ins.ageStats; + + const activeRepos = (hyg.activityBuckets['Last 30 days'] || 0) + + (hyg.activityBuckets['30-90 days'] || 0) + + (hyg.activityBuckets['90-180 days'] || 0); + + return { + overview: { + repos: ins.totalRepos, + reposWithSbom: ins.reposWithSbom, + deps: ins.totalDeps, + directDeps: ins.directCount, + transitiveDeps: ins.transitiveCount, + languages: ins.languageStats.slice(0, 5).map(l => l.language) + }, + security: { + critVulns: ch.critical, + highVulns: ch.high, + totalVulns: ch.total, + cveDwellDays: dw, + malwareAlerts: sc.malwareCount, + depConfusion: sc.depConfusionCount + }, + maintenance: { + techDebtGrade: td.grade, + techDebtScore: td.score100, + eolCount: eol.eolCount, + eosCount: eol.eosCount, + majorDrift: dr.buckets.major.total, + driftCoverage: dr.coveragePct, + oldDepsPct: age.coveragePct > 0 + ? Math.round(age.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0) / ins.totalDeps * 100) + : 0 + }, + compliance: { + highRiskLicenses: lic.highRisk, + copyleftDirect: lic.copyleft.direct, + copyleftTransitive: lic.copyleft.transitive, + unknownLicenses: lic.unknown.total, + unpinnedActions: sc.unpinnedActions + }, + hygiene: { + activeRepos, + archivedRepos: hyg.archived, + noSbomRepos: hyg.noSbom, + avgGrade: Object.entries(hyg.gradeDistribution) + .reduce((s, [g, c]) => s + ({ A: 4, B: 3, C: 2, D: 1, F: 0 }[g] || 0) * c, 0) + / (ins.totalRepos || 1) + } + }; + } + + /* ---- Format prompt ---- */ + function formatDataForPrompt(ctx) { + return JSON.stringify(ctx, null, 1); + } + + /* ---- AI generation ---- */ + const MODES = { + executive: { + label: 'Executive Summary', + icon: 'fas fa-file-lines', + system: 'You are an expert cybersecurity advisor writing a concise executive brief for a CISO. Use clear, plain language. Avoid jargon. Be direct about risks but constructive in tone. Maximum 250 words.', + prompt: (data) => `Analyze this SBOM org health data and write a 2-3 paragraph executive summary. + +DATA: +${data} + +Cover: 1) Overall health assessment 2) Top 2-3 risks that need attention 3) One sentence of encouragement if things look good or a call to action if they don't.` + }, + risks: { + label: 'Risk Deep-Dive', + icon: 'fas fa-exclamation-triangle', + system: 'You are a risk analyst specializing in software supply-chain security. Be specific, reference the numbers, and prioritize by severity. Maximum 200 words.', + prompt: (data) => `Analyze these SBOM risk indicators and provide a focused risk assessment. + +DATA: +${data} + +Identify: 1) The single biggest risk and why 2) 2-3 secondary risks ranked by severity 3) Which risks are urgent vs which can be monitored. Be specific about counts and thresholds.` + }, + recommendations: { + label: 'Recommendations', + icon: 'fas fa-list-check', + system: 'You are a remediation advisor. Give actionable, prioritized recommendations. Each recommendation must be specific and reference the data. Maximum 250 words.', + prompt: (data) => `Based on this SBOM org health data, provide prioritized remediation recommendations. + +DATA: +${data} + +Give 3-5 recommendations ordered by impact. For each: what to do, why (reference the data), and the expected outcome. Use bullet points for readability.` + }, + ma: { + label: 'M&A Due Diligence', + icon: 'fas fa-handshake', + system: 'You are an M&A technical due diligence analyst. Assess the target organization\'s software supply-chain health for an acquisition context. Be balanced — note both strengths and liabilities. Maximum 250 words.', + prompt: (data) => `Assess this organization's software supply-chain posture from an M&A due diligence perspective. + +DATA: +${data} + +Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) Key liabilities being inherited (be specific) 3) Strengths that reduce risk 4) Estimated remediation effort (minimal/moderate/significant) 5) Deal recommendation — proceed as-is, proceed with conditions, or flag for deeper review.` + } + }; + + async function generateAi(modeKey) { + if (!currentInsights || !aiCapabilities) return; + + // Abort previous + if (abortController) { + abortController.abort(); + abortController = null; + } + + const mode = MODES[modeKey]; + if (!mode) return; + + const output = document.getElementById('aiOutput'); + const btns = document.querySelectorAll('.ai-mode-btn'); + + // Disable buttons, show loading + btns.forEach(b => b.disabled = true); + document.querySelectorAll('.ai-mode-btn').forEach(b => { + b.classList.toggle('active', b.dataset.mode === modeKey); + }); + + // Show skeleton + safe(output, `
+
+
+
`); + + try { + // Need to download? trigger first + if (aiCapabilities.available === 'after-download') { + safe(output, `
+
+

Downloading Gemini Nano model… (one-time, may take a minute)

+
`); + } + + const session = await window.ai.languageModel.create({ + systemPrompt: mode.system, + temperature: 0.3, + topK: 20 + }); + + const ctx = buildAiContext(currentInsights); + const data = formatDataForPrompt(ctx); + const userPrompt = mode.prompt(data); + + // Use streaming for progressive display + const stream = await session.promptStreaming(userPrompt); + + // Mark as no longer empty + output.classList.remove('empty'); + + let fullText = ''; + const responseDiv = document.createElement('div'); + responseDiv.className = 'ai-response'; + safe(output, ''); + output.appendChild(responseDiv); + + // Add mode label + const modeLabel = document.createElement('h4'); + modeLabel.innerHTML = `${esc(mode.label)}`; + responseDiv.appendChild(modeLabel); + + const contentDiv = document.createElement('div'); + contentDiv.id = 'aiResponseContent'; + responseDiv.appendChild(contentDiv); + + for await (const chunk of stream) { + fullText = chunk; + // Basic markdown-like rendering + contentDiv.innerHTML = renderAiText(fullText) + ''; + } + + // Final render (no cursor) + contentDiv.innerHTML = renderAiText(fullText); + + session.destroy(); + } catch (err) { + if (err.name === 'AbortError' || err.message?.includes('abort')) { + safe(output, `
Generation cancelled.
`); + } else { + console.error('AI generation failed:', err); + safe(output, `
+ +

AI analysis failed: ${esc(err.message || 'Unknown error')}

+ +
`); + } + } finally { + btns.forEach(b => b.disabled = false); + } + } + + /* ---- Simple markdown-like renderer ---- */ + function renderAiText(text) { + if (!text) return ''; + let html = esc(text); + + // Headings: ### text or ## text + html = html.replace(/^### (.+)$/gm, '
$1
'); + html = html.replace(/^## (.+)$/gm, '
$1
'); + + // Bold + html = html.replace(/\*\*(.+?)\*\*/g, '$1'); + + // Bullet lists + html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); + html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); + + // Numbered lists + html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); + + // Paragraphs — double newlines + html = html.replace(/\n\n+/g, '

    '); + html = html.replace(/^(.+)$/gm, (m) => { + if (m.startsWith('<') || m.startsWith('')) return m; + return m; + }); + + // Wrap loose text in

    + if (!html.startsWith('<')) { + html = '

    ' + html + '

    '; + } + html = html.replace(/<\/p>\s*

    /g, '

    '); + + return html; + } + + /* ---- Render metrics + AI controls ---- */ + function renderMetrics(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const eol = ins.eolStats; + + const gradeColor = td.score100 >= 75 ? 'var(--color-green)' : td.score100 >= 55 ? 'var(--color-yellow)' : 'var(--color-red)'; + + const kpiHtml = ` +

    +
    ${ins.totalRepos}
    Repos
    +
    ${ins.totalDeps}
    Deps
    +
    ${ch.total}
    C+H Vulns
    +
    ${eol.eolCount}
    EOL
    +
    ${td.grade}
    Grade
    +
    ${td.score100}
    Health
    +
    `; + + const aiAvailable = aiCapabilities && aiCapabilities.available !== 'no'; + + const modeBtns = Object.entries(MODES).map(([key, m]) => + `` + ).join(''); + + const controlsHtml = aiAvailable + ? `
    ${modeBtns}
    ` + : `
    + + AI analysis requires Chrome 128+ with chrome://flags/#prompt-api-for-gemini-nano enabled. +
    The deterministic dashboards (Pulse, Portfolio, Report, Snapshot) work without AI. +
    `; + + const outputHtml = `
    +
    +
    +
    Select an analysis type above to generate AI insights
    +
    +
    `; + + const detectNotice = aiAvailable + ? `
    Analysis runs entirely on-device via Gemini Nano — zero data leaves your browser.
    ` + : ''; + + safe(content, kpiHtml + controlsHtml + outputHtml + detectNotice); + + // Wire up custom events + const output = document.getElementById('aiOutput'); + output.addEventListener('generate', (e) => { + generateAi(e.detail.mode); + }); + output.addEventListener('retry', () => { + const active = document.querySelector('.ai-mode-btn.active'); + if (active) generateAi(active.dataset.mode); + }); + } + +})(); diff --git a/js/insights2-page.js b/js/insights2-page.js new file mode 100644 index 0000000..29ed804 --- /dev/null +++ b/js/insights2-page.js @@ -0,0 +1,197 @@ +/** + * Executive Pulse (insights2-page.js) — CISO / M&A one-glance dashboard. + * Design: giant health grade + 6 vital-sign cards + risk bullets. + * No charts, no tables — pure signal. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + + /* ------------------------------------------------------------------ */ + /* Bootstrap */ + /* ------------------------------------------------------------------ */ + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('Pulse: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + renderPulse(Agg.buildInsights(data.data)); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + await loadAnalysesList(); + + /* ------------------------------------------------------------------ */ + /* Render */ + /* ------------------------------------------------------------------ */ + function renderPulse(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const drift = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const dwell = ins.vulnAgeStats.directDwellMedian; + + /* ---- hero grade ---- */ + const gradeClass = 'grade-' + td.grade.toLowerCase(); + const gradeSummary = td.score100 >= 75 ? 'Healthy' + : td.score100 >= 55 ? 'Fair' + : td.score100 >= 35 ? 'Concerning' + : 'At Risk'; + + const heroHtml = ` +
    +
    ${td.grade}
    +
    ${gradeSummary}
    +
    Health Score ${td.score100}/100
    +
    `; + + /* ---- vital signs ---- */ + const vulnColor = ch.total === 0 ? 'epulse-status-good' : (ch.critical > 0 ? 'epulse-status-bad' : 'epulse-status-warn'); + const eolColor = eol.eolCount === 0 ? 'epulse-status-good' : 'epulse-status-bad'; + const licenseColor = lic.highRisk === 0 ? 'epulse-status-good' : 'epulse-status-warn'; + const driftColor = drift.buckets.major.total === 0 ? 'epulse-status-good' : 'epulse-status-warn'; + const dwellColor = dwell === null ? 'epulse-status-muted' : (dwell > 90 ? 'epulse-status-bad' : (dwell > 30 ? 'epulse-status-warn' : 'epulse-status-good')); + const reposColor = ins.reposWithoutSbom > ins.totalRepos / 2 ? 'epulse-status-warn' : 'epulse-status-good'; + + function vital(icon, value, label, colorClass, sub) { + return `
    +
    +
    ${value}
    +
    ${label}
    + ${sub ? `
    ${sub}
    ` : ''} +
    `; + } + + const vitalHtml = ` +
    + ${vital('fas fa-shield-alt', ch.total, 'Crit + High Vulns', vulnColor, ch.critical > 0 ? `${ch.critical} crit, ${ch.high} high` : 'None')} + ${vital('fas fa-boxes', ins.totalDeps, 'Dependencies', 'epulse-status-muted', `${ins.directCount} direct, ${ins.transitiveCount} transitive`)} + ${vital('fas fa-hourglass-end', eol.eolCount, 'EOL Components', eolColor, `${eol.eosCount} end-of-support`)} + ${vital('fas fa-balance-scale', lic.highRisk, 'High-Risk Licenses', licenseColor, `${lic.copyleft.total} copyleft`)} + ${vital('fas fa-code-branch', drift.coveragePct + '%', 'Version Drift Coverage', driftColor, `${drift.buckets.major.total} major lagging`)} + ${vital('fas fa-clock', dwell !== null ? dwell + 'd' : '--', 'CVE Dwell (median)', dwellColor, 'direct-dep vulns')} +
    +
    + ${vital('fas fa-database', ins.totalRepos, 'Repositories Analyzed', reposColor, `${ins.reposWithSbom} with SBOM`)} + ${vital('fas fa-heartbeat', td.grade, 'Tech-Health Grade', `epulse-status-${td.score100 >= 55 ? 'good' : 'bad'}`, `score ${td.score100}/100`)} +
    `; + + /* ---- "Needs Attention" risks ---- */ + const risks = []; + if (ch.total > 0) { + risks.push({ icon: 'fas fa-bug text-danger', title: `${ch.total} critical/high vulnerabilities found`, detail: `${ch.critical} critical, ${ch.high} high — prioritize patching` }); + } + if (eol.eolCount > 0) { + risks.push({ icon: 'fas fa-hourglass-end text-warning', title: `${eol.eolCount} components past end-of-life`, detail: `${eol.eosCount} also end-of-support — upgrade or replace` }); + } + if (lic.highRisk > 0) { + risks.push({ icon: 'fas fa-gavel text-warning', title: `${lic.highRisk} high-risk license obligations`, detail: `${lic.copyleft.direct} direct, ${lic.copyleft.transitive} transitive — legal review recommended` }); + } + if (sc.malwareCount > 0) { + risks.push({ icon: 'fas fa-skull-crossbones text-danger', title: `${sc.malwareCount} malware alerts`, detail: 'Malicious packages detected — investigate immediately' }); + } + if (sc.depConfusionCount > 0) { + risks.push({ icon: 'fas fa-question-circle text-warning', title: `${sc.depConfusionCount} dependency confusion risks`, detail: 'Packages not found on registry — potential supply-chain attack vector' }); + } + if (sc.unpinnedActions > 0) { + risks.push({ icon: 'fas fa-code-branch text-warning', title: `${sc.unpinnedActions} unpinned GitHub Actions`, detail: 'Mutable refs in CI pipeline — pin to immutable commit SHAs' }); + } + if (drift.buckets.major.total > 20) { + risks.push({ icon: 'fas fa-arrow-up text-warning', title: `${drift.buckets.major.total} dependencies with major updates available`, detail: 'Version drift indicates stale dependencies — schedule update cycle' }); + } + if (dwell !== null && dwell > 90) { + risks.push({ icon: 'fas fa-clock text-danger', title: `CVE dwell time at ${dwell} days median`, detail: 'Critical/high vulns sit open too long — accelerate patch SLA' }); + } + + /* ---- "On Track" highlights ---- */ + const clears = []; + if (ch.total === 0) clears.push('No critical or high vulnerabilities'); + if (eol.eolCount === 0) clears.push('No end-of-life components'); + if (lic.highRisk === 0) clears.push('No high-risk license obligations'); + if (sc.malwareCount === 0) clears.push('No malware advisories'); + if (sc.depConfusionCount === 0) clears.push('No dependency confusion risks'); + if (drift.buckets.major.total === 0 && drift.coveragePct >= 80) clears.push('Dependencies are up-to-date'); + if (dwell !== null && dwell <= 30) clears.push('Vulnerabilities patched promptly (≤30 days dwell)'); + if (ins.totalRepos > 0 && ins.reposWithoutSbom === 0) clears.push('All repositories have SBOMs'); + + const riskHtml = risks.length > 0 ? ` +

    Needs Attention

    +
    + ${risks.map(r => ` +
    +
    +
    ${esc(r.title)}${esc(r.detail)}
    +
    + `).join('')} +
    ` : ''; + + const clearHtml = clears.length > 0 ? ` +

    On Track

    +
    + ${clears.map(c => `
    ${esc(c)}
    `).join('')} +
    ` : ''; + + safe(content, heroHtml + vitalHtml + riskHtml + clearHtml); + } + +})(); From ca14265a6e1b1059f1b0f17cd1d01864cdbca5ea Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:24:41 +0530 Subject: [PATCH 05/19] =?UTF-8?q?feat:=20add=20AI=20Chat=20dashboard=20(in?= =?UTF-8?q?sights-chat)=20=E2=80=94=20conversational=20SBOM=20analyst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multi-turn chat interface powered by Chrome's Gemini Nano (Prompt API). Users can ask free-form questions about their SBOM analysis data and get natural-language answers grounded in the actual metrics. Key features: - Persistent AI session across multiple turns (conversation history) - Streaming responses with live cursor - 8 suggested questions as quick-start chips - Compact KPI strip always visible for reference - 'New conversation' button to reset context - Session auto-recreation on error - Warning at 25+ exchanges to start fresh - Gemini Nano availability detection with graceful fallback - Syncs analysis selector with other insight pages - All processing on-device — zero data leaves the browser --- insights-ai.html | 1 + insights-chat.html | 319 +++++++++++++++++++++++++ insights.html | 1 + insights3.html | 3 +- insights4.html | 3 +- insights5.html | 3 +- js/insights-chat.js | 570 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 897 insertions(+), 3 deletions(-) create mode 100644 insights-chat.html create mode 100644 js/insights-chat.js diff --git a/insights-ai.html b/insights-ai.html index dd2127b..6780a8c 100644 --- a/insights-ai.html +++ b/insights-ai.html @@ -155,6 +155,7 @@ Report Snapshot AI + Chat Deps Repos Settings diff --git a/insights-chat.html b/insights-chat.html new file mode 100644 index 0000000..cb04547 --- /dev/null +++ b/insights-chat.html @@ -0,0 +1,319 @@ + + + + + + SBOM Play — AI Chat + + + + + + + + + + + Skip to content + + +
    +
    + No analysis data found. Run a scan first. +
    +

    Loading data…

    +
    +
    + +
    +
    © Cyfinoid Research. · All AI processing runs on-device via Gemini Nano.
    +
    + + + + + + + + + + + diff --git a/insights.html b/insights.html index e7ea5f5..6ae3648 100644 --- a/insights.html +++ b/insights.html @@ -37,6 +37,7 @@ Findings Insights AI + Chat Deps Repos Authors diff --git a/insights3.html b/insights3.html index 51e504e..0cf2c0a 100644 --- a/insights3.html +++ b/insights3.html @@ -139,7 +139,8 @@ 139| Report 140| Snapshot AI - 141| Deps + 141| Chat + Deps 142| Repos 143| Authors 144| Settings diff --git a/insights4.html b/insights4.html index df91ef9..aba193a 100644 --- a/insights4.html +++ b/insights4.html @@ -153,7 +153,8 @@ 153| Report 154| Snapshot AI - 155| Deps + 155| Chat + Deps 156| Repos 157| Authors 158| Settings diff --git a/insights5.html b/insights5.html index 437ae8d..0b3e37e 100644 --- a/insights5.html +++ b/insights5.html @@ -160,7 +160,8 @@ 160| Report 161| Snapshot AI - 162| Deps + 162| Chat + Deps 163| Repos 164| Settings 165| About diff --git a/js/insights-chat.js b/js/insights-chat.js new file mode 100644 index 0000000..fa6f487 --- /dev/null +++ b/js/insights-chat.js @@ -0,0 +1,570 @@ +/** + * AI Chat (insights-chat.js) — conversational interface with Gemini Nano. + * Multi-turn chat where the AI has full access to your SBOM analysis data. + * All processing on-device — no data leaves your browser. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + + /* ---- State ---- */ + let currentInsights = null; + let aiSession = null; + let aiAvailable = false; + let aiDownloading = false; + let isGenerating = false; + let messageCount = 0; + const MAX_MESSAGES = 30; + + /* ---- Allow navigation to other insight pages ---- */ + const NAV_LINKS = { + 'Pulse': 'insights2.html', + 'Portfolio': 'insights3.html', + 'Report Card': 'insights4.html', + 'Snapshot': 'insights5.html', + 'AI Reports': 'insights-ai.html' + }; + + /* ---- Bootstrap ---- */ + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('Chat: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + destroySession(); + + const name = selector.value; + let data; + if (!name || name === '') { + data = await storageManager.getCombinedData(); + } else { + data = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!data || !data.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + currentInsights = Agg.buildInsights(data.data); + await initChat(); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + + /* ---- AI Availability ---- */ + async function checkAi() { + try { + if (window.ai && window.ai.languageModel) { + const caps = await window.ai.languageModel.capabilities(); + if (caps.available === 'readily') { + aiAvailable = true; + return 'ready'; + } else if (caps.available === 'after-download') { + aiAvailable = true; + aiDownloading = true; + return 'download'; + } else { + aiAvailable = false; + return 'unavailable'; + } + } + aiAvailable = false; + return 'unavailable'; + } catch (e) { + console.warn('Chat AI check:', e); + aiAvailable = false; + return 'unavailable'; + } + } + + /* ---- Build context data for AI ---- */ + function buildAiContext(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const dr = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const hyg = ins.repoHygiene; + const va = ins.vulnAgeStats; + const dw = va.directDwellMedian; + const age = ins.ageStats; + + const activeRepos = (hyg.activityBuckets['Last 30 days'] || 0) + + (hyg.activityBuckets['30-90 days'] || 0) + + (hyg.activityBuckets['90-180 days'] || 0); + + const oldDepsPct = ins.totalDeps > 0 + ? Math.round(age.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0) / ins.totalDeps * 100) + : 0; + + const avgGrade = ins.totalRepos > 0 + ? Object.entries(hyg.gradeDistribution) + .reduce((s, [g, c]) => s + ({ A: 4, B: 3, C: 2, D: 1, F: 0 }[g] || 0) * c, 0) / ins.totalRepos + : 0; + + const topLangs = ins.languageStats.slice(0, 5).map(l => `${l.language} (${l.count} refs)`).join(', '); + + // Build a clean, readable text summary for the AI + return `ORGANIZATION SBOM ANALYSIS SUMMARY +===================================== + +OVERVIEW +- Repositories analyzed: ${ins.totalRepos} (${ins.reposWithSbom} with SBOMs, ${ins.totalRepos - ins.reposWithSbom} without) +- Total dependencies: ${ins.totalDeps} (${ins.directCount} direct, ${ins.transitiveCount} transitive) +- Top languages: ${topLangs || 'N/A'} + +SECURITY +- Critical vulnerabilities: ${ch.critical} +- High vulnerabilities: ${ch.high} +- Total critical+high: ${ch.total} +- Direct-dep CVE dwell time (median): ${dw !== null ? dw + ' days' : 'N/A'} +- Malware advisories: ${sc.malwareCount} +- Dependency confusion risks: ${sc.depConfusionCount} + +MAINTENANCE & FRESHNESS +- Tech-Health Grade: ${td.grade} (score ${td.score100}/100) +- EOL components: ${eol.eolCount} +- End-of-support components: ${eol.eosCount} +- Dependencies with major updates available: ${dr.buckets.major.total} +- Version drift coverage: ${dr.coveragePct}% +- Dependencies over 2 years old: ${oldDepsPct}% + +LICENSE COMPLIANCE +- High-risk / copyleft licenses: ${lic.highRisk} (${lic.copyleft.direct} direct, ${lic.copyleft.transitive} transitive) +- Unknown licenses: ${lic.unknown.total} +- Unpinned GitHub Actions: ${sc.unpinnedActions} + +REPOSITORY HYGIENE +- Active repos (pushed within 6mo): ${activeRepos} +- Archived repos: ${hyg.archived} +- Average SBOM grade (A=4..F=0): ${avgGrade.toFixed(1)} +- SBOM quality distribution: A=${hyg.gradeDistribution.A || 0} B=${hyg.gradeDistribution.B || 0} C=${hyg.gradeDistribution.C || 0} D=${hyg.gradeDistribution.D || 0} F=${hyg.gradeDistribution.F || 0} + +TECH-DEBT COMPOSITION +- Overall health score: ${td.score100}/100 (Grade ${td.grade}) +- Component weights: Version Drift 30%, Vulnerabilities 30%, Package Age 15%, License Risk 10%, EOL Risk 10%, Repo Hygiene 5%`; + } + + /* ---- Session management ---- */ + async function createSession() { + destroySession(); + + if (!currentInsights || !aiAvailable) return null; + + const contextData = buildAiContext(currentInsights); + + const systemPrompt = `You are a supply-chain security analyst assistant. You have been given SBOM (Software Bill of Materials) analysis data for an organization. Your role is to help executives, CISO, and M&A professionals understand this data. + +RULES: +1. Answer based ONLY on the data provided below. If asked about something not in the data, say so honestly. +2. Use plain, clear language suitable for non-technical executives. +3. Reference specific numbers from the data when relevant (e.g., "There are 12 critical vulnerabilities"). +4. Be concise — aim for 2-3 paragraphs unless asked for detail. +5. When giving recommendations, be specific and actionable. +6. If the data shows no issues in an area, say so positively. +7. Do not make up statistics or claims not supported by the data. + +HERE IS THE ORGANIZATION'S SBOM ANALYSIS DATA: + +${contextData} + +Start each response by addressing what was asked. If someone asks "how are we doing?", give an overall assessment. If they ask about a specific area, focus on that area using the data.`; + + try { + // If download needed, trigger it + if (aiDownloading) { + aiSession = 'downloading'; // placeholder + } + + aiSession = await window.ai.languageModel.create({ + systemPrompt: systemPrompt, + temperature: 0.3, + topK: 20 + }); + messageCount = 0; + return aiSession; + } catch (err) { + console.error('Session creation failed:', err); + aiSession = null; + return null; + } + } + + function destroySession() { + if (aiSession && typeof aiSession !== 'string') { + try { aiSession.destroy(); } catch (e) { /* ignore */ } + } + aiSession = null; + messageCount = 0; + } + + /* ---- Chat UI ---- */ + async function initChat() { + const aiStatus = await checkAi(); + + let statusHtml = ''; + if (aiStatus === 'ready') { + statusHtml = ` Gemini Nano ready`; + } else if (aiStatus === 'download') { + statusHtml = ` Gemini Nano available (download on first message)`; + } else { + statusHtml = ` Gemini Nano not available`; + } + + const metrics = currentInsights ? buildMetricsHtml(currentInsights) : ''; + + const unavailableHtml = !aiAvailable ? ` +
    +
    +
    AI Chat Unavailable
    +

    Chrome's built-in Gemini Nano is not available on this browser. You need Chrome 128+ with chrome://flags/#prompt-api-for-gemini-nano enabled.

    + +
    ` : ''; + + const suggestedQuestions = [ + 'How is our org doing overall?', + 'What are our biggest security risks?', + 'Which vulnerabilities should we fix first?', + 'Give me an M&A due diligence summary', + 'How is our license compliance?', + 'What needs immediate attention?', + 'Are there any supply chain red flags?', + 'Which repos have the worst hygiene?' + ]; + + const chatHtml = ` +
    +

    SBOM Analyst Chat

    +
    Ask questions about your SBOM analysis — AI answers using your data
    +
    +
    ${statusHtml}
    +
    + + +
    +
    ${metrics}
    + ${unavailableHtml} +
    +
    +
    +
    +
    Ask about your SBOM data
    +

    Try one of the suggested questions below, or type your own.

    +
    +
    +
    + ${suggestedQuestions.map(q => + `${esc(q)}` + ).join('')} +
    +
    + + +
    +
    AI responses based on loaded SBOM analysis data · on-device processing
    +
    `; + + safe(content, chatHtml); + wireChatEvents(); + } + + /* ---- Compact metrics row ---- */ + function buildMetricsHtml(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const eol = ins.eolStats; + const lic = ins.licenseStats; + + return ` +
    ${ins.totalRepos}
    Repos
    +
    ${ins.totalDeps}
    Deps
    +
    ${ch.total}
    C+H Vulns
    +
    ${eol.eolCount}
    EOL
    +
    ${lic.highRisk}
    High-Risk Lic
    +
    ${td.grade}
    Grade
    + `; + } + + /* ---- Wire events ---- */ + function wireChatEvents() { + const input = document.getElementById('chatInput'); + const sendBtn = document.getElementById('chatSend'); + const newBtn = document.getElementById('btnNewChat'); + const msgArea = document.getElementById('chatMessages'); + + // Secondary selector + const sel2 = document.getElementById('analysisSelector2'); + if (sel2) { + sel2.addEventListener('change', () => { + // Sync main selector + for (const opt of selector.options) { + if (opt.value === sel2.value) { + selector.value = sel2.value; + break; + } + } + loadAnalysis(); + }); + } + + if (sendBtn) { + sendBtn.addEventListener('click', () => sendMessage()); + } + if (input) { + input.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + sendMessage(); + } + }); + } + if (newBtn) { + newBtn.addEventListener('click', () => startNewChat()); + } + + // Suggested questions + document.querySelectorAll('.chat-suggestion').forEach(el => { + el.addEventListener('click', () => { + const q = el.dataset.question; + if (q && input) { + input.value = q; + sendMessage(); + } + }); + }); + } + + /* ---- Send message ---- */ + async function sendMessage() { + const input = document.getElementById('chatInput'); + const sendBtn = document.getElementById('chatSend'); + const msgArea = document.getElementById('chatMessages'); + const empty = document.getElementById('chatEmpty'); + const text = input?.value.trim(); + + if (!text || isGenerating || !aiAvailable) return; + + // Reset suggest selection highlight + document.querySelectorAll('.chat-suggestion').forEach(el => el.style.opacity = '0.4'); + + // Ensure session exists + if (!aiSession || aiSession === 'downloading') { + // Show waiting + addSystemMessage('Initializing AI session...'); + const session = await createSession(); + if (!session) { + addSystemMessage('Failed to create AI session. Please try again.'); + return; + } + // Remove the system message + const sysMsg = document.getElementById('sys-init-msg'); + if (sysMsg) sysMsg.remove(); + } + + input.value = ''; + input.disabled = true; + sendBtn.disabled = true; + isGenerating = true; + + if (empty) empty.style.display = 'none'; + + // Add user message + addUserMessage(text); + + // Add AI placeholder + const msgDiv = document.createElement('div'); + msgDiv.className = 'chat-msg assistant'; + msgDiv.innerHTML = ` +
    +
    `; + msgArea.appendChild(msgDiv); + scrollToBottom(); + + const bubble = document.getElementById('aiResponse'); + + try { + const stream = await aiSession.promptStreaming(text); + let fullText = ''; + for await (const chunk of stream) { + fullText = chunk; + bubble.innerHTML = renderChatText(fullText) + ''; + scrollToBottom(); + } + bubble.innerHTML = renderChatText(fullText); + + messageCount++; + + // Warn if approaching limit + if (messageCount >= MAX_MESSAGES - 5) { + addSystemMessage(`Conversation getting long (${messageCount} exchanges). Consider starting a new conversation for best quality.`); + } + } catch (err) { + console.error('Chat error:', err); + if (err.name === 'AbortError' || err.message?.includes('abort')) { + bubble.innerHTML = 'Generation cancelled.'; + } else { + bubble.innerHTML = `Error: ${esc(err.message || 'Unknown')}`; + // Try to re-create session on error + destroySession(); + } + } + + input.disabled = false; + sendBtn.disabled = false; + isGenerating = false; + input.focus(); + scrollToBottom(); + + // Restore suggestion opacity + document.querySelectorAll('.chat-suggestion').forEach(el => el.style.opacity = ''); + } + + /* ---- Start new conversation ---- */ + async function startNewChat() { + if (isGenerating) return; + + const msgArea = document.getElementById('chatMessages'); + const empty = document.getElementById('chatEmpty'); + + // Clear messages + if (msgArea) { + while (msgArea.firstChild) msgArea.removeChild(msgArea.firstChild); + if (empty) { + empty.style.display = 'flex'; + msgArea.appendChild(empty); + } + } + + destroySession(); + + // Re-create session in background + if (aiAvailable) { + addSystemMessage('Starting new conversation...'); + const session = await createSession(); + if (session) { + const sysMsg = document.getElementById('sys-init-msg'); + if (sysMsg) sysMsg.remove(); + } + } + + document.getElementById('chatInput')?.focus(); + } + + /* ---- Message helpers ---- */ + function addUserMessage(text) { + const msgArea = document.getElementById('chatMessages'); + const div = document.createElement('div'); + div.className = 'chat-msg user'; + div.innerHTML = `
    ${esc(text)}
    `; + msgArea.appendChild(div); + scrollToBottom(); + } + + function addSystemMessage(text) { + const msgArea = document.getElementById('chatMessages'); + const div = document.createElement('div'); + div.className = 'chat-msg system'; + div.id = text.includes('Initializing') ? 'sys-init-msg' : ''; + div.innerHTML = `
    ${text}
    `; + msgArea.appendChild(div); + scrollToBottom(); + } + + function scrollToBottom() { + const msgArea = document.getElementById('chatMessages'); + if (msgArea) { + msgArea.scrollTop = msgArea.scrollHeight; + } + } + + /* ---- Text renderer ---- */ + function renderChatText(text) { + if (!text) return ''; + let html = esc(text); + + // Bold + html = html.replace(/\*\*(.+?)\*\*/g, '$1'); + + // Inline code + html = html.replace(/`([^`]+)`/g, '$1'); + + // Bullet lists + html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); + html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); + + // Numbered lists + html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); + + // Paragraphs + html = html.replace(/\n\n+/g, '

    '); + html = html.replace(/^(.+)$/gm, (m) => { + if (m.startsWith('<') || m.startsWith('')) return m; + return m; + }); + + if (!html.startsWith('<')) { + html = '

    ' + html + '

    '; + } + html = html.replace(/<\/p>\s*

    /g, '

    '); + + return html; + } + + /* ---- Start ---- */ + await loadAnalysesList(); + +})(); From 56cad87c385efc236beee21da21ece142791e9ba Mon Sep 17 00:00:00 2001 From: ai-anant Date: Mon, 27 Jul 2026 17:35:33 +0530 Subject: [PATCH 06/19] =?UTF-8?q?feat:=20add=20AI=20Agent=20(insights-agen?= =?UTF-8?q?t)=20=E2=80=94=20Gemini=20Nano=20queries=20SBOM=20data=20via=20?= =?UTF-8?q?tool-use?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Paradigm shift from pre-digested context to on-demand data access. The AI decides what data it needs and calls query_sbom() as a registered tool, like an analyst querying a database. Architecture: - Registers query_sbom() as a Prompt API tool with 12 data types - Agent loop: AI calls function → JS executes → returns results → AI continues - 12 queryable categories: overview, vulnerabilities, dependencies, repositories, licenses, eol, versionDrift, malware, techDebt, supplyChain, perRepo, hygiene, vulnAge - Each query returns structured JSON with human-readable summary - Tool calls shown in UI as log entries for transparency - Max 6 tool-use turns per response to prevent infinite loops - Graceful fallback if tools not supported in current Chrome - Streams final answer with typing cursor --- insights-agent.html | 117 +++++++ insights-ai.html | 1 + insights-chat.html | 1 + insights.html | 1 + insights3.html | 1 + insights4.html | 1 + insights5.html | 1 + js/insights-agent.js | 795 +++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 918 insertions(+) create mode 100644 insights-agent.html create mode 100644 js/insights-agent.js diff --git a/insights-agent.html b/insights-agent.html new file mode 100644 index 0000000..e174ca1 --- /dev/null +++ b/insights-agent.html @@ -0,0 +1,117 @@ + + + + + + SBOM Play — AI Agent + + + + + + + + + + + Skip to content +

    +
    +
    No analysis data found. Run a scan first.
    +

    Loading data…

    +
    +
    +
    © 2026 Cyfinoid Research. · On-device AI with built-in tool-use.
    + + + + + + + + + + diff --git a/insights-ai.html b/insights-ai.html index 6780a8c..db453ec 100644 --- a/insights-ai.html +++ b/insights-ai.html @@ -156,6 +156,7 @@ Snapshot AI Chat + Agent Deps Repos Settings diff --git a/insights-chat.html b/insights-chat.html index cb04547..37acaab 100644 --- a/insights-chat.html +++ b/insights-chat.html @@ -286,6 +286,7 @@ Snapshot AI Chat + Agent Deps Repos Settings diff --git a/insights.html b/insights.html index 6ae3648..6b15145 100644 --- a/insights.html +++ b/insights.html @@ -38,6 +38,7 @@ Insights AI Chat + Agent Deps Repos Authors diff --git a/insights3.html b/insights3.html index 0cf2c0a..29f64c4 100644 --- a/insights3.html +++ b/insights3.html @@ -140,6 +140,7 @@ 140| Snapshot AI 141| Chat + Agent Deps 142| Repos 143| Authors diff --git a/insights4.html b/insights4.html index aba193a..1e411b0 100644 --- a/insights4.html +++ b/insights4.html @@ -154,6 +154,7 @@ 154| Snapshot AI 155| Chat + Agent Deps 156| Repos 157| Authors diff --git a/insights5.html b/insights5.html index 0b3e37e..d61a0c9 100644 --- a/insights5.html +++ b/insights5.html @@ -161,6 +161,7 @@ 161| Snapshot AI 162| Chat + Agent Deps 163| Repos 164| Settings diff --git a/js/insights-agent.js b/js/insights-agent.js new file mode 100644 index 0000000..b018344 --- /dev/null +++ b/js/insights-agent.js @@ -0,0 +1,795 @@ +/** + * AI Agent (insights-agent.js) — tool-use pattern. + * Gemini Nano queries SBOM data on-demand via registered functions, + * like an analyst running database queries. All on-device. + * + * Architecture: + * User question → AI decides what data it needs → calls query_sbom() + * → JS executes query against in-memory data → returns results + * → AI synthesizes answer → User sees final response + * + * The AI requests data as needed rather than having everything dumped upfront. + */ +(async function () { + 'use strict'; + + const storageManager = window.storageManager || new StorageManager(); + if (!storageManager.initialized) await storageManager.init(); + + const esc = window.escapeHtml || (s => String(s)); + const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); + const Agg = window.InsightsAggregator; + + const selector = document.getElementById('analysisSelector'); + const content = document.getElementById('content'); + const loading = document.getElementById('loading'); + const noData = document.getElementById('noDataMessage'); + + /* ---- State ---- */ + let currentData = null; // raw data.data from IndexedDB + let currentIns = null; // InsightsAggregator.buildInsights() + let aiSession = null; + let aiAvailable = false; + let toolsSupport = false; + let isGenerating = false; + + /* ================================================================== */ + /* FUNCTION DECLARATIONS — exposed to the AI as callable tools */ + /* ================================================================== */ + + /** + * Each function: (args) => { data: ..., summary: "..." } + * The AI calls these via query_sbom({type, filter, limit}) + */ + const DATA_QUERIES = { + /** High-level org overview */ + overview() { + if (!currentIns) return { data: null, summary: 'No data loaded.' }; + const ins = currentIns; + return { + summary: `${ins.totalRepos} repos (${ins.reposWithSbom} with SBOMs), ${ins.totalDeps} total deps (${ins.directCount} direct, ${ins.transitiveCount} transitive)`, + data: { + totalRepos: ins.totalRepos, + reposWithSbom: ins.reposWithSbom, + reposWithoutSbom: ins.totalRepos - ins.reposWithSbom, + totalDeps: ins.totalDeps, + directDeps: ins.directCount, + transitiveDeps: ins.transitiveCount, + topLanguages: ins.languageStats.slice(0, 8).map(l => ({ language: l.language, refs: l.count })) + } + }; + }, + + /** Vulnerabilities with optional severity filter */ + vulnerabilities(args) { + if (!currentData) return { data: null, summary: 'No vulnerability data.' }; + const va = currentData.vulnerabilityAnalysis; + if (!va) return { data: null, summary: 'No vulnerability analysis found.' }; + const filter = (args?.filter || '').toLowerCase(); + const limit = args?.limit || 50; + let deps = va.vulnerableDependencies || []; + let totalCrit = va.criticalVulnerabilities || 0; + let totalHigh = va.highVulnerabilities || 0; + let totalMed = va.mediumVulnerabilities || 0; + + // Build expanded list with vuln details + let items = []; + for (const vDep of deps) { + for (const v of (vDep.vulnerabilities || [])) { + const sev = (v.severity || '').toUpperCase(); + if (filter && !sev.includes(filter) && !(v.id || '').toLowerCase().includes(filter)) continue; + items.push({ + package: vDep.name, + version: vDep.version, + vulnId: v.id || 'N/A', + severity: sev, + published: v.published || null, + source: v.source || 'OSV', + type: v.kind || 'vulnerability' + }); + } + } + + // Sort: critical first, then high + const order = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, MODERATE: 3, LOW: 4 }; + items.sort((a, b) => (order[a.severity] ?? 99) - (order[b.severity] ?? 99)); + + const summary = `${totalCrit} critical, ${totalHigh} high, ${totalMed} medium vulnerabilities across ${deps.length} packages`; + return { summary, data: { totalCrit, totalHigh, totalMed, totalPackages: deps.length, items: items.slice(0, limit) } }; + }, + + /** Dependencies search */ + dependencies(args) { + if (!currentData) return { data: null, summary: 'No dependency data.' }; + const allDeps = currentData.allDependencies || []; + const search = (args?.search || '').toLowerCase(); + const limit = args?.limit || 20; + let filtered = allDeps; + if (search) filtered = allDeps.filter(d => (d.name || '').toLowerCase().includes(search)); + + const items = filtered.slice(0, limit).map(d => ({ + name: d.name, + version: d.version, + type: d.type || 'unknown', + license: d.licenseFull || d.license || 'unknown', + hasVuln: !!(d.vulnerability || (currentData.vulnerabilityAnalysis?.vulnerableDependencies || []).some(vd => vd.name === d.name)) + })); + + return { + summary: `${allDeps.length} total dependencies${search ? `, ${filtered.length} matching "${search}"` : ''}`, + data: { total: allDeps.length, matched: filtered.length, items } + }; + }, + + /** Repositories list */ + repositories(args) { + if (!currentData) return { data: null, summary: 'No repository data.' }; + const repos = currentData.allRepositories || []; + const filter = (args?.filter || '').toLowerCase(); + let filtered = repos; + if (filter === 'archived') filtered = repos.filter(r => r.archived); + else if (filter === 'active') filtered = repos.filter(r => !r.archived); + else if (filter === 'no-sbom') filtered = repos.filter(r => !r.qualityAssessment); + + const items = filtered.map(r => ({ + name: r.name, + owner: r.owner, + archived: !!r.archived, + totalDeps: r.totalDependencies || r.dependencies?.length || 0, + grade: r.qualityAssessment?.grade || null, + pushedAt: r.pushedAt || null + })); + + return { + summary: `${repos.length} repos (${items.length} after filter)`, + data: { total: repos.length, filtered: items.length, items } + }; + }, + + /** License breakdown */ + licenses() { + if (!currentIns) return { data: null, summary: 'No license data.' }; + const l = currentIns.licenseStats; + return { + summary: `${l.highRisk} high-risk, ${l.permissive.total} permissive, ${l.unknown.total} unknown`, + data: { + highRisk: l.highRisk, + copyleft: l.copyleft, + permissive: l.permissive, + unknown: l.unknown, + conflicts: l.conflicts?.length || 0 + } + }; + }, + + /** EOL/EOS components */ + eol(args) { + if (!currentIns) return { data: null, summary: 'No EOL data.' }; + const eol = currentIns.eolStats; + const limit = args?.limit || 30; + const items = eol.eolList.slice(0, limit).map(e => ({ + name: e.name, + version: e.version, + isEol: e.isEol, + isEos: e.isEos, + source: e.source, + isDirect: e.isDirect + })); + return { + summary: `${eol.eolCount} EOL, ${eol.eosCount} EOS components`, + data: { eolCount: eol.eolCount, eosCount: eol.eosCount, items } + }; + }, + + /** Version drift */ + versionDrift(args) { + if (!currentIns) return { data: null, summary: 'No drift data.' }; + const drift = currentIns.driftStats; + const type = (args?.type || '').toLowerCase(); + const limit = args?.limit || 20; + let items = drift.lagging; + if (type === 'major') items = items.filter(i => i.type === 'major'); + else if (type === 'minor') items = items.filter(i => i.type === 'minor'); + + return { + summary: `${drift.buckets.major.total} major, ${drift.buckets.minor.total} minor lagging (${drift.coveragePct}% coverage)`, + data: { + major: drift.buckets.major, + minor: drift.buckets.minor, + current: drift.buckets.current, + coveragePct: drift.coveragePct, + items: items.slice(0, limit) + } + }; + }, + + /** Malware alerts */ + malware() { + if (!currentIns) return { data: null, summary: 'No malware data.' }; + const sc = currentIns.supplyChain; + return { + summary: `${sc.malwareCount} malware advisories, ${sc.depConfusionCount} dependency confusion risks`, + data: { malwareCount: sc.malwareCount, depConfusionCount: sc.depConfusionCount } + }; + }, + + /** Tech debt breakdown */ + techDebt() { + if (!currentIns) return { data: null, summary: 'No tech debt data.' }; + const td = currentIns.techDebt; + return { + summary: `Grade ${td.grade}, score ${td.score100}/100`, + data: { + grade: td.grade, + score100: td.score100, + components: Object.entries(td.components).map(([k, v]) => ({ name: k, debt: v.debt, weight: v.weight })) + } + }; + }, + + /** Supply chain risks */ + supplyChain() { + if (!currentIns) return { data: null, summary: 'No supply chain data.' }; + const sc = currentIns.supplyChain; + return { + summary: `${sc.malwareCount} malware, ${sc.depConfusionCount} dep confusion, ${sc.unpinnedActions} unpinned actions, ${sc.deadRepos} dead repos`, + data: { + malwareCount: sc.malwareCount, + depConfusionCount: sc.depConfusionCount, + unpinnedActions: sc.unpinnedActions, + totalActions: sc.totalActions, + deadRepos: sc.deadRepos + } + }; + }, + + /** Per-repository drill-down */ + perRepo(args) { + if (!currentIns) return { data: null, summary: 'No per-repo data.' }; + const name = (args?.name || '').toLowerCase(); + let rows = currentIns.perRepo; + if (name) rows = rows.filter(r => r.repoKey.toLowerCase().includes(name)); + const limit = args?.limit || 30; + const items = rows.slice(0, limit).map(r => ({ + repoKey: r.repoKey, + directDeps: r.directCount, + transitiveDeps: r.transitiveCount, + critHighVulns: (r.critDirect + r.highDirect + r.critTransitive + r.highTransitive), + majorDrift: r.majorDriftDirect + r.majorDriftTransitive, + grade: r.grade, + archived: r.archived + })); + return { + summary: `${currentIns.perRepo.length} repos (${items.length} shown)`, + data: { total: currentIns.perRepo.length, items } + }; + }, + + /** Repo hygiene */ + hygiene() { + if (!currentIns) return { data: null, summary: 'No hygiene data.' }; + const h = currentIns.repoHygiene; + return { + summary: `Grade distribution: A=${h.gradeDistribution.A || 0} B=${h.gradeDistribution.B || 0} C=${h.gradeDistribution.C || 0} D=${h.gradeDistribution.D || 0} F=${h.gradeDistribution.F || 0}`, + data: { + gradeDistribution: h.gradeDistribution, + noSbom: h.noSbom, + archived: h.archived, + activityBuckets: h.activityBuckets + } + }; + }, + + /** Vuln age analysis */ + vulnAge() { + if (!currentIns) return { data: null, summary: 'No vuln age data.' }; + const va = currentIns.vulnAgeStats; + return { + summary: `${va.timeBombs.length} time bombs (C/H vulns >30d old), direct dwell median ${va.directDwellMedian !== null ? va.directDwellMedian + 'd' : 'N/A'}`, + data: { + timeBombs: va.timeBombs.slice(0, 20), + directDwellMedian: va.directDwellMedian, + directDwellCount: va.directDwellCount, + ageBuckets: va.ageBuckets + } + }; + } + }; + + /* ---- Execute a function call from the AI ---- */ + function executeQuery(name, args) { + const fn = DATA_QUERIES[name]; + if (!fn) return { error: `Unknown query: ${name}`, summary: '', data: null }; + try { + return fn(args || {}); + } catch (e) { + console.error('Query error:', e); + return { error: e.message, summary: '', data: null }; + } + } + + /* ---- Build function declarations for the Prompt API ---- */ + function buildFunctionDeclarations() { + // We expose a SINGLE unified function with a 'type' enum. + // This is simpler for the model and more reliable. + return [{ + name: 'query_sbom', + description: 'Query SBOM analysis data. Call this to fetch any data you need to answer the user\'s question. Available data types: overview, vulnerabilities, dependencies, repositories, licenses, eol, versionDrift, malware, techDebt, supplyChain, perRepo, hygiene, vulnAge.', + parameters: { + type: 'object', + properties: { + type: { + type: 'string', + enum: ['overview', 'vulnerabilities', 'dependencies', 'repositories', 'licenses', 'eol', 'versionDrift', 'malware', 'techDebt', 'supplyChain', 'perRepo', 'hygiene', 'vulnAge'], + description: 'The category of SBOM data to fetch' + }, + filter: { + type: 'string', + description: 'Optional filter. For vulnerabilities: "critical" or "high". For repositories: "archived", "active", "no-sbom". For versionDrift: "major" or "minor". For dependencies/perRepo: a name to search for.' + }, + limit: { + type: 'number', + description: 'Maximum items to return (default: 20, max: 100)', + default: 20 + } + }, + required: ['type'] + } + }]; + } + + /* ---- Check tools support ---- */ + async function checkToolsSupport() { + try { + if (window.ai && window.ai.languageModel) { + const caps = await window.ai.languageModel.capabilities(); + if (caps.available === 'no') { + aiAvailable = false; + toolsSupport = false; + return 'unavailable'; + } + aiAvailable = true; + // The Prompt API supports tools if we can pass them to create(). + // Chrome 130+ supports tools. We check by attempting a capability + // or just trying. For now, we assume if the model is available, + // tools may be supported. We'll detect at session creation. + // Check if there's a specific capability flag + // @ts-ignore - newer API + if (caps.supportsTools !== undefined) { + toolsSupport = caps.supportsTools; + } else { + // Assume true for Chrome 130+; will fail gracefully + toolsSupport = true; + } + return caps.available === 'readily' ? 'ready' : 'download'; + } + aiAvailable = false; + return 'unavailable'; + } catch (e) { + console.warn('Tools check:', e); + aiAvailable = false; + return 'unavailable'; + } + } + + /* ---- Create agent session with tools ---- */ + async function createAgentSession() { + destroySession(); + if (!currentData || !aiAvailable) return false; + + try { + const decls = buildFunctionDeclarations(); + + aiSession = await window.ai.languageModel.create({ + systemPrompt: `You are a supply-chain security analyst AI. You can query SBOM analysis data using the query_sbom() function whenever you need information. + +RULES: +1. Use query_sbom() to fetch data — don't make up numbers. +2. Call query_sbom() with the appropriate type for what you need. +3. After receiving data, synthesize a clear answer for the user. +4. Use plain language suitable for executives and M&A professionals. +5. If you need more detail, call query_sbom() again with different parameters. +6. Be concise but thorough — reference specific numbers.`, + tools: [{ functionDeclarations: decls }], + temperature: 0.2, + topK: 15 + }); + + return true; + } catch (err) { + console.error('Agent session creation failed:', err); + // If tools aren't supported, the create() might fail + if (err.message && (err.message.includes('tools') || err.message.includes('function'))) { + toolsSupport = false; + } + aiSession = null; + return false; + } + } + + function destroySession() { + if (aiSession) { + try { aiSession.destroy(); } catch (e) { /* ignore */ } + } + aiSession = null; + } + + /* ================================================================== */ + /* DATA LOADING */ + /* ================================================================== */ + + async function loadAnalysesList() { + try { + const info = await storageManager.getStorageInfo(); + const all = [...info.organizations, ...info.repositories] + .filter(e => e.name !== '__ALL__' && e.dependencies > 0); + selector.innerHTML = ''; + if (all.length === 0) { + noData.classList.remove('d-none'); + selector.disabled = true; + return; + } + const opt = document.createElement('option'); + opt.value = ''; + const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); + opt.textContent = `All Analyses (${totalDeps} deps)`; + selector.appendChild(opt); + for (const e of all) { + const o = document.createElement('option'); + o.value = e.name; + o.textContent = `${e.name} (${e.dependencies || 0} deps)`; + selector.appendChild(o); + } + selector.disabled = false; + await loadAnalysis(); + } catch (err) { + console.error('Agent: load failed', err); + selector.disabled = true; + noData.classList.remove('d-none'); + } + } + + async function loadAnalysis() { + loading.classList.remove('d-none'); + content.classList.add('d-none'); + noData.classList.add('d-none'); + destroySession(); + + const name = selector.value; + let blob; + if (!name || name === '') { + blob = await storageManager.getCombinedData(); + } else { + blob = await storageManager.loadAnalysisDataForOrganization(name); + } + + if (!blob || !blob.data) { + loading.classList.add('d-none'); + noData.classList.remove('d-none'); + return; + } + + currentData = blob.data; + currentIns = Agg.buildInsights(currentData); + await initAgent(); + loading.classList.add('d-none'); + content.classList.remove('d-none'); + } + + selector.addEventListener('change', loadAnalysis); + + /* ================================================================== */ + /* UI */ + /* ================================================================== */ + + async function initAgent() { + const aiStatus = await checkToolsSupport(); + + let statusHtml = ''; + if (aiStatus === 'ready') { + statusHtml = ` Gemini Nano tools: ${toolsSupport ? '✓' : '✗'}`; + } else if (aiStatus === 'download') { + statusHtml = ` Gemini Nano (download on first use) tools: ${toolsSupport ? '✓' : '✗'}`; + } else { + statusHtml = ` Gemini Nano not available`; + } + + const metrics = currentIns ? buildMetrics(currentIns) : ''; + const available = aiAvailable && toolsSupport; + const suggested = [ + 'How is our overall security posture?', + 'List all critical vulnerabilities', + 'What EOL components are we running?', + 'Which repos have the worst SBOM quality?', + 'Give me an M&A due diligence summary', + 'What supply chain risks exist?', + 'How bad is our version drift?', + 'Which packages have the most vulns?' + ]; + + const html = ` +
    +

    SBOM Analyst Agent

    +
    AI queries your SBOM data on-demand via built-in tools
    +
    +
    ${statusHtml}
    +
    + + +
    +
    ${metrics}
    + ${!aiAvailable ? ` +
    +
    +
    AI Agent Unavailable
    +

    Chrome's built-in Gemini Nano is not available on this browser.

    +
    ` : !toolsSupport ? ` +
    +
    +
    Tool-Use Not Supported
    +

    Your Chrome version doesn't support function calling in the Prompt API. Try the Chat page instead (uses pre-digested context).

    +
    ` : ''} +
    +
    +
    +
    +
    Agent ready — data loaded
    +

    The AI can query 12 data categories. Ask anything about your SBOM analysis.

    +
    +
    +
    + ${suggested.map(q => `${esc(q)}`).join('')} +
    +
    + + +
    +
    `; + + safe(content, html); + wireEvents(); + } + + function buildMetrics(ins) { + const ch = ins.critHigh; + const eol = ins.eolStats; + const td = ins.techDebt; + return ` +
    ${ins.totalRepos}
    Repos
    +
    ${ins.totalDeps}
    Deps
    +
    ${ch.total}
    C+H Vulns
    +
    ${eol.eolCount}
    EOL
    +
    ${td.grade}
    Grade
    `; + } + + function wireEvents() { + const input = document.getElementById('agInput'); + const send = document.getElementById('agSend'); + const newBtn = document.getElementById('btnNewChat'); + + document.getElementById('analysisSelector2')?.addEventListener('change', function() { + for (const opt of selector.options) { if (opt.value === this.value) { selector.value = this.value; break; } } + loadAnalysis(); + }); + + send?.addEventListener('click', () => sendMessage()); + input?.addEventListener('keydown', e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); } }); + newBtn?.addEventListener('click', startNewConversation); + + document.querySelectorAll('.ag-suggestion').forEach(el => { + el.addEventListener('click', () => { + if (input) { input.value = el.dataset.q; sendMessage(); } + }); + }); + } + + /* ================================================================== */ + /* AGENT LOOP */ + /* ================================================================== */ + + async function sendMessage() { + const input = document.getElementById('agInput'); + const send = document.getElementById('agSend'); + const msgArea = document.getElementById('agMessages'); + const empty = document.getElementById('agEmpty'); + const text = input?.value.trim(); + if (!text || isGenerating || !aiSession) return; + + input.value = ''; + input.disabled = true; + send.disabled = true; + isGenerating = true; + if (empty) empty.style.display = 'none'; + + addUserMsg(text); + + // Show thinking indicator + const thinkDiv = addAssistantMsg(''); + const thinkBubble = thinkDiv.querySelector('.bubble'); + + try { + // Agent loop: handle AI ↔ function call turns + let responseText = ''; + const MAX_TOOL_TURNS = 6; + let turn = 0; + let currentPrompt = text; + + while (turn < MAX_TOOL_TURNS) { + turn++; + thinkBubble.innerHTML = turn === 1 + ? 'Thinking...' + : `Analyzing data (turn ${turn})...`; + scrollBottom(); + + const result = await aiSession.prompt(currentPrompt); + + // Check if result is a function call + const fc = extractFunctionCall(result); + if (!fc) { + // Normal text response — we're done + responseText = typeof result === 'string' ? result : (result.text || JSON.stringify(result)); + break; + } + + // Log the function call + addToolCallMsg(`query_sbom(${fc.args.type}${fc.args.filter ? ', filter: ' + fc.args.filter : ''}${fc.args.limit ? ', limit: ' + fc.args.limit : ''})`); + + // Execute the query + thinkBubble.innerHTML = `Querying ${fc.args.type}...`; + scrollBottom(); + + const queryResult = executeQuery(fc.args.type, fc.args); + const resultStr = JSON.stringify(queryResult); + + // Feed result back — next loop turn + currentPrompt = `Here is the data from query_sbom("${fc.args.type}"):\n${resultStr}\n\nUse this data to answer the user's question. If you need more data, call query_sbom() again.`; + } + + if (turn >= MAX_TOOL_TURNS) { + responseText = 'I\'ve reached the maximum number of queries for this response. Based on what I\'ve gathered so far, here\'s my analysis...'; + } + + // Stream the final response + thinkBubble.innerHTML = ''; + try { + const stream = await aiSession.promptStreaming(responseText); + let full = ''; + for await (const chunk of stream) { + full = chunk; + thinkBubble.innerHTML = renderText(full) + ''; + scrollBottom(); + } + thinkBubble.innerHTML = renderText(full || responseText); + } catch (e) { + // If streaming fails, just show the text we already have + thinkBubble.innerHTML = renderText(responseText); + } + + } catch (err) { + console.error('Agent error:', err); + const bubble = document.querySelector('#agMessages .ag-msg.assistant:last-child .bubble'); + if (bubble) { + bubble.innerHTML = `${esc(err.message || 'Agent error')}`; + } + // Try to recover session + if (err.message?.includes('session') || err.message?.includes('context')) { + destroySession(); + const ok = await createAgentSession(); + if (ok) addSystemMsg('Session re-created. Please try again.'); + } + } + + input.disabled = false; + send.disabled = false; + isGenerating = false; + input?.focus(); + scrollBottom(); + } + + /** Extract function call from AI response — handles multiple API shapes */ + function extractFunctionCall(result) { + if (!result) return null; + + // Shape 1: { functionCall: { name, args } } + if (result.functionCall && result.functionCall.name) { + return { name: result.functionCall.name, args: result.functionCall.args || {} }; + } + // Shape 2: { functionCalls: [...] } + if (result.functionCalls && result.functionCalls.length > 0) { + const fc = result.functionCalls[0]; + return { name: fc.name, args: fc.args || {} }; + } + // Shape 3: String containing a function call marker (fallback parsing) + if (typeof result === 'string') { + // Check if the response is JUST a function call (some API versions return it as text) + try { + const parsed = JSON.parse(result); + if (parsed.functionCall || parsed.functionCalls) { + return extractFunctionCall(parsed); + } + } catch (e) { /* not JSON */ } + return null; + } + return null; + } + + async function startNewConversation() { + if (isGenerating) return; + const msgArea = document.getElementById('agMessages'); + const empty = document.getElementById('agEmpty'); + if (msgArea) { while (msgArea.firstChild) msgArea.removeChild(msgArea.firstChild); } + if (empty) { empty.style.display = 'flex'; msgArea?.appendChild(empty); } + destroySession(); + if (currentData && aiAvailable && toolsSupport) { + await createAgentSession(); + } + document.getElementById('agInput')?.focus(); + } + + /* ---- Message helpers ---- */ + function addUserMsg(text) { + const area = document.getElementById('agMessages'); + const div = document.createElement('div'); + div.className = 'ag-msg user'; + div.innerHTML = `
    ${esc(text)}
    `; + area.appendChild(div); + scrollBottom(); + } + + function addAssistantMsg(text) { + const area = document.getElementById('agMessages'); + const div = document.createElement('div'); + div.className = 'ag-msg assistant'; + div.innerHTML = `
    ${text || ''}
    `; + area.appendChild(div); + scrollBottom(); + return div; + } + + function addToolCallMsg(label) { + const area = document.getElementById('agMessages'); + const div = document.createElement('div'); + div.className = 'ag-msg tool-call'; + div.innerHTML = `
    QUERY ${esc(label)}
    `; + area.appendChild(div); + scrollBottom(); + } + + function addSystemMsg(text) { + const area = document.getElementById('agMessages'); + const div = document.createElement('div'); + div.className = 'ag-msg tool-call'; + div.innerHTML = `
    ${text}
    `; + area.appendChild(div); + scrollBottom(); + } + + function scrollBottom() { + const area = document.getElementById('agMessages'); + if (area) area.scrollTop = area.scrollHeight; + } + + /* ---- Text renderer ---- */ + function renderText(text) { + if (!text) return ''; + let html = esc(text); + html = html.replace(/\*\*(.+?)\*\*/g, '$1'); + html = html.replace(/`([^`]+)`/g, '$1'); + html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); + html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); + html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); + html = html.replace(/\n\n+/g, '

    '); + html = html.replace(/^(.+)$/gm, (m) => { + if (m.startsWith('<') || m.startsWith('')) return m; + return m; + }); + if (!html.startsWith('<')) html = '

    ' + html + '

    '; + html = html.replace(/<\/p>\s*

    /g, '

    '); + return html; + } + + /* ---- Start ---- */ + await loadAnalysesList(); + +})(); From 2a2b8639bcf01c788cd8f7cd4511a91d6f9534f0 Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Wed, 29 Jul 2026 20:54:53 +0100 Subject: [PATCH 07/19] initial code and ab testing --- .github/workflows/deploy-github-pages.yml | 9 +- .github/workflows/validate-deployment.yml | 15 + CHANGELOG.md | 9 +- about.html | 52 ++- flowchart.md | 31 ++ insights-agent.html | 15 +- insights-ai.html | 5 +- insights-chat.html | 5 +- insights.html | 4 +- insights2.html | 364 ++++++++++---------- insights3.html | 366 ++++++++++---------- insights4.html | 400 +++++++++++----------- insights5.html | 400 +++++++++++----------- js/ai-nano.js | 153 +++++++++ js/insights-agent.js | 38 +- js/insights-ai.js | 139 ++++---- js/insights-chat.js | 28 +- 17 files changed, 1135 insertions(+), 898 deletions(-) create mode 100644 js/ai-nano.js diff --git a/.github/workflows/deploy-github-pages.yml b/.github/workflows/deploy-github-pages.yml index 35cef13..b070213 100644 --- a/.github/workflows/deploy-github-pages.yml +++ b/.github/workflows/deploy-github-pages.yml @@ -58,8 +58,15 @@ jobs: cp findings.html _site/ cp feeds.html _site/ cp insights.html _site/ + cp insights2.html _site/ + cp insights3.html _site/ + cp insights4.html _site/ + cp insights5.html _site/ + cp insights-ai.html _site/ + cp insights-chat.html _site/ + cp insights-agent.html _site/ cp demo.html _site/ - echo "✅ Copied 14 HTML files" + echo "✅ Copied 21 HTML files" # Copy JavaScript, CSS, images, and bundled demo SBOM JSON cp -r js _site/ diff --git a/.github/workflows/validate-deployment.yml b/.github/workflows/validate-deployment.yml index 13a28ec..a034ece 100644 --- a/.github/workflows/validate-deployment.yml +++ b/.github/workflows/validate-deployment.yml @@ -40,6 +40,13 @@ jobs: "findings.html" "feeds.html" "insights.html" + "insights2.html" + "insights3.html" + "insights4.html" + "insights5.html" + "insights-ai.html" + "insights-chat.html" + "insights-agent.html" "demo.html" ) @@ -149,6 +156,14 @@ jobs: "js/upload-page.js" "js/insights-aggregator.js" "js/insights-page.js" + "js/insights2-page.js" + "js/insights3-page.js" + "js/insights4-page.js" + "js/insights5-page.js" + "js/insights-ai.js" + "js/insights-chat.js" + "js/insights-agent.js" + "js/ai-nano.js" "js/demo-page.js" ) diff --git a/CHANGELOG.md b/CHANGELOG.md index be79c5b..7593bf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- **Executive dashboard variants (experimental, direct URL)** (`insights2.html`–`insights5.html`, `js/insights2-page.js`–`js/insights5-page.js`): four alternate one-screen views over the same `InsightsAggregator` data — **Executive Pulse** (health grade + vital signs), **Risk Portfolio** (Security / Operational / Compliance columns), **Org Report Card** (letter grades with plain-English comments), and **One-Pager Snapshot** (single-viewport tiles + verdict). Not linked from the main nav; useful for comparing exec-facing layouts before picking a default. +- **On-device AI over SBOM analysis** (`insights-ai.html`, `insights-chat.html`, `insights-agent.html`, `js/insights-ai.js`, `js/insights-chat.js`, `js/insights-agent.js`, `js/ai-nano.js`): three Chrome **Gemini Nano** (Prompt API) experiences that read stored IndexedDB analysis only — **AI** (one-shot executive report modes), **Chat** (multi-turn with full context in the system prompt), and **Agent** (tool-use loop calling in-memory `query_sbom()` handlers). Linked from the Insights page nav (AI / Chat / Agent). All inference runs in the browser; no SBOM data is sent to a remote model. +- **Shared Prompt API adapter** (`js/ai-nano.js`): normalizes modern `LanguageModel.availability()` / `LanguageModel.create()` (including `initialPrompts` and download `monitor`) with a legacy `window.ai.languageModel` fallback, and accumulates streaming chunks so UI code works with both delta and cumulative stream semantics. - **"Unpinnable Actions" finding category on the Findings page** (`findings.html`, `js/findings-page.js`, `about.html`): GitHub Actions findings are now split into two categories so the page's Finding-type filter, the category-stat tiles, and the per-rule section cards separate **workflow-level issues** (things the workflow author can fix in their own repo: `MUTABLE_TAG_REFERENCE`, `PULL_REQUEST_TARGET_CHECKOUT`, `EXCESSIVE_WORKFLOW_PERMISSIONS`, `EXCESSIVE_JOB_PERMISSIONS`, `POTENTIAL_HARDCODED_SECRET`) from **unpinnable patterns** per [Palo Alto's "Unpinnable Actions" research](https://www.paloaltonetworks.com/blog/cloud-security/unpinnable-actions-github-security/) — Docker actions whose `action.yml` references an image by floating tag (`DOCKER_IMPLICIT_LATEST`, `DOCKER_FLOATING_TAG`), Dockerfiles whose `FROM` is unpinned (`DOCKERFILE_FLOATING_BASE_IMAGE`), Dockerfiles that install runtime dependencies without version locks or `curl|bash` remote code without integrity checks (`DOCKER_UNPINNED_DEPENDENCIES`, `DOCKER_REMOTE_CODE_NO_INTEGRITY`), composite actions that `uses:` a child action by tag instead of SHA (`COMPOSITE_NESTED_UNPINNED_ACTION`), composite actions that `run:` unpinned package installs or unverified remote scripts (`COMPOSITE_UNPINNED_DEPENDENCIES`, `COMPOSITE_REMOTE_CODE_NO_INTEGRITY`), JavaScript actions that install unpinned packages or download scripts at runtime (`UNPINNED_PACKAGE_INSTALL`, `REMOTE_CODE_NO_INTEGRITY`), and `INDIRECT_UNPINNABLE_ACTION` for actions that pull any of the above transitively. The Finding-type dropdown on `findings.html` gains a new `Unpinnable Actions` option; `js/findings-page.js` ships a module-scope `UNPINNABLE_ACTION_RULES` Set that does the classification at collection time and routes rows through the same renderer as the GitHub Actions category (they share the `action` / `workflowLocations` / `actionRepository` shape). The category-breakdown row was switched from `row-cols-md-5` to `row-cols-md-3 row-cols-xl-6` to fit the new tile (also tightened the "Dependency Confusion" label to "Dep. Confusion" so it stops wrapping). The matching reference doc — a new "Security Findings the Tool Detects" card on `about.html` — lists every rule id under each category with severity badges and a one-line description. - **"Findings Re-analysis" debug card** (`debug.html`, `js/settings.js`, `js/github-actions-analyzer.js` newly loaded on `debug.html`): two modes for refreshing the Findings page for a previously-scanned analysis without re-running a full org scan. **Normalize Stored Findings** (`SettingsApp.normalizeFindings`) is a schema-only fix-up — it walks the stored `githubActionsAnalysis.repositories[].findings` and `.findings`, renames any legacy `UNPINNED_ACTION_REFERENCE` rule ids to `MUTABLE_TAG_REFERENCE`, dedups rows keyed by `(rule_id, action, repository, file, line)` (cleans up the duplicates left by the previous double-fire bug), recomputes `findingsByType` from the canonical findings list, stamps `normalizedAt`, and saves back. Zero network calls, completes in seconds. **Re-analyze (re-fetch from GitHub)** (`SettingsApp.reanalyzeFindings`) is the heavy refresh — iterates `allRepositories` (skipping `owner === 'upload'` entries since uploaded SBOMs have no GitHub backing), pre-flights a rough rate-limit check (~20 API calls per repo, warns if estimated calls exceed the unauthenticated remaining quota and no token is set), confirms, then constructs a fresh `GitHubActionsAnalyzer` and re-runs `analyzeRepository(owner, name, 'HEAD')` per repo, aggregating `totalActions` / `uniqueActions` / `findings` / `findingsByType` exactly the way `SBOMProcessor.analyzeGitHubActions` does, replaces the stored `githubActionsAnalysis`, and saves. Both modes share one analysis-selector dropdown (`findingsRedoOrgSelect`) and one progress UI (`findingsRedoProgress`); buttons enable/disable on selection change. `js/github-actions-analyzer.js` was not previously loaded on `debug.html` and is now added so the Re-analyze button has the analyzer class available. Cache-busters bumped on `debug.html` for `settings.js` and the newly added analyzer script. @@ -24,9 +27,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Chart.js added to CDN allowlist** (`about.html`): `cdn.jsdelivr.net` row now includes Chart.js. - **Insights Analysis Flow added to flowchart** (`flowchart.md`): documents the InsightsAggregator pipeline and its 10-section rendering. - **CSS: Chart.js theme variables and Insights styles** (`css/themes.css`, `css/style.css`): `--chart-text-color` / `--chart-grid-color` in dark, light, and root scopes; `.insights-mini-tooltip`, `.insights-scroll-container`, `.insights-chart-wrap`, `.insights-component-bar`, `.insights-mini-bar` classes. -- **Workflow files updated** (`.github/workflows/deploy-github-pages.yml`, `.github/workflows/validate-deployment.yml`): `insights.html`, `js/insights-aggregator.js`, `js/insights-page.js` added to deployment copy step and validation arrays; **demo** (`demo.html`, `js/demo-page.js`, `data/demo/*.json`) included for the Quick demo page. +- **Workflow files updated** (`.github/workflows/deploy-github-pages.yml`, `.github/workflows/validate-deployment.yml`): `insights.html`, `js/insights-aggregator.js`, `js/insights-page.js` added to deployment copy step and validation arrays; **demo** (`demo.html`, `js/demo-page.js`, `data/demo/*.json`) included for the Quick demo page; **executive variants and AI pages** (`insights2.html`–`insights5.html`, `insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching `js/*-page.js`, `js/ai-nano.js`) added to deployment copy and validation. ### Changed +- **Insights nav** (`insights.html`): adds links to the on-device **AI**, **Chat**, and **Agent** pages next to the main Insights entry. - **Unpinned-action-reference findings consolidated under a single `MUTABLE_TAG_REFERENCE` rule** (`js/github-actions-analyzer.js`, `js/common.js`, `js/audit-page.js`, `js/view-manager.js`): the prior split between `UNPINNED_ACTION_REFERENCE` (intended for version tags like `v1.2.3`) and `MUTABLE_TAG_REFERENCE` (intended for branch/`latest`-style tags like `main`/`master`) described the *same* underlying issue — the workflow author chose a movable tag over an immutable commit SHA — and the analyzer's `applyHeuristics` was double-firing both rules for the same `owner/repo@ref`, so the Findings page showed two near-duplicate rows per such action. `checkWorkflowLevel` now emits exactly one `MUTABLE_TAG_REFERENCE` finding per unpinned ref — severity `high` when the ref is on the floating-tag list (`main`, `master`, `latest`, `dev`, single-segment `v1`/`v2`/…), severity `medium` for more-specific version tags like `v1.2.3` — so the severity signal preserved the "publisher rolls this forward" vs. "publisher might roll this forward" distinction that the rule-id split was trying to carry. `applyHeuristics` was the source of the duplicate emit and is removed entirely, along with its call site in `analyzeAction`. `getFindingName`/`getFindingDescription` maps in `js/common.js`, `js/audit-page.js`, and `js/view-manager.js` drop the `UNPINNED_ACTION_REFERENCE` key (legacy stored analyses fall back to the raw rule id as the type name, harmless) and the `MUTABLE_TAG_REFERENCE` description was rewritten to make explicit that it covers both branch-style and version-tag refs. Note for previously-stored analyses: their saved `githubActionsAnalysis.findings` still contain both legacy rows; the new "Normalize Stored Findings" debug button cleans them in place without a rescan. New scans get a single row from the start. - **Quick demo fixtures** ([`data/demo/`](data/demo/), [`js/demo-page.js`](js/demo-page.js)): placeholder CycloneDX/SPDX mini samples were removed in favour of the real bundled export [`sbomplay-demo.json`](data/demo/sbomplay-demo.json); CI now validates that file only (extend the list when adding more demos). @@ -35,7 +39,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Feeds page removed from top navigation** (`feeds.html`): the page is retained and fully functional but no longer occupies a slot in the header navbar, reducing nav clutter ahead of the upcoming Insights page. Users can still access it via direct URL. ### Fixed -- **Findings page threw `ReferenceError: Cannot access 'UNPINNABLE_ACTION_RULES' before initialization`** (`js/findings-page.js`): the new rule-classification Set was originally declared as a `const` inside the DOMContentLoaded handler, just before `generateSecurityFindingsHTML`. Function declarations in the same scope hoist their bodies but not their `const` bindings, and the handler's `await loadFindingsData()` call (which transitively calls `generateSecurityFindingsHTML` via the `renderFunction` callback) runs at source-position 184 — well before the `const` at source-position ~294. The function body referenced the binding while it was still in the temporal dead zone, throwing on the first page load. Moved `UNPINNABLE_ACTION_RULES` to module scope (top of `js/findings-page.js`, outside the DOMContentLoaded handler) so the binding is initialised at script-parse time, before any handler runs. Cache-buster bumped on `findings.html`. +- **Executive dashboard HTML corrupted** (`insights3.html`, `insights4.html`, `insights5.html`): accidental editor line-number prefixes in the file body broke rendering; restored valid HTML from the original import commits. +- **AI Insights page failed on load with `Cannot access 'MODES' before initialization`** (`js/insights-ai.js`): bootstrap called `renderMetrics()` before the `const MODES` binding ran (same temporal-dead-zone pattern as the Findings page fix). `MODES` is now declared at module scope inside the IIFE before any async load, and page init runs after all helpers are defined. (`js/findings-page.js`): the new rule-classification Set was originally declared as a `const` inside the DOMContentLoaded handler, just before `generateSecurityFindingsHTML`. Function declarations in the same scope hoist their bodies but not their `const` bindings, and the handler's `await loadFindingsData()` call (which transitively calls `generateSecurityFindingsHTML` via the `renderFunction` callback) runs at source-position 184 — well before the `const` at source-position ~294. The function body referenced the binding while it was still in the temporal dead zone, throwing on the first page load. Moved `UNPINNABLE_ACTION_RULES` to module scope (top of `js/findings-page.js`, outside the DOMContentLoaded handler) so the binding is initialised at script-parse time, before any handler runs. Cache-buster bumped on `findings.html`. - **`window.app` now references the live `SBOMPlayApp` instance** ([`js/app.js`](js/app.js)): page scripts such as [`index-page.js`](js/index-page.js) and the demo page can call `window.app` reliably after initialization. - **GitHub analysis now persists version drift, staleness, and EOX on each dependency in the saved blob** (`js/app.js`, `js/insights-aggregator.js`, `insights.html`): the post-SBOM path `runLicenseAndVersionDriftEnrichment` → `fetchVersionDriftData` attached drift to the in-memory `allDependencies` array but never mirrored it onto `sbomProcessor.dependencies`, so the following `exportData()` wrote empty `versionDrift` / `staleness` fields — Insights' Package Age and Version Drift charts showed 0% coverage even after a full scan. The flow now copies nested `staleness` onto each dep, calls `EnrichmentPipeline.syncDriftToProcessor` after drift fetch (matching upload / `runFullEnrichment`), and `syncEOXToProcessor` after EOX fetch. `InsightsAggregator` treats `dep.versionDrift.staleness` as a fallback when top-level `dep.staleness` is missing. Removed the temporary Insights-only IndexedDB backfill from `js/insights-page.js` in favour of correct scan-time persistence. - **Deps-page "Dependency Chain" modal now renders full chains grouped by repository instead of falling back to a flat list of parent names** (`js/deps-page.js`, `deps.html`): when `parentsByRepo` was empty for a dep — typical for resolver-discovered transitives whose parent edges live on the dep's `parents` array (resolver tree) rather than in the repo's SPDX `relationships` — the modal hit its `else` branch and displayed only the parent package names with no repo header, no chain visualisation, and no "→" arrows. For example clicking the parents-count cell on `org.apache.tomcat.embed:tomcat-embed-core@10.1.16` showed `spring-boot-starter-tomcat@3.2.0` and `tomcat-embed-websocket@10.1.16` as bare list items even though the vuln page's "Used in" block on the same dep correctly traced both chains all the way back to `spring-boot-starter-web@3.2.0`. Three-part fix: (1) Added a new `buildChainFromAllDeps(parentKey, targetPkg)` helper inside `showParentsModal` that walks `currentData.allDependencies[].parents` upward via `parents[0]` (mirrors `view-manager.js::buildPathFromParents` so the deps-page modal and the vuln-page chain display use the same data when SPDX edges aren't enumerated in the repo's `relationships`). Capped at 20 hops with a visited-set cycle guard. (2) `buildDependencyChain` now falls back to `buildChainFromAllDeps` whenever the SPDX walk doesn't reach a root direct dep (tracked via a new `reachedDirect` flag) and the allDeps walk produces a strictly longer chain — so SPDX-incomplete repos still surface the full chain. (3) When `parentsByRepo` is empty, the modal now synthesises a per-repo grouping from the target dep's `repositories` field (looked up in `currentData.allDependencies` by `name@version`), intersecting each repo with each parent's `repositories` so we don't attribute a parent to a repo that never used it. The accordion render path uses this synthesised `workingParentsByRepo` when the original is empty, and the existing per-repo accordion + "→"-separated chain rendering takes over from there. Also threaded `packageVersion` through to the modal as a separate argument (alongside `packageName`) so the dep lookup is exact instead of relying on `name@version` string parsing — the legacy "name@version-in-packageName" call shape still works. Cache-busters bumped on `deps.html`. diff --git a/about.html b/about.html index 5a9c9fc..88c11e5 100644 --- a/about.html +++ b/about.html @@ -6,8 +6,8 @@ SBOM Play - About - - + + @@ -520,6 +520,54 @@

    References
    + +
    +
    +
    On-Device AI (Gemini Nano)
    +
    +
    +

    + The AI, Chat, and Agent pages (linked from + Insights) use Chrome’s built-in Prompt API with + Gemini Nano. All prompts, context, and model output stay on your machine — SBOM Play + does not upload your analysis to a cloud LLM for these features. +

    + +
    Three modes
    + + + + + + + + + +
    PageBehavior
    AIOne-shot executive summaries (CISO brief, M&A diligence, risk narrative) from a compact digest of InsightsAggregator metrics.
    ChatMulti-turn conversation; the full analysis digest is included once in the session system prompt.
    AgentTool-use loop: the model calls query_sbom(); JavaScript runs typed queries (vulnerabilities, licenses, drift, etc.) against in-memory stored data and returns JSON for synthesis.
    + +
    Availability
    +

    + Requires a Chromium browser with the Prompt API and Gemini Nano enabled (see + Chrome Prompt API documentation). + When the model is missing or unsupported, each page shows a non-blocking “AI unavailable” state; + the rest of SBOM Play continues to work offline from IndexedDB. +

    + +
    + + Privacy: user and model text is escaped before lightweight markdown rendering in the UI. + The shared adapter (js/ai-nano.js) targets the modern LanguageModel API and + falls back to the legacy window.ai.languageModel where needed. +
    + +
    References
    + +
    +
    +
    diff --git a/flowchart.md b/flowchart.md index f35c121..e0abbde 100644 --- a/flowchart.md +++ b/flowchart.md @@ -19,6 +19,7 @@ This document provides comprehensive flowcharts documenting how SBOM Play perfor 12. [Rate Limit Handling Flow](#rate-limit-handling-flow) 13. [Feed Export Flow (OPML)](#feed-export-flow-opml) 14. [Insights Analysis Flow](#insights-analysis-flow) +15. [Insights Agent (Tool-Use) Flow](#insights-agent-tool-use-flow) --- @@ -1076,6 +1077,36 @@ flowchart TD --- +## Insights Agent (Tool-Use) Flow + +The Agent page (`insights-agent.html`) keeps raw analysis in memory and lets Gemini Nano request slices via `query_sbom()` instead of embedding the full dataset in every prompt. + +```mermaid +flowchart TD + A[User opens insights-agent.html] --> B[Load analysis from StorageManager] + B --> C[InsightsAggregator.buildInsights + store currentData] + C --> D[AiNano.createSession with tool declarations] + D --> E[User sends question] + E --> F[session.prompt user text] + F --> G{Function call in response?} + G -->|Yes| H[executeQuery type filter limit] + H --> I[Feed JSON result as next prompt turn] + I --> F + G -->|No| J[session.promptStreaming final answer] + J --> K[Render escaped markdown in chat UI] + + style A fill:#e1f5ff + style K fill:#c8e6c9 + style H fill:#fff9c4 +``` + +**Key Components:** +- **AiNano** (`ai-nano.js`): `LanguageModel` API with legacy fallback; streaming yields cumulative text for the UI +- **DATA_QUERIES** (`insights-agent.js`): typed handlers (overview, vulnerabilities, dependencies, licenses, drift, EOL, repos, …) +- **Agent loop**: capped at six tool turns per user message to bound latency and API cost + +--- + ## Key Design Patterns 1. **Incremental Processing**: Large analyses are broken into chunks with incremental saves diff --git a/insights-agent.html b/insights-agent.html index e174ca1..b7fa6b3 100644 --- a/insights-agent.html +++ b/insights-agent.html @@ -105,13 +105,14 @@
    © 2026 Cyfinoid Research. · On-device AI with built-in tool-use.
    - - - - - - + + + + + + - + + diff --git a/insights-ai.html b/insights-ai.html index db453ec..faa2c5a 100644 --- a/insights-ai.html +++ b/insights-ai.html @@ -202,8 +202,9 @@

    AI Insights

    - + - + + diff --git a/insights-chat.html b/insights-chat.html index 37acaab..535b237 100644 --- a/insights-chat.html +++ b/insights-chat.html @@ -313,8 +313,9 @@ - + - + + diff --git a/insights.html b/insights.html index 6b15145..4a7255d 100644 --- a/insights.html +++ b/insights.html @@ -152,8 +152,8 @@
    About Cyfinoid Research
    - + - + diff --git a/insights2.html b/insights2.html index 78d1330..a6da12c 100644 --- a/insights2.html +++ b/insights2.html @@ -1,185 +1,181 @@ - 1| - 2| - 3| - 4| - 5| - 6| SBOM Play — Executive Pulse - 7| - 8| - 9| - 10| - 11| - 12| - 13| - 14| - 118| - 119| - 120| Skip to content - 121| + +
    +

    Executive Pulse

    +

    At-a-glance health assessment for decision-makers

    + +
    + +
    + +
    + No analysis data found. Run a scan first. +
    + +
    +
    Loading...

    Assessing org health…

    +
    + +
    +
    © Cyfinoid Research. All rights reserved.
    +
    + + + + + + + + + + + diff --git a/insights3.html b/insights3.html index 29f64c4..e9a5798 100644 --- a/insights3.html +++ b/insights3.html @@ -1,186 +1,182 @@ - 1| - 2| - 3| - 4| - 5| - 6| SBOM Play — Risk Portfolio - 7| - 8| - 9| - 10| - 11| - 12| - 13| - 14| - 119| - 120| - 121| Skip to content - 122| + +
    +

    Risk Portfolio

    +

    Risk-domain segmentation for due-diligence reviews

    + +
    + +
    + +
    + No analysis data found. Run a scan first. +
    + +

    Assessing risk portfolio…

    +
    +
    + +
    +
    © Cyfinoid Research.
    +
    + + + + + + + + + + + diff --git a/insights4.html b/insights4.html index 1e411b0..63a60d8 100644 --- a/insights4.html +++ b/insights4.html @@ -1,203 +1,199 @@ - 1| - 2| - 3| - 4| - 5| - 6| SBOM Play — Org Report Card - 7| - 8| - 9| - 10| - 11| - 12| - 13| - 14| - 133| - 134| - 135| Skip to content - 136| + +
    +
    +

    Org Health Report Card

    +
    +
    +
    + +
    + +
    + +
    + No analysis data found. Run a scan first. +
    + +

    Preparing report card…

    +
    +
    + +
    +
    © Cyfinoid Research.
    +
    + + + + + + + + + + + diff --git a/insights5.html b/insights5.html index d61a0c9..58b585c 100644 --- a/insights5.html +++ b/insights5.html @@ -1,203 +1,199 @@ - 1| - 2| - 3| - 4| - 5| - 6| SBOM Play — Snapshot - 7| - 8| - 9| - 10| - 11| - 12| - 13| - 14| - 142| - 143| - 144| Skip to content - 145| + +
    +
    + +
    + +
    + No analysis data found. Run a scan first. +
    + +

    Taking snapshot…

    +
    +
    + +
    +
    © Cyfinoid Research.
    +
    + + + + + + + + + + + diff --git a/js/ai-nano.js b/js/ai-nano.js new file mode 100644 index 0000000..2472aa3 --- /dev/null +++ b/js/ai-nano.js @@ -0,0 +1,153 @@ +/** + * AiNano — shared adapter for Chrome on-device Gemini Nano (Prompt API). + * Prefers the modern LanguageModel API; falls back to legacy window.ai.languageModel. + * Streaming helpers yield cumulative text so callers can assign fullText = chunk safely. + */ +(function () { + 'use strict'; + + function hasModernApi() { + return typeof globalThis.LanguageModel !== 'undefined'; + } + + function hasLegacyApi() { + return !!(window.ai && window.ai.languageModel); + } + + /** + * @returns {Promise<{ available: 'readily'|'after-download'|'no', supportsTools: boolean }>} + */ + async function getAvailability() { + if (hasModernApi()) { + try { + const state = await LanguageModel.availability(); + const supportsTools = state !== 'unavailable'; + if (state === 'available') { + return { available: 'readily', supportsTools }; + } + if (state === 'downloadable' || state === 'downloading') { + return { available: 'after-download', supportsTools }; + } + return { available: 'no', supportsTools: false }; + } catch (err) { + console.warn('AiNano: LanguageModel.availability failed', err); + } + } + + if (hasLegacyApi()) { + try { + const caps = await window.ai.languageModel.capabilities(); + let available = 'no'; + if (caps.available === 'readily') { + available = 'readily'; + } else if (caps.available === 'after-download') { + available = 'after-download'; + } + const supportsTools = caps.supportsTools !== undefined ? !!caps.supportsTools : true; + return { available, supportsTools }; + } catch (err) { + console.warn('AiNano: legacy capabilities failed', err); + } + } + + return { available: 'no', supportsTools: false }; + } + + /** + * @param {object} opts + * @param {string} [opts.systemPrompt] + * @param {number} [opts.temperature] + * @param {number} [opts.topK] + * @param {object[]} [opts.tools] + * @param {(loaded: number) => void} [opts.onDownloadProgress] + */ + async function createSession(opts) { + const options = opts || {}; + const systemPrompt = options.systemPrompt || ''; + const temperature = options.temperature; + const topK = options.topK; + const tools = options.tools; + const onDownloadProgress = options.onDownloadProgress; + + if (hasModernApi()) { + const createOptions = { + initialPrompts: systemPrompt + ? [{ role: 'system', content: systemPrompt }] + : [], + monitor(m) { + if (!onDownloadProgress || !m || !m.addEventListener) { + return; + } + m.addEventListener('downloadprogress', (e) => { + const loaded = typeof e.loaded === 'number' ? e.loaded : 0; + onDownloadProgress(loaded); + }); + } + }; + if (temperature !== undefined) { + createOptions.temperature = temperature; + } + if (topK !== undefined) { + createOptions.topK = topK; + } + if (tools) { + createOptions.tools = tools; + } + const session = await LanguageModel.create(createOptions); + return wrapSession(session, 'modern'); + } + + if (hasLegacyApi()) { + const legacyOpts = { systemPrompt, temperature, topK }; + if (tools) { + legacyOpts.tools = tools; + } + const session = await window.ai.languageModel.create(legacyOpts); + return wrapSession(session, 'legacy'); + } + + throw new Error('Prompt API not available'); + } + + function wrapSession(session, kind) { + return { + prompt(text) { + return session.prompt(text); + }, + async *promptStreaming(text) { + const stream = await session.promptStreaming(text); + let full = ''; + for await (const chunk of stream) { + const piece = typeof chunk === 'string' ? chunk : String(chunk ?? ''); + if (kind === 'legacy') { + if (piece.length >= full.length && piece.startsWith(full)) { + full = piece; + } else { + full += piece; + } + } else { + full += piece; + } + yield full; + } + }, + destroy() { + try { + session.destroy(); + } catch (_) { + /* ignore */ + } + } + }; + } + + function isSupported() { + return hasModernApi() || hasLegacyApi(); + } + + window.AiNano = { + getAvailability, + createSession, + isSupported + }; +})(); diff --git a/js/insights-agent.js b/js/insights-agent.js index b018344..60c21ab 100644 --- a/js/insights-agent.js +++ b/js/insights-agent.js @@ -341,30 +341,20 @@ /* ---- Check tools support ---- */ async function checkToolsSupport() { try { - if (window.ai && window.ai.languageModel) { - const caps = await window.ai.languageModel.capabilities(); - if (caps.available === 'no') { - aiAvailable = false; - toolsSupport = false; - return 'unavailable'; - } - aiAvailable = true; - // The Prompt API supports tools if we can pass them to create(). - // Chrome 130+ supports tools. We check by attempting a capability - // or just trying. For now, we assume if the model is available, - // tools may be supported. We'll detect at session creation. - // Check if there's a specific capability flag - // @ts-ignore - newer API - if (caps.supportsTools !== undefined) { - toolsSupport = caps.supportsTools; - } else { - // Assume true for Chrome 130+; will fail gracefully - toolsSupport = true; - } - return caps.available === 'readily' ? 'ready' : 'download'; + if (!window.AiNano || !window.AiNano.isSupported()) { + aiAvailable = false; + toolsSupport = false; + return 'unavailable'; } - aiAvailable = false; - return 'unavailable'; + const caps = await window.AiNano.getAvailability(); + if (caps.available === 'no') { + aiAvailable = false; + toolsSupport = false; + return 'unavailable'; + } + aiAvailable = true; + toolsSupport = caps.supportsTools; + return caps.available === 'readily' ? 'ready' : 'download'; } catch (e) { console.warn('Tools check:', e); aiAvailable = false; @@ -380,7 +370,7 @@ try { const decls = buildFunctionDeclarations(); - aiSession = await window.ai.languageModel.create({ + aiSession = await window.AiNano.createSession({ systemPrompt: `You are a supply-chain security analyst AI. You can query SBOM analysis data using the query_sbom() function whenever you need information. RULES: diff --git a/js/insights-ai.js b/js/insights-ai.js index 0023725..5d67e07 100644 --- a/js/insights-ai.js +++ b/js/insights-ai.js @@ -27,34 +27,82 @@ let aiCapabilities = null; // null = unavailable let abortController = null; + const MODES = { + executive: { + label: 'Executive Summary', + icon: 'fas fa-file-lines', + system: 'You are an expert cybersecurity advisor writing a concise executive brief for a CISO. Use clear, plain language. Avoid jargon. Be direct about risks but constructive in tone. Maximum 250 words.', + prompt: (data) => `Analyze this SBOM org health data and write a 2-3 paragraph executive summary. + +DATA: +${data} + +Cover: 1) Overall health assessment 2) Top 2-3 risks that need attention 3) One sentence of encouragement if things look good or a call to action if they don't.` + }, + risks: { + label: 'Risk Deep-Dive', + icon: 'fas fa-exclamation-triangle', + system: 'You are a risk analyst specializing in software supply-chain security. Be specific, reference the numbers, and prioritize by severity. Maximum 200 words.', + prompt: (data) => `Analyze these SBOM risk indicators and provide a focused risk assessment. + +DATA: +${data} + +Identify: 1) The single biggest risk and why 2) 2-3 secondary risks ranked by severity 3) Which risks are urgent vs which can be monitored. Be specific about counts and thresholds.` + }, + recommendations: { + label: 'Recommendations', + icon: 'fas fa-list-check', + system: 'You are a remediation advisor. Give actionable, prioritized recommendations. Each recommendation must be specific and reference the data. Maximum 250 words.', + prompt: (data) => `Based on this SBOM org health data, provide prioritized remediation recommendations. + +DATA: +${data} + +Give 3-5 recommendations ordered by impact. For each: what to do, why (reference the data), and the expected outcome. Use bullet points for readability.` + }, + ma: { + label: 'M&A Due Diligence', + icon: 'fas fa-handshake', + system: 'You are an M&A technical due diligence analyst. Assess the target organization\'s software supply-chain health for an acquisition context. Be balanced — note both strengths and liabilities. Maximum 250 words.', + prompt: (data) => `Assess this organization's software supply-chain posture from an M&A due diligence perspective. + +DATA: +${data} + +Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) Key liabilities being inherited (be specific) 3) Strengths that reduce risk 4) Estimated remediation effort (minimal/moderate/significant) 5) Deal recommendation — proceed as-is, proceed with conditions, or flag for deeper review.` + } + }; + /* ---- Check AI availability ---- */ async function checkAi() { try { - if (window.ai && window.ai.languageModel) { - const caps = await window.ai.languageModel.capabilities(); - aiCapabilities = caps; - if (caps.available === 'readily') { - statusDot.className = 'dot ready'; - statusTxt.textContent = 'Gemini Nano ready'; - return true; - } else if (caps.available === 'after-download') { - statusDot.className = 'dot downloading'; - statusTxt.textContent = 'Gemini Nano — download needed (click generate to start)'; - return true; - } else { - statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'Gemini Nano not available on this browser'; - return false; - } - } else { + if (!window.AiNano || !window.AiNano.isSupported()) { statusDot.className = 'dot unavailable'; statusTxt.textContent = 'Chrome Prompt API not found'; + aiCapabilities = { available: 'no' }; return false; } + const caps = await window.AiNano.getAvailability(); + aiCapabilities = caps; + if (caps.available === 'readily') { + statusDot.className = 'dot ready'; + statusTxt.textContent = 'Gemini Nano ready'; + return true; + } + if (caps.available === 'after-download') { + statusDot.className = 'dot downloading'; + statusTxt.textContent = 'Gemini Nano — download needed (click generate to start)'; + return true; + } + statusDot.className = 'dot unavailable'; + statusTxt.textContent = 'Gemini Nano not available on this browser'; + return false; } catch (e) { console.warn('AI check failed:', e); statusDot.className = 'dot unavailable'; statusTxt.textContent = 'AI unavailable'; + aiCapabilities = { available: 'no' }; return false; } } @@ -116,10 +164,6 @@ content.classList.remove('d-none'); } - selector.addEventListener('change', loadAnalysis); - await checkAi(); - await loadAnalysesList(); - /* ---- Build compact data for AI ---- */ function buildAiContext(ins) { const td = ins.techDebt; @@ -189,53 +233,6 @@ } /* ---- AI generation ---- */ - const MODES = { - executive: { - label: 'Executive Summary', - icon: 'fas fa-file-lines', - system: 'You are an expert cybersecurity advisor writing a concise executive brief for a CISO. Use clear, plain language. Avoid jargon. Be direct about risks but constructive in tone. Maximum 250 words.', - prompt: (data) => `Analyze this SBOM org health data and write a 2-3 paragraph executive summary. - -DATA: -${data} - -Cover: 1) Overall health assessment 2) Top 2-3 risks that need attention 3) One sentence of encouragement if things look good or a call to action if they don't.` - }, - risks: { - label: 'Risk Deep-Dive', - icon: 'fas fa-exclamation-triangle', - system: 'You are a risk analyst specializing in software supply-chain security. Be specific, reference the numbers, and prioritize by severity. Maximum 200 words.', - prompt: (data) => `Analyze these SBOM risk indicators and provide a focused risk assessment. - -DATA: -${data} - -Identify: 1) The single biggest risk and why 2) 2-3 secondary risks ranked by severity 3) Which risks are urgent vs which can be monitored. Be specific about counts and thresholds.` - }, - recommendations: { - label: 'Recommendations', - icon: 'fas fa-list-check', - system: 'You are a remediation advisor. Give actionable, prioritized recommendations. Each recommendation must be specific and reference the data. Maximum 250 words.', - prompt: (data) => `Based on this SBOM org health data, provide prioritized remediation recommendations. - -DATA: -${data} - -Give 3-5 recommendations ordered by impact. For each: what to do, why (reference the data), and the expected outcome. Use bullet points for readability.` - }, - ma: { - label: 'M&A Due Diligence', - icon: 'fas fa-handshake', - system: 'You are an M&A technical due diligence analyst. Assess the target organization\'s software supply-chain health for an acquisition context. Be balanced — note both strengths and liabilities. Maximum 250 words.', - prompt: (data) => `Assess this organization's software supply-chain posture from an M&A due diligence perspective. - -DATA: -${data} - -Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) Key liabilities being inherited (be specific) 3) Strengths that reduce risk 4) Estimated remediation effort (minimal/moderate/significant) 5) Deal recommendation — proceed as-is, proceed with conditions, or flag for deeper review.` - } - }; - async function generateAi(modeKey) { if (!currentInsights || !aiCapabilities) return; @@ -272,7 +269,7 @@ Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) K
    `); } - const session = await window.ai.languageModel.create({ + const session = await window.AiNano.createSession({ systemPrompt: mode.system, temperature: 0.3, topK: 20 @@ -425,4 +422,8 @@ Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) K }); } + selector.addEventListener('change', loadAnalysis); + await checkAi(); + await loadAnalysesList(); + })(); diff --git a/js/insights-chat.js b/js/insights-chat.js index fa6f487..16729e7 100644 --- a/js/insights-chat.js +++ b/js/insights-chat.js @@ -99,19 +99,19 @@ /* ---- AI Availability ---- */ async function checkAi() { try { - if (window.ai && window.ai.languageModel) { - const caps = await window.ai.languageModel.capabilities(); - if (caps.available === 'readily') { - aiAvailable = true; - return 'ready'; - } else if (caps.available === 'after-download') { - aiAvailable = true; - aiDownloading = true; - return 'download'; - } else { - aiAvailable = false; - return 'unavailable'; - } + if (!window.AiNano || !window.AiNano.isSupported()) { + aiAvailable = false; + return 'unavailable'; + } + const caps = await window.AiNano.getAvailability(); + if (caps.available === 'readily') { + aiAvailable = true; + return 'ready'; + } + if (caps.available === 'after-download') { + aiAvailable = true; + aiDownloading = true; + return 'download'; } aiAvailable = false; return 'unavailable'; @@ -222,7 +222,7 @@ Start each response by addressing what was asked. If someone asks "how are we do aiSession = 'downloading'; // placeholder } - aiSession = await window.ai.languageModel.create({ + aiSession = await window.AiNano.createSession({ systemPrompt: systemPrompt, temperature: 0.3, topK: 20 From ba7ce267580ddcd562ee1c3448670cc5eff61c00 Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Wed, 29 Jul 2026 21:29:08 +0100 Subject: [PATCH 08/19] ai chat bot fixed --- CHANGELOG.md | 5 + insights-agent.html | 6 +- insights-ai.html | 3 +- insights-chat.html | 6 +- js/insights-agent.js | 447 ++++++++++++++++++++++++++++++++----------- js/insights-ai.js | 31 ++- js/insights-chat.js | 25 ++- 7 files changed, 379 insertions(+), 144 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7593bf9..10d09f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Workflow files updated** (`.github/workflows/deploy-github-pages.yml`, `.github/workflows/validate-deployment.yml`): `insights.html`, `js/insights-aggregator.js`, `js/insights-page.js` added to deployment copy step and validation arrays; **demo** (`demo.html`, `js/demo-page.js`, `data/demo/*.json`) included for the Quick demo page; **executive variants and AI pages** (`insights2.html`–`insights5.html`, `insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching `js/*-page.js`, `js/ai-nano.js`) added to deployment copy and validation. ### Changed +- **AI pages show a plain "AI not available" state** (`insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching JS): when Chrome's on-device Prompt API / Gemini Nano is missing or unsupported (including Agent tool-use unsupported), the pages no longer explain flags, Chrome versions, or alternate dashboards — they simply say **AI not available**. Cache-busters bumped. - **Insights nav** (`insights.html`): adds links to the on-device **AI**, **Chat**, and **Agent** pages next to the main Insights entry. - **Unpinned-action-reference findings consolidated under a single `MUTABLE_TAG_REFERENCE` rule** (`js/github-actions-analyzer.js`, `js/common.js`, `js/audit-page.js`, `js/view-manager.js`): the prior split between `UNPINNED_ACTION_REFERENCE` (intended for version tags like `v1.2.3`) and `MUTABLE_TAG_REFERENCE` (intended for branch/`latest`-style tags like `main`/`master`) described the *same* underlying issue — the workflow author chose a movable tag over an immutable commit SHA — and the analyzer's `applyHeuristics` was double-firing both rules for the same `owner/repo@ref`, so the Findings page showed two near-duplicate rows per such action. `checkWorkflowLevel` now emits exactly one `MUTABLE_TAG_REFERENCE` finding per unpinned ref — severity `high` when the ref is on the floating-tag list (`main`, `master`, `latest`, `dev`, single-segment `v1`/`v2`/…), severity `medium` for more-specific version tags like `v1.2.3` — so the severity signal preserved the "publisher rolls this forward" vs. "publisher might roll this forward" distinction that the rule-id split was trying to carry. `applyHeuristics` was the source of the duplicate emit and is removed entirely, along with its call site in `analyzeAction`. `getFindingName`/`getFindingDescription` maps in `js/common.js`, `js/audit-page.js`, and `js/view-manager.js` drop the `UNPINNED_ACTION_REFERENCE` key (legacy stored analyses fall back to the raw rule id as the type name, harmless) and the `MUTABLE_TAG_REFERENCE` description was rewritten to make explicit that it covers both branch-style and version-tag refs. Note for previously-stored analyses: their saved `githubActionsAnalysis.findings` still contain both legacy rows; the new "Normalize Stored Findings" debug button cleans them in place without a rescan. New scans get a single row from the start. - **Quick demo fixtures** ([`data/demo/`](data/demo/), [`js/demo-page.js`](js/demo-page.js)): placeholder CycloneDX/SPDX mini samples were removed in favour of the real bundled export [`sbomplay-demo.json`](data/demo/sbomplay-demo.json); CI now validates that file only (extend the list when adding more demos). @@ -39,6 +40,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Feeds page removed from top navigation** (`feeds.html`): the page is retained and fully functional but no longer occupies a slot in the header navbar, reducing nav clutter ahead of the upcoming Insights page. Users can still access it via direct URL. ### Fixed +- **AI Agent skipped real queries and answered vaguely** (`js/insights-agent.js`): on-device Nano often never called `query_sbom`, inventing hedges like “lots of data indicates…” or fake `tool_code` / `print(query_sbom(...))` dumps. The agent is now **app-driven**: it always runs the relevant in-memory `query_sbom` slices first (e.g. supply-chain questions → `supplyChain` + `malware` + `eol` + `techDebt`), shows those QUERY chips, then asks the model only to summarize that JSON with specific numbers. Vague/tool-dump answers fall back to a deterministic numeric summary. Native tool-calling is optional; a plain Gemini Nano session is enough. Cache-buster bumped on `insights-agent.html`. +- **AI Agent send (up-arrow) button did nothing** (`js/insights-agent.js`): the input UI enabled when Gemini Nano looked available, but `sendMessage` bailed out whenever `aiSession` was null — and the session was never created on page load (only on "New chat"). The agent now creates the tool-use session during init (and lazily on send if needed), registers tools in the modern Prompt API `{ name, description, inputSchema, execute }` shape with a legacy `functionDeclarations` fallback, and falls back to the plain **AI not available** state if session creation fails. Also stopped re-prompting the model with its own answer via `promptStreaming(responseText)` — the final reply is rendered directly. Cache-buster bumped on `insights-agent.html`. +- **AI Chat multi-turn replies all landed in the first assistant bubble** (`js/insights-chat.js`): every streamed response used a hardcoded `id="aiResponse"`, so `getElementById` always updated the first turn's bubble and later answers looked like they piled into one box. Each turn now keeps a direct reference to its own `.bubble` (no shared id), matching the Agent page pattern. Cache-buster bumped on `insights-chat.html`. +- **AI Chat / Agent pages crashed on load** (`insights-chat.html`, `insights-agent.html`): both pages were missing the `#analysisSelector` element that `insights-chat.js` / `insights-agent.js` bind to for loading analyses, so `selector.addEventListener(...)` threw `Cannot read properties of null`. Added a hidden canonical ` + +
    No analysis data found. Run a scan first.

    Loading data…

    @@ -113,6 +117,6 @@ - + diff --git a/insights-ai.html b/insights-ai.html index faa2c5a..3e52a10 100644 --- a/insights-ai.html +++ b/insights-ai.html @@ -135,6 +135,7 @@ .ai-selector-wrap { max-width: 360px; margin: 0 auto var(--space-3); } .ai-loading { text-align: center; padding: var(--space-6); color: var(--text-secondary); } + .ai-unavailable-msg { max-width: 500px; margin-left: auto; margin-right: auto; } @@ -205,6 +206,6 @@

    AI Insights

    - + diff --git a/insights-chat.html b/insights-chat.html index 535b237..2c83c2a 100644 --- a/insights-chat.html +++ b/insights-chat.html @@ -297,6 +297,10 @@
    + +
    No analysis data found. Run a scan first.
    @@ -316,6 +320,6 @@ - + diff --git a/js/insights-agent.js b/js/insights-agent.js index 60c21ab..dc5a095 100644 --- a/js/insights-agent.js +++ b/js/insights-agent.js @@ -308,36 +308,54 @@ } } - /* ---- Build function declarations for the Prompt API ---- */ - function buildFunctionDeclarations() { - // We expose a SINGLE unified function with a 'type' enum. - // This is simpler for the model and more reliable. + const QUERY_SBOM_SCHEMA = { + type: 'object', + properties: { + type: { + type: 'string', + enum: ['overview', 'vulnerabilities', 'dependencies', 'repositories', 'licenses', 'eol', 'versionDrift', 'malware', 'techDebt', 'supplyChain', 'perRepo', 'hygiene', 'vulnAge'], + description: 'The category of SBOM data to fetch' + }, + filter: { + type: 'string', + description: 'Optional filter. For vulnerabilities: "critical" or "high". For repositories: "archived", "active", "no-sbom". For versionDrift: "major" or "minor". For dependencies/perRepo: a name to search for.' + }, + limit: { + type: 'number', + description: 'Maximum items to return (default: 20, max: 100)', + default: 20 + } + }, + required: ['type'] + }; + + const QUERY_SBOM_DESCRIPTION = 'Query SBOM analysis data. Call this to fetch any data you need to answer the user\'s question. Available data types: overview, vulnerabilities, dependencies, repositories, licenses, eol, versionDrift, malware, techDebt, supplyChain, perRepo, hygiene, vulnAge.'; + + /* ---- Modern Prompt API tools (name/description/inputSchema/execute) ---- */ + function buildTools() { return [{ name: 'query_sbom', - description: 'Query SBOM analysis data. Call this to fetch any data you need to answer the user\'s question. Available data types: overview, vulnerabilities, dependencies, repositories, licenses, eol, versionDrift, malware, techDebt, supplyChain, perRepo, hygiene, vulnAge.', - parameters: { - type: 'object', - properties: { - type: { - type: 'string', - enum: ['overview', 'vulnerabilities', 'dependencies', 'repositories', 'licenses', 'eol', 'versionDrift', 'malware', 'techDebt', 'supplyChain', 'perRepo', 'hygiene', 'vulnAge'], - description: 'The category of SBOM data to fetch' - }, - filter: { - type: 'string', - description: 'Optional filter. For vulnerabilities: "critical" or "high". For repositories: "archived", "active", "no-sbom". For versionDrift: "major" or "minor". For dependencies/perRepo: a name to search for.' - }, - limit: { - type: 'number', - description: 'Maximum items to return (default: 20, max: 100)', - default: 20 - } - }, - required: ['type'] + description: QUERY_SBOM_DESCRIPTION, + inputSchema: QUERY_SBOM_SCHEMA, + async execute(args) { + const a = args || {}; + try { + addToolCallMsg(`query_sbom(${a.type}${a.filter ? ', filter: ' + a.filter : ''}${a.limit ? ', limit: ' + a.limit : ''})`); + } catch (_) { /* DOM may not be ready during early probes */ } + return JSON.stringify(executeQuery(a.type, a)); } }]; } + /* ---- Legacy functionDeclarations shape (older window.ai.languageModel) ---- */ + function buildFunctionDeclarations() { + return [{ + name: 'query_sbom', + description: QUERY_SBOM_DESCRIPTION, + parameters: QUERY_SBOM_SCHEMA + }]; + } + /* ---- Check tools support ---- */ async function checkToolsSupport() { try { @@ -367,34 +385,46 @@ destroySession(); if (!currentData || !aiAvailable) return false; - try { - const decls = buildFunctionDeclarations(); + // The app always pre-fetches query_sbom() results and injects them into the + // user prompt. The model is a summarizer — native tool-calling is optional. + const systemPrompt = `You are a supply-chain security analyst AI. - aiSession = await window.AiNano.createSession({ - systemPrompt: `You are a supply-chain security analyst AI. You can query SBOM analysis data using the query_sbom() function whenever you need information. +The application will provide authoritative SBOM query results (JSON) with each question. +Your job is to answer using ONLY those numbers. RULES: -1. Use query_sbom() to fetch data — don't make up numbers. -2. Call query_sbom() with the appropriate type for what you need. -3. After receiving data, synthesize a clear answer for the user. -4. Use plain language suitable for executives and M&A professionals. -5. If you need more detail, call query_sbom() again with different parameters. -6. Be concise but thorough — reference specific numbers.`, - tools: [{ functionDeclarations: decls }], - temperature: 0.2, - topK: 15 - }); +1. Cite specific counts, grades, and medians from the provided query results. +2. If something is not in the provided data, say it is not in the loaded analysis. +3. Never invent packages, CVEs, countries, or OpenSSL-style lookups. +4. Never emit tool_code, print(), query_sbom(), Python, or code fences. +5. Write clear executive language in 2–4 short paragraphs.`; + + // Prefer a tools-enabled session when the browser supports it; always fall + // back to a plain session so pre-fetched-data answers still work. + const attempts = [ + { tools: buildTools() }, + { tools: [{ functionDeclarations: buildFunctionDeclarations() }] }, + { tools: null } + ]; - return true; - } catch (err) { - console.error('Agent session creation failed:', err); - // If tools aren't supported, the create() might fail - if (err.message && (err.message.includes('tools') || err.message.includes('function'))) { - toolsSupport = false; + for (const opts of attempts) { + try { + const createOpts = { + systemPrompt, + temperature: 0.2, + topK: 15 + }; + if (opts.tools) createOpts.tools = opts.tools; + aiSession = await window.AiNano.createSession(createOpts); + if (!opts.tools) toolsSupport = false; + return true; + } catch (err) { + console.warn('Agent session create attempt failed:', err); + aiSession = null; } - aiSession = null; - return false; } + + return false; } function destroySession() { @@ -475,17 +505,24 @@ RULES: async function initAgent() { const aiStatus = await checkToolsSupport(); + // Session is required; native tool-calling is optional because we pre-fetch + // query_sbom() results in-app and ask the model only to summarize them. + let available = aiAvailable; + if (available) { + const ok = await createAgentSession(); + if (!ok) available = false; + } + let statusHtml = ''; - if (aiStatus === 'ready') { - statusHtml = ` Gemini Nano tools: ${toolsSupport ? '✓' : '✗'}`; - } else if (aiStatus === 'download') { - statusHtml = ` Gemini Nano (download on first use) tools: ${toolsSupport ? '✓' : '✗'}`; + if (!available) { + statusHtml = ` AI not available`; + } else if (aiStatus === 'ready') { + statusHtml = ` Gemini Nano queries: app-driven`; } else { - statusHtml = ` Gemini Nano not available`; + statusHtml = ` Gemini Nano (download on first use) queries: app-driven`; } const metrics = currentIns ? buildMetrics(currentIns) : ''; - const available = aiAvailable && toolsSupport; const suggested = [ 'How is our overall security posture?', 'List all critical vulnerabilities', @@ -508,23 +545,17 @@ RULES:
    ${metrics}
    - ${!aiAvailable ? ` + ${!available ? `
    -
    AI Agent Unavailable
    -

    Chrome's built-in Gemini Nano is not available on this browser.

    -
    ` : !toolsSupport ? ` -
    -
    -
    Tool-Use Not Supported
    -

    Your Chrome version doesn't support function calling in the Prompt API. Try the Chat page instead (uses pre-digested context).

    +
    AI not available
    ` : ''}
    Agent ready — data loaded
    -

    The AI can query 12 data categories. Ask anything about your SBOM analysis.

    +

    Each question runs real SBOM queries first, then the on-device model summarizes the numbers.

    @@ -532,7 +563,7 @@ RULES:
    - +
    `; @@ -580,14 +611,23 @@ RULES: async function sendMessage() { const input = document.getElementById('agInput'); const send = document.getElementById('agSend'); - const msgArea = document.getElementById('agMessages'); const empty = document.getElementById('agEmpty'); const text = input?.value.trim(); - if (!text || isGenerating || !aiSession) return; + if (!text || isGenerating || !aiAvailable) return; + + // Lazily create the session if init skipped it or it was destroyed + if (!aiSession) { + const ok = await createAgentSession(); + if (!ok) { + toolsSupport = false; + await initAgent(); + return; + } + } input.value = ''; input.disabled = true; - send.disabled = true; + if (send) send.disabled = true; isGenerating = true; if (empty) empty.style.display = 'none'; @@ -598,62 +638,66 @@ RULES: const thinkBubble = thinkDiv.querySelector('.bubble'); try { - // Agent loop: handle AI ↔ function call turns + // App-driven queries: always fetch real SBOM slices first, then ask Nano + // only to summarize. On-device models often skip tools and invent vague + // answers ("lots of data indicates…") if we wait for them to call query_sbom. + thinkBubble.innerHTML = 'Querying SBOM data...'; + scrollBottom(); + + const queryTypes = selectQueriesForQuestion(text); + const gathered = []; + for (const type of queryTypes) { + addToolCallMsg(`query_sbom(${type})`); + gathered.push({ type, result: executeQuery(type, {}) }); + } + let responseText = ''; - const MAX_TOOL_TURNS = 6; + let currentPrompt = buildDataPrompt(text, gathered); + const MAX_TURNS = 3; let turn = 0; - let currentPrompt = text; - while (turn < MAX_TOOL_TURNS) { + while (turn < MAX_TURNS) { turn++; thinkBubble.innerHTML = turn === 1 - ? 'Thinking...' - : `Analyzing data (turn ${turn})...`; + ? 'Summarizing query results...' + : `Refining answer (turn ${turn})...`; scrollBottom(); const result = await aiSession.prompt(currentPrompt); + const resultStr = typeof result === 'string' + ? result + : (result?.text || (result ? JSON.stringify(result) : '')); - // Check if result is a function call - const fc = extractFunctionCall(result); - if (!fc) { - // Normal text response — we're done - responseText = typeof result === 'string' ? result : (result.text || JSON.stringify(result)); - break; + let fc = extractFunctionCall(result); + if (!fc && looksLikeToolDump(resultStr)) { + fc = parseTextToolCall(resultStr); } - // Log the function call - addToolCallMsg(`query_sbom(${fc.args.type}${fc.args.filter ? ', filter: ' + fc.args.filter : ''}${fc.args.limit ? ', limit: ' + fc.args.limit : ''})`); - - // Execute the query - thinkBubble.innerHTML = `Querying ${fc.args.type}...`; - scrollBottom(); - - const queryResult = executeQuery(fc.args.type, fc.args); - const resultStr = JSON.stringify(queryResult); + // Optional follow-up query if the model still asks for another slice + if (fc && fc.name === 'query_sbom') { + const args = normalizeQueryArgs(fc.args, text); + const already = gathered.some(g => g.type === args.type); + if (!already) { + addToolCallMsg(`query_sbom(${args.type}${args.filter ? ', filter: ' + args.filter : ''})`); + gathered.push({ type: args.type, result: executeQuery(args.type, args) }); + currentPrompt = buildDataPrompt(text, gathered); + continue; + } + } - // Feed result back — next loop turn - currentPrompt = `Here is the data from query_sbom("${fc.args.type}"):\n${resultStr}\n\nUse this data to answer the user's question. If you need more data, call query_sbom() again.`; + if (looksLikeToolDump(resultStr) || looksLikeVagueAnswer(resultStr)) { + responseText = formatGatheredFallback(gathered, text); + } else { + responseText = resultStr; + } + break; } - if (turn >= MAX_TOOL_TURNS) { - responseText = 'I\'ve reached the maximum number of queries for this response. Based on what I\'ve gathered so far, here\'s my analysis...'; + if (!responseText || looksLikeToolDump(responseText) || looksLikeVagueAnswer(responseText)) { + responseText = formatGatheredFallback(gathered, text); } - // Stream the final response - thinkBubble.innerHTML = ''; - try { - const stream = await aiSession.promptStreaming(responseText); - let full = ''; - for await (const chunk of stream) { - full = chunk; - thinkBubble.innerHTML = renderText(full) + ''; - scrollBottom(); - } - thinkBubble.innerHTML = renderText(full || responseText); - } catch (e) { - // If streaming fails, just show the text we already have - thinkBubble.innerHTML = renderText(responseText); - } + thinkBubble.innerHTML = renderText(responseText || 'No response generated.'); } catch (err) { console.error('Agent error:', err); @@ -669,14 +713,182 @@ RULES: } } - input.disabled = false; - send.disabled = false; + if (input) input.disabled = false; + if (send) send.disabled = false; isGenerating = false; input?.focus(); scrollBottom(); } - /** Extract function call from AI response — handles multiple API shapes */ + const VALID_QUERY_TYPES = new Set([ + 'overview', 'vulnerabilities', 'dependencies', 'repositories', 'licenses', + 'eol', 'versionDrift', 'malware', 'techDebt', 'supplyChain', 'perRepo', + 'hygiene', 'vulnAge' + ]); + + /** True when the model emitted fake tool/Python syntax instead of an answer */ + function looksLikeToolDump(text) { + if (typeof text !== 'string' || !text.trim()) return false; + return /tool_code|function_call|print\s*\(\s*query_sbom|query_sbom\s*\(/i.test(text); + } + + /** Infer a query_sbom type from the user's natural-language question */ + function inferQueryType(userText) { + const t = (userText || '').toLowerCase(); + if (/supply\s*chain|red\s*flag|malware|dep(?:endency)?\s*confusion|unpinned/.test(t)) return 'supplyChain'; + if (/vulnerab|cve|crit(?:ical)?|severity/.test(t)) return 'vulnerabilities'; + if (/eol|end[\s-]?of[\s-]?life|end[\s-]?of[\s-]?support/.test(t)) return 'eol'; + if (/license|copyleft|compliance/.test(t)) return 'licenses'; + if (/drift|outdated|stale|major\s+update/.test(t)) return 'versionDrift'; + if (/hygiene|sbom\s*qual|archived/.test(t)) return 'hygiene'; + if (/tech[-\s]?debt|health\s*score|grade/.test(t)) return 'techDebt'; + if (/dwell|time\s*bomb|vuln\s*age/.test(t)) return 'vulnAge'; + if (/per[-\s]?repo|which\s+repos|worst\s+repo/.test(t)) return 'perRepo'; + if (/\brepos?\b/.test(t)) return 'repositories'; + if (/dependenc/.test(t)) return 'dependencies'; + if (/overview|overall|posture|how\s+.*(doing|we)/.test(t)) return 'overview'; + if (/m&a|due\s*diligence|diligence/.test(t)) return 'overview'; + return 'overview'; + } + + /** Which query_sbom slices to run before asking the model to summarize */ + function selectQueriesForQuestion(userText) { + const primary = inferQueryType(userText) || 'overview'; + const types = [primary]; + if (primary === 'supplyChain') { + types.push('malware', 'eol', 'techDebt'); + } else if (primary === 'vulnerabilities') { + types.push('vulnAge', 'techDebt'); + } else if (primary === 'overview') { + types.push('techDebt', 'supplyChain', 'vulnerabilities'); + } else if (primary === 'licenses') { + types.push('techDebt'); + } else if (primary === 'versionDrift') { + types.push('eol', 'techDebt'); + } else if (primary === 'perRepo' || primary === 'hygiene') { + types.push('techDebt'); + } + return [...new Set(types)]; + } + + /** Build the summarization prompt with authoritative query JSON */ + function buildDataPrompt(userText, gathered) { + const blocks = gathered.map(g => { + const summary = g.result?.summary || 'No summary.'; + const data = g.result?.data != null ? JSON.stringify(g.result.data) : 'null'; + return `### query_sbom("${g.type}")\nsummary: ${summary}\ndata: ${data}`; + }).join('\n\n'); + + return `USER QUESTION: +${userText} + +SBOM QUERY RESULTS (authoritative — use these numbers only): +${blocks} + +INSTRUCTIONS: +- Answer the question using ONLY the query results above. +- Cite specific numbers from the data (counts, grades, medians). +- If a detail is missing, say it is not in the loaded analysis. +- Do NOT invent packages, CVEs, or tool calls. No tool_code / print() / query_sbom(). +- Write 2–4 short paragraphs in plain executive language.`; + } + + /** Vague/hallucinated answers that ignore the provided query JSON */ + function looksLikeVagueAnswer(text) { + if (typeof text !== 'string' || !text.trim()) return true; + const t = text.toLowerCase(); + // Hedging without digits usually means the model skipped the data + const vague = /lots of data|data indicates|available (?:data|information) (?:suggests|indicates)|based on (?:the )?(?:available |provided )?data|cannot determine|insufficient data|as an ai/i.test(t); + const hasDigit = /\d/.test(text); + if (vague && !hasDigit) return true; + // Extremely short non-answers + if (text.trim().length < 40 && !hasDigit) return true; + return false; + } + + /** Coerce model-invented args into a valid query_sbom payload */ + function normalizeQueryArgs(args, userText) { + const a = { ...(args || {}) }; + if (!a.type && a.query) a.type = a.query; + if (!a.type && a.category) a.type = a.category; + if (!a.type && a.data_type) a.type = a.data_type; + if (!a.type && a.dataType) a.type = a.dataType; + if (typeof a.type === 'string') a.type = a.type.trim(); + if (a.type && !VALID_QUERY_TYPES.has(a.type)) { + // e.g. model passed type="OpenSSL" — drop and infer from the question + delete a.type; + } + // Invented package lookups are not supported; fall back to question heuristics + if (!a.type && (a.package_name || a.package || a.version || a.platform)) { + a.type = inferQueryType(userText) || 'overview'; + } + if (!a.type) a.type = inferQueryType(userText) || 'overview'; + return a; + } + + /** + * Parse text-form tool invocations Nano sometimes emits, e.g. + * ``tool_code print(query_sbom(package_name='OpenSSL', ...)) `` + */ + function parseTextToolCall(text) { + if (typeof text !== 'string') return null; + let s = text.trim(); + s = s.replace(/^`{1,3}(?:tool_code|python|javascript|js)?\s*/i, ''); + s = s.replace(/`{1,3}\s*$/g, '').trim(); + + const printWrapped = s.match(/print\s*\(\s*(query_sbom\s*\([\s\S]*\))\s*\)\s*;?\s*$/i); + if (printWrapped) s = printWrapped[1]; + + const call = s.match(/query_sbom\s*\(([\s\S]*)\)\s*;?\s*$/i) + || text.match(/query_sbom\s*\(([\s\S]*?)\)/); + if (!call) return null; + + const inner = call[1].trim(); + const args = {}; + + if (inner.startsWith('{')) { + try { + Object.assign(args, JSON.parse(inner)); + } catch (_) { /* ignore */ } + } else if (inner) { + const kv = /(\w+)\s*=\s*(['"])(.*?)\2|(\w+)\s*=\s*(-?\d+(?:\.\d+)?)/g; + let m; + while ((m = kv.exec(inner)) !== null) { + if (m[1]) args[m[1]] = m[3]; + else if (m[4]) args[m[4]] = Number(m[5]); + } + if (!Object.keys(args).length) { + const positional = inner.match(/^(['"])(.*?)\1$/); + if (positional) args.type = positional[2]; + } + } + + return { name: 'query_sbom', args }; + } + + /** Deterministic summary when the model fails to use the provided query JSON */ + function formatGatheredFallback(gathered, userText) { + const parts = [ + `Here are the SBOM query results for: "${userText}"`, + '', + 'I could not produce a clean narrative summary, so here are the authoritative numbers from the loaded analysis:' + ]; + for (const g of gathered) { + const summary = g.result?.summary || 'No summary.'; + parts.push(''); + parts.push(`**${g.type}** — ${summary}`); + if (g.result?.data && typeof g.result.data === 'object') { + for (const [k, v] of Object.entries(g.result.data)) { + if (v !== null && typeof v !== 'object') { + parts.push(`- ${k}: ${v}`); + } + } + } + } + return parts.join('\n'); + } + + /** Extract function call from AI response — structured API shapes + text dumps */ function extractFunctionCall(result) { if (!result) return null; @@ -687,18 +899,25 @@ RULES: // Shape 2: { functionCalls: [...] } if (result.functionCalls && result.functionCalls.length > 0) { const fc = result.functionCalls[0]; - return { name: fc.name, args: fc.args || {} }; + return { name: fc.name, args: fc.args || fc.arguments || {} }; + } + // Shape 2b: modern tool-call objects { name, arguments } / { toolCalls: [...] } + if (result.name && (result.arguments || result.args)) { + return { name: result.name, args: result.arguments || result.args || {} }; + } + if (Array.isArray(result.toolCalls) && result.toolCalls.length > 0) { + const tc = result.toolCalls[0]; + return { name: tc.name, args: tc.arguments || tc.args || {} }; } - // Shape 3: String containing a function call marker (fallback parsing) + // Shape 3: string JSON or text tool dump if (typeof result === 'string') { - // Check if the response is JUST a function call (some API versions return it as text) try { const parsed = JSON.parse(result); - if (parsed.functionCall || parsed.functionCalls) { + if (parsed && typeof parsed === 'object') { return extractFunctionCall(parsed); } } catch (e) { /* not JSON */ } - return null; + return parseTextToolCall(result); } return null; } @@ -710,7 +929,7 @@ RULES: if (msgArea) { while (msgArea.firstChild) msgArea.removeChild(msgArea.firstChild); } if (empty) { empty.style.display = 'flex'; msgArea?.appendChild(empty); } destroySession(); - if (currentData && aiAvailable && toolsSupport) { + if (currentData && aiAvailable) { await createAgentSession(); } document.getElementById('agInput')?.focus(); diff --git a/js/insights-ai.js b/js/insights-ai.js index 5d67e07..6bd110e 100644 --- a/js/insights-ai.js +++ b/js/insights-ai.js @@ -79,7 +79,7 @@ Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) K try { if (!window.AiNano || !window.AiNano.isSupported()) { statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'Chrome Prompt API not found'; + statusTxt.textContent = 'AI not available'; aiCapabilities = { available: 'no' }; return false; } @@ -96,12 +96,12 @@ Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) K return true; } statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'Gemini Nano not available on this browser'; + statusTxt.textContent = 'AI not available'; return false; } catch (e) { console.warn('AI check failed:', e); statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'AI unavailable'; + statusTxt.textContent = 'AI not available'; aiCapabilities = { available: 'no' }; return false; } @@ -384,30 +384,27 @@ Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) K const aiAvailable = aiCapabilities && aiCapabilities.available !== 'no'; + if (!aiAvailable) { + safe(content, kpiHtml + ` +
    + AI not available +
    `); + return; + } + const modeBtns = Object.entries(MODES).map(([key, m]) => - `` ).join(''); - - const controlsHtml = aiAvailable - ? `
    ${modeBtns}
    ` - : `
    - - AI analysis requires Chrome 128+ with chrome://flags/#prompt-api-for-gemini-nano enabled. -
    The deterministic dashboards (Pulse, Portfolio, Report, Snapshot) work without AI. -
    `; - + const controlsHtml = `
    ${modeBtns}
    `; const outputHtml = `
    Select an analysis type above to generate AI insights
    `; - - const detectNotice = aiAvailable - ? `
    Analysis runs entirely on-device via Gemini Nano — zero data leaves your browser.
    ` - : ''; + const detectNotice = `
    Analysis runs entirely on-device via Gemini Nano — zero data leaves your browser.
    `; safe(content, kpiHtml + controlsHtml + outputHtml + detectNotice); diff --git a/js/insights-chat.js b/js/insights-chat.js index 16729e7..4c2af6a 100644 --- a/js/insights-chat.js +++ b/js/insights-chat.js @@ -18,6 +18,16 @@ const loading = document.getElementById('loading'); const noData = document.getElementById('noDataMessage'); + // Bail out gracefully if the page scaffolding is missing (prevents + // "Cannot read properties of null" crashes when a required element, + // e.g. #analysisSelector, is absent from the DOM). + if (!selector || !content || !loading || !noData) { + console.error('Chat: required page elements missing — aborting init', { + selector: !!selector, content: !!content, loading: !!loading, noData: !!noData + }); + return; + } + /* ---- State ---- */ let currentInsights = null; let aiSession = null; @@ -254,7 +264,7 @@ Start each response by addressing what was asked. If someone asks "how are we do } else if (aiStatus === 'download') { statusHtml = ` Gemini Nano available (download on first message)`; } else { - statusHtml = ` Gemini Nano not available`; + statusHtml = ` AI not available`; } const metrics = currentInsights ? buildMetricsHtml(currentInsights) : ''; @@ -262,12 +272,7 @@ Start each response by addressing what was asked. If someone asks "how are we do const unavailableHtml = !aiAvailable ? `
    -
    AI Chat Unavailable
    -

    Chrome's built-in Gemini Nano is not available on this browser. You need Chrome 128+ with chrome://flags/#prompt-api-for-gemini-nano enabled.

    - +
    AI not available
    ` : ''; const suggestedQuestions = [ @@ -424,16 +429,16 @@ Start each response by addressing what was asked. If someone asks "how are we do // Add user message addUserMessage(text); - // Add AI placeholder + // Add AI placeholder (no fixed id — each turn needs its own bubble reference) const msgDiv = document.createElement('div'); msgDiv.className = 'chat-msg assistant'; msgDiv.innerHTML = `
    -
    `; +
    `; msgArea.appendChild(msgDiv); scrollToBottom(); - const bubble = document.getElementById('aiResponse'); + const bubble = msgDiv.querySelector('.bubble'); try { const stream = await aiSession.promptStreaming(text); From e3a351cbb03fefae0ca117fa95d741c4971d561f Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Wed, 29 Jul 2026 19:47:09 -0500 Subject: [PATCH 09/19] ai chat bot streamlining --- CHANGELOG.md | 1 + insights-agent.html | 2 +- js/insights-agent.js | 250 +++++++++++++++++++++++++++++++------------ 3 files changed, 185 insertions(+), 68 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10d09f6..6976fd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Feeds page removed from top navigation** (`feeds.html`): the page is retained and fully functional but no longer occupies a slot in the header navbar, reducing nav clutter ahead of the upcoming Insights page. Users can still access it via direct URL. ### Fixed +- **AI Agent “List all critical vulnerabilities” returned an essay, not a list** (`js/insights-agent.js`): the app bundled unrelated tech-debt/vuln-age aggregates and asked Nano for “2–4 paragraphs,” so answers talked about grades and time bombs without naming any CVE/package. List-style questions now run a **filtered** `query_sbom(vulnerabilities, filter: critical)` and render a **deterministic enumerated list** (`package@version — CVE/GHSA (CRITICAL)`). Severity filtering was also case-broken (`CRITICAL`.includes(`critical`) never matched) and is fixed. Cache-buster bumped on `insights-agent.html`. - **AI Agent skipped real queries and answered vaguely** (`js/insights-agent.js`): on-device Nano often never called `query_sbom`, inventing hedges like “lots of data indicates…” or fake `tool_code` / `print(query_sbom(...))` dumps. The agent is now **app-driven**: it always runs the relevant in-memory `query_sbom` slices first (e.g. supply-chain questions → `supplyChain` + `malware` + `eol` + `techDebt`), shows those QUERY chips, then asks the model only to summarize that JSON with specific numbers. Vague/tool-dump answers fall back to a deterministic numeric summary. Native tool-calling is optional; a plain Gemini Nano session is enough. Cache-buster bumped on `insights-agent.html`. - **AI Agent send (up-arrow) button did nothing** (`js/insights-agent.js`): the input UI enabled when Gemini Nano looked available, but `sendMessage` bailed out whenever `aiSession` was null — and the session was never created on page load (only on "New chat"). The agent now creates the tool-use session during init (and lazily on send if needed), registers tools in the modern Prompt API `{ name, description, inputSchema, execute }` shape with a legacy `functionDeclarations` fallback, and falls back to the plain **AI not available** state if session creation fails. Also stopped re-prompting the model with its own answer via `promptStreaming(responseText)` — the final reply is rendered directly. Cache-buster bumped on `insights-agent.html`. - **AI Chat multi-turn replies all landed in the first assistant bubble** (`js/insights-chat.js`): every streamed response used a hardcoded `id="aiResponse"`, so `getElementById` always updated the first turn's bubble and later answers looked like they piled into one box. Each turn now keeps a direct reference to its own `.bubble` (no shared id), matching the Agent page pattern. Cache-buster bumped on `insights-chat.html`. diff --git a/insights-agent.html b/insights-agent.html index d56f8db..eee8d7a 100644 --- a/insights-agent.html +++ b/insights-agent.html @@ -117,6 +117,6 @@ - + diff --git a/js/insights-agent.js b/js/insights-agent.js index dc5a095..9bcbe9e 100644 --- a/js/insights-agent.js +++ b/js/insights-agent.js @@ -67,6 +67,7 @@ if (!va) return { data: null, summary: 'No vulnerability analysis found.' }; const filter = (args?.filter || '').toLowerCase(); const limit = args?.limit || 50; + const sevFilters = new Set(['critical', 'high', 'medium', 'moderate', 'low']); let deps = va.vulnerableDependencies || []; let totalCrit = va.criticalVulnerabilities || 0; let totalHigh = va.highVulnerabilities || 0; @@ -77,7 +78,16 @@ for (const vDep of deps) { for (const v of (vDep.vulnerabilities || [])) { const sev = (v.severity || '').toUpperCase(); - if (filter && !sev.includes(filter) && !(v.id || '').toLowerCase().includes(filter)) continue; + const sevLower = sev.toLowerCase(); + if (filter) { + if (sevFilters.has(filter)) { + // Severity filter must match severity (case-insensitive) + if (!sevLower.includes(filter)) continue; + } else if (!sevLower.includes(filter) && !(v.id || '').toLowerCase().includes(filter) + && !(vDep.name || '').toLowerCase().includes(filter)) { + continue; + } + } items.push({ package: vDep.name, version: vDep.version, @@ -94,8 +104,21 @@ const order = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, MODERATE: 3, LOW: 4 }; items.sort((a, b) => (order[a.severity] ?? 99) - (order[b.severity] ?? 99)); - const summary = `${totalCrit} critical, ${totalHigh} high, ${totalMed} medium vulnerabilities across ${deps.length} packages`; - return { summary, data: { totalCrit, totalHigh, totalMed, totalPackages: deps.length, items: items.slice(0, limit) } }; + const filteredCount = items.length; + const shown = items.slice(0, limit); + const summary = filter && sevFilters.has(filter) + ? `${filteredCount} ${filter} vulnerabilities (showing ${shown.length}) across ${deps.length} vulnerable packages; portfolio totals: ${totalCrit} critical, ${totalHigh} high, ${totalMed} medium` + : `${totalCrit} critical, ${totalHigh} high, ${totalMed} medium vulnerabilities across ${deps.length} packages (showing ${shown.length} items)`; + return { + summary, + data: { + totalCrit, totalHigh, totalMed, + totalPackages: deps.length, + filter: filter || null, + matchedCount: filteredCount, + items: shown + } + }; }, /** Dependencies search */ @@ -638,63 +661,73 @@ RULES: const thinkBubble = thinkDiv.querySelector('.bubble'); try { - // App-driven queries: always fetch real SBOM slices first, then ask Nano - // only to summarize. On-device models often skip tools and invent vague - // answers ("lots of data indicates…") if we wait for them to call query_sbom. + // App-driven queries: always fetch real SBOM slices first. + // List-style questions ("List all critical vulnerabilities") get a + // deterministic enumerated answer — Nano tends to narrate aggregates + // instead of listing CVEs/packages when asked to summarize JSON. thinkBubble.innerHTML = 'Querying SBOM data...'; scrollBottom(); - const queryTypes = selectQueriesForQuestion(text); + const queries = buildQueriesForQuestion(text); const gathered = []; - for (const type of queryTypes) { - addToolCallMsg(`query_sbom(${type})`); - gathered.push({ type, result: executeQuery(type, {}) }); + for (const q of queries) { + const label = q.filter ? `${q.type}, filter: ${q.filter}` : q.type; + addToolCallMsg(`query_sbom(${label})`); + gathered.push({ type: q.type, args: q, result: executeQuery(q.type, q) }); } let responseText = ''; - let currentPrompt = buildDataPrompt(text, gathered); - const MAX_TURNS = 3; - let turn = 0; - - while (turn < MAX_TURNS) { - turn++; - thinkBubble.innerHTML = turn === 1 - ? 'Summarizing query results...' - : `Refining answer (turn ${turn})...`; - scrollBottom(); - const result = await aiSession.prompt(currentPrompt); - const resultStr = typeof result === 'string' - ? result - : (result?.text || (result ? JSON.stringify(result) : '')); + if (isListQuestion(text)) { + thinkBubble.innerHTML = 'Building list from query results...'; + scrollBottom(); + responseText = formatListAnswer(gathered, text); + } else { + let currentPrompt = buildDataPrompt(text, gathered); + const MAX_TURNS = 3; + let turn = 0; + + while (turn < MAX_TURNS) { + turn++; + thinkBubble.innerHTML = turn === 1 + ? 'Summarizing query results...' + : `Refining answer (turn ${turn})...`; + scrollBottom(); + + const result = await aiSession.prompt(currentPrompt); + const resultStr = typeof result === 'string' + ? result + : (result?.text || (result ? JSON.stringify(result) : '')); + + let fc = extractFunctionCall(result); + if (!fc && looksLikeToolDump(resultStr)) { + fc = parseTextToolCall(resultStr); + } - let fc = extractFunctionCall(result); - if (!fc && looksLikeToolDump(resultStr)) { - fc = parseTextToolCall(resultStr); - } + if (fc && fc.name === 'query_sbom') { + const args = normalizeQueryArgs(fc.args, text); + const already = gathered.some(g => g.type === args.type && (g.args?.filter || '') === (args.filter || '')); + if (!already) { + addToolCallMsg(`query_sbom(${args.type}${args.filter ? ', filter: ' + args.filter : ''})`); + gathered.push({ type: args.type, args, result: executeQuery(args.type, args) }); + currentPrompt = buildDataPrompt(text, gathered); + continue; + } + } - // Optional follow-up query if the model still asks for another slice - if (fc && fc.name === 'query_sbom') { - const args = normalizeQueryArgs(fc.args, text); - const already = gathered.some(g => g.type === args.type); - if (!already) { - addToolCallMsg(`query_sbom(${args.type}${args.filter ? ', filter: ' + args.filter : ''})`); - gathered.push({ type: args.type, result: executeQuery(args.type, args) }); - currentPrompt = buildDataPrompt(text, gathered); - continue; + if (looksLikeToolDump(resultStr) || looksLikeVagueAnswer(resultStr, text)) { + responseText = formatGatheredFallback(gathered, text); + } else { + responseText = resultStr; } + break; } - if (looksLikeToolDump(resultStr) || looksLikeVagueAnswer(resultStr)) { - responseText = formatGatheredFallback(gathered, text); - } else { - responseText = resultStr; + if (!responseText || looksLikeToolDump(responseText) || looksLikeVagueAnswer(responseText, text)) { + responseText = isListQuestion(text) + ? formatListAnswer(gathered, text) + : formatGatheredFallback(gathered, text); } - break; - } - - if (!responseText || looksLikeToolDump(responseText) || looksLikeVagueAnswer(responseText)) { - responseText = formatGatheredFallback(gathered, text); } thinkBubble.innerHTML = renderText(responseText || 'No response generated.'); @@ -751,34 +784,68 @@ RULES: return 'overview'; } - /** Which query_sbom slices to run before asking the model to summarize */ - function selectQueriesForQuestion(userText) { + function isListQuestion(userText) { + return /\b(list|enumerate|show\s+all|name\s+all|which\s+packages|what\s+are\s+the)\b/i.test(userText || ''); + } + + function extractSeverityFilter(userText) { + const t = (userText || '').toLowerCase(); + if (/\bcritical\b/.test(t)) return 'critical'; + if (/\bhigh\b/.test(t)) return 'high'; + if (/\bmedium\b|\bmoderate\b/.test(t)) return 'medium'; + if (/\blow\b/.test(t)) return 'low'; + return ''; + } + + /** + * Build concrete query_sbom calls (type + filter/limit) for a question. + * List questions get a focused filtered query — not a grab-bag of techDebt/vulnAge. + */ + function buildQueriesForQuestion(userText) { const primary = inferQueryType(userText) || 'overview'; - const types = [primary]; + const sev = extractSeverityFilter(userText); + const list = isListQuestion(userText); + + if (primary === 'vulnerabilities') { + return [{ + type: 'vulnerabilities', + filter: sev || undefined, + limit: list ? 100 : 40 + }]; + } + + if (list && (primary === 'eol' || primary === 'dependencies' || primary === 'repositories' || primary === 'perRepo')) { + return [{ type: primary, filter: sev || undefined, limit: 100 }]; + } + + const queries = [{ type: primary }]; if (primary === 'supplyChain') { - types.push('malware', 'eol', 'techDebt'); - } else if (primary === 'vulnerabilities') { - types.push('vulnAge', 'techDebt'); + queries.push({ type: 'malware' }, { type: 'eol' }); } else if (primary === 'overview') { - types.push('techDebt', 'supplyChain', 'vulnerabilities'); - } else if (primary === 'licenses') { - types.push('techDebt'); + queries.push({ type: 'techDebt' }, { type: 'supplyChain' }, { type: 'vulnerabilities', filter: 'critical', limit: 15 }); } else if (primary === 'versionDrift') { - types.push('eol', 'techDebt'); - } else if (primary === 'perRepo' || primary === 'hygiene') { - types.push('techDebt'); + queries.push({ type: 'eol' }); } - return [...new Set(types)]; + return queries; } /** Build the summarization prompt with authoritative query JSON */ function buildDataPrompt(userText, gathered) { const blocks = gathered.map(g => { const summary = g.result?.summary || 'No summary.'; - const data = g.result?.data != null ? JSON.stringify(g.result.data) : 'null'; - return `### query_sbom("${g.type}")\nsummary: ${summary}\ndata: ${data}`; + // For large item lists, keep items but cap serialization noise + let data = g.result?.data; + if (data && Array.isArray(data.items) && data.items.length > 40) { + data = { ...data, items: data.items.slice(0, 40), truncated: true }; + } + const dataStr = data != null ? JSON.stringify(data) : 'null'; + return `### query_sbom("${g.type}")\nsummary: ${summary}\ndata: ${dataStr}`; }).join('\n\n'); + const listHint = isListQuestion(userText) + ? '- This is a LIST question: enumerate the concrete items (package, version, vuln id, severity). Do not write a general essay.' + : '- Write 2–4 short paragraphs in plain executive language.'; + return `USER QUESTION: ${userText} @@ -787,25 +854,74 @@ ${blocks} INSTRUCTIONS: - Answer the question using ONLY the query results above. -- Cite specific numbers from the data (counts, grades, medians). +- Cite specific packages / CVE or GHSA ids when items are present. - If a detail is missing, say it is not in the loaded analysis. - Do NOT invent packages, CVEs, or tool calls. No tool_code / print() / query_sbom(). -- Write 2–4 short paragraphs in plain executive language.`; +${listHint}`; } /** Vague/hallucinated answers that ignore the provided query JSON */ - function looksLikeVagueAnswer(text) { + function looksLikeVagueAnswer(text, userText) { if (typeof text !== 'string' || !text.trim()) return true; const t = text.toLowerCase(); - // Hedging without digits usually means the model skipped the data - const vague = /lots of data|data indicates|available (?:data|information) (?:suggests|indicates)|based on (?:the )?(?:available |provided )?data|cannot determine|insufficient data|as an ai/i.test(t); + const vague = /lots of data|data indicates|available (?:data|information) (?:suggests|indicates)|based on (?:the )?(?:available |provided )?data|cannot determine|insufficient data|as an ai|concerning number|prevalence of vulnerabilities/i.test(t); const hasDigit = /\d/.test(text); if (vague && !hasDigit) return true; - // Extremely short non-answers if (text.trim().length < 40 && !hasDigit) return true; + // List questions that never mention a package/CVE id are not helpful + if (isListQuestion(userText) && inferQueryType(userText) === 'vulnerabilities') { + if (!/(cve-|ghsa-|mal-)/i.test(text) && !/\b[\w.-]+@\d/.test(text)) return true; + } return false; } + /** Deterministic list answer for "list/show all …" questions */ + function formatListAnswer(gathered, userText) { + const vulnGathered = gathered.find(g => g.type === 'vulnerabilities'); + if (vulnGathered) { + const items = vulnGathered.result?.data?.items || []; + const filter = vulnGathered.args?.filter || extractSeverityFilter(userText) || 'matching'; + const matched = vulnGathered.result?.data?.matchedCount ?? items.length; + if (!items.length) { + return `No ${filter} vulnerabilities found in the loaded analysis.`; + } + const lines = [ + `**${matched} ${filter} vulnerabilit${matched === 1 ? 'y' : 'ies'}** in the loaded analysis (showing ${items.length}):`, + '' + ]; + items.forEach((it, i) => { + const pkg = it.version ? `${it.package}@${it.version}` : (it.package || 'unknown'); + lines.push(`${i + 1}. **${pkg}** — \`${it.vulnId}\` (${it.severity || 'UNKNOWN'})`); + }); + if (matched > items.length) { + lines.push(''); + lines.push(`_…and ${matched - items.length} more not shown. Open the Vulns page for the full table._`); + } + return lines.join('\n'); + } + + // Generic list fallback for other query types that return items[] + for (const g of gathered) { + const items = g.result?.data?.items; + if (!Array.isArray(items)) continue; + if (!items.length) return `No ${g.type} items found in the loaded analysis.`; + const lines = [`**${items.length} ${g.type} item(s):**`, '']; + items.slice(0, 100).forEach((it, i) => { + if (it.package || it.name || it.repoKey) { + const label = it.package + ? `${it.package}${it.version ? '@' + it.version : ''}` + : (it.name || it.repoKey); + lines.push(`${i + 1}. **${label}**${it.severity ? ' — ' + it.severity : ''}${it.vulnId ? ' (`' + it.vulnId + '`)' : ''}`); + } else { + lines.push(`${i + 1}. \`${JSON.stringify(it)}\``); + } + }); + return lines.join('\n'); + } + + return formatGatheredFallback(gathered, userText); + } + /** Coerce model-invented args into a valid query_sbom payload */ function normalizeQueryArgs(args, userText) { const a = { ...(args || {}) }; From a80d38f6f6e2b82d557aded3a758edda3b2bf89a Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Wed, 29 Jul 2026 20:03:19 -0500 Subject: [PATCH 10/19] insights linking --- CHANGELOG.md | 3 + insights-agent.html | 25 +++- js/insights-agent.js | 298 ++++++++++++++++++++++++++++++++++++------- 3 files changed, 274 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6976fd4..08717af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Workflow files updated** (`.github/workflows/deploy-github-pages.yml`, `.github/workflows/validate-deployment.yml`): `insights.html`, `js/insights-aggregator.js`, `js/insights-page.js` added to deployment copy step and validation arrays; **demo** (`demo.html`, `js/demo-page.js`, `data/demo/*.json`) included for the Quick demo page; **executive variants and AI pages** (`insights2.html`–`insights5.html`, `insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching `js/*-page.js`, `js/ai-nano.js`) added to deployment copy and validation. ### Changed +- **AI Agent vuln/package list items link to the Deps page** (`js/insights-agent.js`, `insights-agent.html`): bullet-list answers (e.g. top critical vulnerabilities) now make each `package@version` a link to `deps.html?search=name@version` (and `org=` when a specific analysis is selected), so you land on that dependency already filtered. Cache-buster bumped. +- **AI Agent “top N / give me …” vuln questions return a bullet list** (`js/insights-agent.js`): asks like “Give me top 5 critical vulnerabilities” were treated as narrative questions, so Nano wrote an essay naming a few packages. List detection now covers **top/first N**, **give/show me**, and **N critical vulnerabilities**, honors the requested limit, and renders a deterministic bullet list (`package@version — GHSA/CVE`). Cache-buster bumped. +- **AI Agent tool calls now appear before the answer and collapse when done** (`insights-agent.html`, `js/insights-agent.js`): each turn shows a **QUERIES** panel above the assistant summary (instead of dumping QUERY chips after the answer). While queries run the panel stays open; once they finish it auto-collapses to “N queries · click to expand”. Expanding reveals each `query_sbom(...)` call as a collapsible row with the JSON result payload. Cache-buster bumped. - **AI pages show a plain "AI not available" state** (`insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching JS): when Chrome's on-device Prompt API / Gemini Nano is missing or unsupported (including Agent tool-use unsupported), the pages no longer explain flags, Chrome versions, or alternate dashboards — they simply say **AI not available**. Cache-busters bumped. - **Insights nav** (`insights.html`): adds links to the on-device **AI**, **Chat**, and **Agent** pages next to the main Insights entry. - **Unpinned-action-reference findings consolidated under a single `MUTABLE_TAG_REFERENCE` rule** (`js/github-actions-analyzer.js`, `js/common.js`, `js/audit-page.js`, `js/view-manager.js`): the prior split between `UNPINNED_ACTION_REFERENCE` (intended for version tags like `v1.2.3`) and `MUTABLE_TAG_REFERENCE` (intended for branch/`latest`-style tags like `main`/`master`) described the *same* underlying issue — the workflow author chose a movable tag over an immutable commit SHA — and the analyzer's `applyHeuristics` was double-firing both rules for the same `owner/repo@ref`, so the Findings page showed two near-duplicate rows per such action. `checkWorkflowLevel` now emits exactly one `MUTABLE_TAG_REFERENCE` finding per unpinned ref — severity `high` when the ref is on the floating-tag list (`main`, `master`, `latest`, `dev`, single-segment `v1`/`v2`/…), severity `medium` for more-specific version tags like `v1.2.3` — so the severity signal preserved the "publisher rolls this forward" vs. "publisher might roll this forward" distinction that the rule-id split was trying to carry. `applyHeuristics` was the source of the duplicate emit and is removed entirely, along with its call site in `analyzeAction`. `getFindingName`/`getFindingDescription` maps in `js/common.js`, `js/audit-page.js`, and `js/view-manager.js` drop the `UNPINNED_ACTION_REFERENCE` key (legacy stored analyses fall back to the raw rule id as the type name, harmless) and the `MUTABLE_TAG_REFERENCE` description was rewritten to make explicit that it covers both branch-style and version-tag refs. Note for previously-stored analyses: their saved `githubActionsAnalysis.findings` still contain both legacy rows; the new "Normalize Stored Findings" debug button cleans them in place without a rescan. New scans get a single row from the start. diff --git a/insights-agent.html b/insights-agent.html index eee8d7a..5f118f3 100644 --- a/insights-agent.html +++ b/insights-agent.html @@ -38,20 +38,39 @@ .ag-msg.user { flex-direction: row-reverse; } .ag-msg.user .avatar { background: var(--color-blue); color: #fff; } .ag-msg.assistant .avatar { background: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border-color); } - .ag-msg.tool-call .avatar { background: var(--bg-warning); color: var(--color-yellow); font-size: 0.8rem; } + .ag-msg.tool-call .avatar, + .ag-msg.tool-calls .avatar { background: var(--bg-warning); color: var(--color-yellow); font-size: 0.8rem; } .ag-msg .bubble { max-width: 80%; padding: var(--space-3) var(--space-4); border-radius: 1.2rem; font-size: var(--font-size-body); line-height: 1.7; word-wrap: break-word; } .ag-msg.user .bubble { background: var(--color-blue); color: #fff; border-bottom-right-radius: 0.3rem; } .ag-msg.assistant .bubble { background: var(--bg-tertiary); border: 1px solid var(--border-color); border-bottom-left-radius: 0.3rem; } - .ag-msg.tool-call .bubble { background: var(--bg-tertiary); border: 1px dashed var(--color-yellow); border-bottom-left-radius: 0.3rem; font-size: var(--font-size-caption); max-width: 90%; } + .ag-msg.tool-call .bubble, + .ag-msg.tool-calls .bubble { background: var(--bg-tertiary); border: 1px dashed var(--color-yellow); border-bottom-left-radius: 0.3rem; font-size: var(--font-size-caption); max-width: 90%; padding: var(--space-2) var(--space-3); } .ag-msg .bubble p { margin-bottom: var(--space-2); } .ag-msg .bubble p:last-child { margin-bottom: 0; } .ag-msg .bubble ul { padding-left: var(--space-4); margin-bottom: var(--space-2); } .ag-msg .bubble li { margin-bottom: var(--space-1); } .ag-msg .bubble strong { font-weight: 700; } .ag-msg .bubble code { background: rgba(255,255,255,0.1); padding: 0.1rem 0.4rem; border-radius: 0.3rem; font-size: 0.85em; } + .ag-msg .bubble a.ag-pkg-link { color: var(--color-blue); font-weight: 700; text-decoration: none; border-bottom: 1px solid transparent; } + .ag-msg .bubble a.ag-pkg-link:hover { border-bottom-color: var(--color-blue); } .ag-cursor { display: inline-block; width: 2px; height: 1em; background: var(--color-blue); margin-left: 2px; animation: blink 0.8s step-end infinite; vertical-align: text-bottom; } @keyframes blink { 50% { opacity: 0; } } .ag-tool-chip { display: inline-block; font-size: 0.65rem; background: var(--bg-warning); color: var(--color-yellow); padding: 0.1rem 0.6rem; border-radius: 0.4rem; margin-right: var(--space-1); font-weight: 600; } + .ag-tools-panel { width: 100%; } + .ag-tools-toggle { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); width: 100%; background: transparent; border: none; color: var(--text-primary); padding: 0; cursor: pointer; font-size: var(--font-size-caption); text-align: left; } + .ag-tools-toggle-left { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-1); min-width: 0; } + .ag-tools-summary { color: var(--text-secondary); } + .ag-tools-chevron { color: var(--text-secondary); transition: transform .15s ease; flex-shrink: 0; } + .ag-tools-toggle[aria-expanded="false"] .ag-tools-chevron { transform: rotate(-90deg); } + .ag-tools-list { margin-top: var(--space-2); display: flex; flex-direction: column; gap: var(--space-1); } + .ag-tools-list.collapsed { display: none; } + .ag-tool-item { border: 1px solid var(--border-color); border-radius: 0.5rem; background: var(--bg-primary); overflow: hidden; } + .ag-tool-summary { display: flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-2); cursor: pointer; list-style: none; } + .ag-tool-summary::-webkit-details-marker { display: none; } + .ag-tool-label { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.7rem; color: var(--text-primary); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .ag-tool-status { font-size: 0.7rem; color: var(--text-secondary); flex-shrink: 0; } + .ag-tool-status.done { color: var(--color-green); } + .ag-tool-result { margin: 0; padding: var(--space-2); border-top: 1px solid var(--border-color); background: var(--bg-secondary, var(--bg-tertiary)); color: var(--text-secondary); font-size: 0.65rem; line-height: 1.45; max-height: 220px; overflow: auto; white-space: pre-wrap; word-break: break-word; } .ag-query-log { display: block; font-size: 0.7rem; color: var(--text-secondary); margin-top: var(--space-1); font-family: monospace; } .ag-suggestions { display: flex; flex-wrap: wrap; gap: var(--space-2); justify-content: center; flex-shrink: 0; margin-bottom: var(--space-2); } .ag-suggestion { background: var(--bg-tertiary); border: 1px solid var(--border-color); border-radius: 2rem; padding: var(--space-1) var(--space-3); font-size: 0.75rem; cursor: pointer; transition: all .15s ease; color: var(--text-secondary); } @@ -117,6 +136,6 @@ - + diff --git a/js/insights-agent.js b/js/insights-agent.js index 9bcbe9e..0eb6b3d 100644 --- a/js/insights-agent.js +++ b/js/insights-agent.js @@ -32,6 +32,8 @@ let aiAvailable = false; let toolsSupport = false; let isGenerating = false; + /** Active per-turn tool panel (queries shown before the assistant summary). */ + let activeToolPanel = null; /* ================================================================== */ /* FUNCTION DECLARATIONS — exposed to the AI as callable tools */ @@ -362,10 +364,15 @@ inputSchema: QUERY_SBOM_SCHEMA, async execute(args) { const a = args || {}; + const label = `query_sbom(${a.type}${a.filter ? ', filter: ' + a.filter : ''}${a.limit ? ', limit: ' + a.limit : ''})`; + let item = null; try { - addToolCallMsg(`query_sbom(${a.type}${a.filter ? ', filter: ' + a.filter : ''}${a.limit ? ', limit: ' + a.limit : ''})`); + if (!activeToolPanel) beginToolPanel(); + item = addToolCallItem(label); } catch (_) { /* DOM may not be ready during early probes */ } - return JSON.stringify(executeQuery(a.type, a)); + const result = executeQuery(a.type, a); + try { completeToolCallItem(item, result); } catch (_) { /* ignore */ } + return JSON.stringify(result); } }]; } @@ -656,30 +663,34 @@ RULES: addUserMsg(text); - // Show thinking indicator - const thinkDiv = addAssistantMsg(''); - const thinkBubble = thinkDiv.querySelector('.bubble'); + // Tool calls first (before summary); assistant bubble comes after queries finish. + beginToolPanel(); + let thinkDiv = null; + let thinkBubble = null; try { // App-driven queries: always fetch real SBOM slices first. // List-style questions ("List all critical vulnerabilities") get a // deterministic enumerated answer — Nano tends to narrate aggregates // instead of listing CVEs/packages when asked to summarize JSON. - thinkBubble.innerHTML = 'Querying SBOM data...'; - scrollBottom(); - const queries = buildQueriesForQuestion(text); const gathered = []; for (const q of queries) { - const label = q.filter ? `${q.type}, filter: ${q.filter}` : q.type; - addToolCallMsg(`query_sbom(${label})`); - gathered.push({ type: q.type, args: q, result: executeQuery(q.type, q) }); + const label = q.filter ? `query_sbom(${q.type}, filter: ${q.filter})` : `query_sbom(${q.type})`; + const item = addToolCallItem(label); + const result = executeQuery(q.type, q); + completeToolCallItem(item, result); + gathered.push({ type: q.type, args: q, result }); } + collapseToolPanel(); + + thinkDiv = addAssistantMsg(''); + thinkBubble = thinkDiv.querySelector('.bubble'); let responseText = ''; if (isListQuestion(text)) { - thinkBubble.innerHTML = 'Building list from query results...'; + safe(thinkBubble, 'Building list from query results...'); scrollBottom(); responseText = formatListAnswer(gathered, text); } else { @@ -689,9 +700,9 @@ RULES: while (turn < MAX_TURNS) { turn++; - thinkBubble.innerHTML = turn === 1 + safe(thinkBubble, turn === 1 ? 'Summarizing query results...' - : `Refining answer (turn ${turn})...`; + : `Refining answer (turn ${turn})...`); scrollBottom(); const result = await aiSession.prompt(currentPrompt); @@ -708,8 +719,13 @@ RULES: const args = normalizeQueryArgs(fc.args, text); const already = gathered.some(g => g.type === args.type && (g.args?.filter || '') === (args.filter || '')); if (!already) { - addToolCallMsg(`query_sbom(${args.type}${args.filter ? ', filter: ' + args.filter : ''})`); - gathered.push({ type: args.type, args, result: executeQuery(args.type, args) }); + expandToolPanel(); + const label = `query_sbom(${args.type}${args.filter ? ', filter: ' + args.filter : ''})`; + const item = addToolCallItem(label); + const qResult = executeQuery(args.type, args); + completeToolCallItem(item, qResult); + collapseToolPanel(); + gathered.push({ type: args.type, args, result: qResult }); currentPrompt = buildDataPrompt(text, gathered); continue; } @@ -730,13 +746,17 @@ RULES: } } - thinkBubble.innerHTML = renderText(responseText || 'No response generated.'); + safe(thinkBubble, renderText(responseText || 'No response generated.')); } catch (err) { console.error('Agent error:', err); - const bubble = document.querySelector('#agMessages .ag-msg.assistant:last-child .bubble'); - if (bubble) { - bubble.innerHTML = `${esc(err.message || 'Agent error')}`; + collapseToolPanel(); + if (!thinkBubble) { + thinkDiv = addAssistantMsg(''); + thinkBubble = thinkDiv.querySelector('.bubble'); + } + if (thinkBubble) { + safe(thinkBubble, `${esc(err.message || 'Agent error')}`); } // Try to recover session if (err.message?.includes('session') || err.message?.includes('context')) { @@ -744,6 +764,8 @@ RULES: const ok = await createAgentSession(); if (ok) addSystemMsg('Session re-created. Please try again.'); } + } finally { + activeToolPanel = null; } if (input) input.disabled = false; @@ -784,8 +806,31 @@ RULES: return 'overview'; } + /** Parse "top 5" / "first 10" / "5 critical vulnerabilities" into a capped limit */ + function extractLimit(userText) { + const t = userText || ''; + const m = t.match(/\b(?:top|first)\s+(\d{1,3})\b/i) + || t.match(/\b(?:show|give|list|name)\s+(?:me\s+)?(\d{1,3})\b/i) + || t.match(/\b(\d{1,3})\s+(?:critical|high|medium|low)?\s*(?:vulnerabilit|cve|ghsa|package|eol|repos?)/i); + if (!m) return null; + const n = parseInt(m[1], 10); + if (!Number.isFinite(n) || n < 1) return null; + return Math.min(n, 100); + } + function isListQuestion(userText) { - return /\b(list|enumerate|show\s+all|name\s+all|which\s+packages|what\s+are\s+the)\b/i.test(userText || ''); + const t = userText || ''; + if (/\b(list|enumerate|show\s+(?:me\s+)?all|name\s+all|which\s+packages|what\s+are\s+the|most\s+vulns?)\b/i.test(t)) { + return true; + } + // "top 5 …", "first 10 …", "5 critical vulnerabilities" + if (extractLimit(t) != null) return true; + // "give/show me the critical vulnerabilities" — but not summary/overview asks + if (/\b(?:give|show)\s+me\b/i.test(t) + && !/\b(summary|overview|diligence|posture|assessment|grade)\b/i.test(t)) { + return true; + } + return false; } function extractSeverityFilter(userText) { @@ -805,17 +850,18 @@ RULES: const primary = inferQueryType(userText) || 'overview'; const sev = extractSeverityFilter(userText); const list = isListQuestion(userText); + const askedLimit = extractLimit(userText); if (primary === 'vulnerabilities') { return [{ type: 'vulnerabilities', filter: sev || undefined, - limit: list ? 100 : 40 + limit: askedLimit || (list ? 100 : 40) }]; } if (list && (primary === 'eol' || primary === 'dependencies' || primary === 'repositories' || primary === 'perRepo')) { - return [{ type: primary, filter: sev || undefined, limit: 100 }]; + return [{ type: primary, filter: sev || undefined, limit: askedLimit || 100 }]; } const queries = [{ type: primary }]; @@ -875,45 +921,68 @@ ${listHint}`; return false; } - /** Deterministic list answer for "list/show all …" questions */ + /** Build deps.html URL filtered to a package (name@version), scoped to current analysis when set */ + function depsPackageUrl(packageName, version) { + if (!packageName) return null; + const params = new URLSearchParams(); + const org = selector?.value; + if (org) params.set('org', org); + params.set('search', version ? `${packageName}@${version}` : packageName); + return `deps.html?${params.toString()}`; + } + + function packageListLabel(packageName, version) { + const label = version ? `${packageName}@${version}` : (packageName || 'unknown'); + const href = depsPackageUrl(packageName, version); + return href ? `[${label}](${href})` : `**${label}**`; + } + + /** Deterministic bullet list for "list / top N / give me …" questions */ function formatListAnswer(gathered, userText) { + const askedLimit = extractLimit(userText); const vulnGathered = gathered.find(g => g.type === 'vulnerabilities'); if (vulnGathered) { - const items = vulnGathered.result?.data?.items || []; + const allItems = vulnGathered.result?.data?.items || []; + const items = askedLimit ? allItems.slice(0, askedLimit) : allItems; const filter = vulnGathered.args?.filter || extractSeverityFilter(userText) || 'matching'; - const matched = vulnGathered.result?.data?.matchedCount ?? items.length; + const matched = vulnGathered.result?.data?.matchedCount ?? allItems.length; if (!items.length) { return `No ${filter} vulnerabilities found in the loaded analysis.`; } - const lines = [ - `**${matched} ${filter} vulnerabilit${matched === 1 ? 'y' : 'ies'}** in the loaded analysis (showing ${items.length}):`, - '' - ]; - items.forEach((it, i) => { - const pkg = it.version ? `${it.package}@${it.version}` : (it.package || 'unknown'); - lines.push(`${i + 1}. **${pkg}** — \`${it.vulnId}\` (${it.severity || 'UNKNOWN'})`); + const header = askedLimit + ? `**Top ${items.length} ${filter} vulnerabilit${items.length === 1 ? 'y' : 'ies'}** (${matched} total in the loaded analysis):` + : `**${matched} ${filter} vulnerabilit${matched === 1 ? 'y' : 'ies'}** in the loaded analysis (showing ${items.length}):`; + const lines = [header, '']; + items.forEach((it) => { + lines.push(`- ${packageListLabel(it.package, it.version)} — \`${it.vulnId}\` (${it.severity || 'UNKNOWN'})`); }); - if (matched > items.length) { + if (!askedLimit && matched > items.length) { lines.push(''); lines.push(`_…and ${matched - items.length} more not shown. Open the Vulns page for the full table._`); + } else if (askedLimit && matched > items.length) { + lines.push(''); + lines.push(`_${matched - items.length} more ${filter} vulnerabilities not shown._`); } return lines.join('\n'); } // Generic list fallback for other query types that return items[] for (const g of gathered) { - const items = g.result?.data?.items; - if (!Array.isArray(items)) continue; - if (!items.length) return `No ${g.type} items found in the loaded analysis.`; - const lines = [`**${items.length} ${g.type} item(s):**`, '']; - items.slice(0, 100).forEach((it, i) => { - if (it.package || it.name || it.repoKey) { - const label = it.package - ? `${it.package}${it.version ? '@' + it.version : ''}` - : (it.name || it.repoKey); - lines.push(`${i + 1}. **${label}**${it.severity ? ' — ' + it.severity : ''}${it.vulnId ? ' (`' + it.vulnId + '`)' : ''}`); + const allItems = g.result?.data?.items; + if (!Array.isArray(allItems)) continue; + if (!allItems.length) return `No ${g.type} items found in the loaded analysis.`; + const items = (askedLimit ? allItems.slice(0, askedLimit) : allItems).slice(0, 100); + const header = askedLimit + ? `**Top ${items.length} ${g.type} item(s):**` + : `**${allItems.length} ${g.type} item(s):**`; + const lines = [header, '']; + items.forEach((it) => { + if (it.package) { + lines.push(`- ${packageListLabel(it.package, it.version)}${it.severity ? ' — ' + it.severity : ''}${it.vulnId ? ' (`' + it.vulnId + '`)' : ''}`); + } else if (it.name || it.repoKey) { + lines.push(`- **${it.name || it.repoKey}**${it.severity ? ' — ' + it.severity : ''}`); } else { - lines.push(`${i + 1}. \`${JSON.stringify(it)}\``); + lines.push(`- \`${JSON.stringify(it)}\``); } }); return lines.join('\n'); @@ -1071,20 +1140,145 @@ ${listHint}`; return div; } - function addToolCallMsg(label) { + const TOOL_RESULT_MAX_CHARS = 12000; + + function formatToolResult(result) { + let text; + try { + text = typeof result === 'string' ? result : JSON.stringify(result, null, 2); + } catch (_) { + text = String(result); + } + if (!text) return '(empty result)'; + if (text.length > TOOL_RESULT_MAX_CHARS) { + return text.slice(0, TOOL_RESULT_MAX_CHARS) + '\n… (truncated)'; + } + return text; + } + + function updateToolPanelSummary() { + if (!activeToolPanel) return; + const count = activeToolPanel.queryCount || 0; + const running = activeToolPanel.runningCount || 0; + const labelEl = activeToolPanel.root.querySelector('.ag-tools-summary'); + if (!labelEl) return; + if (running > 0) { + labelEl.textContent = count === 1 + ? 'Running 1 query…' + : `Running ${count} queries…`; + } else { + labelEl.textContent = count === 1 + ? '1 query · click to expand' + : `${count} queries · click to expand`; + } + } + + function beginToolPanel() { const area = document.getElementById('agMessages'); const div = document.createElement('div'); - div.className = 'ag-msg tool-call'; - div.innerHTML = `
    QUERY ${esc(label)}
    `; + div.className = 'ag-msg tool-calls'; + safe(div, ` +
    +
    + +
    +
    + `); area.appendChild(div); + + const toggle = div.querySelector('.ag-tools-toggle'); + const list = div.querySelector('.ag-tools-list'); + toggle.addEventListener('click', () => { + const open = toggle.getAttribute('aria-expanded') === 'true'; + toggle.setAttribute('aria-expanded', open ? 'false' : 'true'); + list.classList.toggle('collapsed', open); + }); + + activeToolPanel = { + root: div, + list, + toggle, + queryCount: 0, + runningCount: 0 + }; + scrollBottom(); + return activeToolPanel; + } + + function expandToolPanel() { + if (!activeToolPanel) beginToolPanel(); + const { toggle, list } = activeToolPanel; + toggle.setAttribute('aria-expanded', 'true'); + list.classList.remove('collapsed'); + } + + function collapseToolPanel() { + if (!activeToolPanel) return; + const { toggle, list, root } = activeToolPanel; + toggle.setAttribute('aria-expanded', 'false'); + list.classList.add('collapsed'); + root.querySelectorAll('.ag-tool-item').forEach(el => { el.open = false; }); + updateToolPanelSummary(); + } + + function addToolCallItem(label) { + if (!activeToolPanel) beginToolPanel(); + expandToolPanel(); + + const details = document.createElement('details'); + details.className = 'ag-tool-item'; + details.open = true; + + const summary = document.createElement('summary'); + summary.className = 'ag-tool-summary'; + safe(summary, ` + QUERY + ${esc(label)} + + `); + + const pre = document.createElement('pre'); + pre.className = 'ag-tool-result'; + pre.textContent = 'Waiting for result…'; + + details.appendChild(summary); + details.appendChild(pre); + activeToolPanel.list.appendChild(details); + activeToolPanel.queryCount += 1; + activeToolPanel.runningCount += 1; + updateToolPanelSummary(); scrollBottom(); + return details; + } + + function completeToolCallItem(itemEl, result) { + if (!itemEl) return; + const status = itemEl.querySelector('.ag-tool-status'); + if (status) { + status.classList.remove('running'); + status.classList.add('done'); + safe(status, ''); + } + const pre = itemEl.querySelector('.ag-tool-result'); + if (pre) pre.textContent = formatToolResult(result); + itemEl.open = false; + if (activeToolPanel && activeToolPanel.runningCount > 0) { + activeToolPanel.runningCount -= 1; + } + updateToolPanelSummary(); } function addSystemMsg(text) { const area = document.getElementById('agMessages'); const div = document.createElement('div'); div.className = 'ag-msg tool-call'; - div.innerHTML = `
    ${text}
    `; + safe(div, `
    ${text}
    `); area.appendChild(div); scrollBottom(); } @@ -1098,8 +1292,14 @@ ${listHint}`; function renderText(text) { if (!text) return ''; let html = esc(text); + // Markdown links — only relative deps.html deep-links (built by the agent, not model text) + html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, label, url) => { + if (!/^deps\.html\?[^\s"'<>]*$/i.test(url)) return `[${label}](${url})`; + return `${label}`; + }); html = html.replace(/\*\*(.+?)\*\*/g, '$1'); html = html.replace(/`([^`]+)`/g, '$1'); + html = html.replace(/(^|[\s(])_([^_\n]+)_([\s).,]|$)/g, '$1$2$3'); html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); From 076df92339da4cf8d9d00e50c1fb1e1b44c21bfb Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Wed, 5 Aug 2026 19:37:55 -0700 Subject: [PATCH 11/19] insights --- CHANGELOG.md | 1 + authors.html | 10 ++- insights-agent.html | 4 +- js/authors-page.js | 38 ++++++++- js/insights-agent.js | 193 +++++++++++++++++++++++++++++++++++++++---- 5 files changed, 226 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08717af..66c4c53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Workflow files updated** (`.github/workflows/deploy-github-pages.yml`, `.github/workflows/validate-deployment.yml`): `insights.html`, `js/insights-aggregator.js`, `js/insights-page.js` added to deployment copy step and validation arrays; **demo** (`demo.html`, `js/demo-page.js`, `data/demo/*.json`) included for the Quick demo page; **executive variants and AI pages** (`insights2.html`–`insights5.html`, `insights-ai.html`, `insights-chat.html`, `insights-agent.html`, matching `js/*-page.js`, `js/ai-nano.js`) added to deployment copy and validation. ### Changed +- **AI Agent answers deep-link packages, repos, authors, and advisories** (`js/insights-agent.js`, `insights-agent.html`, `authors.html`, `js/authors-page.js`): every agent answer (lists and narrative) auto-links known entities from the loaded analysis — packages → `deps.html?search=…`, repositories → `repos.html?search=…`, authors → `authors.html?search=…`, and GHSA/CVE/MAL ids → OSV. The Authors page gains a search box and `?search=` URL support so author links land filtered. Cache-busters bumped. - **AI Agent vuln/package list items link to the Deps page** (`js/insights-agent.js`, `insights-agent.html`): bullet-list answers (e.g. top critical vulnerabilities) now make each `package@version` a link to `deps.html?search=name@version` (and `org=` when a specific analysis is selected), so you land on that dependency already filtered. Cache-buster bumped. - **AI Agent “top N / give me …” vuln questions return a bullet list** (`js/insights-agent.js`): asks like “Give me top 5 critical vulnerabilities” were treated as narrative questions, so Nano wrote an essay naming a few packages. List detection now covers **top/first N**, **give/show me**, and **N critical vulnerabilities**, honors the requested limit, and renders a deterministic bullet list (`package@version — GHSA/CVE`). Cache-buster bumped. - **AI Agent tool calls now appear before the answer and collapse when done** (`insights-agent.html`, `js/insights-agent.js`): each turn shows a **QUERIES** panel above the assistant summary (instead of dumping QUERY chips after the answer). While queries run the panel stays open; once they finish it auto-collapses to “N queries · click to expand”. Expanding reveals each `query_sbom(...)` call as a collapsible row with the JSON result payload. Cache-buster bumped. diff --git a/authors.html b/authors.html index 56fb4bc..ca7cedb 100644 --- a/authors.html +++ b/authors.html @@ -106,7 +106,11 @@

    Author Analysis

    -
    +
    + + +
    +
    -
    +
    - - -
    - -
    - No analysis data found. Run a scan first. -
    - -

    Loading data…

    -
    - - -
    -
    © Cyfinoid Research. · AI analysis runs entirely on-device — no data leaves your browser.
    -
    - - - - - - - - - - - - diff --git a/insights-chat.html b/insights-chat.html deleted file mode 100644 index 2c83c2a..0000000 --- a/insights-chat.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - SBOM Play — AI Chat - - - - - - - - - - - Skip to content - - -
    - - -
    - No analysis data found. Run a scan first. -
    -

    Loading data…

    -
    -
    - -
    -
    © Cyfinoid Research. · All AI processing runs on-device via Gemini Nano.
    -
    - - - - - - - - - - - - diff --git a/insights.html b/insights.html index 4a7255d..eee28a5 100644 --- a/insights.html +++ b/insights.html @@ -36,8 +36,6 @@ Audit Findings Insights - AI - Chat Agent Deps Repos diff --git a/insights2.html b/insights2.html index a6da12c..b62ea2e 100644 --- a/insights2.html +++ b/insights2.html @@ -132,11 +132,8 @@ Vulns Audit Findings - Insights - Pulse - Portfolio - Report - Snapshot + Insights + Agent Deps Repos Authors diff --git a/insights3.html b/insights3.html index e9a5798..a87dc84 100644 --- a/insights3.html +++ b/insights3.html @@ -133,11 +133,8 @@ Vulns Audit Findings - Insights - Pulse - Portfolio - Report - Snapshot + Insights + Agent Deps Repos Authors diff --git a/insights4.html b/insights4.html index 63a60d8..d57be33 100644 --- a/insights4.html +++ b/insights4.html @@ -147,11 +147,8 @@ Vulns Audit Findings - Insights - Pulse - Portfolio - Report - Snapshot + Insights + Agent Deps Repos Authors diff --git a/insights5.html b/insights5.html index 58b585c..cd966ca 100644 --- a/insights5.html +++ b/insights5.html @@ -154,13 +154,13 @@ Home License Vulns - Insights - Pulse - Portfolio - Report - Snapshot + Audit + Findings + Insights + Agent Deps Repos + Authors Settings About
    diff --git a/js/insights-ai.js b/js/insights-ai.js deleted file mode 100644 index 6bd110e..0000000 --- a/js/insights-ai.js +++ /dev/null @@ -1,426 +0,0 @@ -/** - * AI Insights (insights-ai.js) — natural-language executive analysis - * using Chrome's built-in Gemini Nano (Prompt API). - * - * All AI processing happens on-device — no data ever leaves the browser. - * Falls back gracefully if the API is not available. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - const statusDot = document.getElementById('aiStatusDot'); - const statusTxt = document.getElementById('aiStatusText'); - - /* ---- State ---- */ - let currentInsights = null; - let aiCapabilities = null; // null = unavailable - let abortController = null; - - const MODES = { - executive: { - label: 'Executive Summary', - icon: 'fas fa-file-lines', - system: 'You are an expert cybersecurity advisor writing a concise executive brief for a CISO. Use clear, plain language. Avoid jargon. Be direct about risks but constructive in tone. Maximum 250 words.', - prompt: (data) => `Analyze this SBOM org health data and write a 2-3 paragraph executive summary. - -DATA: -${data} - -Cover: 1) Overall health assessment 2) Top 2-3 risks that need attention 3) One sentence of encouragement if things look good or a call to action if they don't.` - }, - risks: { - label: 'Risk Deep-Dive', - icon: 'fas fa-exclamation-triangle', - system: 'You are a risk analyst specializing in software supply-chain security. Be specific, reference the numbers, and prioritize by severity. Maximum 200 words.', - prompt: (data) => `Analyze these SBOM risk indicators and provide a focused risk assessment. - -DATA: -${data} - -Identify: 1) The single biggest risk and why 2) 2-3 secondary risks ranked by severity 3) Which risks are urgent vs which can be monitored. Be specific about counts and thresholds.` - }, - recommendations: { - label: 'Recommendations', - icon: 'fas fa-list-check', - system: 'You are a remediation advisor. Give actionable, prioritized recommendations. Each recommendation must be specific and reference the data. Maximum 250 words.', - prompt: (data) => `Based on this SBOM org health data, provide prioritized remediation recommendations. - -DATA: -${data} - -Give 3-5 recommendations ordered by impact. For each: what to do, why (reference the data), and the expected outcome. Use bullet points for readability.` - }, - ma: { - label: 'M&A Due Diligence', - icon: 'fas fa-handshake', - system: 'You are an M&A technical due diligence analyst. Assess the target organization\'s software supply-chain health for an acquisition context. Be balanced — note both strengths and liabilities. Maximum 250 words.', - prompt: (data) => `Assess this organization's software supply-chain posture from an M&A due diligence perspective. - -DATA: -${data} - -Cover: 1) Overall risk rating (Low/Medium/High) for the acquisition context 2) Key liabilities being inherited (be specific) 3) Strengths that reduce risk 4) Estimated remediation effort (minimal/moderate/significant) 5) Deal recommendation — proceed as-is, proceed with conditions, or flag for deeper review.` - } - }; - - /* ---- Check AI availability ---- */ - async function checkAi() { - try { - if (!window.AiNano || !window.AiNano.isSupported()) { - statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'AI not available'; - aiCapabilities = { available: 'no' }; - return false; - } - const caps = await window.AiNano.getAvailability(); - aiCapabilities = caps; - if (caps.available === 'readily') { - statusDot.className = 'dot ready'; - statusTxt.textContent = 'Gemini Nano ready'; - return true; - } - if (caps.available === 'after-download') { - statusDot.className = 'dot downloading'; - statusTxt.textContent = 'Gemini Nano — download needed (click generate to start)'; - return true; - } - statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'AI not available'; - return false; - } catch (e) { - console.warn('AI check failed:', e); - statusDot.className = 'dot unavailable'; - statusTxt.textContent = 'AI not available'; - aiCapabilities = { available: 'no' }; - return false; - } - } - - /* ---- Bootstrap analysis ---- */ - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('AI: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - currentInsights = Agg.buildInsights(data.data); - renderMetrics(currentInsights); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - /* ---- Build compact data for AI ---- */ - function buildAiContext(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const dr = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - const hyg = ins.repoHygiene; - const va = ins.vulnAgeStats; - const dw = va.directDwellMedian; - const age = ins.ageStats; - - const activeRepos = (hyg.activityBuckets['Last 30 days'] || 0) - + (hyg.activityBuckets['30-90 days'] || 0) - + (hyg.activityBuckets['90-180 days'] || 0); - - return { - overview: { - repos: ins.totalRepos, - reposWithSbom: ins.reposWithSbom, - deps: ins.totalDeps, - directDeps: ins.directCount, - transitiveDeps: ins.transitiveCount, - languages: ins.languageStats.slice(0, 5).map(l => l.language) - }, - security: { - critVulns: ch.critical, - highVulns: ch.high, - totalVulns: ch.total, - cveDwellDays: dw, - malwareAlerts: sc.malwareCount, - depConfusion: sc.depConfusionCount - }, - maintenance: { - techDebtGrade: td.grade, - techDebtScore: td.score100, - eolCount: eol.eolCount, - eosCount: eol.eosCount, - majorDrift: dr.buckets.major.total, - driftCoverage: dr.coveragePct, - oldDepsPct: age.coveragePct > 0 - ? Math.round(age.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0) / ins.totalDeps * 100) - : 0 - }, - compliance: { - highRiskLicenses: lic.highRisk, - copyleftDirect: lic.copyleft.direct, - copyleftTransitive: lic.copyleft.transitive, - unknownLicenses: lic.unknown.total, - unpinnedActions: sc.unpinnedActions - }, - hygiene: { - activeRepos, - archivedRepos: hyg.archived, - noSbomRepos: hyg.noSbom, - avgGrade: Object.entries(hyg.gradeDistribution) - .reduce((s, [g, c]) => s + ({ A: 4, B: 3, C: 2, D: 1, F: 0 }[g] || 0) * c, 0) - / (ins.totalRepos || 1) - } - }; - } - - /* ---- Format prompt ---- */ - function formatDataForPrompt(ctx) { - return JSON.stringify(ctx, null, 1); - } - - /* ---- AI generation ---- */ - async function generateAi(modeKey) { - if (!currentInsights || !aiCapabilities) return; - - // Abort previous - if (abortController) { - abortController.abort(); - abortController = null; - } - - const mode = MODES[modeKey]; - if (!mode) return; - - const output = document.getElementById('aiOutput'); - const btns = document.querySelectorAll('.ai-mode-btn'); - - // Disable buttons, show loading - btns.forEach(b => b.disabled = true); - document.querySelectorAll('.ai-mode-btn').forEach(b => { - b.classList.toggle('active', b.dataset.mode === modeKey); - }); - - // Show skeleton - safe(output, `
    -
    -
    -
    `); - - try { - // Need to download? trigger first - if (aiCapabilities.available === 'after-download') { - safe(output, `
    -
    -

    Downloading Gemini Nano model… (one-time, may take a minute)

    -
    `); - } - - const session = await window.AiNano.createSession({ - systemPrompt: mode.system, - temperature: 0.3, - topK: 20 - }); - - const ctx = buildAiContext(currentInsights); - const data = formatDataForPrompt(ctx); - const userPrompt = mode.prompt(data); - - // Use streaming for progressive display - const stream = await session.promptStreaming(userPrompt); - - // Mark as no longer empty - output.classList.remove('empty'); - - let fullText = ''; - const responseDiv = document.createElement('div'); - responseDiv.className = 'ai-response'; - safe(output, ''); - output.appendChild(responseDiv); - - // Add mode label - const modeLabel = document.createElement('h4'); - modeLabel.innerHTML = `${esc(mode.label)}`; - responseDiv.appendChild(modeLabel); - - const contentDiv = document.createElement('div'); - contentDiv.id = 'aiResponseContent'; - responseDiv.appendChild(contentDiv); - - for await (const chunk of stream) { - fullText = chunk; - // Basic markdown-like rendering - contentDiv.innerHTML = renderAiText(fullText) + ''; - } - - // Final render (no cursor) - contentDiv.innerHTML = renderAiText(fullText); - - session.destroy(); - } catch (err) { - if (err.name === 'AbortError' || err.message?.includes('abort')) { - safe(output, `
    Generation cancelled.
    `); - } else { - console.error('AI generation failed:', err); - safe(output, `
    - -

    AI analysis failed: ${esc(err.message || 'Unknown error')}

    - -
    `); - } - } finally { - btns.forEach(b => b.disabled = false); - } - } - - /* ---- Simple markdown-like renderer ---- */ - function renderAiText(text) { - if (!text) return ''; - let html = esc(text); - - // Headings: ### text or ## text - html = html.replace(/^### (.+)$/gm, '
    $1
    '); - html = html.replace(/^## (.+)$/gm, '
    $1
    '); - - // Bold - html = html.replace(/\*\*(.+?)\*\*/g, '$1'); - - // Bullet lists - html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); - html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); - - // Numbered lists - html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); - - // Paragraphs — double newlines - html = html.replace(/\n\n+/g, '

    '); - html = html.replace(/^(.+)$/gm, (m) => { - if (m.startsWith('<') || m.startsWith('')) return m; - return m; - }); - - // Wrap loose text in

    - if (!html.startsWith('<')) { - html = '

    ' + html + '

    '; - } - html = html.replace(/<\/p>\s*

    /g, '

    '); - - return html; - } - - /* ---- Render metrics + AI controls ---- */ - function renderMetrics(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const eol = ins.eolStats; - - const gradeColor = td.score100 >= 75 ? 'var(--color-green)' : td.score100 >= 55 ? 'var(--color-yellow)' : 'var(--color-red)'; - - const kpiHtml = ` -

    -
    ${ins.totalRepos}
    Repos
    -
    ${ins.totalDeps}
    Deps
    -
    ${ch.total}
    C+H Vulns
    -
    ${eol.eolCount}
    EOL
    -
    ${td.grade}
    Grade
    -
    ${td.score100}
    Health
    -
    `; - - const aiAvailable = aiCapabilities && aiCapabilities.available !== 'no'; - - if (!aiAvailable) { - safe(content, kpiHtml + ` -
    - AI not available -
    `); - return; - } - - const modeBtns = Object.entries(MODES).map(([key, m]) => - `` - ).join(''); - const controlsHtml = `
    ${modeBtns}
    `; - const outputHtml = `
    -
    -
    -
    Select an analysis type above to generate AI insights
    -
    -
    `; - const detectNotice = `
    Analysis runs entirely on-device via Gemini Nano — zero data leaves your browser.
    `; - - safe(content, kpiHtml + controlsHtml + outputHtml + detectNotice); - - // Wire up custom events - const output = document.getElementById('aiOutput'); - output.addEventListener('generate', (e) => { - generateAi(e.detail.mode); - }); - output.addEventListener('retry', () => { - const active = document.querySelector('.ai-mode-btn.active'); - if (active) generateAi(active.dataset.mode); - }); - } - - selector.addEventListener('change', loadAnalysis); - await checkAi(); - await loadAnalysesList(); - -})(); diff --git a/js/insights-chat.js b/js/insights-chat.js deleted file mode 100644 index 4c2af6a..0000000 --- a/js/insights-chat.js +++ /dev/null @@ -1,575 +0,0 @@ -/** - * AI Chat (insights-chat.js) — conversational interface with Gemini Nano. - * Multi-turn chat where the AI has full access to your SBOM analysis data. - * All processing on-device — no data leaves your browser. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - - // Bail out gracefully if the page scaffolding is missing (prevents - // "Cannot read properties of null" crashes when a required element, - // e.g. #analysisSelector, is absent from the DOM). - if (!selector || !content || !loading || !noData) { - console.error('Chat: required page elements missing — aborting init', { - selector: !!selector, content: !!content, loading: !!loading, noData: !!noData - }); - return; - } - - /* ---- State ---- */ - let currentInsights = null; - let aiSession = null; - let aiAvailable = false; - let aiDownloading = false; - let isGenerating = false; - let messageCount = 0; - const MAX_MESSAGES = 30; - - /* ---- Allow navigation to other insight pages ---- */ - const NAV_LINKS = { - 'Pulse': 'insights2.html', - 'Portfolio': 'insights3.html', - 'Report Card': 'insights4.html', - 'Snapshot': 'insights5.html', - 'AI Reports': 'insights-ai.html' - }; - - /* ---- Bootstrap ---- */ - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('Chat: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - destroySession(); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - currentInsights = Agg.buildInsights(data.data); - await initChat(); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - selector.addEventListener('change', loadAnalysis); - - /* ---- AI Availability ---- */ - async function checkAi() { - try { - if (!window.AiNano || !window.AiNano.isSupported()) { - aiAvailable = false; - return 'unavailable'; - } - const caps = await window.AiNano.getAvailability(); - if (caps.available === 'readily') { - aiAvailable = true; - return 'ready'; - } - if (caps.available === 'after-download') { - aiAvailable = true; - aiDownloading = true; - return 'download'; - } - aiAvailable = false; - return 'unavailable'; - } catch (e) { - console.warn('Chat AI check:', e); - aiAvailable = false; - return 'unavailable'; - } - } - - /* ---- Build context data for AI ---- */ - function buildAiContext(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const dr = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - const hyg = ins.repoHygiene; - const va = ins.vulnAgeStats; - const dw = va.directDwellMedian; - const age = ins.ageStats; - - const activeRepos = (hyg.activityBuckets['Last 30 days'] || 0) - + (hyg.activityBuckets['30-90 days'] || 0) - + (hyg.activityBuckets['90-180 days'] || 0); - - const oldDepsPct = ins.totalDeps > 0 - ? Math.round(age.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0) / ins.totalDeps * 100) - : 0; - - const avgGrade = ins.totalRepos > 0 - ? Object.entries(hyg.gradeDistribution) - .reduce((s, [g, c]) => s + ({ A: 4, B: 3, C: 2, D: 1, F: 0 }[g] || 0) * c, 0) / ins.totalRepos - : 0; - - const topLangs = ins.languageStats.slice(0, 5).map(l => `${l.language} (${l.count} refs)`).join(', '); - - // Build a clean, readable text summary for the AI - return `ORGANIZATION SBOM ANALYSIS SUMMARY -===================================== - -OVERVIEW -- Repositories analyzed: ${ins.totalRepos} (${ins.reposWithSbom} with SBOMs, ${ins.totalRepos - ins.reposWithSbom} without) -- Total dependencies: ${ins.totalDeps} (${ins.directCount} direct, ${ins.transitiveCount} transitive) -- Top languages: ${topLangs || 'N/A'} - -SECURITY -- Critical vulnerabilities: ${ch.critical} -- High vulnerabilities: ${ch.high} -- Total critical+high: ${ch.total} -- Direct-dep CVE dwell time (median): ${dw !== null ? dw + ' days' : 'N/A'} -- Malware advisories: ${sc.malwareCount} -- Dependency confusion risks: ${sc.depConfusionCount} - -MAINTENANCE & FRESHNESS -- Tech-Health Grade: ${td.grade} (score ${td.score100}/100) -- EOL components: ${eol.eolCount} -- End-of-support components: ${eol.eosCount} -- Dependencies with major updates available: ${dr.buckets.major.total} -- Version drift coverage: ${dr.coveragePct}% -- Dependencies over 2 years old: ${oldDepsPct}% - -LICENSE COMPLIANCE -- High-risk / copyleft licenses: ${lic.highRisk} (${lic.copyleft.direct} direct, ${lic.copyleft.transitive} transitive) -- Unknown licenses: ${lic.unknown.total} -- Unpinned GitHub Actions: ${sc.unpinnedActions} - -REPOSITORY HYGIENE -- Active repos (pushed within 6mo): ${activeRepos} -- Archived repos: ${hyg.archived} -- Average SBOM grade (A=4..F=0): ${avgGrade.toFixed(1)} -- SBOM quality distribution: A=${hyg.gradeDistribution.A || 0} B=${hyg.gradeDistribution.B || 0} C=${hyg.gradeDistribution.C || 0} D=${hyg.gradeDistribution.D || 0} F=${hyg.gradeDistribution.F || 0} - -TECH-DEBT COMPOSITION -- Overall health score: ${td.score100}/100 (Grade ${td.grade}) -- Component weights: Version Drift 30%, Vulnerabilities 30%, Package Age 15%, License Risk 10%, EOL Risk 10%, Repo Hygiene 5%`; - } - - /* ---- Session management ---- */ - async function createSession() { - destroySession(); - - if (!currentInsights || !aiAvailable) return null; - - const contextData = buildAiContext(currentInsights); - - const systemPrompt = `You are a supply-chain security analyst assistant. You have been given SBOM (Software Bill of Materials) analysis data for an organization. Your role is to help executives, CISO, and M&A professionals understand this data. - -RULES: -1. Answer based ONLY on the data provided below. If asked about something not in the data, say so honestly. -2. Use plain, clear language suitable for non-technical executives. -3. Reference specific numbers from the data when relevant (e.g., "There are 12 critical vulnerabilities"). -4. Be concise — aim for 2-3 paragraphs unless asked for detail. -5. When giving recommendations, be specific and actionable. -6. If the data shows no issues in an area, say so positively. -7. Do not make up statistics or claims not supported by the data. - -HERE IS THE ORGANIZATION'S SBOM ANALYSIS DATA: - -${contextData} - -Start each response by addressing what was asked. If someone asks "how are we doing?", give an overall assessment. If they ask about a specific area, focus on that area using the data.`; - - try { - // If download needed, trigger it - if (aiDownloading) { - aiSession = 'downloading'; // placeholder - } - - aiSession = await window.AiNano.createSession({ - systemPrompt: systemPrompt, - temperature: 0.3, - topK: 20 - }); - messageCount = 0; - return aiSession; - } catch (err) { - console.error('Session creation failed:', err); - aiSession = null; - return null; - } - } - - function destroySession() { - if (aiSession && typeof aiSession !== 'string') { - try { aiSession.destroy(); } catch (e) { /* ignore */ } - } - aiSession = null; - messageCount = 0; - } - - /* ---- Chat UI ---- */ - async function initChat() { - const aiStatus = await checkAi(); - - let statusHtml = ''; - if (aiStatus === 'ready') { - statusHtml = ` Gemini Nano ready`; - } else if (aiStatus === 'download') { - statusHtml = ` Gemini Nano available (download on first message)`; - } else { - statusHtml = ` AI not available`; - } - - const metrics = currentInsights ? buildMetricsHtml(currentInsights) : ''; - - const unavailableHtml = !aiAvailable ? ` -
    -
    -
    AI not available
    -
    ` : ''; - - const suggestedQuestions = [ - 'How is our org doing overall?', - 'What are our biggest security risks?', - 'Which vulnerabilities should we fix first?', - 'Give me an M&A due diligence summary', - 'How is our license compliance?', - 'What needs immediate attention?', - 'Are there any supply chain red flags?', - 'Which repos have the worst hygiene?' - ]; - - const chatHtml = ` -
    -

    SBOM Analyst Chat

    -
    Ask questions about your SBOM analysis — AI answers using your data
    -
    -
    ${statusHtml}
    -
    - - -
    -
    ${metrics}
    - ${unavailableHtml} -
    -
    -
    -
    -
    Ask about your SBOM data
    -

    Try one of the suggested questions below, or type your own.

    -
    -
    -
    - ${suggestedQuestions.map(q => - `${esc(q)}` - ).join('')} -
    -
    - - -
    -
    AI responses based on loaded SBOM analysis data · on-device processing
    -
    `; - - safe(content, chatHtml); - wireChatEvents(); - } - - /* ---- Compact metrics row ---- */ - function buildMetricsHtml(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const eol = ins.eolStats; - const lic = ins.licenseStats; - - return ` -
    ${ins.totalRepos}
    Repos
    -
    ${ins.totalDeps}
    Deps
    -
    ${ch.total}
    C+H Vulns
    -
    ${eol.eolCount}
    EOL
    -
    ${lic.highRisk}
    High-Risk Lic
    -
    ${td.grade}
    Grade
    - `; - } - - /* ---- Wire events ---- */ - function wireChatEvents() { - const input = document.getElementById('chatInput'); - const sendBtn = document.getElementById('chatSend'); - const newBtn = document.getElementById('btnNewChat'); - const msgArea = document.getElementById('chatMessages'); - - // Secondary selector - const sel2 = document.getElementById('analysisSelector2'); - if (sel2) { - sel2.addEventListener('change', () => { - // Sync main selector - for (const opt of selector.options) { - if (opt.value === sel2.value) { - selector.value = sel2.value; - break; - } - } - loadAnalysis(); - }); - } - - if (sendBtn) { - sendBtn.addEventListener('click', () => sendMessage()); - } - if (input) { - input.addEventListener('keydown', (e) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - sendMessage(); - } - }); - } - if (newBtn) { - newBtn.addEventListener('click', () => startNewChat()); - } - - // Suggested questions - document.querySelectorAll('.chat-suggestion').forEach(el => { - el.addEventListener('click', () => { - const q = el.dataset.question; - if (q && input) { - input.value = q; - sendMessage(); - } - }); - }); - } - - /* ---- Send message ---- */ - async function sendMessage() { - const input = document.getElementById('chatInput'); - const sendBtn = document.getElementById('chatSend'); - const msgArea = document.getElementById('chatMessages'); - const empty = document.getElementById('chatEmpty'); - const text = input?.value.trim(); - - if (!text || isGenerating || !aiAvailable) return; - - // Reset suggest selection highlight - document.querySelectorAll('.chat-suggestion').forEach(el => el.style.opacity = '0.4'); - - // Ensure session exists - if (!aiSession || aiSession === 'downloading') { - // Show waiting - addSystemMessage('Initializing AI session...'); - const session = await createSession(); - if (!session) { - addSystemMessage('Failed to create AI session. Please try again.'); - return; - } - // Remove the system message - const sysMsg = document.getElementById('sys-init-msg'); - if (sysMsg) sysMsg.remove(); - } - - input.value = ''; - input.disabled = true; - sendBtn.disabled = true; - isGenerating = true; - - if (empty) empty.style.display = 'none'; - - // Add user message - addUserMessage(text); - - // Add AI placeholder (no fixed id — each turn needs its own bubble reference) - const msgDiv = document.createElement('div'); - msgDiv.className = 'chat-msg assistant'; - msgDiv.innerHTML = ` -
    -
    `; - msgArea.appendChild(msgDiv); - scrollToBottom(); - - const bubble = msgDiv.querySelector('.bubble'); - - try { - const stream = await aiSession.promptStreaming(text); - let fullText = ''; - for await (const chunk of stream) { - fullText = chunk; - bubble.innerHTML = renderChatText(fullText) + ''; - scrollToBottom(); - } - bubble.innerHTML = renderChatText(fullText); - - messageCount++; - - // Warn if approaching limit - if (messageCount >= MAX_MESSAGES - 5) { - addSystemMessage(`Conversation getting long (${messageCount} exchanges). Consider starting a new conversation for best quality.`); - } - } catch (err) { - console.error('Chat error:', err); - if (err.name === 'AbortError' || err.message?.includes('abort')) { - bubble.innerHTML = 'Generation cancelled.'; - } else { - bubble.innerHTML = `Error: ${esc(err.message || 'Unknown')}`; - // Try to re-create session on error - destroySession(); - } - } - - input.disabled = false; - sendBtn.disabled = false; - isGenerating = false; - input.focus(); - scrollToBottom(); - - // Restore suggestion opacity - document.querySelectorAll('.chat-suggestion').forEach(el => el.style.opacity = ''); - } - - /* ---- Start new conversation ---- */ - async function startNewChat() { - if (isGenerating) return; - - const msgArea = document.getElementById('chatMessages'); - const empty = document.getElementById('chatEmpty'); - - // Clear messages - if (msgArea) { - while (msgArea.firstChild) msgArea.removeChild(msgArea.firstChild); - if (empty) { - empty.style.display = 'flex'; - msgArea.appendChild(empty); - } - } - - destroySession(); - - // Re-create session in background - if (aiAvailable) { - addSystemMessage('Starting new conversation...'); - const session = await createSession(); - if (session) { - const sysMsg = document.getElementById('sys-init-msg'); - if (sysMsg) sysMsg.remove(); - } - } - - document.getElementById('chatInput')?.focus(); - } - - /* ---- Message helpers ---- */ - function addUserMessage(text) { - const msgArea = document.getElementById('chatMessages'); - const div = document.createElement('div'); - div.className = 'chat-msg user'; - div.innerHTML = `
    ${esc(text)}
    `; - msgArea.appendChild(div); - scrollToBottom(); - } - - function addSystemMessage(text) { - const msgArea = document.getElementById('chatMessages'); - const div = document.createElement('div'); - div.className = 'chat-msg system'; - div.id = text.includes('Initializing') ? 'sys-init-msg' : ''; - div.innerHTML = `
    ${text}
    `; - msgArea.appendChild(div); - scrollToBottom(); - } - - function scrollToBottom() { - const msgArea = document.getElementById('chatMessages'); - if (msgArea) { - msgArea.scrollTop = msgArea.scrollHeight; - } - } - - /* ---- Text renderer ---- */ - function renderChatText(text) { - if (!text) return ''; - let html = esc(text); - - // Bold - html = html.replace(/\*\*(.+?)\*\*/g, '$1'); - - // Inline code - html = html.replace(/`([^`]+)`/g, '$1'); - - // Bullet lists - html = html.replace(/^[\*\-] (.+)$/gm, '
  • $1
  • '); - html = html.replace(/(
  • .*<\/li>\n?)+/g, '
      $&
    '); - - // Numbered lists - html = html.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); - - // Paragraphs - html = html.replace(/\n\n+/g, '

    '); - html = html.replace(/^(.+)$/gm, (m) => { - if (m.startsWith('<') || m.startsWith('')) return m; - return m; - }); - - if (!html.startsWith('<')) { - html = '

    ' + html + '

    '; - } - html = html.replace(/<\/p>\s*

    /g, '

    '); - - return html; - } - - /* ---- Start ---- */ - await loadAnalysesList(); - -})(); diff --git a/licenses.html b/licenses.html index 29b4c18..d867601 100644 --- a/licenses.html +++ b/licenses.html @@ -34,6 +34,7 @@ Audit Findings Insights + Agent Deps Repos Authors diff --git a/repos.html b/repos.html index 171fc87..781fae7 100644 --- a/repos.html +++ b/repos.html @@ -34,6 +34,7 @@ Audit Findings Insights + Agent Deps Repos Authors diff --git a/settings.html b/settings.html index a2197ee..bc671a7 100644 --- a/settings.html +++ b/settings.html @@ -37,6 +37,7 @@ Audit Findings Insights + Agent Deps Repos Authors diff --git a/vuln.html b/vuln.html index 2c42f83..dcaf707 100644 --- a/vuln.html +++ b/vuln.html @@ -36,6 +36,7 @@ Audit Findings Insights + Agent Deps Repos Authors From 438984c3166d452d99926f470aa7114bf2ce5a4f Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Thu, 6 Aug 2026 05:11:46 -0700 Subject: [PATCH 13/19] insights finalized --- .github/workflows/deploy-github-pages.yml | 6 +- .github/workflows/validate-deployment.yml | 8 - CHANGELOG.md | 6 +- about.html | 66 +++++- audit.html | 2 +- authors.html | 2 +- css/style.css | 102 +++++++++ debug.html | 2 +- demo.html | 2 +- deps.html | 2 +- feeds.html | 2 +- findings.html | 2 +- index.html | 2 +- insights-agent.html | 2 +- insights.html | 6 +- insights2.html | 178 --------------- insights3.html | 179 --------------- insights4.html | 196 ----------------- insights5.html | 199 ----------------- js/indexeddb-manager.js | 54 +++-- js/insights-page.js | 123 +++++++++++ js/insights2-page.js | 197 ----------------- js/insights3-page.js | 203 ----------------- js/insights4-page.js | 252 ---------------------- js/insights5-page.js | 154 ------------- licenses.html | 2 +- repos.html | 2 +- settings.html | 2 +- vuln.html | 2 +- 29 files changed, 341 insertions(+), 1614 deletions(-) delete mode 100644 insights2.html delete mode 100644 insights3.html delete mode 100644 insights4.html delete mode 100644 insights5.html delete mode 100644 js/insights2-page.js delete mode 100644 js/insights3-page.js delete mode 100644 js/insights4-page.js delete mode 100644 js/insights5-page.js diff --git a/.github/workflows/deploy-github-pages.yml b/.github/workflows/deploy-github-pages.yml index 6048d99..1ac2e10 100644 --- a/.github/workflows/deploy-github-pages.yml +++ b/.github/workflows/deploy-github-pages.yml @@ -58,13 +58,9 @@ jobs: cp findings.html _site/ cp feeds.html _site/ cp insights.html _site/ - cp insights2.html _site/ - cp insights3.html _site/ - cp insights4.html _site/ - cp insights5.html _site/ cp insights-agent.html _site/ cp demo.html _site/ - echo "✅ Copied 19 HTML files" + echo "✅ Copied 15 HTML files" # Copy JavaScript, CSS, images, and bundled demo SBOM JSON cp -r js _site/ diff --git a/.github/workflows/validate-deployment.yml b/.github/workflows/validate-deployment.yml index 573f4a9..f918a06 100644 --- a/.github/workflows/validate-deployment.yml +++ b/.github/workflows/validate-deployment.yml @@ -40,10 +40,6 @@ jobs: "findings.html" "feeds.html" "insights.html" - "insights2.html" - "insights3.html" - "insights4.html" - "insights5.html" "insights-agent.html" "demo.html" ) @@ -154,10 +150,6 @@ jobs: "js/upload-page.js" "js/insights-aggregator.js" "js/insights-page.js" - "js/insights2-page.js" - "js/insights3-page.js" - "js/insights4-page.js" - "js/insights5-page.js" "js/insights-agent.js" "js/ai-nano.js" "js/demo-page.js" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fc3f5f..5898334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- **IndexedDB open failed with `VersionError: requested version (6) < existing (7)`** (`js/indexeddb-manager.js`): browsers that previously ran a VEX-enabled build already have `sbomplay_db` at schema v7 (`vexDocuments` store). This branch still opened at v6, which IndexedDB rejects and blocked app init (including the Quick demo page). Schema version is now 7, `vexDocuments` is created on upgrade when missing, and `clearAll` / `clearCacheStore` include `locations`, `eoxData`, and `vexDocuments`. + ### Added -- **Executive dashboard variants (experimental, direct URL)** (`insights2.html`–`insights5.html`, `js/insights2-page.js`–`js/insights5-page.js`): four alternate one-screen views over the same `InsightsAggregator` data — **Executive Pulse** (health grade + vital signs), **Risk Portfolio** (Security / Operational / Compliance columns), **Org Report Card** (letter grades with plain-English comments), and **One-Pager Snapshot** (single-viewport tiles + verdict). Not linked from the main nav; useful for comparing exec-facing layouts before picking a default. +- **Risk Portfolio at the top of the Insights page** (`insights.html`, `js/insights-page.js`, `css/style.css`, `about.html`): the winning layout from the experimental dashboard variants is now the header of the main Insights page. Above the existing 10 sections it shows the overall **Tech-Health Score** (Tech-Debt grade + score) and three risk-domain cards — **Security Posture**, **Operational Health**, and **License & Compliance** — each with a 0–100 score bar, key stats, and a Good/Moderate/Needs-Attention traffic light, followed by an overall verdict. New `.rpf-*` styles added to `css/style.css`; scoring methodology documented in a new "Risk portfolio scoring" card on `about.html`. - **On-device AI over SBOM analysis** (`insights-ai.html`, `insights-chat.html`, `insights-agent.html`, `js/insights-ai.js`, `js/insights-chat.js`, `js/insights-agent.js`, `js/ai-nano.js`): three Chrome **Gemini Nano** (Prompt API) experiences that read stored IndexedDB analysis only — **AI** (one-shot executive report modes), **Chat** (multi-turn with full context in the system prompt), and **Agent** (tool-use loop calling in-memory `query_sbom()` handlers). Linked from the Insights page nav (AI / Chat / Agent). All inference runs in the browser; no SBOM data is sent to a remote model. - **Shared Prompt API adapter** (`js/ai-nano.js`): normalizes modern `LanguageModel.availability()` / `LanguageModel.create()` (including `initialPrompts` and download `monitor`) with a legacy `window.ai.languageModel` fallback, and accumulates streaming chunks so UI code works with both delta and cumulative stream semantics. - **"Unpinnable Actions" finding category on the Findings page** (`findings.html`, `js/findings-page.js`, `about.html`): GitHub Actions findings are now split into two categories so the page's Finding-type filter, the category-stat tiles, and the per-rule section cards separate **workflow-level issues** (things the workflow author can fix in their own repo: `MUTABLE_TAG_REFERENCE`, `PULL_REQUEST_TARGET_CHECKOUT`, `EXCESSIVE_WORKFLOW_PERMISSIONS`, `EXCESSIVE_JOB_PERMISSIONS`, `POTENTIAL_HARDCODED_SECRET`) from **unpinnable patterns** per [Palo Alto's "Unpinnable Actions" research](https://www.paloaltonetworks.com/blog/cloud-security/unpinnable-actions-github-security/) — Docker actions whose `action.yml` references an image by floating tag (`DOCKER_IMPLICIT_LATEST`, `DOCKER_FLOATING_TAG`), Dockerfiles whose `FROM` is unpinned (`DOCKERFILE_FLOATING_BASE_IMAGE`), Dockerfiles that install runtime dependencies without version locks or `curl|bash` remote code without integrity checks (`DOCKER_UNPINNED_DEPENDENCIES`, `DOCKER_REMOTE_CODE_NO_INTEGRITY`), composite actions that `uses:` a child action by tag instead of SHA (`COMPOSITE_NESTED_UNPINNED_ACTION`), composite actions that `run:` unpinned package installs or unverified remote scripts (`COMPOSITE_UNPINNED_DEPENDENCIES`, `COMPOSITE_REMOTE_CODE_NO_INTEGRITY`), JavaScript actions that install unpinned packages or download scripts at runtime (`UNPINNED_PACKAGE_INSTALL`, `REMOTE_CODE_NO_INTEGRITY`), and `INDIRECT_UNPINNABLE_ACTION` for actions that pull any of the above transitively. The Finding-type dropdown on `findings.html` gains a new `Unpinnable Actions` option; `js/findings-page.js` ships a module-scope `UNPINNABLE_ACTION_RULES` Set that does the classification at collection time and routes rows through the same renderer as the GitHub Actions category (they share the `action` / `workflowLocations` / `actionRepository` shape). The category-breakdown row was switched from `row-cols-md-5` to `row-cols-md-3 row-cols-xl-6` to fit the new tile (also tightened the "Dependency Confusion" label to "Dep. Confusion" so it stops wrapping). The matching reference doc — a new "Security Findings the Tool Detects" card on `about.html` — lists every rule id under each category with severity badges and a one-line description. @@ -41,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Quick demo fixtures** ([`data/demo/`](data/demo/), [`js/demo-page.js`](js/demo-page.js)): placeholder CycloneDX/SPDX mini samples were removed in favour of the real bundled export [`sbomplay-demo.json`](data/demo/sbomplay-demo.json); CI now validates that file only (extend the list when adding more demos). ### Removed +- **Experimental Insights dashboard variants removed** (`insights2.html`–`insights5.html`, `js/insights2-page.js`–`js/insights5-page.js`): after comparing the four exec-facing layouts, the **Risk Portfolio** view was chosen and merged into the top of the main `insights.html` (see Added); the four standalone experimental pages and their scripts are deleted. Deploy/validate workflows updated accordingly. - **AI Reports and AI Chat pages removed** (`insights-ai.html`, `insights-chat.html`, `js/insights-ai.js`, `js/insights-chat.js`): only the **Agent** page (`insights-agent.html`) is kept for on-device Gemini Nano analysis. Nav links on Insights/Agent, About methodology card, and deploy/validate workflows updated accordingly. Shared `js/ai-nano.js` remains (used by the Agent). - **Malware page removed from navigation and site** (`malware.html`, `js/malware-page.js`): malware findings are already surfaced on the Findings page, making the standalone Malware page redundant. The page, its page-specific JS, and all nav links have been removed. The vuln-page malware banner now links to the Findings page instead. `malware-service.js` is retained — it still powers MAL- advisory filtering on the Vulns and Findings pages. Workflow files updated to reflect 12 HTML pages. - **Feeds page removed from top navigation** (`feeds.html`): the page is retained and fully functional but no longer occupies a slot in the header navbar, reducing nav clutter ahead of the upcoming Insights page. Users can still access it via direct URL. diff --git a/about.html b/about.html index 136cb73..fd9e630 100644 --- a/about.html +++ b/about.html @@ -6,9 +6,9 @@ SBOM Play - About - - - + + + @@ -97,11 +97,12 @@

  • How it works
  • Direct vs transitive
  • Tech-debt scoring
  • +
  • Risk portfolio scoring
  • End-of-life detection
  • + +
    +
    +
    Risk Portfolio Scoring
    +
    +
    +

    + At the top of the Insights page, the same underlying metrics that feed the Tech-Debt composite are + re-projected into three risk domains aimed at due-diligence and M&A audiences. + Each domain gets an independent 0–100 score (higher is healthier) and a traffic-light verdict, + while the overall Tech-Health Score shown in the header is the Tech-Debt composite + score and grade (see Tech-debt scoring). +

    + +
    Domain Scores
    + + + + + + + + + + + + + + + + + + +
    DomainFormula (starts at 100, penalties subtracted)
    Security Posture−20 per critical vuln, −8 per high vuln, −25 per malware advisory, + and −15 / −8 when the median direct-dep CVE dwell time exceeds 90 / 30 days.
    Operational Health−3 per EOL component, −5 per repo inactive > 1 year, −3 per repo + missing an SBOM (major-drift components are folded in as a partial offset).
    License & Compliance−8 per high-risk license, −2 per unpinned GitHub Action.
    + +
    Verdict Thresholds
    + + + + + + + + + +
    Traffic lightPenalty (100 − score)Overall verdict (Tech-Health)
    Good≤ 30≥ 75: low risk — standard monitoring
    Moderate31 – 5555 – 74: moderate risk — plan remediation
    Needs Attention> 55< 55: elevated risk — active remediation
    + +
    + + Heuristic weights: the domain penalty coefficients are tuned for at-a-glance triage, + not a formal risk model. The authoritative single number remains the Tech-Health / Tech-Debt score. +
    +
    +
    +
    diff --git a/audit.html b/audit.html index 74e3330..1df4bd4 100644 --- a/audit.html +++ b/audit.html @@ -184,7 +184,7 @@
    About Cyfinoid Research
    - + diff --git a/authors.html b/authors.html index 9b503f1..c447f16 100644 --- a/authors.html +++ b/authors.html @@ -208,7 +208,7 @@
    - + diff --git a/css/style.css b/css/style.css index 2b6cffb..a04bab6 100644 --- a/css/style.css +++ b/css/style.css @@ -3825,6 +3825,108 @@ body { height: 14px; border-radius: 2px; min-width: 2px; +} + +/* Insights — Risk Portfolio (overall score + risk-domain cards) */ +.rpf-header { text-align: center; padding: var(--space-4) 0 var(--space-3); } +.rpf-overall { + display: inline-flex; align-items: center; gap: var(--space-4); + background: var(--bg-tertiary); border: 1px solid var(--border-color); + border-radius: 1.5rem; padding: var(--space-3) var(--space-5); +} +.rpf-overall .grade { + font-size: 2.8rem; font-weight: 800; line-height: 1; +} +.rpf-overall .score { + font-size: var(--font-size-section); color: var(--text-secondary); +} +.rpf-overall .score strong { font-size: 1.6rem; display: block; color: var(--text-primary); } + +.rpf-domain { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 1.25rem; + padding: var(--space-4); + height: 100%; +} +.rpf-domain h3 { + font-size: var(--font-size-subheading); + font-weight: 700; + margin-bottom: var(--space-3); +} +.rpf-domain h3 i { margin-right: var(--space-2); width: 1.8rem; text-align: center; } + +.rpf-scorebar-wrap { + margin-bottom: var(--space-4); + text-align: center; +} +.rpf-scorebar { + height: 10px; + border-radius: 5px; + background: var(--bg-tertiary); + overflow: hidden; + margin-bottom: var(--space-1); +} +.rpf-scorebar .fill { + height: 100%; + border-radius: 5px; + transition: width 0.6s ease; +} +.rpf-scorebar-label { + display: flex; + justify-content: space-between; + font-size: var(--font-size-caption); + color: var(--text-secondary); +} + +.rpf-stat { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-2) 0; + border-bottom: 1px solid var(--border-color); + font-size: var(--font-size-body); +} +.rpf-stat:last-child { border-bottom: none; } +.rpf-stat .value { font-weight: 700; } +.rpf-stat .label { color: var(--text-secondary); } + +.rpf-badge { + display: inline-block; + padding: 0.15rem 0.6rem; + border-radius: 0.5rem; + font-size: 0.75rem; + font-weight: 700; +} +.rpf-badge.good { background: var(--bg-success); color: var(--color-green); } +.rpf-badge.warn { background: var(--bg-warning); color: var(--color-yellow); } +.rpf-badge.bad { background: var(--bg-danger); color: var(--color-red); } + +.rpf-legend { + display: flex; gap: var(--space-4); justify-content: center; + margin-bottom: var(--space-4); + font-size: var(--font-size-caption); + color: var(--text-secondary); +} +.rpf-legend span { display: flex; align-items: center; gap: var(--space-1); } +.rpf-legend i { font-size: 0.6rem; } + +.rpf-verdict { + text-align: center; + padding: var(--space-4); + background: var(--bg-tertiary); + border-radius: 1rem; + border: 1px solid var(--border-color); + margin-top: var(--space-4); +} +.rpf-verdict .text { + font-size: var(--font-size-section); + font-weight: 600; +} +.rpf-verdict .sub { + font-size: var(--font-size-caption); + color: var(--text-secondary); + margin-top: var(--space-1); } /* ============================================================ Phase 1.5 / 4 — shared components diff --git a/debug.html b/debug.html index 5531def..870e3cd 100644 --- a/debug.html +++ b/debug.html @@ -397,7 +397,7 @@
    About Cyfinoid Research
    - + diff --git a/demo.html b/demo.html index 58b0f96..0956b1b 100644 --- a/demo.html +++ b/demo.html @@ -110,7 +110,7 @@
    About Cyfinoid Research
    - + diff --git a/deps.html b/deps.html index 6c7b9e2..7d09ca4 100644 --- a/deps.html +++ b/deps.html @@ -295,7 +295,7 @@ - + diff --git a/feeds.html b/feeds.html index ee8f875..3a090ff 100644 --- a/feeds.html +++ b/feeds.html @@ -248,7 +248,7 @@
    About Cyfinoid Research
    - + diff --git a/findings.html b/findings.html index 8b22046..af53a37 100644 --- a/findings.html +++ b/findings.html @@ -199,7 +199,7 @@
    About Cyfinoid Research
    - + diff --git a/index.html b/index.html index 31cc56c..3c76327 100644 --- a/index.html +++ b/index.html @@ -608,7 +608,7 @@
    About Cyfinoid Research
    - + diff --git a/insights-agent.html b/insights-agent.html index f6eafee..8bdac03 100644 --- a/insights-agent.html +++ b/insights-agent.html @@ -132,7 +132,7 @@
    © 2026 Cyfinoid Research. · On-device AI with built-in tool-use.
    - + diff --git a/insights.html b/insights.html index eee28a5..4c88374 100644 --- a/insights.html +++ b/insights.html @@ -6,7 +6,7 @@ SBOM Play - Insights - + @@ -145,13 +145,13 @@
    About Cyfinoid Research
    - + - + diff --git a/insights2.html b/insights2.html deleted file mode 100644 index b62ea2e..0000000 --- a/insights2.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - SBOM Play — Executive Pulse - - - - - - - - - - - Skip to content - - -
    -

    Executive Pulse

    -

    At-a-glance health assessment for decision-makers

    - -
    - -
    - -
    - No analysis data found. Run a scan first. -
    - -
    -
    Loading...

    Assessing org health…

    -
    - -
    -
    © Cyfinoid Research. All rights reserved.
    -
    - - - - - - - - - - - diff --git a/insights3.html b/insights3.html deleted file mode 100644 index a87dc84..0000000 --- a/insights3.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - SBOM Play — Risk Portfolio - - - - - - - - - - - Skip to content - - -
    -

    Risk Portfolio

    -

    Risk-domain segmentation for due-diligence reviews

    - -
    - -
    - -
    - No analysis data found. Run a scan first. -
    - -

    Assessing risk portfolio…

    -
    -
    - -
    -
    © Cyfinoid Research.
    -
    - - - - - - - - - - - diff --git a/insights4.html b/insights4.html deleted file mode 100644 index d57be33..0000000 --- a/insights4.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - SBOM Play — Org Report Card - - - - - - - - - - - Skip to content - - -
    -
    -

    Org Health Report Card

    -
    -
    -
    - -
    - -
    - -
    - No analysis data found. Run a scan first. -
    - -

    Preparing report card…

    -
    -
    - -
    -
    © Cyfinoid Research.
    -
    - - - - - - - - - - - diff --git a/insights5.html b/insights5.html deleted file mode 100644 index cd966ca..0000000 --- a/insights5.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - SBOM Play — Snapshot - - - - - - - - - - - Skip to content - - -
    -
    - -
    - -
    - No analysis data found. Run a scan first. -
    - -

    Taking snapshot…

    -
    -
    - -
    -
    © Cyfinoid Research.
    -
    - - - - - - - - - - - diff --git a/js/indexeddb-manager.js b/js/indexeddb-manager.js index e270c5f..00a13ef 100644 --- a/js/indexeddb-manager.js +++ b/js/indexeddb-manager.js @@ -4,7 +4,9 @@ class IndexedDBManager { constructor() { this.dbName = 'sbomplay_db'; - this.version = 6; // Current database version - v6 adds eoxData store + // v6: eoxData store. v7: vexDocuments store (must stay >= 7 so browsers + // that already upgraded from a VEX-enabled build can still open the DB). + this.version = 7; this.db = null; } @@ -134,6 +136,15 @@ class IndexedDBManager { eoxStore.createIndex('fetchedAt', 'fetchedAt', { unique: false }); console.log('✅ Created eoxData object store'); } + + // v7 — VEX/VDR documents (user uploads). Created with contains() + // guards so v6 DBs upgrade in place; already-v7 DBs skip this. + if (!db.objectStoreNames.contains('vexDocuments')) { + const vexStore = db.createObjectStore('vexDocuments', { keyPath: 'vexId' }); + vexStore.createIndex('format', 'format', { unique: false }); + vexStore.createIndex('uploadedAt', 'uploadedAt', { unique: false }); + console.log('✅ Created vexDocuments object store'); + } }; }); } @@ -377,7 +388,7 @@ class IndexedDBManager { } /** - * Clear all data + * Clear all data. Skips stores missing on older schemas via contains(). */ async clearAll() { try { @@ -385,24 +396,20 @@ class IndexedDBManager { console.warn('⚠️ IndexedDB not initialized yet'); return false; } - const transaction = this.db.transaction( - ['organizations', 'repositories', 'vulnerabilities', 'metadata', 'authors', - 'packages', 'packageAuthors', 'authorEntities'], - 'readwrite' - ); - - await Promise.all([ - this._promisifyRequest(transaction.objectStore('organizations').clear()), - this._promisifyRequest(transaction.objectStore('repositories').clear()), - this._promisifyRequest(transaction.objectStore('vulnerabilities').clear()), - this._promisifyRequest(transaction.objectStore('metadata').clear()), - this._promisifyRequest(transaction.objectStore('authors').clear()), - this._promisifyRequest(transaction.objectStore('packages').clear()), - this._promisifyRequest(transaction.objectStore('packageAuthors').clear()), - this._promisifyRequest(transaction.objectStore('authorEntities').clear()) - ]); - - console.log('✅ Cleared all IndexedDB data'); + const allStores = [ + 'organizations', 'repositories', 'vulnerabilities', 'metadata', 'authors', + 'packages', 'packageAuthors', 'authorEntities', 'locations', 'eoxData', + 'vexDocuments' + ]; + const presentStores = allStores.filter(name => this.db.objectStoreNames.contains(name)); + if (presentStores.length === 0) return true; + + const transaction = this.db.transaction(presentStores, 'readwrite'); + await Promise.all(presentStores.map(name => + this._promisifyRequest(transaction.objectStore(name).clear()) + )); + + console.log(`✅ Cleared all IndexedDB data (${presentStores.join(', ')})`); return true; } catch (error) { console.error('❌ Failed to clear all data:', error); @@ -816,8 +823,11 @@ class IndexedDBManager { return false; } - const validStores = ['packages', 'authorEntities', 'packageAuthors', 'vulnerabilities', - 'authors', 'organizations', 'repositories', 'metadata']; + const validStores = [ + 'packages', 'authorEntities', 'packageAuthors', 'vulnerabilities', + 'authors', 'organizations', 'repositories', 'metadata', + 'locations', 'eoxData', 'vexDocuments' + ]; if (!validStores.includes(storeName)) { console.error(`❌ Invalid store name: ${storeName}`); diff --git a/js/insights-page.js b/js/insights-page.js index 234f184..0d7831c 100644 --- a/js/insights-page.js +++ b/js/insights-page.js @@ -145,6 +145,7 @@ const sections = [ renderCoverageBanner(ins, raw), + renderRiskPortfolio(ins), window.InsightsAggregator.renderKpiStrip(ins, { linkMap }), renderLanguageStack(ins), renderAgeSection(ins), @@ -161,6 +162,128 @@ wireExpandToggles(); } + // ----------------------------------------------------------------------- + // 0. Risk Portfolio — overall Tech-Health score + risk-domain cards + // (Security / Operational / Compliance). Shown at the top. + // ----------------------------------------------------------------------- + function rpfBadge(val, good, warn) { + if (val <= good) return 'Good'; + if (val <= warn) return 'Moderate'; + return 'Needs Attention'; + } + + function rpfScoreBar(pct, color) { + return `
    +
    +
    0${pct}/100
    +
    `; + } + + function rpfStatRow(label, value, colorClass) { + return `
    ${esc(label)}${value}
    `; + } + + function renderRiskPortfolio(ins) { + const td = ins.techDebt; + const ch = ins.critHigh; + const drift = ins.driftStats; + const eol = ins.eolStats; + const lic = ins.licenseStats; + const sc = ins.supplyChain; + const dwell = ins.vulnAgeStats.directDwellMedian; + const hyg = ins.repoHygiene; + + /* ---- Security domain ---- */ + const secScore = Math.max(0, 100 - + (ch.critical * 20 + ch.high * 8 + + (sc.malwareCount * 25) + + (dwell !== null && dwell > 90 ? 15 : dwell !== null && dwell > 30 ? 8 : 0))); + const secColor = secScore >= 70 ? 'var(--color-green)' : secScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + const secHtml = ` +
    +

    Security Posture

    + ${rpfScoreBar(secScore, secColor)} + ${rpfStatRow('Crit + High Vulns', ch.total, ch.total > 0 ? 'text-danger fw-bold' : '')} + ${rpfStatRow('CVE Dwell (median)', dwell !== null ? dwell + ' days' : '--')} + ${rpfStatRow('Malware Advisories', sc.malwareCount, sc.malwareCount > 0 ? 'text-danger fw-bold' : '')} + ${rpfStatRow('Dep Confusion Risks', sc.depConfusionCount, sc.depConfusionCount > 0 ? 'text-warning' : '')} +
    ${rpfBadge(100 - secScore, 30, 55)}
    +
    `; + + /* ---- Operational domain ---- */ + const staleRepos = hyg.activityBuckets['> 1 year'] || 0; + const opScore = Math.max(0, 100 - + (eol.eolCount * 3) + + (drift.buckets.major.total * 2) + + (staleRepos * 5) + + (hyg.noSbom * 3)); + const opScoreClamped = Math.max(0, Math.min(100, opScore)); + const opColor = opScoreClamped >= 70 ? 'var(--color-green)' : opScoreClamped >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + const opHtml = ` +
    +

    Operational Health

    + ${rpfScoreBar(opScoreClamped, opColor)} + ${rpfStatRow('Repositories Analyzed', ins.totalRepos)} + ${rpfStatRow('With SBOM', ins.reposWithSbom)} + ${rpfStatRow('EOL Components', eol.eolCount, eol.eolCount > 0 ? 'text-danger fw-bold' : '')} + ${rpfStatRow('Major Drift', drift.buckets.major.total, drift.buckets.major.total > 0 ? 'text-warning' : '')} + ${rpfStatRow('Repos Inactive >1yr', staleRepos, staleRepos > 0 ? 'text-warning' : '')} +
    ${rpfBadge(100 - opScoreClamped, 30, 55)}
    +
    `; + + /* ---- Compliance domain ---- */ + const compScore = Math.max(0, 100 - (lic.highRisk * 8) - (sc.unpinnedActions * 2)); + const compColor = compScore >= 70 ? 'var(--color-green)' : compScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; + + const compHtml = ` +
    +

    License & Compliance

    + ${rpfScoreBar(compScore, compColor)} + ${rpfStatRow('High-Risk Licenses', lic.highRisk, lic.highRisk > 0 ? 'text-warning fw-bold' : '')} + ${rpfStatRow('Copyleft (direct)', lic.copyleft.direct, lic.copyleft.direct > 0 ? 'text-warning' : '')} + ${rpfStatRow('Copyleft (transitive)', lic.copyleft.transitive)} + ${rpfStatRow('Unknown Licenses', lic.unknown.total, lic.unknown.total > 0 ? 'text-muted' : '')} + ${rpfStatRow('Unpinned GH Actions', sc.unpinnedActions, sc.unpinnedActions > 0 ? 'text-warning' : '')} +
    ${rpfBadge(100 - compScore, 30, 55)}
    +
    `; + + /* ---- Overall verdict ---- */ + const overallScore = td.score100; + const verdictClass = overallScore >= 75 ? 'text-success' : overallScore >= 55 ? 'text-warning' : 'text-danger'; + const verdictText = overallScore >= 75 ? 'Low risk profile — standard monitoring advised.' + : overallScore >= 55 ? 'Moderate risk — review flagged items and set remediation plan.' + : 'Elevated risk — active remediation recommended before proceeding.'; + + const legendHtml = `
    + Good + Moderate + Needs Attention +
    `; + + const verdictHtml = `
    +
    ${esc(verdictText)}
    +
    Tech-Health Score ${overallScore}/100 (Grade ${td.grade})
    +
    `; + + return `
    +
    +
    +
    ${td.grade}
    +
    Tech-Health${td.score100}/100
    +
    +
    + ${legendHtml} +
    +
    ${secHtml}
    +
    ${opHtml}
    +
    ${compHtml}
    +
    + ${verdictHtml} +
    `; + } + // ----------------------------------------------------------------------- // 1. Coverage banner // ----------------------------------------------------------------------- diff --git a/js/insights2-page.js b/js/insights2-page.js deleted file mode 100644 index 29ed804..0000000 --- a/js/insights2-page.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Executive Pulse (insights2-page.js) — CISO / M&A one-glance dashboard. - * Design: giant health grade + 6 vital-sign cards + risk bullets. - * No charts, no tables — pure signal. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - - /* ------------------------------------------------------------------ */ - /* Bootstrap */ - /* ------------------------------------------------------------------ */ - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('Pulse: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - renderPulse(Agg.buildInsights(data.data)); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - selector.addEventListener('change', loadAnalysis); - await loadAnalysesList(); - - /* ------------------------------------------------------------------ */ - /* Render */ - /* ------------------------------------------------------------------ */ - function renderPulse(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const drift = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - const dwell = ins.vulnAgeStats.directDwellMedian; - - /* ---- hero grade ---- */ - const gradeClass = 'grade-' + td.grade.toLowerCase(); - const gradeSummary = td.score100 >= 75 ? 'Healthy' - : td.score100 >= 55 ? 'Fair' - : td.score100 >= 35 ? 'Concerning' - : 'At Risk'; - - const heroHtml = ` -
    -
    ${td.grade}
    -
    ${gradeSummary}
    -
    Health Score ${td.score100}/100
    -
    `; - - /* ---- vital signs ---- */ - const vulnColor = ch.total === 0 ? 'epulse-status-good' : (ch.critical > 0 ? 'epulse-status-bad' : 'epulse-status-warn'); - const eolColor = eol.eolCount === 0 ? 'epulse-status-good' : 'epulse-status-bad'; - const licenseColor = lic.highRisk === 0 ? 'epulse-status-good' : 'epulse-status-warn'; - const driftColor = drift.buckets.major.total === 0 ? 'epulse-status-good' : 'epulse-status-warn'; - const dwellColor = dwell === null ? 'epulse-status-muted' : (dwell > 90 ? 'epulse-status-bad' : (dwell > 30 ? 'epulse-status-warn' : 'epulse-status-good')); - const reposColor = ins.reposWithoutSbom > ins.totalRepos / 2 ? 'epulse-status-warn' : 'epulse-status-good'; - - function vital(icon, value, label, colorClass, sub) { - return `
    -
    -
    ${value}
    -
    ${label}
    - ${sub ? `
    ${sub}
    ` : ''} -
    `; - } - - const vitalHtml = ` -
    - ${vital('fas fa-shield-alt', ch.total, 'Crit + High Vulns', vulnColor, ch.critical > 0 ? `${ch.critical} crit, ${ch.high} high` : 'None')} - ${vital('fas fa-boxes', ins.totalDeps, 'Dependencies', 'epulse-status-muted', `${ins.directCount} direct, ${ins.transitiveCount} transitive`)} - ${vital('fas fa-hourglass-end', eol.eolCount, 'EOL Components', eolColor, `${eol.eosCount} end-of-support`)} - ${vital('fas fa-balance-scale', lic.highRisk, 'High-Risk Licenses', licenseColor, `${lic.copyleft.total} copyleft`)} - ${vital('fas fa-code-branch', drift.coveragePct + '%', 'Version Drift Coverage', driftColor, `${drift.buckets.major.total} major lagging`)} - ${vital('fas fa-clock', dwell !== null ? dwell + 'd' : '--', 'CVE Dwell (median)', dwellColor, 'direct-dep vulns')} -
    -
    - ${vital('fas fa-database', ins.totalRepos, 'Repositories Analyzed', reposColor, `${ins.reposWithSbom} with SBOM`)} - ${vital('fas fa-heartbeat', td.grade, 'Tech-Health Grade', `epulse-status-${td.score100 >= 55 ? 'good' : 'bad'}`, `score ${td.score100}/100`)} -
    `; - - /* ---- "Needs Attention" risks ---- */ - const risks = []; - if (ch.total > 0) { - risks.push({ icon: 'fas fa-bug text-danger', title: `${ch.total} critical/high vulnerabilities found`, detail: `${ch.critical} critical, ${ch.high} high — prioritize patching` }); - } - if (eol.eolCount > 0) { - risks.push({ icon: 'fas fa-hourglass-end text-warning', title: `${eol.eolCount} components past end-of-life`, detail: `${eol.eosCount} also end-of-support — upgrade or replace` }); - } - if (lic.highRisk > 0) { - risks.push({ icon: 'fas fa-gavel text-warning', title: `${lic.highRisk} high-risk license obligations`, detail: `${lic.copyleft.direct} direct, ${lic.copyleft.transitive} transitive — legal review recommended` }); - } - if (sc.malwareCount > 0) { - risks.push({ icon: 'fas fa-skull-crossbones text-danger', title: `${sc.malwareCount} malware alerts`, detail: 'Malicious packages detected — investigate immediately' }); - } - if (sc.depConfusionCount > 0) { - risks.push({ icon: 'fas fa-question-circle text-warning', title: `${sc.depConfusionCount} dependency confusion risks`, detail: 'Packages not found on registry — potential supply-chain attack vector' }); - } - if (sc.unpinnedActions > 0) { - risks.push({ icon: 'fas fa-code-branch text-warning', title: `${sc.unpinnedActions} unpinned GitHub Actions`, detail: 'Mutable refs in CI pipeline — pin to immutable commit SHAs' }); - } - if (drift.buckets.major.total > 20) { - risks.push({ icon: 'fas fa-arrow-up text-warning', title: `${drift.buckets.major.total} dependencies with major updates available`, detail: 'Version drift indicates stale dependencies — schedule update cycle' }); - } - if (dwell !== null && dwell > 90) { - risks.push({ icon: 'fas fa-clock text-danger', title: `CVE dwell time at ${dwell} days median`, detail: 'Critical/high vulns sit open too long — accelerate patch SLA' }); - } - - /* ---- "On Track" highlights ---- */ - const clears = []; - if (ch.total === 0) clears.push('No critical or high vulnerabilities'); - if (eol.eolCount === 0) clears.push('No end-of-life components'); - if (lic.highRisk === 0) clears.push('No high-risk license obligations'); - if (sc.malwareCount === 0) clears.push('No malware advisories'); - if (sc.depConfusionCount === 0) clears.push('No dependency confusion risks'); - if (drift.buckets.major.total === 0 && drift.coveragePct >= 80) clears.push('Dependencies are up-to-date'); - if (dwell !== null && dwell <= 30) clears.push('Vulnerabilities patched promptly (≤30 days dwell)'); - if (ins.totalRepos > 0 && ins.reposWithoutSbom === 0) clears.push('All repositories have SBOMs'); - - const riskHtml = risks.length > 0 ? ` -

    Needs Attention

    -
    - ${risks.map(r => ` -
    -
    -
    ${esc(r.title)}${esc(r.detail)}
    -
    - `).join('')} -
    ` : ''; - - const clearHtml = clears.length > 0 ? ` -

    On Track

    -
    - ${clears.map(c => `
    ${esc(c)}
    `).join('')} -
    ` : ''; - - safe(content, heroHtml + vitalHtml + riskHtml + clearHtml); - } - -})(); diff --git a/js/insights3-page.js b/js/insights3-page.js deleted file mode 100644 index 6d99244..0000000 --- a/js/insights3-page.js +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Risk Portfolio (insights3-page.js) — domain-segmented risk view. - * Three columns: Security, Operational, Compliance. - * Each has a score bar, key stats, and traffic-light badge. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('Portfolio: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - renderPortfolio(Agg.buildInsights(data.data)); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - selector.addEventListener('change', loadAnalysis); - await loadAnalysesList(); - - /* ------------------------------------------------------------------ */ - /* Helpers */ - /* ------------------------------------------------------------------ */ - function badge(val, good, warn) { - if (val <= good) return 'Good'; - if (val <= warn) return 'Moderate'; - return 'Needs Attention'; - } - - function scoreBar(pct, color) { - return `
    -
    -
    0${pct}/100
    -
    `; - } - - function statRow(label, value, colorClass) { - return `
    ${esc(label)}${value}
    `; - } - - /* ------------------------------------------------------------------ */ - /* Render */ - /* ------------------------------------------------------------------ */ - function renderPortfolio(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const drift = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - const dwell = ins.vulnAgeStats.directDwellMedian; - const hyg = ins.repoHygiene; - - /* ---- Security domain ---- */ - const secScore = Math.max(0, 100 - - (ch.critical * 20 + ch.high * 8 + - (sc.malwareCount * 25) + - (dwell !== null && dwell > 90 ? 15 : dwell !== null && dwell > 30 ? 8 : 0))); - const secColor = secScore >= 70 ? 'var(--color-green)' : secScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; - - let secHtml = ` -
    -

    Security Posture

    - ${scoreBar(secScore, secColor)} - ${statRow('Crit + High Vulns', ch.total, ch.total > 0 ? 'text-danger fw-bold' : '')} - ${statRow('CVE Dwell (median)', dwell !== null ? dwell + ' days' : '--')} - ${statRow('Malware Advisories', sc.malwareCount, sc.malwareCount > 0 ? 'text-danger fw-bold' : '')} - ${statRow('Dep Confusion Risks', sc.depConfusionCount, sc.depConfusionCount > 0 ? 'text-warning' : '')} -
    ${badge(100 - secScore, 30, 55)}
    -
    `; - - /* ---- Operational domain ---- */ - const staleRepos = hyg.activityBuckets['> 1 year'] || 0; - const opScore = Math.max(0, 100 - - (eol.eolCount * 3) + - (drift.buckets.major.total * 2) + - (staleRepos * 5) + - (hyg.noSbom * 3)); - const opScoreClamped = Math.max(0, Math.min(100, opScore)); - const opColor = opScoreClamped >= 70 ? 'var(--color-green)' : opScoreClamped >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; - - let opHtml = ` -
    -

    Operational Health

    - ${scoreBar(opScoreClamped, opColor)} - ${statRow('Repositories Analyzed', ins.totalRepos)} - ${statRow('With SBOM', ins.reposWithSbom)} - ${statRow('EOL Components', eol.eolCount, eol.eolCount > 0 ? 'text-danger fw-bold' : '')} - ${statRow('Major Drift', drift.buckets.major.total, drift.buckets.major.total > 0 ? 'text-warning' : '')} - ${statRow('Repos Inactive >1yr', staleRepos, staleRepos > 0 ? 'text-warning' : '')} -
    ${badge(100 - opScoreClamped, 30, 55)}
    -
    `; - - /* ---- Compliance domain ---- */ - const compScore = Math.max(0, 100 - (lic.highRisk * 8) - (sc.unpinnedActions * 2)); - const compColor = compScore >= 70 ? 'var(--color-green)' : compScore >= 45 ? 'var(--color-yellow)' : 'var(--color-red)'; - - let compHtml = ` -
    -

    License & Compliance

    - ${scoreBar(compScore, compColor)} - ${statRow('High-Risk Licenses', lic.highRisk, lic.highRisk > 0 ? 'text-warning fw-bold' : '')} - ${statRow('Copyleft (direct)', lic.copyleft.direct, lic.copyleft.direct > 0 ? 'text-warning' : '')} - ${statRow('Copyleft (transitive)', lic.copyleft.transitive)} - ${statRow('Unknown Licenses', lic.unknown.total, lic.unknown.total > 0 ? 'text-muted' : '')} - ${statRow('Unpinned GH Actions', sc.unpinnedActions, sc.unpinnedActions > 0 ? 'text-warning' : '')} -
    ${badge(100 - compScore, 30, 55)}
    -
    `; - - /* ---- Overall verdict ---- */ - const overallScore = td.score100; - const verdictClass = overallScore >= 75 ? 'text-success' : overallScore >= 55 ? 'text-warning' : 'text-danger'; - const verdictText = overallScore >= 75 ? 'Low risk profile — standard monitoring advised.' - : overallScore >= 55 ? 'Moderate risk — review flagged items and set remediation plan.' - : 'Elevated risk — active remediation recommended before proceeding.'; - - const legendHtml = `
    - Good - Moderate - Needs Attention -
    `; - - const verdictHtml = `
    -
    ${esc(verdictText)}
    -
    Tech-Health Score ${overallScore}/100 (Grade ${td.grade})
    -
    `; - - safe(content, ` -
    -
    -
    ${td.grade}
    -
    Tech-Health${td.score100}/100
    -
    -
    - ${legendHtml} -
    -
    ${secHtml}
    -
    ${opHtml}
    -
    ${compHtml}
    -
    - ${verdictHtml} - `); - } - -})(); diff --git a/js/insights4-page.js b/js/insights4-page.js deleted file mode 100644 index ae9a15d..0000000 --- a/js/insights4-page.js +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Org Report Card (insights4-page.js) — school-report format. - * Overall GPA + subject-level letter grades with plain-English comments. - * Everyone understands a report card. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - const dateEl = document.getElementById('reportDate'); - const scopeEl = document.getElementById('reportScope'); - - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('ReportCard: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - const scope = !name || name === '' ? 'All Analyses (combined)' : name; - scopeEl.textContent = scope; - dateEl.textContent = 'Generated ' + new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); - - renderReportCard(Agg.buildInsights(data.data)); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - selector.addEventListener('change', loadAnalysis); - document.getElementById('reportDate').textContent = 'Generated ' + new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); - await loadAnalysesList(); - - /* ------------------------------------------------------------------ */ - /* Subject grade logic */ - /* ------------------------------------------------------------------ */ - function subjectGrade(score100) { - if (score100 >= 90) return { grade: 'A', status: 'Excellent', statusClass: 'excellent' }; - if (score100 >= 75) return { grade: 'B', status: 'Good', statusClass: 'good' }; - if (score100 >= 55) return { grade: 'C', status: 'Fair', statusClass: 'fair' }; - if (score100 >= 35) return { grade: 'D', status: 'Poor', statusClass: 'poor' }; - return { grade: 'F', status: 'Needs Work', statusClass: 'poor' }; - } - - function computeSubjectGrades(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const drift = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - - /* Vulnerability Management */ - const vulnScore = Math.max(0, 100 - (ch.critical * 20 + ch.high * 8)); - const vg = subjectGrade(vulnScore); - - /* Version Freshness (drift) */ - const driftPct = drift.total > 0 ? (drift.covered / drift.total) : 1; - const driftGrade = Math.max(0, 100 - - (drift.buckets.major.total * 4) - - (drift.buckets.minor.total) + - Math.round(driftPct * 10)); - const dg = subjectGrade(Math.min(100, driftGrade)); - - /* License Compliance */ - const licCoverage = lic.permissive.total + lic.copyleft.total + lic.unknown.total; - const licScore = licCoverage > 0 - ? Math.max(0, 100 - (lic.highRisk / licCoverage) * 80) - : 100; - const lg = subjectGrade(licScore); - - /* Code Activity (hygiene) */ - const hyg = ins.repoHygiene; - const activeRatio = ins.totalRepos > 0 - ? (hyg.activityBuckets['Last 30 days'] + hyg.activityBuckets['30-90 days'] + hyg.activityBuckets['90-180 days']) / ins.totalRepos - : 0; - const activityScore = Math.round(activeRatio * 100); - const ag = subjectGrade(activityScore); - - /* Supply Chain Security */ - const scScore = Math.max(0, 100 - - (sc.malwareCount * 30) - - (sc.depConfusionCount * 10) - - (eol.eolCount * 3) - - (sc.unpinnedActions * 2)); - const sg = subjectGrade(scScore); - - /* Maintenance Hygiene (EOL + age + drift) */ - const oldDeps = ins.ageStats.buckets.filter(b => b.maxMonths >= 24).reduce((s, b) => s + b.total, 0); - const maintScore = ins.totalDeps > 0 - ? Math.max(0, 100 - ((oldDeps / ins.totalDeps) * 50) - ((drift.buckets.major.total / (ins.totalDeps || 1)) * 30)) - : 100; - const mg = subjectGrade(maintScore); - - return { - vulnerability: { ...vg, icon: 'fas fa-shield-alt', label: 'Vulnerability Management', comment: vulnComment(ch, ins.vulnAgeStats.directDwellMedian) }, - freshness: { ...dg, icon: 'fas fa-sync-alt', label: 'Dependency Freshness', comment: driftComment(drift) }, - license: { ...lg, icon: 'fas fa-balance-scale', label: 'License Compliance', comment: licenseComment(lic) }, - activity: { ...ag, icon: 'fas fa-code-branch', label: 'Code Activity', comment: activityComment(hyg, ins.totalRepos) }, - supplyChain: { ...sg, icon: 'fas fa-shield-virus', label: 'Supply Chain Security', comment: supplyChainComment(sc, eol) }, - maintenance: { ...mg, icon: 'fas fa-tools', label: 'Maintenance Hygiene', comment: maintenanceComment(oldDeps, ins.totalDeps) } - }; - } - - /* Comments */ - function vulnComment(ch, dwell) { - if (ch.total === 0) return 'No critical or high vulnerabilities.'; - let c = `${ch.total} critical/high vulns`; - if (dwell !== null) c += `, median dwell ${dwell} days`; - return c + '.'; - } - function driftComment(drift) { - if (drift.total === 0) return 'No dependency data.'; - if (drift.buckets.major.total === 0) return 'All dependencies at current versions.'; - return `${drift.buckets.major.total} major updates behind — ${drift.coveragePct}% coverage.`; - } - function licenseComment(lic) { - const total = lic.permissive.total + lic.copyleft.total + lic.unknown.total; - if (total === 0) return 'No license data.'; - if (lic.highRisk === 0) return `All ${total} dependencies have permissive licenses.`; - return `${lic.highRisk} high-risk license(s) among ${total} dependencies.`; - } - function activityComment(hyg, total) { - const active = hyg.activityBuckets['Last 30 days'] + hyg.activityBuckets['30-90 days'] + hyg.activityBuckets['90-180 days']; - const pct = total > 0 ? Math.round(active / total * 100) : 0; - if (total === 0) return 'No repositories.'; - return `${pct}% of repos pushed within 6 months (${active}/${total}).`; - } - function supplyChainComment(sc, eol) { - const issues = []; - if (sc.malwareCount > 0) issues.push(`${sc.malwareCount} malware`); - if (sc.depConfusionCount > 0) issues.push(`${sc.depConfusionCount} dep confusion`); - if (eol.eolCount > 0) issues.push(`${eol.eolCount} EOL`); - if (sc.unpinnedActions > 0) issues.push(`${sc.unpinnedActions} unpinned actions`); - if (issues.length === 0) return 'No supply chain red flags.'; - return issues.join(', ') + '.'; - } - function maintenanceComment(oldDeps, total) { - if (total === 0) return 'No dependencies.'; - const pct = Math.round(oldDeps / total * 100); - if (oldDeps === 0) return 'All dependencies are recent (< 2 years old).'; - return `${oldDeps} deps (${pct}%) are over 2 years old.`; - } - - /* ------------------------------------------------------------------ */ - /* Render */ - /* ------------------------------------------------------------------ */ - function renderReportCard(ins) { - const td = ins.techDebt; - const subjects = computeSubjectGrades(ins); - - /* GPA */ - const gpaMap = { A: 4, B: 3, C: 2, D: 1, F: 0 }; - const points = Object.values(subjects).map(s => gpaMap[s.grade] || 0); - const gpa = (points.reduce((a, b) => a + b, 0) / points.length).toFixed(1); - - const gpaHtml = ` -
    -
    ${td.grade}
    -
    -
    ${td.score100}/100
    -
    Tech-Health Score · GPA ${gpa}
    -
    -
    `; - - /* Table */ - const rows = Object.values(subjects).map(s => ` - - ${esc(s.label)} - ${s.grade} - ${esc(s.status)} - ${esc(s.comment)} - `).join(''); - - const tableHtml = ` - - - - - - - - - - ${rows} -
    SubjectGradeStatusNotes
    `; - - /* Legend */ - const legendHtml = ` - `; - - safe(content, gpaHtml + tableHtml + legendHtml); - } - -})(); diff --git a/js/insights5-page.js b/js/insights5-page.js deleted file mode 100644 index dc42967..0000000 --- a/js/insights5-page.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Snapshot (insights5-page.js) — single-viewport executive summary. - * One glance, everything fits on screen. 6 metric tiles + verdict + concerns. - * The most minimal of the four variants. - */ -(async function () { - 'use strict'; - - const storageManager = window.storageManager || new StorageManager(); - if (!storageManager.initialized) await storageManager.init(); - - const esc = window.escapeHtml || (s => String(s)); - const safe = window.safeSetHTML || ((el, h) => { el.innerHTML = h; }); - const Agg = window.InsightsAggregator; - - const selector = document.getElementById('analysisSelector'); - const content = document.getElementById('content'); - const loading = document.getElementById('loading'); - const noData = document.getElementById('noDataMessage'); - - async function loadAnalysesList() { - try { - const info = await storageManager.getStorageInfo(); - const all = [...info.organizations, ...info.repositories] - .filter(e => e.name !== '__ALL__' && e.dependencies > 0); - selector.innerHTML = ''; - if (all.length === 0) { - noData.classList.remove('d-none'); - selector.disabled = true; - return; - } - const opt = document.createElement('option'); - opt.value = ''; - const totalDeps = all.reduce((s, e) => s + (e.dependencies || 0), 0); - opt.textContent = `All Analyses (${totalDeps} deps)`; - selector.appendChild(opt); - for (const e of all) { - const o = document.createElement('option'); - o.value = e.name; - o.textContent = `${e.name} (${e.dependencies || 0} deps)`; - selector.appendChild(o); - } - selector.disabled = false; - await loadAnalysis(); - } catch (err) { - console.error('Snapshot: load failed', err); - selector.disabled = true; - noData.classList.remove('d-none'); - } - } - - async function loadAnalysis() { - loading.classList.remove('d-none'); - content.classList.add('d-none'); - noData.classList.add('d-none'); - - const name = selector.value; - let data; - if (!name || name === '') { - data = await storageManager.getCombinedData(); - } else { - data = await storageManager.loadAnalysisDataForOrganization(name); - } - - if (!data || !data.data) { - loading.classList.add('d-none'); - noData.classList.remove('d-none'); - return; - } - - renderSnapshot(Agg.buildInsights(data.data)); - loading.classList.add('d-none'); - content.classList.remove('d-none'); - } - - selector.addEventListener('change', loadAnalysis); - await loadAnalysesList(); - - /* ------------------------------------------------------------------ */ - /* Render */ - /* ------------------------------------------------------------------ */ - function renderSnapshot(ins) { - const td = ins.techDebt; - const ch = ins.critHigh; - const drift = ins.driftStats; - const eol = ins.eolStats; - const lic = ins.licenseStats; - const sc = ins.supplyChain; - const hyg = ins.repoHygiene; - const dwell = ins.vulnAgeStats.directDwellMedian; - - /* ---- Verdict line ---- */ - const verdictColor = td.score100 >= 75 ? 'success' - : td.score100 >= 55 ? 'warning' - : 'danger'; - const verdictText = td.score100 >= 75 ? 'Org is in good shape' - : td.score100 >= 55 ? 'Moderate concerns' - : 'Needs attention'; - - const verdictHtml = ` -
    -
    ${td.grade}
    -
    Health Score ${td.score100}/100
    -
    ${verdictText}
    -
    `; - - /* ---- 6 metric tiles ---- */ - function metric(value, label, icon, status) { - return `
    -
    -
    ${value}
    -
    ${label}
    -
    `; - } - - const vulnStatus = ch.total === 0 ? 'good' : (ch.critical > 0 ? 'bad' : 'warn'); - const eolStatus = eol.eolCount === 0 ? 'good' : (eol.eolCount > 10 ? 'bad' : 'warn'); - const licStatus = lic.highRisk === 0 ? 'good' : 'warn'; - const driftStatus = drift.buckets.major.total === 0 ? 'good' : (drift.buckets.major.total > 20 ? 'bad' : 'warn'); - const hygStatus = ins.reposWithoutSbom > ins.totalRepos / 2 ? 'warn' : 'good'; - const dwellStatus = dwell === null ? 'neutral' : (dwell > 90 ? 'bad' : (dwell > 30 ? 'warn' : 'good')); - - const metricsHtml = ` -
    - ${metric(ins.totalRepos, 'Repositories', 'fas fa-database', hygStatus)} - ${metric(ch.total, 'C+H Vulns', 'fas fa-shield-alt', vulnStatus)} - ${metric(eol.eolCount, 'EOL Components', 'fas fa-hourglass-end', eolStatus)} - ${metric(lic.highRisk, 'High-Risk Licenses', 'fas fa-balance-scale', licStatus)} - ${metric(drift.buckets.major.total, 'Major Drift', 'fas fa-code-branch', driftStatus)} - ${metric(dwell !== null ? dwell + 'd' : '--', 'CVE Dwell (median)', 'fas fa-clock', dwellStatus)} -
    `; - - /* ---- Concerns line ---- */ - const concerns = []; - if (ch.critical > 0) concerns.push(`${ch.critical} crit vulns`); - if (sc.malwareCount > 0) concerns.push(`${sc.malwareCount} malware`); - if (eol.eolCount > 5) concerns.push(`${eol.eolCount} EOL`); - if (lic.highRisk > 3) concerns.push(`${lic.highRisk} high-risk licenses`); - if (sc.depConfusionCount > 0) concerns.push(`${sc.depConfusionCount} dep confusion`); - if (dwell !== null && dwell > 90) concerns.push(`CVE dwell ${dwell}d`); - - const concernsHtml = concerns.length > 0 - ? `
    -
    Top Concerns
    -
    ${concerns.map(c => `${esc(c)}`).join('')}
    -
    ` - : `
    -
    No major concerns identified
    -
    `; - - safe(content, verdictHtml + metricsHtml + concernsHtml); - } - -})(); diff --git a/licenses.html b/licenses.html index d867601..c7ea07b 100644 --- a/licenses.html +++ b/licenses.html @@ -168,7 +168,7 @@
    About Cyfinoid Research
    - + diff --git a/repos.html b/repos.html index 781fae7..3a65cdb 100644 --- a/repos.html +++ b/repos.html @@ -198,7 +198,7 @@
    Repositories
    - + diff --git a/settings.html b/settings.html index bc671a7..3ffbf97 100644 --- a/settings.html +++ b/settings.html @@ -523,7 +523,7 @@
    About Cyfinoid Research
    - + diff --git a/vuln.html b/vuln.html index dcaf707..dc97927 100644 --- a/vuln.html +++ b/vuln.html @@ -172,7 +172,7 @@
    About Cyfinoid Research
    - + From 7754842e203dc00b562351d34f37190bd3eebe7f Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Thu, 6 Aug 2026 06:27:21 -0700 Subject: [PATCH 14/19] location fix --- .github/workflows/validate-deployment.yml | 1 + CHANGELOG.md | 7 + about.html | 50 ++- authors.html | 5 +- demo.html | 5 +- flowchart.md | 2 +- index.html | 5 +- js/authors-page.js | 6 +- js/city-data.js | 67 +++ js/country-data.js | 5 +- js/location-service.js | 504 +++++++++++++--------- js/settings.js | 260 +++++++++-- settings.html | 20 +- 13 files changed, 695 insertions(+), 242 deletions(-) create mode 100644 js/city-data.js diff --git a/.github/workflows/validate-deployment.yml b/.github/workflows/validate-deployment.yml index f918a06..9899aa2 100644 --- a/.github/workflows/validate-deployment.yml +++ b/.github/workflows/validate-deployment.yml @@ -113,6 +113,7 @@ jobs: "js/common.js" "js/dependency-tree-resolver.js" "js/country-data.js" + "js/city-data.js" "js/depconfuse-service.js" "js/deps-page.js" "js/ecosystem-utils.js" diff --git a/CHANGELOG.md b/CHANGELOG.md index 5898334..fa67a61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- **Clear Geocoding Cache & Re-resolve on Settings** (`settings.html`, `js/settings.js`): new button in Author Location Enrichment clears the IndexedDB `locations` store, strips existing `countryCode` values from author entities, and re-runs `LocationService.batchGeocode()` with progress feedback. Use after geocoding provider changes or to retry previously failed lookups without re-fetching GitHub profiles. +- **Multi-provider geocoding replaces Nominatim** (`js/location-service.js`, new `js/city-data.js`, `about.html`, `authors.html`, `index.html`, `settings.html`, `demo.html`): author location strings now resolve through a four-step cascade — static country table → static major-city table (GeoNames cities ≥50k, ~14k unambiguous entries) → Open-Meteo Geocoding API → Photon (komoot) failover. A serial network queue with per-provider spacing and 429/503 cooldown prevents burst traffic; IndexedDB cache behaviour is unchanged. Nominatim is removed. Firewall allowlist and Author Enrichment methodology on `about.html` updated accordingly. + +### Changed +- **Geocoding network dependencies**: `nominatim.openstreetmap.org` removed from the firewall allowlist; `geocoding-api.open-meteo.com` (primary API fallback) and `photon.komoot.io` (failover) added instead (`about.html`). + ### Fixed - **IndexedDB open failed with `VersionError: requested version (6) < existing (7)`** (`js/indexeddb-manager.js`): browsers that previously ran a VEX-enabled build already have `sbomplay_db` at schema v7 (`vexDocuments` store). This branch still opened at v6, which IndexedDB rejects and blocked app init (including the Quick demo page). Schema version is now 7, `vexDocuments` is created on upgrade when missing, and `clearAll` / `clearCacheStore` include `locations`, `eoxData`, and `vexDocuments`. diff --git a/about.html b/about.html index fd9e630..3b2bc34 100644 --- a/about.html +++ b/about.html @@ -316,7 +316,8 @@
    Map Service tile.openstreetmap.orgMap tiles for author locations - nominatim.openstreetmap.orgGeocoding service + geocoding-api.open-meteo.comPrimary geocoding API (fallback after static country/city tables) + photon.komoot.ioSecondary geocoding API (failover when Open-Meteo is rate-limited or unavailable) @@ -942,7 +943,49 @@
    4. Shared-rep appear on directly reflects the number of packages an account compromise would compromise.

    -
    5. Bots and automated accounts
    +
    5. Location geocoding
    +

    + GitHub profile location strings are free-form text — "San Francisco, CA", "Germany", + "Bengaluru", or joke entries like "Milky Way". SBOM Play resolves them to an ISO country code for + the Authors map and sanctioned-country checks using a four-step cascade that avoids hammering any + single public geocoder: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StepResolverWhen it applies
    1Static country table (country-data.js)Trailing segment is a country name, alpha-2/3 code, or US state (e.g. "Berlin, Germany")
    2Static city table (city-data.js, GeoNames cities ≥50k pop.)Bare major-city names with no cross-country ambiguity (e.g. "Tokyo", "Bengaluru")
    3Open-Meteo Geocoding APIRemaining strings; primary network fallback, no API key required
    4Photon (komoot)Failover when Open-Meteo returns no result or is rate-limited
    +

    + + All successful and failed resolutions are cached in IndexedDB for 7 days so each unique string is + fetched at most once per session. Network requests are serialized through a shared queue with + per-provider spacing and cooldown on HTTP 429/503. The Authors map itself never triggers geocoding — + it reads only from cache and static tables. Nominatim is no longer used. +

    + +
    6. Bots and automated accounts

    GitHub contributors include automated accounts: dependabot[bot], github-actions[bot], renovate[bot], pre-commit-ci[bot], and @@ -960,6 +1003,9 @@

    References
  • ecosyste.ms API Documentation — aggregated package metadata for ecosystems without a native authors endpoint
  • npm package.json: author and contributors fields
  • PyPI core metadata: Author / Maintainer fields
  • +
  • GeoNames — static major-city table (cities15000, CC BY 4.0)
  • +
  • Open-Meteo Geocoding API — primary network geocoding fallback
  • +
  • Photon (komoot) — secondary geocoding failover
  • diff --git a/authors.html b/authors.html index c447f16..0071610 100644 --- a/authors.html +++ b/authors.html @@ -216,8 +216,9 @@ - - + + + diff --git a/demo.html b/demo.html index 0956b1b..f0b649f 100644 --- a/demo.html +++ b/demo.html @@ -131,8 +131,9 @@
    About Cyfinoid Research
    - - + + + diff --git a/flowchart.md b/flowchart.md index e0abbde..33153a8 100644 --- a/flowchart.md +++ b/flowchart.md @@ -487,7 +487,7 @@ flowchart TD - **Bundled Per-Package Writes**: Each package commits its package row, author entities, and relationships in a single IndexedDB transaction (`cacheManager.savePackageAuthorBundle`) instead of 1+N+N separate transactions - **Per-Run Memoization**: `findAuthorByEmail` / `findAuthorByGitHub` / `getAuthorEntity` results are memoized for the duration of a `fetchAuthorsForPackages` run so authors shared across packages cost one IDB lookup, not many - **Unified Rate-Limited HTTP**: All registry/funding fetches go through `requestQueueManager` lanes (`npm`, `pypi`, `cargo`, `gem`, `ecosystems`, `github`) with shared 429/403 backoff -- **Country-Only Map**: The authors map renders one Leaflet marker per country using static ISO 3166-1 alpha-2 centroids from `js/country-data.js`; `LocationService.geocode()` resolves country / US-state suffixes locally before falling back to Nominatim, near-eliminating geocoding round-trips +- **Country-Only Map**: The authors map renders one Leaflet marker per country using static ISO 3166-1 alpha-2 centroids from `js/country-data.js`; `LocationService.geocode()` resolves country / US-state suffixes and major cities locally via `country-data.js` / `city-data.js` before falling back to Open-Meteo and Photon APIs - **Optional Contributor Correlation**: Per-package GitHub contributor correlation (extra `/repos///contributors` calls) is gated behind a setting in `settings.html` and is **off by default** --- diff --git a/index.html b/index.html index 3c76327..e0f6e01 100644 --- a/index.html +++ b/index.html @@ -629,8 +629,9 @@
    About Cyfinoid Research
    - - + + + diff --git a/js/authors-page.js b/js/authors-page.js index 127de2f..c095663 100644 --- a/js/authors-page.js +++ b/js/authors-page.js @@ -309,7 +309,7 @@ // Display author locations on map. // // Country-only aggregation: rather than placing one marker per (city, region) - // string — which required a separate Nominatim geocode call per unique string + // string — which required a separate geocoding API call per unique string // and was rate-limited to 1 req/sec — we now group authors by country code and // place a single marker at the country centroid (from CountryData). The bulk // of resolution happens locally without any API calls (static lookup table + @@ -358,9 +358,9 @@ // (covers static-table hits + everything previously seen in this session). // 2) Fallback to LocationService.getFromCache, which inspects the IndexedDB // cache for legacy entries that have a countryCode set (lat/lng data we - // previously fetched from Nominatim). + // previously fetched from geocoding APIs). // We deliberately do NOT call geocode() here — the map should never trigger - // Nominatim traffic on its own. Anything that doesn't resolve via the two + // geocoding API traffic on its own. Anything that doesn't resolve via the two // paths above is a string we have no country signal for; we just skip it. const cacheLookups = []; const cacheLookupAuthors = []; diff --git a/js/city-data.js b/js/city-data.js new file mode 100644 index 0000000..9b6bd55 --- /dev/null +++ b/js/city-data.js @@ -0,0 +1,67 @@ +/** + * City Data - Static lookup for major cities (population >= 50k, GeoNames cities15000). + * + * Resolves bare city-name location strings (e.g. "Bengaluru", "Tokyo") to a country code + * without network geocoding. Ambiguous city names shared across countries are excluded. + * + * Data source: GeoNames cities15000 (CC BY 4.0) — https://www.geonames.org/ + * Exposes window.CityData with resolveCity(rawString) → { countryCode, country, lat, lng } | null + */ +(function (global) { + // normalized city name → { cc, lat, lng } + const CITIES = {"warsn":{"cc":"AE","lat":25.17,"lng":55.41,"pop":108759},"warisan":{"cc":"AE","lat":25.17,"lng":55.41,"pop":108759},"umm al quwain city":{"cc":"AE","lat":25.56,"lng":55.56,"pop":59098},"tarif kalba":{"cc":"AE","lat":25.07,"lng":56.33,"pop":51000},"arf kalb":{"cc":"AE","lat":25.07,"lng":56.33,"pop":51000},"ras al khaimah":{"cc":"AE","lat":25.79,"lng":55.94,"pop":351943},"zayed city":{"cc":"AE","lat":23.65,"lng":53.71,"pop":63482},"dubai":{"cc":"AE","lat":25.08,"lng":55.31,"pop":3790000},"dayrah":{"cc":"AE","lat":25.27,"lng":55.3,"pop":400000},"sharjah":{"cc":"AE","lat":25.33,"lng":55.41,"pop":1800000},"fujairah":{"cc":"AE","lat":25.12,"lng":56.34,"pop":118933},"al ain city":{"cc":"AE","lat":24.19,"lng":55.76,"pop":846747},"ajman":{"cc":"AE","lat":25.4,"lng":55.48,"pop":490035},"abu dhabi":{"cc":"AE","lat":24.45,"lng":54.4,"pop":1807000},"al karama":{"cc":"AE","lat":25.24,"lng":55.3,"pop":75560},"khalifah a city":{"cc":"AE","lat":24.43,"lng":54.6,"pop":85374},"mirdif":{"cc":"AE","lat":25.22,"lng":55.41,"pop":60288},"hawr al anz":{"cc":"AE","lat":25.28,"lng":55.34,"pop":84661},"nayf":{"cc":"AE","lat":25.27,"lng":55.3,"pop":53075},"nyf":{"cc":"AE","lat":25.27,"lng":55.3,"pop":53075},"al warqaa":{"cc":"AE","lat":25.19,"lng":55.42,"pop":59111},"international city":{"cc":"AE","lat":25.16,"lng":55.41,"pop":120000},"dubai marina":{"cc":"AE","lat":25.09,"lng":55.15,"pop":120000},"ar rumaylah":{"cc":"AE","lat":25.4,"lng":55.43,"pop":86000},"al majaz":{"cc":"AE","lat":25.32,"lng":55.39,"pop":116503},"dubai festival city":{"cc":"AE","lat":25.22,"lng":55.36,"pop":77000},"dubai investments park":{"cc":"AE","lat":25.01,"lng":55.16,"pop":160000},"jebel ali":{"cc":"AE","lat":25.0,"lng":55.11,"pop":210000},"bani yas city":{"cc":"AE","lat":24.31,"lng":54.63,"pop":80498},"musaffah":{"cc":"AE","lat":24.36,"lng":54.48,"pop":243341},"al shamkhah city":{"cc":"AE","lat":24.39,"lng":54.71,"pop":61710},"reef al fujairah city":{"cc":"AE","lat":25.14,"lng":56.25,"pop":82310},"dubai silicon oasis":{"cc":"AE","lat":25.12,"lng":55.39,"pop":90000},"business bay":{"cc":"AE","lat":25.19,"lng":55.27,"pop":191000},"al sajaah":{"cc":"AE","lat":25.32,"lng":55.63,"pop":53079},"lahbab":{"cc":"AE","lat":25.04,"lng":55.59,"pop":53079},"mohammed bin zayed city":{"cc":"AE","lat":24.35,"lng":54.55,"pop":85000},"bazar-e yakawlang":{"cc":"AF","lat":34.74,"lng":66.97,"pop":65000},"bzr-e yakwlang":{"cc":"AF","lat":34.74,"lng":66.97,"pop":65000},"taloqan":{"cc":"AF","lat":36.74,"lng":69.53,"pop":64256},"shibirghan":{"cc":"AF","lat":36.67,"lng":65.75,"pop":55641},"shibirghn":{"cc":"AF","lat":36.67,"lng":65.75,"pop":55641},"sar-e pul":{"cc":"AF","lat":36.22,"lng":65.93,"pop":52121},"pul-e khumr":{"cc":"AF","lat":35.94,"lng":68.72,"pop":56369},"pul-e khumri":{"cc":"AF","lat":35.94,"lng":68.72,"pop":56369},"maymana":{"cc":"AF","lat":35.92,"lng":64.78,"pop":75900},"mazr-e sharf":{"cc":"AF","lat":36.71,"lng":67.11,"pop":523300},"mazar-e sharif":{"cc":"AF","lat":36.71,"lng":67.11,"pop":523300},"kunduz":{"cc":"AF","lat":36.73,"lng":68.86,"pop":161902},"khst":{"cc":"AF","lat":33.34,"lng":69.92,"pop":96123},"khost":{"cc":"AF","lat":33.34,"lng":69.92,"pop":96123},"khulm":{"cc":"AF","lat":36.7,"lng":67.7,"pop":64933},"khanabad":{"cc":"AF","lat":36.68,"lng":69.11,"pop":71531},"kandahar":{"cc":"AF","lat":31.61,"lng":65.71,"pop":523300},"kandahr":{"cc":"AF","lat":31.61,"lng":65.71,"pop":523300},"kabul":{"cc":"AF","lat":34.53,"lng":69.17,"pop":4434550},"jallbd":{"cc":"AF","lat":34.43,"lng":70.45,"pop":271900},"jalalabad":{"cc":"AF","lat":34.43,"lng":70.45,"pop":271900},"hert":{"cc":"AF","lat":34.35,"lng":62.2,"pop":574300},"herat":{"cc":"AF","lat":34.35,"lng":62.2,"pop":574300},"ghazni":{"cc":"AF","lat":33.55,"lng":68.42,"pop":141000},"gardez":{"cc":"AF","lat":33.6,"lng":69.23,"pop":103601},"charikar":{"cc":"AF","lat":35.01,"lng":69.17,"pop":53676},"bamyan":{"cc":"AF","lat":34.82,"lng":67.83,"pop":61863},"bmyn":{"cc":"AF","lat":34.82,"lng":67.83,"pop":61863},"balkh":{"cc":"AF","lat":36.76,"lng":66.9,"pop":114883},"baghln":{"cc":"AF","lat":36.13,"lng":68.71,"pop":108449},"baghlan":{"cc":"AF","lat":36.13,"lng":68.71,"pop":108449},"bzrak":{"cc":"AF","lat":35.31,"lng":69.52,"pop":65000},"bazarak":{"cc":"AF","lat":35.31,"lng":69.52,"pop":65000},"saint johns":{"cc":"AG","lat":17.12,"lng":-61.84,"pop":51737},"korce":{"cc":"AL","lat":40.62,"lng":20.78,"pop":58259},"kor":{"cc":"AL","lat":40.62,"lng":20.78,"pop":58259},"elbasan":{"cc":"AL","lat":41.11,"lng":20.08,"pop":100903},"vlor":{"cc":"AL","lat":40.47,"lng":19.48,"pop":115261},"vlore":{"cc":"AL","lat":40.47,"lng":19.48,"pop":115261},"tirana":{"cc":"AL","lat":41.33,"lng":19.82,"pop":418495},"shkoder":{"cc":"AL","lat":42.07,"lng":19.51,"pop":95553},"shkodr":{"cc":"AL","lat":42.07,"lng":19.51,"pop":95553},"lushnj":{"cc":"AL","lat":40.94,"lng":19.7,"pop":63135},"lushnje":{"cc":"AL","lat":40.94,"lng":19.7,"pop":63135},"kruje":{"cc":"AL","lat":41.51,"lng":19.79,"pop":51191},"kruj":{"cc":"AL","lat":41.51,"lng":19.79,"pop":51191},"fier-ifi":{"cc":"AL","lat":40.72,"lng":19.57,"pop":60995},"fier-cifci":{"cc":"AL","lat":40.72,"lng":19.57,"pop":60995},"fier":{"cc":"AL","lat":40.73,"lng":19.56,"pop":56297},"durres":{"cc":"AL","lat":41.32,"lng":19.45,"pop":195920},"durrs":{"cc":"AL","lat":41.32,"lng":19.45,"pop":195920},"berat":{"cc":"AL","lat":40.71,"lng":19.95,"pop":62232},"yerevan":{"cc":"AM","lat":40.18,"lng":44.51,"pop":1144700},"vanadzor":{"cc":"AM","lat":40.81,"lng":44.5,"pop":78100},"gyumri":{"cc":"AM","lat":40.79,"lng":43.85,"pop":114667},"davtashen":{"cc":"AM","lat":40.22,"lng":44.48,"pop":52100},"avan":{"cc":"AM","lat":40.21,"lng":44.58,"pop":58800},"abovyan":{"cc":"AM","lat":40.27,"lng":44.63,"pop":50556},"erebuni":{"cc":"AM","lat":40.13,"lng":44.53,"pop":129700},"nor nork":{"cc":"AM","lat":40.2,"lng":44.57,"pop":137300},"ajapnyak":{"cc":"AM","lat":40.2,"lng":44.47,"pop":122800},"kanaker-zeytun":{"cc":"AM","lat":40.22,"lng":44.54,"pop":75500},"malatia-sebastia":{"cc":"AM","lat":40.17,"lng":44.45,"pop":150500},"kentron":{"cc":"AM","lat":40.18,"lng":44.51,"pop":133000},"shengavit":{"cc":"AM","lat":40.16,"lng":44.48,"pop":140600},"arabkir":{"cc":"AM","lat":40.21,"lng":44.5,"pop":119300},"saurimo":{"cc":"AO","lat":-9.66,"lng":20.39,"pop":393000},"lucapa":{"cc":"AO","lat":-8.42,"lng":20.74,"pop":110000},"dundo":{"cc":"AO","lat":-7.37,"lng":20.82,"pop":177604},"chitato":{"cc":"AO","lat":-7.3,"lng":20.73,"pop":246880},"luau":{"cc":"AO","lat":-10.71,"lng":22.22,"pop":55432},"nzagi":{"cc":"AO","lat":-8.39,"lng":15.3,"pop":60000},"uge":{"cc":"AO","lat":-7.61,"lng":15.06,"pop":322531},"uige":{"cc":"AO","lat":-7.61,"lng":15.06,"pop":322531},"soyo":{"cc":"AO","lat":-6.13,"lng":12.37,"pop":221555},"negage":{"cc":"AO","lat":-7.76,"lng":15.27,"pop":92950},"ndalatando":{"cc":"AO","lat":-9.3,"lng":14.91,"pop":161584},"mbanza kongo":{"cc":"AO","lat":-6.27,"lng":14.24,"pop":148000},"malanje":{"cc":"AO","lat":-9.54,"lng":16.34,"pop":455000},"maianga":{"cc":"AO","lat":-8.85,"lng":13.24,"pop":727681},"luanda":{"cc":"AO","lat":-8.84,"lng":13.23,"pop":2776168},"benfica":{"cc":"AO","lat":-8.94,"lng":13.16,"pop":191828},"cuango-luzamba":{"cc":"AO","lat":-9.15,"lng":18.04,"pop":55000},"caxito":{"cc":"AO","lat":-8.58,"lng":13.66,"pop":55000},"cangandala":{"cc":"AO","lat":-9.78,"lng":16.43,"pop":52220},"calumbo":{"cc":"AO","lat":-9.15,"lng":13.42,"pop":652270},"cacuaco":{"cc":"AO","lat":-8.78,"lng":13.37,"pop":146867},"cabinda":{"cc":"AO","lat":-5.56,"lng":12.19,"pop":550000},"barra do dande":{"cc":"AO","lat":-8.47,"lng":13.37,"pop":75000},"bailundo":{"cc":"AO","lat":-9.57,"lng":15.99,"pop":70481},"cazenga":{"cc":"AO","lat":-8.84,"lng":13.28,"pop":394170},"golfe":{"cc":"AO","lat":-8.87,"lng":13.26,"pop":655796},"camama":{"cc":"AO","lat":-8.94,"lng":13.27,"pop":667094},"talatona":{"cc":"AO","lat":-8.92,"lng":13.19,"pop":500000},"sumbe":{"cc":"AO","lat":-11.21,"lng":13.84,"pop":205832},"porto amboim":{"cc":"AO","lat":-10.73,"lng":13.77,"pop":91605},"ondjiva":{"cc":"AO","lat":-17.07,"lng":15.73,"pop":121537},"mossamedes":{"cc":"AO","lat":-15.2,"lng":12.15,"pop":255000},"menongue":{"cc":"AO","lat":-14.66,"lng":17.69,"pop":251178},"matala":{"cc":"AO","lat":-14.73,"lng":15.03,"pop":78000},"luquembo":{"cc":"AO","lat":-10.74,"lng":17.72,"pop":69420},"luena":{"cc":"AO","lat":-11.78,"lng":19.92,"pop":273675},"lubango":{"cc":"AO","lat":-14.92,"lng":13.49,"pop":600751},"longonjo":{"cc":"AO","lat":-12.91,"lng":15.25,"pop":92103},"lobito":{"cc":"AO","lat":-12.36,"lng":13.54,"pop":393079},"cuito":{"cc":"AO","lat":-12.38,"lng":16.93,"pop":355423},"cuto":{"cc":"AO","lat":-12.38,"lng":16.93,"pop":355423},"catchiungo":{"cc":"AO","lat":-12.57,"lng":16.23,"pop":120677},"huambo":{"cc":"AO","lat":-12.78,"lng":15.74,"pop":595304},"ganda":{"cc":"AO","lat":-13.02,"lng":14.64,"pop":65000},"gabela":{"cc":"AO","lat":-10.85,"lng":14.38,"pop":116903},"ecunna":{"cc":"AO","lat":-12.68,"lng":15.51,"pop":82541},"cubal":{"cc":"AO","lat":-13.04,"lng":14.25,"pop":90367},"cela":{"cc":"AO","lat":-11.42,"lng":15.12,"pop":90000},"catumbela":{"cc":"AO","lat":-12.43,"lng":13.55,"pop":95034},"camucuio":{"cc":"AO","lat":-14.11,"lng":13.24,"pop":66112},"camacupa":{"cc":"AO","lat":-12.02,"lng":17.48,"pop":59000},"cahama":{"cc":"AO","lat":-16.29,"lng":14.31,"pop":70061},"cala":{"cc":"AO","lat":-12.85,"lng":15.56,"pop":130000},"caala":{"cc":"AO","lat":-12.85,"lng":15.56,"pop":130000},"bocoio":{"cc":"AO","lat":-12.47,"lng":14.14,"pop":164685},"benguela":{"cc":"AO","lat":-12.58,"lng":13.4,"pop":555124},"balombo":{"cc":"AO","lat":-12.35,"lng":14.77,"pop":108965},"baia farta":{"cc":"AO","lat":-12.6,"lng":13.2,"pop":107841},"baa farta":{"cc":"AO","lat":-12.6,"lng":13.2,"pop":107841},"andulo":{"cc":"AO","lat":-11.49,"lng":16.7,"pop":50000},"kikolo":{"cc":"AO","lat":-8.78,"lng":13.33,"pop":728205},"cafunfo":{"cc":"AO","lat":-8.77,"lng":18.0,"pop":90000},"quissecula":{"cc":"AO","lat":-11.39,"lng":15.09,"pop":90000},"mulenvos":{"cc":"AO","lat":-8.87,"lng":13.33,"pop":882014},"kilamba":{"cc":"AO","lat":-8.85,"lng":13.28,"pop":237528},"ingombota":{"cc":"AO","lat":-8.82,"lng":13.23,"pop":144911},"nova vida":{"cc":"AO","lat":-8.91,"lng":13.22,"pop":464985},"zango":{"cc":"AO","lat":-9.01,"lng":13.38,"pop":198538},"vila flor":{"cc":"AO","lat":-8.98,"lng":13.31,"pop":256066},"rangel":{"cc":"AO","lat":-8.83,"lng":13.26,"pop":190569},"samba":{"cc":"AO","lat":-8.88,"lng":13.2,"pop":364986},"sambizanga":{"cc":"AO","lat":-8.79,"lng":13.28,"pop":177808},"kima kieza":{"cc":"AO","lat":-8.83,"lng":13.3,"pop":428855},"panguila":{"cc":"AO","lat":-8.69,"lng":13.45,"pop":158068},"pangula":{"cc":"AO","lat":-8.69,"lng":13.45,"pop":158068},"ramiros":{"cc":"AO","lat":-9.06,"lng":13.05,"pop":323576},"hoji ya henda":{"cc":"AO","lat":-8.81,"lng":13.29,"pop":642050},"zarate":{"cc":"AR","lat":-34.1,"lng":-59.02,"pop":99061},"zrate":{"cc":"AR","lat":-34.1,"lng":-59.02,"pop":99061},"villa lugano":{"cc":"AR","lat":-34.68,"lng":-58.47,"pop":114000},"tandil":{"cc":"AR","lat":-37.33,"lng":-59.14,"pop":115877},"sarand":{"cc":"AR","lat":-34.68,"lng":-58.35,"pop":60752},"san vicente":{"cc":"AR","lat":-35.02,"lng":-58.42,"pop":90021},"san justo":{"cc":"AR","lat":-34.68,"lng":-58.56,"pop":105274},"resistencia":{"cc":"AR","lat":-27.46,"lng":-58.99,"pop":290793},"remedios de escalada de san martn":{"cc":"AR","lat":-34.73,"lng":-58.4,"pop":81465},"remedios de escalada de san martin":{"cc":"AR","lat":-34.73,"lng":-58.4,"pop":81465},"reconquista":{"cc":"AR","lat":-29.15,"lng":-59.65,"pop":90184},"quilmes":{"cc":"AR","lat":-34.72,"lng":-58.25,"pop":262379},"posadas":{"cc":"AR","lat":-27.39,"lng":-55.92,"pop":305874},"pilar":{"cc":"AR","lat":-34.46,"lng":-58.91,"pop":81120},"ober":{"cc":"AR","lat":-27.49,"lng":-55.12,"pop":56528},"obera":{"cc":"AR","lat":-27.49,"lng":-55.12,"pop":56528},"necochea":{"cc":"AR","lat":-38.55,"lng":-58.74,"pop":73557},"monte chingolo":{"cc":"AR","lat":-34.73,"lng":-58.35,"pop":85060},"merlo":{"cc":"AR","lat":-34.67,"lng":-58.73,"pop":268961},"mar del tuyu":{"cc":"AR","lat":-36.57,"lng":-56.69,"pop":83016},"mar del tuy":{"cc":"AR","lat":-36.57,"lng":-56.69,"pop":83016},"mar del plata":{"cc":"AR","lat":-38.0,"lng":-57.56,"pop":593337},"lujan":{"cc":"AR","lat":-34.57,"lng":-59.11,"pop":97363},"lujn":{"cc":"AR","lat":-34.57,"lng":-59.11,"pop":97363},"los polvorines":{"cc":"AR","lat":-34.5,"lng":-58.71,"pop":53354},"lomas de zamora":{"cc":"AR","lat":-34.76,"lng":-58.4,"pop":111897},"la plata":{"cc":"AR","lat":-34.92,"lng":-57.95,"pop":195443},"lans":{"cc":"AR","lat":-34.71,"lng":-58.39,"pop":212252},"lanus":{"cc":"AR","lat":-34.71,"lng":-58.39,"pop":212252},"ituzaing":{"cc":"AR","lat":-27.59,"lng":-56.69,"pop":168419},"ituzaingo":{"cc":"AR","lat":-27.59,"lng":-56.69,"pop":168419},"isidro casanova":{"cc":"AR","lat":-34.7,"lng":-58.59,"pop":131981},"hurlingham":{"cc":"AR","lat":-34.59,"lng":-58.63,"pop":60000},"gualeguaychu":{"cc":"AR","lat":-33.01,"lng":-58.52,"pop":78676},"gualeguaych":{"cc":"AR","lat":-33.01,"lng":-58.52,"pop":78676},"goya":{"cc":"AR","lat":-29.14,"lng":-59.26,"pop":70245},"ezeiza":{"cc":"AR","lat":-34.85,"lng":-58.52,"pop":115021},"el palomar":{"cc":"AR","lat":-34.62,"lng":-58.6,"pop":59031},"eldorado":{"cc":"AR","lat":-26.4,"lng":-54.62,"pop":54189},"don torcuato":{"cc":"AR","lat":-34.49,"lng":-58.63,"pop":71356},"corrientes":{"cc":"AR","lat":-27.47,"lng":-58.83,"pop":346334},"concepcin del uruguay":{"cc":"AR","lat":-32.48,"lng":-58.23,"pop":67895},"concepcion del uruguay":{"cc":"AR","lat":-32.48,"lng":-58.23,"pop":67895},"colegiales":{"cc":"AR","lat":-34.57,"lng":-58.45,"pop":57000},"castelar":{"cc":"AR","lat":-34.65,"lng":-58.64,"pop":107786},"campana":{"cc":"AR","lat":-34.16,"lng":-58.96,"pop":86860},"burzaco":{"cc":"AR","lat":-34.83,"lng":-58.4,"pop":98859},"buenos aires":{"cc":"AR","lat":-34.61,"lng":-58.38,"pop":2891082},"berisso":{"cc":"AR","lat":-34.87,"lng":-57.88,"pop":88470},"berazategui":{"cc":"AR","lat":-34.77,"lng":-58.21,"pop":180523},"belgrano":{"cc":"AR","lat":-34.56,"lng":-58.46,"pop":138942},"barranqueras":{"cc":"AR","lat":-27.48,"lng":-58.94,"pop":50823},"barracas":{"cc":"AR","lat":-34.65,"lng":-58.38,"pop":77474},"banfield":{"cc":"AR","lat":-34.75,"lng":-58.39,"pop":61072},"azul":{"cc":"AR","lat":-36.78,"lng":-59.86,"pop":64884},"yerba buena":{"cc":"AR","lat":-26.81,"lng":-65.3,"pop":50783},"villa mara":{"cc":"AR","lat":-32.41,"lng":-63.24,"pop":92453},"villa maria":{"cc":"AR","lat":-32.41,"lng":-63.24,"pop":92453},"villa carlos paz":{"cc":"AR","lat":-31.42,"lng":-64.49,"pop":69451},"venado tuerto":{"cc":"AR","lat":-33.75,"lng":-61.97,"pop":72340},"ushuaia":{"cc":"AR","lat":-54.81,"lng":-68.32,"pop":56825},"tres arroyos":{"cc":"AR","lat":-38.38,"lng":-60.28,"pop":52199},"trelew":{"cc":"AR","lat":-43.25,"lng":-65.31,"pop":97915},"tartagal":{"cc":"AR","lat":-22.52,"lng":-63.81,"pop":60819},"santo tome":{"cc":"AR","lat":-31.66,"lng":-60.77,"pop":59072},"santo tom":{"cc":"AR","lat":-31.66,"lng":-60.77,"pop":59072},"santiago del estero":{"cc":"AR","lat":-27.8,"lng":-64.26,"pop":252192},"san salvador de jujuy":{"cc":"AR","lat":-24.19,"lng":-65.29,"pop":257970},"san ramon de la nueva oran":{"cc":"AR","lat":-23.14,"lng":-64.32,"pop":86867},"san ramn de la nueva orn":{"cc":"AR","lat":-23.14,"lng":-64.32,"pop":86867},"san pedro de jujuy":{"cc":"AR","lat":-24.23,"lng":-64.87,"pop":58430},"san nicolas de los arroyos":{"cc":"AR","lat":-33.33,"lng":-60.21,"pop":134217},"san nicols de los arroyos":{"cc":"AR","lat":-33.33,"lng":-60.21,"pop":134217},"san miguel de tucumn":{"cc":"AR","lat":-26.82,"lng":-65.21,"pop":548866},"san miguel de tucuman":{"cc":"AR","lat":-26.82,"lng":-65.21,"pop":548866},"san martn":{"cc":"AR","lat":-33.08,"lng":-68.47,"pop":82549},"catamarca":{"cc":"AR","lat":-28.47,"lng":-65.79,"pop":159139},"salta":{"cc":"AR","lat":-24.81,"lng":-65.42,"pop":520683},"rio tercero":{"cc":"AR","lat":-32.18,"lng":-64.11,"pop":53389},"ro tercero":{"cc":"AR","lat":-32.18,"lng":-64.11,"pop":53389},"ro grande":{"cc":"AR","lat":-53.79,"lng":-67.71,"pop":52681},"ro gallegos":{"cc":"AR","lat":-51.63,"lng":-69.25,"pop":95796},"rio gallegos":{"cc":"AR","lat":-51.63,"lng":-69.25,"pop":95796},"rio cuarto":{"cc":"AR","lat":-33.13,"lng":-64.35,"pop":157010},"ro cuarto":{"cc":"AR","lat":-33.13,"lng":-64.35,"pop":157010},"rafaela":{"cc":"AR","lat":-31.25,"lng":-61.49,"pop":88713},"punta alta":{"cc":"AR","lat":-38.88,"lng":-62.08,"pop":64244},"puerto madryn":{"cc":"AR","lat":-42.77,"lng":-65.04,"pop":64555},"presidencia roque senz pea":{"cc":"AR","lat":-26.79,"lng":-60.44,"pop":81879},"presidencia roque saenz pena":{"cc":"AR","lat":-26.79,"lng":-60.44,"pop":81879},"plottier":{"cc":"AR","lat":-38.97,"lng":-68.23,"pop":52291},"pergamino":{"cc":"AR","lat":-33.89,"lng":-60.57,"pop":91399},"parana":{"cc":"AR","lat":-31.73,"lng":-60.53,"pop":247139},"paran":{"cc":"AR","lat":-31.73,"lng":-60.53,"pop":247139},"olavarria":{"cc":"AR","lat":-36.89,"lng":-60.32,"pop":89721},"olavarra":{"cc":"AR","lat":-36.89,"lng":-60.32,"pop":89721},"neuquen":{"cc":"AR","lat":-38.95,"lng":-68.06,"pop":231198},"neuqun":{"cc":"AR","lat":-38.95,"lng":-68.06,"pop":231198},"mendoza":{"cc":"AR","lat":-32.89,"lng":-68.85,"pop":114893},"la rioja":{"cc":"AR","lat":-29.41,"lng":-66.86,"pop":178872},"junin":{"cc":"AR","lat":-34.59,"lng":-60.95,"pop":87509},"junn":{"cc":"AR","lat":-34.59,"lng":-60.95,"pop":87509},"gobernador galvez":{"cc":"AR","lat":-33.03,"lng":-60.64,"pop":74650},"gobernador glvez":{"cc":"AR","lat":-33.03,"lng":-60.64,"pop":74650},"general roca":{"cc":"AR","lat":-39.03,"lng":-67.58,"pop":73212},"general pico":{"cc":"AR","lat":-35.66,"lng":-63.76,"pop":66805},"comodoro rivadavia":{"cc":"AR","lat":-45.86,"lng":-67.49,"pop":140850},"cipolletti":{"cc":"AR","lat":-38.93,"lng":-67.99,"pop":95524},"chivilcoy":{"cc":"AR","lat":-34.9,"lng":-60.02,"pop":65575},"chimbas":{"cc":"AR","lat":-31.49,"lng":-68.53,"pop":73829},"caleta olivia":{"cc":"AR","lat":-46.45,"lng":-67.52,"pop":56310},"baha blanca":{"cc":"AR","lat":-38.72,"lng":-62.27,"pop":299101},"bahia blanca":{"cc":"AR","lat":-38.72,"lng":-62.27,"pop":299101},"balvanera":{"cc":"AR","lat":-34.61,"lng":-58.4,"pop":152198},"avellaneda":{"cc":"AR","lat":-34.66,"lng":-58.37,"pop":367554},"san carlos de bariloche":{"cc":"AR","lat":-41.15,"lng":-71.31,"pop":95394},"jose c paz":{"cc":"AR","lat":-34.52,"lng":-58.77,"pop":230208},"jos c paz":{"cc":"AR","lat":-34.52,"lng":-58.77,"pop":230208},"rawson":{"cc":"AR","lat":-31.58,"lng":-68.54,"pop":130258},"dbling":{"cc":"AT","lat":48.25,"lng":16.33,"pop":75418},"doebling":{"cc":"AT","lat":48.25,"lng":16.33,"pop":75418},"vienna":{"cc":"AT","lat":48.21,"lng":16.37,"pop":1691468},"villach":{"cc":"AT","lat":46.61,"lng":13.86,"pop":58882},"simmering":{"cc":"AT","lat":48.18,"lng":16.43,"pop":101420},"salzburg":{"cc":"AT","lat":47.8,"lng":13.04,"pop":157245},"ottakring":{"cc":"AT","lat":48.22,"lng":16.3,"pop":104627},"meidling":{"cc":"AT","lat":48.17,"lng":16.33,"pop":97624},"linz":{"cc":"AT","lat":48.31,"lng":14.29,"pop":204846},"klagenfurt am woerthersee":{"cc":"AT","lat":46.62,"lng":14.31,"pop":100316},"klagenfurt am wrthersee":{"cc":"AT","lat":46.62,"lng":14.31,"pop":100316},"innsbruck":{"cc":"AT","lat":47.26,"lng":11.39,"pop":132493},"penzing":{"cc":"AT","lat":48.2,"lng":16.27,"pop":98176},"hietzing":{"cc":"AT","lat":48.19,"lng":16.3,"pop":54265},"hernals":{"cc":"AT","lat":48.23,"lng":16.31,"pop":57546},"graz":{"cc":"AT","lat":47.07,"lng":15.44,"pop":303270},"fnfhaus":{"cc":"AT","lat":48.2,"lng":16.32,"pop":76396},"fuenfhaus":{"cc":"AT","lat":48.2,"lng":16.32,"pop":76396},"floridsdorf":{"cc":"AT","lat":48.25,"lng":16.4,"pop":162779},"eisenzicken":{"cc":"AT","lat":47.28,"lng":16.26,"pop":54353},"aspern":{"cc":"AT","lat":48.22,"lng":16.48,"pop":50687},"favoriten":{"cc":"AT","lat":48.16,"lng":16.38,"pop":201882},"donaustadt":{"cc":"AT","lat":48.23,"lng":16.46,"pop":187007},"waehring":{"cc":"AT","lat":48.23,"lng":16.34,"pop":51402},"whring":{"cc":"AT","lat":48.23,"lng":16.34,"pop":51402},"landstrasse":{"cc":"AT","lat":48.2,"lng":16.39,"pop":98389},"landstrae":{"cc":"AT","lat":48.2,"lng":16.39,"pop":98389},"margareten":{"cc":"AT","lat":48.19,"lng":16.35,"pop":54412},"brigittenau":{"cc":"AT","lat":48.24,"lng":16.38,"pop":86967},"perth":{"cc":"AU","lat":-31.95,"lng":115.86,"pop":2384371},"mandurah":{"cc":"AU","lat":-32.53,"lng":115.72,"pop":107643},"darwin":{"cc":"AU","lat":-12.46,"lng":130.84,"pop":139902},"bunbury":{"cc":"AU","lat":-33.33,"lng":115.64,"pop":76452},"adelaide":{"cc":"AU","lat":-34.93,"lng":138.6,"pop":1469163},"werribee":{"cc":"AU","lat":-37.9,"lng":144.67,"pop":50027},"tuggeranong":{"cc":"AU","lat":-35.42,"lng":149.07,"pop":89461},"townsville":{"cc":"AU","lat":-19.27,"lng":146.81,"pop":201313},"toowoomba":{"cc":"AU","lat":-27.56,"lng":151.95,"pop":142163},"tarneit":{"cc":"AU","lat":-37.84,"lng":144.66,"pop":56370},"rockhampton":{"cc":"AU","lat":-23.38,"lng":150.51,"pop":81021},"reservoir":{"cc":"AU","lat":-37.72,"lng":145.0,"pop":51096},"port macquarie":{"cc":"AU","lat":-31.43,"lng":152.91,"pop":51965},"point cook":{"cc":"AU","lat":-37.91,"lng":144.75,"pop":66781},"pakenham":{"cc":"AU","lat":-38.07,"lng":145.47,"pop":54118},"maitland":{"cc":"AU","lat":-32.73,"lng":151.56,"pop":89597},"mackay":{"cc":"AU","lat":-21.15,"lng":149.17,"pop":84333},"launceston":{"cc":"AU","lat":-41.44,"lng":147.13,"pop":90953},"hobart":{"cc":"AU","lat":-42.88,"lng":147.33,"pop":254930},"gold coast":{"cc":"AU","lat":-28.0,"lng":153.43,"pop":640778},"geelong":{"cc":"AU","lat":-38.15,"lng":144.36,"pop":282809},"craigieburn":{"cc":"AU","lat":-37.6,"lng":144.95,"pop":65178},"coffs harbour":{"cc":"AU","lat":-30.3,"lng":153.11,"pop":78759},"wollongong":{"cc":"AU","lat":-34.42,"lng":150.89,"pop":280153},"canberra":{"cc":"AU","lat":-35.28,"lng":149.13,"pop":367752},"caloundra":{"cc":"AU","lat":-26.8,"lng":153.12,"pop":96305},"cairns":{"cc":"AU","lat":-16.92,"lng":145.77,"pop":153075},"bundaberg":{"cc":"AU","lat":-24.87,"lng":152.35,"pop":73747},"brisbane":{"cc":"AU","lat":-27.47,"lng":153.03,"pop":2780063},"berwick":{"cc":"AU","lat":-38.03,"lng":145.35,"pop":50298},"bendigo":{"cc":"AU","lat":-36.76,"lng":144.28,"pop":103034},"ballarat":{"cc":"AU","lat":-37.57,"lng":143.85,"pop":111973},"hervey bay":{"cc":"AU","lat":-25.29,"lng":152.77,"pop":52230},"blue mountains":{"cc":"AU","lat":-33.71,"lng":150.33,"pop":78121},"pittwater":{"cc":"AU","lat":-33.67,"lng":151.3,"pop":63482},"logan city":{"cc":"AU","lat":-27.64,"lng":153.11,"pop":345098},"adelaide hills":{"cc":"AU","lat":-34.91,"lng":138.71,"pop":72260},"central coast":{"cc":"AU","lat":-33.43,"lng":151.37,"pop":346596},"city of port phillip":{"cc":"AU","lat":-37.83,"lng":144.94,"pop":112669},"sunshine coast":{"cc":"AU","lat":-26.66,"lng":153.08,"pop":398840},"melbourne city centre":{"cc":"AU","lat":-37.82,"lng":144.97,"pop":60057},"naxcivan":{"cc":"AZ","lat":39.21,"lng":45.41,"pop":97200},"naxvan":{"cc":"AZ","lat":39.21,"lng":45.41,"pop":97200},"lerik":{"cc":"AZ","lat":38.77,"lng":48.41,"pop":87000},"lankaran":{"cc":"AZ","lat":38.75,"lng":48.85,"pop":89300},"sirvan":{"cc":"AZ","lat":39.94,"lng":48.93,"pop":70220},"irvan":{"cc":"AZ","lat":39.94,"lng":48.93,"pop":70220},"yevlakh":{"cc":"AZ","lat":40.62,"lng":47.15,"pop":127400},"xacmaz":{"cc":"AZ","lat":41.46,"lng":48.81,"pop":67600},"xamaz":{"cc":"AZ","lat":41.46,"lng":48.81,"pop":67600},"sumgayit":{"cc":"AZ","lat":40.59,"lng":49.67,"pop":427000},"qarauxur":{"cc":"AZ","lat":40.4,"lng":49.97,"pop":87349},"qaracuxur":{"cc":"AZ","lat":40.4,"lng":49.97,"pop":87349},"sheki":{"cc":"AZ","lat":41.19,"lng":47.17,"pop":68400},"mingachevir":{"cc":"AZ","lat":40.76,"lng":47.06,"pop":106048},"khirdalan":{"cc":"AZ","lat":40.45,"lng":49.76,"pop":196200},"ganja":{"cc":"AZ","lat":40.68,"lng":46.36,"pop":330663},"baku":{"cc":"AZ","lat":40.38,"lng":49.89,"pop":2351300},"bakxanov":{"cc":"AZ","lat":40.42,"lng":49.97,"pop":66686},"bakixanov":{"cc":"AZ","lat":40.42,"lng":49.97,"pop":66686},"zenica":{"cc":"BA","lat":44.2,"lng":17.9,"pop":164423},"tuzla":{"cc":"BA","lat":44.54,"lng":18.67,"pop":142486},"sarajevo":{"cc":"BA","lat":43.85,"lng":18.36,"pop":696731},"mostar":{"cc":"BA","lat":43.34,"lng":17.81,"pop":104518},"ilida":{"cc":"BA","lat":43.83,"lng":18.31,"pop":71277},"ilidza":{"cc":"BA","lat":43.83,"lng":18.31,"pop":71277},"bihac":{"cc":"BA","lat":44.82,"lng":15.87,"pop":75641},"biha":{"cc":"BA","lat":44.82,"lng":15.87,"pop":75641},"banja luka":{"cc":"BA","lat":44.78,"lng":17.21,"pop":221106},"bridgetown":{"cc":"BB","lat":13.11,"lng":-59.62,"pop":98511},"thakurgaon":{"cc":"BD","lat":26.03,"lng":88.47,"pop":71096},"thkurgaon":{"cc":"BD","lat":26.03,"lng":88.47,"pop":71096},"tungi":{"cc":"BD","lat":23.89,"lng":90.4,"pop":337579},"sylhet":{"cc":"BD","lat":24.9,"lng":91.87,"pop":237000},"sunmganj":{"cc":"BD","lat":25.07,"lng":91.4,"pop":74570},"sunamganj":{"cc":"BD","lat":25.07,"lng":91.4,"pop":74570},"satkhira":{"cc":"BD","lat":22.71,"lng":89.07,"pop":128918},"stkhira":{"cc":"BD","lat":22.71,"lng":89.07,"pop":128918},"sirajganj":{"cc":"BD","lat":24.46,"lng":89.71,"pop":127481},"netrakona":{"cc":"BD","lat":24.88,"lng":90.73,"pop":79016},"narsingdi":{"cc":"BD","lat":23.92,"lng":90.72,"pop":281080},"sandwp":{"cc":"BD","lat":22.51,"lng":91.45,"pop":52152},"sandwip":{"cc":"BD","lat":22.51,"lng":91.45,"pop":52152},"shahzadpur":{"cc":"BD","lat":24.18,"lng":89.6,"pop":102420},"shhzdpur":{"cc":"BD","lat":24.18,"lng":89.6,"pop":102420},"ramganj":{"cc":"BD","lat":23.1,"lng":90.85,"pop":55241},"rmganj":{"cc":"BD","lat":23.1,"lng":90.85,"pop":55241},"rajshahi":{"cc":"BD","lat":24.37,"lng":88.6,"pop":763580},"pirojpur":{"cc":"BD","lat":22.58,"lng":89.98,"pop":54418},"patiya":{"cc":"BD","lat":22.3,"lng":91.98,"pop":51360},"narayanganj":{"cc":"BD","lat":23.61,"lng":90.5,"pop":223622},"nagarpur":{"cc":"BD","lat":24.06,"lng":89.88,"pop":238422},"ngarpur":{"cc":"BD","lat":24.06,"lng":89.88,"pop":238422},"mymensingh":{"cc":"BD","lat":24.76,"lng":90.41,"pop":225126},"maulavi bazar":{"cc":"BD","lat":24.49,"lng":91.77,"pop":57441},"maulavi bzr":{"cc":"BD","lat":24.49,"lng":91.77,"pop":57441},"lalmonirhat":{"cc":"BD","lat":25.92,"lng":89.45,"pop":65127},"lkshm":{"cc":"BD","lat":23.24,"lng":91.12,"pop":82290},"laksham":{"cc":"BD","lat":23.24,"lng":91.12,"pop":82290},"comilla":{"cc":"BD","lat":23.46,"lng":91.19,"pop":634654},"rangpur":{"cc":"BD","lat":25.75,"lng":89.25,"pop":1031388},"kushtia":{"cc":"BD","lat":23.9,"lng":89.12,"pop":135724},"joypur hat":{"cc":"BD","lat":25.1,"lng":89.03,"pop":73068},"joypur ht":{"cc":"BD","lat":25.1,"lng":89.03,"pop":73068},"ishwardi":{"cc":"BD","lat":24.13,"lng":89.07,"pop":81995},"habiganj":{"cc":"BD","lat":24.38,"lng":91.41,"pop":88760},"feni":{"cc":"BD","lat":23.01,"lng":91.4,"pop":84028},"ripur":{"cc":"BD","lat":23.04,"lng":90.77,"pop":64652},"ramna maidan":{"cc":"BD","lat":23.73,"lng":90.4,"pop":143677},"dhaka":{"cc":"BD","lat":23.71,"lng":90.41,"pop":10356500},"khagrachhari":{"cc":"BD","lat":23.11,"lng":91.97,"pop":50364},"bhairab bzr":{"cc":"BD","lat":24.05,"lng":90.98,"pop":105457},"bhairab bazar":{"cc":"BD","lat":24.05,"lng":90.98,"pop":105457},"bndarban":{"cc":"BD","lat":22.2,"lng":92.22,"pop":495272},"bandarban":{"cc":"BD","lat":22.2,"lng":92.22,"pop":495272},"bagerhat":{"cc":"BD","lat":22.66,"lng":89.79,"pop":266388},"narail":{"cc":"BD","lat":23.16,"lng":89.5,"pop":55112},"tungipara":{"cc":"BD","lat":22.9,"lng":89.9,"pop":114482},"sonrgaon":{"cc":"BD","lat":23.65,"lng":90.62,"pop":130000},"sonargaon":{"cc":"BD","lat":23.65,"lng":90.62,"pop":130000},"sarishabari":{"cc":"BD","lat":24.75,"lng":89.83,"pop":81325},"sarishbri":{"cc":"BD","lat":24.75,"lng":89.83,"pop":81325},"palang":{"cc":"BD","lat":23.22,"lng":90.35,"pop":67652},"plang":{"cc":"BD","lat":23.22,"lng":90.35,"pop":67652},"par naogaon":{"cc":"BD","lat":24.8,"lng":88.95,"pop":192464},"pr naogaon":{"cc":"BD","lat":24.8,"lng":88.95,"pop":192464},"nagar nalukot":{"cc":"BD","lat":24.16,"lng":90.77,"pop":273000},"nagar naluakot":{"cc":"BD","lat":24.16,"lng":90.77,"pop":273000},"mohammadpur":{"cc":"BD","lat":24.9,"lng":88.53,"pop":527571},"maijdi":{"cc":"BD","lat":22.87,"lng":91.1,"pop":132185},"lakshmipur":{"cc":"BD","lat":22.94,"lng":90.83,"pop":61703},"lakshmpur":{"cc":"BD","lat":22.94,"lng":90.83,"pop":61703},"kafrul":{"cc":"BD","lat":23.79,"lng":90.37,"pop":339734},"gazipur":{"cc":"BD","lat":24.0,"lng":90.42,"pop":2674697},"dinajpur":{"cc":"BD","lat":25.63,"lng":88.64,"pop":206234},"chattogram":{"cc":"BD","lat":22.34,"lng":91.83,"pop":3920222},"bhatara":{"cc":"BD","lat":23.8,"lng":90.45,"pop":324300},"ashuganj city":{"cc":"BD","lat":24.04,"lng":91.01,"pop":210356},"satkania":{"cc":"BD","lat":22.08,"lng":92.05,"pop":52005},"stkania":{"cc":"BD","lat":22.08,"lng":92.05,"pop":52005},"coxs bazar":{"cc":"BD","lat":21.44,"lng":92.01,"pop":253788},"coxs bzr":{"cc":"BD","lat":21.44,"lng":92.01,"pop":253788},"khulna":{"cc":"BD","lat":22.81,"lng":89.56,"pop":1500689},"bhola":{"cc":"BD","lat":22.69,"lng":90.64,"pop":99079},"barishal":{"cc":"BD","lat":22.7,"lng":90.37,"pop":202242},"rangamati":{"cc":"BD","lat":22.64,"lng":92.19,"pop":106069},"jessore":{"cc":"BD","lat":23.17,"lng":89.21,"pop":243987},"brhmanbria":{"cc":"BD","lat":23.97,"lng":91.11,"pop":264326},"brahmanbaria":{"cc":"BD","lat":23.97,"lng":91.11,"pop":264326},"pabna":{"cc":"BD","lat":24.01,"lng":89.24,"pop":186781},"pbna":{"cc":"BD","lat":24.01,"lng":89.24,"pop":186781},"tangail":{"cc":"BD","lat":24.25,"lng":89.92,"pop":180144},"bogra":{"cc":"BD","lat":24.85,"lng":89.37,"pop":210000},"madaripur":{"cc":"BD","lat":23.17,"lng":90.21,"pop":84789},"sherpur":{"cc":"BD","lat":25.02,"lng":90.02,"pop":107419},"kishorganj":{"cc":"BD","lat":24.44,"lng":90.78,"pop":90690},"manikganj":{"cc":"BD","lat":23.86,"lng":90.01,"pop":71698},"mnikganj":{"cc":"BD","lat":23.86,"lng":90.01,"pop":71698},"savar":{"cc":"BD","lat":23.85,"lng":90.25,"pop":286008},"hthazri":{"cc":"BD","lat":22.51,"lng":91.81,"pop":498179},"hathazari":{"cc":"BD","lat":22.51,"lng":91.81,"pop":498179},"bibir hat":{"cc":"BD","lat":22.68,"lng":91.79,"pop":89030},"saidpur":{"cc":"BD","lat":25.78,"lng":88.89,"pop":199422},"puthia":{"cc":"BD","lat":24.37,"lng":88.83,"pop":159406},"natore":{"cc":"BD","lat":24.41,"lng":88.99,"pop":369138},"patuakhali":{"cc":"BD","lat":22.37,"lng":90.35,"pop":65000},"dhanmondi":{"cc":"BD","lat":23.74,"lng":90.39,"pop":54210},"pallabi":{"cc":"BD","lat":23.82,"lng":90.37,"pop":597574},"azimpur":{"cc":"BD","lat":23.73,"lng":90.39,"pop":96641},"karnaphuli":{"cc":"BD","lat":22.69,"lng":92.23,"pop":203697},"paltan":{"cc":"BD","lat":23.74,"lng":90.41,"pop":184492},"mirpur model thana":{"cc":"BD","lat":23.81,"lng":90.36,"pop":546503},"motijheel":{"cc":"BD","lat":23.73,"lng":90.42,"pop":202308},"woluwe-saint-lambert":{"cc":"BE","lat":50.84,"lng":4.43,"pop":56584},"verviers":{"cc":"BE","lat":50.59,"lng":5.86,"pop":52824},"uccle":{"cc":"BE","lat":50.8,"lng":4.34,"pop":82929},"tournai":{"cc":"BE","lat":50.61,"lng":3.39,"pop":69554},"sint-niklaas":{"cc":"BE","lat":51.17,"lng":4.14,"pop":69010},"seraing":{"cc":"BE","lat":50.58,"lng":5.5,"pop":60737},"schaerbeek":{"cc":"BE","lat":50.87,"lng":4.38,"pop":132761},"saint-gilles":{"cc":"BE","lat":50.83,"lng":4.34,"pop":50221},"roeselare":{"cc":"BE","lat":50.95,"lng":3.12,"pop":56016},"ostend":{"cc":"BE","lat":51.22,"lng":2.93,"pop":69011},"namur":{"cc":"BE","lat":50.47,"lng":4.87,"pop":110939},"mouscron":{"cc":"BE","lat":50.74,"lng":3.21,"pop":52069},"mons":{"cc":"BE","lat":50.45,"lng":3.95,"pop":95299},"molenbeek-saint-jean":{"cc":"BE","lat":50.85,"lng":4.31,"pop":97037},"mechelen":{"cc":"BE","lat":51.03,"lng":4.48,"pop":77530},"liege":{"cc":"BE","lat":50.63,"lng":5.57,"pop":195278},"lige":{"cc":"BE","lat":50.63,"lng":5.57,"pop":195278},"leuven":{"cc":"BE","lat":50.88,"lng":4.7,"pop":101032},"la louviere":{"cc":"BE","lat":50.49,"lng":4.19,"pop":76668},"la louvire":{"cc":"BE","lat":50.49,"lng":4.19,"pop":76668},"kortrijk":{"cc":"BE","lat":50.83,"lng":3.26,"pop":73879},"jette":{"cc":"BE","lat":50.87,"lng":4.33,"pop":52490},"ixelles":{"cc":"BE","lat":50.83,"lng":4.37,"pop":86671},"hasselt":{"cc":"BE","lat":50.93,"lng":5.34,"pop":77651},"gent":{"cc":"BE","lat":51.05,"lng":3.72,"pop":265086},"genk":{"cc":"BE","lat":50.97,"lng":5.5,"pop":63666},"forest":{"cc":"BE","lat":50.82,"lng":4.33,"pop":56254},"deurne":{"cc":"BE","lat":51.22,"lng":4.47,"pop":78747},"charleroi":{"cc":"BE","lat":50.41,"lng":4.44,"pop":200132},"brussels":{"cc":"BE","lat":50.85,"lng":4.35,"pop":1019022},"brugge":{"cc":"BE","lat":51.21,"lng":3.22,"pop":118509},"antwerp":{"cc":"BE","lat":51.22,"lng":4.4,"pop":529247},"anderlecht":{"cc":"BE","lat":50.84,"lng":4.31,"pop":160553},"aalst":{"cc":"BE","lat":50.94,"lng":4.04,"pop":77534},"tenkodogo":{"cc":"BF","lat":11.78,"lng":-0.37,"pop":61936},"saaba":{"cc":"BF","lat":12.37,"lng":-1.41,"pop":136011},"pouytenga":{"cc":"BF","lat":12.25,"lng":-0.43,"pop":96469},"ouahigouya":{"cc":"BF","lat":13.58,"lng":-2.42,"pop":124587},"ouagadougou":{"cc":"BF","lat":12.37,"lng":-1.53,"pop":2415266},"nioko i":{"cc":"BF","lat":12.4,"lng":-1.44,"pop":65263},"leo":{"cc":"BF","lat":11.1,"lng":-2.11,"pop":51743},"lo":{"cc":"BF","lat":11.1,"lng":-2.11,"pop":51743},"koudougou":{"cc":"BF","lat":12.25,"lng":-2.37,"pop":160239},"kongoussi":{"cc":"BF","lat":13.33,"lng":-1.53,"pop":53627},"kaya":{"cc":"BF","lat":13.09,"lng":-1.08,"pop":121970},"hounde":{"cc":"BF","lat":11.5,"lng":-3.52,"pop":87151},"hound":{"cc":"BF","lat":11.5,"lng":-3.52,"pop":87151},"fada ngourma":{"cc":"BF","lat":12.06,"lng":0.36,"pop":73200},"djibo":{"cc":"BF","lat":14.1,"lng":-1.63,"pop":61462},"dedougou":{"cc":"BF","lat":12.46,"lng":-3.46,"pop":63617},"ddougou":{"cc":"BF","lat":12.46,"lng":-3.46,"pop":63617},"bobo-dioulasso":{"cc":"BF","lat":11.18,"lng":-4.29,"pop":904920},"banfora":{"cc":"BF","lat":10.64,"lng":-4.75,"pop":117452},"yambol":{"cc":"BG","lat":42.48,"lng":26.5,"pop":63656},"veliko turnovo":{"cc":"BG","lat":43.08,"lng":25.63,"pop":59166},"veliko trnovo":{"cc":"BG","lat":43.08,"lng":25.63,"pop":59166},"varna":{"cc":"BG","lat":43.22,"lng":27.91,"pop":318737},"dobrich":{"cc":"BG","lat":43.56,"lng":27.83,"pop":69434},"stara zagora":{"cc":"BG","lat":42.43,"lng":25.64,"pop":121582},"sofia":{"cc":"BG","lat":42.7,"lng":23.32,"pop":1152556},"sliven":{"cc":"BG","lat":42.69,"lng":26.33,"pop":83740},"shumen":{"cc":"BG","lat":43.27,"lng":26.92,"pop":72342},"ruse":{"cc":"BG","lat":43.85,"lng":25.95,"pop":121168},"plovdiv":{"cc":"BG","lat":42.15,"lng":24.75,"pop":329489},"pleven":{"cc":"BG","lat":43.42,"lng":24.62,"pop":90209},"pernik":{"cc":"BG","lat":42.6,"lng":23.03,"pop":82467},"pazardzhik":{"cc":"BG","lat":42.2,"lng":24.33,"pop":55220},"haskovo":{"cc":"BG","lat":41.93,"lng":25.56,"pop":64564},"burgas":{"cc":"BG","lat":42.51,"lng":27.47,"pop":210646},"blagoevgrad":{"cc":"BG","lat":42.01,"lng":23.1,"pop":67810},"asenovgrad":{"cc":"BG","lat":42.02,"lng":24.87,"pop":54778},"sitrah":{"cc":"BH","lat":26.15,"lng":50.62,"pop":72601},"jidd af":{"cc":"BH","lat":26.22,"lng":50.55,"pop":66588},"jidd hafs":{"cc":"BH","lat":26.22,"lng":50.55,"pop":66588},"madinat hamad":{"cc":"BH","lat":26.12,"lng":50.51,"pop":133550},"madnat amad":{"cc":"BH","lat":26.12,"lng":50.51,"pop":133550},"dr kulayb":{"cc":"BH","lat":26.07,"lng":50.5,"pop":65466},"dar kulayb":{"cc":"BH","lat":26.07,"lng":50.5,"pop":65466},"al muharraq":{"cc":"BH","lat":26.26,"lng":50.61,"pop":176583},"manama":{"cc":"BH","lat":26.23,"lng":50.59,"pop":147074},"ar rif":{"cc":"BH","lat":26.13,"lng":50.55,"pop":115495},"ar rifa":{"cc":"BH","lat":26.13,"lng":50.55,"pop":115495},"rumonge":{"cc":"BI","lat":-3.97,"lng":29.44,"pop":55599},"bujumbura":{"cc":"BI","lat":-3.38,"lng":29.36,"pop":769317},"gitega":{"cc":"BI","lat":-3.43,"lng":29.92,"pop":64904},"ngozi":{"cc":"BI","lat":-2.91,"lng":29.83,"pop":61716},"porto-novo":{"cc":"BJ","lat":6.5,"lng":2.6,"pop":264320},"parakou":{"cc":"BJ","lat":9.34,"lng":2.63,"pop":255478},"nikki":{"cc":"BJ","lat":9.94,"lng":3.21,"pop":66109},"natitingou":{"cc":"BJ","lat":10.3,"lng":1.38,"pop":53284},"malanville":{"cc":"BJ","lat":11.87,"lng":3.38,"pop":64639},"kerou":{"cc":"BJ","lat":10.83,"lng":2.1,"pop":54276},"krou":{"cc":"BJ","lat":10.83,"lng":2.1,"pop":54276},"godom":{"cc":"BJ","lat":6.39,"lng":2.35,"pop":253262},"godome":{"cc":"BJ","lat":6.39,"lng":2.35,"pop":253262},"ekp":{"cc":"BJ","lat":6.39,"lng":2.54,"pop":75313},"ekpe":{"cc":"BJ","lat":6.39,"lng":2.54,"pop":75313},"djougou":{"cc":"BJ","lat":9.71,"lng":1.67,"pop":94773},"cotonou":{"cc":"BJ","lat":6.37,"lng":2.42,"pop":679012},"bohicon":{"cc":"BJ","lat":7.18,"lng":2.07,"pop":93744},"abomey-calavi":{"cc":"BJ","lat":6.45,"lng":2.36,"pop":385755},"abomey":{"cc":"BJ","lat":7.18,"lng":1.99,"pop":117824},"bandar seri begawan":{"cc":"BN","lat":4.89,"lng":114.94,"pop":64409},"yacuiba":{"cc":"BO","lat":-22.02,"lng":-63.68,"pop":82803},"vinto":{"cc":"BO","lat":-17.39,"lng":-66.32,"pop":58739},"viacha":{"cc":"BO","lat":-16.65,"lng":-68.3,"pop":86218},"tiquipaya":{"cc":"BO","lat":-17.34,"lng":-66.22,"pop":62675},"tarija":{"cc":"BO","lat":-21.54,"lng":-64.73,"pop":159269},"sucre":{"cc":"BO","lat":-19.03,"lng":-65.26,"pop":224838},"santa cruz de la sierra":{"cc":"BO","lat":-17.79,"lng":-63.18,"pop":1831434},"sacaba":{"cc":"BO","lat":-17.4,"lng":-66.04,"pop":180726},"riberalta":{"cc":"BO","lat":-11.01,"lng":-66.05,"pop":99070},"quillacollo":{"cc":"BO","lat":-17.39,"lng":-66.28,"pop":172405},"potos":{"cc":"BO","lat":-19.58,"lng":-65.75,"pop":141251},"potosi":{"cc":"BO","lat":-19.58,"lng":-65.75,"pop":141251},"oruro":{"cc":"BO","lat":-17.97,"lng":-67.09,"pop":208684},"montero":{"cc":"BO","lat":-17.34,"lng":-63.25,"pop":88616},"colcapirhua":{"cc":"BO","lat":-17.39,"lng":-66.24,"pop":52732},"cochabamba":{"cc":"BO","lat":-17.38,"lng":-66.16,"pop":841276},"vitria de santo anto":{"cc":"BR","lat":-8.12,"lng":-35.29,"pop":134084},"vitoria de santo antao":{"cc":"BR","lat":-8.12,"lng":-35.29,"pop":134084},"vigia":{"cc":"BR","lat":-0.86,"lng":-48.14,"pop":50832},"viosa do cear":{"cc":"BR","lat":-3.56,"lng":-41.09,"pop":61410},"vicosa do ceara":{"cc":"BR","lat":-3.56,"lng":-41.09,"pop":61410},"vargem grande":{"cc":"BR","lat":-3.54,"lng":-43.92,"pop":57168},"unio dos palmares":{"cc":"BR","lat":-9.16,"lng":-36.03,"pop":65790},"uniao dos palmares":{"cc":"BR","lat":-9.16,"lng":-36.03,"pop":65790},"tutia":{"cc":"BR","lat":-2.76,"lng":-42.27,"pop":59398},"tutoia":{"cc":"BR","lat":-2.76,"lng":-42.27,"pop":59398},"tucuru":{"cc":"BR","lat":-3.77,"lng":-49.68,"pop":115144},"tucurui":{"cc":"BR","lat":-3.77,"lng":-49.68,"pop":115144},"trairi":{"cc":"BR","lat":-3.28,"lng":-39.27,"pop":56291},"tome-acu":{"cc":"BR","lat":-2.42,"lng":-48.15,"pop":67585},"tom-au":{"cc":"BR","lat":-2.42,"lng":-48.15,"pop":67585},"timon":{"cc":"BR","lat":-5.09,"lng":-42.84,"pop":174465},"tiangu":{"cc":"BR","lat":-3.73,"lng":-40.99,"pop":76537},"tiangua":{"cc":"BR","lat":-3.73,"lng":-40.99,"pop":76537},"teresina":{"cc":"BR","lat":-5.09,"lng":-42.8,"pop":871126},"taua":{"cc":"BR","lat":-6.0,"lng":-40.29,"pop":59062},"tau":{"cc":"BR","lat":-6.0,"lng":-40.29,"pop":59062},"surubim":{"cc":"BR","lat":-7.83,"lng":-35.75,"pop":64120},"sousa":{"cc":"BR","lat":-6.76,"lng":-38.23,"pop":67259},"sobral":{"cc":"BR","lat":-3.69,"lng":-40.35,"pop":216519},"serra talhada":{"cc":"BR","lat":-7.99,"lng":-38.3,"pop":92228},"sap":{"cc":"BR","lat":-7.1,"lng":-35.23,"pop":51306},"sape":{"cc":"BR","lat":-7.1,"lng":-35.23,"pop":51306},"sao miguel dos campos":{"cc":"BR","lat":-9.78,"lng":-36.09,"pop":61797},"so miguel dos campos":{"cc":"BR","lat":-9.78,"lng":-36.09,"pop":61797},"sao miguel do guama":{"cc":"BR","lat":-1.63,"lng":-47.48,"pop":59632},"so miguel do guam":{"cc":"BR","lat":-1.63,"lng":-47.48,"pop":59632},"sao luis":{"cc":"BR","lat":-2.53,"lng":-44.3,"pop":917237},"so lus":{"cc":"BR","lat":-2.53,"lng":-44.3,"pop":917237},"so loureno da mata":{"cc":"BR","lat":-8.0,"lng":-35.02,"pop":118258},"sao lourenco da mata":{"cc":"BR","lat":-8.0,"lng":-35.02,"pop":118258},"so jos de ribamar":{"cc":"BR","lat":-2.56,"lng":-44.06,"pop":259164},"sao jose de ribamar":{"cc":"BR","lat":-2.56,"lng":-44.06,"pop":259164},"sao goncalo do amarante":{"cc":"BR","lat":-5.79,"lng":-35.33,"pop":115838},"so gonalo do amarante":{"cc":"BR","lat":-5.79,"lng":-35.33,"pop":115838},"so flix do xingu":{"cc":"BR","lat":-6.64,"lng":-51.99,"pop":132138},"sao felix do xingu":{"cc":"BR","lat":-6.64,"lng":-51.99,"pop":132138},"santa rita":{"cc":"BR","lat":-7.11,"lng":-34.98,"pop":149910},"santarm":{"cc":"BR","lat":-2.44,"lng":-54.71,"pop":360871},"santarem":{"cc":"BR","lat":-2.44,"lng":-54.71,"pop":360871},"santa isabel do para":{"cc":"BR","lat":-1.3,"lng":-48.16,"pop":71837},"santa isabel do par":{"cc":"BR","lat":-1.3,"lng":-48.16,"pop":71837},"santa ines":{"cc":"BR","lat":-3.67,"lng":-45.38,"pop":85014},"santa ins":{"cc":"BR","lat":-3.67,"lng":-45.38,"pop":85014},"santa cruz do capibaribe":{"cc":"BR","lat":-7.96,"lng":-36.2,"pop":104854},"salgueiro":{"cc":"BR","lat":-8.07,"lng":-39.12,"pop":65946},"russas":{"cc":"BR","lat":-4.94,"lng":-37.98,"pop":78882},"rio largo":{"cc":"BR","lat":-9.48,"lng":-35.85,"pop":97435},"recife":{"cc":"BR","lat":-8.05,"lng":-34.88,"pop":1653461},"quixeramobim":{"cc":"BR","lat":-5.2,"lng":-39.29,"pop":82177},"quixad":{"cc":"BR","lat":-4.97,"lng":-39.02,"pop":88321},"quixada":{"cc":"BR","lat":-4.97,"lng":-39.02,"pop":88321},"santana":{"cc":"BR","lat":-0.04,"lng":-51.17,"pop":118803},"portel":{"cc":"BR","lat":-1.94,"lng":-50.82,"pop":62945},"piripiri":{"cc":"BR","lat":-4.27,"lng":-41.78,"pop":63787},"pinheiro":{"cc":"BR","lat":-2.52,"lng":-45.08,"pop":83777},"picos":{"cc":"BR","lat":-7.08,"lng":-41.47,"pop":83090},"petrolina":{"cc":"BR","lat":-9.4,"lng":-40.5,"pop":418444},"pesqueira":{"cc":"BR","lat":-8.36,"lng":-36.7,"pop":62722},"paulo afonso":{"cc":"BR","lat":-9.41,"lng":-38.21,"pop":119418},"paulista":{"cc":"BR","lat":-7.94,"lng":-34.87,"pop":342167},"paudalho":{"cc":"BR","lat":-7.9,"lng":-35.18,"pop":56665},"patos":{"cc":"BR","lat":-7.02,"lng":-37.28,"pop":92575},"parnamirim":{"cc":"BR","lat":-5.92,"lng":-35.26,"pop":271713},"parnaiba":{"cc":"BR","lat":-2.9,"lng":-41.78,"pop":170491},"parnaba":{"cc":"BR","lat":-2.9,"lng":-41.78,"pop":170491},"parintins":{"cc":"BR","lat":-2.63,"lng":-56.74,"pop":101855},"paragominas":{"cc":"BR","lat":-3.0,"lng":-47.35,"pop":105550},"palmares":{"cc":"BR","lat":-8.68,"lng":-35.59,"pop":56475},"pacatuba":{"cc":"BR","lat":-3.98,"lng":-38.62,"pop":81524},"pacajus":{"cc":"BR","lat":-4.17,"lng":-38.46,"pop":73188},"ouricuri":{"cc":"BR","lat":-7.88,"lng":-40.08,"pop":68489},"oriximin":{"cc":"BR","lat":-1.77,"lng":-55.87,"pop":74016},"oriximina":{"cc":"BR","lat":-1.77,"lng":-55.87,"pop":74016},"olinda":{"cc":"BR","lat":-8.01,"lng":-34.86,"pop":364717},"obidos":{"cc":"BR","lat":-1.92,"lng":-55.52,"pop":52306},"bidos":{"cc":"BR","lat":-1.92,"lng":-55.52,"pop":52306},"natal":{"cc":"BR","lat":-5.79,"lng":-35.21,"pop":896708},"morada nova":{"cc":"BR","lat":-5.11,"lng":-38.37,"pop":61738},"monte alegre":{"cc":"BR","lat":-2.0,"lng":-54.08,"pop":58162},"moju":{"cc":"BR","lat":-1.88,"lng":-48.77,"pop":83182},"mossoro":{"cc":"BR","lat":-5.19,"lng":-37.34,"pop":264577},"mossor":{"cc":"BR","lat":-5.19,"lng":-37.34,"pop":264577},"maues":{"cc":"BR","lat":-3.38,"lng":-57.72,"pop":65040},"maus":{"cc":"BR","lat":-3.38,"lng":-57.72,"pop":65040},"marechal deodoro":{"cc":"BR","lat":-9.71,"lng":-35.9,"pop":62341},"maranguape":{"cc":"BR","lat":-3.89,"lng":-38.69,"pop":108622},"maracana":{"cc":"BR","lat":-3.88,"lng":-38.63,"pop":251613},"maracanau":{"cc":"BR","lat":-3.88,"lng":-38.63,"pop":251613},"marab":{"cc":"BR","lat":-5.38,"lng":-49.13,"pop":283542},"maraba":{"cc":"BR","lat":-5.38,"lng":-49.13,"pop":283542},"macei":{"cc":"BR","lat":-9.67,"lng":-35.74,"pop":1031597},"maceio":{"cc":"BR","lat":-9.67,"lng":-35.74,"pop":1031597},"macap":{"cc":"BR","lat":0.04,"lng":-51.07,"pop":512902},"macapa":{"cc":"BR","lat":0.04,"lng":-51.07,"pop":512902},"macaba":{"cc":"BR","lat":-5.86,"lng":-35.35,"pop":81821},"macaiba":{"cc":"BR","lat":-5.86,"lng":-35.35,"pop":81821},"limoeiro do norte":{"cc":"BR","lat":-5.15,"lng":-38.1,"pop":59890},"limoeiro":{"cc":"BR","lat":-7.87,"lng":-35.45,"pop":56510},"juruti":{"cc":"BR","lat":-2.15,"lng":-56.09,"pop":58960},"juazeiro do norte":{"cc":"BR","lat":-7.21,"lng":-39.32,"pop":305531},"juazeiro":{"cc":"BR","lat":-9.41,"lng":-40.5,"pop":256122},"joo pessoa":{"cc":"BR","lat":-7.12,"lng":-34.86,"pop":817511},"joao pessoa":{"cc":"BR","lat":-7.12,"lng":-34.86,"pop":817511},"jacund":{"cc":"BR","lat":-4.45,"lng":-49.12,"pop":59842},"jacunda":{"cc":"BR","lat":-4.45,"lng":-49.12,"pop":59842},"itupiranga":{"cc":"BR","lat":-5.13,"lng":-49.33,"pop":53355},"itacoatiara":{"cc":"BR","lat":-3.14,"lng":-58.44,"pop":113917},"itapipoca":{"cc":"BR","lat":-3.49,"lng":-39.58,"pop":138978},"itapecuru mirim":{"cc":"BR","lat":-3.39,"lng":-44.36,"pop":68723},"itapage":{"cc":"BR","lat":-3.69,"lng":-39.59,"pop":53067},"itapag":{"cc":"BR","lat":-3.69,"lng":-39.59,"pop":53067},"itaituba":{"cc":"BR","lat":-4.28,"lng":-55.98,"pop":135369},"ipojuca":{"cc":"BR","lat":-8.4,"lng":-35.06,"pop":105638},"imperatriz":{"cc":"BR","lat":-5.53,"lng":-47.49,"pop":273110},"iguatu":{"cc":"BR","lat":-6.36,"lng":-39.3,"pop":98064},"igarap miri":{"cc":"BR","lat":-1.98,"lng":-48.96,"pop":64831},"igarape miri":{"cc":"BR","lat":-1.98,"lng":-48.96,"pop":64831},"igarassu":{"cc":"BR","lat":-7.83,"lng":-34.91,"pop":123017},"ico":{"cc":"BR","lat":-6.4,"lng":-38.86,"pop":68303},"ic":{"cc":"BR","lat":-6.4,"lng":-38.86,"pop":68303},"horizonte":{"cc":"BR","lat":-4.1,"lng":-38.49,"pop":70983},"guarabira":{"cc":"BR","lat":-6.85,"lng":-35.49,"pop":57484},"gravata":{"cc":"BR","lat":-29.94,"lng":-50.99,"pop":265074},"gravat":{"cc":"BR","lat":-8.2,"lng":-35.56,"pop":92429},"granja":{"cc":"BR","lat":-3.12,"lng":-40.83,"pop":54962},"grajau":{"cc":"BR","lat":-23.77,"lng":-46.67,"pop":384873},"graja":{"cc":"BR","lat":-23.77,"lng":-46.67,"pop":384873},"goiana":{"cc":"BR","lat":-7.56,"lng":-35.0,"pop":85160},"garanhuns":{"cc":"BR","lat":-8.88,"lng":-36.5,"pop":151803},"fortaleza":{"cc":"BR","lat":-3.72,"lng":-38.54,"pop":2400000},"floriano":{"cc":"BR","lat":-6.77,"lng":-43.02,"pop":62036},"eusebio":{"cc":"BR","lat":-3.89,"lng":-38.45,"pop":74170},"eusbio":{"cc":"BR","lat":-3.89,"lng":-38.45,"pop":74170},"extremoz":{"cc":"BR","lat":-5.71,"lng":-35.31,"pop":61635},"escada":{"cc":"BR","lat":-8.36,"lng":-35.22,"pop":62174},"delmiro gouveia":{"cc":"BR","lat":-9.39,"lng":-38.0,"pop":52809},"crato":{"cc":"BR","lat":-7.23,"lng":-39.41,"pop":139027},"crates":{"cc":"BR","lat":-5.18,"lng":-40.67,"pop":75159},"crateus":{"cc":"BR","lat":-5.18,"lng":-40.67,"pop":75159},"coroat":{"cc":"BR","lat":-4.13,"lng":-44.12,"pop":65544},"coroata":{"cc":"BR","lat":-4.13,"lng":-44.12,"pop":65544},"cod":{"cc":"BR","lat":-4.46,"lng":-43.89,"pop":114275},"codo":{"cc":"BR","lat":-4.46,"lng":-43.89,"pop":114275},"chapadinha":{"cc":"BR","lat":-3.74,"lng":-43.36,"pop":80195},"ceara-mirim":{"cc":"BR","lat":-5.63,"lng":-35.43,"pop":79115},"cear-mirim":{"cc":"BR","lat":-5.63,"lng":-35.43,"pop":79115},"caxias":{"cc":"BR","lat":-4.86,"lng":-43.36,"pop":163546},"caucaia":{"cc":"BR","lat":-3.74,"lng":-38.65,"pop":378406},"castanhal":{"cc":"BR","lat":-1.29,"lng":-47.93,"pop":192256},"cascavel":{"cc":"BR","lat":-24.96,"lng":-53.46,"pop":368195},"casa nova":{"cc":"BR","lat":-9.17,"lng":-40.98,"pop":72086},"caruaru":{"cc":"BR","lat":-8.28,"lng":-35.98,"pop":402290},"carpina":{"cc":"BR","lat":-7.85,"lng":-35.25,"pop":83205},"capitao poco":{"cc":"BR","lat":-1.75,"lng":-47.06,"pop":56506},"capito poo":{"cc":"BR","lat":-1.75,"lng":-47.06,"pop":56506},"capanema":{"cc":"BR","lat":-1.2,"lng":-47.18,"pop":70394},"caninde":{"cc":"BR","lat":-4.36,"lng":-39.31,"pop":77244},"canind":{"cc":"BR","lat":-4.36,"lng":-39.31,"pop":77244},"campina grande":{"cc":"BR","lat":-7.23,"lng":-35.88,"pop":443911},"camocim":{"cc":"BR","lat":-2.9,"lng":-40.84,"pop":63907},"camet":{"cc":"BR","lat":-2.24,"lng":-49.5,"pop":134184},"cameta":{"cc":"BR","lat":-2.24,"lng":-49.5,"pop":134184},"camaragibe":{"cc":"BR","lat":-8.02,"lng":-34.98,"pop":160318},"cajazeiras":{"cc":"BR","lat":-6.89,"lng":-38.56,"pop":63239},"caico":{"cc":"BR","lat":-6.46,"lng":-37.1,"pop":61146},"caic":{"cc":"BR","lat":-6.46,"lng":-37.1,"pop":61146},"cabo de santo agostinho":{"cc":"BR","lat":-8.29,"lng":-35.03,"pop":216969},"cabedelo":{"cc":"BR","lat":-6.98,"lng":-34.83,"pop":68767},"buique":{"cc":"BR","lat":-8.62,"lng":-37.16,"pop":53489},"buque":{"cc":"BR","lat":-8.62,"lng":-37.16,"pop":53489},"breves":{"cc":"BR","lat":-1.68,"lng":-50.48,"pop":116058},"brejo da madre de deus":{"cc":"BR","lat":-8.15,"lng":-36.37,"pop":51308},"braganca":{"cc":"BR","lat":-1.05,"lng":-46.77,"pop":132489},"bragana":{"cc":"BR","lat":-1.05,"lng":-46.77,"pop":132489},"boa viagem":{"cc":"BR","lat":-5.13,"lng":-39.73,"pop":54577},"bezerros":{"cc":"BR","lat":-8.23,"lng":-35.8,"pop":65007},"benevides":{"cc":"BR","lat":-1.36,"lng":-48.24,"pop":63567},"belo jardim":{"cc":"BR","lat":-8.34,"lng":-36.42,"pop":84033},"belm":{"cc":"BR","lat":-1.46,"lng":-48.5,"pop":1499641},"belem":{"cc":"BR","lat":-1.46,"lng":-48.5,"pop":1499641},"beberibe":{"cc":"BR","lat":-4.18,"lng":-38.13,"pop":53949},"bayeux":{"cc":"BR","lat":-7.12,"lng":-34.93,"pop":97203},"barreirinhas":{"cc":"BR","lat":-2.76,"lng":-42.83,"pop":65589},"barra do corda":{"cc":"BR","lat":-5.51,"lng":-45.24,"pop":88492},"barcarena":{"cc":"BR","lat":-1.51,"lng":-48.63,"pop":139076},"barbalha":{"cc":"BR","lat":-7.31,"lng":-39.3,"pop":61228},"balsas":{"cc":"BR","lat":-7.53,"lng":-46.04,"pop":105974},"bacabal":{"cc":"BR","lat":-4.23,"lng":-44.78,"pop":107755},"arcoverde":{"cc":"BR","lat":-8.42,"lng":-37.05,"pop":82487},"araripina":{"cc":"BR","lat":-7.58,"lng":-40.5,"pop":90504},"arapiraca":{"cc":"BR","lat":-9.75,"lng":-36.66,"pop":243906},"araguana":{"cc":"BR","lat":-7.19,"lng":-48.21,"pop":183024},"araguaina":{"cc":"BR","lat":-7.19,"lng":-48.21,"pop":183024},"aquiraz":{"cc":"BR","lat":-3.9,"lng":-38.39,"pop":65116},"ananindeua":{"cc":"BR","lat":-1.37,"lng":-48.37,"pop":535547},"alenquer":{"cc":"BR","lat":-1.94,"lng":-54.74,"pop":57092},"acu":{"cc":"BR","lat":-5.58,"lng":-36.91,"pop":56496},"au":{"cc":"BR","lat":-5.58,"lng":-36.91,"pop":56496},"acopiara":{"cc":"BR","lat":-6.1,"lng":-39.45,"pop":54481},"acarau":{"cc":"BR","lat":-2.89,"lng":-40.12,"pop":63104},"acara":{"cc":"BR","lat":-2.89,"lng":-40.12,"pop":63104},"acar":{"cc":"BR","lat":-1.96,"lng":-48.2,"pop":59023},"abreu e lima":{"cc":"BR","lat":-7.91,"lng":-34.9,"pop":104248},"abaetetuba":{"cc":"BR","lat":-1.72,"lng":-48.88,"pop":158188},"xanxer":{"cc":"BR","lat":-26.88,"lng":-52.4,"pop":51607},"xanxere":{"cc":"BR","lat":-26.88,"lng":-52.4,"pop":51607},"votuporanga":{"cc":"BR","lat":-20.42,"lng":-49.97,"pop":100568},"votorantim":{"cc":"BR","lat":-23.55,"lng":-47.44,"pop":133510},"volta redonda":{"cc":"BR","lat":-22.52,"lng":-44.1,"pop":279971},"vitria da conquista":{"cc":"BR","lat":-14.87,"lng":-40.84,"pop":396613},"vitoria da conquista":{"cc":"BR","lat":-14.87,"lng":-40.84,"pop":396613},"vitria":{"cc":"BR","lat":-20.32,"lng":-40.34,"pop":312656},"vitoria":{"cc":"BR","lat":-20.32,"lng":-40.34,"pop":312656},"vinhedo":{"cc":"BR","lat":-23.03,"lng":-46.98,"pop":76540},"vila velha":{"cc":"BR","lat":-20.33,"lng":-40.29,"pop":394930},"vila mariana":{"cc":"BR","lat":-23.59,"lng":-46.63,"pop":127286},"vila maria":{"cc":"BR","lat":-23.51,"lng":-46.59,"pop":108543},"videira":{"cc":"BR","lat":-27.01,"lng":-51.15,"pop":55466},"viosa":{"cc":"BR","lat":-20.75,"lng":-42.88,"pop":76430},"vicosa":{"cc":"BR","lat":-20.75,"lng":-42.88,"pop":76430},"viamo":{"cc":"BR","lat":-30.08,"lng":-51.02,"pop":231996},"viamao":{"cc":"BR","lat":-30.08,"lng":-51.02,"pop":231996},"vespasiano":{"cc":"BR","lat":-19.69,"lng":-43.92,"pop":138583},"venancio aires":{"cc":"BR","lat":-29.61,"lng":-52.19,"pop":68763},"venncio aires":{"cc":"BR","lat":-29.61,"lng":-52.19,"pop":68763},"varzea paulista":{"cc":"BR","lat":-23.21,"lng":-46.83,"pop":115771},"vrzea paulista":{"cc":"BR","lat":-23.21,"lng":-46.83,"pop":115771},"vrzea grande":{"cc":"BR","lat":-15.65,"lng":-56.13,"pop":300078},"varzea grande":{"cc":"BR","lat":-15.65,"lng":-56.13,"pop":300078},"varginha":{"cc":"BR","lat":-21.55,"lng":-45.43,"pop":136467},"valinhos":{"cc":"BR","lat":-22.97,"lng":-47.0,"pop":132258},"valenca":{"cc":"BR","lat":-13.37,"lng":-39.07,"pop":97873},"valena":{"cc":"BR","lat":-13.37,"lng":-39.07,"pop":97873},"vacaria":{"cc":"BR","lat":-28.51,"lng":-50.93,"pop":64197},"uruguaiana":{"cc":"BR","lat":-29.75,"lng":-57.09,"pop":120819},"unio da vitria":{"cc":"BR","lat":-26.23,"lng":-51.09,"pop":57913},"uniao da vitoria":{"cc":"BR","lat":-26.23,"lng":-51.09,"pop":57913},"unai":{"cc":"BR","lat":-16.36,"lng":-46.91,"pop":84930},"umuarama":{"cc":"BR","lat":-23.77,"lng":-53.33,"pop":123059},"uberlndia":{"cc":"BR","lat":-18.92,"lng":-48.28,"pop":754954},"uberlandia":{"cc":"BR","lat":-18.92,"lng":-48.28,"pop":754954},"uberaba":{"cc":"BR","lat":-19.75,"lng":-47.93,"pop":356781},"ubatuba":{"cc":"BR","lat":-23.43,"lng":-45.07,"pop":91824},"ub":{"cc":"BR","lat":-21.12,"lng":-42.94,"pop":107423},"uba":{"cc":"BR","lat":-21.12,"lng":-42.94,"pop":107423},"tup":{"cc":"BR","lat":-21.93,"lng":-50.51,"pop":65570},"tupa":{"cc":"BR","lat":-21.93,"lng":-50.51,"pop":65570},"tucuruvi":{"cc":"BR","lat":-23.48,"lng":-46.61,"pop":99559},"tubaro":{"cc":"BR","lat":-28.47,"lng":-49.01,"pop":116725},"tubarao":{"cc":"BR","lat":-28.47,"lng":-49.01,"pop":116725},"trindade":{"cc":"BR","lat":-16.65,"lng":-49.49,"pop":142431},"trs rios":{"cc":"BR","lat":-22.12,"lng":-43.21,"pop":82142},"tres rios":{"cc":"BR","lat":-22.12,"lng":-43.21,"pop":82142},"tres pontas":{"cc":"BR","lat":-21.37,"lng":-45.51,"pop":56940},"trs pontas":{"cc":"BR","lat":-21.37,"lng":-45.51,"pop":56940},"tres lagoas":{"cc":"BR","lat":-20.79,"lng":-51.7,"pop":143523},"trs lagoas":{"cc":"BR","lat":-20.79,"lng":-51.7,"pop":143523},"trs coraes":{"cc":"BR","lat":-21.7,"lng":-45.25,"pop":80032},"tres coracoes":{"cc":"BR","lat":-21.7,"lng":-45.25,"pop":80032},"tramanda":{"cc":"BR","lat":-29.98,"lng":-50.13,"pop":52632},"tramandai":{"cc":"BR","lat":-29.98,"lng":-50.13,"pop":52632},"tobias barreto":{"cc":"BR","lat":-11.18,"lng":-38.0,"pop":50905},"timoteo":{"cc":"BR","lat":-19.58,"lng":-42.65,"pop":81579},"timteo":{"cc":"BR","lat":-19.58,"lng":-42.65,"pop":81579},"tijucas":{"cc":"BR","lat":-27.24,"lng":-48.63,"pop":51592},"terespolis":{"cc":"BR","lat":-22.42,"lng":-42.98,"pop":176735},"teresopolis":{"cc":"BR","lat":-22.42,"lng":-42.98,"pop":176735},"teofilo otoni":{"cc":"BR","lat":-17.86,"lng":-41.51,"pop":142851},"tefilo otoni":{"cc":"BR","lat":-17.86,"lng":-41.51,"pop":142851},"telmaco borba":{"cc":"BR","lat":-24.32,"lng":-50.62,"pop":79792},"telemaco borba":{"cc":"BR","lat":-24.32,"lng":-50.62,"pop":79792},"taubate":{"cc":"BR","lat":-23.03,"lng":-45.56,"pop":322397},"taubat":{"cc":"BR","lat":-23.03,"lng":-45.56,"pop":322397},"tatu":{"cc":"BR","lat":-23.36,"lng":-47.86,"pop":129130},"tatui":{"cc":"BR","lat":-23.36,"lng":-47.86,"pop":129130},"taquaritinga":{"cc":"BR","lat":-21.41,"lng":-48.5,"pop":57364},"taquara":{"cc":"BR","lat":-29.65,"lng":-50.78,"pop":57584},"taboao da serra":{"cc":"BR","lat":-23.63,"lng":-46.79,"pop":273542},"taboo da serra":{"cc":"BR","lat":-23.63,"lng":-46.79,"pop":273542},"suzano":{"cc":"BR","lat":-23.54,"lng":-46.31,"pop":320261},"sumar":{"cc":"BR","lat":-22.82,"lng":-47.27,"pop":279545},"sumare":{"cc":"BR","lat":-22.82,"lng":-47.27,"pop":279545},"sorocaba":{"cc":"BR","lat":-23.5,"lng":-47.46,"pop":762172},"sobradinho":{"cc":"BR","lat":-15.65,"lng":-47.79,"pop":72273},"sete lagoas":{"cc":"BR","lat":-19.47,"lng":-44.25,"pop":238909},"sertozinho":{"cc":"BR","lat":-21.14,"lng":-47.99,"pop":126887},"sertaozinho":{"cc":"BR","lat":-21.14,"lng":-47.99,"pop":126887},"serrinha":{"cc":"BR","lat":-11.66,"lng":-39.01,"pop":80435},"serra":{"cc":"BR","lat":-20.13,"lng":-40.31,"pop":520653},"seropedica":{"cc":"BR","lat":-22.74,"lng":-43.71,"pop":84737},"seropdica":{"cc":"BR","lat":-22.74,"lng":-43.71,"pop":84737},"senhor do bonfim":{"cc":"BR","lat":-10.46,"lng":-40.19,"pop":79424},"senador canedo":{"cc":"BR","lat":-16.71,"lng":-49.09,"pop":175042},"saquarema":{"cc":"BR","lat":-22.9,"lng":-42.47,"pop":90583},"sapucaia do sul":{"cc":"BR","lat":-29.82,"lng":-51.15,"pop":132107},"sapiranga":{"cc":"BR","lat":-29.64,"lng":-51.01,"pop":75613},"sao vicente":{"cc":"BR","lat":-23.96,"lng":-46.39,"pop":338326},"so vicente":{"cc":"BR","lat":-23.96,"lng":-46.39,"pop":338326},"sao sebastiao do paraiso":{"cc":"BR","lat":-20.92,"lng":-46.99,"pop":71796},"so sebastio do paraso":{"cc":"BR","lat":-20.92,"lng":-46.99,"pop":71796},"sao sebastiao":{"cc":"BR","lat":-15.9,"lng":-47.78,"pop":98612},"so sebastio":{"cc":"BR","lat":-15.9,"lng":-47.78,"pop":98612},"sao roque":{"cc":"BR","lat":-23.53,"lng":-47.14,"pop":79484},"so roque":{"cc":"BR","lat":-23.53,"lng":-47.14,"pop":79484},"so pedro da aldeia":{"cc":"BR","lat":-22.84,"lng":-42.1,"pop":110677},"sao pedro da aldeia":{"cc":"BR","lat":-22.84,"lng":-42.1,"pop":110677},"sao paulo":{"cc":"BR","lat":-23.55,"lng":-46.64,"pop":12400232},"so paulo":{"cc":"BR","lat":-23.55,"lng":-46.64,"pop":12400232},"sao miguel":{"cc":"BR","lat":-23.49,"lng":-46.43,"pop":81011},"so miguel":{"cc":"BR","lat":-23.49,"lng":-46.43,"pop":81011},"so mateus":{"cc":"BR","lat":-23.61,"lng":-46.48,"pop":155682},"sao mateus":{"cc":"BR","lat":-23.61,"lng":-46.48,"pop":155682},"so leopoldo":{"cc":"BR","lat":-29.76,"lng":-51.15,"pop":209229},"sao leopoldo":{"cc":"BR","lat":-29.76,"lng":-51.15,"pop":209229},"sao jose dos pinhais":{"cc":"BR","lat":-25.53,"lng":-49.21,"pop":349880},"so jos dos pinhais":{"cc":"BR","lat":-25.53,"lng":-49.21,"pop":349880},"sao jose dos campos":{"cc":"BR","lat":-23.18,"lng":-45.89,"pop":727078},"so jos dos campos":{"cc":"BR","lat":-23.18,"lng":-45.89,"pop":727078},"so jos do rio preto":{"cc":"BR","lat":-20.82,"lng":-49.38,"pop":480393},"sao jose do rio preto":{"cc":"BR","lat":-20.82,"lng":-49.38,"pop":480393},"sao jose do rio pardo":{"cc":"BR","lat":-21.6,"lng":-46.89,"pop":55124},"so jos do rio pardo":{"cc":"BR","lat":-21.6,"lng":-46.89,"pop":55124},"sao jose":{"cc":"BR","lat":-27.62,"lng":-48.63,"pop":295658},"so jos":{"cc":"BR","lat":-27.62,"lng":-48.63,"pop":295658},"sao joao de meriti":{"cc":"BR","lat":-22.8,"lng":-43.37,"pop":466536},"so joo de meriti":{"cc":"BR","lat":-22.8,"lng":-43.37,"pop":466536},"so joo del rei":{"cc":"BR","lat":-21.14,"lng":-44.26,"pop":94468},"sao joao del rei":{"cc":"BR","lat":-21.14,"lng":-44.26,"pop":94468},"so joo da boa vista":{"cc":"BR","lat":-21.97,"lng":-46.8,"pop":91771},"sao joao da boa vista":{"cc":"BR","lat":-21.97,"lng":-46.8,"pop":91771},"sao gabriel":{"cc":"BR","lat":-30.34,"lng":-54.32,"pop":58487},"so gabriel":{"cc":"BR","lat":-30.34,"lng":-54.32,"pop":58487},"so francisco do sul":{"cc":"BR","lat":-26.24,"lng":-48.64,"pop":52674},"sao francisco do sul":{"cc":"BR","lat":-26.24,"lng":-48.64,"pop":52674},"so francisco":{"cc":"BR","lat":-15.95,"lng":-44.86,"pop":56477},"sao francisco":{"cc":"BR","lat":-15.95,"lng":-44.86,"pop":56477},"sao cristovao":{"cc":"BR","lat":-11.01,"lng":-37.21,"pop":101213},"so cristvo":{"cc":"BR","lat":-11.01,"lng":-37.21,"pop":101213},"so carlos":{"cc":"BR","lat":-22.02,"lng":-47.89,"pop":266427},"sao carlos":{"cc":"BR","lat":-22.02,"lng":-47.89,"pop":266427},"so caetano do sul":{"cc":"BR","lat":-23.62,"lng":-46.55,"pop":172693},"sao caetano do sul":{"cc":"BR","lat":-23.62,"lng":-46.55,"pop":172693},"sao borja":{"cc":"BR","lat":-28.66,"lng":-56.0,"pop":60019},"so borja":{"cc":"BR","lat":-28.66,"lng":-56.0,"pop":60019},"sao bernardo do campo":{"cc":"BR","lat":-23.69,"lng":-46.56,"pop":840499},"so bernardo do campo":{"cc":"BR","lat":-23.69,"lng":-46.56,"pop":840499},"sao bento do sul":{"cc":"BR","lat":-26.25,"lng":-49.38,"pop":83277},"so bento do sul":{"cc":"BR","lat":-26.25,"lng":-49.38,"pop":83277},"santos":{"cc":"BR","lat":-23.96,"lng":-46.33,"pop":418608},"santo estvo":{"cc":"BR","lat":-12.43,"lng":-39.25,"pop":52276},"santo estevao":{"cc":"BR","lat":-12.43,"lng":-39.25,"pop":52276},"santo antonio de jesus":{"cc":"BR","lat":-12.97,"lng":-39.26,"pop":109791},"santo antnio de jesus":{"cc":"BR","lat":-12.97,"lng":-39.26,"pop":109791},"santo angelo":{"cc":"BR","lat":-28.3,"lng":-54.26,"pop":77568},"santo ngelo":{"cc":"BR","lat":-28.3,"lng":-54.26,"pop":77568},"santo andre":{"cc":"BR","lat":-23.66,"lng":-46.54,"pop":662373},"santo andr":{"cc":"BR","lat":-23.66,"lng":-46.54,"pop":662373},"santo amaro":{"cc":"BR","lat":-23.65,"lng":-46.7,"pop":85349},"santana do livramento":{"cc":"BR","lat":-30.89,"lng":-55.53,"pop":76321},"santana de parnaba":{"cc":"BR","lat":-23.44,"lng":-46.92,"pop":163787},"santana de parnaiba":{"cc":"BR","lat":-23.44,"lng":-46.92,"pop":163787},"santa luzia":{"cc":"BR","lat":-19.77,"lng":-43.85,"pop":219132},"santa isabel":{"cc":"BR","lat":-23.32,"lng":-46.22,"pop":53174},"santa cruz do sul":{"cc":"BR","lat":-29.72,"lng":-52.43,"pop":138270},"santa barbara doeste":{"cc":"BR","lat":-22.75,"lng":-47.41,"pop":189456},"santa brbara doeste":{"cc":"BR","lat":-22.75,"lng":-47.41,"pop":189456},"salvador":{"cc":"BR","lat":-12.98,"lng":-38.49,"pop":2711840},"sabar":{"cc":"BR","lat":-19.89,"lng":-43.81,"pop":129380},"sabara":{"cc":"BR","lat":-19.89,"lng":-43.81,"pop":129380},"rondonpolis":{"cc":"BR","lat":-16.47,"lng":-54.64,"pop":263708},"rondonopolis":{"cc":"BR","lat":-16.47,"lng":-54.64,"pop":263708},"rolndia":{"cc":"BR","lat":-23.31,"lng":-51.37,"pop":75818},"rolandia":{"cc":"BR","lat":-23.31,"lng":-51.37,"pop":75818},"rio verde":{"cc":"BR","lat":-17.8,"lng":-50.93,"pop":241494},"rio do sul":{"cc":"BR","lat":-27.21,"lng":-49.64,"pop":72006},"rio de janeiro":{"cc":"BR","lat":-22.91,"lng":-43.18,"pop":6747815},"rio das ostras":{"cc":"BR","lat":-22.53,"lng":-41.95,"pop":168099},"rio claro":{"cc":"BR","lat":-22.41,"lng":-47.56,"pop":201418},"rio bonito":{"cc":"BR","lat":-22.71,"lng":-42.61,"pop":59113},"ribeirao preto":{"cc":"BR","lat":-21.18,"lng":-47.81,"pop":698642},"ribeiro preto":{"cc":"BR","lat":-21.18,"lng":-47.81,"pop":698642},"ribeirao pires":{"cc":"BR","lat":-23.71,"lng":-46.41,"pop":115559},"ribeiro pires":{"cc":"BR","lat":-23.71,"lng":-46.41,"pop":115559},"ribeirao das neves":{"cc":"BR","lat":-19.77,"lng":-44.09,"pop":346971},"ribeiro das neves":{"cc":"BR","lat":-19.77,"lng":-44.09,"pop":346971},"ribeira do pombal":{"cc":"BR","lat":-10.83,"lng":-38.54,"pop":53956},"resende":{"cc":"BR","lat":-22.47,"lng":-44.45,"pop":137697},"registro":{"cc":"BR","lat":-24.49,"lng":-47.84,"pop":56393},"queimados":{"cc":"BR","lat":-22.72,"lng":-43.56,"pop":149093},"presidente prudente":{"cc":"BR","lat":-22.13,"lng":-51.39,"pop":234706},"praia grande":{"cc":"BR","lat":-24.01,"lng":-46.4,"pop":367400},"pouso alegre":{"cc":"BR","lat":-22.23,"lng":-45.94,"pop":162133},"porto seguro":{"cc":"BR","lat":-16.45,"lng":-39.06,"pop":182630},"porto nacional":{"cc":"BR","lat":-10.71,"lng":-48.42,"pop":53316},"porto ferreira":{"cc":"BR","lat":-21.85,"lng":-47.48,"pop":56504},"porto feliz":{"cc":"BR","lat":-23.21,"lng":-47.52,"pop":53402},"porto alegre":{"cc":"BR","lat":-30.03,"lng":-51.23,"pop":1488252},"ponte nova":{"cc":"BR","lat":-20.42,"lng":-42.91,"pop":57776},"ponta pora":{"cc":"BR","lat":-22.54,"lng":-55.73,"pop":98598},"ponta por":{"cc":"BR","lat":-22.54,"lng":-55.73,"pop":98598},"ponta grossa":{"cc":"BR","lat":-25.09,"lng":-50.16,"pop":292177},"pocos de caldas":{"cc":"BR","lat":-21.79,"lng":-46.56,"pop":172339},"poos de caldas":{"cc":"BR","lat":-21.79,"lng":-46.56,"pop":172339},"po":{"cc":"BR","lat":-23.53,"lng":-46.34,"pop":103765},"poa":{"cc":"BR","lat":-23.53,"lng":-46.34,"pop":103765},"planaltina":{"cc":"BR","lat":-15.62,"lng":-47.65,"pop":189412},"piraquara":{"cc":"BR","lat":-25.44,"lng":-49.07,"pop":118730},"pirapora":{"cc":"BR","lat":-17.34,"lng":-44.94,"pop":56640},"pirassununga":{"cc":"BR","lat":-22.0,"lng":-47.43,"pop":76877},"piracicaba":{"cc":"BR","lat":-22.73,"lng":-47.65,"pop":440835},"pinheiros":{"cc":"BR","lat":-23.57,"lng":-46.69,"pop":65145},"pindamonhangaba":{"cc":"BR","lat":-22.92,"lng":-45.46,"pop":172681},"piedade":{"cc":"BR","lat":-23.71,"lng":-47.43,"pop":55542},"petrpolis":{"cc":"BR","lat":-22.5,"lng":-43.18,"pop":294926},"perus":{"cc":"BR","lat":-23.4,"lng":-46.75,"pop":87823},"peruibe":{"cc":"BR","lat":-24.32,"lng":-47.0,"pop":68352},"perube":{"cc":"BR","lat":-24.32,"lng":-47.0,"pop":68352},"penedo":{"cc":"BR","lat":-10.29,"lng":-36.59,"pop":60189},"penpolis":{"cc":"BR","lat":-21.42,"lng":-50.08,"pop":61679},"penapolis":{"cc":"BR","lat":-21.42,"lng":-50.08,"pop":61679},"pelotas":{"cc":"BR","lat":-31.77,"lng":-52.34,"pop":336150},"pedro leopoldo":{"cc":"BR","lat":-19.62,"lng":-44.04,"pop":62580},"paulinia":{"cc":"BR","lat":-22.76,"lng":-47.15,"pop":110537},"paulnia":{"cc":"BR","lat":-22.76,"lng":-47.15,"pop":110537},"patrocinio":{"cc":"BR","lat":-18.94,"lng":-46.99,"pop":91449},"patrocnio":{"cc":"BR","lat":-18.94,"lng":-46.99,"pop":91449},"patos de minas":{"cc":"BR","lat":-18.58,"lng":-46.52,"pop":159235},"pato branco":{"cc":"BR","lat":-26.23,"lng":-52.67,"pop":84779},"passos":{"cc":"BR","lat":-20.72,"lng":-46.61,"pop":116951},"passo fundo":{"cc":"BR","lat":-28.26,"lng":-52.41,"pop":214811},"alvorada":{"cc":"BR","lat":-30.0,"lng":-51.08,"pop":187315},"parobe":{"cc":"BR","lat":-29.63,"lng":-50.83,"pop":52058},"parob":{"cc":"BR","lat":-29.63,"lng":-50.83,"pop":52058},"parelheiros":{"cc":"BR","lat":-23.83,"lng":-46.73,"pop":153695},"paranoa":{"cc":"BR","lat":-15.78,"lng":-47.78,"pop":63923},"parano":{"cc":"BR","lat":-15.78,"lng":-47.78,"pop":63923},"paranava":{"cc":"BR","lat":-23.07,"lng":-52.47,"pop":95525},"paranavai":{"cc":"BR","lat":-23.07,"lng":-52.47,"pop":95525},"paranagu":{"cc":"BR","lat":-25.52,"lng":-48.53,"pop":150104},"paranagua":{"cc":"BR","lat":-25.52,"lng":-48.53,"pop":150104},"para de minas":{"cc":"BR","lat":-19.86,"lng":-44.61,"pop":97139},"par de minas":{"cc":"BR","lat":-19.86,"lng":-44.61,"pop":97139},"paracatu":{"cc":"BR","lat":-17.22,"lng":-46.87,"pop":94023},"palmas":{"cc":"BR","lat":-10.17,"lng":-48.33,"pop":306296},"palhoa":{"cc":"BR","lat":-27.65,"lng":-48.67,"pop":222598},"palhoca":{"cc":"BR","lat":-27.65,"lng":-48.67,"pop":222598},"ouro preto":{"cc":"BR","lat":-20.39,"lng":-43.51,"pop":77914},"ourinhos":{"cc":"BR","lat":-22.98,"lng":-49.87,"pop":103970},"osasco":{"cc":"BR","lat":-23.53,"lng":-46.79,"pop":728615},"olmpia":{"cc":"BR","lat":-20.74,"lng":-48.91,"pop":55130},"olimpia":{"cc":"BR","lat":-20.74,"lng":-48.91,"pop":55130},"novo hamburgo":{"cc":"BR","lat":-29.68,"lng":-51.13,"pop":253841},"nova serrana":{"cc":"BR","lat":-19.88,"lng":-44.98,"pop":114791},"nova odessa":{"cc":"BR","lat":-22.78,"lng":-47.3,"pop":62019},"nova lima":{"cc":"BR","lat":-19.99,"lng":-43.85,"pop":120959},"nova iguacu":{"cc":"BR","lat":-22.76,"lng":-43.45,"pop":843046},"nova iguau":{"cc":"BR","lat":-22.76,"lng":-43.45,"pop":843046},"nova friburgo":{"cc":"BR","lat":-22.28,"lng":-42.53,"pop":189939},"nossa senhora do socorro":{"cc":"BR","lat":-10.86,"lng":-37.13,"pop":204081},"freguesia do o":{"cc":"BR","lat":-23.5,"lng":-46.7,"pop":137240},"freguesia do":{"cc":"BR","lat":-23.5,"lng":-46.7,"pop":137240},"niteroi":{"cc":"BR","lat":-22.88,"lng":-43.1,"pop":515317},"niteri":{"cc":"BR","lat":-22.88,"lng":-43.1,"pop":515317},"nilopolis":{"cc":"BR","lat":-22.81,"lng":-43.41,"pop":155500},"nilpolis":{"cc":"BR","lat":-22.81,"lng":-43.41,"pop":155500},"navirai":{"cc":"BR","lat":-23.07,"lng":-54.19,"pop":55689},"navira":{"cc":"BR","lat":-23.07,"lng":-54.19,"pop":55689},"muria":{"cc":"BR","lat":-21.13,"lng":-42.37,"pop":108447},"muriae":{"cc":"BR","lat":-21.13,"lng":-42.37,"pop":108447},"morrinhos":{"cc":"BR","lat":-17.73,"lng":-49.1,"pop":51351},"montes claros":{"cc":"BR","lat":-16.73,"lng":-43.86,"pop":437601},"montenegro":{"cc":"BR","lat":-29.69,"lng":-51.46,"pop":64322},"monte mor":{"cc":"BR","lat":-22.95,"lng":-47.32,"pop":60754},"monte alto":{"cc":"BR","lat":-21.26,"lng":-48.5,"pop":50772},"mongagu":{"cc":"BR","lat":-24.09,"lng":-46.62,"pop":57648},"mongagua":{"cc":"BR","lat":-24.09,"lng":-46.62,"pop":57648},"mogi mirim":{"cc":"BR","lat":-22.43,"lng":-46.96,"pop":93650},"mogi guacu":{"cc":"BR","lat":-22.37,"lng":-46.95,"pop":160318},"mogi guau":{"cc":"BR","lat":-22.37,"lng":-46.95,"pop":160318},"mogi das cruzes":{"cc":"BR","lat":-23.52,"lng":-46.19,"pop":325746},"mococa":{"cc":"BR","lat":-21.47,"lng":-47.0,"pop":67681},"mirassol":{"cc":"BR","lat":-20.82,"lng":-49.52,"pop":60303},"mineiros":{"cc":"BR","lat":-17.57,"lng":-52.55,"pop":70081},"maua":{"cc":"BR","lat":-23.67,"lng":-46.46,"pop":418261},"matao":{"cc":"BR","lat":-21.6,"lng":-48.37,"pop":79033},"mato":{"cc":"BR","lat":-21.6,"lng":-48.37,"pop":79033},"maringa":{"cc":"BR","lat":-23.43,"lng":-51.94,"pop":409657},"maring":{"cc":"BR","lat":-23.43,"lng":-51.94,"pop":409657},"marilia":{"cc":"BR","lat":-22.21,"lng":-49.95,"pop":237627},"marlia":{"cc":"BR","lat":-22.21,"lng":-49.95,"pop":237627},"marica":{"cc":"BR","lat":-22.92,"lng":-42.82,"pop":211986},"maric":{"cc":"BR","lat":-22.92,"lng":-42.82,"pop":211986},"mariana":{"cc":"BR","lat":-20.38,"lng":-43.42,"pop":61387},"marechal candido rondon":{"cc":"BR","lat":-24.56,"lng":-54.06,"pop":53495},"marechal cndido rondon":{"cc":"BR","lat":-24.56,"lng":-54.06,"pop":53495},"manhuacu":{"cc":"BR","lat":-20.26,"lng":-42.03,"pop":91886},"manhuau":{"cc":"BR","lat":-20.26,"lng":-42.03,"pop":91886},"mairipor":{"cc":"BR","lat":-23.32,"lng":-46.59,"pop":101937},"mairipora":{"cc":"BR","lat":-23.32,"lng":-46.59,"pop":101937},"mage":{"cc":"BR","lat":-22.65,"lng":-43.04,"pop":244142},"mag":{"cc":"BR","lat":-22.65,"lng":-43.04,"pop":244142},"mafra":{"cc":"BR","lat":-26.11,"lng":-49.81,"pop":56561},"macabas":{"cc":"BR","lat":-13.02,"lng":-42.7,"pop":50161},"macaubas":{"cc":"BR","lat":-13.02,"lng":-42.7,"pop":50161},"macae":{"cc":"BR","lat":-22.38,"lng":-41.78,"pop":264439},"maca":{"cc":"BR","lat":-22.38,"lng":-41.78,"pop":264439},"luziania":{"cc":"BR","lat":-16.25,"lng":-47.95,"pop":221262},"luzinia":{"cc":"BR","lat":-16.25,"lng":-47.95,"pop":221262},"louveira":{"cc":"BR","lat":-23.09,"lng":-46.95,"pop":51847},"lorena":{"cc":"BR","lat":-22.73,"lng":-45.12,"pop":89125},"londrina":{"cc":"BR","lat":-23.31,"lng":-51.16,"pop":581382},"lins":{"cc":"BR","lat":-21.68,"lng":-49.74,"pop":78503},"linhares":{"cc":"BR","lat":-19.39,"lng":-40.07,"pop":183797},"limeira":{"cc":"BR","lat":-22.56,"lng":-47.4,"pop":291869},"liberdade":{"cc":"BR","lat":-23.56,"lng":-46.63,"pop":66056},"leopoldina":{"cc":"BR","lat":-21.53,"lng":-42.64,"pop":51145},"lenis paulista":{"cc":"BR","lat":-22.6,"lng":-48.8,"pop":68990},"lencois paulista":{"cc":"BR","lat":-22.6,"lng":-48.8,"pop":68990},"leme":{"cc":"BR","lat":-22.19,"lng":-47.39,"pop":101537},"lavras":{"cc":"BR","lat":-21.25,"lng":-45.0,"pop":110682},"lapa":{"cc":"BR","lat":-23.52,"lng":-46.71,"pop":75533},"lages":{"cc":"BR","lat":-27.82,"lng":-50.33,"pop":172458},"lajeado":{"cc":"BR","lat":-23.53,"lng":-46.41,"pop":164391},"lagoa santa":{"cc":"BR","lat":-19.63,"lng":-43.9,"pop":81299},"lagoa da prata":{"cc":"BR","lat":-20.02,"lng":-45.54,"pop":53927},"lagarto":{"cc":"BR","lat":-10.92,"lng":-37.65,"pop":101579},"jundia":{"cc":"BR","lat":-23.19,"lng":-46.88,"pop":443221},"jundiai":{"cc":"BR","lat":-23.19,"lng":-46.88,"pop":443221},"juiz de fora":{"cc":"BR","lat":-21.76,"lng":-43.35,"pop":540756},"joinville":{"cc":"BR","lat":-26.3,"lng":-48.85,"pop":664500},"joao monlevade":{"cc":"BR","lat":-19.81,"lng":-43.17,"pop":83360},"joo monlevade":{"cc":"BR","lat":-19.81,"lng":-43.17,"pop":83360},"jequie":{"cc":"BR","lat":-13.86,"lng":-40.09,"pop":127475},"jequi":{"cc":"BR","lat":-13.86,"lng":-40.09,"pop":127475},"jau":{"cc":"BR","lat":-22.3,"lng":-48.56,"pop":133497},"ja":{"cc":"BR","lat":-22.3,"lng":-48.56,"pop":133497},"jata":{"cc":"BR","lat":-17.88,"lng":-51.72,"pop":105729},"jatai":{"cc":"BR","lat":-17.88,"lng":-51.72,"pop":105729},"jaragu do sul":{"cc":"BR","lat":-26.49,"lng":-49.07,"pop":199519},"jaragua do sul":{"cc":"BR","lat":-26.49,"lng":-49.07,"pop":199519},"jaragu":{"cc":"BR","lat":-23.44,"lng":-46.74,"pop":211610},"jaragua":{"cc":"BR","lat":-23.44,"lng":-46.74,"pop":211610},"japeri":{"cc":"BR","lat":-22.64,"lng":-43.65,"pop":102171},"januaria":{"cc":"BR","lat":-15.48,"lng":-44.37,"pop":65150},"januria":{"cc":"BR","lat":-15.48,"lng":-44.37,"pop":65150},"jandira":{"cc":"BR","lat":-23.53,"lng":-46.9,"pop":118045},"janauba":{"cc":"BR","lat":-15.8,"lng":-43.31,"pop":70699},"janaba":{"cc":"BR","lat":-15.8,"lng":-43.31,"pop":70699},"jaguarina":{"cc":"BR","lat":-22.71,"lng":-46.99,"pop":58722},"jaguariuna":{"cc":"BR","lat":-22.71,"lng":-46.99,"pop":58722},"jaguaquara":{"cc":"BR","lat":-13.53,"lng":-39.97,"pop":54673},"jacobina":{"cc":"BR","lat":-11.18,"lng":-40.51,"pop":82590},"jacarei":{"cc":"BR","lat":-23.31,"lng":-45.97,"pop":250952},"jacare":{"cc":"BR","lat":-23.31,"lng":-45.97,"pop":250952},"jaboticabal":{"cc":"BR","lat":-21.25,"lng":-48.32,"pop":77652},"itumbiara":{"cc":"BR","lat":-18.42,"lng":-49.22,"pop":113322},"ituiutaba":{"cc":"BR","lat":-18.97,"lng":-49.46,"pop":106775},"itu":{"cc":"BR","lat":-23.26,"lng":-47.3,"pop":175047},"itauna":{"cc":"BR","lat":-20.08,"lng":-44.58,"pop":97669},"itana":{"cc":"BR","lat":-20.08,"lng":-44.58,"pop":97669},"itatiba":{"cc":"BR","lat":-23.01,"lng":-46.84,"pop":122581},"itaquera":{"cc":"BR","lat":-23.53,"lng":-46.44,"pop":210960},"itaquaquecetuba":{"cc":"BR","lat":-23.49,"lng":-46.35,"pop":369275},"itapira":{"cc":"BR","lat":-22.44,"lng":-46.82,"pop":72022},"itapevi":{"cc":"BR","lat":-23.55,"lng":-46.93,"pop":240961},"itapeva":{"cc":"BR","lat":-23.98,"lng":-48.88,"pop":89728},"itapetininga":{"cc":"BR","lat":-23.59,"lng":-48.05,"pop":164256},"itapetinga":{"cc":"BR","lat":-15.25,"lng":-40.25,"pop":76795},"itaperuna":{"cc":"BR","lat":-21.2,"lng":-41.89,"pop":107246},"itapema":{"cc":"BR","lat":-27.09,"lng":-48.61,"pop":75940},"itapecerica da serra":{"cc":"BR","lat":-23.72,"lng":-46.85,"pop":163003},"itanhaem":{"cc":"BR","lat":-24.18,"lng":-46.79,"pop":112476},"itanham":{"cc":"BR","lat":-24.18,"lng":-46.79,"pop":112476},"itamaraju":{"cc":"BR","lat":-17.04,"lng":-39.53,"pop":64455},"itajub":{"cc":"BR","lat":-22.43,"lng":-45.45,"pop":93073},"itajuba":{"cc":"BR","lat":-22.43,"lng":-45.45,"pop":93073},"itajai":{"cc":"BR","lat":-26.91,"lng":-48.66,"pop":294850},"itaja":{"cc":"BR","lat":-26.91,"lng":-48.66,"pop":294850},"itaguai":{"cc":"BR","lat":-22.85,"lng":-43.78,"pop":123980},"itagua":{"cc":"BR","lat":-22.85,"lng":-43.78,"pop":123980},"itabuna":{"cc":"BR","lat":-14.79,"lng":-39.28,"pop":196344},"itaborai":{"cc":"BR","lat":-22.74,"lng":-42.86,"pop":240040},"itabora":{"cc":"BR","lat":-22.74,"lng":-42.86,"pop":240040},"itabirito":{"cc":"BR","lat":-20.25,"lng":-43.8,"pop":53365},"itabira":{"cc":"BR","lat":-19.62,"lng":-43.23,"pop":118053},"itaberaba":{"cc":"BR","lat":-12.53,"lng":-40.31,"pop":64646},"itabaiana":{"cc":"BR","lat":-10.69,"lng":-37.43,"pop":103440},"irece":{"cc":"BR","lat":-11.3,"lng":-41.86,"pop":74507},"irec":{"cc":"BR","lat":-11.3,"lng":-41.86,"pop":74507},"irati":{"cc":"BR","lat":-25.47,"lng":-50.65,"pop":59250},"ipiranga":{"cc":"BR","lat":-23.6,"lng":-46.62,"pop":116271},"ipir":{"cc":"BR","lat":-12.16,"lng":-39.74,"pop":59435},"ipira":{"cc":"BR","lat":-12.16,"lng":-39.74,"pop":59435},"ipatinga":{"cc":"BR","lat":-19.47,"lng":-42.54,"pop":235311},"inhumas":{"cc":"BR","lat":-16.36,"lng":-49.5,"pop":52204},"indaiatuba":{"cc":"BR","lat":-23.09,"lng":-47.21,"pop":256223},"indaial":{"cc":"BR","lat":-26.9,"lng":-49.23,"pop":70900},"imbituba":{"cc":"BR","lat":-28.24,"lng":-48.67,"pop":52579},"ilhus":{"cc":"BR","lat":-14.8,"lng":-39.03,"pop":189149},"ilheus":{"cc":"BR","lat":-14.8,"lng":-39.03,"pop":189149},"iju":{"cc":"BR","lat":-28.39,"lng":-53.91,"pop":84780},"ijui":{"cc":"BR","lat":-28.39,"lng":-53.91,"pop":84780},"iara":{"cc":"BR","lat":-28.71,"lng":-49.3,"pop":57247},"icara":{"cc":"BR","lat":-28.71,"lng":-49.3,"pop":57247},"ibiuna":{"cc":"BR","lat":-23.66,"lng":-47.22,"pop":75605},"ibina":{"cc":"BR","lat":-23.66,"lng":-47.22,"pop":75605},"ibitinga":{"cc":"BR","lat":-21.76,"lng":-48.83,"pop":60600},"ibirit":{"cc":"BR","lat":-20.02,"lng":-44.06,"pop":179582},"ibirite":{"cc":"BR","lat":-20.02,"lng":-44.06,"pop":179582},"ibipor":{"cc":"BR","lat":-23.27,"lng":-51.05,"pop":51603},"ibipora":{"cc":"BR","lat":-23.27,"lng":-51.05,"pop":51603},"hortolndia":{"cc":"BR","lat":-22.86,"lng":-47.22,"pop":236641},"hortolandia":{"cc":"BR","lat":-22.86,"lng":-47.22,"pop":236641},"gurupi":{"cc":"BR","lat":-11.73,"lng":-49.07,"pop":87545},"guaxup":{"cc":"BR","lat":-21.31,"lng":-46.71,"pop":52078},"guaxupe":{"cc":"BR","lat":-21.31,"lng":-46.71,"pop":52078},"guarulhos":{"cc":"BR","lat":-23.46,"lng":-46.53,"pop":1345364},"guaruja":{"cc":"BR","lat":-23.99,"lng":-46.26,"pop":294871},"guaruj":{"cc":"BR","lat":-23.99,"lng":-46.26,"pop":294871},"guaratinguet":{"cc":"BR","lat":-22.82,"lng":-45.19,"pop":118044},"guaratingueta":{"cc":"BR","lat":-22.82,"lng":-45.19,"pop":118044},"guarapuava":{"cc":"BR","lat":-25.39,"lng":-51.47,"pop":189630},"guarapari":{"cc":"BR","lat":-20.67,"lng":-40.5,"pop":136311},"guar":{"cc":"BR","lat":-15.81,"lng":-47.97,"pop":125703},"guara":{"cc":"BR","lat":-15.81,"lng":-47.97,"pop":125703},"guapimirim":{"cc":"BR","lat":-22.54,"lng":-42.98,"pop":54300},"guanambi":{"cc":"BR","lat":-14.22,"lng":-42.78,"pop":84928},"guaianases":{"cc":"BR","lat":-23.54,"lng":-46.41,"pop":109316},"gravatai":{"cc":"BR","lat":-29.94,"lng":-50.99,"pop":265074},"governador valadares":{"cc":"BR","lat":-18.85,"lng":-41.95,"pop":266561},"goiania":{"cc":"BR","lat":-16.68,"lng":-49.25,"pop":1536097},"goinia":{"cc":"BR","lat":-16.68,"lng":-49.25,"pop":1536097},"goianesia":{"cc":"BR","lat":-15.32,"lng":-49.12,"pop":73707},"goiansia":{"cc":"BR","lat":-15.32,"lng":-49.12,"pop":73707},"gaspar":{"cc":"BR","lat":-26.93,"lng":-48.96,"pop":73053},"frutal":{"cc":"BR","lat":-20.02,"lng":-48.94,"pop":58588},"franco da rocha":{"cc":"BR","lat":-23.32,"lng":-46.73,"pop":144849},"francisco morato":{"cc":"BR","lat":-23.28,"lng":-46.75,"pop":165139},"lucas do rio verde":{"cc":"BR","lat":-13.07,"lng":-55.91,"pop":92256},"francisco beltrao":{"cc":"BR","lat":-26.08,"lng":-53.05,"pop":102312},"francisco beltro":{"cc":"BR","lat":-26.08,"lng":-53.05,"pop":102312},"franca":{"cc":"BR","lat":-20.54,"lng":-47.4,"pop":365494},"foz do iguau":{"cc":"BR","lat":-25.55,"lng":-54.59,"pop":297352},"foz do iguacu":{"cc":"BR","lat":-25.55,"lng":-54.59,"pop":297352},"formiga":{"cc":"BR","lat":-20.46,"lng":-45.43,"pop":68248},"florianopolis":{"cc":"BR","lat":-27.6,"lng":-48.55,"pop":508826},"florianpolis":{"cc":"BR","lat":-27.6,"lng":-48.55,"pop":508826},"ferraz de vasconcelos":{"cc":"BR","lat":-23.54,"lng":-46.37,"pop":179198},"fernandopolis":{"cc":"BR","lat":-20.28,"lng":-50.25,"pop":71186},"fernandpolis":{"cc":"BR","lat":-20.28,"lng":-50.25,"pop":71186},"feira de santana":{"cc":"BR","lat":-12.27,"lng":-38.97,"pop":616272},"farroupilha":{"cc":"BR","lat":-29.23,"lng":-51.35,"pop":70286},"extrema":{"cc":"BR","lat":-22.85,"lng":-46.32,"pop":53482},"eunapolis":{"cc":"BR","lat":-16.38,"lng":-39.58,"pop":121067},"eunpolis":{"cc":"BR","lat":-16.38,"lng":-39.58,"pop":121067},"euclides da cunha":{"cc":"BR","lat":-10.51,"lng":-39.02,"pop":61456},"esteio":{"cc":"BR","lat":-29.86,"lng":-51.18,"pop":76137},"estancia velha":{"cc":"BR","lat":-29.65,"lng":-51.17,"pop":50672},"estncia velha":{"cc":"BR","lat":-29.65,"lng":-51.17,"pop":50672},"estncia":{"cc":"BR","lat":-11.27,"lng":-37.44,"pop":65078},"erechim":{"cc":"BR","lat":-27.63,"lng":-52.28,"pop":96087},"embu-guau":{"cc":"BR","lat":-23.83,"lng":-46.81,"pop":66970},"embu-guacu":{"cc":"BR","lat":-23.83,"lng":-46.81,"pop":66970},"embu das artes":{"cc":"BR","lat":-23.65,"lng":-46.85,"pop":259788},"duque de caxias":{"cc":"BR","lat":-22.79,"lng":-43.31,"pop":866347},"dourados":{"cc":"BR","lat":-22.22,"lng":-54.81,"pop":264017},"divinopolis":{"cc":"BR","lat":-20.14,"lng":-44.89,"pop":231091},"divinpolis":{"cc":"BR","lat":-20.14,"lng":-44.89,"pop":231091},"dias dvila":{"cc":"BR","lat":-12.61,"lng":-38.3,"pop":71485},"dias davila":{"cc":"BR","lat":-12.61,"lng":-38.3,"pop":71485},"diadema":{"cc":"BR","lat":-23.69,"lng":-46.62,"pop":403579},"curvelo":{"cc":"BR","lat":-18.76,"lng":-44.43,"pop":80665},"curitiba":{"cc":"BR","lat":-25.43,"lng":-49.27,"pop":1948626},"cuiab":{"cc":"BR","lat":-15.6,"lng":-56.1,"pop":618124},"cuiaba":{"cc":"BR","lat":-15.6,"lng":-56.1,"pop":618124},"cubato":{"cc":"BR","lat":-23.89,"lng":-46.43,"pop":114870},"cubatao":{"cc":"BR","lat":-23.89,"lng":-46.43,"pop":114870},"cruzeiro":{"cc":"BR","lat":-22.57,"lng":-44.97,"pop":82571},"cruz das almas":{"cc":"BR","lat":-12.67,"lng":-39.1,"pop":60348},"cruz alta":{"cc":"BR","lat":-28.64,"lng":-53.61,"pop":58913},"cristalina":{"cc":"BR","lat":-16.77,"lng":-47.62,"pop":60210},"criciuma":{"cc":"BR","lat":-28.68,"lng":-49.37,"pop":227438},"cricima":{"cc":"BR","lat":-28.68,"lng":-49.37,"pop":227438},"cotia":{"cc":"BR","lat":-23.6,"lng":-46.92,"pop":253608},"cosmpolis":{"cc":"BR","lat":-22.65,"lng":-47.2,"pop":73474},"cosmopolis":{"cc":"BR","lat":-22.65,"lng":-47.2,"pop":73474},"coruripe":{"cc":"BR","lat":-10.13,"lng":-36.18,"pop":57294},"corumba":{"cc":"BR","lat":-19.01,"lng":-57.65,"pop":98751},"corumb":{"cc":"BR","lat":-19.01,"lng":-57.65,"pop":98751},"coronel fabriciano":{"cc":"BR","lat":-19.52,"lng":-42.63,"pop":108708},"contagem":{"cc":"BR","lat":-19.93,"lng":-44.05,"pop":627123},"conselheiro lafaiete":{"cc":"BR","lat":-20.66,"lng":-43.79,"pop":138946},"congonhas":{"cc":"BR","lat":-20.51,"lng":-43.86,"pop":52890},"concrdia":{"cc":"BR","lat":-27.23,"lng":-52.03,"pop":75167},"conceio do coit":{"cc":"BR","lat":-11.56,"lng":-39.28,"pop":67825},"conceicao do coite":{"cc":"BR","lat":-11.56,"lng":-39.28,"pop":67825},"colatina":{"cc":"BR","lat":-19.54,"lng":-40.63,"pop":129301},"cianorte":{"cc":"BR","lat":-23.66,"lng":-52.6,"pop":83816},"chapec":{"cc":"BR","lat":-27.1,"lng":-52.62,"pop":282648},"chapeco":{"cc":"BR","lat":-27.1,"lng":-52.62,"pop":282648},"ceilandia":{"cc":"BR","lat":-15.81,"lng":-48.13,"pop":287023},"ceilndia":{"cc":"BR","lat":-15.81,"lng":-48.13,"pop":287023},"caxias do sul":{"cc":"BR","lat":-29.17,"lng":-51.18,"pop":479599},"catanduva":{"cc":"BR","lat":-21.14,"lng":-48.97,"pop":119275},"catalo":{"cc":"BR","lat":-18.17,"lng":-47.95,"pop":114427},"catalao":{"cc":"BR","lat":-18.17,"lng":-47.95,"pop":114427},"cataguases":{"cc":"BR","lat":-21.39,"lng":-42.7,"pop":66261},"castro":{"cc":"BR","lat":-24.79,"lng":-50.01,"pop":71809},"cariacica":{"cc":"BR","lat":-20.26,"lng":-40.42,"pop":376200},"carazinho":{"cc":"BR","lat":-28.28,"lng":-52.79,"pop":62265},"caratinga":{"cc":"BR","lat":-19.79,"lng":-42.14,"pop":90687},"carapicuiba":{"cc":"BR","lat":-23.52,"lng":-46.84,"pop":386984},"carapicuba":{"cc":"BR","lat":-23.52,"lng":-46.84,"pop":386984},"caraguatatuba":{"cc":"BR","lat":-23.62,"lng":-45.41,"pop":123389},"capivari":{"cc":"BR","lat":-23.0,"lng":-47.51,"pop":50068},"capo da canoa":{"cc":"BR","lat":-29.75,"lng":-50.01,"pop":63594},"capao da canoa":{"cc":"BR","lat":-29.75,"lng":-50.01,"pop":63594},"canoinhas":{"cc":"BR","lat":-26.18,"lng":-50.39,"pop":55016},"canoas":{"cc":"BR","lat":-29.92,"lng":-51.18,"pop":328291},"cangucu":{"cc":"BR","lat":-31.39,"lng":-52.68,"pop":56370},"canguu":{"cc":"BR","lat":-31.39,"lng":-52.68,"pop":56370},"candeias":{"cc":"BR","lat":-12.67,"lng":-38.55,"pop":72382},"campos do jordo":{"cc":"BR","lat":-22.74,"lng":-45.59,"pop":52405},"campos do jordao":{"cc":"BR","lat":-22.74,"lng":-45.59,"pop":52405},"campos dos goytacazes":{"cc":"BR","lat":-21.75,"lng":-41.33,"pop":483540},"campo mourao":{"cc":"BR","lat":-24.04,"lng":-52.38,"pop":104122},"campo mouro":{"cc":"BR","lat":-24.04,"lng":-52.38,"pop":104122},"campo limpo":{"cc":"BR","lat":-23.64,"lng":-46.77,"pop":236162},"campo limpo paulista":{"cc":"BR","lat":-23.21,"lng":-46.78,"pop":77632},"campo largo":{"cc":"BR","lat":-25.46,"lng":-49.53,"pop":144504},"campo grande":{"cc":"BR","lat":-20.44,"lng":-54.65,"pop":906092},"campo formoso":{"cc":"BR","lat":-10.51,"lng":-40.32,"pop":71487},"campo bom":{"cc":"BR","lat":-29.68,"lng":-51.05,"pop":62886},"campo belo":{"cc":"BR","lat":-23.63,"lng":-46.67,"pop":71058},"campinas":{"cc":"BR","lat":-22.91,"lng":-47.06,"pop":1031554},"cambori":{"cc":"BR","lat":-27.03,"lng":-48.65,"pop":117324},"camboriu":{"cc":"BR","lat":-27.03,"lng":-48.65,"pop":117324},"cambe":{"cc":"BR","lat":-23.28,"lng":-51.28,"pop":110923},"camb":{"cc":"BR","lat":-23.28,"lng":-51.28,"pop":110923},"camaqua":{"cc":"BR","lat":-30.85,"lng":-51.81,"pop":66478},"camaqu":{"cc":"BR","lat":-30.85,"lng":-51.81,"pop":66478},"camaari":{"cc":"BR","lat":-12.7,"lng":-38.32,"pop":321636},"camacari":{"cc":"BR","lat":-12.7,"lng":-38.32,"pop":321636},"caldas novas":{"cc":"BR","lat":-17.74,"lng":-48.63,"pop":98622},"cajamar":{"cc":"BR","lat":-23.36,"lng":-46.88,"pop":92689},"caieiras":{"cc":"BR","lat":-23.36,"lng":-46.74,"pop":102775},"caetite":{"cc":"BR","lat":-14.07,"lng":-42.48,"pop":52012},"caetit":{"cc":"BR","lat":-14.07,"lng":-42.48,"pop":52012},"cachoeiro de itapemirim":{"cc":"BR","lat":-20.85,"lng":-41.11,"pop":198342},"cachoeirinha":{"cc":"BR","lat":-23.45,"lng":-46.66,"pop":143366},"cachoeiras de macacu":{"cc":"BR","lat":-22.46,"lng":-42.65,"pop":59303},"cachoeira do sul":{"cc":"BR","lat":-30.04,"lng":-52.89,"pop":80070},"cacapava":{"cc":"BR","lat":-23.1,"lng":-45.71,"pop":100071},"caapava":{"cc":"BR","lat":-23.1,"lng":-45.71,"pop":100071},"caador":{"cc":"BR","lat":-26.78,"lng":-51.02,"pop":79313},"cacador":{"cc":"BR","lat":-26.78,"lng":-51.02,"pop":79313},"cabo frio":{"cc":"BR","lat":-22.89,"lng":-42.03,"pop":238438},"brusque":{"cc":"BR","lat":-27.1,"lng":-48.91,"pop":155307},"brumado":{"cc":"BR","lat":-14.2,"lng":-41.67,"pop":70268},"brazlndia":{"cc":"BR","lat":-15.68,"lng":-48.2,"pop":55561},"brazlandia":{"cc":"BR","lat":-15.68,"lng":-48.2,"pop":55561},"brasilia":{"cc":"BR","lat":-15.78,"lng":-47.93,"pop":2207718},"braslia":{"cc":"BR","lat":-15.78,"lng":-47.93,"pop":2207718},"bragana paulista":{"cc":"BR","lat":-22.95,"lng":-46.54,"pop":176811},"braganca paulista":{"cc":"BR","lat":-22.95,"lng":-46.54,"pop":176811},"botucatu":{"cc":"BR","lat":-22.89,"lng":-48.45,"pop":145155},"bom jesus da lapa":{"cc":"BR","lat":-13.26,"lng":-43.42,"pop":65550},"bom despacho":{"cc":"BR","lat":-19.74,"lng":-45.25,"pop":54377},"boituva":{"cc":"BR","lat":-23.28,"lng":-47.67,"pop":62170},"blumenau":{"cc":"BR","lat":-26.92,"lng":-49.07,"pop":361261},"birigui":{"cc":"BR","lat":-21.29,"lng":-50.34,"pop":123340},"biguau":{"cc":"BR","lat":-27.49,"lng":-48.66,"pop":69486},"biguacu":{"cc":"BR","lat":-27.49,"lng":-48.66,"pop":69486},"betim":{"cc":"BR","lat":-19.97,"lng":-44.2,"pop":384000},"bertioga":{"cc":"BR","lat":-23.85,"lng":-46.14,"pop":64723},"bento goncalves":{"cc":"BR","lat":-29.17,"lng":-51.52,"pop":127977},"bento gonalves":{"cc":"BR","lat":-29.17,"lng":-51.52,"pop":127977},"belo horizonte":{"cc":"BR","lat":-19.92,"lng":-43.94,"pop":2721564},"belford roxo":{"cc":"BR","lat":-22.76,"lng":-43.4,"pop":518384},"bebedouro":{"cc":"BR","lat":-20.95,"lng":-48.48,"pop":76373},"bauru":{"cc":"BR","lat":-22.31,"lng":-49.06,"pop":392947},"batatais":{"cc":"BR","lat":-20.89,"lng":-47.59,"pop":58402},"barueri":{"cc":"BR","lat":-23.51,"lng":-46.88,"pop":316473},"barretos":{"cc":"BR","lat":-20.56,"lng":-48.57,"pop":126957},"barreiras":{"cc":"BR","lat":-12.15,"lng":-44.99,"pop":171634},"barra mansa":{"cc":"BR","lat":-22.54,"lng":-44.17,"pop":181679},"barra do pirai":{"cc":"BR","lat":-22.47,"lng":-43.83,"pop":100764},"barra do pira":{"cc":"BR","lat":-22.47,"lng":-43.83,"pop":100764},"barra do garas":{"cc":"BR","lat":-15.89,"lng":-52.26,"pop":61135},"barra do garcas":{"cc":"BR","lat":-15.89,"lng":-52.26,"pop":61135},"barra":{"cc":"BR","lat":-11.09,"lng":-43.14,"pop":53910},"barbacena":{"cc":"BR","lat":-21.23,"lng":-43.77,"pop":125317},"balnerio cambori":{"cc":"BR","lat":-26.99,"lng":-48.63,"pop":139155},"balneario camboriu":{"cc":"BR","lat":-26.99,"lng":-48.63,"pop":139155},"bage":{"cc":"BR","lat":-31.33,"lng":-54.11,"pop":121335},"bag":{"cc":"BR","lat":-31.33,"lng":-54.11,"pop":121335},"avare":{"cc":"BR","lat":-23.1,"lng":-48.93,"pop":92805},"avar":{"cc":"BR","lat":-23.1,"lng":-48.93,"pop":92805},"atibaia":{"cc":"BR","lat":-23.12,"lng":-46.55,"pop":158647},"assis":{"cc":"BR","lat":-22.66,"lng":-50.41,"pop":104858},"aruja":{"cc":"BR","lat":-23.4,"lng":-46.32,"pop":91157},"aruj":{"cc":"BR","lat":-23.4,"lng":-46.32,"pop":91157},"artur nogueira":{"cc":"BR","lat":-22.57,"lng":-47.17,"pop":55340},"araxa":{"cc":"BR","lat":-19.59,"lng":-46.94,"pop":118786},"arax":{"cc":"BR","lat":-19.59,"lng":-46.94,"pop":118786},"araucaria":{"cc":"BR","lat":-25.59,"lng":-49.41,"pop":162247},"araucria":{"cc":"BR","lat":-25.59,"lng":-49.41,"pop":162247},"araruama":{"cc":"BR","lat":-22.87,"lng":-42.34,"pop":137906},"araras":{"cc":"BR","lat":-22.36,"lng":-47.38,"pop":135744},"araraquara":{"cc":"BR","lat":-21.79,"lng":-48.18,"pop":168468},"ararangu":{"cc":"BR","lat":-28.94,"lng":-49.5,"pop":71922},"ararangua":{"cc":"BR","lat":-28.94,"lng":-49.5,"pop":71922},"arapongas":{"cc":"BR","lat":-23.42,"lng":-51.42,"pop":124838},"araguari":{"cc":"BR","lat":-18.65,"lng":-48.19,"pop":117808},"aracruz":{"cc":"BR","lat":-19.82,"lng":-40.27,"pop":94765},"araatuba":{"cc":"BR","lat":-21.21,"lng":-50.43,"pop":208415},"aracatuba":{"cc":"BR","lat":-21.21,"lng":-50.43,"pop":208415},"aracaju":{"cc":"BR","lat":-10.91,"lng":-37.07,"pop":664908},"apucarana":{"cc":"BR","lat":-23.55,"lng":-51.46,"pop":134910},"angra dos reis":{"cc":"BR","lat":-23.01,"lng":-44.32,"pop":179120},"andradina":{"cc":"BR","lat":-20.9,"lng":-51.38,"pop":57202},"andradas":{"cc":"BR","lat":-22.07,"lng":-46.57,"pop":57202},"anpolis":{"cc":"BR","lat":-16.33,"lng":-48.95,"pop":319587},"anapolis":{"cc":"BR","lat":-16.33,"lng":-48.95,"pop":319587},"amparo":{"cc":"BR","lat":-22.7,"lng":-46.76,"pop":68008},"americana":{"cc":"BR","lat":-22.74,"lng":-47.33,"pop":246655},"almirante tamandare":{"cc":"BR","lat":-25.32,"lng":-49.31,"pop":119825},"almirante tamandar":{"cc":"BR","lat":-25.32,"lng":-49.31,"pop":119825},"alfenas":{"cc":"BR","lat":-21.43,"lng":-45.95,"pop":78970},"alegrete":{"cc":"BR","lat":-29.78,"lng":-55.79,"pop":73028},"alagoinhas":{"cc":"BR","lat":-12.14,"lng":-38.42,"pop":161196},"agua rasa":{"cc":"BR","lat":-23.57,"lng":-46.57,"pop":85788},"gua rasa":{"cc":"BR","lat":-20.43,"lng":-45.17,"pop":80484},"copacabana":{"cc":"BR","lat":-22.97,"lng":-43.19,"pop":128919},"guaba":{"cc":"BR","lat":-30.11,"lng":-51.33,"pop":98239},"guaiba":{"cc":"BR","lat":-30.11,"lng":-51.33,"pop":98239},"paraso do tocantins":{"cc":"BR","lat":-10.18,"lng":-48.87,"pop":52360},"paraiso do tocantins":{"cc":"BR","lat":-10.18,"lng":-48.87,"pop":52360},"tef":{"cc":"BR","lat":-3.37,"lng":-64.72,"pop":79278},"tefe":{"cc":"BR","lat":-3.37,"lng":-64.72,"pop":79278},"tabatinga":{"cc":"BR","lat":-4.23,"lng":-69.94,"pop":67182},"sao gabriel da cachoeira":{"cc":"BR","lat":-0.12,"lng":-67.09,"pop":51795},"so gabriel da cachoeira":{"cc":"BR","lat":-0.12,"lng":-67.09,"pop":51795},"rio branco":{"cc":"BR","lat":-9.97,"lng":-67.81,"pop":419452},"porto velho":{"cc":"BR","lat":-8.76,"lng":-63.9,"pop":548952},"manicore":{"cc":"BR","lat":-5.81,"lng":-61.3,"pop":57405},"manicor":{"cc":"BR","lat":-5.81,"lng":-61.3,"pop":57405},"manaus":{"cc":"BR","lat":-3.1,"lng":-60.02,"pop":2219580},"manacapuru":{"cc":"BR","lat":-3.3,"lng":-60.62,"pop":111751},"humaita":{"cc":"BR","lat":-7.52,"lng":-63.03,"pop":56144},"humait":{"cc":"BR","lat":-7.52,"lng":-63.03,"pop":56144},"cruzeiro do sul":{"cc":"BR","lat":-7.63,"lng":-72.68,"pop":89072},"coari":{"cc":"BR","lat":-4.08,"lng":-63.14,"pop":85910},"boa vista":{"cc":"BR","lat":2.82,"lng":-60.67,"pop":419652},"ariquemes":{"cc":"BR","lat":-9.91,"lng":-63.04,"pop":96833},"vilhena":{"cc":"BR","lat":-12.74,"lng":-60.15,"pop":109651},"ji paran":{"cc":"BR","lat":-10.89,"lng":-61.95,"pop":140101},"ji parana":{"cc":"BR","lat":-10.89,"lng":-61.95,"pop":140101},"jaru":{"cc":"BR","lat":-10.44,"lng":-62.47,"pop":50591},"cacoal":{"cc":"BR","lat":-11.44,"lng":-61.45,"pop":85893},"aailndia":{"cc":"BR","lat":-4.95,"lng":-47.5,"pop":110611},"acailandia":{"cc":"BR","lat":-4.95,"lng":-47.5,"pop":110611},"guas lindas de gois":{"cc":"BR","lat":-15.76,"lng":-48.28,"pop":245352},"aguas lindas de goias":{"cc":"BR","lat":-15.76,"lng":-48.28,"pop":245352},"aparecida de goinia":{"cc":"BR","lat":-16.82,"lng":-49.24,"pop":527796},"aparecida de goiania":{"cc":"BR","lat":-16.82,"lng":-49.24,"pop":527796},"breu branco":{"cc":"BR","lat":-4.0,"lng":-49.51,"pop":67332},"dom eliseu":{"cc":"BR","lat":-4.29,"lng":-47.51,"pop":62322},"ermelino matarazzo":{"cc":"BR","lat":-23.49,"lng":-46.47,"pop":112333},"fazenda rio grande":{"cc":"BR","lat":-25.66,"lng":-49.31,"pop":148873},"ipixuna do para":{"cc":"BR","lat":-2.56,"lng":-47.49,"pop":65625},"ipixuna do par":{"cc":"BR","lat":-2.56,"lng":-47.49,"pop":65625},"itaim paulista":{"cc":"BR","lat":-23.5,"lng":-46.39,"pop":205295},"jaboato dos guararapes":{"cc":"BR","lat":-8.11,"lng":-35.01,"pop":644037},"jaboatao dos guararapes":{"cc":"BR","lat":-8.11,"lng":-35.01,"pop":644037},"lauro de freitas":{"cc":"BR","lat":-12.89,"lng":-38.33,"pop":203331},"marituba":{"cc":"BR","lat":-1.36,"lng":-48.34,"pop":119437},"novo gama":{"cc":"BR","lat":-16.06,"lng":-48.04,"pop":107663},"novo repartimento":{"cc":"BR","lat":-4.33,"lng":-49.8,"pop":60438},"pao do lumiar":{"cc":"BR","lat":-2.53,"lng":-44.11,"pop":155307},"paco do lumiar":{"cc":"BR","lat":-2.53,"lng":-44.11,"pop":155307},"parauapebas":{"cc":"BR","lat":-6.07,"lng":-49.9,"pop":305771},"pinhais":{"cc":"BR","lat":-25.44,"lng":-49.19,"pop":117000},"redencao":{"cc":"BR","lat":-8.03,"lng":-50.03,"pop":85563},"redeno":{"cc":"BR","lat":-8.03,"lng":-50.03,"pop":85563},"rolim de moura":{"cc":"BR","lat":-11.8,"lng":-61.8,"pop":56406},"rondon do par":{"cc":"BR","lat":-4.78,"lng":-48.07,"pop":52803},"rondon do para":{"cc":"BR","lat":-4.78,"lng":-48.07,"pop":52803},"ruropolis":{"cc":"BR","lat":-4.1,"lng":-54.91,"pop":51500},"rurpolis":{"cc":"BR","lat":-4.1,"lng":-54.91,"pop":51500},"santo antonio do descoberto":{"cc":"BR","lat":-15.94,"lng":-48.26,"pop":75829},"santo antnio do descoberto":{"cc":"BR","lat":-15.94,"lng":-48.26,"pop":75829},"sapopemba":{"cc":"BR","lat":-23.6,"lng":-46.52,"pop":266715},"simoes filho":{"cc":"BR","lat":-12.78,"lng":-38.4,"pop":114559},"simes filho":{"cc":"BR","lat":-12.78,"lng":-38.4,"pop":114559},"sinop":{"cc":"BR","lat":-11.86,"lng":-55.5,"pop":223780},"sorriso":{"cc":"BR","lat":-12.55,"lng":-55.71,"pop":124665},"tailandia":{"cc":"BR","lat":-2.95,"lng":-48.95,"pop":72493},"tailndia":{"cc":"BR","lat":-2.95,"lng":-48.95,"pop":72493},"tangara da serra":{"cc":"BR","lat":-14.62,"lng":-57.49,"pop":114603},"tangar da serra":{"cc":"BR","lat":-14.62,"lng":-57.49,"pop":114603},"teixeira de freitas":{"cc":"BR","lat":-17.54,"lng":-39.74,"pop":145216},"valparaso de gois":{"cc":"BR","lat":-16.07,"lng":-47.98,"pop":218416},"valparaiso de goias":{"cc":"BR","lat":-16.07,"lng":-47.98,"pop":218416},"vargem grande paulista":{"cc":"BR","lat":-23.6,"lng":-47.03,"pop":50415},"taguatinga":{"cc":"BR","lat":-15.83,"lng":-48.06,"pop":193367},"barra da tijuca":{"cc":"BR","lat":-23.0,"lng":-43.37,"pop":421438},"tatuape":{"cc":"BR","lat":-23.54,"lng":-46.57,"pop":98601},"tatuap":{"cc":"BR","lat":-23.54,"lng":-46.57,"pop":98601},"consolacao":{"cc":"BR","lat":-23.55,"lng":-46.66,"pop":53249},"consolao":{"cc":"BR","lat":-23.55,"lng":-46.66,"pop":53249},"pirituba":{"cc":"BR","lat":-23.49,"lng":-46.73,"pop":179724},"limo":{"cc":"BR","lat":-23.49,"lng":-46.67,"pop":82373},"limao":{"cc":"BR","lat":-23.49,"lng":-46.67,"pop":82373},"jardim paulista":{"cc":"BR","lat":-23.57,"lng":-46.66,"pop":83667},"por do sol":{"cc":"BR","lat":-15.86,"lng":-48.12,"pop":101866},"pr do sol":{"cc":"BR","lat":-15.86,"lng":-48.12,"pop":101866},"itaim bibi":{"cc":"BR","lat":-23.59,"lng":-46.68,"pop":101452},"vicente pires":{"cc":"BR","lat":-15.81,"lng":-48.03,"pop":96871},"moema":{"cc":"BR","lat":-23.6,"lng":-46.66,"pop":81899},"luis eduardo magalhaes":{"cc":"BR","lat":-12.09,"lng":-45.79,"pop":107909},"luis eduardo magalhes":{"cc":"BR","lat":-12.09,"lng":-45.79,"pop":107909},"artur alvim":{"cc":"BR","lat":-23.54,"lng":-46.49,"pop":104864},"anhanguera":{"cc":"BR","lat":-23.43,"lng":-46.79,"pop":75360},"cidade dutra":{"cc":"BR","lat":-23.73,"lng":-46.7,"pop":182459},"capao redondo":{"cc":"BR","lat":-23.67,"lng":-46.78,"pop":270767},"casa verde":{"cc":"BR","lat":-23.5,"lng":-46.66,"pop":80536},"iguatemi":{"cc":"BR","lat":-23.61,"lng":-46.43,"pop":149700},"sao lucas":{"cc":"BR","lat":-23.59,"lng":-46.54,"pop":138038},"rio pequeno":{"cc":"BR","lat":-23.57,"lng":-46.76,"pop":131631},"carrao":{"cc":"BR","lat":-23.55,"lng":-46.54,"pop":84397},"cidade lider":{"cc":"BR","lat":-23.56,"lng":-46.49,"pop":136660},"aricanduva":{"cc":"BR","lat":-23.57,"lng":-46.52,"pop":89574},"jaan":{"cc":"BR","lat":-23.46,"lng":-46.57,"pop":94609},"jacana":{"cc":"BR","lat":-23.46,"lng":-46.57,"pop":94609},"jabaquara":{"cc":"BR","lat":-23.65,"lng":-46.65,"pop":214958},"jose bonifacio":{"cc":"BR","lat":-23.57,"lng":-46.43,"pop":128243},"cidade ademar":{"cc":"BR","lat":-23.67,"lng":-46.66,"pop":249218},"brasilandia":{"cc":"BR","lat":-23.45,"lng":-46.69,"pop":243273},"butanta":{"cc":"BR","lat":-23.57,"lng":-46.73,"pop":123748},"cangaiba":{"cc":"BR","lat":-23.5,"lng":-46.52,"pop":141172},"cursino":{"cc":"BR","lat":-23.63,"lng":-46.62,"pop":103171},"mooca":{"cc":"BR","lat":-23.56,"lng":-46.6,"pop":80880},"vila prudente":{"cc":"BR","lat":-23.59,"lng":-46.57,"pop":105590},"morumbi":{"cc":"BR","lat":-23.6,"lng":-46.71,"pop":51715},"pedreira":{"cc":"BR","lat":-23.71,"lng":-46.65,"pop":163586},"mandaqui":{"cc":"BR","lat":-23.46,"lng":-46.64,"pop":103665},"jardim angela":{"cc":"BR","lat":-23.72,"lng":-46.77,"pop":311432},"vila formosa":{"cc":"BR","lat":-23.57,"lng":-46.55,"pop":92186},"vila guilherme":{"cc":"BR","lat":-23.51,"lng":-46.61,"pop":52587},"vila jacui":{"cc":"BR","lat":-23.5,"lng":-46.46,"pop":134189},"vila matilde":{"cc":"BR","lat":-23.54,"lng":-46.52,"pop":103558},"vila medeiros":{"cc":"BR","lat":-23.49,"lng":-46.58,"pop":114839},"santa cecilia":{"cc":"BR","lat":-23.53,"lng":-46.65,"pop":80972},"parque do carmo":{"cc":"BR","lat":-23.58,"lng":-46.46,"pop":74677},"perdizes":{"cc":"BR","lat":-23.54,"lng":-46.68,"pop":102391},"ponte rasa":{"cc":"BR","lat":-23.52,"lng":-46.49,"pop":89881},"raposo tavares":{"cc":"BR","lat":-23.59,"lng":-46.79,"pop":117738},"sao domingos":{"cc":"BR","lat":-23.49,"lng":-46.75,"pop":88884},"jaguare":{"cc":"BR","lat":-23.54,"lng":-46.75,"pop":55382},"cidade tiradentes":{"cc":"BR","lat":-23.58,"lng":-46.4,"pop":192177},"bela vista":{"cc":"BR","lat":-23.56,"lng":-46.65,"pop":60024},"jardim helena":{"cc":"BR","lat":-23.48,"lng":-46.41,"pop":129409},"jardim sao luis":{"cc":"BR","lat":-23.68,"lng":-46.74,"pop":259377},"republica":{"cc":"BR","lat":-23.54,"lng":-46.64,"pop":60720},"sacom":{"cc":"BR","lat":-23.63,"lng":-46.6,"pop":261436},"sacoma":{"cc":"BR","lat":-23.63,"lng":-46.6,"pop":261436},"sao rafael":{"cc":"BR","lat":-23.63,"lng":-46.45,"pop":148145},"vila andrade":{"cc":"BR","lat":-23.63,"lng":-46.73,"pop":168669},"vila curuca":{"cc":"BR","lat":-23.51,"lng":-46.42,"pop":140673},"bosque saude":{"cc":"BR","lat":-23.61,"lng":-46.62,"pop":128469},"bosque sade":{"cc":"BR","lat":-23.61,"lng":-46.62,"pop":128469},"bairro da penha":{"cc":"BR","lat":-23.37,"lng":-46.31,"pop":117691},"bairro parque nossa senhora do carmo":{"cc":"BR","lat":-23.41,"lng":-46.32,"pop":69630},"itapoa":{"cc":"BR","lat":-15.75,"lng":-47.77,"pop":65408},"itapo":{"cc":"BR","lat":-15.75,"lng":-47.77,"pop":65408},"jardim botanico":{"cc":"BR","lat":-15.87,"lng":-47.81,"pop":77767},"jardim botnico":{"cc":"BR","lat":-15.87,"lng":-47.81,"pop":77767},"sobradinho ii":{"cc":"BR","lat":-15.63,"lng":-47.83,"pop":82785},"riacho fundo ii":{"cc":"BR","lat":-15.9,"lng":-48.05,"pop":105210},"samambaia":{"cc":"BR","lat":-15.88,"lng":-48.1,"pop":218840},"aguas claras":{"cc":"BR","lat":-15.84,"lng":-48.03,"pop":128486},"guas claras":{"cc":"BR","lat":-15.84,"lng":-48.03,"pop":128486},"buriticupu":{"cc":"BR","lat":-4.32,"lng":-46.45,"pop":55499},"cidade ocidental":{"cc":"BR","lat":-16.11,"lng":-47.93,"pop":91767},"recanto das emas":{"cc":"BR","lat":-15.91,"lng":-48.06,"pop":115550},"plano piloto":{"cc":"BR","lat":-15.79,"lng":-47.88,"pop":198697},"nassau":{"cc":"BS","lat":25.06,"lng":-77.34,"pop":227940},"thimphu":{"cc":"BT","lat":27.47,"lng":89.64,"pop":98676},"tlokweng":{"cc":"BW","lat":-24.67,"lng":25.97,"pop":55508},"serowe":{"cc":"BW","lat":-22.39,"lng":26.71,"pop":55676},"palapye":{"cc":"BW","lat":-22.55,"lng":27.13,"pop":52636},"molepolole":{"cc":"BW","lat":-24.41,"lng":25.5,"pop":74861},"mogoditshane":{"cc":"BW","lat":-24.63,"lng":25.87,"pop":88004},"mochudi":{"cc":"BW","lat":-24.42,"lng":26.15,"pop":50321},"maun":{"cc":"BW","lat":-19.98,"lng":23.42,"pop":85350},"gaborone":{"cc":"BW","lat":-24.65,"lng":25.91,"pop":246325},"francistown":{"cc":"BW","lat":-21.17,"lng":27.51,"pop":103417},"horad zhodzina":{"cc":"BY","lat":54.1,"lng":28.33,"pop":62983},"zhlobin":{"cc":"BY","lat":52.89,"lng":30.02,"pop":76304},"vitebsk":{"cc":"BY","lat":55.19,"lng":30.2,"pop":358927},"svetlogorsk":{"cc":"BY","lat":52.63,"lng":29.74,"pop":61812},"slutsk":{"cc":"BY","lat":53.02,"lng":27.54,"pop":58995},"soligorsk":{"cc":"BY","lat":52.79,"lng":27.54,"pop":96418},"rechytsa":{"cc":"BY","lat":52.36,"lng":30.39,"pop":64733},"polotsk":{"cc":"BY","lat":55.49,"lng":28.79,"pop":79285},"pinsk":{"cc":"BY","lat":52.12,"lng":26.07,"pop":123283},"orsha":{"cc":"BY","lat":54.51,"lng":30.4,"pop":101662},"novopolotsk":{"cc":"BY","lat":55.53,"lng":28.59,"pop":95370},"minsk":{"cc":"BY","lat":53.9,"lng":27.57,"pop":1742124},"mazyr":{"cc":"BY","lat":52.04,"lng":29.22,"pop":104517},"maladziena":{"cc":"BY","lat":54.32,"lng":26.85,"pop":87339},"maladziecna":{"cc":"BY","lat":54.32,"lng":26.85,"pop":87339},"mahilyow":{"cc":"BY","lat":53.91,"lng":30.34,"pop":352896},"lida":{"cc":"BY","lat":53.88,"lng":25.3,"pop":103262},"kobryn":{"cc":"BY","lat":52.21,"lng":24.36,"pop":52235},"hrodna":{"cc":"BY","lat":53.68,"lng":23.83,"pop":363718},"homyel":{"cc":"BY","lat":52.43,"lng":30.98,"pop":501193},"barysaw":{"cc":"BY","lat":54.23,"lng":28.5,"pop":133700},"baranovichi":{"cc":"BY","lat":53.13,"lng":26.01,"pop":170039},"bobruysk":{"cc":"BY","lat":53.15,"lng":29.21,"pop":205502},"belize city":{"cc":"BZ","lat":17.5,"lng":-88.2,"pop":65222},"abbotsford":{"cc":"CA","lat":49.06,"lng":-122.25,"pop":141397},"ahuntsic-cartierville":{"cc":"CA","lat":45.57,"lng":-73.67,"pop":135336},"airdrie":{"cc":"CA","lat":51.3,"lng":-114.04,"pop":90044},"ajax":{"cc":"CA","lat":43.85,"lng":-79.03,"pop":119677},"barrie":{"cc":"CA","lat":44.4,"lng":-79.67,"pop":147829},"belleville":{"cc":"CA","lat":44.17,"lng":-77.38,"pop":50716},"brampton":{"cc":"CA","lat":43.68,"lng":-79.77,"pop":656480},"brantford":{"cc":"CA","lat":43.13,"lng":-80.27,"pop":104688},"brighouse-city centre":{"cc":"CA","lat":49.17,"lng":-123.13,"pop":62855},"brossard":{"cc":"CA","lat":45.45,"lng":-73.47,"pop":69575},"burnaby":{"cc":"CA","lat":49.27,"lng":-122.95,"pop":249125},"caledon":{"cc":"CA","lat":43.87,"lng":-79.99,"pop":76581},"calgary":{"cc":"CA","lat":51.05,"lng":-114.09,"pop":1306784},"chicoutimi":{"cc":"CA","lat":48.42,"lng":-71.06,"pop":69004},"chilliwack":{"cc":"CA","lat":49.17,"lng":-121.95,"pop":101491},"chomedey":{"cc":"CA","lat":45.53,"lng":-73.75,"pop":94030},"cloverdale":{"cc":"CA","lat":49.11,"lng":-122.73,"pop":73355},"coquitlam":{"cc":"CA","lat":49.28,"lng":-122.78,"pop":148625},"dartmouth":{"cc":"CA","lat":44.67,"lng":-63.58,"pop":101343},"delta":{"cc":"CA","lat":49.09,"lng":-123.05,"pop":101668},"drummondville":{"cc":"CA","lat":45.88,"lng":-72.48,"pop":59489},"etobicoke":{"cc":"CA","lat":43.64,"lng":-79.57,"pop":365000},"fleetwood":{"cc":"CA","lat":49.17,"lng":-122.8,"pop":65565},"fort mcmurray":{"cc":"CA","lat":56.73,"lng":-111.38,"pop":66573},"fredericton":{"cc":"CA","lat":45.95,"lng":-66.67,"pop":63116},"gatineau":{"cc":"CA","lat":45.48,"lng":-75.7,"pop":300045},"granby":{"cc":"CA","lat":45.4,"lng":-72.73,"pop":66222},"grande prairie":{"cc":"CA","lat":55.17,"lng":-118.8,"pop":70385},"greater sudbury":{"cc":"CA","lat":46.49,"lng":-80.99,"pop":166004},"guelph":{"cc":"CA","lat":43.55,"lng":-80.26,"pop":143740},"halton hills":{"cc":"CA","lat":43.64,"lng":-79.93,"pop":62951},"kamloops":{"cc":"CA","lat":50.67,"lng":-120.32,"pop":104460},"kanata":{"cc":"CA","lat":45.3,"lng":-75.92,"pop":90000},"kelowna":{"cc":"CA","lat":49.88,"lng":-119.49,"pop":144576},"kitchener":{"cc":"CA","lat":43.43,"lng":-80.51,"pop":256885},"langley":{"cc":"CA","lat":49.1,"lng":-122.66,"pop":132603},"lethbridge":{"cc":"CA","lat":49.7,"lng":-112.82,"pop":103197},"longueuil":{"cc":"CA","lat":45.52,"lng":-73.47,"pop":229330},"maple ridge":{"cc":"CA","lat":49.22,"lng":-122.6,"pop":82256},"markham":{"cc":"CA","lat":43.87,"lng":-79.27,"pop":338503},"medicine hat":{"cc":"CA","lat":50.04,"lng":-110.68,"pop":63138},"metrotown":{"cc":"CA","lat":49.23,"lng":-123.0,"pop":52355},"milton":{"cc":"CA","lat":43.52,"lng":-79.88,"pop":132979},"mississauga":{"cc":"CA","lat":43.58,"lng":-79.66,"pop":717961},"moncton":{"cc":"CA","lat":46.09,"lng":-64.8,"pop":86106},"montral":{"cc":"CA","lat":45.51,"lng":-73.59,"pop":1762949},"montreal":{"cc":"CA","lat":45.51,"lng":-73.59,"pop":1762949},"nanaimo":{"cc":"CA","lat":49.17,"lng":-123.94,"pop":90504},"nepean":{"cc":"CA","lat":45.34,"lng":-75.72,"pop":180000},"newmarket":{"cc":"CA","lat":44.05,"lng":-79.47,"pop":91034},"new westminster":{"cc":"CA","lat":49.21,"lng":-122.91,"pop":78916},"niagara falls":{"cc":"CA","lat":43.1,"lng":-79.07,"pop":99818},"norfolk county":{"cc":"CA","lat":42.83,"lng":-80.38,"pop":60847},"north bay":{"cc":"CA","lat":46.32,"lng":-79.47,"pop":50396},"north delta":{"cc":"CA","lat":49.17,"lng":-122.92,"pop":60769},"north vancouver":{"cc":"CA","lat":49.32,"lng":-123.07,"pop":88168},"notre-dame-de-grace":{"cc":"CA","lat":45.48,"lng":-73.61,"pop":68152},"notre-dame-de-grce":{"cc":"CA","lat":45.48,"lng":-73.61,"pop":68152},"oakville":{"cc":"CA","lat":43.45,"lng":-79.68,"pop":213759},"oshawa":{"cc":"CA","lat":43.9,"lng":-78.85,"pop":175383},"ottawa":{"cc":"CA","lat":45.41,"lng":-75.7,"pop":1017449},"ottawa south":{"cc":"CA","lat":45.39,"lng":-75.69,"pop":125090},"pickering":{"cc":"CA","lat":43.9,"lng":-79.13,"pop":91771},"pierrefonds":{"cc":"CA","lat":45.46,"lng":-73.89,"pop":59093},"port coquitlam":{"cc":"CA","lat":49.27,"lng":-122.77,"pop":58000},"prince george":{"cc":"CA","lat":53.92,"lng":-122.75,"pop":78943},"red deer":{"cc":"CA","lat":52.27,"lng":-113.8,"pop":100844},"regina":{"cc":"CA","lat":50.45,"lng":-104.62,"pop":226404},"renfrew-collingwood":{"cc":"CA","lat":49.24,"lng":-123.04,"pop":51530},"repentigny":{"cc":"CA","lat":45.74,"lng":-73.45,"pop":84965},"saanich":{"cc":"CA","lat":48.55,"lng":-123.37,"pop":117735},"saguenay":{"cc":"CA","lat":48.42,"lng":-71.07,"pop":148886},"saint-hubert":{"cc":"CA","lat":45.5,"lng":-73.42,"pop":82548},"saint-hyacinthe":{"cc":"CA","lat":45.63,"lng":-72.96,"pop":50326},"saint-jean-sur-richelieu":{"cc":"CA","lat":45.31,"lng":-73.26,"pop":98036},"saint-jerome":{"cc":"CA","lat":45.78,"lng":-74.0,"pop":54948},"saint-jrme":{"cc":"CA","lat":45.78,"lng":-74.0,"pop":54948},"saint john":{"cc":"CA","lat":45.27,"lng":-66.06,"pop":71808},"saint-laurent":{"cc":"CA","lat":45.5,"lng":-73.67,"pop":98828},"saint-lonard":{"cc":"CA","lat":45.59,"lng":-73.6,"pop":79495},"saint-leonard":{"cc":"CA","lat":45.59,"lng":-73.6,"pop":79495},"saint-louis-de-terrebonne":{"cc":"CA","lat":45.7,"lng":-73.79,"pop":119944},"saint-michel":{"cc":"CA","lat":45.57,"lng":-73.62,"pop":56420},"sarnia":{"cc":"CA","lat":42.98,"lng":-82.4,"pop":72125},"saskatoon":{"cc":"CA","lat":52.13,"lng":-106.67,"pop":266141},"sault ste marie":{"cc":"CA","lat":46.52,"lng":-84.33,"pop":72051},"sherbrooke":{"cc":"CA","lat":45.4,"lng":-71.9,"pop":129447},"sherwood park":{"cc":"CA","lat":53.52,"lng":-113.32,"pop":70618},"south surrey":{"cc":"CA","lat":49.05,"lng":-122.79,"pop":77170},"st albert":{"cc":"CA","lat":53.63,"lng":-113.64,"pop":57719},"st catharines":{"cc":"CA","lat":43.17,"lng":-79.24,"pop":136803},"stoney creek":{"cc":"CA","lat":43.22,"lng":-79.77,"pop":76382},"surrey":{"cc":"CA","lat":49.11,"lng":-122.83,"pop":568322},"terrebonne":{"cc":"CA","lat":45.7,"lng":-73.65,"pop":111575},"thornhill":{"cc":"CA","lat":43.81,"lng":-79.42,"pop":115292},"thunder bay":{"cc":"CA","lat":48.38,"lng":-89.25,"pop":108843},"toronto":{"cc":"CA","lat":43.71,"lng":-79.4,"pop":2794356},"trois-rivieres":{"cc":"CA","lat":46.35,"lng":-72.55,"pop":144472},"trois-rivires":{"cc":"CA","lat":46.35,"lng":-72.55,"pop":144472},"vaughan":{"cc":"CA","lat":43.84,"lng":-79.5,"pop":323103},"verdun":{"cc":"CA","lat":45.46,"lng":-73.57,"pop":69229},"welland":{"cc":"CA","lat":42.98,"lng":-79.25,"pop":52293},"whalley":{"cc":"CA","lat":49.18,"lng":-122.87,"pop":102555},"whitby":{"cc":"CA","lat":43.88,"lng":-78.93,"pop":138501},"windsor":{"cc":"CA","lat":42.3,"lng":-83.02,"pop":229660},"winnipeg":{"cc":"CA","lat":49.88,"lng":-97.15,"pop":749607},"woburn":{"cc":"CA","lat":43.77,"lng":-79.23,"pop":53485},"st johns":{"cc":"CA","lat":47.56,"lng":-52.71,"pop":110525},"beauport":{"cc":"CA","lat":46.86,"lng":-71.19,"pop":81425},"charlesbourg":{"cc":"CA","lat":46.9,"lng":-71.31,"pop":82870},"sainte-foy":{"cc":"CA","lat":46.78,"lng":-71.29,"pop":111300},"quebec":{"cc":"CA","lat":46.81,"lng":-71.21,"pop":531902},"qubec":{"cc":"CA","lat":46.81,"lng":-71.21,"pop":531902},"levis":{"cc":"CA","lat":46.8,"lng":-71.18,"pop":143414},"lvis":{"cc":"CA","lat":46.8,"lng":-71.18,"pop":143414},"aylmer":{"cc":"CA","lat":45.4,"lng":-75.81,"pop":56542},"hull":{"cc":"CA","lat":45.43,"lng":-75.71,"pop":63702},"jonquiere":{"cc":"CA","lat":48.42,"lng":-71.25,"pop":54842},"jonquire":{"cc":"CA","lat":48.42,"lng":-71.25,"pop":54842},"willowdale":{"cc":"CA","lat":43.77,"lng":-79.4,"pop":79440},"lower sackville":{"cc":"CA","lat":44.78,"lng":-63.68,"pop":51749},"la haute-saint-charles":{"cc":"CA","lat":46.89,"lng":-71.37,"pop":88460},"downtown vancouver":{"cc":"CA","lat":49.28,"lng":-123.12,"pop":62030},"waterfront communities-the island":{"cc":"CA","lat":43.63,"lng":-79.38,"pop":65913},"willowdale east":{"cc":"CA","lat":43.77,"lng":-79.4,"pop":50434},"east hastings":{"cc":"CA","lat":49.27,"lng":-123.06,"pop":80740},"le plateau-mont-royal":{"cc":"CA","lat":45.53,"lng":-73.58,"pop":105813},"ville-marie":{"cc":"CA","lat":45.5,"lng":-73.57,"pop":104944},"le sud-ouest":{"cc":"CA","lat":45.47,"lng":-73.59,"pop":86347},"mercier-hochelaga-maisonneuve":{"cc":"CA","lat":45.57,"lng":-73.55,"pop":142753},"mercierhochelaga-maisonneuve":{"cc":"CA","lat":45.57,"lng":-73.55,"pop":142753},"montral-nord":{"cc":"CA","lat":45.6,"lng":-73.63,"pop":86857},"montreal-nord":{"cc":"CA","lat":45.6,"lng":-73.63,"pop":86857},"pierrefonds-roxboro":{"cc":"CA","lat":45.5,"lng":-73.84,"pop":73194},"rivire-des-prairiespointe-aux-trembles":{"cc":"CA","lat":45.64,"lng":-73.58,"pop":113868},"riviere-des-prairies-pointe-aux-trembles":{"cc":"CA","lat":45.64,"lng":-73.58,"pop":113868},"rosemontla petite-patrie":{"cc":"CA","lat":45.54,"lng":-73.61,"pop":146501},"rosemont-la petite-patrie":{"cc":"CA","lat":45.54,"lng":-73.61,"pop":146501},"villeraysaint-michelparc-extension":{"cc":"CA","lat":45.56,"lng":-73.61,"pop":144814},"villeray-saint-michel-parc-extension":{"cc":"CA","lat":45.56,"lng":-73.61,"pop":144814},"le vieux-longueuil":{"cc":"CA","lat":45.54,"lng":-73.51,"pop":135218},"la cite-limoilou":{"cc":"CA","lat":46.83,"lng":-71.23,"pop":108415},"la cit-limoilou":{"cc":"CA","lat":46.83,"lng":-71.23,"pop":108415},"les rivieres":{"cc":"CA","lat":46.82,"lng":-71.27,"pop":77000},"les rivires":{"cc":"CA","lat":46.82,"lng":-71.27,"pop":77000},"nutana sector":{"cc":"CA","lat":52.1,"lng":-106.64,"pop":72564},"university heights":{"cc":"CA","lat":52.14,"lng":-106.58,"pop":51957},"confederation":{"cc":"CA","lat":52.14,"lng":-106.7,"pop":70192},"fort garry south":{"cc":"CA","lat":49.79,"lng":-97.16,"pop":65420},"yangambi":{"cc":"CD","lat":0.77,"lng":24.44,"pop":62082},"uvira":{"cc":"CD","lat":-3.4,"lng":29.14,"pop":407092},"tshikapa":{"cc":"CD","lat":-6.42,"lng":20.8,"pop":634529},"rutshuru":{"cc":"CD","lat":-1.19,"lng":29.45,"pop":82680},"nyunzu":{"cc":"CD","lat":-5.96,"lng":28.02,"pop":62565},"mwene-ditu":{"cc":"CD","lat":-7.01,"lng":23.45,"pop":189177},"mweka":{"cc":"CD","lat":-4.85,"lng":21.56,"pop":81267},"mulongo":{"cc":"CD","lat":-7.83,"lng":27.0,"pop":89340},"baudhuinville":{"cc":"CD","lat":-7.08,"lng":29.74,"pop":81181},"miabi":{"cc":"CD","lat":-6.22,"lng":23.39,"pop":79929},"mbuji-mayi":{"cc":"CD","lat":-6.14,"lng":23.59,"pop":2101332},"manono":{"cc":"CD","lat":-7.3,"lng":27.4,"pop":82465},"luputa":{"cc":"CD","lat":-7.16,"lng":23.7,"pop":54676},"lodja":{"cc":"CD","lat":-3.52,"lng":23.6,"pop":91409},"lisala":{"cc":"CD","lat":2.15,"lng":21.52,"pop":117464},"kongolo":{"cc":"CD","lat":-5.39,"lng":27.0,"pop":86932},"kisangani":{"cc":"CD","lat":0.52,"lng":25.19,"pop":1181788},"kirumba":{"cc":"CD","lat":-1.09,"lng":29.29,"pop":52041},"kindu":{"cc":"CD","lat":-2.94,"lng":25.92,"pop":234651},"kayna":{"cc":"CD","lat":-0.61,"lng":29.17,"pop":51103},"katwa":{"cc":"CD","lat":0.09,"lng":29.31,"pop":89352},"kasongo":{"cc":"CD","lat":-4.43,"lng":26.67,"pop":81629},"kanyama":{"cc":"CD","lat":-7.52,"lng":24.17,"pop":80043},"kananga":{"cc":"CD","lat":-5.9,"lng":22.42,"pop":1247168},"kamina":{"cc":"CD","lat":-8.74,"lng":25.0,"pop":200184},"kalima":{"cc":"CD","lat":-5.49,"lng":28.22,"pop":72327},"kalemie":{"cc":"CD","lat":-5.95,"lng":29.19,"pop":160961},"kabinda":{"cc":"CD","lat":-6.14,"lng":24.48,"pop":219396},"kabalo":{"cc":"CD","lat":-6.05,"lng":26.91,"pop":81191},"isiro":{"cc":"CD","lat":2.77,"lng":27.62,"pop":255409},"ilebo":{"cc":"CD","lat":-4.33,"lng":20.59,"pop":117245},"goma":{"cc":"CD","lat":-1.67,"lng":29.23,"pop":432587},"gbadolite":{"cc":"CD","lat":4.28,"lng":21.0,"pop":73835},"gandajika":{"cc":"CD","lat":-6.75,"lng":23.95,"pop":208051},"butembo":{"cc":"CD","lat":0.14,"lng":29.29,"pop":286242},"buta":{"cc":"CD","lat":2.79,"lng":24.73,"pop":80751},"bunia":{"cc":"CD","lat":1.56,"lng":30.25,"pop":399282},"bumba":{"cc":"CD","lat":2.19,"lng":22.47,"pop":154586},"bukavu":{"cc":"CD","lat":-2.49,"lng":28.84,"pop":816811},"bukama":{"cc":"CD","lat":-9.2,"lng":25.85,"pop":105530},"boende":{"cc":"CD","lat":-0.28,"lng":20.88,"pop":50794},"binga":{"cc":"CD","lat":2.37,"lng":20.5,"pop":96790},"beni":{"cc":"CD","lat":0.49,"lng":29.47,"pop":140731},"basoko":{"cc":"CD","lat":1.24,"lng":23.62,"pop":76371},"bakwa":{"cc":"CD","lat":4.13,"lng":27.4,"pop":100575},"babamba":{"cc":"CD","lat":0.18,"lng":27.48,"pop":81740},"aketi":{"cc":"CD","lat":2.74,"lng":23.78,"pop":61437},"tshilenge":{"cc":"CD","lat":-10.97,"lng":22.9,"pop":116073},"lubumbashi":{"cc":"CD","lat":-11.66,"lng":27.48,"pop":2221925},"likasi":{"cc":"CD","lat":-10.98,"lng":26.74,"pop":635768},"kolwezi":{"cc":"CD","lat":-10.71,"lng":25.47,"pop":790248},"kipushi":{"cc":"CD","lat":-11.76,"lng":27.25,"pop":169635},"kambove":{"cc":"CD","lat":-10.87,"lng":26.6,"pop":99884},"fungurume":{"cc":"CD","lat":-10.62,"lng":26.32,"pop":50100},"tshela":{"cc":"CD","lat":-5.0,"lng":12.95,"pop":64210},"nioki":{"cc":"CD","lat":-2.72,"lng":17.69,"pop":62153},"mushie":{"cc":"CD","lat":-3.02,"lng":16.92,"pop":61336},"mbanza-ngungu":{"cc":"CD","lat":-5.26,"lng":14.86,"pop":142773},"mbandaka":{"cc":"CD","lat":0.05,"lng":18.26,"pop":455011},"matadi":{"cc":"CD","lat":-5.84,"lng":13.46,"pop":425662},"mangai":{"cc":"CD","lat":-4.02,"lng":19.53,"pop":63713},"kutu":{"cc":"CD","lat":-2.72,"lng":18.15,"pop":56061},"kinshasa":{"cc":"CD","lat":-4.33,"lng":15.31,"pop":16000000},"kimpese":{"cc":"CD","lat":-5.56,"lng":14.43,"pop":79539},"kikwit":{"cc":"CD","lat":-5.04,"lng":18.82,"pop":509367},"kenge":{"cc":"CD","lat":-5.77,"lng":13.66,"pop":63317},"inongo":{"cc":"CD","lat":-1.93,"lng":18.29,"pop":68852},"inkisi":{"cc":"CD","lat":-5.13,"lng":15.05,"pop":115317},"idiofa":{"cc":"CD","lat":-4.97,"lng":19.59,"pop":87882},"gemena":{"cc":"CD","lat":3.26,"lng":19.77,"pop":197159},"dibaya-lubwe":{"cc":"CD","lat":-4.16,"lng":19.86,"pop":55672},"bulungu":{"cc":"CD","lat":-4.54,"lng":18.6,"pop":81393},"boma":{"cc":"CD","lat":-5.85,"lng":13.05,"pop":297009},"bolenge":{"cc":"CD","lat":0.0,"lng":18.22,"pop":79648},"bandundu province":{"cc":"CD","lat":-3.32,"lng":17.38,"pop":202904},"masina":{"cc":"CD","lat":-4.38,"lng":15.39,"pop":485167},"hyosha":{"cc":"CD","lat":0.7,"lng":29.52,"pop":74502},"mwene":{"cc":"CD","lat":-9.82,"lng":22.87,"pop":295683},"kituku":{"cc":"CD","lat":-7.58,"lng":30.21,"pop":66378},"mangina":{"cc":"CD","lat":0.6,"lng":29.31,"pop":55439},"bangassou":{"cc":"CF","lat":4.74,"lng":22.82,"pop":54059},"bambari":{"cc":"CF","lat":5.77,"lng":20.68,"pop":83029},"kaga-bandoro":{"cc":"CF","lat":6.99,"lng":19.19,"pop":55047},"carnot":{"cc":"CF","lat":4.94,"lng":15.88,"pop":129032},"bouar":{"cc":"CF","lat":5.93,"lng":15.6,"pop":71680},"bossangoa":{"cc":"CF","lat":6.49,"lng":17.46,"pop":55353},"bimbo":{"cc":"CF","lat":4.26,"lng":18.42,"pop":348802},"berberati":{"cc":"CF","lat":4.26,"lng":15.79,"pop":103713},"berbrati":{"cc":"CF","lat":4.26,"lng":15.79,"pop":103713},"bgoua":{"cc":"CF","lat":4.45,"lng":18.53,"pop":264067},"begoua":{"cc":"CF","lat":4.45,"lng":18.53,"pop":264067},"bangui":{"cc":"CF","lat":4.36,"lng":18.55,"pop":812407},"pointe-noire":{"cc":"CG","lat":-4.78,"lng":11.86,"pop":1032000},"dolisie":{"cc":"CG","lat":-4.2,"lng":12.67,"pop":121000},"brazzaville":{"cc":"CG","lat":-4.27,"lng":15.28,"pop":1982000},"nkayi":{"cc":"CG","lat":-4.18,"lng":13.29,"pop":103000},"zuerich":{"cc":"CH","lat":47.37,"lng":8.55,"pop":415367},"zrich":{"cc":"CH","lat":47.37,"lng":8.55,"pop":415367},"winterthur":{"cc":"CH","lat":47.51,"lng":8.72,"pop":111840},"sankt gallen":{"cc":"CH","lat":47.42,"lng":9.37,"pop":75833},"luzern":{"cc":"CH","lat":47.05,"lng":8.31,"pop":81691},"lugano":{"cc":"CH","lat":46.01,"lng":8.96,"pop":63185},"lausanne":{"cc":"CH","lat":46.52,"lng":6.63,"pop":139111},"geneva":{"cc":"CH","lat":46.2,"lng":6.15,"pop":201741},"bielbienne":{"cc":"CH","lat":47.14,"lng":7.25,"pop":55120},"bern":{"cc":"CH","lat":46.95,"lng":7.45,"pop":121631},"basel":{"cc":"CH","lat":47.56,"lng":7.57,"pop":177595},"zagne":{"cc":"CI","lat":6.21,"lng":-7.48,"pop":63341},"zagn":{"cc":"CI","lat":6.21,"lng":-7.48,"pop":63341},"yamoussoukro":{"cc":"CI","lat":6.82,"lng":-5.28,"pop":275686},"vavoua":{"cc":"CI","lat":7.38,"lng":-6.48,"pop":86977},"toumodi":{"cc":"CI","lat":6.56,"lng":-5.02,"pop":55986},"tengrela":{"cc":"CI","lat":10.48,"lng":-6.41,"pop":52271},"tengrla":{"cc":"CI","lat":10.48,"lng":-6.41,"pop":52271},"sinfra":{"cc":"CI","lat":6.62,"lng":-5.91,"pop":245226},"san-pdro":{"cc":"CI","lat":4.75,"lng":-6.64,"pop":390654},"san-pedro":{"cc":"CI","lat":4.75,"lng":-6.64,"pop":390654},"oum":{"cc":"CI","lat":6.38,"lng":-5.42,"pop":58606},"oume":{"cc":"CI","lat":6.38,"lng":-5.42,"pop":58606},"odienn":{"cc":"CI","lat":9.51,"lng":-7.56,"pop":54669},"odienne":{"cc":"CI","lat":9.51,"lng":-7.56,"pop":54669},"man":{"cc":"CI","lat":7.41,"lng":-7.55,"pop":241969},"koumassi":{"cc":"CI","lat":5.3,"lng":-3.97,"pop":412282},"korhogo":{"cc":"CI","lat":9.46,"lng":-5.63,"pop":440926},"katiola":{"cc":"CI","lat":8.14,"lng":-5.1,"pop":59641},"issia":{"cc":"CI","lat":6.49,"lng":-6.59,"pop":68263},"guiglo":{"cc":"CI","lat":6.54,"lng":-7.49,"pop":68113},"grand-bassam":{"cc":"CI","lat":5.21,"lng":-3.74,"pop":96797},"gagnoa":{"cc":"CI","lat":6.13,"lng":-5.95,"pop":277044},"ferkessedougou":{"cc":"CI","lat":9.59,"lng":-5.19,"pop":72476},"ferkessdougou":{"cc":"CI","lat":9.59,"lng":-5.19,"pop":72476},"duekou":{"cc":"CI","lat":6.74,"lng":-7.35,"pop":117023},"duekoue":{"cc":"CI","lat":6.74,"lng":-7.35,"pop":117023},"divo":{"cc":"CI","lat":5.84,"lng":-5.36,"pop":136627},"dimbokro":{"cc":"CI","lat":6.65,"lng":-4.71,"pop":70198},"daoukro":{"cc":"CI","lat":7.06,"lng":-3.96,"pop":101136},"danane":{"cc":"CI","lat":7.26,"lng":-8.15,"pop":78614},"danan":{"cc":"CI","lat":7.26,"lng":-8.15,"pop":78614},"daloa":{"cc":"CI","lat":6.88,"lng":-6.45,"pop":421871},"dabou":{"cc":"CI","lat":5.33,"lng":-4.38,"pop":138083},"boundiali":{"cc":"CI","lat":9.52,"lng":-6.49,"pop":51803},"bouak":{"cc":"CI","lat":7.69,"lng":-5.03,"pop":832371},"bouake":{"cc":"CI","lat":7.69,"lng":-5.03,"pop":832371},"bouafl":{"cc":"CI","lat":6.99,"lng":-5.74,"pop":104209},"bouafle":{"cc":"CI","lat":6.99,"lng":-5.74,"pop":104209},"bondoukou":{"cc":"CI","lat":8.04,"lng":-2.8,"pop":141568},"bingerville":{"cc":"CI","lat":5.36,"lng":-3.89,"pop":82983},"anyama":{"cc":"CI","lat":5.49,"lng":-4.05,"pop":133905},"agnibilkrou":{"cc":"CI","lat":7.13,"lng":-3.2,"pop":63015},"agnibilekrou":{"cc":"CI","lat":7.13,"lng":-3.2,"pop":63015},"agboville":{"cc":"CI","lat":5.93,"lng":-4.21,"pop":81770},"adzop":{"cc":"CI","lat":6.11,"lng":-3.86,"pop":76122},"adzope":{"cc":"CI","lat":6.11,"lng":-3.86,"pop":76122},"aboisso":{"cc":"CI","lat":5.47,"lng":-3.21,"pop":59225},"abobo":{"cc":"CI","lat":5.42,"lng":-4.02,"pop":1340083},"abidjan":{"cc":"CI","lat":5.35,"lng":-4.0,"pop":6321017},"abengourou":{"cc":"CI","lat":6.73,"lng":-3.5,"pop":130810},"marcory":{"cc":"CI","lat":5.31,"lng":-3.99,"pop":214061},"seguela":{"cc":"CI","lat":7.96,"lng":-6.67,"pop":103980},"sgula":{"cc":"CI","lat":7.96,"lng":-6.67,"pop":103980},"soubre":{"cc":"CI","lat":5.78,"lng":-6.59,"pop":131181},"soubr":{"cc":"CI","lat":5.78,"lng":-6.59,"pop":131181},"bonon":{"cc":"CI","lat":6.93,"lng":-6.05,"pop":119938},"magui":{"cc":"CI","lat":5.41,"lng":-6.56,"pop":74365},"meagui":{"cc":"CI","lat":5.41,"lng":-6.56,"pop":74365},"vina del mar":{"cc":"CL","lat":-33.02,"lng":-71.55,"pop":334248},"via del mar":{"cc":"CL","lat":-33.02,"lng":-71.55,"pop":334248},"villa alemana":{"cc":"CL","lat":-33.05,"lng":-71.37,"pop":97320},"valparaso":{"cc":"CL","lat":-33.04,"lng":-71.63,"pop":282448},"valparaiso":{"cc":"CL","lat":-33.04,"lng":-71.63,"pop":282448},"valdivia":{"cc":"CL","lat":-39.81,"lng":-73.25,"pop":133419},"tom":{"cc":"CL","lat":-36.62,"lng":-72.96,"pop":53219},"temuco":{"cc":"CL","lat":-38.74,"lng":-72.6,"pop":238129},"talcahuano":{"cc":"CL","lat":-36.72,"lng":-73.12,"pop":150499},"talca":{"cc":"CL","lat":-35.42,"lng":-71.65,"pop":197479},"talagante":{"cc":"CL","lat":-33.66,"lng":-70.93,"pop":57323},"san bernardo":{"cc":"CL","lat":-33.59,"lng":-70.7,"pop":249858},"renca":{"cc":"CL","lat":-33.4,"lng":-70.71,"pop":147151},"rancagua":{"cc":"CL","lat":-34.17,"lng":-70.74,"pop":212695},"quilpu":{"cc":"CL","lat":-33.05,"lng":-71.44,"pop":130263},"quilpue":{"cc":"CL","lat":-33.05,"lng":-71.44,"pop":130263},"quillota":{"cc":"CL","lat":-32.88,"lng":-71.25,"pop":67779},"quilicura":{"cc":"CL","lat":-33.37,"lng":-70.71,"pop":210410},"punta arenas":{"cc":"CL","lat":-53.16,"lng":-70.91,"pop":117430},"puerto montt":{"cc":"CL","lat":-41.47,"lng":-72.94,"pop":245902},"puente alto":{"cc":"CL","lat":-33.61,"lng":-70.58,"pop":568106},"pealoln":{"cc":"CL","lat":-33.47,"lng":-70.53,"pop":241599},"penalolen":{"cc":"CL","lat":-33.47,"lng":-70.53,"pop":241599},"peaflor":{"cc":"CL","lat":-33.61,"lng":-70.88,"pop":85671},"penaflor":{"cc":"CL","lat":-33.61,"lng":-70.88,"pop":85671},"paine":{"cc":"CL","lat":-33.81,"lng":-70.74,"pop":72759},"padre las casas":{"cc":"CL","lat":-38.76,"lng":-72.6,"pop":72892},"padre hurtado":{"cc":"CL","lat":-33.57,"lng":-70.81,"pop":63250},"ovalle":{"cc":"CL","lat":-30.6,"lng":-71.2,"pop":77138},"osorno":{"cc":"CL","lat":-40.57,"lng":-73.13,"pop":135773},"uoa":{"cc":"CL","lat":-33.45,"lng":-70.58,"pop":255823},"nunoa":{"cc":"CL","lat":-33.45,"lng":-70.58,"pop":255823},"melipilla":{"cc":"CL","lat":-33.69,"lng":-71.22,"pop":63100},"maip":{"cc":"CL","lat":-33.51,"lng":-70.77,"pop":503635},"maipu":{"cc":"CL","lat":-33.51,"lng":-70.77,"pop":503635},"los ngeles":{"cc":"CL","lat":-37.47,"lng":-72.35,"pop":125430},"los andes":{"cc":"CL","lat":-32.83,"lng":-70.6,"pop":63009},"la serena":{"cc":"CL","lat":-29.91,"lng":-71.25,"pop":154521},"lampa":{"cc":"CL","lat":-33.29,"lng":-70.88,"pop":102234},"la calera":{"cc":"CL","lat":-32.79,"lng":-71.2,"pop":50221},"iquique":{"cc":"CL","lat":-20.21,"lng":-70.15,"pop":199587},"hualpen":{"cc":"CL","lat":-36.79,"lng":-73.1,"pop":86639},"hualpn":{"cc":"CL","lat":-36.79,"lng":-73.1,"pop":86639},"curic":{"cc":"CL","lat":-34.98,"lng":-71.24,"pop":102438},"curico":{"cc":"CL","lat":-34.98,"lng":-71.24,"pop":102438},"coronel":{"cc":"CL","lat":-37.03,"lng":-73.14,"pop":107759},"coquimbo":{"cc":"CL","lat":-29.95,"lng":-71.34,"pop":161317},"copiap":{"cc":"CL","lat":-27.37,"lng":-70.33,"pop":129280},"copiapo":{"cc":"CL","lat":-27.37,"lng":-70.33,"pop":129280},"colina":{"cc":"CL","lat":-33.2,"lng":-70.67,"pop":146207},"chillan":{"cc":"CL","lat":-36.61,"lng":-72.1,"pop":150396},"chilln":{"cc":"CL","lat":-36.61,"lng":-72.1,"pop":150396},"chiguayante":{"cc":"CL","lat":-36.93,"lng":-73.03,"pop":84718},"calama":{"cc":"CL","lat":-22.46,"lng":-68.92,"pop":166334},"buin":{"cc":"CL","lat":-33.73,"lng":-70.74,"pop":63419},"arica":{"cc":"CL","lat":-18.48,"lng":-70.3,"pop":241653},"antofagasta":{"cc":"CL","lat":-23.65,"lng":-70.4,"pop":401096},"alto hospicio":{"cc":"CL","lat":-20.27,"lng":-70.1,"pop":142086},"san pedro de la paz":{"cc":"CL","lat":-36.84,"lng":-73.1,"pop":121631},"la pintana":{"cc":"CL","lat":-33.58,"lng":-70.63,"pop":201178},"lo prado":{"cc":"CL","lat":-33.44,"lng":-70.73,"pop":104316},"yaound":{"cc":"CM","lat":3.87,"lng":11.52,"pop":1299369},"yaounde":{"cc":"CM","lat":3.87,"lng":11.52,"pop":1299369},"yagoua":{"cc":"CM","lat":10.34,"lng":15.23,"pop":59069},"tiko":{"cc":"CM","lat":4.08,"lng":9.36,"pop":94836},"sangmelima":{"cc":"CM","lat":2.93,"lng":11.98,"pop":80036},"sangmlima":{"cc":"CM","lat":2.93,"lng":11.98,"pop":80036},"nkongsamba":{"cc":"CM","lat":4.95,"lng":9.94,"pop":162309},"ngaoundere":{"cc":"CM","lat":7.33,"lng":13.58,"pop":238196},"ngaoundr":{"cc":"CM","lat":7.33,"lng":13.58,"pop":238196},"mutengene":{"cc":"CM","lat":4.09,"lng":9.31,"pop":64054},"mora":{"cc":"CM","lat":11.05,"lng":14.14,"pop":61523},"mokolo":{"cc":"CM","lat":10.74,"lng":13.8,"pop":51999},"melong":{"cc":"CM","lat":5.12,"lng":9.96,"pop":76716},"meganga":{"cc":"CM","lat":6.52,"lng":14.3,"pop":59426},"meiganga":{"cc":"CM","lat":6.52,"lng":14.3,"pop":59426},"mbouda":{"cc":"CM","lat":5.63,"lng":10.25,"pop":71867},"mbalmayo":{"cc":"CM","lat":3.52,"lng":11.5,"pop":82384},"maroua":{"cc":"CM","lat":10.59,"lng":14.32,"pop":314122},"loum":{"cc":"CM","lat":4.72,"lng":9.74,"pop":58554},"limbe":{"cc":"CM","lat":4.02,"lng":9.21,"pop":131381},"kumbo":{"cc":"CM","lat":6.2,"lng":10.67,"pop":125124},"kumba":{"cc":"CM","lat":4.64,"lng":9.45,"pop":225046},"kribi":{"cc":"CM","lat":2.94,"lng":9.91,"pop":93482},"koussri":{"cc":"CM","lat":12.08,"lng":15.03,"pop":139024},"kousseri":{"cc":"CM","lat":12.08,"lng":15.03,"pop":139024},"guider":{"cc":"CM","lat":9.93,"lng":13.95,"pop":81608},"foumbot":{"cc":"CM","lat":5.51,"lng":10.63,"pop":74319},"foumban":{"cc":"CM","lat":5.73,"lng":10.9,"pop":130287},"edea":{"cc":"CM","lat":3.8,"lng":10.13,"pop":103861},"eda":{"cc":"CM","lat":3.8,"lng":10.13,"pop":103861},"bolowa":{"cc":"CM","lat":2.9,"lng":11.15,"pop":101363},"ebolowa":{"cc":"CM","lat":2.9,"lng":11.15,"pop":101363},"dschang":{"cc":"CM","lat":5.44,"lng":10.05,"pop":99582},"douala":{"cc":"CM","lat":4.05,"lng":9.7,"pop":1338082},"buea":{"cc":"CM","lat":4.15,"lng":9.24,"pop":140533},"bertoua":{"cc":"CM","lat":4.58,"lng":13.68,"pop":137993},"bamenda":{"cc":"CM","lat":5.96,"lng":10.15,"pop":420445},"bafoussam":{"cc":"CM","lat":5.48,"lng":10.42,"pop":373268},"bafia":{"cc":"CM","lat":4.75,"lng":11.23,"pop":74050},"bafang":{"cc":"CM","lat":5.16,"lng":10.18,"pop":54505},"zhefang":{"cc":"CN","lat":24.27,"lng":98.28,"pop":51477},"zhangfeng":{"cc":"CN","lat":24.19,"lng":97.8,"pop":53370},"zepu":{"cc":"CN","lat":38.19,"lng":77.27,"pop":51691},"zibihu":{"cc":"CN","lat":26.11,"lng":99.95,"pop":56246},"rikaze":{"cc":"CN","lat":29.25,"lng":88.88,"pop":80000},"tengyue":{"cc":"CN","lat":24.99,"lng":98.51,"pop":127133},"jiuquan":{"cc":"CN","lat":39.74,"lng":98.52,"pop":428346},"shache":{"cc":"CN","lat":38.42,"lng":77.24,"pop":128145},"qamdo":{"cc":"CN","lat":31.13,"lng":97.18,"pop":86280},"yingjiang":{"cc":"CN","lat":24.71,"lng":97.94,"pop":80481},"qaraqash":{"cc":"CN","lat":37.27,"lng":79.73,"pop":66541},"mengmao":{"cc":"CN","lat":24.0,"lng":97.86,"pop":112578},"menglang":{"cc":"CN","lat":22.56,"lng":99.91,"pop":86877},"longshan":{"cc":"CN","lat":42.89,"lng":125.14,"pop":465249},"liuku":{"cc":"CN","lat":25.85,"lng":98.86,"pop":63013},"lhasa":{"cc":"CN","lat":29.65,"lng":91.1,"pop":118721},"laojunmiao":{"cc":"CN","lat":39.83,"lng":97.73,"pop":84769},"bonan":{"cc":"CN","lat":25.46,"lng":99.53,"pop":55685},"kashgar":{"cc":"CN","lat":39.47,"lng":75.99,"pop":506640},"jinhua":{"cc":"CN","lat":29.11,"lng":119.64,"pop":1463990},"jinding":{"cc":"CN","lat":26.44,"lng":99.44,"pop":53667},"jietou":{"cc":"CN","lat":25.43,"lng":98.65,"pop":65843},"jiayuguan":{"cc":"CN","lat":39.81,"lng":98.29,"pop":231853},"gujangbagh":{"cc":"CN","lat":37.11,"lng":79.93,"pop":408894},"yushu":{"cc":"CN","lat":33.0,"lng":97.01,"pop":141308},"gengqing":{"cc":"CN","lat":31.82,"lng":98.58,"pop":88542},"dqn":{"cc":"CN","lat":29.96,"lng":90.72,"pop":62400},"deqen":{"cc":"CN","lat":29.96,"lng":90.72,"pop":62400},"baoshan":{"cc":"CN","lat":31.41,"lng":121.49,"pop":2265900},"artux":{"cc":"CN","lat":39.71,"lng":76.18,"pop":285000},"xinyuan":{"cc":"CN","lat":43.43,"lng":83.25,"pop":282718},"wujiaqu":{"cc":"CN","lat":44.16,"lng":87.52,"pop":154400},"wensu":{"cc":"CN","lat":41.28,"lng":80.24,"pop":83110},"wusu":{"cc":"CN","lat":44.43,"lng":84.68,"pop":72587},"ueruemqi":{"cc":"CN","lat":43.8,"lng":87.6,"pop":3029372},"rmqi":{"cc":"CN","lat":43.8,"lng":87.6,"pop":3029372},"turpan":{"cc":"CN","lat":42.95,"lng":89.18,"pop":273385},"tacheng":{"cc":"CN","lat":46.75,"lng":82.96,"pop":161037},"shihezi":{"cc":"CN","lat":44.3,"lng":86.04,"pop":572772},"sandaohezi":{"cc":"CN","lat":44.33,"lng":85.62,"pop":60129},"xincheng":{"cc":"CN","lat":41.71,"lng":82.93,"pop":102752},"korla":{"cc":"CN","lat":41.76,"lng":86.15,"pop":549324},"qarasu":{"cc":"CN","lat":44.2,"lng":80.42,"pop":71446},"karamay":{"cc":"CN","lat":45.58,"lng":84.89,"pop":261445},"ghulja":{"cc":"CN","lat":43.92,"lng":81.32,"pop":269158},"hami":{"cc":"CN","lat":42.83,"lng":93.51,"pop":246373},"emin":{"cc":"CN","lat":46.53,"lng":83.63,"pop":57782},"xininglu":{"cc":"CN","lat":44.34,"lng":84.9,"pop":69361},"dunhuang":{"cc":"CN","lat":40.17,"lng":94.68,"pop":186027},"changji":{"cc":"CN","lat":44.01,"lng":87.3,"pop":198776},"baijiantan":{"cc":"CN","lat":45.69,"lng":85.14,"pop":93697},"alaer":{"cc":"CN","lat":40.54,"lng":81.27,"pop":126259},"jinshanlu":{"cc":"CN","lat":47.85,"lng":88.13,"pop":190064},"aqsu":{"cc":"CN","lat":41.18,"lng":80.28,"pop":535657},"liangji":{"cc":"CN","lat":33.96,"lng":117.97,"pop":52048},"lanshan":{"cc":"CN","lat":33.94,"lng":117.72,"pop":55442},"malingshan":{"cc":"CN","lat":34.2,"lng":118.36,"pop":52711},"gangshang":{"cc":"CN","lat":34.52,"lng":118.12,"pop":51114},"tangzhang":{"cc":"CN","lat":34.15,"lng":117.25,"pop":52985},"xuzhuang":{"cc":"CN","lat":34.3,"lng":117.46,"pop":56099},"nianzhuang":{"cc":"CN","lat":34.3,"lng":117.77,"pop":80617},"tashan":{"cc":"CN","lat":34.34,"lng":117.57,"pop":59162},"zizhuang":{"cc":"CN","lat":34.36,"lng":117.49,"pop":52063},"liuji":{"cc":"CN","lat":34.36,"lng":117.05,"pop":54785},"zhangzhuang":{"cc":"CN","lat":34.52,"lng":117.01,"pop":74114},"fanlou":{"cc":"CN","lat":34.48,"lng":116.85,"pop":62859},"songlou":{"cc":"CN","lat":34.57,"lng":116.6,"pop":79763},"zhuzhai":{"cc":"CN","lat":34.76,"lng":116.81,"pop":56908},"zhaozhuang":{"cc":"CN","lat":34.74,"lng":116.46,"pop":53193},"anguo":{"cc":"CN","lat":34.83,"lng":116.82,"pop":82181},"shizhai":{"cc":"CN","lat":34.81,"lng":116.64,"pop":62956},"yaxing":{"cc":"CN","lat":19.45,"lng":109.26,"pop":76427},"zunyi":{"cc":"CN","lat":27.69,"lng":106.91,"pop":2037775},"zoucheng":{"cc":"CN","lat":35.4,"lng":116.97,"pop":277400},"ziyang":{"cc":"CN","lat":30.12,"lng":104.65,"pop":905729},"zitong":{"cc":"CN","lat":30.18,"lng":105.83,"pop":212819},"zigong":{"cc":"CN","lat":29.34,"lng":104.78,"pop":1262064},"zhuzhou":{"cc":"CN","lat":27.83,"lng":113.15,"pop":1129687},"zhutuo":{"cc":"CN","lat":29.02,"lng":105.85,"pop":58262},"zhumadian":{"cc":"CN","lat":32.98,"lng":114.03,"pop":721670},"zhujing":{"cc":"CN","lat":30.9,"lng":121.16,"pop":120084},"zhujiajiao":{"cc":"CN","lat":31.11,"lng":121.06,"pop":60000},"zhuji":{"cc":"CN","lat":29.72,"lng":120.24,"pop":110721},"zhucheng":{"cc":"CN","lat":35.99,"lng":119.4,"pop":499285},"zhuanghe":{"cc":"CN","lat":39.7,"lng":122.99,"pop":80384},"zhoukou":{"cc":"CN","lat":33.63,"lng":114.63,"pop":505171},"zhoucun":{"cc":"CN","lat":36.82,"lng":117.82,"pop":122402},"yuxi":{"cc":"CN","lat":24.36,"lng":102.54,"pop":103829},"zhongxing":{"cc":"CN","lat":33.7,"lng":118.68,"pop":57338},"zhongxin":{"cc":"CN","lat":26.62,"lng":101.27,"pop":51866},"zhongwei":{"cc":"CN","lat":37.51,"lng":105.19,"pop":1174600},"zhongshu":{"cc":"CN","lat":24.52,"lng":103.77,"pop":91750},"zhonghe":{"cc":"CN","lat":28.45,"lng":108.99,"pop":105003},"zhongduo":{"cc":"CN","lat":28.85,"lng":108.76,"pop":93928},"gusong":{"cc":"CN","lat":28.31,"lng":105.24,"pop":87882},"zhicheng":{"cc":"CN","lat":30.3,"lng":111.5,"pop":159383},"zhenzhou":{"cc":"CN","lat":32.28,"lng":119.17,"pop":176006},"zhenxi":{"cc":"CN","lat":29.9,"lng":107.46,"pop":50017},"zhenping":{"cc":"CN","lat":33.03,"lng":112.23,"pop":181528},"zhenjiang":{"cc":"CN","lat":32.21,"lng":119.46,"pop":950516},"zhaobaoshan":{"cc":"CN","lat":29.97,"lng":121.69,"pop":61979},"zhengzhou":{"cc":"CN","lat":34.76,"lng":113.65,"pop":4253913},"zhengding":{"cc":"CN","lat":38.15,"lng":114.57,"pop":193524},"yongji":{"cc":"CN","lat":34.87,"lng":110.44,"pop":452000},"xinghua":{"cc":"CN","lat":32.94,"lng":119.83,"pop":105918},"zhaotong":{"cc":"CN","lat":27.32,"lng":103.72,"pop":787845},"zhaoqing":{"cc":"CN","lat":23.05,"lng":112.46,"pop":1553109},"zhaogezhuang":{"cc":"CN","lat":39.77,"lng":118.41,"pop":86555},"zhaodun":{"cc":"CN","lat":34.3,"lng":117.86,"pop":76691},"zhaoyuan":{"cc":"CN","lat":37.36,"lng":120.41,"pop":120000},"zhanjiang":{"cc":"CN","lat":21.23,"lng":110.39,"pop":1400709},"zhangzhou":{"cc":"CN","lat":24.51,"lng":117.66,"pop":589831},"zhangzhai":{"cc":"CN","lat":34.62,"lng":116.95,"pop":74433},"zhangye":{"cc":"CN","lat":38.93,"lng":100.45,"pop":507433},"zhangjiachuan":{"cc":"CN","lat":34.99,"lng":106.21,"pop":62497},"zhangji":{"cc":"CN","lat":34.14,"lng":117.38,"pop":61929},"zibo":{"cc":"CN","lat":36.79,"lng":118.06,"pop":3129228},"anyang":{"cc":"CN","lat":36.1,"lng":114.38,"pop":1146839},"zhabei":{"cc":"CN","lat":31.26,"lng":121.46,"pop":840000},"zaozhuang":{"cc":"CN","lat":34.86,"lng":117.55,"pop":899753},"zaoyang":{"cc":"CN","lat":32.13,"lng":112.75,"pop":184509},"yuyao":{"cc":"CN","lat":30.05,"lng":121.15,"pop":114177},"yuzhou":{"cc":"CN","lat":34.15,"lng":113.47,"pop":87961},"yuxia":{"cc":"CN","lat":34.06,"lng":108.63,"pop":60206},"kunshan":{"cc":"CN","lat":31.38,"lng":120.95,"pop":2092496},"yunyang":{"cc":"CN","lat":33.45,"lng":112.71,"pop":73922},"yunnanyi":{"cc":"CN","lat":25.42,"lng":100.69,"pop":93671},"yunmeng chengguanzhen":{"cc":"CN","lat":31.06,"lng":113.77,"pop":64390},"yunmen":{"cc":"CN","lat":30.08,"lng":106.32,"pop":68698},"jinghong":{"cc":"CN","lat":22.0,"lng":100.77,"pop":205523},"yunjin":{"cc":"CN","lat":29.08,"lng":105.64,"pop":54385},"pizhou":{"cc":"CN","lat":34.31,"lng":117.95,"pop":343421},"yunfu":{"cc":"CN","lat":22.93,"lng":112.04,"pop":2612800},"yuncheng":{"cc":"CN","lat":35.02,"lng":110.99,"pop":680036},"yulinshi":{"cc":"CN","lat":38.29,"lng":109.74,"pop":90870},"yulin":{"cc":"CN","lat":22.63,"lng":110.15,"pop":1056743},"wulingyuan":{"cc":"CN","lat":29.35,"lng":110.54,"pop":52712},"yuepu":{"cc":"CN","lat":31.43,"lng":121.42,"pop":139328},"yudong":{"cc":"CN","lat":29.39,"lng":106.52,"pop":81408},"yuci":{"cc":"CN","lat":37.68,"lng":112.73,"pop":235929},"yucheng":{"cc":"CN","lat":34.93,"lng":116.47,"pop":62365},"huaiyang":{"cc":"CN","lat":37.76,"lng":114.52,"pop":81861},"yuanshang":{"cc":"CN","lat":36.77,"lng":120.35,"pop":74253},"yuanping":{"cc":"CN","lat":38.72,"lng":112.76,"pop":82883},"qianjiang":{"cc":"CN","lat":30.42,"lng":112.89,"pop":179079},"heyuan":{"cc":"CN","lat":23.73,"lng":114.68,"pop":463907},"youxi":{"cc":"CN","lat":29.21,"lng":106.14,"pop":63386},"yongzhou":{"cc":"CN","lat":26.42,"lng":111.61,"pop":1020715},"yongqing":{"cc":"CN","lat":34.75,"lng":106.13,"pop":55595},"yongfeng":{"cc":"CN","lat":27.45,"lng":112.17,"pop":70783},"yongchuan":{"cc":"CN","lat":29.35,"lng":105.89,"pop":192954},"yongbei":{"cc":"CN","lat":26.65,"lng":100.78,"pop":60099},"yongan":{"cc":"CN","lat":31.02,"lng":109.46,"pop":144314},"yishui":{"cc":"CN","lat":35.78,"lng":118.63,"pop":94115},"yinma":{"cc":"CN","lat":36.66,"lng":119.46,"pop":83872},"zhongxiang":{"cc":"CN","lat":31.17,"lng":112.58,"pop":108883},"yingtan":{"cc":"CN","lat":28.23,"lng":117.0,"pop":214229},"yingshang chengguanzhen":{"cc":"CN","lat":32.63,"lng":116.27,"pop":61771},"chengzhong":{"cc":"CN","lat":30.94,"lng":113.55,"pop":265886},"yinchuan":{"cc":"CN","lat":38.47,"lng":106.27,"pop":1487579},"yima":{"cc":"CN","lat":34.74,"lng":111.88,"pop":82509},"yigou":{"cc":"CN","lat":35.81,"lng":114.32,"pop":59073},"qingzhou":{"cc":"CN","lat":36.7,"lng":118.48,"pop":236406},"yichun":{"cc":"CN","lat":27.83,"lng":114.4,"pop":1045952},"yicheng":{"cc":"CN","lat":31.7,"lng":112.26,"pop":61027},"yixing":{"cc":"CN","lat":31.36,"lng":119.82,"pop":1285785},"yichang":{"cc":"CN","lat":30.71,"lng":111.28,"pop":1350150},"yibin":{"cc":"CN","lat":28.76,"lng":104.64,"pop":836340},"yezhou":{"cc":"CN","lat":30.6,"lng":109.72,"pop":104839},"yeyuan":{"cc":"CN","lat":36.42,"lng":118.5,"pop":97936},"yatou":{"cc":"CN","lat":37.16,"lng":122.44,"pop":91517},"yashan":{"cc":"CN","lat":22.2,"lng":109.94,"pop":56629},"yaowan":{"cc":"CN","lat":34.18,"lng":118.07,"pop":60668},"yaoji":{"cc":"CN","lat":34.07,"lng":117.82,"pop":65897},"yanzhou":{"cc":"CN","lat":35.55,"lng":116.83,"pop":254788},"yantai":{"cc":"CN","lat":37.48,"lng":121.44,"pop":2227733},"yanliang":{"cc":"CN","lat":34.66,"lng":109.23,"pop":60891},"yanjia":{"cc":"CN","lat":29.83,"lng":107.0,"pop":72825},"yangzhou":{"cc":"CN","lat":32.4,"lng":119.44,"pop":1584237},"yangtun":{"cc":"CN","lat":34.88,"lng":116.88,"pop":53417},"yangshuo":{"cc":"CN","lat":24.78,"lng":110.49,"pop":300000},"zhangjiagang":{"cc":"CN","lat":31.86,"lng":120.54,"pop":1432044},"yangquan":{"cc":"CN","lat":37.86,"lng":113.56,"pop":731228},"yangpu":{"cc":"CN","lat":31.26,"lng":121.52,"pop":1210800},"yangliuqing":{"cc":"CN","lat":39.14,"lng":117.0,"pop":76387},"yanghe":{"cc":"CN","lat":38.28,"lng":106.25,"pop":67901},"yanghang":{"cc":"CN","lat":31.37,"lng":121.44,"pop":204564},"yanggu":{"cc":"CN","lat":36.11,"lng":115.78,"pop":74725},"yangcun":{"cc":"CN","lat":39.36,"lng":117.06,"pop":63756},"yancheng":{"cc":"CN","lat":33.36,"lng":120.16,"pop":1615717},"yanan":{"cc":"CN","lat":36.6,"lng":109.49,"pop":475234},"yaan":{"cc":"CN","lat":29.99,"lng":103.0,"pop":612056},"tongshan":{"cc":"CN","lat":34.18,"lng":117.16,"pop":329661},"xuyong":{"cc":"CN","lat":28.17,"lng":105.43,"pop":108352},"xucheng":{"cc":"CN","lat":20.33,"lng":110.17,"pop":83267},"shangrao":{"cc":"CN","lat":28.45,"lng":117.94,"pop":1116486},"xunyang":{"cc":"CN","lat":32.82,"lng":109.37,"pop":67929},"xunchang":{"cc":"CN","lat":28.45,"lng":104.71,"pop":118664},"xujiang":{"cc":"CN","lat":26.84,"lng":116.32,"pop":87459},"xuhui":{"cc":"CN","lat":31.2,"lng":121.45,"pop":1109800},"xuchang":{"cc":"CN","lat":34.03,"lng":113.86,"pop":1265536},"xuantan":{"cc":"CN","lat":29.21,"lng":105.57,"pop":69250},"xuancheng":{"cc":"CN","lat":30.95,"lng":118.76,"pop":774332},"xixiang":{"cc":"CN","lat":32.99,"lng":107.76,"pop":99867},"xiuying":{"cc":"CN","lat":20.0,"lng":110.29,"pop":290000},"xiulin":{"cc":"CN","lat":29.72,"lng":112.4,"pop":122411},"xiugu":{"cc":"CN","lat":27.91,"lng":116.78,"pop":81153},"xiongzhou":{"cc":"CN","lat":25.12,"lng":114.3,"pop":79050},"huayuan":{"cc":"CN","lat":28.29,"lng":117.21,"pop":73732},"xinzhou":{"cc":"CN","lat":38.41,"lng":112.73,"pop":544683},"xinzhi":{"cc":"CN","lat":36.5,"lng":111.7,"pop":72303},"xinzhai":{"cc":"CN","lat":36.4,"lng":118.62,"pop":100168},"xinyu":{"cc":"CN","lat":27.8,"lng":114.93,"pop":839488},"xinye":{"cc":"CN","lat":32.53,"lng":112.37,"pop":61633},"xinyang":{"cc":"CN","lat":32.12,"lng":114.07,"pop":1230042},"xinxiang":{"cc":"CN","lat":35.19,"lng":113.8,"pop":1047088},"xintai":{"cc":"CN","lat":35.9,"lng":117.75,"pop":222459},"xinshi":{"cc":"CN","lat":31.05,"lng":113.14,"pop":98422},"xinqiao":{"cc":"CN","lat":31.07,"lng":121.31,"pop":155856},"xinji":{"cc":"CN","lat":37.93,"lng":115.22,"pop":145911},"xining":{"cc":"CN","lat":36.63,"lng":101.76,"pop":1677177},"shangmei":{"cc":"CN","lat":27.74,"lng":111.3,"pop":75233},"xinhe":{"cc":"CN","lat":36.92,"lng":119.59,"pop":69884},"xingtai":{"cc":"CN","lat":37.06,"lng":114.49,"pop":798770},"xingren":{"cc":"CN","lat":25.43,"lng":105.23,"pop":91579},"xingguo":{"cc":"CN","lat":34.86,"lng":105.67,"pop":95211},"ankang":{"cc":"CN","lat":32.68,"lng":109.02,"pop":870126},"xindian":{"cc":"CN","lat":36.8,"lng":118.29,"pop":82555},"xindi":{"cc":"CN","lat":29.82,"lng":113.47,"pop":175761},"feicheng":{"cc":"CN","lat":35.26,"lng":117.97,"pop":80929},"xinyi":{"cc":"CN","lat":34.38,"lng":118.35,"pop":300511},"sanshui":{"cc":"CN","lat":23.15,"lng":112.89,"pop":153714},"ximeicun":{"cc":"CN","lat":24.99,"lng":118.39,"pop":94326},"wacheng neighborhood":{"cc":"CN","lat":33.78,"lng":114.52,"pop":66848},"xihe":{"cc":"CN","lat":31.69,"lng":113.47,"pop":90422},"xigang":{"cc":"CN","lat":38.55,"lng":106.35,"pop":112061},"xiema":{"cc":"CN","lat":29.77,"lng":106.37,"pop":60933},"xichang":{"cc":"CN","lat":27.9,"lng":102.26,"pop":481796},"xiazhuang":{"cc":"CN","lat":36.45,"lng":119.84,"pop":88710},"xiazhen":{"cc":"CN","lat":34.8,"lng":117.11,"pop":125667},"haining":{"cc":"CN","lat":30.54,"lng":120.69,"pop":70171},"gongyi":{"cc":"CN","lat":34.76,"lng":113.01,"pop":56033},"xiaoweizhai":{"cc":"CN","lat":26.19,"lng":107.51,"pop":58913},"xiaoshan":{"cc":"CN","lat":30.17,"lng":120.26,"pop":95234},"xiaolingwei":{"cc":"CN","lat":32.03,"lng":118.85,"pop":66031},"jinfeng":{"cc":"CN","lat":28.24,"lng":116.6,"pop":127076},"xiaogan":{"cc":"CN","lat":30.93,"lng":113.92,"pop":908266},"xianyang":{"cc":"CN","lat":34.34,"lng":108.7,"pop":1034081},"xiantao":{"cc":"CN","lat":30.37,"lng":113.44,"pop":239406},"xianshuigu":{"cc":"CN","lat":38.98,"lng":117.38,"pop":74028},"xiannue":{"cc":"CN","lat":32.43,"lng":119.56,"pop":83936},"xiann":{"cc":"CN","lat":32.43,"lng":119.56,"pop":83936},"xianning":{"cc":"CN","lat":29.84,"lng":114.32,"pop":512517},"xianju":{"cc":"CN","lat":28.85,"lng":120.73,"pop":61532},"xiangzhou":{"cc":"CN","lat":36.16,"lng":119.42,"pop":61748},"zhuhai":{"cc":"CN","lat":22.28,"lng":113.57,"pop":2207090},"xiangcheng":{"cc":"CN","lat":25.47,"lng":100.56,"pop":121959},"wenxing":{"cc":"CN","lat":28.68,"lng":112.88,"pop":57117},"xiangxiang":{"cc":"CN","lat":27.73,"lng":112.53,"pop":87592},"xiangtan":{"cc":"CN","lat":27.85,"lng":112.9,"pop":959303},"xiangyang":{"cc":"CN","lat":32.04,"lng":112.14,"pop":1294733},"xian":{"cc":"CN","lat":34.26,"lng":108.93,"pop":9600000},"xiamen":{"cc":"CN","lat":24.48,"lng":118.08,"pop":4617251},"wuzhou":{"cc":"CN","lat":23.48,"lng":111.29,"pop":761948},"wuzhong":{"cc":"CN","lat":37.99,"lng":106.2,"pop":7202654},"wuzhen":{"cc":"CN","lat":30.75,"lng":120.49,"pop":60000},"wuyang":{"cc":"CN","lat":31.99,"lng":116.25,"pop":79070},"wuxue":{"cc":"CN","lat":29.85,"lng":115.55,"pop":220661},"wushan":{"cc":"CN","lat":31.08,"lng":109.88,"pop":117873},"wuxi":{"cc":"CN","lat":31.57,"lng":120.29,"pop":4396835},"dongyang":{"cc":"CN","lat":29.27,"lng":120.23,"pop":130387},"changde":{"cc":"CN","lat":29.03,"lng":111.7,"pop":1457419},"wujing":{"cc":"CN","lat":36.45,"lng":118.4,"pop":60260},"wuhu":{"cc":"CN","lat":31.35,"lng":118.43,"pop":1598165},"wuhan":{"cc":"CN","lat":30.58,"lng":114.27,"pop":10392693},"wuhai":{"cc":"CN","lat":39.68,"lng":106.82,"pop":218427},"wugang":{"cc":"CN","lat":26.73,"lng":110.63,"pop":132457},"wuda":{"cc":"CN","lat":39.5,"lng":106.71,"pop":129922},"wucheng":{"cc":"CN","lat":29.6,"lng":118.17,"pop":60212},"wenzhou":{"cc":"CN","lat":28.0,"lng":120.67,"pop":2650000},"wenshang":{"cc":"CN","lat":35.73,"lng":116.5,"pop":59455},"wenling":{"cc":"CN","lat":28.38,"lng":121.38,"pop":67433},"wenjiang":{"cc":"CN","lat":28.39,"lng":104.56,"pop":68433},"tianfu":{"cc":"CN","lat":37.26,"lng":122.05,"pop":115370},"wenchang":{"cc":"CN","lat":19.55,"lng":110.8,"pop":560894},"weinan":{"cc":"CN","lat":34.5,"lng":109.51,"pop":1199290},"weimiao":{"cc":"CN","lat":34.58,"lng":117.07,"pop":51820},"weihai":{"cc":"CN","lat":37.51,"lng":122.11,"pop":844310},"weifang":{"cc":"CN","lat":36.71,"lng":119.1,"pop":2044028},"wayaobu":{"cc":"CN","lat":37.14,"lng":109.66,"pop":113698},"wanxian":{"cc":"CN","lat":30.82,"lng":108.37,"pop":859662},"wansheng":{"cc":"CN","lat":28.96,"lng":106.93,"pop":113751},"wanning":{"cc":"CN","lat":18.8,"lng":110.38,"pop":545992},"wangji":{"cc":"CN","lat":33.98,"lng":117.75,"pop":54578},"yinzhu":{"cc":"CN","lat":35.88,"lng":119.98,"pop":75656},"wafangdian":{"cc":"CN","lat":39.62,"lng":122.01,"pop":454338},"huangshan":{"cc":"CN","lat":29.71,"lng":118.31,"pop":460786},"loushanguan":{"cc":"CN","lat":28.14,"lng":106.82,"pop":80344},"tongzhou":{"cc":"CN","lat":39.9,"lng":116.66,"pop":163326},"fuding":{"cc":"CN","lat":27.33,"lng":120.21,"pop":192352},"tongren":{"cc":"CN","lat":35.51,"lng":102.02,"pop":103700},"tongling":{"cc":"CN","lat":30.95,"lng":117.78,"pop":402062},"tongchuan":{"cc":"CN","lat":34.9,"lng":108.95,"pop":417740},"tiefu":{"cc":"CN","lat":34.53,"lng":118.03,"pop":87689},"tianzhuang":{"cc":"CN","lat":36.8,"lng":119.74,"pop":64957},"tianshui":{"cc":"CN","lat":34.58,"lng":105.74,"pop":1212791},"tianpeng":{"cc":"CN","lat":30.99,"lng":103.94,"pop":60797},"tianliu":{"cc":"CN","lat":37.0,"lng":118.78,"pop":67165},"tianjin":{"cc":"CN","lat":39.14,"lng":117.18,"pop":11090314},"chengtangcun":{"cc":"CN","lat":35.08,"lng":117.19,"pop":105456},"taozhuang":{"cc":"CN","lat":34.85,"lng":117.33,"pop":60137},"taozhou":{"cc":"CN","lat":30.91,"lng":119.41,"pop":146610},"taoluo":{"cc":"CN","lat":35.27,"lng":119.37,"pop":61852},"tantou":{"cc":"CN","lat":22.75,"lng":113.83,"pop":320304},"tangzhai":{"cc":"CN","lat":34.43,"lng":116.59,"pop":67936},"tangwu":{"cc":"CN","lat":36.45,"lng":118.86,"pop":93260},"tangshan":{"cc":"CN","lat":39.64,"lng":118.18,"pop":3372102},"tangping":{"cc":"CN","lat":22.03,"lng":111.94,"pop":81729},"tangjiazhuang":{"cc":"CN","lat":39.74,"lng":118.45,"pop":79489},"tanghe":{"cc":"CN","lat":32.69,"lng":112.83,"pop":278055},"tanggu":{"cc":"CN","lat":39.02,"lng":117.65,"pop":535298},"taizhou":{"cc":"CN","lat":32.49,"lng":119.91,"pop":1607108},"taiyuan":{"cc":"CN","lat":37.87,"lng":112.56,"pop":4303673},"taixing":{"cc":"CN","lat":32.17,"lng":120.01,"pop":79655},"taihe":{"cc":"CN","lat":30.1,"lng":106.05,"pop":66506},"taishan":{"cc":"CN","lat":22.25,"lng":112.78,"pop":145440},"taicang":{"cc":"CN","lat":31.45,"lng":121.09,"pop":831113},"taian":{"cc":"CN","lat":36.19,"lng":117.12,"pop":1735425},"suzhou":{"cc":"CN","lat":31.3,"lng":120.6,"pop":6715559},"suyangshan":{"cc":"CN","lat":34.39,"lng":117.76,"pop":65333},"suqian":{"cc":"CN","lat":33.95,"lng":118.3,"pop":1437685},"suozhen":{"cc":"CN","lat":36.95,"lng":118.1,"pop":58766},"suizhou":{"cc":"CN","lat":31.71,"lng":113.36,"pop":618582},"suixi":{"cc":"CN","lat":33.89,"lng":116.77,"pop":74172},"suicheng":{"cc":"CN","lat":33.9,"lng":117.93,"pop":256665},"suining":{"cc":"CN","lat":30.51,"lng":105.57,"pop":656760},"songnan":{"cc":"CN","lat":31.35,"lng":121.48,"pop":127347},"songjiang":{"cc":"CN","lat":31.03,"lng":121.22,"pop":1973500},"songcheng":{"cc":"CN","lat":26.88,"lng":120.0,"pop":165730},"shangsi":{"cc":"CN","lat":22.16,"lng":107.98,"pop":71468},"sitou":{"cc":"CN","lat":36.31,"lng":118.41,"pop":56289},"sishui":{"cc":"CN","lat":35.65,"lng":117.28,"pop":90175},"puer":{"cc":"CN","lat":22.79,"lng":100.97,"pop":296565},"shuozhou":{"cc":"CN","lat":39.32,"lng":112.42,"pop":433700},"shuizhai":{"cc":"CN","lat":23.93,"lng":115.76,"pop":140493},"shuikou":{"cc":"CN","lat":23.98,"lng":115.9,"pop":62321},"shuijiang":{"cc":"CN","lat":29.25,"lng":107.28,"pop":50918},"laixi":{"cc":"CN","lat":36.86,"lng":120.53,"pop":341470},"shouxian":{"cc":"CN","lat":34.85,"lng":116.46,"pop":76030},"shouguang":{"cc":"CN","lat":36.88,"lng":118.74,"pop":473620},"huinong":{"cc":"CN","lat":39.23,"lng":106.77,"pop":136570},"shizilu":{"cc":"CN","lat":35.17,"lng":118.83,"pop":86749},"shiyan":{"cc":"CN","lat":32.65,"lng":110.78,"pop":3460000},"shiwan":{"cc":"CN","lat":23.0,"lng":113.08,"pop":82031},"shitanjing":{"cc":"CN","lat":39.23,"lng":106.34,"pop":78765},"shiquan":{"cc":"CN","lat":33.04,"lng":108.24,"pop":53422},"shiqiaozi":{"cc":"CN","lat":36.16,"lng":119.26,"pop":58538},"shiqiao":{"cc":"CN","lat":22.95,"lng":113.36,"pop":135308},"shiqi":{"cc":"CN","lat":22.52,"lng":113.39,"pop":342306},"shima":{"cc":"CN","lat":28.99,"lng":105.92,"pop":69881},"shilong":{"cc":"CN","lat":23.11,"lng":113.85,"pop":109733},"tongchuanshi":{"cc":"CN","lat":35.07,"lng":109.08,"pop":223603},"shikang":{"cc":"CN","lat":21.77,"lng":109.32,"pop":64818},"shijiazhuang":{"cc":"CN","lat":38.04,"lng":114.48,"pop":3938513},"shibuzi":{"cc":"CN","lat":36.12,"lng":119.1,"pop":58333},"shenzhen":{"cc":"CN","lat":22.55,"lng":114.07,"pop":17494398},"yanta":{"cc":"CN","lat":36.24,"lng":115.67,"pop":79196},"shenjiamen":{"cc":"CN","lat":29.96,"lng":122.3,"pop":95433},"shaping":{"cc":"CN","lat":22.77,"lng":112.96,"pop":107589},"shaoxing":{"cc":"CN","lat":30.0,"lng":120.58,"pop":2300000},"shaowu":{"cc":"CN","lat":27.34,"lng":117.48,"pop":112585},"shaoshan":{"cc":"CN","lat":27.92,"lng":112.52,"pop":118000},"shaoguan":{"cc":"CN","lat":24.8,"lng":113.58,"pop":1028460},"shancheng":{"cc":"CN","lat":34.8,"lng":116.08,"pop":74459},"shanwei":{"cc":"CN","lat":22.78,"lng":115.35,"pop":491766},"shantou":{"cc":"CN","lat":23.35,"lng":116.68,"pop":3838900},"shanting":{"cc":"CN","lat":35.08,"lng":117.46,"pop":80843},"shankou":{"cc":"CN","lat":21.6,"lng":109.72,"pop":70153},"shanji":{"cc":"CN","lat":34.2,"lng":117.6,"pop":50617},"shangluo":{"cc":"CN","lat":33.87,"lng":109.93,"pop":531696},"shangqiu":{"cc":"CN","lat":34.41,"lng":115.66,"pop":1859723},"shangkou":{"cc":"CN","lat":36.97,"lng":118.88,"pop":65770},"shanghai":{"cc":"CN","lat":31.22,"lng":121.46,"pop":24874500},"shajing":{"cc":"CN","lat":22.75,"lng":113.82,"pop":127089},"shahecheng":{"cc":"CN","lat":36.94,"lng":114.51,"pop":125132},"sanzhuang":{"cc":"CN","lat":35.5,"lng":119.17,"pop":52214},"sanya":{"cc":"CN","lat":18.25,"lng":109.51,"pop":1031396},"sanming":{"cc":"CN","lat":26.25,"lng":117.62,"pop":602166},"sanmenxia":{"cc":"CN","lat":34.78,"lng":111.19,"pop":669307},"sanhui":{"cc":"CN","lat":30.08,"lng":106.59,"pop":51413},"sanhe":{"cc":"CN","lat":39.98,"lng":117.07,"pop":965075},"changsha":{"cc":"CN","lat":28.2,"lng":112.97,"pop":3093980},"runan":{"cc":"CN","lat":33.0,"lng":114.35,"pop":60202},"ruian":{"cc":"CN","lat":27.78,"lng":120.66,"pop":927383},"fuqing":{"cc":"CN","lat":25.73,"lng":119.37,"pop":67397},"jieyang":{"cc":"CN","lat":23.54,"lng":116.37,"pop":1899394},"renzhao":{"cc":"CN","lat":36.64,"lng":120.2,"pop":64569},"renqiu":{"cc":"CN","lat":38.71,"lng":116.1,"pop":98569},"quzhou":{"cc":"CN","lat":28.96,"lng":118.87,"pop":902767},"qujing":{"cc":"CN","lat":25.48,"lng":103.78,"pop":1408500},"qufu":{"cc":"CN","lat":35.6,"lng":116.99,"pop":85144},"quanzhou":{"cc":"CN","lat":24.91,"lng":118.59,"pop":1469157},"zhuangyuan":{"cc":"CN","lat":37.31,"lng":120.83,"pop":79106},"qiuji":{"cc":"CN","lat":33.8,"lng":118.0,"pop":76343},"qishan":{"cc":"CN","lat":29.84,"lng":117.72,"pop":55500},"qiongshan":{"cc":"CN","lat":20.01,"lng":110.35,"pop":87657},"qionghu":{"cc":"CN","lat":28.84,"lng":112.36,"pop":66145},"qinzhou":{"cc":"CN","lat":21.98,"lng":108.65,"pop":1296300},"qinnan":{"cc":"CN","lat":33.25,"lng":119.91,"pop":55975},"qinhuangdao":{"cc":"CN","lat":39.94,"lng":119.59,"pop":759718},"yizhou":{"cc":"CN","lat":24.5,"lng":108.67,"pop":155872},"jinjiang":{"cc":"CN","lat":24.82,"lng":118.57,"pop":1416151},"qingshuping":{"cc":"CN","lat":27.38,"lng":112.02,"pop":62000},"qingquan":{"cc":"CN","lat":30.45,"lng":115.26,"pop":76154},"qingpu":{"cc":"CN","lat":31.15,"lng":121.11,"pop":1271424},"huaian":{"cc":"CN","lat":33.59,"lng":119.02,"pop":2494013},"qingfu":{"cc":"CN","lat":28.44,"lng":104.52,"pop":56650},"qingdao":{"cc":"CN","lat":36.06,"lng":120.38,"pop":7172451},"qingyuan":{"cc":"CN","lat":23.7,"lng":113.03,"pop":1738424},"qincheng":{"cc":"CN","lat":27.21,"lng":116.53,"pop":99987},"hongqiao":{"cc":"CN","lat":26.77,"lng":112.11,"pop":58287},"qibao":{"cc":"CN","lat":31.15,"lng":121.36,"pop":283352},"qiaotou":{"cc":"CN","lat":36.94,"lng":101.67,"pop":114712},"qiaoguan":{"cc":"CN","lat":36.56,"lng":118.88,"pop":82467},"puyang chengguanzhen":{"cc":"CN","lat":35.71,"lng":115.03,"pop":104994},"puyang":{"cc":"CN","lat":29.46,"lng":119.89,"pop":3590000},"putuo":{"cc":"CN","lat":31.25,"lng":121.39,"pop":1239100},"putian":{"cc":"CN","lat":25.44,"lng":119.01,"pop":1539389},"puji":{"cc":"CN","lat":36.13,"lng":119.72,"pop":52563},"puqi":{"cc":"CN","lat":29.72,"lng":113.88,"pop":132891},"yongning":{"cc":"CN","lat":22.76,"lng":108.48,"pop":61690},"pulandian":{"cc":"CN","lat":39.4,"lng":121.97,"pop":104277},"pudong":{"cc":"CN","lat":31.24,"lng":121.5,"pop":5681512},"poyang":{"cc":"CN","lat":28.99,"lng":116.67,"pop":70787},"pingyin":{"cc":"CN","lat":36.28,"lng":116.45,"pop":62050},"pingyi":{"cc":"CN","lat":35.5,"lng":117.63,"pop":78254},"pingxiang":{"cc":"CN","lat":27.62,"lng":113.85,"pop":893550},"pingshan":{"cc":"CN","lat":22.99,"lng":114.71,"pop":113631},"pingnan":{"cc":"CN","lat":23.54,"lng":110.39,"pop":62483},"pingliang":{"cc":"CN","lat":35.54,"lng":106.69,"pop":504848},"pingjin":{"cc":"CN","lat":30.61,"lng":107.54,"pop":55139},"pingdu":{"cc":"CN","lat":36.78,"lng":119.95,"pop":542234},"pingdingshan":{"cc":"CN","lat":33.73,"lng":113.32,"pop":979130},"pengze":{"cc":"CN","lat":29.9,"lng":116.55,"pop":350000},"pengpu":{"cc":"CN","lat":31.29,"lng":121.44,"pop":152725},"pengcheng":{"cc":"CN","lat":36.43,"lng":114.17,"pop":68442},"peicheng":{"cc":"CN","lat":34.74,"lng":116.92,"pop":195363},"picheng":{"cc":"CN","lat":34.47,"lng":117.97,"pop":64585},"panlong":{"cc":"CN","lat":29.5,"lng":105.37,"pop":51177},"panan":{"cc":"CN","lat":34.75,"lng":105.11,"pop":70072},"guangan":{"cc":"CN","lat":30.47,"lng":106.64,"pop":858159},"ningyang":{"cc":"CN","lat":35.76,"lng":116.79,"pop":82994},"yutan":{"cc":"CN","lat":28.26,"lng":112.56,"pop":55312},"hanyuan":{"cc":"CN","lat":32.83,"lng":106.25,"pop":50440},"ninghai":{"cc":"CN","lat":29.29,"lng":121.42,"pop":68330},"ninger":{"cc":"CN","lat":23.04,"lng":101.04,"pop":162711},"ningbo":{"cc":"CN","lat":29.88,"lng":121.55,"pop":3731203},"nianbo":{"cc":"CN","lat":36.48,"lng":102.42,"pop":260184},"neijiang":{"cc":"CN","lat":29.58,"lng":105.06,"pop":1251095},"nanzhou":{"cc":"CN","lat":29.36,"lng":112.41,"pop":54449},"nanzhang chengguanzhen":{"cc":"CN","lat":31.78,"lng":111.83,"pop":83604},"nanyang":{"cc":"CN","lat":33.01,"lng":112.55,"pop":1811812},"nanxi":{"cc":"CN","lat":28.84,"lng":104.98,"pop":96061},"nantong":{"cc":"CN","lat":32.03,"lng":120.87,"pop":2273326},"nanqiao":{"cc":"CN","lat":30.92,"lng":121.45,"pop":361185},"pucheng":{"cc":"CN","lat":27.92,"lng":118.53,"pop":59832},"nanping":{"cc":"CN","lat":26.64,"lng":118.17,"pop":467875},"nanning":{"cc":"CN","lat":22.82,"lng":108.32,"pop":3839800},"nanma":{"cc":"CN","lat":36.18,"lng":118.15,"pop":74406},"nanlong":{"cc":"CN","lat":31.35,"lng":106.06,"pop":63405},"nanjing":{"cc":"CN","lat":32.06,"lng":118.78,"pop":9314685},"nanjian":{"cc":"CN","lat":25.04,"lng":100.51,"pop":50083},"nanhu":{"cc":"CN","lat":35.49,"lng":119.35,"pop":61034},"nangong":{"cc":"CN","lat":37.35,"lng":115.39,"pop":82386},"nanfeng":{"cc":"CN","lat":23.73,"lng":111.8,"pop":86129},"nandu":{"cc":"CN","lat":22.85,"lng":110.82,"pop":61881},"nanding":{"cc":"CN","lat":36.75,"lng":118.06,"pop":85495},"nancun":{"cc":"CN","lat":36.53,"lng":120.13,"pop":124210},"nanchong":{"cc":"CN","lat":30.8,"lng":106.08,"pop":1858875},"nanchang":{"cc":"CN","lat":28.68,"lng":115.85,"pop":2357839},"nanbin":{"cc":"CN","lat":30.0,"lng":108.11,"pop":118597},"nada":{"cc":"CN","lat":19.52,"lng":109.58,"pop":256652},"miyang":{"cc":"CN","lat":24.4,"lng":103.44,"pop":72485},"minhang":{"cc":"CN","lat":31.11,"lng":121.37,"pop":2716600},"mingshui":{"cc":"CN","lat":36.72,"lng":117.5,"pop":114858},"mingguang":{"cc":"CN","lat":32.78,"lng":117.96,"pop":68351},"minggang":{"cc":"CN","lat":32.46,"lng":114.05,"pop":67945},"mingcun":{"cc":"CN","lat":36.75,"lng":119.64,"pop":53926},"micheng":{"cc":"CN","lat":25.34,"lng":100.49,"pop":89144},"miaohang":{"cc":"CN","lat":31.32,"lng":121.44,"pop":89615},"mianyang":{"cc":"CN","lat":31.47,"lng":104.68,"pop":1550000},"mentougou":{"cc":"CN","lat":39.94,"lng":116.09,"pop":197772},"mengyin":{"cc":"CN","lat":35.71,"lng":117.93,"pop":65889},"mengcheng chengguanzhen":{"cc":"CN","lat":33.27,"lng":116.57,"pop":69916},"meizhou":{"cc":"CN","lat":24.29,"lng":116.12,"pop":992351},"meishan":{"cc":"CN","lat":30.04,"lng":103.84,"pop":1107742},"wuchuan":{"cc":"CN","lat":21.46,"lng":110.77,"pop":104168},"maoming":{"cc":"CN","lat":21.67,"lng":110.91,"pop":1307802},"maocun":{"cc":"CN","lat":34.38,"lng":117.25,"pop":57649},"majie":{"cc":"CN","lat":25.03,"lng":102.64,"pop":131696},"zhijiang":{"cc":"CN","lat":30.42,"lng":111.75,"pop":60169},"macheng":{"cc":"CN","lat":31.18,"lng":115.02,"pop":126366},"maba":{"cc":"CN","lat":24.68,"lng":113.6,"pop":113609},"maanshan":{"cc":"CN","lat":31.69,"lng":118.51,"pop":741531},"luzhou":{"cc":"CN","lat":28.89,"lng":105.43,"pop":998900},"lshun":{"cc":"CN","lat":38.8,"lng":121.27,"pop":82345},"lueshun":{"cc":"CN","lat":38.8,"lng":121.27,"pop":82345},"lushar":{"cc":"CN","lat":36.48,"lng":101.56,"pop":67153},"luoyang":{"cc":"CN","lat":34.67,"lng":112.44,"pop":1390581},"luorong":{"cc":"CN","lat":24.41,"lng":109.61,"pop":67593},"luomen":{"cc":"CN","lat":34.75,"lng":105.02,"pop":89998},"luojing":{"cc":"CN","lat":31.48,"lng":121.34,"pop":54329},"luojiang":{"cc":"CN","lat":31.3,"lng":104.5,"pop":212186},"luohuang":{"cc":"CN","lat":29.35,"lng":106.44,"pop":71515},"luohe":{"cc":"CN","lat":33.57,"lng":114.03,"pop":1294974},"luodian":{"cc":"CN","lat":31.42,"lng":121.33,"pop":118323},"luocheng":{"cc":"CN","lat":29.38,"lng":104.03,"pop":73581},"lulou":{"cc":"CN","lat":34.72,"lng":116.77,"pop":63704},"lucheng":{"cc":"CN","lat":31.23,"lng":117.28,"pop":89119},"leyang chengguanzhen":{"cc":"CN","lat":33.33,"lng":106.15,"pop":67496},"lueeyang chengguanzhen":{"cc":"CN","lat":33.33,"lng":106.15,"pop":67496},"kangding":{"cc":"CN","lat":30.0,"lng":101.96,"pop":100000},"lubu":{"cc":"CN","lat":23.17,"lng":112.28,"pop":95820},"luancheng":{"cc":"CN","lat":37.88,"lng":114.65,"pop":597130},"luan":{"cc":"CN","lat":31.74,"lng":116.52,"pop":1644344},"loudi":{"cc":"CN","lat":27.73,"lng":111.99,"pop":497171},"longyan":{"cc":"CN","lat":25.07,"lng":117.02,"pop":1025087},"longtan":{"cc":"CN","lat":28.76,"lng":108.96,"pop":57769},"longshui":{"cc":"CN","lat":29.57,"lng":105.76,"pop":121609},"longshi":{"cc":"CN","lat":30.21,"lng":106.46,"pop":56142},"longquan":{"cc":"CN","lat":24.67,"lng":102.16,"pop":91534},"longgang":{"cc":"CN","lat":22.72,"lng":114.26,"pop":215273},"longgu":{"cc":"CN","lat":34.9,"lng":116.81,"pop":59086},"longfeng":{"cc":"CN","lat":46.53,"lng":125.1,"pop":152074},"licheng":{"cc":"CN","lat":23.3,"lng":113.82,"pop":172775},"lixian":{"cc":"CN","lat":34.19,"lng":105.17,"pop":58300},"guankou":{"cc":"CN","lat":28.16,"lng":113.63,"pop":1380000},"liuxin":{"cc":"CN","lat":34.37,"lng":117.11,"pop":65258},"puning":{"cc":"CN","lat":23.31,"lng":116.17,"pop":874954},"liuquan":{"cc":"CN","lat":34.43,"lng":117.3,"pop":51657},"lishui":{"cc":"CN","lat":28.46,"lng":119.91,"pop":451418},"lishi":{"cc":"CN","lat":29.08,"lng":106.26,"pop":66620},"lintong":{"cc":"CN","lat":34.38,"lng":109.21,"pop":75882},"liuzhou":{"cc":"CN","lat":24.32,"lng":109.41,"pop":1436599},"linyi":{"cc":"CN","lat":35.06,"lng":118.34,"pop":2743843},"linxia chengguanzhen":{"cc":"CN","lat":35.6,"lng":103.21,"pop":274466},"linxi":{"cc":"CN","lat":39.71,"lng":118.45,"pop":100316},"linshui":{"cc":"CN","lat":36.42,"lng":114.2,"pop":109955},"linqu":{"cc":"CN","lat":36.52,"lng":118.54,"pop":299646},"linqiong":{"cc":"CN","lat":30.42,"lng":103.46,"pop":55587},"qingnian":{"cc":"CN","lat":36.84,"lng":115.71,"pop":110046},"linping":{"cc":"CN","lat":30.42,"lng":120.3,"pop":78180},"linjiang":{"cc":"CN","lat":31.1,"lng":108.22,"pop":71149},"linjiacun":{"cc":"CN","lat":35.99,"lng":119.65,"pop":88509},"linghe":{"cc":"CN","lat":36.36,"lng":119.08,"pop":99069},"lingcheng":{"cc":"CN","lat":33.82,"lng":118.11,"pop":53841},"beiliu":{"cc":"CN","lat":22.71,"lng":110.35,"pop":199769},"lingao":{"cc":"CN","lat":19.91,"lng":109.69,"pop":64874},"linfen":{"cc":"CN","lat":36.09,"lng":111.52,"pop":959198},"lincang":{"cc":"CN","lat":23.88,"lng":100.09,"pop":323708},"xishan":{"cc":"CN","lat":27.67,"lng":113.5,"pop":98162},"ligezhuang":{"cc":"CN","lat":36.36,"lng":120.14,"pop":65714},"lidu":{"cc":"CN","lat":29.74,"lng":107.29,"pop":88124},"lichuan":{"cc":"CN","lat":30.3,"lng":108.85,"pop":120587},"licha":{"cc":"CN","lat":36.06,"lng":119.78,"pop":55140},"liaolan":{"cc":"CN","lat":36.67,"lng":119.88,"pop":84306},"liaocheng":{"cc":"CN","lat":36.45,"lng":116.0,"pop":1229768},"lianzhou":{"cc":"CN","lat":24.78,"lng":112.37,"pop":92827},"hepu":{"cc":"CN","lat":21.66,"lng":109.2,"pop":192813},"anning":{"cc":"CN","lat":24.92,"lng":102.48,"pop":106795},"wuwei":{"cc":"CN","lat":37.93,"lng":102.63,"pop":1010295},"liangzhai":{"cc":"CN","lat":34.5,"lng":116.75,"pop":54742},"liangxiang":{"cc":"CN","lat":39.74,"lng":116.13,"pop":76744},"jiangbei":{"cc":"CN","lat":29.73,"lng":106.64,"pop":60466},"liancheng":{"cc":"CN","lat":25.72,"lng":116.75,"pop":60504},"lianjiang":{"cc":"CN","lat":21.65,"lng":110.28,"pop":100341},"leshan":{"cc":"CN","lat":29.56,"lng":103.76,"pop":662814},"lengshuitan":{"cc":"CN","lat":26.41,"lng":111.6,"pop":88935},"lengshuijiang":{"cc":"CN","lat":27.69,"lng":111.43,"pop":115399},"leiyang":{"cc":"CN","lat":26.4,"lng":112.86,"pop":129116},"lecheng":{"cc":"CN","lat":25.13,"lng":113.35,"pop":124268},"laohekou":{"cc":"CN","lat":32.39,"lng":111.67,"pop":253112},"lanzhou":{"cc":"CN","lat":36.06,"lng":103.84,"pop":3000000},"lanxi":{"cc":"CN","lat":29.22,"lng":119.47,"pop":73706},"lianyuan":{"cc":"CN","lat":27.69,"lng":111.66,"pop":66501},"langfang":{"cc":"CN","lat":39.52,"lng":116.71,"pop":868066},"laizhou":{"cc":"CN","lat":37.18,"lng":119.94,"pop":188000},"laiyang":{"cc":"CN","lat":36.98,"lng":120.71,"pop":169594},"laiwu":{"cc":"CN","lat":36.19,"lng":117.66,"pop":989535},"laibin":{"cc":"CN","lat":23.75,"lng":109.22,"pop":910282},"kunyang":{"cc":"CN","lat":27.67,"lng":120.57,"pop":65009},"kunming":{"cc":"CN","lat":25.04,"lng":102.72,"pop":3855346},"kaiyuan":{"cc":"CN","lat":23.7,"lng":103.3,"pop":198423},"kaili":{"cc":"CN","lat":26.59,"lng":107.98,"pop":275745},"kaihua":{"cc":"CN","lat":23.37,"lng":104.28,"pop":64404},"kaifeng":{"cc":"CN","lat":34.8,"lng":114.31,"pop":1451741},"juye":{"cc":"CN","lat":35.39,"lng":116.07,"pop":58107},"junlian":{"cc":"CN","lat":28.17,"lng":104.51,"pop":80708},"juegang":{"cc":"CN","lat":32.32,"lng":121.19,"pop":73317},"jiyuan":{"cc":"CN","lat":35.09,"lng":112.59,"pop":242143},"jizhou":{"cc":"CN","lat":37.55,"lng":115.57,"pop":362013},"jiujiang":{"cc":"CN","lat":29.7,"lng":116.0,"pop":1164268},"jiudian":{"cc":"CN","lat":36.99,"lng":120.2,"pop":97604},"jishui":{"cc":"CN","lat":33.73,"lng":115.4,"pop":77540},"jishou":{"cc":"CN","lat":28.32,"lng":109.73,"pop":102332},"jinzhou":{"cc":"CN","lat":41.11,"lng":121.14,"pop":604269},"jinxiang":{"cc":"CN","lat":27.43,"lng":120.61,"pop":84231},"jinshi":{"cc":"CN","lat":29.6,"lng":111.87,"pop":82906},"jinsha":{"cc":"CN","lat":32.09,"lng":121.07,"pop":95647},"jinji":{"cc":"CN","lat":23.23,"lng":110.83,"pop":56816},"jining":{"cc":"CN","lat":35.41,"lng":116.58,"pop":1241012},"jingzhou":{"cc":"CN","lat":30.35,"lng":112.19,"pop":1052282},"jingzhi":{"cc":"CN","lat":36.31,"lng":119.39,"pop":126703},"tianchang":{"cc":"CN","lat":38.0,"lng":114.02,"pop":61292},"jingmen":{"cc":"CN","lat":31.03,"lng":112.2,"pop":632954},"jingling":{"cc":"CN","lat":30.65,"lng":113.1,"pop":224871},"jingdezhen":{"cc":"CN","lat":29.29,"lng":117.21,"pop":473561},"jingan":{"cc":"CN","lat":31.22,"lng":121.42,"pop":936500},"jinchang":{"cc":"CN","lat":38.5,"lng":102.19,"pop":228561},"jincheng":{"cc":"CN","lat":35.5,"lng":112.83,"pop":476945},"jinan":{"cc":"CN","lat":36.67,"lng":117.0,"pop":4335989},"jimo":{"cc":"CN","lat":36.39,"lng":120.46,"pop":70733},"jijiang":{"cc":"CN","lat":29.29,"lng":106.25,"pop":196787},"jiexiu":{"cc":"CN","lat":37.02,"lng":111.91,"pop":77178},"jieshou":{"cc":"CN","lat":33.26,"lng":115.36,"pop":141993},"jieshi":{"cc":"CN","lat":22.81,"lng":115.83,"pop":137444},"jiehu":{"cc":"CN","lat":35.54,"lng":118.45,"pop":69245},"jiazi":{"cc":"CN","lat":22.88,"lng":116.07,"pop":130298},"jiayue":{"cc":"CN","lat":36.02,"lng":119.18,"pop":93228},"jiaxing":{"cc":"CN","lat":30.75,"lng":120.75,"pop":1180000},"jiawang":{"cc":"CN","lat":34.43,"lng":117.44,"pop":133861},"jiaozuo":{"cc":"CN","lat":35.24,"lng":113.24,"pop":865413},"jiaozhou":{"cc":"CN","lat":36.28,"lng":120.0,"pop":619266},"ningde":{"cc":"CN","lat":26.66,"lng":119.52,"pop":429260},"jianou":{"cc":"CN","lat":27.04,"lng":118.32,"pop":59187},"jiangzhuang":{"cc":"CN","lat":36.49,"lng":119.79,"pop":72453},"jiangyan":{"cc":"CN","lat":32.51,"lng":120.14,"pop":70375},"jianguang":{"cc":"CN","lat":28.19,"lng":115.78,"pop":61469},"jiangshan":{"cc":"CN","lat":36.68,"lng":120.53,"pop":86642},"jiangmen":{"cc":"CN","lat":22.58,"lng":113.08,"pop":1795459},"jiangkou":{"cc":"CN","lat":25.49,"lng":119.2,"pop":59902},"yangjiang":{"cc":"CN","lat":21.86,"lng":111.96,"pop":1292987},"jiangan":{"cc":"CN","lat":28.73,"lng":105.07,"pop":67776},"jianchang":{"cc":"CN","lat":27.56,"lng":116.64,"pop":109108},"jian":{"cc":"CN","lat":27.12,"lng":114.98,"pop":538699},"guangyuan":{"cc":"CN","lat":32.44,"lng":105.82,"pop":516424},"qionghai":{"cc":"CN","lat":19.24,"lng":110.46,"pop":528238},"jiading":{"cc":"CN","lat":31.39,"lng":121.24,"pop":1886100},"huzhou":{"cc":"CN","lat":30.87,"lng":120.09,"pop":1015937},"hutang":{"cc":"CN","lat":31.53,"lng":119.49,"pop":56370},"cixi":{"cc":"CN","lat":30.18,"lng":121.25,"pop":1457510},"huoqiu chengguanzhen":{"cc":"CN","lat":32.35,"lng":116.29,"pop":61904},"humen":{"cc":"CN","lat":22.82,"lng":113.67,"pop":191891},"huizhou":{"cc":"CN","lat":23.11,"lng":114.42,"pop":2900113},"huilong":{"cc":"CN","lat":31.81,"lng":121.66,"pop":74818},"huicheng":{"cc":"CN","lat":23.04,"lng":116.29,"pop":125919},"huguo":{"cc":"CN","lat":28.59,"lng":105.37,"pop":54795},"huazhou":{"cc":"CN","lat":21.63,"lng":110.58,"pop":91701},"huayin":{"cc":"CN","lat":34.57,"lng":110.07,"pop":242488},"huashan":{"cc":"CN","lat":34.63,"lng":116.74,"pop":71281},"huankou":{"cc":"CN","lat":34.87,"lng":116.67,"pop":77758},"huangzhou":{"cc":"CN","lat":30.45,"lng":114.8,"pop":122563},"huangshi":{"cc":"CN","lat":30.25,"lng":115.05,"pop":688090},"dasha":{"cc":"CN","lat":23.11,"lng":113.44,"pop":116307},"huangpi":{"cc":"CN","lat":30.88,"lng":114.38,"pop":57554},"huangmei":{"cc":"CN","lat":30.19,"lng":116.02,"pop":77633},"huanghua":{"cc":"CN","lat":35.89,"lng":119.46,"pop":65646},"huanggang":{"cc":"CN","lat":30.45,"lng":114.87,"pop":366769},"daxing":{"cc":"CN","lat":39.74,"lng":116.33,"pop":104904},"huangchuan":{"cc":"CN","lat":32.14,"lng":115.04,"pop":72663},"xingyi":{"cc":"CN","lat":25.1,"lng":104.91,"pop":322890},"huaiyuan chengguanzhen":{"cc":"CN","lat":32.96,"lng":117.17,"pop":65530},"huainan":{"cc":"CN","lat":32.63,"lng":117.0,"pop":1666826},"huaicheng":{"cc":"CN","lat":23.92,"lng":112.18,"pop":89294},"huaihua":{"cc":"CN","lat":27.56,"lng":110.0,"pop":552622},"huaidian":{"cc":"CN","lat":33.43,"lng":115.03,"pop":89978},"huaibei":{"cc":"CN","lat":33.97,"lng":116.79,"pop":1113321},"huacheng":{"cc":"CN","lat":24.07,"lng":115.61,"pop":101165},"houzhen":{"cc":"CN","lat":36.99,"lng":118.97,"pop":96737},"hongkou":{"cc":"CN","lat":31.25,"lng":121.49,"pop":687500},"donghe":{"cc":"CN","lat":32.23,"lng":106.3,"pop":81953},"hongjiang":{"cc":"CN","lat":27.11,"lng":110.0,"pop":59199},"honghe":{"cc":"CN","lat":36.4,"lng":118.92,"pop":88458},"hezuo":{"cc":"CN","lat":34.99,"lng":102.91,"pop":59148},"heze":{"cc":"CN","lat":35.24,"lng":115.47,"pop":1346717},"hechuan":{"cc":"CN","lat":29.99,"lng":106.26,"pop":377213},"heshan":{"cc":"CN","lat":28.57,"lng":112.35,"pop":1249807},"hepo":{"cc":"CN","lat":23.43,"lng":115.83,"pop":131238},"hengyang":{"cc":"CN","lat":26.89,"lng":112.62,"pop":1075516},"hengshui":{"cc":"CN","lat":37.74,"lng":115.68,"pop":522147},"hengbei":{"cc":"CN","lat":23.88,"lng":115.73,"pop":78575},"hejiang":{"cc":"CN","lat":28.81,"lng":105.83,"pop":137437},"hefei":{"cc":"CN","lat":31.86,"lng":117.28,"pop":5050000},"hede":{"cc":"CN","lat":33.77,"lng":120.26,"pop":89107},"hecun":{"cc":"CN","lat":36.53,"lng":114.11,"pop":83009},"hebi":{"cc":"CN","lat":35.73,"lng":114.29,"pop":634721},"hanzhong":{"cc":"CN","lat":33.08,"lng":107.02,"pop":1006557},"hanyin chengguanzhen":{"cc":"CN","lat":32.89,"lng":108.5,"pop":66926},"fuan":{"cc":"CN","lat":27.09,"lng":119.64,"pop":154439},"hanting":{"cc":"CN","lat":36.77,"lng":119.21,"pop":90637},"hanjia":{"cc":"CN","lat":29.3,"lng":108.16,"pop":108430},"hangzhou":{"cc":"CN","lat":30.29,"lng":120.16,"pop":9236032},"hangu":{"cc":"CN","lat":39.25,"lng":117.79,"pop":208369},"hanfeng":{"cc":"CN","lat":31.17,"lng":108.4,"pop":196528},"changzhi":{"cc":"CN","lat":36.18,"lng":113.11,"pop":1214940},"handan":{"cc":"CN","lat":36.61,"lng":114.49,"pop":1358318},"hanchuan":{"cc":"CN","lat":30.65,"lng":113.77,"pop":87737},"hancheng":{"cc":"CN","lat":35.46,"lng":110.43,"pop":58049},"haizhou":{"cc":"CN","lat":34.58,"lng":119.13,"pop":59098},"jiaojiang":{"cc":"CN","lat":28.7,"lng":121.47,"pop":470804},"haimen":{"cc":"CN","lat":23.19,"lng":116.61,"pop":125427},"haikou":{"cc":"CN","lat":20.03,"lng":110.35,"pop":2873358},"guyuan":{"cc":"CN","lat":36.01,"lng":106.28,"pop":411854},"guozhen":{"cc":"CN","lat":34.37,"lng":107.36,"pop":85415},"gunan":{"cc":"CN","lat":29.02,"lng":106.65,"pop":208010},"gulin":{"cc":"CN","lat":28.04,"lng":105.81,"pop":116527},"guli":{"cc":"CN","lat":28.88,"lng":120.03,"pop":536000},"guiyang":{"cc":"CN","lat":26.58,"lng":106.72,"pop":3037159},"guixi":{"cc":"CN","lat":30.33,"lng":107.35,"pop":188980},"guiren":{"cc":"CN","lat":33.67,"lng":118.19,"pop":57446},"guiping":{"cc":"CN","lat":23.39,"lng":110.07,"pop":71066},"guilin":{"cc":"CN","lat":25.28,"lng":110.3,"pop":1572300},"guigang":{"cc":"CN","lat":23.12,"lng":109.59,"pop":1086327},"gucun":{"cc":"CN","lat":31.35,"lng":121.39,"pop":240185},"gucheng chengguanzhen":{"cc":"CN","lat":32.27,"lng":111.63,"pop":74038},"guanzhuang":{"cc":"CN","lat":36.26,"lng":119.19,"pop":50826},"guanyin":{"cc":"CN","lat":29.1,"lng":104.39,"pop":63606},"guanhu":{"cc":"CN","lat":34.43,"lng":118.0,"pop":97705},"guangzhou":{"cc":"CN","lat":23.12,"lng":113.25,"pop":16096724},"guangshui":{"cc":"CN","lat":31.62,"lng":114.0,"pop":154771},"gongguan":{"cc":"CN","lat":21.8,"lng":109.6,"pop":96492},"gelan":{"cc":"CN","lat":30.04,"lng":107.12,"pop":55938},"gejiu":{"cc":"CN","lat":23.36,"lng":103.15,"pop":136135},"gaozhou":{"cc":"CN","lat":21.92,"lng":110.86,"pop":292164},"gaoyou":{"cc":"CN","lat":32.79,"lng":119.44,"pop":90911},"gaoping":{"cc":"CN","lat":30.78,"lng":106.1,"pop":204368},"gaomi":{"cc":"CN","lat":36.38,"lng":119.75,"pop":391986},"gaoliu":{"cc":"CN","lat":36.8,"lng":118.5,"pop":67339},"gaogou":{"cc":"CN","lat":34.02,"lng":119.19,"pop":56214},"ganzhou":{"cc":"CN","lat":25.85,"lng":114.93,"pop":1977253},"gantang":{"cc":"CN","lat":27.44,"lng":111.97,"pop":90000},"ganshui":{"cc":"CN","lat":28.74,"lng":106.71,"pop":65994},"gangu chengguanzhen":{"cc":"CN","lat":34.74,"lng":105.33,"pop":103589},"fuzhou":{"cc":"CN","lat":26.06,"lng":119.31,"pop":3740000},"fuyang":{"cc":"CN","lat":32.9,"lng":115.82,"pop":1768947},"qingyang":{"cc":"CN","lat":35.71,"lng":107.64,"pop":2125400},"fuling":{"cc":"CN","lat":29.71,"lng":107.39,"pop":268658},"foshan":{"cc":"CN","lat":23.03,"lng":113.13,"pop":9042509},"fenyi":{"cc":"CN","lat":27.81,"lng":114.67,"pop":58478},"fenshui":{"cc":"CN","lat":30.72,"lng":108.08,"pop":60308},"fengyi":{"cc":"CN","lat":25.58,"lng":100.31,"pop":61890},"fengcheng":{"cc":"CN","lat":29.83,"lng":107.06,"pop":175576},"fengrun":{"cc":"CN","lat":39.83,"lng":118.14,"pop":65150},"fengkou":{"cc":"CN","lat":30.08,"lng":113.33,"pop":67139},"fenggang":{"cc":"CN","lat":27.55,"lng":116.21,"pop":64715},"fangshan":{"cc":"CN","lat":39.69,"lng":116.0,"pop":97026},"fangcun":{"cc":"CN","lat":34.09,"lng":117.47,"pop":54035},"fangcheng":{"cc":"CN","lat":33.26,"lng":113.0,"pop":93808},"ezhou":{"cc":"CN","lat":30.4,"lng":114.89,"pop":668727},"enshi":{"cc":"CN","lat":30.3,"lng":109.48,"pop":279185},"encheng":{"cc":"CN","lat":22.19,"lng":112.3,"pop":110921},"duzhou":{"cc":"CN","lat":29.88,"lng":107.08,"pop":51888},"duyun":{"cc":"CN","lat":26.27,"lng":107.52,"pop":198516},"dushan":{"cc":"CN","lat":25.83,"lng":107.53,"pop":80045},"duobao":{"cc":"CN","lat":30.67,"lng":112.69,"pop":90257},"dunhou":{"cc":"CN","lat":27.05,"lng":114.9,"pop":94445},"ducheng":{"cc":"CN","lat":23.24,"lng":111.53,"pop":95525},"duoba":{"cc":"CN","lat":36.66,"lng":101.53,"pop":66767},"dongying":{"cc":"CN","lat":37.46,"lng":118.49,"pop":998968},"dongxing":{"cc":"CN","lat":21.55,"lng":107.97,"pop":88607},"dongxi":{"cc":"CN","lat":28.76,"lng":106.66,"pop":58169},"dongtai":{"cc":"CN","lat":32.85,"lng":120.31,"pop":262873},"dongsheng":{"cc":"CN","lat":39.82,"lng":109.98,"pop":99809},"dongkan":{"cc":"CN","lat":34.0,"lng":119.83,"pop":72789},"donghai":{"cc":"CN","lat":22.95,"lng":115.64,"pop":264709},"dongguan":{"cc":"CN","lat":23.02,"lng":113.75,"pop":9644871},"dongdu":{"cc":"CN","lat":35.85,"lng":117.7,"pop":72957},"dongcun":{"cc":"CN","lat":36.78,"lng":121.16,"pop":92282},"xinle":{"cc":"CN","lat":38.35,"lng":114.69,"pop":99347},"dingzhou":{"cc":"CN","lat":38.51,"lng":114.99,"pop":152934},"dingxi":{"cc":"CN","lat":35.57,"lng":104.62,"pop":420614},"dingtao":{"cc":"CN","lat":35.07,"lng":115.57,"pop":58206},"dingjia":{"cc":"CN","lat":29.41,"lng":106.14,"pop":60585},"dezhou":{"cc":"CN","lat":37.45,"lng":116.37,"pop":679535},"deyang":{"cc":"CN","lat":31.13,"lng":104.38,"pop":735070},"deqing":{"cc":"CN","lat":30.54,"lng":119.96,"pop":87576},"dengzhou":{"cc":"CN","lat":32.68,"lng":112.09,"pop":285032},"songyang":{"cc":"CN","lat":34.46,"lng":113.03,"pop":62375},"degan":{"cc":"CN","lat":29.28,"lng":106.23,"pop":83950},"liping":{"cc":"CN","lat":26.23,"lng":109.13,"pop":82710},"dazhong":{"cc":"CN","lat":33.2,"lng":120.46,"pop":84323},"zhangjiajie":{"cc":"CN","lat":29.13,"lng":110.48,"pop":441804},"daye":{"cc":"CN","lat":30.08,"lng":114.95,"pop":347406},"lijiang":{"cc":"CN","lat":26.87,"lng":100.22,"pop":211151},"dazhou":{"cc":"CN","lat":31.21,"lng":107.46,"pop":1589435},"dawukou":{"cc":"CN","lat":39.04,"lng":106.4,"pop":131880},"datun":{"cc":"CN","lat":34.81,"lng":116.9,"pop":110258},"datong":{"cc":"CN","lat":40.09,"lng":113.29,"pop":1850000},"fenghua":{"cc":"CN","lat":29.66,"lng":121.41,"pop":76653},"daotian":{"cc":"CN","lat":36.83,"lng":118.9,"pop":93728},"daokou":{"cc":"CN","lat":35.57,"lng":114.52,"pop":56637},"danjiangkou":{"cc":"CN","lat":32.54,"lng":111.51,"pop":92008},"gushu":{"cc":"CN","lat":31.56,"lng":118.48,"pop":60335},"damiao":{"cc":"CN","lat":34.26,"lng":117.36,"pop":77179},"daliang":{"cc":"CN","lat":22.84,"lng":113.25,"pop":210411},"dalian":{"cc":"CN","lat":38.91,"lng":121.6,"pop":4913879},"dali":{"cc":"CN","lat":25.58,"lng":100.21,"pop":235305},"dachang":{"cc":"CN","lat":31.31,"lng":121.42,"pop":371856},"chuzhou":{"cc":"CN","lat":32.32,"lng":118.3,"pop":782671},"chuxiong":{"cc":"CN","lat":25.04,"lng":101.55,"pop":555081},"yangchun":{"cc":"CN","lat":22.17,"lng":111.78,"pop":153547},"yiwu":{"cc":"CN","lat":29.32,"lng":120.08,"pop":1481384},"chongqing":{"cc":"CN","lat":29.56,"lng":106.56,"pop":7457599},"chengqiao":{"cc":"CN","lat":31.63,"lng":121.39,"pop":113442},"chonglong":{"cc":"CN","lat":29.78,"lng":104.85,"pop":58441},"chongfu":{"cc":"CN","lat":30.53,"lng":120.43,"pop":112060},"chngf":{"cc":"CN","lat":30.53,"lng":120.43,"pop":112060},"chizhou":{"cc":"CN","lat":30.66,"lng":117.48,"pop":615274},"chenzhou":{"cc":"CN","lat":25.8,"lng":113.03,"pop":822534},"chengyang":{"cc":"CN","lat":35.58,"lng":118.83,"pop":66588},"chengxian chengguanzhen":{"cc":"CN","lat":33.75,"lng":105.73,"pop":69427},"jiangyin":{"cc":"CN","lat":31.91,"lng":120.26,"pop":1779515},"chenggu":{"cc":"CN","lat":33.15,"lng":107.33,"pop":116375},"chengdu":{"cc":"CN","lat":30.67,"lng":104.07,"pop":13568357},"chenghua":{"cc":"CN","lat":23.46,"lng":116.77,"pop":152453},"chaohu":{"cc":"CN","lat":31.6,"lng":117.87,"pop":138463},"changzhou":{"cc":"CN","lat":31.77,"lng":119.95,"pop":3290918},"changyuan":{"cc":"CN","lat":29.4,"lng":105.59,"pop":186653},"changyi":{"cc":"CN","lat":36.85,"lng":119.39,"pop":302072},"changqing":{"cc":"CN","lat":36.56,"lng":116.73,"pop":82598},"changning":{"cc":"CN","lat":31.22,"lng":121.42,"pop":694900},"changli":{"cc":"CN","lat":39.71,"lng":119.16,"pop":64476},"changleng":{"cc":"CN","lat":28.7,"lng":115.82,"pop":56429},"changle":{"cc":"CN","lat":36.71,"lng":118.83,"pop":259161},"changcheng":{"cc":"CN","lat":36.09,"lng":119.45,"pop":63208},"chaigou":{"cc":"CN","lat":36.25,"lng":119.62,"pop":79043},"caoqiao":{"cc":"CN","lat":34.34,"lng":118.11,"pop":65243},"caohe":{"cc":"CN","lat":30.23,"lng":115.43,"pop":67370},"weining":{"cc":"CN","lat":26.85,"lng":104.23,"pop":56744},"cangzhou":{"cc":"CN","lat":38.31,"lng":116.85,"pop":527681},"caidian":{"cc":"CN","lat":30.58,"lng":114.03,"pop":71891},"buhe":{"cc":"CN","lat":30.29,"lng":112.23,"pop":106347},"bozhou":{"cc":"CN","lat":33.88,"lng":115.77,"pop":1409436},"botou":{"cc":"CN","lat":38.07,"lng":116.57,"pop":63045},"boshan":{"cc":"CN","lat":36.48,"lng":117.83,"pop":153596},"baise":{"cc":"CN","lat":23.89,"lng":106.63,"pop":686078},"bishan":{"cc":"CN","lat":29.59,"lng":106.22,"pop":204702},"binzhou":{"cc":"CN","lat":37.37,"lng":118.02,"pop":682717},"bijie":{"cc":"CN","lat":27.3,"lng":105.29,"pop":1137383},"bianzhuang":{"cc":"CN","lat":34.85,"lng":118.04,"pop":65381},"bengbu":{"cc":"CN","lat":32.94,"lng":117.36,"pop":972784},"beisu":{"cc":"CN","lat":38.15,"lng":114.81,"pop":52752},"beimeng":{"cc":"CN","lat":36.6,"lng":119.5,"pop":66277},"beijing":{"cc":"CN","lat":39.91,"lng":116.4,"pop":18960744},"beihai":{"cc":"CN","lat":21.48,"lng":109.12,"pop":525329},"beidao":{"cc":"CN","lat":34.57,"lng":105.89,"pop":74767},"beibei":{"cc":"CN","lat":29.83,"lng":106.44,"pop":247702},"bayiji":{"cc":"CN","lat":34.27,"lng":117.68,"pop":65830},"bayan hot":{"cc":"CN","lat":38.84,"lng":105.67,"pop":94445},"basuo":{"cc":"CN","lat":19.1,"lng":108.67,"pop":444458},"bashan":{"cc":"CN","lat":27.77,"lng":116.05,"pop":103748},"barkam":{"cc":"CN","lat":31.9,"lng":102.22,"pop":58390},"baoying":{"cc":"CN","lat":33.23,"lng":119.31,"pop":80292},"shaoyang":{"cc":"CN","lat":27.24,"lng":111.46,"pop":753194},"langzhong":{"cc":"CN","lat":31.55,"lng":105.99,"pop":60542},"baoding":{"cc":"CN","lat":38.87,"lng":115.46,"pop":2739887},"baiyin":{"cc":"CN","lat":36.55,"lng":104.17,"pop":294400},"baixi":{"cc":"CN","lat":28.7,"lng":104.55,"pop":88251},"baisha":{"cc":"CN","lat":29.06,"lng":106.12,"pop":115761},"baimajing":{"cc":"CN","lat":19.71,"lng":109.22,"pop":59585},"baihecun":{"cc":"CN","lat":22.11,"lng":107.24,"pop":63629},"shangyu":{"cc":"CN","lat":30.02,"lng":120.87,"pop":770000},"bachuan":{"cc":"CN","lat":29.85,"lng":106.05,"pop":208520},"babu":{"cc":"CN","lat":24.42,"lng":111.52,"pop":65603},"aoxi":{"cc":"CN","lat":27.43,"lng":115.84,"pop":82717},"shenliu":{"cc":"CN","lat":29.41,"lng":112.16,"pop":57769},"anwen":{"cc":"CN","lat":29.06,"lng":120.44,"pop":51994},"nwn":{"cc":"CN","lat":29.06,"lng":120.44,"pop":51994},"anshun":{"cc":"CN","lat":26.25,"lng":105.93,"pop":765313},"anqiu":{"cc":"CN","lat":36.43,"lng":119.19,"pop":364208},"anqing":{"cc":"CN","lat":30.51,"lng":117.05,"pop":804493},"mabai":{"cc":"CN","lat":23.01,"lng":104.45,"pop":63569},"anlu":{"cc":"CN","lat":31.26,"lng":113.68,"pop":71198},"anlong":{"cc":"CN","lat":25.1,"lng":105.52,"pop":86416},"anliu":{"cc":"CN","lat":23.7,"lng":115.68,"pop":115560},"anjiang":{"cc":"CN","lat":27.32,"lng":110.1,"pop":55421},"naxi":{"cc":"CN","lat":28.77,"lng":105.36,"pop":50020},"anbu":{"cc":"CN","lat":23.45,"lng":116.68,"pop":162964},"ahu":{"cc":"CN","lat":34.38,"lng":118.6,"pop":55298},"jiangyou":{"cc":"CN","lat":31.77,"lng":104.72,"pop":127225},"zhoushan":{"cc":"CN","lat":29.99,"lng":122.2,"pop":882932},"dacheng":{"cc":"CN","lat":19.51,"lng":109.39,"pop":84620},"guanshan":{"cc":"CN","lat":33.8,"lng":117.87,"pop":51086},"mudu":{"cc":"CN","lat":31.26,"lng":120.52,"pop":61902},"songling":{"cc":"CN","lat":31.19,"lng":120.72,"pop":77566},"xinxing":{"cc":"CN","lat":34.78,"lng":105.32,"pop":97483},"banan":{"cc":"CN","lat":29.38,"lng":106.54,"pop":508703},"dianbu":{"cc":"CN","lat":36.7,"lng":120.35,"pop":52613},"yunshan":{"cc":"CN","lat":36.82,"lng":120.23,"pop":52249},"tanzhou":{"cc":"CN","lat":22.26,"lng":113.47,"pop":382445},"sandu":{"cc":"CN","lat":19.79,"lng":109.22,"pop":76757},"wuzhishan":{"cc":"CN","lat":18.78,"lng":109.5,"pop":112269},"shijie":{"cc":"CN","lat":23.1,"lng":113.79,"pop":246960},"lianghu":{"cc":"CN","lat":29.99,"lng":120.9,"pop":155000},"zhoucheng":{"cc":"CN","lat":35.91,"lng":116.31,"pop":72070},"dalianwan":{"cc":"CN","lat":39.03,"lng":121.69,"pop":55841},"wuyishan":{"cc":"CN","lat":27.76,"lng":118.03,"pop":137133},"yueyang":{"cc":"CN","lat":29.37,"lng":113.09,"pop":991465},"santangpu":{"cc":"CN","lat":27.41,"lng":111.99,"pop":58000},"hedong":{"cc":"CN","lat":23.92,"lng":115.78,"pop":101825},"zhenlai":{"cc":"CN","lat":45.85,"lng":123.2,"pop":67760},"shuangliao":{"cc":"CN","lat":43.51,"lng":123.5,"pop":93666},"zhaozhou":{"cc":"CN","lat":45.71,"lng":125.27,"pop":114009},"zhaodong":{"cc":"CN","lat":46.05,"lng":125.96,"pop":154406},"zhangjiakou":{"cc":"CN","lat":40.78,"lng":114.87,"pop":692602},"zhalantun":{"cc":"CN","lat":48.01,"lng":122.74,"pop":132224},"youhao":{"cc":"CN","lat":47.85,"lng":128.84,"pop":78402},"yingkou":{"cc":"CN","lat":40.66,"lng":122.23,"pop":591159},"yebaishou":{"cc":"CN","lat":41.4,"lng":119.64,"pop":65536},"yantongshan":{"cc":"CN","lat":43.29,"lng":126.01,"pop":57515},"yanji":{"cc":"CN","lat":42.89,"lng":129.5,"pop":326957},"yakeshi":{"cc":"CN","lat":49.28,"lng":120.73,"pop":116284},"xuanhua":{"cc":"CN","lat":40.61,"lng":115.06,"pop":373422},"xiuyan":{"cc":"CN","lat":40.29,"lng":123.27,"pop":71614},"xinqing":{"cc":"CN","lat":48.29,"lng":129.52,"pop":55415},"xinmin":{"cc":"CN","lat":41.99,"lng":122.83,"pop":74139},"xinglongshan":{"cc":"CN","lat":43.96,"lng":125.47,"pop":58432},"xingcheng":{"cc":"CN","lat":40.62,"lng":120.72,"pop":98968},"xilin hot":{"cc":"CN","lat":43.97,"lng":116.03,"pop":120965},"xifeng":{"cc":"CN","lat":42.74,"lng":124.72,"pop":61087},"xiaoshi":{"cc":"CN","lat":41.3,"lng":124.12,"pop":68994},"wudan":{"cc":"CN","lat":42.93,"lng":119.02,"pop":138695},"wdn":{"cc":"CN","lat":42.93,"lng":119.02,"pop":138695},"wuchang":{"cc":"CN","lat":44.93,"lng":127.16,"pop":94786},"wangqing":{"cc":"CN","lat":43.31,"lng":129.76,"pop":88732},"hepingjie":{"cc":"CN","lat":42.06,"lng":126.92,"pop":65298},"wangkui":{"cc":"CN","lat":46.83,"lng":126.48,"pop":99617},"ulanhot":{"cc":"CN","lat":46.08,"lng":122.08,"pop":165846},"tumen":{"cc":"CN","lat":42.97,"lng":129.84,"pop":78719},"tongliao":{"cc":"CN","lat":43.61,"lng":122.27,"pop":261110},"tonghua":{"cc":"CN","lat":41.72,"lng":125.93,"pop":510000},"tieling":{"cc":"CN","lat":42.29,"lng":123.84,"pop":333907},"tieli":{"cc":"CN","lat":46.98,"lng":128.05,"pop":107621},"taonan":{"cc":"CN","lat":45.33,"lng":122.78,"pop":112819},"tailai":{"cc":"CN","lat":46.39,"lng":123.41,"pop":66623},"dorbod":{"cc":"CN","lat":46.86,"lng":124.44,"pop":55316},"tahe":{"cc":"CN","lat":52.32,"lng":124.7,"pop":60874},"sujiatun":{"cc":"CN","lat":41.66,"lng":123.34,"pop":148113},"suiling":{"cc":"CN","lat":47.23,"lng":127.11,"pop":57124},"suihua":{"cc":"CN","lat":46.65,"lng":126.97,"pop":252245},"suifenhe":{"cc":"CN","lat":44.4,"lng":131.15,"pop":98561},"songjianghe":{"cc":"CN","lat":42.19,"lng":127.48,"pop":67672},"siping":{"cc":"CN","lat":43.16,"lng":124.38,"pop":555609},"shunyi":{"cc":"CN","lat":40.12,"lng":116.65,"pop":117623},"shulan":{"cc":"CN","lat":44.41,"lng":126.95,"pop":77420},"shuangyashan":{"cc":"CN","lat":46.68,"lng":131.13,"pop":600000},"shuangyang":{"cc":"CN","lat":43.52,"lng":125.66,"pop":62137},"shuangcheng":{"cc":"CN","lat":45.38,"lng":126.31,"pop":130710},"shiguai":{"cc":"CN","lat":40.71,"lng":110.29,"pop":70357},"shenyang":{"cc":"CN","lat":41.79,"lng":123.43,"pop":7050000},"shanhecun":{"cc":"CN","lat":45.71,"lng":128.58,"pop":57550},"shanhaiguan":{"cc":"CN","lat":40.0,"lng":119.75,"pop":140000},"shangzhi":{"cc":"CN","lat":45.21,"lng":128.0,"pop":131006},"sanchazi":{"cc":"CN","lat":42.08,"lng":126.6,"pop":66576},"salaqi":{"cc":"CN","lat":40.54,"lng":110.51,"pop":104090},"fendou":{"cc":"CN","lat":46.64,"lng":124.86,"pop":226298},"qitaihe":{"cc":"CN","lat":45.77,"lng":131.0,"pop":345033},"qiqihar":{"cc":"CN","lat":47.34,"lng":123.96,"pop":882364},"qinggang":{"cc":"CN","lat":29.47,"lng":106.24,"pop":78582},"songyuan":{"cc":"CN","lat":45.13,"lng":124.83,"pop":113611},"pingzhuang":{"cc":"CN","lat":42.04,"lng":119.29,"pop":67273},"panshi":{"cc":"CN","lat":42.94,"lng":126.06,"pop":80200},"panshan":{"cc":"CN","lat":41.19,"lng":122.05,"pop":625040},"nianzishan":{"cc":"CN","lat":47.51,"lng":122.89,"pop":62131},"nenjiang":{"cc":"CN","lat":49.17,"lng":125.22,"pop":87236},"nehe":{"cc":"CN","lat":48.48,"lng":124.87,"pop":108253},"nantai":{"cc":"CN","lat":40.92,"lng":122.8,"pop":56478},"nanpiao":{"cc":"CN","lat":41.1,"lng":120.75,"pop":157044},"lianhe":{"cc":"CN","lat":47.13,"lng":129.27,"pop":121367},"mujiayingzi":{"cc":"CN","lat":42.12,"lng":118.78,"pop":60627},"mudanjiang":{"cc":"CN","lat":44.55,"lng":129.63,"pop":665915},"mishan":{"cc":"CN","lat":45.55,"lng":131.88,"pop":87257},"antu":{"cc":"CN","lat":43.1,"lng":128.91,"pop":58872},"meihekou":{"cc":"CN","lat":42.53,"lng":125.68,"pop":99419},"manzhouli":{"cc":"CN","lat":49.6,"lng":117.43,"pop":54808},"longjing":{"cc":"CN","lat":42.77,"lng":129.42,"pop":117185},"longjiang":{"cc":"CN","lat":47.34,"lng":123.2,"pop":106384},"liuhe":{"cc":"CN","lat":42.28,"lng":125.75,"pop":66975},"lishu":{"cc":"CN","lat":43.31,"lng":124.33,"pop":61584},"linkou":{"cc":"CN","lat":45.28,"lng":130.27,"pop":77754},"lingyuan":{"cc":"CN","lat":41.24,"lng":119.4,"pop":91418},"lingdong":{"cc":"CN","lat":46.55,"lng":131.14,"pop":83636},"liaozhong":{"cc":"CN","lat":41.51,"lng":122.72,"pop":54691},"liaoyang":{"cc":"CN","lat":41.27,"lng":123.17,"pop":687890},"langxiang":{"cc":"CN","lat":46.95,"lng":128.87,"pop":57318},"langtoucun":{"cc":"CN","lat":40.04,"lng":124.34,"pop":59046},"kuandian":{"cc":"CN","lat":40.73,"lng":124.78,"pop":70867},"kaitong":{"cc":"CN","lat":44.81,"lng":123.08,"pop":62537},"jixi":{"cc":"CN","lat":45.29,"lng":130.96,"pop":403759},"jiutai":{"cc":"CN","lat":44.15,"lng":125.83,"pop":175115},"jiupu":{"cc":"CN","lat":41.07,"lng":122.95,"pop":123843},"jishu":{"cc":"CN","lat":44.32,"lng":126.8,"pop":103988},"lianshan":{"cc":"CN","lat":40.76,"lng":120.85,"pop":313247},"jilin":{"cc":"CN","lat":43.85,"lng":126.56,"pop":1895865},"jidong":{"cc":"CN","lat":45.26,"lng":131.12,"pop":58520},"jiaohe":{"cc":"CN","lat":43.72,"lng":127.33,"pop":123018},"jiamusi":{"cc":"CN","lat":46.8,"lng":130.31,"pop":549549},"jalai nur":{"cc":"CN","lat":49.45,"lng":117.7,"pop":107828},"jiagedaqi":{"cc":"CN","lat":50.42,"lng":124.12,"pop":135760},"hushitai":{"cc":"CN","lat":41.94,"lng":123.5,"pop":61979},"hunchun":{"cc":"CN","lat":42.87,"lng":130.36,"pop":77028},"huludao":{"cc":"CN","lat":40.75,"lng":120.84,"pop":944495},"hulan ergi":{"cc":"CN","lat":47.2,"lng":123.63,"pop":265344},"hulan":{"cc":"CN","lat":45.89,"lng":126.58,"pop":109104},"huinan":{"cc":"CN","lat":42.62,"lng":126.26,"pop":66315},"huanren":{"cc":"CN","lat":41.26,"lng":125.37,"pop":66147},"huangnihe":{"cc":"CN","lat":43.56,"lng":128.02,"pop":54959},"huanan":{"cc":"CN","lat":46.24,"lng":130.55,"pop":66087},"huadian":{"cc":"CN","lat":42.97,"lng":126.74,"pop":139047},"honggang":{"cc":"CN","lat":46.4,"lng":124.88,"pop":147977},"hohhot":{"cc":"CN","lat":40.81,"lng":111.65,"pop":2350000},"hengshan":{"cc":"CN","lat":45.21,"lng":130.9,"pop":164844},"helong":{"cc":"CN","lat":42.54,"lng":129.0,"pop":85756},"heishan":{"cc":"CN","lat":41.69,"lng":122.11,"pop":68603},"heihe":{"cc":"CN","lat":50.24,"lng":127.49,"pop":223832},"hegang":{"cc":"CN","lat":47.35,"lng":130.29,"pop":743307},"harbin":{"cc":"CN","lat":45.75,"lng":126.65,"pop":5242897},"hailun":{"cc":"CN","lat":47.45,"lng":126.92,"pop":109881},"hailin":{"cc":"CN","lat":44.57,"lng":129.39,"pop":144443},"hailar":{"cc":"CN","lat":49.2,"lng":119.7,"pop":211066},"haicheng":{"cc":"CN","lat":40.85,"lng":122.75,"pop":191651},"beining":{"cc":"CN","lat":41.6,"lng":121.79,"pop":152033},"gongzhuling":{"cc":"CN","lat":43.5,"lng":124.82,"pop":140909},"gongchangling":{"cc":"CN","lat":41.12,"lng":123.45,"pop":70761},"genhe":{"cc":"CN","lat":50.78,"lng":121.52,"pop":73631},"gannan":{"cc":"CN","lat":47.92,"lng":123.5,"pop":59239},"fuyu":{"cc":"CN","lat":45.18,"lng":124.82,"pop":138704},"fuxin":{"cc":"CN","lat":42.02,"lng":121.66,"pop":689050},"fushun":{"cc":"CN","lat":41.89,"lng":123.94,"pop":1400646},"jixian":{"cc":"CN","lat":46.73,"lng":131.13,"pop":59160},"fujin":{"cc":"CN","lat":47.25,"lng":132.03,"pop":89442},"beichengqu":{"cc":"CN","lat":40.44,"lng":113.15,"pop":72444},"erdaojiang":{"cc":"CN","lat":41.78,"lng":126.03,"pop":60831},"dunhua":{"cc":"CN","lat":43.37,"lng":128.23,"pop":148844},"dongning":{"cc":"CN","lat":44.08,"lng":131.12,"pop":61440},"dongling":{"cc":"CN","lat":41.81,"lng":123.58,"pop":171454},"dongfeng":{"cc":"CN","lat":42.67,"lng":125.53,"pop":67820},"didao":{"cc":"CN","lat":45.35,"lng":130.84,"pop":109561},"dehui":{"cc":"CN","lat":44.54,"lng":125.69,"pop":108818},"dashitou":{"cc":"CN","lat":43.31,"lng":128.51,"pop":65683},"dashiqiao":{"cc":"CN","lat":40.64,"lng":122.5,"pop":80223},"daqing":{"cc":"CN","lat":46.58,"lng":125.0,"pop":1604027},"dandong":{"cc":"CN","lat":40.13,"lng":124.39,"pop":631973},"linghai":{"cc":"CN","lat":41.17,"lng":121.37,"pop":56176},"dalai":{"cc":"CN","lat":45.5,"lng":124.3,"pop":93297},"chifeng":{"cc":"CN","lat":42.27,"lng":118.96,"pop":346654},"chengzihe":{"cc":"CN","lat":45.34,"lng":131.0,"pop":98188},"chengde":{"cc":"CN","lat":40.95,"lng":117.96,"pop":449325},"chaoyang":{"cc":"CN","lat":41.57,"lng":120.46,"pop":410005},"changtu":{"cc":"CN","lat":42.78,"lng":124.1,"pop":71284},"changping":{"cc":"CN","lat":40.22,"lng":116.23,"pop":93174},"changling":{"cc":"CN","lat":44.27,"lng":123.98,"pop":55841},"changchun":{"cc":"CN","lat":43.88,"lng":125.32,"pop":4714996},"changbai":{"cc":"CN","lat":41.42,"lng":128.2,"pop":58266},"chaihe":{"cc":"CN","lat":44.76,"lng":129.68,"pop":67963},"boli":{"cc":"CN","lat":45.75,"lng":130.58,"pop":95260},"bin xian":{"cc":"CN","lat":45.74,"lng":127.46,"pop":62017},"benxi":{"cc":"CN","lat":41.29,"lng":123.77,"pop":987717},"beipiao":{"cc":"CN","lat":41.79,"lng":120.78,"pop":190315},"beian":{"cc":"CN","lat":48.27,"lng":126.6,"pop":436444},"bayan":{"cc":"CN","lat":46.08,"lng":127.39,"pop":55186},"baotou":{"cc":"CN","lat":40.65,"lng":109.84,"pop":2150000},"baoqing":{"cc":"CN","lat":46.32,"lng":132.19,"pop":62991},"muling":{"cc":"CN","lat":44.92,"lng":130.52,"pop":66170},"baishishan":{"cc":"CN","lat":43.58,"lng":127.57,"pop":56992},"baiquan":{"cc":"CN","lat":47.61,"lng":126.08,"pop":70472},"baicheng":{"cc":"CN","lat":45.62,"lng":122.83,"pop":316970},"baishan":{"cc":"CN","lat":41.94,"lng":126.42,"pop":183880},"anshan":{"cc":"CN","lat":41.12,"lng":122.99,"pop":1450000},"anda":{"cc":"CN","lat":46.45,"lng":125.3,"pop":181271},"oroqen zizhiqi":{"cc":"CN","lat":50.57,"lng":123.72,"pop":61582},"aihui":{"cc":"CN","lat":49.98,"lng":127.48,"pop":192764},"acheng":{"cc":"CN","lat":45.55,"lng":126.95,"pop":144665},"songlingcun":{"cc":"CN","lat":40.29,"lng":118.27,"pop":52277},"doilungdqn":{"cc":"CN","lat":29.66,"lng":90.99,"pop":137451},"doilungdeqen":{"cc":"CN","lat":29.66,"lng":90.99,"pop":137451},"jinniu":{"cc":"CN","lat":25.8,"lng":100.57,"pop":96883},"shuifu":{"cc":"CN","lat":28.63,"lng":104.41,"pop":102143},"shilin":{"cc":"CN","lat":24.82,"lng":103.33,"pop":55000},"panzhihua":{"cc":"CN","lat":26.59,"lng":101.71,"pop":787177},"maozhou":{"cc":"CN","lat":22.76,"lng":113.81,"pop":74910},"gongheyong":{"cc":"CN","lat":22.76,"lng":113.79,"pop":204881},"taifu":{"cc":"CN","lat":28.98,"lng":105.64,"pop":58663},"zhongshan":{"cc":"CN","lat":22.52,"lng":113.38,"pop":3841873},"changshu":{"cc":"CN","lat":31.65,"lng":120.74,"pop":1677050},"shixing":{"cc":"CN","lat":24.95,"lng":114.07,"pop":72996},"jiashan":{"cc":"CN","lat":30.85,"lng":120.93,"pop":137112},"fenghuang":{"cc":"CN","lat":27.94,"lng":109.6,"pop":370000},"dengbu":{"cc":"CN","lat":28.21,"lng":116.82,"pop":63814},"hezhou":{"cc":"CN","lat":24.4,"lng":111.57,"pop":1005490},"zhu cheng city":{"cc":"CN","lat":36.0,"lng":119.4,"pop":1000000},"xingqiao":{"cc":"CN","lat":30.4,"lng":120.25,"pop":52400},"gaojing":{"cc":"CN","lat":31.32,"lng":121.48,"pop":127512},"changzheng":{"cc":"CN","lat":31.24,"lng":121.37,"pop":229925},"xiayang":{"cc":"CN","lat":31.15,"lng":121.12,"pop":137321},"shangri-la":{"cc":"CN","lat":27.83,"lng":99.71,"pop":186400},"maqin county":{"cc":"CN","lat":34.47,"lng":100.24,"pop":59900},"xilinhot":{"cc":"CN","lat":43.94,"lng":116.07,"pop":349953},"lhoka":{"cc":"CN","lat":29.24,"lng":91.77,"pop":353700},"huajing":{"cc":"CN","lat":31.12,"lng":121.45,"pop":67415},"huangpu":{"cc":"CN","lat":31.24,"lng":121.48,"pop":504700},"ulanqab":{"cc":"CN","lat":40.99,"lng":113.13,"pop":550231},"ordos":{"cc":"CN","lat":39.61,"lng":109.78,"pop":1940653},"chengxiang":{"cc":"CN","lat":31.4,"lng":109.57,"pop":89080},"baidi":{"cc":"CN","lat":31.06,"lng":109.59,"pop":56216},"zhoujiaba":{"cc":"CN","lat":30.84,"lng":108.37,"pop":88494},"taibai":{"cc":"CN","lat":30.82,"lng":108.36,"pop":108387},"zhonggulou":{"cc":"CN","lat":30.82,"lng":108.38,"pop":85873},"pailou":{"cc":"CN","lat":30.8,"lng":108.39,"pop":104351},"baianba":{"cc":"CN","lat":30.76,"lng":108.44,"pop":91947},"qingxichang":{"cc":"CN","lat":28.4,"lng":108.9,"pop":53552},"lizhi":{"cc":"CN","lat":29.7,"lng":107.4,"pop":156753},"shuangfengqiao":{"cc":"CN","lat":29.72,"lng":106.63,"pop":67717},"huixing":{"cc":"CN","lat":29.68,"lng":106.61,"pop":186972},"qiantang":{"cc":"CN","lat":30.18,"lng":106.32,"pop":65894},"dashi":{"cc":"CN","lat":30.09,"lng":106.22,"pop":61426},"yangcheng":{"cc":"CN","lat":30.0,"lng":106.26,"pop":186242},"nanjin":{"cc":"CN","lat":29.98,"lng":106.27,"pop":143766},"tangxiang":{"cc":"CN","lat":29.7,"lng":105.72,"pop":66325},"shenglilu":{"cc":"CN","lat":29.35,"lng":105.88,"pop":134218},"nandajie":{"cc":"CN","lat":29.34,"lng":105.89,"pop":88948},"wenshan city":{"cc":"CN","lat":23.36,"lng":104.25,"pop":450000},"tuanbao":{"cc":"CN","lat":30.34,"lng":109.13,"pop":59580},"bole":{"cc":"CN","lat":44.89,"lng":82.07,"pop":235585},"liupanshui":{"cc":"CN","lat":26.59,"lng":104.83,"pop":1320825},"nanchuan":{"cc":"CN","lat":29.15,"lng":107.1,"pop":204775},"xingning":{"cc":"CN","lat":24.15,"lng":115.72,"pop":274499},"bageqi":{"cc":"CN","lat":37.14,"lng":79.84,"pop":57153},"rizhao":{"cc":"CN","lat":35.41,"lng":119.53,"pop":661943},"shanwang":{"cc":"CN","lat":36.55,"lng":118.71,"pop":63195},"jianshui":{"cc":"CN","lat":24.28,"lng":101.22,"pop":490000},"liuzhi":{"cc":"CN","lat":26.23,"lng":105.43,"pop":138826},"xuzhou":{"cc":"CN","lat":34.2,"lng":117.28,"pop":1253991},"panjin":{"cc":"CN","lat":41.12,"lng":122.07,"pop":1166481},"lianyungang":{"cc":"CN","lat":34.6,"lng":119.22,"pop":2001009},"rugao":{"cc":"CN","lat":32.37,"lng":120.58,"pop":257400},"jinzhong":{"cc":"CN","lat":37.68,"lng":112.75,"pop":1226617},"baoji":{"cc":"CN","lat":34.37,"lng":107.24,"pop":1437802},"puxi":{"cc":"CN","lat":31.24,"lng":121.47,"pop":6683712},"qipan":{"cc":"CN","lat":34.24,"lng":118.22,"pop":66419},"huocheng":{"cc":"CN","lat":44.05,"lng":80.87,"pop":360000},"longnan":{"cc":"CN","lat":33.4,"lng":104.92,"pop":85826},"bayan nur":{"cc":"CN","lat":40.74,"lng":107.39,"pop":1760000},"bazhong":{"cc":"CN","lat":31.87,"lng":106.74,"pop":2712894},"tumxuk":{"cc":"CN","lat":39.87,"lng":79.06,"pop":135727},"wulong":{"cc":"CN","lat":29.32,"lng":107.76,"pop":78225},"chongzuo":{"cc":"CN","lat":22.38,"lng":107.37,"pop":384905},"kageleke":{"cc":"CN","lat":37.3,"lng":79.6,"pop":75730},"fangchenggang":{"cc":"CN","lat":21.77,"lng":108.36,"pop":276315},"dali old town":{"cc":"CN","lat":25.69,"lng":100.16,"pop":82566},"yunlong":{"cc":"CN","lat":34.25,"lng":117.25,"pop":345393},"dapeng":{"cc":"CN","lat":34.28,"lng":117.08,"pop":52219},"daxu":{"cc":"CN","lat":34.28,"lng":117.55,"pop":66563},"liguo":{"cc":"CN","lat":34.55,"lng":117.33,"pop":54960},"dashahe":{"cc":"CN","lat":34.54,"lng":116.62,"pop":51916},"wanggou":{"cc":"CN","lat":34.67,"lng":116.49,"pop":67140},"yingqiu":{"cc":"CN","lat":36.53,"lng":118.99,"pop":92564},"yishan":{"cc":"CN","lat":36.22,"lng":118.7,"pop":78408},"huiqu":{"cc":"CN","lat":36.27,"lng":119.05,"pop":59323},"buzhuang":{"cc":"CN","lat":36.91,"lng":119.56,"pop":53474},"jinggou":{"cc":"CN","lat":36.28,"lng":119.55,"pop":62917},"kanjia":{"cc":"CN","lat":36.37,"lng":119.58,"pop":75669},"huanglou":{"cc":"CN","lat":36.65,"lng":118.61,"pop":80055},"yidu":{"cc":"CN","lat":36.77,"lng":118.42,"pop":105070},"dongxia":{"cc":"CN","lat":36.75,"lng":118.58,"pop":84083},"heguan":{"cc":"CN","lat":36.89,"lng":118.57,"pop":73470},"shaozhuang":{"cc":"CN","lat":36.75,"lng":118.32,"pop":66728},"tanfang":{"cc":"CN","lat":36.7,"lng":118.67,"pop":91460},"gucheng":{"cc":"CN","lat":36.95,"lng":118.76,"pop":60149},"hualong":{"cc":"CN","lat":36.95,"lng":118.59,"pop":52660},"jitai":{"cc":"CN","lat":36.76,"lng":118.74,"pop":52144},"taitou":{"cc":"CN","lat":37.03,"lng":118.63,"pop":60354},"yingli":{"cc":"CN","lat":37.06,"lng":118.81,"pop":57091},"lingwu":{"cc":"CN","lat":38.1,"lng":106.34,"pop":52863},"shizuishan":{"cc":"CN","lat":38.98,"lng":106.39,"pop":739400},"hechi":{"cc":"CN","lat":24.69,"lng":108.08,"pop":330131},"menghuan":{"cc":"CN","lat":24.44,"lng":98.58,"pop":99970},"fengping":{"cc":"CN","lat":24.4,"lng":98.52,"pop":69586},"miaojie":{"cc":"CN","lat":25.31,"lng":100.28,"pop":62540},"yongjian":{"cc":"CN","lat":25.43,"lng":100.21,"pop":53970},"yousuo":{"cc":"CN","lat":26.03,"lng":100.07,"pop":53233},"sanchuan":{"cc":"CN","lat":26.75,"lng":100.66,"pop":56345},"wanzhou":{"cc":"CN","lat":30.76,"lng":108.4,"pop":1545900},"zhuyi":{"cc":"CN","lat":31.03,"lng":109.39,"pop":55627},"yintai":{"cc":"CN","lat":35.12,"lng":109.1,"pop":217509},"daxinganling":{"cc":"CN","lat":52.33,"lng":124.71,"pop":520000},"zhawa":{"cc":"CN","lat":37.21,"lng":79.63,"pop":52165},"dazeshan":{"cc":"CN","lat":36.99,"lng":119.92,"pop":60034},"dianzi":{"cc":"CN","lat":36.9,"lng":119.87,"pop":51267},"shuanglonghu":{"cc":"CN","lat":29.72,"lng":106.61,"pop":128563},"liangping":{"cc":"CN","lat":30.66,"lng":107.77,"pop":137620},"longling county":{"cc":"CN","lat":24.59,"lng":98.69,"pop":270000},"mianzhu deyang sichuan":{"cc":"CN","lat":31.34,"lng":104.22,"pop":510000},"pingwu county":{"cc":"CN","lat":32.41,"lng":104.53,"pop":180000},"hulunbuir":{"cc":"CN","lat":49.21,"lng":119.76,"pop":349400},"shajing town":{"cc":"CN","lat":22.74,"lng":113.81,"pop":67093},"baoan":{"cc":"CN","lat":22.55,"lng":113.88,"pop":4476554},"shenzhen city centre":{"cc":"CN","lat":22.54,"lng":114.08,"pop":70826},"baoan centre":{"cc":"CN","lat":22.58,"lng":113.92,"pop":120170},"luohu district":{"cc":"CN","lat":22.55,"lng":114.13,"pop":1143801},"mengzi":{"cc":"CN","lat":23.37,"lng":103.38,"pop":595100},"lushui":{"cc":"CN","lat":25.82,"lng":98.86,"pop":197000},"lliang":{"cc":"CN","lat":37.52,"lng":111.14,"pop":3346500},"lueliang":{"cc":"CN","lat":37.52,"lng":111.14,"pop":3346500},"nyingchi":{"cc":"CN","lat":29.65,"lng":94.36,"pop":200000},"lhnzhub":{"cc":"CN","lat":29.89,"lng":91.26,"pop":50596},"lhuenzhub":{"cc":"CN","lat":29.89,"lng":91.26,"pop":50596},"chnggun q":{"cc":"CN","lat":29.64,"lng":91.04,"pop":478275},"chengguan qu":{"cc":"CN","lat":29.64,"lng":91.04,"pop":478275},"nossa senhora de fatima":{"cc":"CN","lat":22.21,"lng":113.55,"pop":126000},"nossa senhora de ftima":{"cc":"CN","lat":22.21,"lng":113.55,"pop":126000},"santo antonio":{"cc":"CN","lat":22.2,"lng":113.54,"pop":129800},"santo antnio":{"cc":"CN","lat":22.2,"lng":113.54,"pop":129800},"so loureno":{"cc":"CN","lat":22.19,"lng":113.53,"pop":51700},"sao lourenco":{"cc":"CN","lat":22.19,"lng":113.53,"pop":51700},"jinshan":{"cc":"CN","lat":30.84,"lng":121.29,"pop":822776},"fengxiang":{"cc":"CN","lat":30.86,"lng":121.47,"pop":1140872},"chongming":{"cc":"CN","lat":31.62,"lng":121.7,"pop":637921},"panlongcheng jingji kaifaqu":{"cc":"CN","lat":30.69,"lng":114.27,"pop":59207},"pnlngchng jngj kifq":{"cc":"CN","lat":30.69,"lng":114.27,"pop":59207},"zipaquir":{"cc":"CO","lat":5.02,"lng":-74.0,"pop":130432},"zipaquira":{"cc":"CO","lat":5.02,"lng":-74.0,"pop":130432},"yumbo":{"cc":"CO","lat":3.58,"lng":-76.49,"pop":71436},"yopal":{"cc":"CO","lat":5.34,"lng":-72.39,"pop":168433},"villavicencio":{"cc":"CO","lat":4.13,"lng":-73.63,"pop":321717},"villa del rosario":{"cc":"CO","lat":7.83,"lng":-72.47,"pop":64951},"valledupar":{"cc":"CO","lat":10.47,"lng":-73.25,"pop":490075},"turbo":{"cc":"CO","lat":8.09,"lng":-76.73,"pop":50508},"turbaco":{"cc":"CO","lat":10.33,"lng":-75.41,"pop":56171},"tunja":{"cc":"CO","lat":5.54,"lng":-73.36,"pop":172548},"tumaco":{"cc":"CO","lat":1.79,"lng":-78.79,"pop":86713},"tulu":{"cc":"CO","lat":4.08,"lng":-76.2,"pop":221684},"tulua":{"cc":"CO","lat":4.08,"lng":-76.2,"pop":221684},"soledad":{"cc":"CO","lat":10.92,"lng":-74.76,"pop":342556},"sogamoso":{"cc":"CO","lat":5.71,"lng":-72.93,"pop":111336},"soacha":{"cc":"CO","lat":4.58,"lng":-74.22,"pop":655025},"sincelejo":{"cc":"CO","lat":9.3,"lng":-75.39,"pop":277773},"santa rosa de cabal":{"cc":"CO","lat":4.87,"lng":-75.62,"pop":57928},"santander de quilichao":{"cc":"CO","lat":3.01,"lng":-76.48,"pop":99354},"santa marta":{"cc":"CO","lat":11.24,"lng":-74.19,"pop":499192},"san andrs":{"cc":"CO","lat":12.58,"lng":-81.7,"pop":58257},"san andres":{"cc":"CO","lat":12.58,"lng":-81.7,"pop":58257},"sahagun":{"cc":"CO","lat":8.95,"lng":-75.44,"pop":59188},"sahagn":{"cc":"CO","lat":8.95,"lng":-75.44,"pop":59188},"sabaneta":{"cc":"CO","lat":6.15,"lng":-75.62,"pop":82375},"sabanalarga":{"cc":"CO","lat":10.63,"lng":-74.92,"pop":102334},"rionegro":{"cc":"CO","lat":6.16,"lng":-75.37,"pop":128153},"riohacha":{"cc":"CO","lat":11.54,"lng":-72.91,"pop":188014},"quibd":{"cc":"CO","lat":5.69,"lng":-76.66,"pop":129237},"quibdo":{"cc":"CO","lat":5.69,"lng":-76.66,"pop":129237},"puerto berro":{"cc":"CO","lat":6.49,"lng":-74.4,"pop":51079},"puerto berrio":{"cc":"CO","lat":6.49,"lng":-74.4,"pop":51079},"popayn":{"cc":"CO","lat":2.44,"lng":-76.61,"pop":318059},"popayan":{"cc":"CO","lat":2.44,"lng":-76.61,"pop":318059},"planeta rica":{"cc":"CO","lat":8.41,"lng":-75.59,"pop":69708},"pitalito":{"cc":"CO","lat":1.85,"lng":-76.05,"pop":135711},"piedecuesta":{"cc":"CO","lat":6.99,"lng":-73.05,"pop":163362},"pereira":{"cc":"CO","lat":4.81,"lng":-75.69,"pop":467269},"pasto":{"cc":"CO","lat":1.21,"lng":-77.28,"pop":392930},"palmira":{"cc":"CO","lat":3.54,"lng":-76.3,"pop":312519},"ocana":{"cc":"CO","lat":8.24,"lng":-73.36,"pop":101158},"ocaa":{"cc":"CO","lat":8.24,"lng":-73.36,"pop":101158},"neiva":{"cc":"CO","lat":2.93,"lng":-75.28,"pop":357392},"mosquera":{"cc":"CO","lat":4.71,"lng":-74.23,"pop":128012},"montera":{"cc":"CO","lat":8.75,"lng":-75.88,"pop":490935},"monteria":{"cc":"CO","lat":8.75,"lng":-75.88,"pop":490935},"montelbano":{"cc":"CO","lat":7.98,"lng":-75.42,"pop":90450},"montelibano":{"cc":"CO","lat":7.98,"lng":-75.42,"pop":90450},"mocoa":{"cc":"CO","lat":1.15,"lng":-76.65,"pop":56398},"medellin":{"cc":"CO","lat":6.25,"lng":-75.57,"pop":1999979},"medelln":{"cc":"CO","lat":6.25,"lng":-75.57,"pop":1999979},"marinilla":{"cc":"CO","lat":6.17,"lng":-75.34,"pop":57403},"manizales":{"cc":"CO","lat":5.07,"lng":-75.51,"pop":434403},"malambo":{"cc":"CO","lat":10.86,"lng":-74.77,"pop":129148},"maicao":{"cc":"CO","lat":11.38,"lng":-72.24,"pop":166603},"magangue":{"cc":"CO","lat":9.24,"lng":-74.75,"pop":123982},"magangu":{"cc":"CO","lat":9.24,"lng":-74.75,"pop":123982},"los patios":{"cc":"CO","lat":7.84,"lng":-72.5,"pop":58661},"la dorada":{"cc":"CO","lat":5.45,"lng":-74.66,"pop":81950},"itag":{"cc":"CO","lat":6.18,"lng":-75.6,"pop":281853},"itaguei":{"cc":"CO","lat":6.18,"lng":-75.6,"pop":281853},"ipiales":{"cc":"CO","lat":0.83,"lng":-77.64,"pop":77729},"ibague":{"cc":"CO","lat":4.44,"lng":-75.2,"pop":529635},"ibagu":{"cc":"CO","lat":4.44,"lng":-75.2,"pop":529635},"giron":{"cc":"CO","lat":7.07,"lng":-73.17,"pop":108466},"girn":{"cc":"CO","lat":7.07,"lng":-73.17,"pop":108466},"girardot city":{"cc":"CO","lat":4.3,"lng":-74.81,"pop":107324},"fusagasuga":{"cc":"CO","lat":4.34,"lng":-74.36,"pop":88820},"fusagasug":{"cc":"CO","lat":4.34,"lng":-74.36,"pop":88820},"funza":{"cc":"CO","lat":4.72,"lng":-74.21,"pop":116890},"fundacin":{"cc":"CO","lat":10.52,"lng":-74.19,"pop":59175},"fundacion":{"cc":"CO","lat":10.52,"lng":-74.19,"pop":59175},"floridablanca":{"cc":"CO","lat":7.06,"lng":-73.09,"pop":267591},"florencia":{"cc":"CO","lat":1.62,"lng":-75.6,"pop":168346},"facatativ":{"cc":"CO","lat":4.81,"lng":-74.35,"pop":141762},"facatativa":{"cc":"CO","lat":4.81,"lng":-74.35,"pop":141762},"espinal":{"cc":"CO","lat":4.15,"lng":-74.88,"pop":56213},"envigado":{"cc":"CO","lat":6.18,"lng":-75.59,"pop":163007},"el banco":{"cc":"CO","lat":9.0,"lng":-73.98,"pop":54522},"el bagre":{"cc":"CO","lat":7.6,"lng":-74.81,"pop":51150},"duitama":{"cc":"CO","lat":5.82,"lng":-73.03,"pop":92040},"dosquebradas":{"cc":"CO","lat":4.84,"lng":-75.67,"pop":206693},"cucuta":{"cc":"CO","lat":7.91,"lng":-72.5,"pop":777106},"ccuta":{"cc":"CO","lat":7.91,"lng":-72.5,"pop":777106},"cimitarra":{"cc":"CO","lat":6.31,"lng":-73.95,"pop":50892},"cienaga":{"cc":"CO","lat":11.01,"lng":-74.25,"pop":88311},"cinaga":{"cc":"CO","lat":11.01,"lng":-74.25,"pop":88311},"chinu":{"cc":"CO","lat":9.11,"lng":-75.4,"pop":50743},"chin":{"cc":"CO","lat":9.11,"lng":-75.4,"pop":50743},"chinchin":{"cc":"CO","lat":4.98,"lng":-75.6,"pop":68512},"chinchina":{"cc":"CO","lat":4.98,"lng":-75.6,"pop":68512},"chigorodo":{"cc":"CO","lat":7.67,"lng":-76.68,"pop":86239},"chigorod":{"cc":"CO","lat":7.67,"lng":-76.68,"pop":86239},"cha":{"cc":"CO","lat":4.86,"lng":-74.06,"pop":124309},"chia":{"cc":"CO","lat":4.86,"lng":-74.06,"pop":124309},"ceret":{"cc":"CO","lat":8.88,"lng":-75.79,"pop":94935},"cerete":{"cc":"CO","lat":8.88,"lng":-75.79,"pop":94935},"caucasia":{"cc":"CO","lat":7.99,"lng":-75.19,"pop":58034},"cartago":{"cc":"CO","lat":4.75,"lng":-75.91,"pop":134972},"cali":{"cc":"CO","lat":3.43,"lng":-76.52,"pop":2392877},"caldas":{"cc":"CO","lat":6.09,"lng":-75.64,"pop":82234},"calarca":{"cc":"CO","lat":4.53,"lng":-75.64,"pop":79569},"calarc":{"cc":"CO","lat":4.53,"lng":-75.64,"pop":79569},"cajic":{"cc":"CO","lat":4.92,"lng":-74.03,"pop":54111},"cajica":{"cc":"CO","lat":4.92,"lng":-74.03,"pop":54111},"guadalajara de buga":{"cc":"CO","lat":3.9,"lng":-76.3,"pop":114316},"buenaventura":{"cc":"CO","lat":3.58,"lng":-77.0,"pop":432385},"bucaramanga":{"cc":"CO","lat":7.12,"lng":-73.12,"pop":581130},"bogot":{"cc":"CO","lat":4.61,"lng":-74.08,"pop":7674366},"bogota":{"cc":"CO","lat":4.61,"lng":-74.08,"pop":7674366},"bello":{"cc":"CO","lat":6.34,"lng":-75.56,"pop":392939},"barranquilla":{"cc":"CO","lat":10.97,"lng":-74.78,"pop":1206319},"barrancabermeja":{"cc":"CO","lat":7.07,"lng":-73.85,"pop":191403},"barbosa":{"cc":"CO","lat":6.44,"lng":-75.33,"pop":53943},"baranoa":{"cc":"CO","lat":10.79,"lng":-74.92,"pop":68383},"ayapel":{"cc":"CO","lat":8.31,"lng":-75.14,"pop":56082},"armenia":{"cc":"CO","lat":4.54,"lng":-75.67,"pop":304314},"arjona":{"cc":"CO","lat":10.25,"lng":-75.34,"pop":50405},"arauca":{"cc":"CO","lat":7.08,"lng":-70.76,"pop":85585},"apartad":{"cc":"CO","lat":7.88,"lng":-76.63,"pop":86438},"apartado":{"cc":"CO","lat":7.88,"lng":-76.63,"pop":86438},"aguachica":{"cc":"CO","lat":8.31,"lng":-73.62,"pop":97525},"agustn codazzi":{"cc":"CO","lat":10.04,"lng":-73.24,"pop":51478},"agustin codazzi":{"cc":"CO","lat":10.04,"lng":-73.24,"pop":51478},"san jose del guaviare":{"cc":"CO","lat":2.57,"lng":-72.64,"pop":52815},"san jos del guaviare":{"cc":"CO","lat":2.57,"lng":-72.64,"pop":52815},"orito":{"cc":"CO","lat":0.67,"lng":-76.87,"pop":57774},"kennedy":{"cc":"CO","lat":4.62,"lng":-74.15,"pop":979914},"san jos":{"cc":"CR","lat":9.93,"lng":-84.08,"pop":335007},"limon":{"cc":"CR","lat":9.99,"lng":-83.04,"pop":63081},"limn":{"cc":"CR","lat":9.99,"lng":-83.04,"pop":63081},"vedado del cotorro":{"cc":"CU","lat":23.05,"lng":-82.25,"pop":74650},"vedado":{"cc":"CU","lat":23.14,"lng":-82.39,"pop":108369},"santiago de cuba":{"cc":"CU","lat":20.02,"lng":-75.82,"pop":555865},"san miguel del padrn":{"cc":"CU","lat":23.1,"lng":-82.33,"pop":159273},"san miguel del padron":{"cc":"CU","lat":23.1,"lng":-82.33,"pop":159273},"san jose de las lajas":{"cc":"CU","lat":22.96,"lng":-82.15,"pop":54847},"san jos de las lajas":{"cc":"CU","lat":22.96,"lng":-82.15,"pop":54847},"sancti spritus":{"cc":"CU","lat":21.93,"lng":-79.44,"pop":127069},"sancti spiritus":{"cc":"CU","lat":21.93,"lng":-79.44,"pop":127069},"sagua la grande":{"cc":"CU","lat":22.81,"lng":-80.07,"pop":62073},"puerto padre":{"cc":"CU","lat":21.2,"lng":-76.6,"pop":76838},"placetas":{"cc":"CU","lat":22.31,"lng":-79.65,"pop":55408},"pinar del rio":{"cc":"CU","lat":22.42,"lng":-83.7,"pop":186990},"pinar del ro":{"cc":"CU","lat":22.42,"lng":-83.7,"pop":186990},"palma soriano":{"cc":"CU","lat":20.21,"lng":-75.99,"pop":102826},"nuevitas":{"cc":"CU","lat":21.54,"lng":-77.26,"pop":54022},"moa":{"cc":"CU","lat":20.66,"lng":-74.95,"pop":92852},"matanzas":{"cc":"CU","lat":23.04,"lng":-81.58,"pop":146733},"marianao":{"cc":"CU","lat":23.07,"lng":-82.43,"pop":134057},"mantilla":{"cc":"CU","lat":23.07,"lng":-82.34,"pop":206918},"las tunas":{"cc":"CU","lat":20.96,"lng":-76.95,"pop":203684},"havana":{"cc":"CU","lat":23.13,"lng":-82.38,"pop":2163824},"jesus menendez":{"cc":"CU","lat":21.16,"lng":-76.48,"pop":51002},"jess menndez":{"cc":"CU","lat":21.16,"lng":-76.48,"pop":51002},"jagey grande":{"cc":"CU","lat":22.53,"lng":-81.13,"pop":54363},"jagueey grande":{"cc":"CU","lat":22.53,"lng":-81.13,"pop":54363},"holguin":{"cc":"CU","lat":20.89,"lng":-76.26,"pop":319102},"holgun":{"cc":"CU","lat":20.89,"lng":-76.26,"pop":319102},"gira de melena":{"cc":"CU","lat":22.8,"lng":-82.51,"pop":69879},"gueira de melena":{"cc":"CU","lat":22.8,"lng":-82.51,"pop":69879},"gines":{"cc":"CU","lat":22.84,"lng":-82.03,"pop":68935},"gueines":{"cc":"CU","lat":22.84,"lng":-82.03,"pop":68935},"guantnamo":{"cc":"CU","lat":20.14,"lng":-75.21,"pop":272801},"guantanamo":{"cc":"CU","lat":20.14,"lng":-75.21,"pop":272801},"guanabacoa":{"cc":"CU","lat":23.13,"lng":-82.3,"pop":112964},"fontanar":{"cc":"CU","lat":23.02,"lng":-82.41,"pop":178601},"florida":{"cc":"CU","lat":21.53,"lng":-78.23,"pop":63007},"corralillo":{"cc":"CU","lat":22.98,"lng":-80.59,"pop":51881},"contramaestre":{"cc":"CU","lat":20.3,"lng":-76.24,"pop":70438},"consolacin del sur":{"cc":"CU","lat":22.51,"lng":-83.51,"pop":69857},"consolacion del sur":{"cc":"CU","lat":22.51,"lng":-83.51,"pop":69857},"cienfuegos":{"cc":"CU","lat":22.15,"lng":-80.45,"pop":186644},"ciego de vila":{"cc":"CU","lat":21.84,"lng":-78.76,"pop":142027},"ciego de avila":{"cc":"CU","lat":21.84,"lng":-78.76,"pop":142027},"cerro":{"cc":"CU","lat":23.11,"lng":-82.38,"pop":132351},"camagueey":{"cc":"CU","lat":21.38,"lng":-77.92,"pop":347562},"camagey":{"cc":"CU","lat":21.38,"lng":-77.92,"pop":347562},"bayamo":{"cc":"CU","lat":20.37,"lng":-76.64,"pop":192632},"bartolome maso":{"cc":"CU","lat":20.17,"lng":-76.94,"pop":53024},"bartolom mas":{"cc":"CU","lat":20.17,"lng":-76.94,"pop":53024},"banes":{"cc":"CU","lat":20.96,"lng":-75.72,"pop":53104},"balcon de la lisa":{"cc":"CU","lat":23.05,"lng":-82.45,"pop":147415},"balcn de la lisa":{"cc":"CU","lat":23.05,"lng":-82.45,"pop":147415},"artemisa":{"cc":"CU","lat":22.81,"lng":-82.76,"pop":68073},"arroyo naranjo":{"cc":"CU","lat":23.04,"lng":-82.38,"pop":210053},"almendares":{"cc":"CU","lat":23.11,"lng":-82.42,"pop":240000},"alamar":{"cc":"CU","lat":23.16,"lng":-82.28,"pop":100000},"ciudad camilo cienfuegos":{"cc":"CU","lat":23.16,"lng":-82.33,"pop":178041},"centro habana":{"cc":"CU","lat":23.13,"lng":-82.37,"pop":158151},"la habana vieja":{"cc":"CU","lat":23.13,"lng":-82.35,"pop":95383},"boyeros":{"cc":"CU","lat":23.01,"lng":-82.4,"pop":188593},"diez de octubre":{"cc":"CU","lat":23.09,"lng":-82.36,"pop":227293},"plaza de la revolucion":{"cc":"CU","lat":23.12,"lng":-82.39,"pop":139135},"plaza de la revolucin":{"cc":"CU","lat":23.12,"lng":-82.39,"pop":139135},"praia":{"cc":"CV","lat":14.93,"lng":-23.51,"pop":137868},"mindelo":{"cc":"CV","lat":16.89,"lng":-24.98,"pop":69013},"willemstad":{"cc":"CW","lat":12.12,"lng":-68.89,"pop":125000},"strovolos":{"cc":"CY","lat":35.15,"lng":33.33,"pop":67904},"strvolos":{"cc":"CY","lat":35.15,"lng":33.33,"pop":67904},"nicosia":{"cc":"CY","lat":35.17,"lng":33.35,"pop":200452},"limassol":{"cc":"CY","lat":34.68,"lng":33.04,"pop":154000},"larnaca":{"cc":"CY","lat":34.92,"lng":33.63,"pop":72000},"zlin":{"cc":"CZ","lat":49.23,"lng":17.67,"pop":72973},"zln":{"cc":"CZ","lat":49.23,"lng":17.67,"pop":72973},"zizkov":{"cc":"CZ","lat":50.08,"lng":14.45,"pop":58267},"ikov":{"cc":"CZ","lat":50.08,"lng":14.45,"pop":58267},"usti nad labem":{"cc":"CZ","lat":50.66,"lng":14.03,"pop":90378},"st nad labem":{"cc":"CZ","lat":50.66,"lng":14.03,"pop":90378},"teplice":{"cc":"CZ","lat":50.64,"lng":13.82,"pop":50912},"stodulky":{"cc":"CZ","lat":50.05,"lng":14.32,"pop":60758},"stodlky":{"cc":"CZ","lat":50.05,"lng":14.32,"pop":60758},"prague":{"cc":"CZ","lat":50.09,"lng":14.42,"pop":1165581},"pilsen":{"cc":"CZ","lat":49.75,"lng":13.38,"pop":168733},"pardubice":{"cc":"CZ","lat":50.04,"lng":15.78,"pop":88520},"ostrava":{"cc":"CZ","lat":49.83,"lng":18.28,"pop":279791},"opava":{"cc":"CZ","lat":49.94,"lng":17.9,"pop":60252},"olomouc":{"cc":"CZ","lat":49.6,"lng":17.25,"pop":99496},"most":{"cc":"CZ","lat":50.5,"lng":13.64,"pop":63474},"liberec":{"cc":"CZ","lat":50.77,"lng":15.06,"pop":102951},"kladno":{"cc":"CZ","lat":50.15,"lng":14.1,"pop":69664},"jihlava":{"cc":"CZ","lat":49.4,"lng":15.59,"pop":50108},"hradec kralove":{"cc":"CZ","lat":50.21,"lng":15.83,"pop":90596},"hradec krlov":{"cc":"CZ","lat":50.21,"lng":15.83,"pop":90596},"havov":{"cc":"CZ","lat":49.78,"lng":18.44,"pop":82768},"havirov":{"cc":"CZ","lat":49.78,"lng":18.44,"pop":82768},"frydek-mistek":{"cc":"CZ","lat":49.68,"lng":18.35,"pop":53590},"frdek-mstek":{"cc":"CZ","lat":49.68,"lng":18.35,"pop":53590},"chodov":{"cc":"CZ","lat":50.04,"lng":14.5,"pop":50043},"esk budjovice":{"cc":"CZ","lat":48.97,"lng":14.47,"pop":93426},"ceske budejovice":{"cc":"CZ","lat":48.97,"lng":14.47,"pop":93426},"brno":{"cc":"CZ","lat":49.2,"lng":16.61,"pop":379466},"brno stred":{"cc":"CZ","lat":49.19,"lng":16.61,"pop":86685},"brno sted":{"cc":"CZ","lat":49.19,"lng":16.61,"pop":86685},"zwickau":{"cc":"DE","lat":50.73,"lng":12.49,"pop":98796},"zehlendorf":{"cc":"DE","lat":52.43,"lng":13.25,"pop":54328},"wuerzburg":{"cc":"DE","lat":49.79,"lng":9.95,"pop":133731},"wrzburg":{"cc":"DE","lat":49.79,"lng":9.95,"pop":133731},"wuppertal":{"cc":"DE","lat":51.26,"lng":7.15,"pop":360797},"worms":{"cc":"DE","lat":49.63,"lng":8.36,"pop":81099},"wolfsburg":{"cc":"DE","lat":52.42,"lng":10.78,"pop":123064},"wolfenbuettel":{"cc":"DE","lat":52.16,"lng":10.54,"pop":54740},"wolfenbttel":{"cc":"DE","lat":52.16,"lng":10.54,"pop":54740},"witten":{"cc":"DE","lat":51.44,"lng":7.35,"pop":91808},"winterhude":{"cc":"DE","lat":53.59,"lng":10.01,"pop":56382},"wilmersdorf":{"cc":"DE","lat":52.48,"lng":13.32,"pop":101877},"willich":{"cc":"DE","lat":51.26,"lng":6.55,"pop":51843},"wilhelmshaven":{"cc":"DE","lat":53.55,"lng":8.1,"pop":84393},"wilhelmsburg":{"cc":"DE","lat":53.49,"lng":10.01,"pop":53064},"wiesbaden":{"cc":"DE","lat":50.09,"lng":8.24,"pop":288850},"wetzlar":{"cc":"DE","lat":50.56,"lng":8.5,"pop":52656},"wesel":{"cc":"DE","lat":51.67,"lng":6.62,"pop":61685},"weimar":{"cc":"DE","lat":50.98,"lng":11.33,"pop":64727},"wedding":{"cc":"DE","lat":52.55,"lng":13.36,"pop":85275},"wattenscheid":{"cc":"DE","lat":51.48,"lng":7.14,"pop":73965},"waiblingen":{"cc":"DE","lat":48.83,"lng":9.32,"pop":52945},"villingen-schwenningen":{"cc":"DE","lat":48.06,"lng":8.49,"pop":81770},"viersen":{"cc":"DE","lat":51.25,"lng":6.39,"pop":76153},"velbert":{"cc":"DE","lat":51.34,"lng":7.04,"pop":87669},"unna":{"cc":"DE","lat":51.54,"lng":7.69,"pop":66734},"ulm":{"cc":"DE","lat":48.4,"lng":9.99,"pop":120451},"tuebingen":{"cc":"DE","lat":48.52,"lng":9.05,"pop":92322},"tbingen":{"cc":"DE","lat":48.52,"lng":9.05,"pop":92322},"troisdorf":{"cc":"DE","lat":50.81,"lng":7.15,"pop":74749},"trier":{"cc":"DE","lat":49.76,"lng":6.64,"pop":100129},"tempelhof":{"cc":"DE","lat":52.47,"lng":13.4,"pop":61769},"stuttgart":{"cc":"DE","lat":48.78,"lng":9.18,"pop":612663},"stralsund":{"cc":"DE","lat":54.31,"lng":13.08,"pop":58976},"stolberg":{"cc":"DE","lat":50.77,"lng":6.23,"pop":57684},"steglitz":{"cc":"DE","lat":52.46,"lng":13.33,"pop":72464},"steglitz bezirk":{"cc":"DE","lat":52.46,"lng":13.33,"pop":72464},"speyer":{"cc":"DE","lat":49.32,"lng":8.43,"pop":50343},"solingen":{"cc":"DE","lat":51.17,"lng":7.08,"pop":164359},"sindelfingen":{"cc":"DE","lat":48.7,"lng":9.02,"pop":61311},"siegen":{"cc":"DE","lat":50.87,"lng":8.02,"pop":107242},"schwerte":{"cc":"DE","lat":51.44,"lng":7.57,"pop":50399},"schwerin":{"cc":"DE","lat":53.63,"lng":11.41,"pop":96641},"schweinfurt":{"cc":"DE","lat":50.05,"lng":10.22,"pop":54012},"schwbisch gmnd":{"cc":"DE","lat":48.8,"lng":9.8,"pop":61216},"schwaebisch gmuend":{"cc":"DE","lat":48.8,"lng":9.8,"pop":61216},"schneberg":{"cc":"DE","lat":52.5,"lng":13.34,"pop":122658},"schoeneberg":{"cc":"DE","lat":52.5,"lng":13.34,"pop":122658},"sankt augustin":{"cc":"DE","lat":50.78,"lng":7.2,"pop":56094},"salzgitter":{"cc":"DE","lat":52.16,"lng":10.42,"pop":104970},"saarbrcken":{"cc":"DE","lat":49.23,"lng":7.01,"pop":182971},"saarbruecken":{"cc":"DE","lat":49.23,"lng":7.01,"pop":182971},"rsselsheim am main":{"cc":"DE","lat":49.99,"lng":8.42,"pop":59730},"ruesselsheim am main":{"cc":"DE","lat":49.99,"lng":8.42,"pop":59730},"rostock":{"cc":"DE","lat":54.09,"lng":12.14,"pop":198293},"rosenheim":{"cc":"DE","lat":47.86,"lng":12.12,"pop":60167},"rheinhausen":{"cc":"DE","lat":51.4,"lng":6.71,"pop":78203},"rheine":{"cc":"DE","lat":52.29,"lng":7.44,"pop":76491},"reutlingen":{"cc":"DE","lat":48.49,"lng":9.2,"pop":112627},"remscheid":{"cc":"DE","lat":51.18,"lng":7.19,"pop":117118},"reinickendorf":{"cc":"DE","lat":52.56,"lng":13.34,"pop":83972},"regensburg":{"cc":"DE","lat":49.02,"lng":12.1,"pop":151389},"recklinghausen":{"cc":"DE","lat":51.61,"lng":7.2,"pop":122438},"ratingen":{"cc":"DE","lat":51.3,"lng":6.85,"pop":91606},"rahlstedt":{"cc":"DE","lat":53.6,"lng":10.16,"pop":92511},"pulheim":{"cc":"DE","lat":51.0,"lng":6.81,"pop":53762},"prenzlauer berg":{"cc":"DE","lat":52.54,"lng":13.42,"pop":148878},"prenzlauer berg bezirk":{"cc":"DE","lat":52.54,"lng":13.42,"pop":148878},"potsdam":{"cc":"DE","lat":52.4,"lng":13.07,"pop":184754},"porz am rhein":{"cc":"DE","lat":50.89,"lng":7.06,"pop":113415},"plauen":{"cc":"DE","lat":50.5,"lng":12.14,"pop":66412},"pforzheim":{"cc":"DE","lat":48.88,"lng":8.7,"pop":119313},"passau":{"cc":"DE","lat":48.57,"lng":13.43,"pop":50560},"pankow":{"cc":"DE","lat":52.57,"lng":13.4,"pop":65375},"paderborn":{"cc":"DE","lat":51.72,"lng":8.75,"pop":142161},"osnabrueck":{"cc":"DE","lat":52.27,"lng":8.05,"pop":166462},"osnabrck":{"cc":"DE","lat":52.27,"lng":8.05,"pop":166462},"oldenburg":{"cc":"DE","lat":53.14,"lng":8.21,"pop":159218},"offenburg":{"cc":"DE","lat":48.47,"lng":7.94,"pop":59238},"offenbach":{"cc":"DE","lat":50.1,"lng":8.77,"pop":119192},"oberhausen":{"cc":"DE","lat":51.48,"lng":6.86,"pop":219176},"nuremberg":{"cc":"DE","lat":49.45,"lng":11.08,"pop":515543},"nordhorn":{"cc":"DE","lat":52.43,"lng":7.07,"pop":52803},"norderstedt":{"cc":"DE","lat":53.7,"lng":9.99,"pop":82844},"nippes":{"cc":"DE","lat":50.97,"lng":6.95,"pop":113487},"neuwied":{"cc":"DE","lat":50.43,"lng":7.47,"pop":66805},"neu-ulm":{"cc":"DE","lat":48.39,"lng":10.01,"pop":51389},"neustadt an der weinstrasse":{"cc":"DE","lat":49.35,"lng":8.14,"pop":53984},"neustadt an der weinstrae":{"cc":"DE","lat":49.35,"lng":8.14,"pop":53984},"neue neustadt":{"cc":"DE","lat":52.15,"lng":11.63,"pop":226851},"neuss":{"cc":"DE","lat":51.2,"lng":6.69,"pop":152457},"neumuenster":{"cc":"DE","lat":54.07,"lng":9.98,"pop":80196},"neumnster":{"cc":"DE","lat":54.07,"lng":9.98,"pop":80196},"neukoelln":{"cc":"DE","lat":52.48,"lng":13.43,"pop":164636},"neuklln":{"cc":"DE","lat":52.48,"lng":13.43,"pop":164636},"neubrueck":{"cc":"DE","lat":51.13,"lng":6.64,"pop":51109},"neubrck":{"cc":"DE","lat":51.13,"lng":6.64,"pop":51109},"neubrandenburg":{"cc":"DE","lat":53.56,"lng":13.26,"pop":68082},"mnster":{"cc":"DE","lat":51.96,"lng":7.63,"pop":308258},"muenster":{"cc":"DE","lat":51.96,"lng":7.63,"pop":308258},"munich":{"cc":"DE","lat":48.14,"lng":11.58,"pop":1505005},"mlheim":{"cc":"DE","lat":51.43,"lng":6.88,"pop":173050},"muelheim":{"cc":"DE","lat":51.43,"lng":6.88,"pop":173050},"moenchengladbach":{"cc":"DE","lat":51.19,"lng":6.44,"pop":261742},"mnchengladbach":{"cc":"DE","lat":51.19,"lng":6.44,"pop":261742},"moers":{"cc":"DE","lat":51.45,"lng":6.63,"pop":103487},"moabit":{"cc":"DE","lat":52.53,"lng":13.34,"pop":81021},"minden":{"cc":"DE","lat":52.29,"lng":8.91,"pop":82879},"menden":{"cc":"DE","lat":51.44,"lng":7.78,"pop":52452},"meerbusch":{"cc":"DE","lat":51.25,"lng":6.69,"pop":54826},"marzahn":{"cc":"DE","lat":52.55,"lng":13.57,"pop":111508},"marl":{"cc":"DE","lat":51.66,"lng":7.09,"pop":91398},"mariendorf":{"cc":"DE","lat":52.44,"lng":13.38,"pop":52734},"marburg an der lahn":{"cc":"DE","lat":50.81,"lng":8.77,"pop":78895},"mannheim":{"cc":"DE","lat":49.49,"lng":8.47,"pop":307960},"mainz":{"cc":"DE","lat":49.98,"lng":8.28,"pop":222889},"magdeburg":{"cc":"DE","lat":52.13,"lng":11.63,"pop":244329},"luenen":{"cc":"DE","lat":51.62,"lng":7.53,"pop":91009},"lnen":{"cc":"DE","lat":51.62,"lng":7.53,"pop":91009},"lneburg":{"cc":"DE","lat":53.25,"lng":10.42,"pop":71260},"lueneburg":{"cc":"DE","lat":53.25,"lng":10.42,"pop":71260},"ludwigshafen am rhein":{"cc":"DE","lat":49.48,"lng":8.45,"pop":163196},"ludwigsburg":{"cc":"DE","lat":48.9,"lng":9.19,"pop":87603},"ldenscheid":{"cc":"DE","lat":51.22,"lng":7.63,"pop":79386},"luedenscheid":{"cc":"DE","lat":51.22,"lng":7.63,"pop":79386},"luebeck":{"cc":"DE","lat":53.87,"lng":10.69,"pop":212207},"lbeck":{"cc":"DE","lat":53.87,"lng":10.69,"pop":212207},"lippstadt":{"cc":"DE","lat":51.67,"lng":8.34,"pop":67219},"lingen":{"cc":"DE","lat":52.52,"lng":7.33,"pop":51310},"lichterfelde":{"cc":"DE","lat":52.43,"lng":13.31,"pop":85885},"lichtenrade":{"cc":"DE","lat":52.4,"lng":13.41,"pop":52110},"leverkusen":{"cc":"DE","lat":51.03,"lng":6.98,"pop":162738},"leipzig":{"cc":"DE","lat":51.34,"lng":12.37,"pop":504971},"langenhagen":{"cc":"DE","lat":52.45,"lng":9.74,"pop":50439},"langenfeld":{"cc":"DE","lat":51.11,"lng":6.95,"pop":59112},"landshut":{"cc":"DE","lat":48.53,"lng":12.16,"pop":71863},"lahr":{"cc":"DE","lat":48.34,"lng":7.87,"pop":50775},"kreuzberg":{"cc":"DE","lat":52.5,"lng":13.4,"pop":153135},"krefeld":{"cc":"DE","lat":51.34,"lng":6.55,"pop":237984},"koepenick":{"cc":"DE","lat":52.45,"lng":13.57,"pop":67148},"kpenick":{"cc":"DE","lat":52.45,"lng":13.57,"pop":67148},"berlin kpenick":{"cc":"DE","lat":52.44,"lng":13.58,"pop":59561},"berlin koepenick":{"cc":"DE","lat":52.44,"lng":13.58,"pop":59561},"konstanz":{"cc":"DE","lat":47.66,"lng":9.18,"pop":81275},"koeln":{"cc":"DE","lat":50.93,"lng":6.95,"pop":1024621},"kln":{"cc":"DE","lat":50.93,"lng":6.95,"pop":1024621},"koblenz":{"cc":"DE","lat":50.35,"lng":7.58,"pop":107319},"kiel":{"cc":"DE","lat":54.32,"lng":10.13,"pop":252668},"kerpen":{"cc":"DE","lat":50.87,"lng":6.7,"pop":64226},"kempten":{"cc":"DE","lat":47.73,"lng":10.31,"pop":61399},"kassel":{"cc":"DE","lat":51.32,"lng":9.5,"pop":197230},"karlsruhe":{"cc":"DE","lat":49.01,"lng":8.4,"pop":283799},"kaiserslautern":{"cc":"DE","lat":49.44,"lng":7.77,"pop":98732},"jena":{"cc":"DE","lat":50.93,"lng":11.59,"pop":104712},"iserlohn":{"cc":"DE","lat":51.38,"lng":7.7,"pop":91811},"ingolstadt":{"cc":"DE","lat":48.77,"lng":11.42,"pop":120658},"ibbenbueren":{"cc":"DE","lat":52.28,"lng":7.71,"pop":50577},"huerth":{"cc":"DE","lat":50.87,"lng":6.87,"pop":54678},"hrth":{"cc":"DE","lat":50.87,"lng":6.87,"pop":54678},"hildesheim":{"cc":"DE","lat":52.15,"lng":9.95,"pop":103052},"hilden":{"cc":"DE","lat":51.17,"lng":6.93,"pop":56565},"herten":{"cc":"DE","lat":51.6,"lng":7.14,"pop":65306},"herne":{"cc":"DE","lat":51.54,"lng":7.23,"pop":172108},"herford":{"cc":"DE","lat":52.11,"lng":8.67,"pop":64879},"hellersdorf":{"cc":"DE","lat":52.53,"lng":13.61,"pop":84103},"heilbronn":{"cc":"DE","lat":49.14,"lng":9.22,"pop":120733},"heidenheim an der brenz":{"cc":"DE","lat":48.68,"lng":10.15,"pop":50067},"hattingen":{"cc":"DE","lat":51.4,"lng":7.19,"pop":56866},"harburg":{"cc":"DE","lat":53.46,"lng":9.98,"pop":169221},"hannover":{"cc":"DE","lat":52.37,"lng":9.73,"pop":515140},"hanau am main":{"cc":"DE","lat":50.13,"lng":8.91,"pop":88648},"hamm":{"cc":"DE","lat":51.68,"lng":7.82,"pop":178967},"hameln":{"cc":"DE","lat":52.1,"lng":9.36,"pop":58666},"wandsbek":{"cc":"DE","lat":53.58,"lng":10.08,"pop":411422},"marienthal":{"cc":"DE","lat":53.57,"lng":10.08,"pop":287101},"hamburg-mitte":{"cc":"DE","lat":53.55,"lng":10.02,"pop":301231},"eimsbttel":{"cc":"DE","lat":53.57,"lng":9.96,"pop":269118},"eimsbuettel":{"cc":"DE","lat":53.57,"lng":9.96,"pop":269118},"altona":{"cc":"DE","lat":53.55,"lng":9.93,"pop":250192},"hamburg":{"cc":"DE","lat":53.55,"lng":9.99,"pop":1973896},"halle":{"cc":"DE","lat":51.48,"lng":11.98,"pop":237865},"hagen":{"cc":"DE","lat":51.36,"lng":7.47,"pop":198972},"gtersloh":{"cc":"DE","lat":51.91,"lng":8.38,"pop":96180},"guetersloh":{"cc":"DE","lat":51.91,"lng":8.38,"pop":96180},"gummersbach":{"cc":"DE","lat":51.03,"lng":7.56,"pop":53131},"gronau":{"cc":"DE","lat":52.21,"lng":7.02,"pop":50547},"grevenbroich":{"cc":"DE","lat":51.09,"lng":6.58,"pop":64779},"universitts- und hansestadt greifswald":{"cc":"DE","lat":54.09,"lng":13.4,"pop":52731},"universitats- und hansestadt greifswald":{"cc":"DE","lat":54.09,"lng":13.4,"pop":52731},"goettingen":{"cc":"DE","lat":51.53,"lng":9.93,"pop":122149},"gttingen":{"cc":"DE","lat":51.53,"lng":9.93,"pop":122149},"goerlitz":{"cc":"DE","lat":51.16,"lng":14.99,"pop":57751},"grlitz":{"cc":"DE","lat":51.16,"lng":14.99,"pop":57751},"gppingen":{"cc":"DE","lat":48.7,"lng":9.65,"pop":58040},"goeppingen":{"cc":"DE","lat":48.7,"lng":9.65,"pop":58040},"gladbeck":{"cc":"DE","lat":51.57,"lng":6.99,"pop":75499},"gieen":{"cc":"DE","lat":50.59,"lng":8.68,"pop":89179},"giessen":{"cc":"DE","lat":50.59,"lng":8.68,"pop":89179},"gesundbrunnen":{"cc":"DE","lat":52.55,"lng":13.39,"pop":93862},"gera":{"cc":"DE","lat":50.88,"lng":12.08,"pop":104659},"gelsenkirchen":{"cc":"DE","lat":51.51,"lng":7.1,"pop":270028},"garbsen":{"cc":"DE","lat":52.41,"lng":9.59,"pop":63355},"frth":{"cc":"DE","lat":49.48,"lng":10.99,"pop":132036},"fuerth":{"cc":"DE","lat":49.48,"lng":10.99,"pop":132036},"fulda":{"cc":"DE","lat":50.55,"lng":9.68,"pop":63760},"friedrichshain bezirk":{"cc":"DE","lat":52.52,"lng":13.45,"pop":117829},"friedrichshain":{"cc":"DE","lat":52.52,"lng":13.45,"pop":117829},"friedrichshafen":{"cc":"DE","lat":47.66,"lng":9.48,"pop":58403},"friedrichsfelde":{"cc":"DE","lat":52.51,"lng":13.51,"pop":55423},"freiburg":{"cc":"DE","lat":48.0,"lng":7.85,"pop":237460},"frechen":{"cc":"DE","lat":50.91,"lng":6.81,"pop":52309},"frankfurt am main":{"cc":"DE","lat":50.12,"lng":8.68,"pop":650000},"frankfurt":{"cc":"DE","lat":52.35,"lng":14.55,"pop":57107},"flensburg":{"cc":"DE","lat":54.79,"lng":9.44,"pop":85838},"euskirchen":{"cc":"DE","lat":50.66,"lng":6.79,"pop":54889},"esslingen":{"cc":"DE","lat":48.74,"lng":9.3,"pop":92390},"essen":{"cc":"DE","lat":51.46,"lng":7.01,"pop":593085},"eschweiler":{"cc":"DE","lat":50.82,"lng":6.27,"pop":55778},"erlangen":{"cc":"DE","lat":49.59,"lng":11.01,"pop":102675},"erfurt":{"cc":"DE","lat":50.98,"lng":11.04,"pop":218793},"erftstadt":{"cc":"DE","lat":50.81,"lng":6.79,"pop":51207},"emden":{"cc":"DE","lat":53.37,"lng":7.21,"pop":51526},"dsseldorf":{"cc":"DE","lat":51.22,"lng":6.78,"pop":618685},"duesseldorf":{"cc":"DE","lat":51.22,"lng":6.78,"pop":618685},"dren":{"cc":"DE","lat":50.8,"lng":6.49,"pop":93440},"dueren":{"cc":"DE","lat":50.8,"lng":6.49,"pop":93440},"duisburg":{"cc":"DE","lat":51.43,"lng":6.77,"pop":504358},"dresden":{"cc":"DE","lat":51.05,"lng":13.74,"pop":564904},"dortmund":{"cc":"DE","lat":51.51,"lng":7.47,"pop":588462},"dorsten":{"cc":"DE","lat":51.66,"lng":6.97,"pop":79981},"dormagen":{"cc":"DE","lat":51.1,"lng":6.83,"pop":63582},"dinslaken":{"cc":"DE","lat":51.56,"lng":6.74,"pop":66993},"detmold":{"cc":"DE","lat":51.94,"lng":8.87,"pop":73680},"dessau":{"cc":"DE","lat":51.84,"lng":12.25,"pop":67747},"delmenhorst":{"cc":"DE","lat":53.05,"lng":8.63,"pop":75893},"darmstadt":{"cc":"DE","lat":49.87,"lng":8.65,"pop":167029},"cuxhaven":{"cc":"DE","lat":53.87,"lng":8.7,"pop":52677},"cottbus":{"cc":"DE","lat":51.76,"lng":14.33,"pop":84754},"chemnitz":{"cc":"DE","lat":50.84,"lng":12.93,"pop":247220},"charlottenburg":{"cc":"DE","lat":52.52,"lng":13.28,"pop":129359},"celle":{"cc":"DE","lat":52.62,"lng":10.08,"pop":71010},"castrop-rauxel":{"cc":"DE","lat":51.56,"lng":7.31,"pop":77924},"bremerhaven":{"cc":"DE","lat":53.55,"lng":8.58,"pop":118610},"bremen":{"cc":"DE","lat":53.08,"lng":8.81,"pop":546501},"braunschweig":{"cc":"DE","lat":52.27,"lng":10.53,"pop":244715},"brandenburg an der havel":{"cc":"DE","lat":52.42,"lng":12.55,"pop":59826},"bottrop":{"cc":"DE","lat":51.52,"lng":6.93,"pop":119909},"bonn":{"cc":"DE","lat":50.73,"lng":7.1,"pop":330579},"bogenhausen":{"cc":"DE","lat":48.15,"lng":11.62,"pop":77542},"bochum":{"cc":"DE","lat":51.48,"lng":7.22,"pop":385729},"bocholt":{"cc":"DE","lat":51.84,"lng":6.62,"pop":73943},"billstedt":{"cc":"DE","lat":53.55,"lng":10.13,"pop":71077},"bielefeld":{"cc":"DE","lat":52.03,"lng":8.53,"pop":331906},"berlin":{"cc":"DE","lat":52.52,"lng":13.41,"pop":3426354},"bergkamen":{"cc":"DE","lat":51.62,"lng":7.64,"pop":52329},"bergisch gladbach":{"cc":"DE","lat":50.99,"lng":7.13,"pop":106184},"bergheim":{"cc":"DE","lat":50.96,"lng":6.64,"pop":63558},"bayreuth":{"cc":"DE","lat":49.95,"lng":11.58,"pop":72940},"bamberg":{"cc":"DE","lat":49.9,"lng":10.9,"pop":70047},"bad salzuflen":{"cc":"DE","lat":52.09,"lng":8.74,"pop":54899},"bad homburg vor der hoehe":{"cc":"DE","lat":50.23,"lng":8.62,"pop":51859},"bad homburg vor der hhe":{"cc":"DE","lat":50.23,"lng":8.62,"pop":51859},"baden-baden":{"cc":"DE","lat":48.76,"lng":8.24,"pop":56881},"augsburg":{"cc":"DE","lat":48.37,"lng":10.9,"pop":301105},"aschaffenburg":{"cc":"DE","lat":49.98,"lng":9.15,"pop":68551},"arnsberg":{"cc":"DE","lat":51.38,"lng":8.08,"pop":74879},"ahlen":{"cc":"DE","lat":51.76,"lng":7.89,"pop":55280},"aalen":{"cc":"DE","lat":48.84,"lng":10.09,"pop":67085},"aachen":{"cc":"DE","lat":50.78,"lng":6.08,"pop":265208},"mitte":{"cc":"DE","lat":52.52,"lng":13.4,"pop":102338},"bergedorf":{"cc":"DE","lat":53.48,"lng":10.23,"pop":119665},"treptow":{"cc":"DE","lat":52.49,"lng":13.44,"pop":50000},"neu-hohenschnhausen":{"cc":"DE","lat":52.57,"lng":13.51,"pop":56921},"neu-hohenschoenhausen":{"cc":"DE","lat":52.57,"lng":13.51,"pop":56921},"alt-hohenschoenhausen":{"cc":"DE","lat":52.55,"lng":13.5,"pop":50070},"alt-hohenschnhausen":{"cc":"DE","lat":52.55,"lng":13.5,"pop":50070},"hamburg-nord":{"cc":"DE","lat":53.59,"lng":9.98,"pop":315514},"rodenkirchen":{"cc":"DE","lat":50.89,"lng":6.99,"pop":110158},"djibouti":{"cc":"DJ","lat":11.59,"lng":43.15,"pop":626512},"ali sabih":{"cc":"DJ","lat":11.16,"lng":42.71,"pop":50006},"balbala":{"cc":"DJ","lat":11.56,"lng":43.11,"pop":554350},"vejle":{"cc":"DK","lat":55.71,"lng":9.54,"pop":60231},"roskilde":{"cc":"DK","lat":55.64,"lng":12.08,"pop":51916},"randers":{"cc":"DK","lat":56.46,"lng":10.04,"pop":62802},"odense":{"cc":"DK","lat":55.4,"lng":10.39,"pop":180863},"copenhagen":{"cc":"DK","lat":55.68,"lng":12.57,"pop":1153615},"kolding":{"cc":"DK","lat":55.49,"lng":9.47,"pop":61638},"klinteby frihed":{"cc":"DK","lat":55.2,"lng":11.6,"pop":53443},"hvidovre":{"cc":"DK","lat":55.64,"lng":12.48,"pop":53527},"horsens":{"cc":"DK","lat":55.86,"lng":9.85,"pop":61074},"herning":{"cc":"DK","lat":56.14,"lng":8.98,"pop":50565},"frederiksberg":{"cc":"DK","lat":55.68,"lng":12.53,"pop":95029},"esbjerg":{"cc":"DK","lat":55.47,"lng":8.45,"pop":71698},"avedore":{"cc":"DK","lat":55.63,"lng":12.46,"pop":53443},"avedre":{"cc":"DK","lat":55.63,"lng":12.46,"pop":53443},"arhus":{"cc":"DK","lat":56.16,"lng":10.21,"pop":285273},"rhus":{"cc":"DK","lat":56.16,"lng":10.21,"pop":285273},"aalborg":{"cc":"DK","lat":57.05,"lng":9.92,"pop":142937},"villa francisca":{"cc":"DO","lat":18.48,"lng":-69.89,"pop":50185},"santo domingo":{"cc":"DO","lat":18.47,"lng":-69.89,"pop":2201941},"santiago de los caballeros":{"cc":"DO","lat":19.45,"lng":-70.69,"pop":1200000},"santa cruz de barahona":{"cc":"DO","lat":18.21,"lng":-71.1,"pop":77160},"san pedro de macoris":{"cc":"DO","lat":18.45,"lng":-69.31,"pop":217899},"san pedro de macors":{"cc":"DO","lat":18.45,"lng":-69.31,"pop":217899},"san juan de la maguana":{"cc":"DO","lat":18.81,"lng":-71.23,"pop":72950},"san francisco de macors":{"cc":"DO","lat":19.29,"lng":-70.25,"pop":124763},"san francisco de macoris":{"cc":"DO","lat":19.29,"lng":-70.25,"pop":124763},"puerto plata":{"cc":"DO","lat":19.79,"lng":-70.69,"pop":146000},"salvalen de higey":{"cc":"DO","lat":18.62,"lng":-68.71,"pop":123787},"salvaleon de higueey":{"cc":"DO","lat":18.62,"lng":-68.71,"pop":123787},"punta cana":{"cc":"DO","lat":18.58,"lng":-68.4,"pop":100023},"moca":{"cc":"DO","lat":19.39,"lng":-70.52,"pop":61834},"la romana":{"cc":"DO","lat":18.42,"lng":-68.97,"pop":208437},"cristo rey":{"cc":"DO","lat":18.5,"lng":-69.93,"pop":57084},"la vega":{"cc":"DO","lat":19.22,"lng":-70.53,"pop":102426},"bonao":{"cc":"DO","lat":18.94,"lng":-70.41,"pop":73269},"ban":{"cc":"DO","lat":18.28,"lng":-70.33,"pop":66709},"bani":{"cc":"DO","lat":18.28,"lng":-70.33,"pop":66709},"bajos de haina":{"cc":"DO","lat":18.42,"lng":-70.03,"pop":66784},"azua":{"cc":"DO","lat":18.45,"lng":-70.73,"pop":59139},"santo domingo oeste":{"cc":"DO","lat":18.5,"lng":-70.0,"pop":701269},"santo domingo este":{"cc":"DO","lat":18.49,"lng":-69.85,"pop":700000},"touggourt":{"cc":"DZ","lat":33.11,"lng":6.07,"pop":143270},"tolga":{"cc":"DZ","lat":34.72,"lng":5.38,"pop":50575},"tlemcen":{"cc":"DZ","lat":34.88,"lng":-1.31,"pop":173531},"tizi ouzou":{"cc":"DZ","lat":36.71,"lng":4.05,"pop":104312},"tissemsilt":{"cc":"DZ","lat":35.61,"lng":1.81,"pop":66084},"tiaret":{"cc":"DZ","lat":35.37,"lng":1.32,"pop":178915},"tebessa":{"cc":"DZ","lat":35.4,"lng":8.12,"pop":194461},"tbessa":{"cc":"DZ","lat":35.4,"lng":8.12,"pop":194461},"tamanghasset":{"cc":"DZ","lat":22.79,"lng":5.52,"pop":81752},"souk ahras":{"cc":"DZ","lat":36.29,"lng":7.95,"pop":153479},"sougueur":{"cc":"DZ","lat":35.19,"lng":1.5,"pop":71036},"skikda":{"cc":"DZ","lat":36.88,"lng":6.91,"pop":182903},"sig":{"cc":"DZ","lat":35.53,"lng":-0.19,"pop":61373},"sidi bel abbes":{"cc":"DZ","lat":35.19,"lng":-0.63,"pop":210146},"sidi assa":{"cc":"DZ","lat":35.89,"lng":3.77,"pop":66856},"sidi aissa":{"cc":"DZ","lat":35.89,"lng":3.77,"pop":66856},"stif":{"cc":"DZ","lat":36.19,"lng":5.41,"pop":252127},"setif":{"cc":"DZ","lat":36.19,"lng":5.41,"pop":252127},"sada":{"cc":"DZ","lat":34.83,"lng":0.15,"pop":142497},"saida":{"cc":"DZ","lat":34.83,"lng":0.15,"pop":142497},"rouissat":{"cc":"DZ","lat":31.92,"lng":5.35,"pop":80784},"rouiba":{"cc":"DZ","lat":36.74,"lng":3.28,"pop":117558},"relizane":{"cc":"DZ","lat":35.74,"lng":0.56,"pop":123255},"reghaia":{"cc":"DZ","lat":36.74,"lng":3.34,"pop":54962},"reghaa":{"cc":"DZ","lat":36.74,"lng":3.34,"pop":54962},"oum el bouaghi":{"cc":"DZ","lat":35.88,"lng":7.11,"pop":67201},"ouled djellal":{"cc":"DZ","lat":34.43,"lng":5.06,"pop":58481},"oued rhiou":{"cc":"DZ","lat":35.96,"lng":0.92,"pop":55430},"ouargla":{"cc":"DZ","lat":31.95,"lng":5.33,"pop":169928},"oran":{"cc":"DZ","lat":35.7,"lng":-0.64,"pop":803329},"msila":{"cc":"DZ","lat":35.71,"lng":4.54,"pop":132975},"mostaganem":{"cc":"DZ","lat":35.93,"lng":0.09,"pop":162885},"mohammadia":{"cc":"DZ","lat":35.59,"lng":0.07,"pop":62410},"mila":{"cc":"DZ","lat":36.45,"lng":6.26,"pop":63251},"messaad":{"cc":"DZ","lat":34.15,"lng":3.5,"pop":97091},"medea":{"cc":"DZ","lat":36.26,"lng":2.75,"pop":145441},"mda":{"cc":"DZ","lat":36.26,"lng":2.75,"pop":145441},"mecheria":{"cc":"DZ","lat":33.54,"lng":-0.28,"pop":65043},"mascara":{"cc":"DZ","lat":35.4,"lng":0.14,"pop":108629},"mansora":{"cc":"DZ","lat":34.86,"lng":-1.34,"pop":52285},"mansoura":{"cc":"DZ","lat":34.86,"lng":-1.34,"pop":52285},"maghnia":{"cc":"DZ","lat":34.85,"lng":-1.73,"pop":87373},"larbaa":{"cc":"DZ","lat":36.56,"lng":3.15,"pop":58295},"larba":{"cc":"DZ","lat":36.56,"lng":3.15,"pop":58295},"laghouat":{"cc":"DZ","lat":33.8,"lng":2.87,"pop":134372},"ksar el boukhari":{"cc":"DZ","lat":35.89,"lng":2.75,"pop":59634},"ksar chellala":{"cc":"DZ","lat":35.21,"lng":2.32,"pop":51451},"kolea":{"cc":"DZ","lat":36.64,"lng":2.77,"pop":61643},"khenchela":{"cc":"DZ","lat":35.44,"lng":7.14,"pop":114472},"khemis miliana":{"cc":"DZ","lat":36.26,"lng":2.22,"pop":80512},"jijel":{"cc":"DZ","lat":36.82,"lng":5.76,"pop":131513},"assi bou nif":{"cc":"DZ","lat":35.69,"lng":-0.5,"pop":53700},"hassi bahbah":{"cc":"DZ","lat":35.07,"lng":3.03,"pop":77000},"hamma bouziane":{"cc":"DZ","lat":36.41,"lng":6.6,"pop":83603},"guerara":{"cc":"DZ","lat":32.79,"lng":4.5,"pop":58572},"guelma":{"cc":"DZ","lat":36.46,"lng":7.43,"pop":120004},"ghardaa":{"cc":"DZ","lat":32.49,"lng":3.67,"pop":142913},"ghardaia":{"cc":"DZ","lat":32.49,"lng":3.67,"pop":142913},"en nedjma":{"cc":"DZ","lat":35.65,"lng":-0.57,"pop":51665},"el oued":{"cc":"DZ","lat":33.36,"lng":6.86,"pop":186525},"el khroub":{"cc":"DZ","lat":36.26,"lng":6.69,"pop":90122},"el menia":{"cc":"DZ","lat":30.58,"lng":2.88,"pop":57344},"el eulma":{"cc":"DZ","lat":36.15,"lng":5.69,"pop":145380},"el bayadh":{"cc":"DZ","lat":33.68,"lng":1.02,"pop":85577},"chlef":{"cc":"DZ","lat":36.17,"lng":1.33,"pop":178616},"el achir":{"cc":"DZ","lat":36.06,"lng":4.63,"pop":158333},"ech chettia":{"cc":"DZ","lat":36.2,"lng":1.26,"pop":60170},"drean":{"cc":"DZ","lat":36.68,"lng":7.75,"pop":55147},"djelfa":{"cc":"DZ","lat":34.67,"lng":3.26,"pop":265833},"constantine":{"cc":"DZ","lat":36.37,"lng":6.61,"pop":448028},"cheria":{"cc":"DZ","lat":35.27,"lng":7.75,"pop":66160},"chelghoum el ad":{"cc":"DZ","lat":36.16,"lng":6.17,"pop":54495},"chelghoum el aid":{"cc":"DZ","lat":36.16,"lng":6.17,"pop":54495},"bou sada":{"cc":"DZ","lat":35.21,"lng":4.17,"pop":111787},"bou saada":{"cc":"DZ","lat":35.21,"lng":4.17,"pop":111787},"boura":{"cc":"DZ","lat":36.37,"lng":3.9,"pop":68545},"bouira":{"cc":"DZ","lat":36.37,"lng":3.9,"pop":68545},"boufarik":{"cc":"DZ","lat":36.57,"lng":2.91,"pop":57162},"boudouaou":{"cc":"DZ","lat":36.73,"lng":3.41,"pop":56398},"bordj el kiffan":{"cc":"DZ","lat":36.75,"lng":3.19,"pop":123246},"bordj el bahri":{"cc":"DZ","lat":36.79,"lng":3.25,"pop":52816},"bordj bou arreridj":{"cc":"DZ","lat":36.07,"lng":4.76,"pop":158812},"boghni":{"cc":"DZ","lat":36.54,"lng":3.95,"pop":54666},"blida":{"cc":"DZ","lat":36.47,"lng":2.83,"pop":331779},"biskra":{"cc":"DZ","lat":34.85,"lng":5.73,"pop":204661},"birkhadem":{"cc":"DZ","lat":36.71,"lng":3.05,"pop":71722},"bir el djir":{"cc":"DZ","lat":35.72,"lng":-0.55,"pop":68032},"bir el ater":{"cc":"DZ","lat":34.74,"lng":8.06,"pop":70749},"besbes":{"cc":"DZ","lat":36.7,"lng":7.85,"pop":66287},"berrouaghia":{"cc":"DZ","lat":36.14,"lng":2.91,"pop":55775},"beni mered":{"cc":"DZ","lat":36.52,"lng":2.86,"pop":92749},"bejaia":{"cc":"DZ","lat":36.76,"lng":5.08,"pop":176139},"bjaa":{"cc":"DZ","lat":36.76,"lng":5.08,"pop":176139},"bchar":{"cc":"DZ","lat":31.62,"lng":-2.22,"pop":165241},"bechar":{"cc":"DZ","lat":31.62,"lng":-2.22,"pop":165241},"batna":{"cc":"DZ","lat":35.56,"lng":6.17,"pop":289504},"barika":{"cc":"DZ","lat":35.39,"lng":5.37,"pop":98141},"baraki":{"cc":"DZ","lat":36.67,"lng":3.1,"pop":105402},"bab ezzouar":{"cc":"DZ","lat":36.73,"lng":3.18,"pop":275630},"arzew":{"cc":"DZ","lat":35.85,"lng":-0.32,"pop":58162},"annaba":{"cc":"DZ","lat":36.9,"lng":7.77,"pop":342703},"algiers":{"cc":"DZ","lat":36.73,"lng":3.09,"pop":2364230},"ain touta":{"cc":"DZ","lat":35.38,"lng":5.9,"pop":55736},"an touta":{"cc":"DZ","lat":35.38,"lng":5.9,"pop":55736},"an temouchent":{"cc":"DZ","lat":35.3,"lng":-1.14,"pop":70810},"ain temouchent":{"cc":"DZ","lat":35.3,"lng":-1.14,"pop":70810},"an oussera":{"cc":"DZ","lat":35.45,"lng":2.91,"pop":98107},"ain oussera":{"cc":"DZ","lat":35.45,"lng":2.91,"pop":98107},"an oulmene":{"cc":"DZ","lat":35.92,"lng":5.3,"pop":51207},"ain oulmene":{"cc":"DZ","lat":35.92,"lng":5.3,"pop":51207},"ain mlila":{"cc":"DZ","lat":36.04,"lng":6.57,"pop":65371},"an mlila":{"cc":"DZ","lat":36.04,"lng":6.57,"pop":65371},"ain defla":{"cc":"DZ","lat":36.26,"lng":1.97,"pop":55259},"an defla":{"cc":"DZ","lat":36.26,"lng":1.97,"pop":55259},"an beda":{"cc":"DZ","lat":35.8,"lng":7.39,"pop":116064},"ain beida":{"cc":"DZ","lat":35.8,"lng":7.39,"pop":116064},"aflou":{"cc":"DZ","lat":34.11,"lng":2.1,"pop":93585},"adrar":{"cc":"DZ","lat":27.87,"lng":-0.29,"pop":68276},"ali mendjeli":{"cc":"DZ","lat":36.25,"lng":6.57,"pop":64120},"district of taher":{"cc":"DZ","lat":36.77,"lng":5.9,"pop":60426},"tulcn":{"cc":"EC","lat":0.81,"lng":-77.72,"pop":86498},"tulcan":{"cc":"EC","lat":0.81,"lng":-77.72,"pop":86498},"santo domingo de los colorados":{"cc":"EC","lat":-0.25,"lng":-79.18,"pop":458580},"riobamba":{"cc":"EC","lat":-1.67,"lng":-78.66,"pop":264048},"quito":{"cc":"EC","lat":-0.23,"lng":-78.52,"pop":2781641},"quevedo":{"cc":"EC","lat":-1.03,"lng":-79.46,"pop":213842},"portoviejo":{"cc":"EC","lat":-1.06,"lng":-80.45,"pop":321800},"milagro":{"cc":"EC","lat":-2.13,"lng":-79.59,"pop":133508},"manta":{"cc":"EC","lat":-0.95,"lng":-80.73,"pop":264281},"machala":{"cc":"EC","lat":-3.26,"lng":-79.96,"pop":289141},"loja":{"cc":"EC","lat":-3.99,"lng":-79.2,"pop":274112},"latacunga":{"cc":"EC","lat":-0.93,"lng":-78.62,"pop":205624},"la libertad":{"cc":"EC","lat":-2.23,"lng":-80.91,"pop":75881},"ibarra":{"cc":"EC","lat":0.35,"lng":-78.12,"pop":221149},"guayaquil":{"cc":"EC","lat":-2.2,"lng":-79.89,"pop":2723665},"eloy alfaro":{"cc":"EC","lat":-2.17,"lng":-79.84,"pop":315724},"daule":{"cc":"EC","lat":-1.86,"lng":-79.98,"pop":173684},"babahoyo":{"cc":"EC","lat":-1.8,"lng":-79.52,"pop":76279},"ambato":{"cc":"EC","lat":-1.25,"lng":-78.62,"pop":387309},"tartu":{"cc":"EE","lat":58.38,"lng":26.73,"pop":91407},"tallinn":{"cc":"EE","lat":59.44,"lng":24.75,"pop":394024},"narva":{"cc":"EE","lat":59.38,"lng":28.19,"pop":54409},"lasnamaee":{"cc":"EE","lat":59.43,"lng":24.86,"pop":115008},"lasname":{"cc":"EE","lat":59.43,"lng":24.86,"pop":115008},"mustame":{"cc":"EE","lat":59.4,"lng":24.68,"pop":67968},"mustamaee":{"cc":"EE","lat":59.4,"lng":24.68,"pop":67968},"kesklinn":{"cc":"EE","lat":59.44,"lng":24.76,"pop":67766},"haabersti":{"cc":"EE","lat":59.42,"lng":24.65,"pop":51423},"pohja-tallinn":{"cc":"EE","lat":59.45,"lng":24.7,"pop":63240},"phja-tallinn":{"cc":"EE","lat":59.45,"lng":24.7,"pop":63240},"zefta":{"cc":"EG","lat":30.71,"lng":31.24,"pop":111700},"kh":{"cc":"EG","lat":30.35,"lng":31.2,"pop":52593},"tukh":{"cc":"EG","lat":30.35,"lng":31.2,"pop":52593},"tima":{"cc":"EG","lat":26.91,"lng":31.43,"pop":101130},"im":{"cc":"EG","lat":26.91,"lng":31.43,"pop":101130},"tanta":{"cc":"EG","lat":30.79,"lng":31.0,"pop":576648},"miyah":{"cc":"EG","lat":29.48,"lng":30.96,"pop":73070},"tamiyah":{"cc":"EG","lat":29.48,"lng":30.96,"pop":73070},"talkha":{"cc":"EG","lat":31.05,"lng":31.38,"pop":112851},"alkh":{"cc":"EG","lat":31.05,"lng":31.38,"pop":112851},"tala":{"cc":"EG","lat":30.68,"lng":30.94,"pop":72536},"tal":{"cc":"EG","lat":30.68,"lng":30.94,"pop":72536},"tahta":{"cc":"EG","lat":26.77,"lng":31.5,"pop":134314},"ah":{"cc":"EG","lat":26.77,"lng":31.5,"pop":134314},"sumus al waqf":{"cc":"EG","lat":28.92,"lng":30.85,"pop":64965},"sumusta al waqf":{"cc":"EG","lat":28.92,"lng":30.85,"pop":64965},"sohag":{"cc":"EG","lat":26.56,"lng":31.69,"pop":266944},"sirs al layyanah":{"cc":"EG","lat":30.44,"lng":30.97,"pop":78168},"sirs al layynah":{"cc":"EG","lat":30.44,"lng":30.97,"pop":78168},"sinnris":{"cc":"EG","lat":29.41,"lng":30.87,"pop":133532},"sinnuris":{"cc":"EG","lat":29.41,"lng":30.87,"pop":133532},"shubr al khaymah":{"cc":"EG","lat":30.13,"lng":31.25,"pop":1240289},"shubra al khaymah":{"cc":"EG","lat":30.13,"lng":31.25,"pop":1240289},"shirbn":{"cc":"EG","lat":31.2,"lng":31.52,"pop":76081},"shirbin":{"cc":"EG","lat":31.2,"lng":31.52,"pop":76081},"shibin al qanatir":{"cc":"EG","lat":30.31,"lng":31.32,"pop":73711},"shibn al qanir":{"cc":"EG","lat":30.31,"lng":31.32,"pop":73711},"shibn al kawm":{"cc":"EG","lat":30.55,"lng":31.01,"pop":267945},"shibin al kawm":{"cc":"EG","lat":30.55,"lng":31.01,"pop":267945},"samannud":{"cc":"EG","lat":30.96,"lng":31.24,"pop":87921},"samannd":{"cc":"EG","lat":30.96,"lng":31.24,"pop":87921},"saml":{"cc":"EG","lat":28.31,"lng":30.71,"pop":142009},"samalut":{"cc":"EG","lat":28.31,"lng":30.71,"pop":142009},"rosetta":{"cc":"EG","lat":31.4,"lng":30.42,"pop":301795},"quwaysin":{"cc":"EG","lat":30.56,"lng":31.16,"pop":65690},"quwaysina":{"cc":"EG","lat":30.56,"lng":31.16,"pop":65690},"qus":{"cc":"EG","lat":25.92,"lng":32.76,"pop":84386},"qina":{"cc":"EG","lat":26.16,"lng":32.73,"pop":252883},"qalyub":{"cc":"EG","lat":30.18,"lng":31.21,"pop":156363},"nag hammadi":{"cc":"EG","lat":26.05,"lng":32.24,"pop":59601},"nag hammdi":{"cc":"EG","lat":26.05,"lng":32.24,"pop":59601},"nabaruh":{"cc":"EG","lat":31.1,"lng":31.3,"pop":59202},"nabarh":{"cc":"EG","lat":31.1,"lng":31.3,"pop":59202},"mit ghamr":{"cc":"EG","lat":30.72,"lng":31.26,"pop":153754},"mt ghamr":{"cc":"EG","lat":30.72,"lng":31.26,"pop":153754},"minyat an nasr":{"cc":"EG","lat":31.13,"lng":31.64,"pop":82429},"minyat an nar":{"cc":"EG","lat":31.13,"lng":31.64,"pop":82429},"miny al qam":{"cc":"EG","lat":30.52,"lng":31.35,"pop":99284},"minya al qamh":{"cc":"EG","lat":30.52,"lng":31.35,"pop":99284},"munf":{"cc":"EG","lat":30.47,"lng":30.93,"pop":125707},"munuf":{"cc":"EG","lat":30.47,"lng":30.93,"pop":125707},"may":{"cc":"EG","lat":28.42,"lng":30.78,"pop":82328},"matay":{"cc":"EG","lat":28.42,"lng":30.78,"pop":82328},"mashtul as suq":{"cc":"EG","lat":30.36,"lng":31.38,"pop":75837},"mashtl as sq":{"cc":"EG","lat":30.36,"lng":31.38,"pop":75837},"mars mar":{"cc":"EG","lat":31.35,"lng":27.24,"pop":176498},"marsa matruh":{"cc":"EG","lat":31.35,"lng":27.24,"pop":176498},"manfal":{"cc":"EG","lat":27.31,"lng":30.97,"pop":117925},"manfalut":{"cc":"EG","lat":27.31,"lng":30.97,"pop":117925},"mallaw":{"cc":"EG","lat":27.73,"lng":30.84,"pop":212628},"mallawi":{"cc":"EG","lat":27.73,"lng":30.84,"pop":212628},"maghghah":{"cc":"EG","lat":28.65,"lng":30.84,"pop":118223},"maghaghah":{"cc":"EG","lat":28.65,"lng":30.84,"pop":118223},"6th of october city":{"cc":"EG","lat":29.82,"lng":31.05,"pop":368650},"madnat as sdt":{"cc":"EG","lat":30.37,"lng":30.51,"pop":71501},"madinat as sadat":{"cc":"EG","lat":30.37,"lng":30.51,"pop":71501},"madnat an nar":{"cc":"EG","lat":30.07,"lng":31.3,"pop":668413},"madinat an nasr":{"cc":"EG","lat":30.07,"lng":31.3,"pop":668413},"al ashir min ramadan":{"cc":"EG","lat":30.3,"lng":31.75,"pop":246148},"al shir min raman":{"cc":"EG","lat":30.3,"lng":31.75,"pop":246148},"kirdsah":{"cc":"EG","lat":30.03,"lng":31.11,"pop":137588},"kirdasah":{"cc":"EG","lat":30.03,"lng":31.11,"pop":137588},"kom ombo":{"cc":"EG","lat":24.48,"lng":32.95,"pop":409311},"kawm hamadah":{"cc":"EG","lat":30.76,"lng":30.7,"pop":55652},"kawm amdah":{"cc":"EG","lat":30.76,"lng":30.7,"pop":55652},"kafr az zayyat":{"cc":"EG","lat":30.82,"lng":30.82,"pop":83348},"kafr az zayyt":{"cc":"EG","lat":30.82,"lng":30.82,"pop":83348},"kafr ash shaykh":{"cc":"EG","lat":31.11,"lng":30.94,"pop":194569},"kafr ad dawwar":{"cc":"EG","lat":31.13,"lng":30.13,"pop":128539},"kafr ad dawwr":{"cc":"EG","lat":31.13,"lng":30.13,"pop":128539},"juhaynah":{"cc":"EG","lat":26.67,"lng":31.5,"pop":76555},"girga":{"cc":"EG","lat":26.34,"lng":31.89,"pop":151256},"ty al brd":{"cc":"EG","lat":30.89,"lng":30.67,"pop":77606},"itay al barud":{"cc":"EG","lat":30.89,"lng":30.67,"pop":77606},"is":{"cc":"EG","lat":29.24,"lng":30.79,"pop":74357},"itsa":{"cc":"EG","lat":29.24,"lng":30.79,"pop":74357},"esna":{"cc":"EG","lat":25.29,"lng":32.55,"pop":462787},"ihnasya al madinah":{"cc":"EG","lat":29.09,"lng":30.94,"pop":68976},"ihnsy al madnah":{"cc":"EG","lat":29.09,"lng":30.94,"pop":68976},"ihnasiyah":{"cc":"EG","lat":29.09,"lng":31.02,"pop":64058},"ihnsyah":{"cc":"EG","lat":29.09,"lng":31.02,"pop":64058},"idku":{"cc":"EG","lat":31.31,"lng":30.3,"pop":177152},"idk":{"cc":"EG","lat":31.31,"lng":30.3,"pop":177152},"edfu":{"cc":"EG","lat":24.98,"lng":32.88,"pop":79510},"ibshaway":{"cc":"EG","lat":29.36,"lng":30.68,"pop":86186},"ibshawy":{"cc":"EG","lat":29.36,"lng":30.68,"pop":86186},"alwn":{"cc":"EG","lat":29.84,"lng":31.3,"pop":230000},"halwan":{"cc":"EG","lat":29.84,"lng":31.3,"pop":230000},"hihy":{"cc":"EG","lat":30.67,"lng":31.59,"pop":74823},"hihya":{"cc":"EG","lat":30.67,"lng":31.59,"pop":74823},"awsh s":{"cc":"EG","lat":30.91,"lng":30.29,"pop":82999},"hawsh isa":{"cc":"EG","lat":30.91,"lng":30.29,"pop":82999},"adiq al qubbah":{"cc":"EG","lat":30.09,"lng":31.28,"pop":339612},"hadaiq al qubbah":{"cc":"EG","lat":30.09,"lng":31.28,"pop":339612},"fuwwah":{"cc":"EG","lat":31.2,"lng":30.55,"pop":93392},"farshut":{"cc":"EG","lat":26.06,"lng":32.16,"pop":71013},"farsh":{"cc":"EG","lat":26.06,"lng":32.16,"pop":71013},"faqus":{"cc":"EG","lat":30.73,"lng":31.8,"pop":116945},"fqs":{"cc":"EG","lat":30.73,"lng":31.8,"pop":116945},"damietta":{"cc":"EG","lat":31.42,"lng":31.81,"pop":305920},"diyarb najm":{"cc":"EG","lat":30.75,"lng":31.44,"pop":80954},"disq":{"cc":"EG","lat":31.13,"lng":30.65,"pop":149291},"disuq":{"cc":"EG","lat":31.13,"lng":30.65,"pop":149291},"dishna":{"cc":"EG","lat":26.12,"lng":32.47,"pop":64744},"dishn":{"cc":"EG","lat":26.12,"lng":32.47,"pop":64744},"dikirnis":{"cc":"EG","lat":31.09,"lng":31.59,"pop":101082},"dayr":{"cc":"EG","lat":27.56,"lng":30.81,"pop":102570},"dayrut":{"cc":"EG","lat":27.56,"lng":30.81,"pop":102570},"dayr mawas":{"cc":"EG","lat":27.64,"lng":30.85,"pop":60835},"dayr maws":{"cc":"EG","lat":27.64,"lng":30.85,"pop":60835},"daraw":{"cc":"EG","lat":24.41,"lng":32.92,"pop":61790},"darw":{"cc":"EG","lat":24.41,"lng":32.92,"pop":61790},"damanhur":{"cc":"EG","lat":31.03,"lng":30.47,"pop":318207},"bush":{"cc":"EG","lat":29.15,"lng":31.13,"pop":136441},"bsh":{"cc":"EG","lat":29.15,"lng":31.13,"pop":136441},"port said":{"cc":"EG","lat":31.27,"lng":32.3,"pop":780515},"safaga":{"cc":"EG","lat":26.75,"lng":33.94,"pop":53639},"bulaq abu al ila":{"cc":"EG","lat":30.06,"lng":31.23,"pop":51741},"blq ab al il":{"cc":"EG","lat":30.06,"lng":31.23,"pop":51741},"biyal":{"cc":"EG","lat":31.17,"lng":31.22,"pop":89068},"biyala":{"cc":"EG","lat":31.17,"lng":31.22,"pop":89068},"birkat as sab":{"cc":"EG","lat":30.63,"lng":31.08,"pop":50924},"bilqas":{"cc":"EG","lat":31.21,"lng":31.36,"pop":137080},"bilqs":{"cc":"EG","lat":31.21,"lng":31.36,"pop":137080},"bilbeis":{"cc":"EG","lat":30.42,"lng":31.56,"pop":185237},"biba":{"cc":"EG","lat":28.92,"lng":30.99,"pop":94677},"bib":{"cc":"EG","lat":28.92,"lng":30.99,"pop":94677},"basyun":{"cc":"EG","lat":30.94,"lng":30.81,"pop":75084},"basyn":{"cc":"EG","lat":30.94,"lng":30.81,"pop":75084},"bani suwayf":{"cc":"EG","lat":29.07,"lng":31.1,"pop":273151},"ban suwayf":{"cc":"EG","lat":29.07,"lng":31.1,"pop":273151},"ban mazr":{"cc":"EG","lat":28.49,"lng":30.81,"pop":115759},"bani mazar":{"cc":"EG","lat":28.49,"lng":30.81,"pop":115759},"banha":{"cc":"EG","lat":30.46,"lng":31.18,"pop":182254},"banh":{"cc":"EG","lat":30.46,"lng":31.18,"pop":182254},"baltim":{"cc":"EG","lat":31.56,"lng":31.09,"pop":51280},"balm":{"cc":"EG","lat":31.56,"lng":31.09,"pop":51280},"zagazig":{"cc":"EG","lat":30.59,"lng":31.5,"pop":430445},"awsm":{"cc":"EG","lat":30.12,"lng":31.14,"pop":94174},"awsim":{"cc":"EG","lat":30.12,"lng":31.14,"pop":94174},"assiut":{"cc":"EG","lat":27.18,"lng":31.18,"pop":528669},"aswn":{"cc":"EG","lat":24.09,"lng":32.9,"pop":379774},"aswan":{"cc":"EG","lat":24.09,"lng":32.9,"pop":379774},"suez":{"cc":"EG","lat":29.97,"lng":32.53,"pop":699541},"as sinbillwayn":{"cc":"EG","lat":30.88,"lng":31.46,"pop":124020},"as sinbillawayn":{"cc":"EG","lat":30.88,"lng":31.46,"pop":124020},"as sil":{"cc":"EG","lat":27.06,"lng":31.34,"pop":54094},"as sahil":{"cc":"EG","lat":27.06,"lng":31.34,"pop":54094},"a aff":{"cc":"EG","lat":29.56,"lng":31.28,"pop":61531},"as saff":{"cc":"EG","lat":29.56,"lng":31.28,"pop":61531},"ash shuhada":{"cc":"EG","lat":30.6,"lng":30.9,"pop":76071},"ash shuhad":{"cc":"EG","lat":30.6,"lng":30.9,"pop":76071},"ashmun":{"cc":"EG","lat":30.3,"lng":30.98,"pop":124483},"ashmn":{"cc":"EG","lat":30.3,"lng":30.98,"pop":124483},"armant":{"cc":"EG","lat":25.62,"lng":32.54,"pop":78695},"al wasitah":{"cc":"EG","lat":29.34,"lng":31.21,"pop":57870},"al wsiah":{"cc":"EG","lat":29.34,"lng":31.21,"pop":57870},"luxor":{"cc":"EG","lat":25.7,"lng":32.64,"pop":422407},"al qyah":{"cc":"EG","lat":27.44,"lng":30.82,"pop":99598},"al qusiyah":{"cc":"EG","lat":27.44,"lng":30.82,"pop":99598},"al qurayn":{"cc":"EG","lat":30.62,"lng":31.74,"pop":94632},"al qanayat":{"cc":"EG","lat":30.62,"lng":31.46,"pop":70687},"al qanyt":{"cc":"EG","lat":30.62,"lng":31.46,"pop":70687},"al qanir al khayryah":{"cc":"EG","lat":30.19,"lng":31.14,"pop":83568},"al qanatir al khayriyah":{"cc":"EG","lat":30.19,"lng":31.14,"pop":83568},"cairo":{"cc":"EG","lat":30.06,"lng":31.25,"pop":9606916},"minya":{"cc":"EG","lat":28.09,"lng":30.76,"pop":283605},"al maaryah":{"cc":"EG","lat":31.18,"lng":32.03,"pop":162045},"al matariyah":{"cc":"EG","lat":31.18,"lng":32.03,"pop":162045},"al maraghah":{"cc":"EG","lat":26.7,"lng":31.6,"pop":53643},"al marghah":{"cc":"EG","lat":26.7,"lng":31.6,"pop":53643},"al manzalah":{"cc":"EG","lat":31.16,"lng":31.94,"pop":127394},"al minshh":{"cc":"EG","lat":26.48,"lng":31.8,"pop":91149},"al minshah":{"cc":"EG","lat":26.48,"lng":31.8,"pop":91149},"al mahallah al kubra":{"cc":"EG","lat":30.97,"lng":31.17,"pop":592573},"al maallah al kubr":{"cc":"EG","lat":30.97,"lng":31.17,"pop":592573},"al khu":{"cc":"EG","lat":30.15,"lng":31.32,"pop":488904},"al khusus":{"cc":"EG","lat":30.15,"lng":31.32,"pop":488904},"al kharjah":{"cc":"EG","lat":25.45,"lng":30.55,"pop":83108},"al khrjah":{"cc":"EG","lat":25.45,"lng":30.55,"pop":83108},"al khnkah":{"cc":"EG","lat":30.21,"lng":31.37,"pop":81646},"al khankah":{"cc":"EG","lat":30.21,"lng":31.37,"pop":81646},"giza":{"cc":"EG","lat":30.01,"lng":31.21,"pop":4367343},"al jammlyah":{"cc":"EG","lat":31.18,"lng":31.86,"pop":99641},"al jammaliyah":{"cc":"EG","lat":31.18,"lng":31.86,"pop":99641},"ismailia":{"cc":"EG","lat":30.6,"lng":32.27,"pop":429465},"al ibrahimiyah":{"cc":"EG","lat":30.72,"lng":31.56,"pop":53791},"al ibrhmyah":{"cc":"EG","lat":30.72,"lng":31.56,"pop":53791},"izbat al as sayyid":{"cc":"EG","lat":31.16,"lng":30.15,"pop":53079},"izbat ali as sayyid":{"cc":"EG","lat":31.16,"lng":30.15,"pop":53079},"al husayniyah":{"cc":"EG","lat":30.86,"lng":31.92,"pop":50651},"al usaynyah":{"cc":"EG","lat":30.86,"lng":31.92,"pop":50651},"al awmidyah":{"cc":"EG","lat":29.9,"lng":31.25,"pop":155055},"al hawamidiyah":{"cc":"EG","lat":29.9,"lng":31.25,"pop":155055},"al ml":{"cc":"EG","lat":31.31,"lng":31.15,"pop":58430},"al hamul":{"cc":"EG","lat":31.31,"lng":31.15,"pop":58430},"hurghada":{"cc":"EG","lat":27.26,"lng":33.81,"pop":207132},"al ghanyim":{"cc":"EG","lat":26.88,"lng":31.33,"pop":70884},"al ghanayim":{"cc":"EG","lat":26.88,"lng":31.33,"pop":70884},"al fayyum":{"cc":"EG","lat":29.31,"lng":30.84,"pop":519047},"al fashn":{"cc":"EG","lat":28.82,"lng":30.9,"pop":112999},"al burj":{"cc":"EG","lat":31.58,"lng":30.98,"pop":60320},"al balyan":{"cc":"EG","lat":26.24,"lng":32.0,"pop":68413},"al balyana":{"cc":"EG","lat":26.24,"lng":32.0,"pop":68413},"al bajur":{"cc":"EG","lat":30.43,"lng":31.04,"pop":62961},"al bjr":{"cc":"EG","lat":30.43,"lng":31.04,"pop":62961},"al badrashayn":{"cc":"EG","lat":29.85,"lng":31.27,"pop":90833},"al badari":{"cc":"EG","lat":26.99,"lng":31.42,"pop":56033},"al badr":{"cc":"EG","lat":26.99,"lng":31.42,"pop":56033},"arish":{"cc":"EG","lat":31.13,"lng":33.8,"pop":199243},"arsh":{"cc":"EG","lat":31.13,"lng":33.8,"pop":199243},"akhmm":{"cc":"EG","lat":26.56,"lng":31.75,"pop":151430},"akhmim":{"cc":"EG","lat":26.56,"lng":31.75,"pop":151430},"ad dilinjat":{"cc":"EG","lat":30.83,"lng":30.54,"pop":68901},"ad dilinjt":{"cc":"EG","lat":30.83,"lng":30.54,"pop":68901},"abu tij":{"cc":"EG","lat":27.05,"lng":31.32,"pop":105418},"ab tj":{"cc":"EG","lat":27.05,"lng":31.32,"pop":105418},"ab qurq":{"cc":"EG","lat":27.93,"lng":30.84,"pop":90266},"abu qurqas":{"cc":"EG","lat":27.93,"lng":30.84,"pop":90266},"ab kabr":{"cc":"EG","lat":30.73,"lng":31.67,"pop":154466},"abu kabir":{"cc":"EG","lat":30.73,"lng":31.67,"pop":154466},"ab ummu":{"cc":"EG","lat":31.09,"lng":30.31,"pop":61388},"abu hummus":{"cc":"EG","lat":31.09,"lng":30.31,"pop":61388},"ab an numrus":{"cc":"EG","lat":29.95,"lng":31.2,"pop":86601},"abu an numrus":{"cc":"EG","lat":29.95,"lng":31.2,"pop":86601},"abu al matamir":{"cc":"EG","lat":30.91,"lng":30.17,"pop":66946},"ab al mamr":{"cc":"EG","lat":30.91,"lng":30.17,"pop":66946},"abnub":{"cc":"EG","lat":27.27,"lng":31.15,"pop":111785},"abnb":{"cc":"EG","lat":27.27,"lng":31.15,"pop":111785},"al-manakh":{"cc":"EG","lat":31.27,"lng":32.28,"pop":84679},"al-mankh":{"cc":"EG","lat":31.27,"lng":32.28,"pop":84679},"dumyat al jadidah":{"cc":"EG","lat":31.43,"lng":31.68,"pop":54508},"dumy al jaddah":{"cc":"EG","lat":31.43,"lng":31.68,"pop":54508},"as salihiyah al jadidah":{"cc":"EG","lat":30.63,"lng":31.94,"pop":59320},"a liyah al jaddah":{"cc":"EG","lat":30.63,"lng":31.94,"pop":59320},"new cairo":{"cc":"EG","lat":30.03,"lng":31.47,"pop":313139},"el shorouk":{"cc":"EG","lat":30.14,"lng":31.62,"pop":91899},"al qhirah al jaddah":{"cc":"EG","lat":30.04,"lng":31.44,"pop":313139},"al qahirah al jadidah":{"cc":"EG","lat":30.04,"lng":31.44,"pop":313139},"br fud":{"cc":"EG","lat":31.24,"lng":32.32,"pop":81591},"bur fuad":{"cc":"EG","lat":31.24,"lng":32.32,"pop":81591},"al-ubur":{"cc":"EG","lat":30.23,"lng":31.48,"pop":138987},"al-ubr":{"cc":"EG","lat":30.23,"lng":31.48,"pop":138987},"al-kharijah":{"cc":"EG","lat":25.25,"lng":30.55,"pop":83108},"al-khrijah":{"cc":"EG","lat":25.25,"lng":30.55,"pop":83108},"ash-shaykh zayid":{"cc":"EG","lat":30.02,"lng":31.0,"pop":95854},"ash-shaykh zyid":{"cc":"EG","lat":30.02,"lng":31.0,"pop":95854},"ad-dawahy":{"cc":"EG","lat":31.24,"lng":32.28,"pop":148624},"a-awy":{"cc":"EG","lat":31.24,"lng":32.28,"pop":148624},"az-zuhur":{"cc":"EG","lat":31.27,"lng":32.26,"pop":266381},"az-zuhr":{"cc":"EG","lat":31.27,"lng":32.26,"pop":266381},"laayoune":{"cc":"EH","lat":27.14,"lng":-13.19,"pop":196331},"keren":{"cc":"ER","lat":15.78,"lng":38.45,"pop":74800},"asmara":{"cc":"ER","lat":15.34,"lng":38.93,"pop":563930},"vila-real":{"cc":"ES","lat":39.94,"lng":-0.1,"pop":50577},"velez-malaga":{"cc":"ES","lat":36.78,"lng":-4.1,"pop":74190},"vlez-mlaga":{"cc":"ES","lat":36.78,"lng":-4.1,"pop":74190},"utrera":{"cc":"ES","lat":37.19,"lng":-5.78,"pop":52617},"torrevieja":{"cc":"ES","lat":37.98,"lng":-0.68,"pop":82599},"torrent":{"cc":"ES","lat":39.44,"lng":-0.47,"pop":78543},"torremolinos":{"cc":"ES","lat":36.62,"lng":-4.5,"pop":65448},"telde":{"cc":"ES","lat":27.99,"lng":-15.42,"pop":123265},"talavera de la reina":{"cc":"ES","lat":39.96,"lng":-4.83,"pop":88856},"sevilla":{"cc":"ES","lat":37.38,"lng":-5.97,"pop":686741},"san vicent del raspeig":{"cc":"ES","lat":38.4,"lng":-0.53,"pop":56715},"santa cruz de tenerife":{"cc":"ES","lat":28.47,"lng":-16.25,"pop":211359},"sanlcar de barrameda":{"cc":"ES","lat":36.78,"lng":-6.35,"pop":68037},"sanlucar de barrameda":{"cc":"ES","lat":36.78,"lng":-6.35,"pop":68037},"la laguna":{"cc":"ES","lat":28.49,"lng":-16.32,"pop":150661},"san bartolome de tirajana":{"cc":"ES","lat":27.92,"lng":-15.57,"pop":53588},"san bartolom de tirajana":{"cc":"ES","lat":27.92,"lng":-15.57,"pop":53588},"sagunto":{"cc":"ES","lat":39.68,"lng":-0.27,"pop":66070},"roquetas de mar":{"cc":"ES","lat":36.76,"lng":-2.61,"pop":94925},"puertollano":{"cc":"ES","lat":38.69,"lng":-4.11,"pop":51842},"paterna":{"cc":"ES","lat":39.5,"lng":-0.44,"pop":64023},"palma":{"cc":"ES","lat":39.57,"lng":2.65,"pop":438234},"orihuela":{"cc":"ES","lat":38.08,"lng":-0.94,"pop":101321},"murcia":{"cc":"ES","lat":37.99,"lng":-1.13,"pop":471982},"motril":{"cc":"ES","lat":36.75,"lng":-3.52,"pop":60592},"molina de segura":{"cc":"ES","lat":38.05,"lng":-1.21,"pop":64065},"mijas":{"cc":"ES","lat":36.6,"lng":-4.64,"pop":80630},"melilla":{"cc":"ES","lat":35.29,"lng":-2.94,"pop":85985},"marbella":{"cc":"ES","lat":36.52,"lng":-4.89,"pop":156295},"malaga":{"cc":"ES","lat":36.72,"lng":-4.42,"pop":592346},"mlaga":{"cc":"ES","lat":36.72,"lng":-4.42,"pop":592346},"lorca":{"cc":"ES","lat":37.67,"lng":-1.7,"pop":93079},"las palmas de gran canaria":{"cc":"ES","lat":28.1,"lng":-15.42,"pop":383516},"la linea de la concepcion":{"cc":"ES","lat":36.17,"lng":-5.35,"pop":64595},"la lnea de la concepcin":{"cc":"ES","lat":36.17,"lng":-5.35,"pop":64595},"jerez de la frontera":{"cc":"ES","lat":36.69,"lng":-6.14,"pop":212879},"huelva":{"cc":"ES","lat":37.27,"lng":-6.94,"pop":144258},"gandia":{"cc":"ES","lat":38.97,"lng":-0.18,"pop":73829},"fuengirola":{"cc":"ES","lat":36.54,"lng":-4.62,"pop":71482},"estepona":{"cc":"ES","lat":36.43,"lng":-5.15,"pop":67012},"el puerto de santa mara":{"cc":"ES","lat":36.59,"lng":-6.23,"pop":88364},"el puerto de santa maria":{"cc":"ES","lat":36.59,"lng":-6.23,"pop":88364},"el ejido":{"cc":"ES","lat":36.78,"lng":-2.81,"pop":84710},"elda":{"cc":"ES","lat":38.48,"lng":-0.79,"pop":55168},"elche":{"cc":"ES","lat":38.26,"lng":-0.7,"pop":234765},"dos hermanas":{"cc":"ES","lat":37.28,"lng":-5.92,"pop":122943},"ciudad real":{"cc":"ES","lat":38.99,"lng":-3.93,"pop":74743},"chiclana de la frontera":{"cc":"ES","lat":36.42,"lng":-6.14,"pop":83831},"castello de la plana":{"cc":"ES","lat":39.99,"lng":-0.05,"pop":171857},"castell de la plana":{"cc":"ES","lat":39.99,"lng":-0.05,"pop":171857},"campina":{"cc":"ES","lat":38.22,"lng":-2.98,"pop":67904},"campia":{"cc":"ES","lat":38.22,"lng":-2.98,"pop":67904},"calvi":{"cc":"ES","lat":39.57,"lng":2.51,"pop":51774},"calvia":{"cc":"ES","lat":39.57,"lng":2.51,"pop":51774},"benidorm":{"cc":"ES","lat":38.54,"lng":-0.13,"pop":70450},"benalmdena":{"cc":"ES","lat":36.6,"lng":-4.57,"pop":58854},"benalmadena":{"cc":"ES","lat":36.6,"lng":-4.57,"pop":58854},"badajoz":{"cc":"ES","lat":38.88,"lng":-6.97,"pop":150530},"arrecife":{"cc":"ES","lat":28.96,"lng":-13.55,"pop":61351},"arona":{"cc":"ES","lat":28.1,"lng":-16.68,"pop":78614},"almeria":{"cc":"ES","lat":36.84,"lng":-2.46,"pop":196851},"almera":{"cc":"ES","lat":36.84,"lng":-2.46,"pop":196851},"alicante":{"cc":"ES","lat":38.35,"lng":-0.48,"pop":348901},"algeciras":{"cc":"ES","lat":36.13,"lng":-5.45,"pop":121414},"alcoy":{"cc":"ES","lat":38.71,"lng":-0.47,"pop":61552},"alcala de guadaira":{"cc":"ES","lat":37.34,"lng":-5.84,"pop":70155},"alcal de guadaira":{"cc":"ES","lat":37.34,"lng":-5.84,"pop":70155},"albacete":{"cc":"ES","lat":38.99,"lng":-1.86,"pop":173050},"grao de murviedro":{"cc":"ES","lat":39.64,"lng":-0.24,"pop":62368},"zamora":{"cc":"ES","lat":41.51,"lng":-5.74,"pop":61827},"gasteiz vitoria":{"cc":"ES","lat":42.85,"lng":-2.67,"pop":257407},"villaverde":{"cc":"ES","lat":40.35,"lng":-3.7,"pop":126802},"vilanova i la geltru":{"cc":"ES","lat":41.22,"lng":1.73,"pop":65890},"vilanova i la geltr":{"cc":"ES","lat":41.22,"lng":1.73,"pop":65890},"viladecans":{"cc":"ES","lat":41.31,"lng":2.01,"pop":66168},"vigo":{"cc":"ES","lat":42.23,"lng":-8.72,"pop":293642},"viclvaro":{"cc":"ES","lat":40.4,"lng":-3.6,"pop":66439},"vicalvaro":{"cc":"ES","lat":40.4,"lng":-3.6,"pop":66439},"vallecas":{"cc":"ES","lat":40.38,"lng":-3.62,"pop":53208},"valladolid":{"cc":"ES","lat":41.66,"lng":-4.72,"pop":300618},"valdemoro":{"cc":"ES","lat":40.19,"lng":-3.68,"pop":74745},"rivas-vaciamadrid":{"cc":"ES","lat":40.33,"lng":-3.51,"pop":68405},"torrelavega":{"cc":"ES","lat":43.35,"lng":-4.05,"pop":55297},"torrejn de ardoz":{"cc":"ES","lat":40.46,"lng":-3.47,"pop":118162},"torrejon de ardoz":{"cc":"ES","lat":40.46,"lng":-3.47,"pop":118162},"tetun de las victorias":{"cc":"ES","lat":40.46,"lng":-3.7,"pop":155000},"tetuan de las victorias":{"cc":"ES","lat":40.46,"lng":-3.7,"pop":155000},"terrassa":{"cc":"ES","lat":41.57,"lng":2.02,"pop":218535},"tarragona":{"cc":"ES","lat":41.12,"lng":1.25,"pop":141542},"segovia":{"cc":"ES","lat":40.95,"lng":-4.12,"pop":51683},"cerdanyola del valls":{"cc":"ES","lat":41.49,"lng":2.14,"pop":58747},"cerdanyola del valles":{"cc":"ES","lat":41.49,"lng":2.14,"pop":58747},"barakaldo":{"cc":"ES","lat":43.3,"lng":-2.99,"pop":100435},"santiago de compostela":{"cc":"ES","lat":42.88,"lng":-8.55,"pop":99536},"santander":{"cc":"ES","lat":43.47,"lng":-3.8,"pop":173635},"santa coloma de gramenet":{"cc":"ES","lat":41.45,"lng":2.21,"pop":118821},"san sebastian de los reyes":{"cc":"ES","lat":40.56,"lng":-3.63,"pop":75912},"san sebastin de los reyes":{"cc":"ES","lat":40.56,"lng":-3.63,"pop":75912},"san sebastian":{"cc":"ES","lat":43.31,"lng":-1.97,"pop":185357},"donostia san sebastin":{"cc":"ES","lat":43.31,"lng":-1.97,"pop":185357},"sant cugat del valls":{"cc":"ES","lat":41.47,"lng":2.09,"pop":79253},"sant cugat del valles":{"cc":"ES","lat":41.47,"lng":2.09,"pop":79253},"sant boi de llobregat":{"cc":"ES","lat":41.34,"lng":2.04,"pop":82428},"sant andreu":{"cc":"ES","lat":41.44,"lng":2.19,"pop":142598},"sabadell":{"cc":"ES","lat":41.54,"lng":2.11,"pop":211734},"rub":{"cc":"ES","lat":41.49,"lng":2.03,"pop":72987},"rubi":{"cc":"ES","lat":41.49,"lng":2.03,"pop":72987},"reus":{"cc":"ES","lat":41.16,"lng":1.11,"pop":103477},"puente de vallecas":{"cc":"ES","lat":40.39,"lng":-3.66,"pop":244151},"pozuelo de alarcn":{"cc":"ES","lat":40.43,"lng":-3.81,"pop":82428},"pozuelo de alarcon":{"cc":"ES","lat":40.43,"lng":-3.81,"pop":82428},"pontevedra":{"cc":"ES","lat":42.43,"lng":-8.64,"pop":82802},"ponferrada":{"cc":"ES","lat":42.55,"lng":-6.6,"pop":68736},"parla":{"cc":"ES","lat":40.24,"lng":-3.77,"pop":115611},"palencia":{"cc":"ES","lat":42.01,"lng":-4.52,"pop":78629},"oviedo":{"cc":"ES","lat":43.36,"lng":-5.84,"pop":220027},"ourense":{"cc":"ES","lat":42.34,"lng":-7.86,"pop":105233},"mstoles":{"cc":"ES","lat":40.32,"lng":-3.86,"pop":207095},"mostoles":{"cc":"ES","lat":40.32,"lng":-3.86,"pop":207095},"moratalaz":{"cc":"ES","lat":40.41,"lng":-3.65,"pop":104923},"mollet del valles":{"cc":"ES","lat":41.54,"lng":2.21,"pop":52484},"mollet del valls":{"cc":"ES","lat":41.54,"lng":2.21,"pop":52484},"matar":{"cc":"ES","lat":41.54,"lng":2.44,"pop":126988},"mataro":{"cc":"ES","lat":41.54,"lng":2.44,"pop":126988},"manresa":{"cc":"ES","lat":41.73,"lng":1.82,"pop":76250},"majadahonda":{"cc":"ES","lat":40.47,"lng":-3.87,"pop":68110},"lugo":{"cc":"ES","lat":43.01,"lng":-7.56,"pop":98025},"logrono":{"cc":"ES","lat":42.47,"lng":-2.45,"pop":151164},"logroo":{"cc":"ES","lat":42.47,"lng":-2.45,"pop":151164},"lleida":{"cc":"ES","lat":41.62,"lng":0.62,"pop":140797},"leganes":{"cc":"ES","lat":40.33,"lng":-3.76,"pop":188425},"legans":{"cc":"ES","lat":40.33,"lng":-3.76,"pop":188425},"las rozas de madrid":{"cc":"ES","lat":40.49,"lng":-3.87,"pop":95550},"a coruna":{"cc":"ES","lat":43.37,"lng":-8.4,"pop":250438},"a corua":{"cc":"ES","lat":43.37,"lng":-8.4,"pop":250438},"irun":{"cc":"ES","lat":43.34,"lng":-1.79,"pop":61983},"huesca":{"cc":"ES","lat":42.14,"lng":-0.41,"pop":53956},"lhospitalet de llobregat":{"cc":"ES","lat":41.36,"lng":2.1,"pop":257038},"hortaleza":{"cc":"ES","lat":40.47,"lng":-3.64,"pop":161661},"getxo":{"cc":"ES","lat":43.36,"lng":-3.01,"pop":80770},"granollers":{"cc":"ES","lat":41.61,"lng":2.29,"pop":60981},"grcia":{"cc":"ES","lat":41.4,"lng":2.16,"pop":121502},"gracia":{"cc":"ES","lat":41.4,"lng":2.16,"pop":121502},"gijn":{"cc":"ES","lat":43.54,"lng":-5.66,"pop":271780},"gijon":{"cc":"ES","lat":43.54,"lng":-5.66,"pop":271780},"getafe":{"cc":"ES","lat":40.31,"lng":-3.73,"pop":187525},"girona":{"cc":"ES","lat":41.98,"lng":2.82,"pop":100266},"gamonal":{"cc":"ES","lat":42.36,"lng":-3.67,"pop":60000},"fuenlabrada":{"cc":"ES","lat":40.28,"lng":-3.79,"pop":190496},"fuencarral":{"cc":"ES","lat":40.5,"lng":-3.68,"pop":238765},"el prat de llobregat":{"cc":"ES","lat":41.33,"lng":2.09,"pop":63418},"ferrol":{"cc":"ES","lat":43.48,"lng":-8.23,"pop":66799},"coslada":{"cc":"ES","lat":40.42,"lng":-3.56,"pop":81860},"cornella de llobregat":{"cc":"ES","lat":41.35,"lng":2.08,"pop":87173},"cornell de llobregat":{"cc":"ES","lat":41.35,"lng":2.08,"pop":87173},"collado-villalba":{"cc":"ES","lat":40.64,"lng":-4.0,"pop":63074},"ciudad lineal":{"cc":"ES","lat":40.45,"lng":-3.65,"pop":228171},"chamartin":{"cc":"ES","lat":40.46,"lng":-3.68,"pop":140000},"chamartn":{"cc":"ES","lat":40.46,"lng":-3.68,"pop":140000},"castelldefels":{"cc":"ES","lat":41.28,"lng":1.97,"pop":66375},"burgos":{"cc":"ES","lat":42.34,"lng":-3.7,"pop":176418},"boadilla del monte":{"cc":"ES","lat":40.41,"lng":-3.88,"pop":52626},"bilbao":{"cc":"ES","lat":43.26,"lng":-2.93,"pop":347342},"badalona":{"cc":"ES","lat":41.45,"lng":2.25,"pop":217741},"aviles":{"cc":"ES","lat":43.55,"lng":-5.92,"pop":78715},"avils":{"cc":"ES","lat":43.55,"lng":-5.92,"pop":78715},"avila":{"cc":"ES","lat":40.66,"lng":-4.7,"pop":57657},"vila":{"cc":"ES","lat":40.66,"lng":-4.7,"pop":57657},"arganda":{"cc":"ES","lat":40.3,"lng":-3.44,"pop":51489},"aranjuez":{"cc":"ES","lat":40.03,"lng":-3.6,"pop":54055},"algorta":{"cc":"ES","lat":43.35,"lng":-3.01,"pop":82624},"alcorcon":{"cc":"ES","lat":40.35,"lng":-3.82,"pop":172384},"alcorcn":{"cc":"ES","lat":40.35,"lng":-3.82,"pop":172384},"alcobendas":{"cc":"ES","lat":40.55,"lng":-3.64,"pop":116037},"alcal de henares":{"cc":"ES","lat":40.48,"lng":-3.36,"pop":193751},"alcala de henares":{"cc":"ES","lat":40.48,"lng":-3.36,"pop":193751},"nou barris":{"cc":"ES","lat":41.44,"lng":2.18,"pop":166310},"ceuta":{"cc":"ES","lat":35.89,"lng":-5.32,"pop":83179},"moncloa-aravaca":{"cc":"ES","lat":40.44,"lng":-3.73,"pop":116531},"eixample":{"cc":"ES","lat":41.39,"lng":2.16,"pop":266477},"les corts":{"cc":"ES","lat":41.39,"lng":2.13,"pop":82270},"sarria-sant gervasi":{"cc":"ES","lat":41.4,"lng":2.14,"pop":147912},"sarri-sant gervasi":{"cc":"ES","lat":41.4,"lng":2.14,"pop":147912},"horta-guinardo":{"cc":"ES","lat":41.42,"lng":2.17,"pop":168092},"horta-guinard":{"cc":"ES","lat":41.42,"lng":2.17,"pop":168092},"sants-montjuic":{"cc":"ES","lat":41.37,"lng":2.15,"pop":183120},"sants-montjuc":{"cc":"ES","lat":41.37,"lng":2.15,"pop":183120},"sant marti":{"cc":"ES","lat":41.42,"lng":2.2,"pop":235719},"sant mart":{"cc":"ES","lat":41.42,"lng":2.2,"pop":235719},"ciutat vella":{"cc":"ES","lat":41.38,"lng":2.17,"pop":102347},"arganzuela":{"cc":"ES","lat":40.4,"lng":-3.7,"pop":148797},"san blas-canillejas":{"cc":"ES","lat":40.44,"lng":-3.62,"pop":157367},"usera":{"cc":"ES","lat":40.39,"lng":-3.7,"pop":141189},"chamberi":{"cc":"ES","lat":40.43,"lng":-3.7,"pop":145934},"chamber":{"cc":"ES","lat":40.43,"lng":-3.7,"pop":145934},"carabanchel":{"cc":"ES","lat":40.39,"lng":-3.72,"pop":253678},"madrid centro":{"cc":"ES","lat":40.42,"lng":-3.7,"pop":149718},"retiro":{"cc":"ES","lat":40.41,"lng":-3.68,"pop":126058},"delicias":{"cc":"ES","lat":41.65,"lng":-0.91,"pop":110520},"santutxu":{"cc":"ES","lat":43.25,"lng":-2.92,"pop":60000},"sagrada famlia":{"cc":"ES","lat":41.4,"lng":2.17,"pop":51623},"sagrada familia":{"cc":"ES","lat":41.4,"lng":2.17,"pop":51623},"centro":{"cc":"ES","lat":28.13,"lng":-15.43,"pop":88546},"fuencarral-el pardo":{"cc":"ES","lat":40.5,"lng":-3.73,"pop":220085},"villa de vallecas":{"cc":"ES","lat":40.37,"lng":-3.6,"pop":65162},"la vila de grcia":{"cc":"ES","lat":41.4,"lng":2.16,"pop":50928},"la vila de gracia":{"cc":"ES","lat":41.4,"lng":2.16,"pop":50928},"la nova esquerra de leixample":{"cc":"ES","lat":41.38,"lng":2.15,"pop":57676},"barri de sant andreu":{"cc":"ES","lat":41.44,"lng":2.19,"pop":56818},"pueblo nuevo":{"cc":"ES","lat":40.43,"lng":-3.64,"pop":62840},"valverde":{"cc":"ES","lat":40.5,"lng":-3.68,"pop":64757},"las guilas":{"cc":"ES","lat":40.38,"lng":-3.77,"pop":51268},"las aguilas":{"cc":"ES","lat":40.38,"lng":-3.77,"pop":51268},"aluche":{"cc":"ES","lat":40.39,"lng":-3.76,"pop":66588},"ventas":{"cc":"ES","lat":40.42,"lng":-3.65,"pop":50218},"pinar del rey":{"cc":"ES","lat":40.47,"lng":-3.65,"pop":52031},"valdefuentes":{"cc":"ES","lat":40.49,"lng":-3.64,"pop":69176},"ziway":{"cc":"ET","lat":7.93,"lng":38.72,"pop":90500},"yirga alem":{"cc":"ET","lat":6.75,"lng":38.42,"pop":81600},"wikro":{"cc":"ET","lat":13.8,"lng":39.6,"pop":64000},"warder":{"cc":"ET","lat":6.97,"lng":45.34,"pop":450400},"wendo":{"cc":"ET","lat":6.6,"lng":38.42,"pop":59300},"welkt":{"cc":"ET","lat":8.28,"lng":37.78,"pop":77500},"welkite":{"cc":"ET","lat":8.28,"lng":37.78,"pop":77500},"weldiya":{"cc":"ET","lat":11.83,"lng":39.59,"pop":104000},"tp":{"cc":"ET","lat":7.2,"lng":35.45,"pop":66700},"tepi":{"cc":"ET","lat":7.2,"lng":35.45,"pop":66700},"shashamane":{"cc":"ET","lat":7.2,"lng":38.6,"pop":208400},"sekota":{"cc":"ET","lat":12.63,"lng":39.03,"pop":50300},"sebeta":{"cc":"ET","lat":8.92,"lng":38.62,"pop":102300},"nekemt":{"cc":"ET","lat":9.08,"lng":36.55,"pop":156000},"nekemte":{"cc":"ET","lat":9.08,"lng":36.55,"pop":156000},"negl":{"cc":"ET","lat":5.32,"lng":39.58,"pop":73100},"negele":{"cc":"ET","lat":5.32,"lng":39.58,"pop":73100},"nazret":{"cc":"ET","lat":8.55,"lng":39.27,"pop":456900},"nazrt":{"cc":"ET","lat":8.55,"lng":39.27,"pop":456900},"mota":{"cc":"ET","lat":11.08,"lng":37.87,"pop":59000},"mojo":{"cc":"ET","lat":8.59,"lng":39.12,"pop":61300},"mizan teferi":{"cc":"ET","lat":7.0,"lng":35.59,"pop":62000},"mzan tefer":{"cc":"ET","lat":7.0,"lng":35.59,"pop":62000},"metu":{"cc":"ET","lat":8.3,"lng":35.58,"pop":59700},"mek":{"cc":"ET","lat":8.15,"lng":38.82,"pop":75200},"meki":{"cc":"ET","lat":8.15,"lng":38.82,"pop":75200},"mekele":{"cc":"ET","lat":13.5,"lng":39.48,"pop":457900},"kolto":{"cc":"ET","lat":7.32,"lng":38.08,"pop":72200},"kolito":{"cc":"ET","lat":7.32,"lng":38.08,"pop":72200},"kombolcha":{"cc":"ET","lat":11.08,"lng":39.74,"pop":132100},"jinka":{"cc":"ET","lat":5.65,"lng":36.65,"pop":54400},"jimma":{"cc":"ET","lat":7.67,"lng":36.83,"pop":250900},"jijiga":{"cc":"ET","lat":9.35,"lng":42.8,"pop":483000},"inda silas":{"cc":"ET","lat":14.1,"lng":38.28,"pop":100100},"inda silase":{"cc":"ET","lat":14.1,"lng":38.28,"pop":100100},"hosaina":{"cc":"ET","lat":7.55,"lng":37.85,"pop":188200},"harar":{"cc":"ET","lat":9.31,"lng":42.12,"pop":157000},"hgere hiywet":{"cc":"ET","lat":8.98,"lng":37.85,"pop":99900},"hagere hiywet":{"cc":"ET","lat":8.98,"lng":37.85,"pop":99900},"gonder":{"cc":"ET","lat":12.6,"lng":37.47,"pop":466000},"gode":{"cc":"ET","lat":5.95,"lng":43.55,"pop":67900},"goba":{"cc":"ET","lat":7.02,"lng":39.98,"pop":66500},"waliso":{"cc":"ET","lat":8.53,"lng":37.97,"pop":78600},"gimbi":{"cc":"ET","lat":9.17,"lng":35.83,"pop":64300},"gambela":{"cc":"ET","lat":8.25,"lng":34.58,"pop":97600},"gambla":{"cc":"ET","lat":8.25,"lng":34.58,"pop":97600},"finote selam":{"cc":"ET","lat":10.7,"lng":37.27,"pop":58400},"fich":{"cc":"ET","lat":9.8,"lng":38.73,"pop":57100},"fiche":{"cc":"ET","lat":9.8,"lng":38.73,"pop":57100},"felege neway":{"cc":"ET","lat":6.3,"lng":36.88,"pop":61000},"durame":{"cc":"ET","lat":7.23,"lng":37.88,"pop":65900},"duram":{"cc":"ET","lat":7.23,"lng":37.88,"pop":65900},"dire dawa":{"cc":"ET","lat":9.59,"lng":41.87,"pop":343000},"dla":{"cc":"ET","lat":6.42,"lng":38.32,"pop":158800},"dila":{"cc":"ET","lat":6.42,"lng":38.32,"pop":158800},"dessie":{"cc":"ET","lat":11.13,"lng":39.63,"pop":270400},"dembi dolo":{"cc":"ET","lat":8.53,"lng":34.8,"pop":61100},"demb dolo":{"cc":"ET","lat":8.53,"lng":34.8,"pop":61100},"bishoftu":{"cc":"ET","lat":8.75,"lng":38.98,"pop":207400},"debre tabor":{"cc":"ET","lat":11.85,"lng":38.02,"pop":125300},"debre markos":{"cc":"ET","lat":10.35,"lng":37.73,"pop":140700},"debre birhan":{"cc":"ET","lat":9.68,"lng":39.53,"pop":146900},"dangila":{"cc":"ET","lat":11.27,"lng":36.83,"pop":56000},"ciro":{"cc":"ET","lat":7.83,"lng":38.23,"pop":69800},"butajra":{"cc":"ET","lat":8.12,"lng":38.37,"pop":89800},"butajira":{"cc":"ET","lat":8.12,"lng":38.37,"pop":89800},"bonga":{"cc":"ET","lat":7.29,"lng":36.24,"pop":56000},"boditi":{"cc":"ET","lat":6.97,"lng":37.87,"pop":64900},"bodt":{"cc":"ET","lat":6.97,"lng":37.87,"pop":64900},"bahir dar":{"cc":"ET","lat":11.59,"lng":37.39,"pop":350000},"awasa":{"cc":"ET","lat":7.06,"lng":38.48,"pop":422200},"sosa":{"cc":"ET","lat":10.07,"lng":34.53,"pop":69700},"asosa":{"cc":"ET","lat":10.07,"lng":34.53,"pop":69700},"asela":{"cc":"ET","lat":7.95,"lng":39.13,"pop":139500},"sela":{"cc":"ET","lat":7.95,"lng":39.13,"pop":139500},"areka":{"cc":"ET","lat":7.07,"lng":37.7,"pop":84500},"reka":{"cc":"ET","lat":7.07,"lng":37.7,"pop":84500},"arba minch":{"cc":"ET","lat":6.03,"lng":37.55,"pop":201000},"arabi":{"cc":"ET","lat":9.96,"lng":42.49,"pop":148933},"rab":{"cc":"ET","lat":9.96,"lng":42.49,"pop":148933},"alemaya":{"cc":"ET","lat":9.39,"lng":42.01,"pop":63700},"alamata":{"cc":"ET","lat":12.42,"lng":39.56,"pop":70400},"aksum":{"cc":"ET","lat":14.12,"lng":38.72,"pop":94500},"hagere maryam":{"cc":"ET","lat":5.63,"lng":38.24,"pop":57700},"agaro":{"cc":"ET","lat":7.85,"lng":36.65,"pop":52800},"garo":{"cc":"ET","lat":7.85,"lng":36.65,"pop":52800},"adwa":{"cc":"ET","lat":14.16,"lng":38.9,"pop":85600},"addis ababa":{"cc":"ET","lat":9.02,"lng":38.75,"pop":3860000},"dgrat":{"cc":"ET","lat":14.28,"lng":39.46,"pop":121800},"adigrat":{"cc":"ET","lat":14.28,"lng":39.46,"pop":121800},"sodo":{"cc":"ET","lat":6.86,"lng":37.76,"pop":204100},"kobo":{"cc":"ET","lat":10.03,"lng":39.85,"pop":56100},"arsi negele":{"cc":"ET","lat":7.35,"lng":38.67,"pop":98100},"chagni":{"cc":"ET","lat":10.96,"lng":36.5,"pop":52300},"burayu":{"cc":"ET","lat":9.04,"lng":38.66,"pop":101400},"gununo":{"cc":"ET","lat":6.92,"lng":37.65,"pop":84510},"vantaa":{"cc":"FI","lat":60.29,"lng":25.04,"pop":252724},"vaasa":{"cc":"FI","lat":63.1,"lng":21.62,"pop":69819},"turku":{"cc":"FI","lat":60.45,"lng":22.27,"pop":206655},"tampere":{"cc":"FI","lat":61.5,"lng":23.79,"pop":260646},"seinaejoki":{"cc":"FI","lat":62.79,"lng":22.83,"pop":66848},"seinjoki":{"cc":"FI","lat":62.79,"lng":22.83,"pop":66848},"salo":{"cc":"FI","lat":60.38,"lng":23.13,"pop":50794},"rovaniemi":{"cc":"FI","lat":66.5,"lng":25.69,"pop":65670},"pori":{"cc":"FI","lat":61.48,"lng":21.79,"pop":83157},"oulu":{"cc":"FI","lat":65.01,"lng":25.47,"pop":216066},"mikkeli":{"cc":"FI","lat":61.69,"lng":27.27,"pop":51661},"lappeenranta":{"cc":"FI","lat":61.06,"lng":28.19,"pop":72909},"lahti":{"cc":"FI","lat":60.98,"lng":25.66,"pop":121622},"kuopio":{"cc":"FI","lat":62.89,"lng":27.68,"pop":125462},"kouvola":{"cc":"FI","lat":60.87,"lng":26.7,"pop":78094},"kotka":{"cc":"FI","lat":60.47,"lng":26.95,"pop":50157},"jyvskyl":{"cc":"FI","lat":62.24,"lng":25.72,"pop":148744},"jyvaeskylae":{"cc":"FI","lat":62.24,"lng":25.72,"pop":148744},"joensuu":{"cc":"FI","lat":62.6,"lng":29.76,"pop":78398},"helsinki":{"cc":"FI","lat":60.17,"lng":24.94,"pop":658864},"hmeenlinna":{"cc":"FI","lat":61.0,"lng":24.46,"pop":68473},"haemeenlinna":{"cc":"FI","lat":61.0,"lng":24.46,"pop":68473},"espoo":{"cc":"FI","lat":60.21,"lng":24.65,"pop":323910},"porvoo":{"cc":"FI","lat":60.39,"lng":25.67,"pop":51853},"east helsinki":{"cc":"FI","lat":60.21,"lng":25.08,"pop":170557},"suva":{"cc":"FJ","lat":-18.14,"lng":178.43,"pop":77366},"lautoka":{"cc":"FJ","lat":-17.62,"lng":177.45,"pop":52500},"nasinu":{"cc":"FJ","lat":-18.07,"lng":178.51,"pop":92043},"vitry-sur-seine":{"cc":"FR","lat":48.79,"lng":2.4,"pop":81001},"villeurbanne":{"cc":"FR","lat":45.77,"lng":4.88,"pop":131445},"versailles":{"cc":"FR","lat":48.8,"lng":2.13,"pop":85416},"venissieux":{"cc":"FR","lat":45.7,"lng":4.89,"pop":57584},"vnissieux":{"cc":"FR","lat":45.7,"lng":4.89,"pop":57584},"paris 15 vaugirard":{"cc":"FR","lat":48.84,"lng":2.3,"pop":229713},"vannes":{"cc":"FR","lat":47.66,"lng":-2.76,"pop":54020},"valence":{"cc":"FR","lat":44.93,"lng":4.91,"pop":63864},"troyes":{"cc":"FR","lat":48.3,"lng":4.09,"pop":60785},"tours":{"cc":"FR","lat":47.39,"lng":0.7,"pop":141621},"tourcoing":{"cc":"FR","lat":50.72,"lng":3.16,"pop":99160},"toulouse":{"cc":"FR","lat":43.6,"lng":1.44,"pop":511684},"toulon":{"cc":"FR","lat":43.12,"lng":5.93,"pop":168701},"tarbes":{"cc":"FR","lat":43.23,"lng":0.07,"pop":52106},"strasbourg":{"cc":"FR","lat":48.58,"lng":7.75,"pop":274845},"sartrouville":{"cc":"FR","lat":48.95,"lng":2.19,"pop":53980},"sarcelles":{"cc":"FR","lat":49.0,"lng":2.38,"pop":57979},"saint-quentin":{"cc":"FR","lat":49.85,"lng":3.29,"pop":55407},"saint-nazaire":{"cc":"FR","lat":47.28,"lng":-2.22,"pop":67054},"saint-maur-des-fosss":{"cc":"FR","lat":48.79,"lng":2.49,"pop":75402},"saint-maur-des-fosses":{"cc":"FR","lat":48.79,"lng":2.49,"pop":75402},"saint-malo":{"cc":"FR","lat":48.65,"lng":-2.01,"pop":50676},"saint-tienne":{"cc":"FR","lat":45.43,"lng":4.39,"pop":176280},"saint-etienne":{"cc":"FR","lat":45.43,"lng":4.39,"pop":176280},"saint-brieuc":{"cc":"FR","lat":48.52,"lng":-2.77,"pop":52774},"rueil-malmaison":{"cc":"FR","lat":48.88,"lng":2.19,"pop":76616},"rouen":{"cc":"FR","lat":49.44,"lng":1.1,"pop":116331},"roubaix":{"cc":"FR","lat":50.69,"lng":3.17,"pop":99507},"paris 12 reuilly":{"cc":"FR","lat":48.84,"lng":2.39,"pop":138024},"rennes":{"cc":"FR","lat":48.11,"lng":-1.67,"pop":227830},"reims":{"cc":"FR","lat":49.27,"lng":4.03,"pop":196565},"quimper":{"cc":"FR","lat":48.0,"lng":-4.1,"pop":63849},"paris 11 popincourt":{"cc":"FR","lat":48.86,"lng":2.38,"pop":138170},"poitiers":{"cc":"FR","lat":46.58,"lng":0.34,"pop":85960},"pessac":{"cc":"FR","lat":44.81,"lng":-0.63,"pop":57944},"perpignan":{"cc":"FR","lat":42.7,"lng":2.9,"pop":110706},"pau":{"cc":"FR","lat":43.31,"lng":-0.36,"pop":82697},"paris 16 passy":{"cc":"FR","lat":48.86,"lng":2.28,"pop":159386},"paris":{"cc":"FR","lat":48.85,"lng":2.35,"pop":2138551},"pantin":{"cc":"FR","lat":48.89,"lng":2.41,"pop":52922},"paris 05 panthon":{"cc":"FR","lat":48.84,"lng":2.35,"pop":55252},"paris 05 pantheon":{"cc":"FR","lat":48.84,"lng":2.35,"pop":55252},"paris 09 opera":{"cc":"FR","lat":48.87,"lng":2.34,"pop":57271},"paris 09 opra":{"cc":"FR","lat":48.87,"lng":2.34,"pop":57271},"paris 14 observatoire":{"cc":"FR","lat":48.83,"lng":2.33,"pop":136455},"noisy-le-grand":{"cc":"FR","lat":48.85,"lng":2.56,"pop":62420},"niort":{"cc":"FR","lat":46.32,"lng":-0.46,"pop":54660},"nimes":{"cc":"FR","lat":43.84,"lng":4.36,"pop":148236},"nmes":{"cc":"FR","lat":43.84,"lng":4.36,"pop":148236},"nice":{"cc":"FR","lat":43.7,"lng":7.27,"pop":342669},"neuilly-sur-seine":{"cc":"FR","lat":48.88,"lng":2.27,"pop":61300},"narbonne":{"cc":"FR","lat":43.18,"lng":3.0,"pop":50776},"nantes":{"cc":"FR","lat":47.22,"lng":-1.55,"pop":325070},"nanterre":{"cc":"FR","lat":48.89,"lng":2.21,"pop":86719},"nancy":{"cc":"FR","lat":48.68,"lng":6.18,"pop":105058},"mulhouse":{"cc":"FR","lat":47.75,"lng":7.33,"pop":111430},"montreuil":{"cc":"FR","lat":48.86,"lng":2.44,"pop":111240},"montpellier":{"cc":"FR","lat":43.61,"lng":3.88,"pop":248252},"montauban":{"cc":"FR","lat":44.02,"lng":1.35,"pop":52434},"metz":{"cc":"FR","lat":49.12,"lng":6.17,"pop":123914},"mrignac":{"cc":"FR","lat":44.84,"lng":-0.65,"pop":69791},"merignac":{"cc":"FR","lat":44.84,"lng":-0.65,"pop":69791},"paris 20 mnilmontant":{"cc":"FR","lat":48.86,"lng":2.4,"pop":185140},"paris 20 menilmontant":{"cc":"FR","lat":48.86,"lng":2.4,"pop":185140},"meaux":{"cc":"FR","lat":48.96,"lng":2.88,"pop":53811},"marseille":{"cc":"FR","lat":43.3,"lng":5.38,"pop":877215},"maisons-alfort":{"cc":"FR","lat":48.81,"lng":2.44,"pop":53964},"lyon":{"cc":"FR","lat":45.75,"lng":4.85,"pop":520774},"lorient":{"cc":"FR","lat":47.75,"lng":-3.37,"pop":58112},"limoges":{"cc":"FR","lat":45.83,"lng":1.25,"pop":141176},"lille":{"cc":"FR","lat":50.63,"lng":3.06,"pop":238695},"levallois-perret":{"cc":"FR","lat":48.89,"lng":2.29,"pop":62178},"le mans":{"cc":"FR","lat":48.0,"lng":0.2,"pop":144515},"le havre":{"cc":"FR","lat":49.49,"lng":0.11,"pop":185972},"la seyne-sur-mer":{"cc":"FR","lat":43.1,"lng":5.88,"pop":62330},"la roche-sur-yon":{"cc":"FR","lat":46.67,"lng":-1.43,"pop":59410},"la rochelle":{"cc":"FR","lat":46.16,"lng":-1.15,"pop":76810},"juan-les-pins":{"cc":"FR","lat":43.57,"lng":7.11,"pop":60000},"ivry-sur-seine":{"cc":"FR","lat":48.82,"lng":2.38,"pop":57897},"issy-les-moulineaux":{"cc":"FR","lat":48.82,"lng":2.28,"pop":61447},"hyeres":{"cc":"FR","lat":43.12,"lng":6.13,"pop":50487},"hyres":{"cc":"FR","lat":43.12,"lng":6.13,"pop":50487},"grenoble":{"cc":"FR","lat":45.18,"lng":5.71,"pop":158552},"paris 13 gobelins":{"cc":"FR","lat":48.83,"lng":2.36,"pop":181271},"frejus":{"cc":"FR","lat":43.43,"lng":6.74,"pop":53098},"frjus":{"cc":"FR","lat":43.43,"lng":6.74,"pop":53098},"fontenay-sous-bois":{"cc":"FR","lat":48.85,"lng":2.48,"pop":52075},"vry":{"cc":"FR","lat":48.63,"lng":2.44,"pop":51900},"evry":{"cc":"FR","lat":48.63,"lng":2.44,"pop":51900},"evreux":{"cc":"FR","lat":49.02,"lng":1.15,"pop":57795},"vreux":{"cc":"FR","lat":49.02,"lng":1.15,"pop":57795},"paris 10 entrepot":{"cc":"FR","lat":48.87,"lng":2.36,"pop":83873},"paris 10 entrept":{"cc":"FR","lat":48.87,"lng":2.36,"pop":83873},"dunkirk":{"cc":"FR","lat":51.03,"lng":2.38,"pop":86263},"drancy":{"cc":"FR","lat":48.93,"lng":2.45,"pop":62488},"dijon":{"cc":"FR","lat":47.31,"lng":5.01,"pop":159941},"crteil":{"cc":"FR","lat":48.79,"lng":2.47,"pop":84833},"creteil":{"cc":"FR","lat":48.79,"lng":2.47,"pop":84833},"courbevoie":{"cc":"FR","lat":48.9,"lng":2.26,"pop":85158},"colombes":{"cc":"FR","lat":48.92,"lng":2.25,"pop":82300},"colmar":{"cc":"FR","lat":48.08,"lng":7.36,"pop":65405},"clichy":{"cc":"FR","lat":48.9,"lng":2.31,"pop":57467},"clermont-ferrand":{"cc":"FR","lat":45.78,"lng":3.09,"pop":147865},"clamart":{"cc":"FR","lat":48.8,"lng":2.27,"pop":51400},"cholet":{"cc":"FR","lat":47.06,"lng":-0.88,"pop":53160},"chteauroux":{"cc":"FR","lat":46.81,"lng":1.69,"pop":53301},"chateauroux":{"cc":"FR","lat":46.81,"lng":1.69,"pop":53301},"charleville-mzires":{"cc":"FR","lat":49.77,"lng":4.72,"pop":52415},"charleville-mezieres":{"cc":"FR","lat":49.77,"lng":4.72,"pop":52415},"champigny-sur-marne":{"cc":"FR","lat":48.82,"lng":2.49,"pop":76726},"chambry":{"cc":"FR","lat":45.57,"lng":5.92,"pop":61640},"chambery":{"cc":"FR","lat":45.57,"lng":5.92,"pop":61640},"chalons-en-champagne":{"cc":"FR","lat":48.95,"lng":4.37,"pop":51257},"chlons-en-champagne":{"cc":"FR","lat":48.95,"lng":4.37,"pop":51257},"cergy":{"cc":"FR","lat":49.04,"lng":2.08,"pop":57576},"cannes":{"cc":"FR","lat":43.55,"lng":7.01,"pop":74545},"calais":{"cc":"FR","lat":50.95,"lng":1.86,"pop":74433},"caen":{"cc":"FR","lat":49.19,"lng":-0.36,"pop":110624},"paris 19 buttes-chaumont":{"cc":"FR","lat":48.88,"lng":2.38,"pop":178691},"paris 18 buttes-montmartre":{"cc":"FR","lat":48.89,"lng":2.34,"pop":183127},"brive-la-gaillarde":{"cc":"FR","lat":45.16,"lng":1.53,"pop":53466},"bourges":{"cc":"FR","lat":47.08,"lng":2.4,"pop":67987},"boulogne-billancourt":{"cc":"FR","lat":48.84,"lng":2.24,"pop":108782},"bordeaux":{"cc":"FR","lat":44.84,"lng":-0.58,"pop":265328},"blois":{"cc":"FR","lat":47.59,"lng":1.33,"pop":53660},"bziers":{"cc":"FR","lat":43.34,"lng":3.21,"pop":74081},"beziers":{"cc":"FR","lat":43.34,"lng":3.21,"pop":74081},"besanon":{"cc":"FR","lat":47.25,"lng":6.02,"pop":128426},"besancon":{"cc":"FR","lat":47.25,"lng":6.02,"pop":128426},"belfort":{"cc":"FR","lat":47.64,"lng":6.85,"pop":54562},"beauvais":{"cc":"FR","lat":49.43,"lng":2.08,"pop":53393},"paris 17 batignolles-monceau":{"cc":"FR","lat":48.88,"lng":2.32,"pop":159212},"avignon":{"cc":"FR","lat":43.95,"lng":4.81,"pop":89769},"aulnay-sous-bois":{"cc":"FR","lat":48.94,"lng":2.49,"pop":80615},"aubervilliers":{"cc":"FR","lat":48.92,"lng":2.38,"pop":70914},"asnieres-sur-seine":{"cc":"FR","lat":48.92,"lng":2.28,"pop":86742},"asnires-sur-seine":{"cc":"FR","lat":48.92,"lng":2.28,"pop":86742},"arles":{"cc":"FR","lat":43.68,"lng":4.63,"pop":53431},"argenteuil":{"cc":"FR","lat":48.95,"lng":2.25,"pop":101475},"antony":{"cc":"FR","lat":48.75,"lng":2.3,"pop":59845},"antibes":{"cc":"FR","lat":43.58,"lng":7.12,"pop":76393},"angers":{"cc":"FR","lat":47.47,"lng":-0.55,"pop":168279},"amiens":{"cc":"FR","lat":49.9,"lng":2.3,"pop":143086},"albi":{"cc":"FR","lat":43.93,"lng":2.15,"pop":52409},"ajaccio":{"cc":"FR","lat":41.92,"lng":8.74,"pop":54364},"aix-en-provence":{"cc":"FR","lat":43.53,"lng":5.45,"pop":146821},"villeneuve-dascq":{"cc":"FR","lat":50.62,"lng":3.17,"pop":62400},"lyon 03":{"cc":"FR","lat":45.76,"lng":4.85,"pop":102725},"lyon 06":{"cc":"FR","lat":45.77,"lng":4.85,"pop":52862},"lyon 07":{"cc":"FR","lat":45.75,"lng":4.84,"pop":82573},"lyon 08":{"cc":"FR","lat":45.74,"lng":4.87,"pop":86154},"lyon 09":{"cc":"FR","lat":45.77,"lng":4.8,"pop":51983},"marseille 08":{"cc":"FR","lat":43.27,"lng":5.38,"pop":78837},"marseille 10":{"cc":"FR","lat":43.28,"lng":5.42,"pop":51299},"marseille 09":{"cc":"FR","lat":43.25,"lng":5.41,"pop":76868},"marseille 11":{"cc":"FR","lat":43.29,"lng":5.44,"pop":56792},"marseille 12":{"cc":"FR","lat":43.3,"lng":5.44,"pop":58734},"marseille 13":{"cc":"FR","lat":43.32,"lng":5.41,"pop":89316},"marseille 14":{"cc":"FR","lat":43.34,"lng":5.38,"pop":61920},"marseille 15":{"cc":"FR","lat":43.37,"lng":5.35,"pop":77770},"saint-quentin-en-yvelines":{"cc":"FR","lat":48.77,"lng":2.02,"pop":146598},"cergy-pontoise":{"cc":"FR","lat":49.04,"lng":2.08,"pop":183430},"marne la valle":{"cc":"FR","lat":48.84,"lng":2.64,"pop":318325},"marne la vallee":{"cc":"FR","lat":48.84,"lng":2.64,"pop":318325},"picpus":{"cc":"FR","lat":48.84,"lng":2.4,"pop":61920},"paris 10e arrondissement":{"cc":"FR","lat":48.88,"lng":2.36,"pop":83459},"paris 11e arrondissement":{"cc":"FR","lat":48.86,"lng":2.38,"pop":144292},"paris 12e arrondissement":{"cc":"FR","lat":48.84,"lng":2.44,"pop":140311},"paris 13e arrondissement":{"cc":"FR","lat":48.83,"lng":2.36,"pop":177833},"gare":{"cc":"FR","lat":48.83,"lng":2.38,"pop":75580},"maison blanche":{"cc":"FR","lat":48.83,"lng":2.35,"pop":64302},"port-gentil":{"cc":"GA","lat":-0.72,"lng":8.78,"pop":164018},"oyem":{"cc":"GA","lat":1.6,"lng":11.58,"pop":72939},"owendo":{"cc":"GA","lat":0.29,"lng":9.5,"pop":95313},"ntoum":{"cc":"GA","lat":0.39,"lng":9.76,"pop":62445},"libreville":{"cc":"GA","lat":0.39,"lng":9.45,"pop":846090},"franceville":{"cc":"GA","lat":-1.63,"lng":13.58,"pop":132895},"york":{"cc":"GB","lat":53.96,"lng":-1.08,"pop":156135},"yeovil":{"cc":"GB","lat":50.94,"lng":-2.63,"pop":50176},"wrexham":{"cc":"GB","lat":53.05,"lng":-2.99,"pop":65692},"worthing":{"cc":"GB","lat":50.82,"lng":-0.38,"pop":113866},"wolverhampton":{"cc":"GB","lat":52.59,"lng":-2.12,"pop":263700},"woking":{"cc":"GB","lat":51.32,"lng":-0.56,"pop":103900},"wimbledon":{"cc":"GB","lat":51.42,"lng":-0.21,"pop":68187},"wigan":{"cc":"GB","lat":53.54,"lng":-2.64,"pop":175405},"widnes":{"cc":"GB","lat":53.36,"lng":-2.73,"pop":61464},"weston-super-mare":{"cc":"GB","lat":51.35,"lng":-2.98,"pop":82903},"city of westminster":{"cc":"GB","lat":51.5,"lng":-0.14,"pop":247614},"west bromwich":{"cc":"GB","lat":52.52,"lng":-1.99,"pop":103112},"wembley":{"cc":"GB","lat":51.55,"lng":-0.3,"pop":90045},"welwyn garden city":{"cc":"GB","lat":51.8,"lng":-0.21,"pop":51505},"wellingborough":{"cc":"GB","lat":52.3,"lng":-0.69,"pop":56564},"watford":{"cc":"GB","lat":51.66,"lng":-0.4,"pop":125707},"waterlooville":{"cc":"GB","lat":50.88,"lng":-1.03,"pop":64350},"warrington":{"cc":"GB","lat":53.39,"lng":-2.58,"pop":172330},"walthamstow":{"cc":"GB","lat":51.59,"lng":-0.02,"pop":109424},"walsall":{"cc":"GB","lat":52.59,"lng":-1.98,"pop":172141},"wallasey":{"cc":"GB","lat":53.42,"lng":-3.06,"pop":58794},"uxbridge":{"cc":"GB","lat":51.55,"lng":-0.48,"pop":70000},"tynemouth":{"cc":"GB","lat":55.02,"lng":-1.43,"pop":60605},"tottenham":{"cc":"GB","lat":51.6,"lng":-0.07,"pop":130000},"torquay":{"cc":"GB","lat":50.46,"lng":-3.53,"pop":65388},"tamworth":{"cc":"GB","lat":52.63,"lng":-1.7,"pop":81964},"swindon":{"cc":"GB","lat":51.56,"lng":-1.78,"pop":201669},"swansea":{"cc":"GB","lat":51.62,"lng":-3.94,"pop":300352},"sutton coldfield":{"cc":"GB","lat":52.57,"lng":-1.82,"pop":109899},"sutton":{"cc":"GB","lat":51.35,"lng":-0.2,"pop":187600},"sunderland":{"cc":"GB","lat":54.9,"lng":-1.38,"pop":170134},"stroud":{"cc":"GB","lat":51.75,"lng":-2.2,"pop":60155},"streatham":{"cc":"GB","lat":51.43,"lng":-0.13,"pop":58055},"stourbridge":{"cc":"GB","lat":52.46,"lng":-2.14,"pop":56950},"stoke-on-trent":{"cc":"GB","lat":53.0,"lng":-2.19,"pop":258366},"stockton-on-tees":{"cc":"GB","lat":54.57,"lng":-1.32,"pop":79957},"stockport":{"cc":"GB","lat":53.41,"lng":-2.16,"pop":139052},"stevenage":{"cc":"GB","lat":51.9,"lng":-0.2,"pop":91774},"staines":{"cc":"GB","lat":51.43,"lng":-0.51,"pop":51040},"stafford":{"cc":"GB","lat":52.81,"lng":-2.12,"pop":70145},"south shields":{"cc":"GB","lat":55.0,"lng":-1.43,"pop":83655},"southport":{"cc":"GB","lat":53.65,"lng":-3.01,"pop":91703},"southend-on-sea":{"cc":"GB","lat":51.54,"lng":0.71,"pop":295310},"southampton":{"cc":"GB","lat":50.9,"lng":-1.4,"pop":269781},"southall":{"cc":"GB","lat":51.51,"lng":-0.37,"pop":78253},"solihull":{"cc":"GB","lat":52.41,"lng":-1.78,"pop":126577},"smethwick":{"cc":"GB","lat":52.49,"lng":-1.97,"pop":53653},"slough":{"cc":"GB","lat":51.51,"lng":-0.6,"pop":164793},"sittingbourne":{"cc":"GB","lat":51.34,"lng":0.73,"pop":54392},"shrewsbury":{"cc":"GB","lat":52.71,"lng":-2.75,"pop":76782},"sheffield":{"cc":"GB","lat":53.38,"lng":-1.47,"pop":556500},"scunthorpe":{"cc":"GB","lat":53.58,"lng":-0.65,"pop":81576},"scarborough":{"cc":"GB","lat":54.28,"lng":-0.4,"pop":61749},"salford":{"cc":"GB","lat":53.49,"lng":-2.29,"pop":129794},"st helens":{"cc":"GB","lat":53.45,"lng":-2.73,"pop":183200},"st albans":{"cc":"GB","lat":51.75,"lng":-0.33,"pop":84561},"runcorn":{"cc":"GB","lat":53.34,"lng":-2.73,"pop":61145},"rugby":{"cc":"GB","lat":52.37,"lng":-1.26,"pop":78117},"royal tunbridge wells":{"cc":"GB","lat":51.13,"lng":0.26,"pop":68910},"rotherham":{"cc":"GB","lat":53.43,"lng":-1.36,"pop":117618},"romford":{"cc":"GB","lat":51.58,"lng":0.19,"pop":95000},"rochdale":{"cc":"GB","lat":53.62,"lng":-2.16,"pop":97550},"rhondda":{"cc":"GB","lat":51.66,"lng":-3.45,"pop":69506},"redhill":{"cc":"GB","lat":51.24,"lng":-0.17,"pop":51559},"redditch":{"cc":"GB","lat":52.31,"lng":-1.95,"pop":87847},"putney":{"cc":"GB","lat":51.46,"lng":-0.22,"pop":77140},"purley":{"cc":"GB","lat":51.34,"lng":-0.11,"pop":72000},"preston":{"cc":"GB","lat":53.76,"lng":-2.7,"pop":313332},"poole":{"cc":"GB","lat":50.71,"lng":-1.98,"pop":151500},"paisley":{"cc":"GB","lat":55.83,"lng":-4.43,"pop":77270},"paignton":{"cc":"GB","lat":50.44,"lng":-3.57,"pop":67520},"oxford":{"cc":"GB","lat":51.75,"lng":-1.26,"pop":162100},"oldham":{"cc":"GB","lat":53.54,"lng":-2.12,"pop":237110},"nuneaton":{"cc":"GB","lat":52.52,"lng":-1.47,"pop":88813},"nottingham":{"cc":"GB","lat":52.95,"lng":-1.15,"pop":323632},"norwich":{"cc":"GB","lat":52.63,"lng":1.3,"pop":143135},"northampton":{"cc":"GB","lat":52.25,"lng":-0.88,"pop":245899},"newtownabbey":{"cc":"GB","lat":54.66,"lng":-5.91,"pop":63860},"newport":{"cc":"GB","lat":51.59,"lng":-3.0,"pop":161506},"newcastle upon tyne":{"cc":"GB","lat":54.97,"lng":-1.61,"pop":300125},"newcastle under lyme":{"cc":"GB","lat":53.0,"lng":-2.23,"pop":127727},"morley":{"cc":"GB","lat":53.74,"lng":-1.6,"pop":57385},"morecambe":{"cc":"GB","lat":54.07,"lng":-2.86,"pop":51644},"mitcham":{"cc":"GB","lat":51.4,"lng":-0.17,"pop":63393},"milton keynes":{"cc":"GB","lat":52.04,"lng":-0.76,"pop":256385},"middlesbrough":{"cc":"GB","lat":54.58,"lng":-1.23,"pop":142707},"meikle earnock":{"cc":"GB","lat":55.75,"lng":-4.03,"pop":54480},"maidstone":{"cc":"GB","lat":51.27,"lng":0.52,"pop":107627},"maidenhead":{"cc":"GB","lat":51.52,"lng":-0.72,"pop":70374},"macclesfield":{"cc":"GB","lat":53.26,"lng":-2.13,"pop":54345},"luton":{"cc":"GB","lat":51.88,"lng":-0.42,"pop":225262},"lowestoft":{"cc":"GB","lat":52.48,"lng":1.75,"pop":71327},"loughborough":{"cc":"GB","lat":52.77,"lng":-1.2,"pop":64884},"londonderry county borough":{"cc":"GB","lat":55.0,"lng":-7.31,"pop":87153},"derry":{"cc":"GB","lat":55.0,"lng":-7.31,"pop":83652},"livingston":{"cc":"GB","lat":55.9,"lng":-3.52,"pop":56840},"liverpool":{"cc":"GB","lat":53.41,"lng":-2.98,"pop":496770},"littlehampton":{"cc":"GB","lat":50.81,"lng":-0.54,"pop":58714},"lisburn":{"cc":"GB","lat":54.52,"lng":-6.04,"pop":77506},"leicester":{"cc":"GB","lat":52.64,"lng":-1.13,"pop":368600},"leeds":{"cc":"GB","lat":53.8,"lng":-1.55,"pop":536280},"royal leamington spa":{"cc":"GB","lat":52.29,"lng":-1.52,"pop":50923},"kirkcaldy":{"cc":"GB","lat":56.12,"lng":-3.16,"pop":50370},"kingston upon hull":{"cc":"GB","lat":53.74,"lng":-0.34,"pop":314018},"kidderminster":{"cc":"GB","lat":52.39,"lng":-2.25,"pop":57400},"keighley":{"cc":"GB","lat":53.87,"lng":-1.91,"pop":50171},"islington":{"cc":"GB","lat":51.54,"lng":-0.1,"pop":319143},"ipswich":{"cc":"GB","lat":52.06,"lng":1.16,"pop":178835},"ilford":{"cc":"GB","lat":51.56,"lng":0.07,"pop":168168},"huyton":{"cc":"GB","lat":53.41,"lng":-2.84,"pop":54738},"huddersfield":{"cc":"GB","lat":53.65,"lng":-1.78,"pop":149017},"hove":{"cc":"GB","lat":50.83,"lng":-0.17,"pop":75174},"hounslow":{"cc":"GB","lat":51.47,"lng":-0.36,"pop":66292},"horsham":{"cc":"GB","lat":51.06,"lng":-0.33,"pop":51472},"hinckley":{"cc":"GB","lat":52.54,"lng":-1.38,"pop":50712},"high wycombe":{"cc":"GB","lat":51.63,"lng":-0.75,"pop":133204},"hereford":{"cc":"GB","lat":52.06,"lng":-2.71,"pop":60415},"hemel hempstead":{"cc":"GB","lat":51.75,"lng":-0.45,"pop":95961},"hayes":{"cc":"GB","lat":51.52,"lng":-0.42,"pop":93928},"hartlepool":{"cc":"GB","lat":54.69,"lng":-1.21,"pop":88855},"harrow":{"cc":"GB","lat":51.58,"lng":-0.33,"pop":149246},"harrogate":{"cc":"GB","lat":53.99,"lng":-1.54,"pop":89060},"harlow":{"cc":"GB","lat":51.78,"lng":0.11,"pop":93300},"halesowen":{"cc":"GB","lat":52.45,"lng":-2.05,"pop":60097},"grimsby":{"cc":"GB","lat":53.57,"lng":-0.08,"pop":86138},"great yarmouth":{"cc":"GB","lat":52.61,"lng":1.73,"pop":63434},"grays":{"cc":"GB","lat":51.48,"lng":0.33,"pop":89755},"gosport":{"cc":"GB","lat":50.8,"lng":-1.13,"pop":81952},"glasgow":{"cc":"GB","lat":55.87,"lng":-4.26,"pop":626410},"gillingham":{"cc":"GB","lat":51.39,"lng":0.55,"pop":101187},"gateshead":{"cc":"GB","lat":54.96,"lng":-1.6,"pop":77649},"fylde":{"cc":"GB","lat":53.83,"lng":-2.92,"pop":76500},"fulham":{"cc":"GB","lat":51.48,"lng":-0.2,"pop":87161},"folkestone":{"cc":"GB","lat":51.08,"lng":1.17,"pop":66429},"finchley":{"cc":"GB","lat":51.6,"lng":-0.2,"pop":65812},"feltham":{"cc":"GB","lat":51.45,"lng":-0.41,"pop":63368},"farnborough":{"cc":"GB","lat":51.29,"lng":-0.76,"pop":60652},"exeter":{"cc":"GB","lat":50.72,"lng":-3.53,"pop":130709},"esher":{"cc":"GB","lat":51.37,"lng":-0.37,"pop":52392},"enfield town":{"cc":"GB","lat":51.65,"lng":-0.08,"pop":156858},"ellesmere port town":{"cc":"GB","lat":53.28,"lng":-2.9,"pop":65430},"edinburgh":{"cc":"GB","lat":55.95,"lng":-3.2,"pop":514990},"eastleigh":{"cc":"GB","lat":50.97,"lng":-1.35,"pop":54225},"east kilbride":{"cc":"GB","lat":55.76,"lng":-4.18,"pop":75310},"eastbourne":{"cc":"GB","lat":50.77,"lng":0.28,"pop":101689},"dunstable":{"cc":"GB","lat":51.89,"lng":-0.52,"pop":51973},"dunfermline":{"cc":"GB","lat":56.07,"lng":-3.46,"pop":54990},"dudley":{"cc":"GB","lat":52.5,"lng":-2.08,"pop":199059},"doncaster":{"cc":"GB","lat":53.52,"lng":-1.13,"pop":113566},"dewsbury":{"cc":"GB","lat":53.69,"lng":-1.63,"pop":61035},"derby":{"cc":"GB","lat":52.92,"lng":-1.48,"pop":270468},"dartford":{"cc":"GB","lat":51.45,"lng":0.21,"pop":51240},"darlington":{"cc":"GB","lat":54.52,"lng":-1.55,"pop":92363},"dagenham":{"cc":"GB","lat":51.55,"lng":0.17,"pop":108368},"cumbernauld":{"cc":"GB","lat":55.95,"lng":-3.99,"pop":50530},"croydon":{"cc":"GB","lat":51.38,"lng":-0.1,"pop":173314},"cricklewood":{"cc":"GB","lat":51.56,"lng":-0.22,"pop":65000},"crewe":{"cc":"GB","lat":53.1,"lng":-2.44,"pop":76437},"crawley":{"cc":"GB","lat":51.11,"lng":-0.18,"pop":124008},"coventry":{"cc":"GB","lat":52.41,"lng":-1.51,"pop":345324},"corby":{"cc":"GB","lat":52.5,"lng":-0.69,"pop":68164},"colchester":{"cc":"GB","lat":51.89,"lng":0.9,"pop":130245},"clacton-on-sea":{"cc":"GB","lat":51.79,"lng":1.16,"pop":50548},"chingford":{"cc":"GB","lat":51.63,"lng":0.0,"pop":70583},"chesterfield":{"cc":"GB","lat":53.25,"lng":-1.42,"pop":113057},"chester":{"cc":"GB","lat":53.19,"lng":-2.89,"pop":90524},"cheltenham":{"cc":"GB","lat":51.9,"lng":-2.08,"pop":118836},"chelsea":{"cc":"GB","lat":51.49,"lng":-0.17,"pop":60000},"chelmsford":{"cc":"GB","lat":51.74,"lng":0.47,"pop":111511},"chatham":{"cc":"GB","lat":51.38,"lng":0.53,"pop":80596},"castlereagh":{"cc":"GB","lat":54.57,"lng":-5.88,"pop":56679},"carlisle":{"cc":"GB","lat":54.9,"lng":-2.94,"pop":78470},"cardiff":{"cc":"GB","lat":51.48,"lng":-3.18,"pop":372089},"canterbury":{"cc":"GB","lat":51.28,"lng":1.08,"pop":55087},"cannock":{"cc":"GB","lat":52.69,"lng":-2.03,"pop":86121},"bury":{"cc":"GB","lat":53.6,"lng":-2.3,"pop":61044},"burton upon trent":{"cc":"GB","lat":52.81,"lng":-1.64,"pop":122199},"burnley":{"cc":"GB","lat":53.8,"lng":-2.23,"pop":149422},"buckley":{"cc":"GB","lat":53.17,"lng":-3.08,"pop":63576},"brighton":{"cc":"GB","lat":50.83,"lng":-0.14,"pop":283870},"brent":{"cc":"GB","lat":51.55,"lng":-0.3,"pop":329100},"braintree":{"cc":"GB","lat":51.88,"lng":0.55,"pop":53477},"bradford":{"cc":"GB","lat":53.79,"lng":-1.75,"pop":366187},"bracknell":{"cc":"GB","lat":51.41,"lng":-0.75,"pop":76103},"bournemouth":{"cc":"GB","lat":50.72,"lng":-1.88,"pop":163600},"bootle":{"cc":"GB","lat":53.47,"lng":-3.02,"pop":57791},"bolton":{"cc":"GB","lat":53.58,"lng":-2.43,"pop":141331},"bognor regis":{"cc":"GB","lat":50.78,"lng":-0.68,"pop":63885},"bletchley":{"cc":"GB","lat":51.99,"lng":-0.73,"pop":50193},"blackpool":{"cc":"GB","lat":53.82,"lng":-3.05,"pop":145007},"blackburn":{"cc":"GB","lat":53.75,"lng":-2.48,"pop":146521},"birkenhead":{"cc":"GB","lat":53.39,"lng":-3.01,"pop":325264},"bexley":{"cc":"GB","lat":51.44,"lng":0.15,"pop":228000},"belfast":{"cc":"GB","lat":54.6,"lng":-5.93,"pop":348005},"bedford":{"cc":"GB","lat":52.13,"lng":-0.47,"pop":106940},"beckenham":{"cc":"GB","lat":51.41,"lng":-0.03,"pop":60739},"bebington":{"cc":"GB","lat":53.35,"lng":-3.02,"pop":57600},"bath":{"cc":"GB","lat":51.38,"lng":-2.36,"pop":101557},"basingstoke":{"cc":"GB","lat":51.26,"lng":-1.09,"pop":107642},"basildon":{"cc":"GB","lat":51.57,"lng":0.46,"pop":144859},"barry":{"cc":"GB","lat":51.4,"lng":-3.28,"pop":54673},"barrow in furness":{"cc":"GB","lat":54.11,"lng":-3.23,"pop":55489},"barnsley":{"cc":"GB","lat":53.55,"lng":-1.48,"pop":71447},"barking":{"cc":"GB","lat":51.53,"lng":0.08,"pop":218534},"bangor":{"cc":"GB","lat":54.66,"lng":-5.67,"pop":61011},"aylesbury":{"cc":"GB","lat":51.82,"lng":-0.81,"pop":74748},"ashford":{"cc":"GB","lat":51.15,"lng":0.87,"pop":62787},"acton":{"cc":"GB","lat":51.51,"lng":-0.28,"pop":62480},"tonypandy":{"cc":"GB","lat":51.62,"lng":-3.46,"pop":62545},"telford":{"cc":"GB","lat":52.68,"lng":-2.45,"pop":155570},"craigavon":{"cc":"GB","lat":54.45,"lng":-6.39,"pop":59236},"battersea":{"cc":"GB","lat":51.47,"lng":-0.16,"pop":75651},"south croydon":{"cc":"GB","lat":51.36,"lng":-0.09,"pop":55198},"becontree":{"cc":"GB","lat":51.55,"lng":0.13,"pop":100000},"brixton":{"cc":"GB","lat":51.47,"lng":-0.11,"pop":66300},"canary wharf":{"cc":"GB","lat":51.51,"lng":-0.02,"pop":73390},"leytonstone":{"cc":"GB","lat":51.57,"lng":0.01,"pop":54696},"mendip":{"cc":"GB","lat":51.24,"lng":-2.63,"pop":110000},"peckham":{"cc":"GB","lat":51.47,"lng":-0.07,"pop":71552},"rossendale":{"cc":"GB","lat":53.68,"lng":-2.28,"pop":67400},"high peak":{"cc":"GB","lat":53.37,"lng":-1.85,"pop":92666},"stamford hill":{"cc":"GB","lat":51.57,"lng":-0.07,"pop":68050},"archway":{"cc":"GB","lat":51.57,"lng":-0.13,"pop":215667},"tbilisi":{"cc":"GE","lat":41.69,"lng":44.83,"pop":1049498},"sokhumi":{"cc":"GE","lat":43.01,"lng":40.99,"pop":65439},"rustavi":{"cc":"GE","lat":41.56,"lng":44.98,"pop":128249},"kutaisi":{"cc":"GE","lat":42.27,"lng":42.69,"pop":135201},"batumi":{"cc":"GE","lat":41.64,"lng":41.63,"pop":186949},"cayenne":{"cc":"GF","lat":4.94,"lng":-52.33,"pop":61550},"yendi":{"cc":"GH","lat":9.44,"lng":-0.01,"pop":64676},"winneba":{"cc":"GH","lat":5.35,"lng":-0.62,"pop":71288},"wa":{"cc":"GH","lat":10.06,"lng":-2.5,"pop":78107},"twifu praso":{"cc":"GH","lat":5.61,"lng":-1.55,"pop":100851},"teshi old town":{"cc":"GH","lat":5.58,"lng":-0.11,"pop":144013},"tema":{"cc":"GH","lat":5.67,"lng":-0.02,"pop":155782},"techiman":{"cc":"GH","lat":7.59,"lng":-1.94,"pop":84074},"tamale":{"cc":"GH","lat":9.4,"lng":-0.84,"pop":464316},"takoradi":{"cc":"GH","lat":4.9,"lng":-1.76,"pop":389114},"tafo":{"cc":"GH","lat":6.73,"lng":-1.61,"pop":50457},"swedru":{"cc":"GH","lat":5.54,"lng":-0.7,"pop":54417},"sunyani":{"cc":"GH","lat":7.34,"lng":-2.33,"pop":92825},"suhum":{"cc":"GH","lat":6.04,"lng":-0.45,"pop":50610},"sekondi-takoradi":{"cc":"GH","lat":4.93,"lng":-1.76,"pop":138872},"kasoa":{"cc":"GH","lat":5.53,"lng":-0.42,"pop":86753},"akim oda":{"cc":"GH","lat":5.93,"lng":-0.99,"pop":60604},"obuase":{"cc":"GH","lat":6.2,"lng":-1.67,"pop":179604},"nungua":{"cc":"GH","lat":5.6,"lng":-0.08,"pop":70483},"mampong":{"cc":"GH","lat":7.06,"lng":-1.4,"pop":51745},"medina estates":{"cc":"GH","lat":5.67,"lng":-0.16,"pop":101207},"kumasi":{"cc":"GH","lat":6.69,"lng":-1.62,"pop":2544530},"koforidua":{"cc":"GH","lat":6.09,"lng":-0.26,"pop":151255},"kintampo":{"cc":"GH","lat":8.06,"lng":-1.73,"pop":53711},"jirapa":{"cc":"GH","lat":10.54,"lng":-2.7,"pop":91279},"japekrom":{"cc":"GH","lat":7.58,"lng":-2.79,"pop":96000},"hohoe":{"cc":"GH","lat":7.15,"lng":0.47,"pop":92076},"ho":{"cc":"GH","lat":6.6,"lng":0.47,"pop":130701},"gbawe":{"cc":"GH","lat":5.58,"lng":-0.31,"pop":86718},"ejura":{"cc":"GH","lat":7.39,"lng":-1.36,"pop":70807},"cape coast":{"cc":"GH","lat":5.11,"lng":-1.25,"pop":212426},"buduburam":{"cc":"GH","lat":5.52,"lng":-0.48,"pop":63217},"bolgatanga":{"cc":"GH","lat":10.79,"lng":-0.85,"pop":81958},"berekum":{"cc":"GH","lat":7.45,"lng":-2.58,"pop":70536},"bawku":{"cc":"GH","lat":11.06,"lng":-0.24,"pop":76459},"ashaiman":{"cc":"GH","lat":5.7,"lng":-0.03,"pop":190972},"amanfrom":{"cc":"GH","lat":5.54,"lng":-0.4,"pop":119467},"aflao":{"cc":"GH","lat":6.12,"lng":1.19,"pop":66546},"atsiaman":{"cc":"GH","lat":5.7,"lng":-0.33,"pop":202932},"accra":{"cc":"GH","lat":5.56,"lng":-0.2,"pop":1963264},"adenta":{"cc":"GH","lat":5.71,"lng":-0.15,"pop":50652},"tema new town":{"cc":"GH","lat":5.65,"lng":0.03,"pop":95837},"sekondi":{"cc":"GH","lat":4.93,"lng":-1.71,"pop":285506},"mandela":{"cc":"GH","lat":5.55,"lng":-0.34,"pop":77371},"sukuta":{"cc":"GM","lat":13.41,"lng":-16.71,"pop":56472},"serekunda":{"cc":"GM","lat":13.44,"lng":-16.68,"pop":340000},"bununka kunda":{"cc":"GM","lat":13.43,"lng":-16.69,"pop":66449},"brikama":{"cc":"GM","lat":13.27,"lng":-16.65,"pop":97233},"siguiri":{"cc":"GN","lat":11.42,"lng":-9.17,"pop":148018},"sangardi":{"cc":"GN","lat":11.1,"lng":-13.77,"pop":54824},"sangaredi":{"cc":"GN","lat":11.1,"lng":-13.77,"pop":54824},"kamsar":{"cc":"GN","lat":10.65,"lng":-14.62,"pop":113350},"nzrkor":{"cc":"GN","lat":7.76,"lng":-8.82,"pop":226426},"nzerekore":{"cc":"GN","lat":7.76,"lng":-8.82,"pop":226426},"manah":{"cc":"GN","lat":9.73,"lng":-13.42,"pop":194297},"maneah":{"cc":"GN","lat":9.73,"lng":-13.42,"pop":194297},"mamou":{"cc":"GN","lat":10.38,"lng":-12.09,"pop":79109},"macenta":{"cc":"GN","lat":8.54,"lng":-9.47,"pop":68020},"labe":{"cc":"GN","lat":11.32,"lng":-12.28,"pop":107571},"lab":{"cc":"GN","lat":11.32,"lng":-12.28,"pop":107571},"kissidougou":{"cc":"GN","lat":9.18,"lng":-10.1,"pop":116019},"kindia":{"cc":"GN","lat":10.06,"lng":-12.87,"pop":161024},"kankan":{"cc":"GN","lat":10.39,"lng":-9.31,"pop":221428},"gueckedou":{"cc":"GN","lat":8.57,"lng":-10.13,"pop":79140},"fria":{"cc":"GN","lat":10.37,"lng":-13.58,"pop":64169},"faranah":{"cc":"GN","lat":10.04,"lng":-10.74,"pop":70181},"dubrka":{"cc":"GN","lat":9.79,"lng":-13.52,"pop":182296},"dubreka":{"cc":"GN","lat":9.79,"lng":-13.52,"pop":182296},"dixinn":{"cc":"GN","lat":9.55,"lng":-13.67,"pop":137287},"coyah":{"cc":"GN","lat":9.71,"lng":-13.38,"pop":77103},"conakry":{"cc":"GN","lat":9.54,"lng":-13.68,"pop":1928389},"camayenne":{"cc":"GN","lat":9.54,"lng":-13.69,"pop":1871242},"bok":{"cc":"GN","lat":10.93,"lng":-14.29,"pop":63736},"boke":{"cc":"GN","lat":10.93,"lng":-14.29,"pop":63736},"kolaboui":{"cc":"GN","lat":10.8,"lng":-14.4,"pop":57251},"les abymes":{"cc":"GP","lat":16.27,"lng":-61.51,"pop":53514},"malabo":{"cc":"GQ","lat":3.76,"lng":8.78,"pop":155963},"bata":{"cc":"GQ","lat":1.86,"lng":9.77,"pop":173046},"volos":{"cc":"GR","lat":39.37,"lng":22.95,"pop":86048},"vronas":{"cc":"GR","lat":37.96,"lng":23.75,"pop":61308},"vyronas":{"cc":"GR","lat":37.96,"lng":23.75,"pop":61308},"trkala":{"cc":"GR","lat":39.55,"lng":21.77,"pop":61653},"trikala":{"cc":"GR","lat":39.55,"lng":21.77,"pop":61653},"piraeus":{"cc":"GR","lat":37.94,"lng":23.65,"pop":163688},"petroupolis":{"cc":"GR","lat":38.04,"lng":23.68,"pop":58979},"peristri":{"cc":"GR","lat":38.02,"lng":23.69,"pop":139981},"peristeri":{"cc":"GR","lat":38.02,"lng":23.69,"pop":139981},"ptra":{"cc":"GR","lat":38.25,"lng":21.74,"pop":168034},"patra":{"cc":"GR","lat":38.25,"lng":21.74,"pop":168034},"palaio faliro":{"cc":"GR","lat":37.93,"lng":23.7,"pop":64021},"palai fliro":{"cc":"GR","lat":37.93,"lng":23.7,"pop":64021},"nkaia":{"cc":"GR","lat":37.97,"lng":23.65,"pop":89380},"nikaia":{"cc":"GR","lat":37.97,"lng":23.65,"pop":89380},"na smrni":{"cc":"GR","lat":37.95,"lng":23.71,"pop":73076},"nea smyrni":{"cc":"GR","lat":37.95,"lng":23.71,"pop":73076},"lion":{"cc":"GR","lat":38.03,"lng":23.7,"pop":84793},"ilion":{"cc":"GR","lat":38.03,"lng":23.7,"pop":84793},"na iona":{"cc":"GR","lat":38.04,"lng":23.76,"pop":67134},"nea ionia":{"cc":"GR","lat":38.04,"lng":23.76,"pop":67134},"larisa":{"cc":"GR","lat":39.63,"lng":22.42,"pop":146926},"lrisa":{"cc":"GR","lat":39.63,"lng":22.42,"pop":146926},"lamia":{"cc":"GR","lat":38.9,"lng":22.43,"pop":52006},"lama":{"cc":"GR","lat":38.9,"lng":22.43,"pop":52006},"chania":{"cc":"GR","lat":35.51,"lng":24.03,"pop":53910},"chani":{"cc":"GR","lat":35.51,"lng":24.03,"pop":53910},"chalkda":{"cc":"GR","lat":38.46,"lng":23.6,"pop":59125},"chalkida":{"cc":"GR","lat":38.46,"lng":23.6,"pop":59125},"khalndrion":{"cc":"GR","lat":38.02,"lng":23.8,"pop":74192},"khalandrion":{"cc":"GR","lat":38.02,"lng":23.8,"pop":74192},"keratsini":{"cc":"GR","lat":37.96,"lng":23.62,"pop":77077},"keratsni":{"cc":"GR","lat":37.96,"lng":23.62,"pop":77077},"kallitha":{"cc":"GR","lat":37.95,"lng":23.7,"pop":100641},"kallithea":{"cc":"GR","lat":37.95,"lng":23.7,"pop":100641},"kalamata":{"cc":"GR","lat":37.04,"lng":22.11,"pop":54100},"irkleion":{"cc":"GR","lat":35.33,"lng":25.14,"pop":137154},"irakleion":{"cc":"GR","lat":35.33,"lng":25.14,"pop":137154},"ioannina":{"cc":"GR","lat":39.66,"lng":20.85,"pop":65574},"ionnina":{"cc":"GR","lat":39.66,"lng":20.85,"pop":65574},"glyfda":{"cc":"GR","lat":37.86,"lng":23.76,"pop":87305},"glyfada":{"cc":"GR","lat":37.86,"lng":23.76,"pop":87305},"galtsi":{"cc":"GR","lat":38.02,"lng":23.75,"pop":59345},"galatsi":{"cc":"GR","lat":38.02,"lng":23.75,"pop":59345},"agios dimitrios":{"cc":"GR","lat":37.93,"lng":23.73,"pop":71294},"agia paraskevi":{"cc":"GR","lat":38.02,"lng":23.83,"pop":59704},"aga paraskev":{"cc":"GR","lat":38.02,"lng":23.83,"pop":59704},"marosi":{"cc":"GR","lat":38.05,"lng":23.8,"pop":72333},"marousi":{"cc":"GR","lat":38.05,"lng":23.8,"pop":72333},"acharnes":{"cc":"GR","lat":38.08,"lng":23.73,"pop":99346},"acharns":{"cc":"GR","lat":38.08,"lng":23.73,"pop":99346},"aigleo":{"cc":"GR","lat":37.98,"lng":23.68,"pop":69946},"aigaleo":{"cc":"GR","lat":37.98,"lng":23.68,"pop":69946},"rdos":{"cc":"GR","lat":36.44,"lng":28.22,"pop":56128},"rodos":{"cc":"GR","lat":36.44,"lng":28.22,"pop":56128},"thessaloniki":{"cc":"GR","lat":40.64,"lng":22.93,"pop":317778},"thessalonki":{"cc":"GR","lat":40.64,"lng":22.93,"pop":317778},"srres":{"cc":"GR","lat":41.08,"lng":23.55,"pop":58287},"serres":{"cc":"GR","lat":41.08,"lng":23.55,"pop":58287},"kavala":{"cc":"GR","lat":40.94,"lng":24.41,"pop":54027},"kavla":{"cc":"GR","lat":40.94,"lng":24.41,"pop":54027},"katerini":{"cc":"GR","lat":40.27,"lng":22.51,"pop":53293},"katerni":{"cc":"GR","lat":40.27,"lng":22.51,"pop":53293},"kalamari":{"cc":"GR","lat":40.58,"lng":22.95,"pop":91518},"kalamaria":{"cc":"GR","lat":40.58,"lng":22.95,"pop":91518},"vosmos":{"cc":"GR","lat":40.67,"lng":22.91,"pop":74686},"evosmos":{"cc":"GR","lat":40.67,"lng":22.91,"pop":74686},"alexandroupoli":{"cc":"GR","lat":40.85,"lng":25.88,"pop":52979},"iliopoli":{"cc":"GR","lat":37.93,"lng":23.77,"pop":78153},"ilioupoli":{"cc":"GR","lat":37.93,"lng":23.77,"pop":78153},"korydalls":{"cc":"GR","lat":37.98,"lng":23.65,"pop":63445},"korydallos":{"cc":"GR","lat":37.98,"lng":23.65,"pop":63445},"zografos":{"cc":"GR","lat":37.98,"lng":23.77,"pop":71026},"zogrfos":{"cc":"GR","lat":37.98,"lng":23.77,"pop":71026},"zacapa":{"cc":"GT","lat":14.97,"lng":-89.53,"pop":60424},"villa nueva":{"cc":"GT","lat":14.53,"lng":-90.59,"pop":618397},"villa canales":{"cc":"GT","lat":14.48,"lng":-90.53,"pop":155423},"totonicapn":{"cc":"GT","lat":14.91,"lng":-91.36,"pop":103952},"totonicapan":{"cc":"GT","lat":14.91,"lng":-91.36,"pop":103952},"santa lucia cotzumalguapa":{"cc":"GT","lat":14.34,"lng":-91.02,"pop":112780},"santa luca cotzumalguapa":{"cc":"GT","lat":14.34,"lng":-91.02,"pop":112780},"santa cruz del quich":{"cc":"GT","lat":15.03,"lng":-91.15,"pop":78279},"santa cruz del quiche":{"cc":"GT","lat":15.03,"lng":-91.15,"pop":78279},"santa catarina pinula":{"cc":"GT","lat":14.57,"lng":-90.5,"pop":80582},"san pedro ayampuc":{"cc":"GT","lat":14.78,"lng":-90.45,"pop":58609},"san juan sacatepquez":{"cc":"GT","lat":14.72,"lng":-90.64,"pop":136886},"san juan sacatepequez":{"cc":"GT","lat":14.72,"lng":-90.64,"pop":136886},"san jos pinula":{"cc":"GT","lat":14.55,"lng":-90.41,"pop":79844},"san jose pinula":{"cc":"GT","lat":14.55,"lng":-90.41,"pop":79844},"san francisco el alto":{"cc":"GT","lat":14.94,"lng":-91.44,"pop":57894},"salama":{"cc":"GT","lat":15.1,"lng":-90.32,"pop":65275},"salam":{"cc":"GT","lat":15.1,"lng":-90.32,"pop":65275},"retalhuleu":{"cc":"GT","lat":14.54,"lng":-91.68,"pop":90505},"quetzaltenango":{"cc":"GT","lat":14.84,"lng":-91.52,"pop":180706},"puerto barrios":{"cc":"GT","lat":15.73,"lng":-88.6,"pop":100593},"petapa":{"cc":"GT","lat":14.5,"lng":-90.56,"pop":135447},"patzun":{"cc":"GT","lat":14.68,"lng":-91.01,"pop":58240},"patzn":{"cc":"GT","lat":14.68,"lng":-91.01,"pop":58240},"panzos":{"cc":"GT","lat":15.4,"lng":-89.64,"pop":71846},"paln":{"cc":"GT","lat":14.4,"lng":-90.7,"pop":65873},"palin":{"cc":"GT","lat":14.4,"lng":-90.7,"pop":65873},"ostuncalco":{"cc":"GT","lat":14.87,"lng":-91.62,"pop":51828},"mixco":{"cc":"GT","lat":14.63,"lng":-90.61,"pop":465773},"mazatenango":{"cc":"GT","lat":14.53,"lng":-91.5,"pop":77431},"malacatan":{"cc":"GT","lat":14.91,"lng":-92.06,"pop":92816},"malacatn":{"cc":"GT","lat":14.91,"lng":-92.06,"pop":92816},"jutiapa":{"cc":"GT","lat":14.28,"lng":-89.89,"pop":145880},"jalapa":{"cc":"GT","lat":14.64,"lng":-89.99,"pop":159840},"huehuetenango":{"cc":"GT","lat":15.32,"lng":-91.47,"pop":79426},"fraijanes":{"cc":"GT","lat":14.47,"lng":-90.44,"pop":58922},"escuintla":{"cc":"GT","lat":14.3,"lng":-90.79,"pop":156313},"comitancillo":{"cc":"GT","lat":15.09,"lng":-91.75,"pop":59489},"cobn":{"cc":"GT","lat":15.47,"lng":-90.37,"pop":212047},"coban":{"cc":"GT","lat":15.47,"lng":-90.37,"pop":212047},"coatepeque":{"cc":"GT","lat":14.7,"lng":-91.86,"pop":105415},"guatemala city":{"cc":"GT","lat":14.64,"lng":-90.51,"pop":994938},"chiquimula":{"cc":"GT","lat":14.8,"lng":-89.55,"pop":111505},"chinautla":{"cc":"GT","lat":14.7,"lng":-90.5,"pop":104972},"chimaltenango":{"cc":"GT","lat":14.66,"lng":-90.82,"pop":96985},"chichicastenango":{"cc":"GT","lat":14.94,"lng":-91.11,"pop":141567},"chicacao":{"cc":"GT","lat":14.54,"lng":-91.33,"pop":60735},"amatitlan":{"cc":"GT","lat":14.48,"lng":-90.63,"pop":71836},"amatitln":{"cc":"GT","lat":14.48,"lng":-90.63,"pop":71836},"bissau":{"cc":"GW","lat":11.86,"lng":-15.6,"pop":439704},"bairro militar":{"cc":"GW","lat":11.87,"lng":-15.62,"pop":65274},"tsuen wan":{"cc":"HK","lat":22.37,"lng":114.11,"pop":318916},"yuen long san hui":{"cc":"HK","lat":22.43,"lng":114.03,"pop":200000},"yuen long kau hui":{"cc":"HK","lat":22.45,"lng":114.03,"pop":169600},"yuen long":{"cc":"HK","lat":22.45,"lng":114.03,"pop":200000},"wong tai sin":{"cc":"HK","lat":22.35,"lng":114.18,"pop":425235},"wan chai":{"cc":"HK","lat":22.28,"lng":114.17,"pop":166695},"tuen mun":{"cc":"HK","lat":22.39,"lng":113.97,"pop":507900},"tsing yi town":{"cc":"HK","lat":22.35,"lng":114.1,"pop":182100},"tseung kwan o":{"cc":"HK","lat":22.33,"lng":114.25,"pop":412900},"tiu keng leng":{"cc":"HK","lat":22.3,"lng":114.25,"pop":51751},"tin shui wai":{"cc":"HK","lat":22.46,"lng":114.0,"pop":286232},"tai po":{"cc":"HK","lat":22.45,"lng":114.17,"pop":274100},"siu lek yuen":{"cc":"HK","lat":22.38,"lng":114.21,"pop":57349},"sha tin wai":{"cc":"HK","lat":22.38,"lng":114.2,"pop":80000},"sha tin":{"cc":"HK","lat":22.38,"lng":114.18,"pop":495200},"sham shui po":{"cc":"HK","lat":22.33,"lng":114.16,"pop":431090},"sau mau ping":{"cc":"HK","lat":22.32,"lng":114.23,"pop":54218},"pok fu lam":{"cc":"HK","lat":22.27,"lng":114.13,"pop":77100},"san tung chung hang":{"cc":"HK","lat":22.28,"lng":113.94,"pop":116000},"mong kok":{"cc":"HK","lat":22.32,"lng":114.17,"pop":62967},"ma on shan":{"cc":"HK","lat":22.41,"lng":114.24,"pop":215200},"kwai chung":{"cc":"HK","lat":22.37,"lng":114.14,"pop":331600},"kowloon city":{"cc":"HK","lat":22.33,"lng":114.19,"pop":418732},"kowloon":{"cc":"HK","lat":22.32,"lng":114.18,"pop":2232339},"hong kong":{"cc":"HK","lat":22.28,"lng":114.17,"pop":7396076},"fanling":{"cc":"HK","lat":22.49,"lng":114.14,"pop":263200},"tung chung":{"cc":"HK","lat":22.29,"lng":113.94,"pop":114100},"nam cheong":{"cc":"HK","lat":22.33,"lng":114.15,"pop":74780},"shap pat heung":{"cc":"HK","lat":22.42,"lng":114.04,"pop":77775},"lohas park":{"cc":"HK","lat":22.29,"lng":114.27,"pop":50000},"new territories":{"cc":"HK","lat":22.42,"lng":114.11,"pop":3984077},"hong kong island":{"cc":"HK","lat":22.26,"lng":114.18,"pop":1195529},"kowloon city centre":{"cc":"HK","lat":22.33,"lng":114.19,"pop":194290},"kowloon west end":{"cc":"HK","lat":22.33,"lng":114.19,"pop":74710},"puerto cortez":{"cc":"HN","lat":15.83,"lng":-87.93,"pop":142311},"tocoa":{"cc":"HN","lat":15.68,"lng":-86.0,"pop":111972},"tegucigalpa":{"cc":"HN","lat":14.08,"lng":-87.21,"pop":850848},"siguatepeque":{"cc":"HN","lat":14.6,"lng":-87.83,"pop":127468},"santa cruz de yojoa":{"cc":"HN","lat":14.98,"lng":-87.89,"pop":97848},"san pedro sula":{"cc":"HN","lat":15.51,"lng":-88.03,"pop":801259},"san pedro de copan":{"cc":"HN","lat":14.62,"lng":-88.87,"pop":63829},"san pedro de copn":{"cc":"HN","lat":14.62,"lng":-88.87,"pop":63829},"omoa":{"cc":"HN","lat":15.78,"lng":-88.04,"pop":58172},"olanchito":{"cc":"HN","lat":15.48,"lng":-86.57,"pop":124286},"la ceiba":{"cc":"HN","lat":15.76,"lng":-86.78,"pop":222055},"el progreso":{"cc":"HN","lat":15.4,"lng":-87.8,"pop":100810},"el negrito":{"cc":"HN","lat":15.32,"lng":-87.7,"pop":50550},"danli":{"cc":"HN","lat":14.03,"lng":-86.58,"pop":233789},"danl":{"cc":"HN","lat":14.03,"lng":-86.58,"pop":233789},"comayagua":{"cc":"HN","lat":14.46,"lng":-87.64,"pop":58784},"ciudad choluteca":{"cc":"HN","lat":13.31,"lng":-87.18,"pop":75872},"choloma":{"cc":"HN","lat":15.61,"lng":-87.95,"pop":139100},"catacamas":{"cc":"HN","lat":14.85,"lng":-85.89,"pop":140548},"zagreb":{"cc":"HR","lat":45.81,"lng":15.98,"pop":663592},"zadar":{"cc":"HR","lat":44.12,"lng":15.23,"pop":67309},"split":{"cc":"HR","lat":43.51,"lng":16.44,"pop":149830},"sesvete":{"cc":"HR","lat":45.83,"lng":16.12,"pop":55313},"rijeka":{"cc":"HR","lat":45.33,"lng":14.44,"pop":107964},"pula":{"cc":"HR","lat":44.87,"lng":13.85,"pop":52220},"osijek":{"cc":"HR","lat":45.55,"lng":18.69,"pop":75535},"thomazeau":{"cc":"HT","lat":18.65,"lng":-72.09,"pop":52017},"saint-michel de latalaye":{"cc":"HT","lat":19.37,"lng":-72.33,"pop":95216},"saint-marc":{"cc":"HT","lat":19.11,"lng":-72.7,"pop":266642},"port-de-paix":{"cc":"HT","lat":19.94,"lng":-72.83,"pop":306217},"port-au-prince":{"cc":"HT","lat":18.54,"lng":-72.34,"pop":1234742},"tigwav":{"cc":"HT","lat":18.43,"lng":-72.87,"pop":117504},"ptionville":{"cc":"HT","lat":18.51,"lng":-72.29,"pop":376834},"petionville":{"cc":"HT","lat":18.51,"lng":-72.29,"pop":376834},"miragoane":{"cc":"HT","lat":18.45,"lng":-73.09,"pop":89202},"miragone":{"cc":"HT","lat":18.45,"lng":-73.09,"pop":89202},"logne":{"cc":"HT","lat":18.51,"lng":-72.63,"pop":134190},"leogane":{"cc":"HT","lat":18.51,"lng":-72.63,"pop":134190},"jrmie":{"cc":"HT","lat":18.65,"lng":-74.12,"pop":97503},"jeremie":{"cc":"HT","lat":18.65,"lng":-74.12,"pop":97503},"jacmel":{"cc":"HT","lat":18.24,"lng":-72.54,"pop":137966},"gonaives":{"cc":"HT","lat":19.45,"lng":-72.69,"pop":84961},"gonaves":{"cc":"HT","lat":19.45,"lng":-72.69,"pop":84961},"dessalines":{"cc":"HT","lat":19.26,"lng":-72.52,"pop":181903},"croix-des-bouquets":{"cc":"HT","lat":18.58,"lng":-72.23,"pop":229127},"les cayes":{"cc":"HT","lat":18.19,"lng":-73.75,"pop":125799},"cap-hatien":{"cc":"HT","lat":19.76,"lng":-72.2,"pop":134815},"cap-haitien":{"cc":"HT","lat":19.76,"lng":-72.2,"pop":134815},"arcahaie":{"cc":"HT","lat":18.77,"lng":-72.51,"pop":130306},"cite soleil":{"cc":"HT","lat":18.58,"lng":-72.34,"pop":265072},"cit soleil":{"cc":"HT","lat":18.58,"lng":-72.34,"pop":265072},"carrefour":{"cc":"HT","lat":18.53,"lng":-72.4,"pop":511345},"szolnok":{"cc":"HU","lat":47.18,"lng":20.2,"pop":71285},"szeged":{"cc":"HU","lat":46.25,"lng":20.15,"pop":160766},"nyregyhza":{"cc":"HU","lat":47.96,"lng":21.72,"pop":117689},"nyiregyhaza":{"cc":"HU","lat":47.96,"lng":21.72,"pop":117689},"miskolc":{"cc":"HU","lat":48.1,"lng":20.78,"pop":154521},"eger":{"cc":"HU","lat":47.9,"lng":20.37,"pop":53876},"debrecen":{"cc":"HU","lat":47.53,"lng":21.62,"pop":202402},"bekescsaba":{"cc":"HU","lat":46.68,"lng":21.1,"pop":59732},"bkscsaba":{"cc":"HU","lat":46.68,"lng":21.1,"pop":59732},"zugl":{"cc":"HU","lat":47.52,"lng":19.11,"pop":130000},"zuglo":{"cc":"HU","lat":47.52,"lng":19.11,"pop":130000},"zalaegerszeg":{"cc":"HU","lat":46.84,"lng":16.84,"pop":61898},"veszprm":{"cc":"HU","lat":47.09,"lng":17.91,"pop":56927},"veszprem":{"cc":"HU","lat":47.09,"lng":17.91,"pop":56927},"ujpest":{"cc":"HU","lat":47.57,"lng":19.08,"pop":100694},"jpest":{"cc":"HU","lat":47.57,"lng":19.08,"pop":100694},"tatabanya":{"cc":"HU","lat":47.59,"lng":18.38,"pop":65849},"tatabnya":{"cc":"HU","lat":47.59,"lng":18.38,"pop":65849},"szombathely":{"cc":"HU","lat":47.23,"lng":16.62,"pop":78025},"szekesfehervar":{"cc":"HU","lat":47.19,"lng":18.41,"pop":101600},"szkesfehrvr":{"cc":"HU","lat":47.19,"lng":18.41,"pop":101600},"sopron":{"cc":"HU","lat":47.69,"lng":16.59,"pop":62246},"pestlorinc":{"cc":"HU","lat":47.43,"lng":19.22,"pop":58722},"pestlrinc":{"cc":"HU","lat":47.43,"lng":19.22,"pop":58722},"pest":{"cc":"HU","lat":47.5,"lng":19.08,"pop":1001748},"pecs":{"cc":"HU","lat":46.08,"lng":18.23,"pop":145347},"pcs":{"cc":"HU","lat":46.08,"lng":18.23,"pop":145347},"kbnya":{"cc":"HU","lat":47.48,"lng":19.14,"pop":78414},"kobanya":{"cc":"HU","lat":47.48,"lng":19.14,"pop":78414},"kispest":{"cc":"HU","lat":47.45,"lng":19.14,"pop":61453},"kelenfld":{"cc":"HU","lat":47.47,"lng":19.03,"pop":53332},"kelenfoeld":{"cc":"HU","lat":47.47,"lng":19.03,"pop":53332},"kecskemt":{"cc":"HU","lat":46.91,"lng":19.69,"pop":109847},"kecskemet":{"cc":"HU","lat":46.91,"lng":19.69,"pop":109847},"kaposvr":{"cc":"HU","lat":46.37,"lng":17.8,"pop":64280},"kaposvar":{"cc":"HU","lat":46.37,"lng":17.8,"pop":64280},"gyr":{"cc":"HU","lat":47.68,"lng":17.64,"pop":129301},"gyor":{"cc":"HU","lat":47.68,"lng":17.64,"pop":129301},"ferencvaros":{"cc":"HU","lat":47.48,"lng":19.09,"pop":59056},"ferencvros":{"cc":"HU","lat":47.48,"lng":19.09,"pop":59056},"erzsebetvaros":{"cc":"HU","lat":47.5,"lng":19.07,"pop":62000},"erzsbetvros":{"cc":"HU","lat":47.5,"lng":19.07,"pop":62000},"rd":{"cc":"HU","lat":47.39,"lng":18.91,"pop":62408},"erd":{"cc":"HU","lat":47.39,"lng":18.91,"pop":62408},"dunaujvaros":{"cc":"HU","lat":46.96,"lng":18.94,"pop":50084},"dunajvros":{"cc":"HU","lat":46.96,"lng":18.94,"pop":50084},"budapest":{"cc":"HU","lat":47.5,"lng":19.04,"pop":1741041},"buda":{"cc":"HU","lat":47.5,"lng":19.03,"pop":510108},"angyalfoeld":{"cc":"HU","lat":47.55,"lng":19.08,"pop":62006},"angyalfld":{"cc":"HU","lat":47.55,"lng":19.08,"pop":62006},"budapest xii keruelet":{"cc":"HU","lat":47.49,"lng":19.01,"pop":56544},"budapest xii kerlet":{"cc":"HU","lat":47.49,"lng":19.01,"pop":56544},"budapest xi kerlet":{"cc":"HU","lat":47.48,"lng":19.04,"pop":139049},"budapest xi keruelet":{"cc":"HU","lat":47.48,"lng":19.04,"pop":139049},"budapest viii keruelet":{"cc":"HU","lat":47.49,"lng":19.07,"pop":82222},"budapest viii kerlet":{"cc":"HU","lat":47.49,"lng":19.07,"pop":82222},"budapest xiii kerlet":{"cc":"HU","lat":47.53,"lng":19.08,"pop":113531},"budapest xiii keruelet":{"cc":"HU","lat":47.53,"lng":19.08,"pop":113531},"budapest iv kerlet":{"cc":"HU","lat":47.56,"lng":19.09,"pop":98374},"budapest iv keruelet":{"cc":"HU","lat":47.56,"lng":19.09,"pop":98374},"budapest xv kerlet":{"cc":"HU","lat":47.56,"lng":19.12,"pop":80218},"budapest xv keruelet":{"cc":"HU","lat":47.56,"lng":19.12,"pop":80218},"budapest xvi keruelet":{"cc":"HU","lat":47.51,"lng":19.17,"pop":68484},"budapest xvi kerlet":{"cc":"HU","lat":47.51,"lng":19.17,"pop":68484},"budapest xix kerlet":{"cc":"HU","lat":47.45,"lng":19.15,"pop":61610},"budapest xix keruelet":{"cc":"HU","lat":47.45,"lng":19.15,"pop":61610},"budapest xviii kerlet":{"cc":"HU","lat":47.44,"lng":19.18,"pop":93225},"budapest xviii keruelet":{"cc":"HU","lat":47.44,"lng":19.18,"pop":93225},"budapest xxii keruelet":{"cc":"HU","lat":47.43,"lng":19.04,"pop":50499},"budapest xxii kerlet":{"cc":"HU","lat":47.43,"lng":19.04,"pop":50499},"budapest xxi keruelet":{"cc":"HU","lat":47.42,"lng":19.07,"pop":76339},"budapest xxi kerlet":{"cc":"HU","lat":47.42,"lng":19.07,"pop":76339},"budapest xx kerlet":{"cc":"HU","lat":47.44,"lng":19.1,"pop":63371},"budapest xx keruelet":{"cc":"HU","lat":47.44,"lng":19.1,"pop":63371},"budapest xvii kerlet":{"cc":"HU","lat":47.48,"lng":19.25,"pop":78250},"budapest xvii keruelet":{"cc":"HU","lat":47.48,"lng":19.25,"pop":78250},"budapest iii kerlet":{"cc":"HU","lat":47.54,"lng":19.05,"pop":123723},"budapest iii keruelet":{"cc":"HU","lat":47.54,"lng":19.05,"pop":123723},"budapest ii kerlet":{"cc":"HU","lat":47.52,"lng":19.02,"pop":88729},"budapest ii keruelet":{"cc":"HU","lat":47.52,"lng":19.02,"pop":88729},"jzsefvros":{"cc":"HU","lat":47.49,"lng":19.07,"pop":76957},"jozsefvaros":{"cc":"HU","lat":47.49,"lng":19.07,"pop":76957},"tebingtinggi":{"cc":"ID","lat":3.33,"lng":99.16,"pop":117530},"tanjungbalai":{"cc":"ID","lat":2.97,"lng":99.8,"pop":190935},"sunggal":{"cc":"ID","lat":3.58,"lng":98.62,"pop":157914},"sidikalang":{"cc":"ID","lat":2.75,"lng":98.31,"pop":50671},"sibolga":{"cc":"ID","lat":1.74,"lng":98.78,"pop":92244},"rantauprapat":{"cc":"ID","lat":2.1,"lng":99.83,"pop":103009},"percut":{"cc":"ID","lat":3.63,"lng":98.86,"pop":311063},"perbaungan":{"cc":"ID","lat":3.57,"lng":98.96,"pop":157174},"pematangsiantar":{"cc":"ID","lat":2.96,"lng":99.07,"pop":279198},"padangsidempuan":{"cc":"ID","lat":1.38,"lng":99.27,"pop":243843},"meulaboh":{"cc":"ID","lat":4.14,"lng":96.13,"pop":64646},"medan":{"cc":"ID","lat":3.58,"lng":98.67,"pop":2486283},"lhokseumawe":{"cc":"ID","lat":5.18,"lng":97.15,"pop":200876},"langsa":{"cc":"ID","lat":4.47,"lng":97.97,"pop":184016},"kisaran":{"cc":"ID","lat":2.98,"lng":99.62,"pop":141915},"kabanjahe":{"cc":"ID","lat":3.1,"lng":98.49,"pop":73581},"gunungsitoli":{"cc":"ID","lat":1.29,"lng":97.61,"pop":136707},"binjai":{"cc":"ID","lat":3.6,"lng":98.49,"pop":279302},"belawan":{"cc":"ID","lat":3.78,"lng":98.68,"pop":102707},"banda aceh":{"cc":"ID","lat":5.54,"lng":95.33,"pop":267962},"yogyakarta":{"cc":"ID","lat":-7.8,"lng":110.36,"pop":375699},"wonosobo":{"cc":"ID","lat":-7.36,"lng":109.9,"pop":92990},"wonosari":{"cc":"ID","lat":-7.97,"lng":110.6,"pop":87454},"weru":{"cc":"ID","lat":-6.71,"lng":108.5,"pop":139004},"weleri":{"cc":"ID","lat":-6.97,"lng":110.07,"pop":58448},"wedi":{"cc":"ID","lat":-7.74,"lng":110.58,"pop":55300},"watampone":{"cc":"ID","lat":-4.54,"lng":120.33,"pop":149336},"wamena":{"cc":"ID","lat":-4.1,"lng":138.95,"pop":66080},"ungaran":{"cc":"ID","lat":-7.14,"lng":110.41,"pop":171378},"makassar":{"cc":"ID","lat":-5.15,"lng":119.43,"pop":1474393},"ubud":{"cc":"ID","lat":-8.51,"lng":115.27,"pop":74800},"tulungagung":{"cc":"ID","lat":-8.07,"lng":111.9,"pop":65262},"tulangan utara":{"cc":"ID","lat":-7.47,"lng":112.65,"pop":63889},"tuban":{"cc":"ID","lat":-6.9,"lng":112.06,"pop":76242},"tual":{"cc":"ID","lat":-5.63,"lng":132.75,"pop":90470},"toli-toli":{"cc":"ID","lat":1.04,"lng":120.82,"pop":242783},"timika":{"cc":"ID","lat":-4.61,"lng":136.68,"pop":142909},"ternate":{"cc":"ID","lat":0.79,"lng":127.38,"pop":210836},"terbanggi besar":{"cc":"ID","lat":-4.88,"lng":105.22,"pop":52566},"tegal":{"cc":"ID","lat":-6.87,"lng":109.14,"pop":297173},"tasikmalaya":{"cc":"ID","lat":-7.33,"lng":108.22,"pop":770839},"tarub":{"cc":"ID","lat":-6.93,"lng":109.17,"pop":75739},"tarakan":{"cc":"ID","lat":3.31,"lng":117.59,"pop":255310},"tanjung selor":{"cc":"ID","lat":2.84,"lng":117.37,"pop":67837},"tanjung pinang":{"cc":"ID","lat":0.92,"lng":104.46,"pop":227663},"tanjung pandan":{"cc":"ID","lat":-2.73,"lng":107.63,"pop":103062},"bandar lampung":{"cc":"ID","lat":-5.43,"lng":105.26,"pop":1166066},"tanjungagung":{"cc":"ID","lat":-3.94,"lng":103.8,"pop":53117},"tangerang":{"cc":"ID","lat":-6.18,"lng":106.63,"pop":1927815},"taliwang":{"cc":"ID","lat":-8.74,"lng":116.85,"pop":55340},"surakarta":{"cc":"ID","lat":-7.56,"lng":110.83,"pop":526870},"surabaya":{"cc":"ID","lat":-7.25,"lng":112.75,"pop":3018022},"sungai penuh":{"cc":"ID","lat":-2.06,"lng":101.39,"pop":102224},"sungailiat":{"cc":"ID","lat":-1.85,"lng":106.12,"pop":100750},"sumenep":{"cc":"ID","lat":-7.01,"lng":113.86,"pop":84656},"sumedang utara":{"cc":"ID","lat":-6.85,"lng":107.92,"pop":100000},"sumedang":{"cc":"ID","lat":-6.86,"lng":107.92,"pop":200000},"sumber":{"cc":"ID","lat":-6.76,"lng":108.48,"pop":96725},"sumbawa besar":{"cc":"ID","lat":-8.49,"lng":117.42,"pop":62753},"sokaraja":{"cc":"ID","lat":-7.46,"lng":109.29,"pop":66482},"sukabumi":{"cc":"ID","lat":-6.92,"lng":106.93,"pop":365735},"subang":{"cc":"ID","lat":-6.57,"lng":107.76,"pop":137234},"sragen":{"cc":"ID","lat":-7.43,"lng":111.02,"pop":71522},"sorong":{"cc":"ID","lat":-0.88,"lng":131.26,"pop":219958},"soreang":{"cc":"ID","lat":-7.03,"lng":107.52,"pop":116780},"solok":{"cc":"ID","lat":-0.8,"lng":100.66,"pop":73438},"sleman":{"cc":"ID","lat":-7.72,"lng":110.36,"pop":56215},"slawi":{"cc":"ID","lat":-6.98,"lng":109.14,"pop":61206},"situbondo":{"cc":"ID","lat":-7.71,"lng":114.01,"pop":685967},"sintang":{"cc":"ID","lat":0.07,"lng":111.5,"pop":85000},"singosari":{"cc":"ID","lat":-7.89,"lng":112.67,"pop":182656},"singkawang":{"cc":"ID","lat":0.91,"lng":108.98,"pop":253812},"sengkang":{"cc":"ID","lat":-4.13,"lng":120.03,"pop":59523},"singaraja":{"cc":"ID","lat":-8.11,"lng":115.09,"pop":133784},"sidoarjo":{"cc":"ID","lat":-7.45,"lng":112.72,"pop":139189},"sewon":{"cc":"ID","lat":-7.88,"lng":110.36,"pop":73585},"serpong":{"cc":"ID","lat":-6.32,"lng":106.66,"pop":80193},"serang":{"cc":"ID","lat":-6.12,"lng":106.15,"pop":735651},"sepatan":{"cc":"ID","lat":-6.12,"lng":106.58,"pop":118439},"semarang":{"cc":"ID","lat":-6.99,"lng":110.42,"pop":1694740},"selong":{"cc":"ID","lat":-8.65,"lng":116.53,"pop":92464},"sawangan":{"cc":"ID","lat":-6.4,"lng":106.77,"pop":197170},"sangkapura":{"cc":"ID","lat":-5.85,"lng":112.65,"pop":50612},"sampit":{"cc":"ID","lat":-2.53,"lng":112.95,"pop":166773},"sampang":{"cc":"ID","lat":-7.19,"lng":113.24,"pop":53269},"samarinda":{"cc":"ID","lat":-0.49,"lng":117.15,"pop":865306},"salatiga":{"cc":"ID","lat":-7.33,"lng":110.49,"pop":198971},"rengasdengklok":{"cc":"ID","lat":-6.16,"lng":107.3,"pop":201463},"rangkasbitung":{"cc":"ID","lat":-6.36,"lng":106.25,"pop":137041},"raha":{"cc":"ID","lat":-4.84,"lng":122.72,"pop":69980},"purwokerto":{"cc":"ID","lat":-7.42,"lng":109.23,"pop":230235},"purwodadi":{"cc":"ID","lat":-7.09,"lng":110.92,"pop":139387},"purwakarta":{"cc":"ID","lat":-6.56,"lng":107.44,"pop":179233},"purbalingga":{"cc":"ID","lat":-7.39,"lng":109.36,"pop":56903},"probolinggo":{"cc":"ID","lat":-7.75,"lng":113.22,"pop":243746},"pontianak":{"cc":"ID","lat":-0.03,"lng":109.33,"pop":686019},"ponorogo":{"cc":"ID","lat":-7.87,"lng":111.46,"pop":79026},"polewali":{"cc":"ID","lat":-3.43,"lng":119.34,"pop":65800},"plumbon":{"cc":"ID","lat":-6.71,"lng":108.47,"pop":167105},"prabumulih":{"cc":"ID","lat":-3.43,"lng":104.23,"pop":103470},"pemangkat":{"cc":"ID","lat":1.17,"lng":108.97,"pop":54259},"pemalang":{"cc":"ID","lat":-6.89,"lng":109.38,"pop":184149},"pelabuhanratu":{"cc":"ID","lat":-6.99,"lng":106.55,"pop":109523},"pekanbaru":{"cc":"ID","lat":0.52,"lng":101.44,"pop":1167599},"pekalongan":{"cc":"ID","lat":-6.89,"lng":109.68,"pop":324564},"pecangaan":{"cc":"ID","lat":-6.7,"lng":110.71,"pop":61046},"payakumbuh":{"cc":"ID","lat":-0.22,"lng":100.63,"pop":139576},"pati":{"cc":"ID","lat":-6.76,"lng":111.04,"pop":107028},"pasuruan":{"cc":"ID","lat":-7.65,"lng":112.91,"pop":213469},"paseh":{"cc":"ID","lat":-7.07,"lng":107.79,"pop":126181},"pasarkemis":{"cc":"ID","lat":-6.17,"lng":106.53,"pop":263289},"parung":{"cc":"ID","lat":-6.42,"lng":106.73,"pop":128905},"pariaman":{"cc":"ID","lat":-0.62,"lng":100.12,"pop":92183},"parepare":{"cc":"ID","lat":-4.01,"lng":119.63,"pop":160309},"pare":{"cc":"ID","lat":-7.77,"lng":112.2,"pop":106007},"pangkalpinang":{"cc":"ID","lat":-2.13,"lng":106.11,"pop":226297},"pangkalanbuun":{"cc":"ID","lat":-2.68,"lng":111.63,"pop":108814},"pandeglang":{"cc":"ID","lat":-6.31,"lng":106.11,"pop":92316},"pandak":{"cc":"ID","lat":-7.91,"lng":110.29,"pop":56043},"pamulang":{"cc":"ID","lat":-6.34,"lng":106.74,"pop":174557},"pamekasan":{"cc":"ID","lat":-7.16,"lng":113.47,"pop":92447},"pamanukan":{"cc":"ID","lat":-6.28,"lng":107.81,"pop":114290},"palu":{"cc":"ID","lat":-0.91,"lng":119.87,"pop":389959},"palopo":{"cc":"ID","lat":-2.99,"lng":120.2,"pop":184961},"palimanan":{"cc":"ID","lat":-6.71,"lng":108.42,"pop":92600},"palembang":{"cc":"ID","lat":-2.92,"lng":104.75,"pop":1801367},"palangkaraya":{"cc":"ID","lat":-2.21,"lng":113.92,"pop":318247},"pagar alam":{"cc":"ID","lat":-4.03,"lng":103.25,"pop":70386},"padangpanjang":{"cc":"ID","lat":-0.46,"lng":100.41,"pop":58627},"padang":{"cc":"ID","lat":-0.95,"lng":100.35,"pop":942938},"nunukan":{"cc":"ID","lat":4.14,"lng":117.65,"pop":67006},"nganjuk":{"cc":"ID","lat":-7.61,"lng":111.9,"pop":69011},"negara":{"cc":"ID","lat":-8.36,"lng":114.62,"pop":100074},"nabire":{"cc":"ID","lat":-3.36,"lng":135.5,"pop":99848},"muntilan":{"cc":"ID","lat":-7.58,"lng":110.29,"pop":81555},"muncar":{"cc":"ID","lat":-8.43,"lng":114.33,"pop":64537},"mojokerto":{"cc":"ID","lat":-7.47,"lng":112.43,"pop":141785},"metro":{"cc":"ID","lat":-5.11,"lng":105.31,"pop":182293},"mertoyudan":{"cc":"ID","lat":-7.52,"lng":110.23,"pop":69871},"melati":{"cc":"ID","lat":-7.73,"lng":110.37,"pop":67090},"maumere":{"cc":"ID","lat":-8.62,"lng":122.21,"pop":87720},"mataram":{"cc":"ID","lat":-8.58,"lng":116.12,"pop":441147},"martapura":{"cc":"ID","lat":-3.41,"lng":114.86,"pop":131449},"margahayukencana":{"cc":"ID","lat":-6.97,"lng":107.57,"pop":83119},"manokwari":{"cc":"ID","lat":-0.86,"lng":134.06,"pop":132300},"mendaha":{"cc":"ID","lat":-1.02,"lng":103.59,"pop":56268},"manado":{"cc":"ID","lat":1.48,"lng":124.85,"pop":458582},"malang":{"cc":"ID","lat":-7.98,"lng":112.63,"pop":889359},"majene":{"cc":"ID","lat":-3.54,"lng":118.97,"pop":73883},"majalengka":{"cc":"ID","lat":-6.84,"lng":108.23,"pop":73052},"magelang":{"cc":"ID","lat":-7.47,"lng":110.22,"pop":128709},"madiun":{"cc":"ID","lat":-7.63,"lng":111.52,"pop":202544},"lumajang":{"cc":"ID","lat":-8.13,"lng":113.22,"pop":123626},"lubuklinggau":{"cc":"ID","lat":-3.29,"lng":102.86,"pop":234166},"loa janan":{"cc":"ID","lat":-0.58,"lng":117.1,"pop":212816},"lembang":{"cc":"ID","lat":-6.81,"lng":107.62,"pop":183130},"lawang":{"cc":"ID","lat":-7.84,"lng":112.69,"pop":112540},"lamongan":{"cc":"ID","lat":-7.12,"lng":112.42,"pop":59224},"lahat":{"cc":"ID","lat":-3.79,"lng":103.54,"pop":65906},"labuan bajo":{"cc":"ID","lat":-8.5,"lng":119.89,"pop":188724},"kuningan":{"cc":"ID","lat":-6.98,"lng":108.48,"pop":111742},"kudus":{"cc":"ID","lat":-6.8,"lng":110.84,"pop":92156},"kresek":{"cc":"ID","lat":-6.13,"lng":106.38,"pop":110182},"kotamobagu":{"cc":"ID","lat":0.74,"lng":124.31,"pop":121756},"klungkung":{"cc":"ID","lat":-8.53,"lng":115.4,"pop":223720},"klaten":{"cc":"ID","lat":-7.71,"lng":110.61,"pop":126831},"klangenan":{"cc":"ID","lat":-6.71,"lng":108.44,"pop":88378},"kertosono":{"cc":"ID","lat":-7.58,"lng":112.1,"pop":60782},"kepanjen":{"cc":"ID","lat":-8.13,"lng":112.57,"pop":51919},"kendari":{"cc":"ID","lat":-3.98,"lng":122.52,"pop":351085},"kedungwuni":{"cc":"ID","lat":-6.97,"lng":109.65,"pop":117249},"kedungwaru":{"cc":"ID","lat":-8.07,"lng":111.92,"pop":80257},"kediri":{"cc":"ID","lat":-7.82,"lng":112.02,"pop":301424},"kebomas":{"cc":"ID","lat":-7.17,"lng":112.63,"pop":75982},"kawalu":{"cc":"ID","lat":-7.38,"lng":108.21,"pop":50541},"karawang":{"cc":"ID","lat":-6.31,"lng":107.32,"pop":307880},"karangsembung":{"cc":"ID","lat":-6.85,"lng":108.64,"pop":75856},"jombang":{"cc":"ID","lat":-7.55,"lng":112.23,"pop":126465},"jepara":{"cc":"ID","lat":-6.59,"lng":110.67,"pop":1257912},"jember":{"cc":"ID","lat":-8.17,"lng":113.7,"pop":298585},"jatiwangi":{"cc":"ID","lat":-6.73,"lng":108.26,"pop":57973},"jatiroto":{"cc":"ID","lat":-7.88,"lng":111.12,"pop":50059},"jatibarang":{"cc":"ID","lat":-6.47,"lng":108.32,"pop":73010},"jambi city":{"cc":"ID","lat":-1.6,"lng":103.62,"pop":635101},"jakarta":{"cc":"ID","lat":-6.21,"lng":106.85,"pop":8540121},"indramayu":{"cc":"ID","lat":-6.33,"lng":108.32,"pop":123263},"grogol":{"cc":"ID","lat":-7.6,"lng":110.82,"pop":100613},"gresik":{"cc":"ID","lat":-7.15,"lng":112.66,"pop":73629},"gorontalo":{"cc":"ID","lat":0.54,"lng":123.06,"pop":205390},"gombong":{"cc":"ID","lat":-7.61,"lng":109.51,"pop":50950},"godean":{"cc":"ID","lat":-7.77,"lng":110.29,"pop":63164},"genteng":{"cc":"ID","lat":-8.37,"lng":114.15,"pop":79652},"gedangan":{"cc":"ID","lat":-7.39,"lng":112.73,"pop":79230},"garut":{"cc":"ID","lat":-7.25,"lng":107.92,"pop":131809},"galesong":{"cc":"ID","lat":-5.32,"lng":119.37,"pop":83050},"ende":{"cc":"ID","lat":-8.84,"lng":121.66,"pop":87269},"dumai":{"cc":"ID","lat":1.67,"lng":101.44,"pop":349389},"dukuhturi":{"cc":"ID","lat":-6.9,"lng":109.08,"pop":98074},"dompu":{"cc":"ID","lat":-8.54,"lng":118.46,"pop":54987},"dobo":{"cc":"ID","lat":-5.76,"lng":134.23,"pop":52104},"depok":{"cc":"ID","lat":-6.4,"lng":106.82,"pop":2163635},"denpasar":{"cc":"ID","lat":-8.65,"lng":115.22,"pop":670210},"curug":{"cc":"ID","lat":-6.27,"lng":106.56,"pop":191406},"comal":{"cc":"ID","lat":-6.91,"lng":109.53,"pop":51092},"citeureup":{"cc":"ID","lat":-6.49,"lng":106.88,"pop":214668},"cirebon":{"cc":"ID","lat":-6.71,"lng":108.56,"pop":344851},"ciputat":{"cc":"ID","lat":-6.24,"lng":106.7,"pop":207858},"cimahi":{"cc":"ID","lat":-6.87,"lng":107.54,"pop":581994},"cileunyi":{"cc":"ID","lat":-6.94,"lng":107.75,"pop":111476},"cileungsir":{"cc":"ID","lat":-6.39,"lng":106.96,"pop":289833},"cilegon":{"cc":"ID","lat":-6.01,"lng":106.05,"pop":470378},"cilacap":{"cc":"ID","lat":-7.73,"lng":109.01,"pop":256996},"cikarang":{"cc":"ID","lat":-6.26,"lng":107.15,"pop":106479},"cikampek":{"cc":"ID","lat":-6.42,"lng":107.46,"pop":127173},"cicurug":{"cc":"ID","lat":-6.78,"lng":106.78,"pop":88965},"cibinong":{"cc":"ID","lat":-6.48,"lng":106.85,"pop":363424},"cianjur":{"cc":"ID","lat":-6.82,"lng":107.14,"pop":174587},"ciamis":{"cc":"ID","lat":-7.33,"lng":108.35,"pop":109839},"cepu":{"cc":"ID","lat":-7.15,"lng":111.59,"pop":55055},"caringin":{"cc":"ID","lat":-6.71,"lng":106.82,"pop":91845},"ciampea":{"cc":"ID","lat":-6.55,"lng":106.7,"pop":207212},"bukittinggi":{"cc":"ID","lat":-0.31,"lng":100.37,"pop":121028},"boyolali":{"cc":"ID","lat":-7.53,"lng":110.6,"pop":59851},"bontang":{"cc":"ID","lat":0.13,"lng":117.49,"pop":194606},"bondowoso":{"cc":"ID","lat":-7.91,"lng":113.82,"pop":69783},"bojonegoro":{"cc":"ID","lat":-7.15,"lng":111.88,"pop":86568},"bogor":{"cc":"ID","lat":-6.59,"lng":106.79,"pop":1078351},"blora":{"cc":"ID","lat":-6.97,"lng":111.42,"pop":51811},"blitar":{"cc":"ID","lat":-8.1,"lng":112.17,"pop":161204},"bitung":{"cc":"ID","lat":1.44,"lng":125.13,"pop":225134},"bima":{"cc":"ID","lat":-8.46,"lng":118.73,"pop":165113},"besuki":{"cc":"ID","lat":-7.73,"lng":113.7,"pop":55465},"bengkulu":{"cc":"ID","lat":-3.8,"lng":102.27,"pop":397321},"bekasi":{"cc":"ID","lat":-6.23,"lng":106.99,"pop":2648272},"baubau":{"cc":"ID","lat":-5.46,"lng":122.6,"pop":161280},"baturaja":{"cc":"ID","lat":-4.13,"lng":104.17,"pop":134759},"batu":{"cc":"ID","lat":-7.87,"lng":112.53,"pop":225408},"batang":{"cc":"ID","lat":-6.48,"lng":110.71,"pop":139492},"barabai":{"cc":"ID","lat":-2.58,"lng":115.38,"pop":55956},"banyuwangi":{"cc":"ID","lat":-8.23,"lng":114.36,"pop":117558},"bantul":{"cc":"ID","lat":-7.89,"lng":110.33,"pop":64360},"banjarmasin":{"cc":"ID","lat":-3.32,"lng":114.59,"pop":657663},"banjarbaru":{"cc":"ID","lat":-3.44,"lng":114.84,"pop":293332},"banjaran":{"cc":"ID","lat":-7.05,"lng":107.59,"pop":164952},"banjar":{"cc":"ID","lat":-7.2,"lng":107.43,"pop":209791},"bangkalan":{"cc":"ID","lat":-7.05,"lng":112.74,"pop":86250},"bangil":{"cc":"ID","lat":-7.6,"lng":112.82,"pop":85504},"bandung":{"cc":"ID","lat":-6.92,"lng":107.61,"pop":2528163},"balikpapan":{"cc":"ID","lat":-1.27,"lng":116.83,"pop":695287},"balai pungut":{"cc":"ID","lat":1.06,"lng":101.29,"pop":56452},"baki":{"cc":"ID","lat":-7.61,"lng":110.78,"pop":58909},"baekrajan":{"cc":"ID","lat":-6.77,"lng":110.85,"pop":57920},"atambua":{"cc":"ID","lat":-9.11,"lng":124.89,"pop":82196},"astanajapura":{"cc":"ID","lat":-6.8,"lng":108.63,"pop":148047},"arjawinangun":{"cc":"ID","lat":-6.65,"lng":108.41,"pop":105845},"amuntai":{"cc":"ID","lat":-2.42,"lng":115.25,"pop":55560},"ambon":{"cc":"ID","lat":-3.7,"lng":128.18,"pop":347288},"ambarawa":{"cc":"ID","lat":-7.26,"lng":110.4,"pop":65096},"amahai":{"cc":"ID","lat":-3.34,"lng":128.92,"pop":50478},"adiwerna":{"cc":"ID","lat":-6.94,"lng":109.13,"pop":134188},"padalarang":{"cc":"ID","lat":-6.84,"lng":107.47,"pop":193114},"ciranjang-hilir":{"cc":"ID","lat":-6.82,"lng":107.26,"pop":77758},"cikupa":{"cc":"ID","lat":-6.24,"lng":106.51,"pop":174041},"teluknaga":{"cc":"ID","lat":-6.1,"lng":106.64,"pop":175155},"gamping lor":{"cc":"ID","lat":-7.8,"lng":110.33,"pop":66110},"kasihan":{"cc":"ID","lat":-7.83,"lng":110.33,"pop":86234},"kartasura":{"cc":"ID","lat":-7.55,"lng":110.74,"pop":88927},"kupang":{"cc":"ID","lat":-10.17,"lng":123.61,"pop":474801},"merauke":{"cc":"ID","lat":-8.5,"lng":140.41,"pop":116864},"jayapura":{"cc":"ID","lat":-2.53,"lng":140.72,"pop":410852},"abepura":{"cc":"ID","lat":-2.6,"lng":140.63,"pop":62248},"batam":{"cc":"ID","lat":1.15,"lng":104.02,"pop":1296960},"subulussalam":{"cc":"ID","lat":2.66,"lng":97.88,"pop":105553},"sukawati":{"cc":"ID","lat":-8.49,"lng":115.05,"pop":125470},"south tangerang":{"cc":"ID","lat":-6.29,"lng":106.72,"pop":1429529},"kota sambas":{"cc":"ID","lat":1.36,"lng":109.3,"pop":57295},"nusantara":{"cc":"ID","lat":-0.97,"lng":116.71,"pop":147430},"tallaght":{"cc":"IE","lat":53.29,"lng":-6.37,"pop":81022},"limerick":{"cc":"IE","lat":52.66,"lng":-8.62,"pop":102287},"galway":{"cc":"IE","lat":53.27,"lng":-9.05,"pop":85910},"cork":{"cc":"IE","lat":51.9,"lng":-8.47,"pop":224004},"south dublin":{"cc":"IE","lat":53.29,"lng":-6.34,"pop":301075},"jerusalem":{"cc":"IL","lat":31.77,"lng":35.22,"pop":971800},"modiin makkabbim reut":{"cc":"IL","lat":31.89,"lng":35.02,"pop":93277},"jaffa":{"cc":"IL","lat":32.05,"lng":34.75,"pop":100000},"umm el fam":{"cc":"IL","lat":32.52,"lng":35.15,"pop":56109},"umm el fahm":{"cc":"IL","lat":32.52,"lng":35.15,"pop":56109},"tel aviv":{"cc":"IL","lat":32.08,"lng":34.78,"pop":432892},"rosh haayin":{"cc":"IL","lat":32.1,"lng":34.96,"pop":72881},"rishon letsiyyon":{"cc":"IL","lat":31.97,"lng":34.79,"pop":258535},"reovot":{"cc":"IL","lat":31.89,"lng":34.81,"pop":149392},"rehovot":{"cc":"IL","lat":31.89,"lng":34.81,"pop":149392},"ramla":{"cc":"IL","lat":31.93,"lng":34.86,"pop":76246},"ramat gan":{"cc":"IL","lat":32.08,"lng":34.81,"pop":170822},"raanana":{"cc":"IL","lat":32.18,"lng":34.87,"pop":75421},"kiryat gat":{"cc":"IL","lat":31.61,"lng":34.76,"pop":61817},"qiryat ata":{"cc":"IL","lat":32.81,"lng":35.11,"pop":59030},"peta tiqva":{"cc":"IL","lat":32.09,"lng":34.89,"pop":253529},"petah tiqva":{"cc":"IL","lat":32.09,"lng":34.89,"pop":253529},"netanya":{"cc":"IL","lat":32.33,"lng":34.86,"pop":228204},"ness ziona":{"cc":"IL","lat":31.93,"lng":34.8,"pop":50351},"nazareth":{"cc":"IL","lat":32.7,"lng":35.3,"pop":77445},"nahariyya":{"cc":"IL","lat":33.01,"lng":35.1,"pop":58096},"lod":{"cc":"IL","lat":31.95,"lng":34.89,"pop":77223},"kfar saba":{"cc":"IL","lat":32.17,"lng":34.91,"pop":110456},"holon":{"cc":"IL","lat":32.01,"lng":34.78,"pop":196282},"hod hasharon":{"cc":"IL","lat":32.16,"lng":34.89,"pop":63175},"herzliya":{"cc":"IL","lat":32.17,"lng":34.83,"pop":97470},"haifa":{"cc":"IL","lat":32.81,"lng":35.0,"pop":285316},"hadera":{"cc":"IL","lat":32.44,"lng":34.9,"pop":97335},"givatayim":{"cc":"IL","lat":32.07,"lng":34.81,"pop":60644},"eilat":{"cc":"IL","lat":29.56,"lng":34.95,"pop":52299},"bet shemesh":{"cc":"IL","lat":31.73,"lng":34.99,"pop":124957},"bnei brak":{"cc":"IL","lat":32.08,"lng":34.83,"pop":214444},"beersheba":{"cc":"IL","lat":31.25,"lng":34.79,"pop":186600},"bat yam":{"cc":"IL","lat":32.02,"lng":34.75,"pop":129012},"ashkelon":{"cc":"IL","lat":31.67,"lng":34.57,"pop":144073},"ashdod":{"cc":"IL","lat":31.79,"lng":34.65,"pop":226838},"acre":{"cc":"IL","lat":32.93,"lng":35.08,"pop":51420},"west jerusalem":{"cc":"IL","lat":31.78,"lng":35.22,"pop":400000},"modiin ilit":{"cc":"IL","lat":31.93,"lng":35.04,"pop":76374},"zahirbd":{"cc":"IN","lat":17.68,"lng":77.61,"pop":71166},"zahirabad":{"cc":"IN","lat":17.68,"lng":77.61,"pop":71166},"yelahanka":{"cc":"IN","lat":13.1,"lng":77.6,"pop":116447},"yavatml":{"cc":"IN","lat":20.39,"lng":78.13,"pop":128175},"yavatmal":{"cc":"IN","lat":20.39,"lng":78.13,"pop":128175},"yanam":{"cc":"IN","lat":16.73,"lng":82.21,"pop":55626},"yamuna nagar":{"cc":"IN","lat":30.13,"lng":77.28,"pop":217071},"yadgir":{"cc":"IN","lat":16.77,"lng":77.14,"pop":74294},"wokha":{"cc":"IN","lat":26.1,"lng":94.26,"pop":54010},"wshm":{"cc":"IN","lat":20.11,"lng":77.13,"pop":78387},"washim":{"cc":"IN","lat":20.11,"lng":77.13,"pop":78387},"wardha":{"cc":"IN","lat":20.74,"lng":78.6,"pop":113759},"warangal":{"cc":"IN","lat":18.0,"lng":79.58,"pop":704570},"wanparti":{"cc":"IN","lat":16.37,"lng":78.07,"pop":60949},"wani":{"cc":"IN","lat":20.06,"lng":78.95,"pop":58840},"vrindavan":{"cc":"IN","lat":27.58,"lng":77.7,"pop":60195},"vrindvan":{"cc":"IN","lat":27.58,"lng":77.7,"pop":60195},"vriddhachalam":{"cc":"IN","lat":11.52,"lng":79.32,"pop":61498},"vriddhchalam":{"cc":"IN","lat":11.52,"lng":79.32,"pop":61498},"vizianagaram":{"cc":"IN","lat":18.12,"lng":83.41,"pop":228720},"visnagar":{"cc":"IN","lat":23.7,"lng":72.55,"pop":76753},"visakhapatnam":{"cc":"IN","lat":17.68,"lng":83.2,"pop":1063178},"virudunagar":{"cc":"IN","lat":9.59,"lng":77.96,"pop":73273},"virar":{"cc":"IN","lat":19.46,"lng":72.81,"pop":1222390},"virr":{"cc":"IN","lat":19.46,"lng":72.81,"pop":1222390},"viramgm":{"cc":"IN","lat":23.13,"lng":72.05,"pop":55821},"viramgam":{"cc":"IN","lat":23.13,"lng":72.05,"pop":55821},"vinukonda":{"cc":"IN","lat":16.05,"lng":79.74,"pop":62550},"villupuram":{"cc":"IN","lat":11.94,"lng":79.49,"pop":97380},"vikarabad":{"cc":"IN","lat":17.34,"lng":77.9,"pop":53143},"vikrbd":{"cc":"IN","lat":17.34,"lng":77.9,"pop":53143},"vijayawada":{"cc":"IN","lat":16.51,"lng":80.65,"pop":1143232},"vidisha":{"cc":"IN","lat":23.53,"lng":77.81,"pop":155951},"veraval":{"cc":"IN","lat":20.91,"lng":70.37,"pop":171121},"verval":{"cc":"IN","lat":20.91,"lng":70.37,"pop":171121},"venkatagiri":{"cc":"IN","lat":13.96,"lng":79.58,"pop":52688},"vellore":{"cc":"IN","lat":12.92,"lng":79.13,"pop":484690},"vejalpur":{"cc":"IN","lat":22.69,"lng":73.56,"pop":121610},"vasco da gama":{"cc":"IN","lat":15.4,"lng":73.82,"pop":100485},"varanasi":{"cc":"IN","lat":25.32,"lng":83.01,"pop":1164404},"vaniyambadi":{"cc":"IN","lat":12.68,"lng":78.62,"pop":95061},"valsd":{"cc":"IN","lat":20.61,"lng":72.93,"pop":139764},"valsad":{"cc":"IN","lat":20.61,"lng":72.93,"pop":139764},"valparai":{"cc":"IN","lat":10.33,"lng":76.95,"pop":90353},"vadodara":{"cc":"IN","lat":22.3,"lng":73.21,"pop":1822221},"urun-islmpur":{"cc":"IN","lat":17.05,"lng":74.27,"pop":67391},"urun-islampur":{"cc":"IN","lat":17.05,"lng":74.27,"pop":67391},"upleta":{"cc":"IN","lat":21.74,"lng":70.28,"pop":58775},"uppal kalan":{"cc":"IN","lat":17.41,"lng":78.56,"pop":118259},"unnao":{"cc":"IN","lat":26.55,"lng":80.49,"pop":161671},"unno":{"cc":"IN","lat":26.55,"lng":80.49,"pop":161671},"unjha":{"cc":"IN","lat":23.8,"lng":72.39,"pop":57108},"umred":{"cc":"IN","lat":20.85,"lng":79.32,"pop":53971},"uluberiya":{"cc":"IN","lat":22.48,"lng":88.1,"pop":235345},"ullal":{"cc":"IN","lat":12.81,"lng":74.86,"pop":59116},"ulhasnagar":{"cc":"IN","lat":19.22,"lng":73.15,"pop":516584},"ujjain":{"cc":"IN","lat":23.18,"lng":75.78,"pop":515215},"ujhani":{"cc":"IN","lat":28.0,"lng":79.01,"pop":56309},"ujhni":{"cc":"IN","lat":28.0,"lng":79.01,"pop":56309},"udumalaippettai":{"cc":"IN","lat":10.59,"lng":77.25,"pop":61133},"udupi":{"cc":"IN","lat":13.33,"lng":74.75,"pop":165000},"udhampur":{"cc":"IN","lat":32.92,"lng":75.14,"pop":84015},"udgir":{"cc":"IN","lat":18.39,"lng":77.12,"pop":103550},"udgr":{"cc":"IN","lat":18.39,"lng":77.12,"pop":103550},"udaipur":{"cc":"IN","lat":24.59,"lng":73.71,"pop":451100},"ooty":{"cc":"IN","lat":11.41,"lng":76.7,"pop":233426},"tura":{"cc":"IN","lat":25.51,"lng":90.2,"pop":74858},"tuni":{"cc":"IN","lat":17.36,"lng":82.55,"pop":53425},"tundla":{"cc":"IN","lat":27.21,"lng":78.24,"pop":50939},"tndla":{"cc":"IN","lat":27.21,"lng":78.24,"pop":50939},"tumkur":{"cc":"IN","lat":13.34,"lng":77.1,"pop":307359},"tumkr":{"cc":"IN","lat":13.34,"lng":77.1,"pop":307359},"thiruvananthapuram":{"cc":"IN","lat":8.49,"lng":76.95,"pop":788271},"tripunittura":{"cc":"IN","lat":9.94,"lng":76.33,"pop":69390},"thrissur":{"cc":"IN","lat":10.52,"lng":76.22,"pop":315957},"tonk":{"cc":"IN","lat":26.17,"lng":75.79,"pop":165294},"tohana":{"cc":"IN","lat":29.71,"lng":75.9,"pop":63871},"tohna":{"cc":"IN","lat":29.71,"lng":75.9,"pop":63871},"titgarh":{"cc":"IN","lat":22.74,"lng":88.37,"pop":127751},"titagarh":{"cc":"IN","lat":22.74,"lng":88.37,"pop":127751},"tiruvottiyur":{"cc":"IN","lat":13.16,"lng":80.3,"pop":249446},"tiruvottiyr":{"cc":"IN","lat":13.16,"lng":80.3,"pop":249446},"tiruvannamalai":{"cc":"IN","lat":12.23,"lng":79.07,"pop":145278},"tiruvallur":{"cc":"IN","lat":13.14,"lng":79.91,"pop":56074},"tiruvalla":{"cc":"IN","lat":9.38,"lng":76.57,"pop":57223},"tiruttangal":{"cc":"IN","lat":9.48,"lng":77.83,"pop":55362},"tirrangdi":{"cc":"IN","lat":11.04,"lng":75.92,"pop":56632},"tirurangadi":{"cc":"IN","lat":11.04,"lng":75.92,"pop":56632},"tirur":{"cc":"IN","lat":10.91,"lng":75.92,"pop":56058},"tiruppur":{"cc":"IN","lat":11.12,"lng":77.35,"pop":963173},"tirupattur":{"cc":"IN","lat":12.49,"lng":78.57,"pop":64125},"tirupparangunram":{"cc":"IN","lat":9.88,"lng":78.07,"pop":50004},"tirupati":{"cc":"IN","lat":13.64,"lng":79.42,"pop":295323},"tirunelveli":{"cc":"IN","lat":8.73,"lng":77.68,"pop":1435844},"tirumangalam":{"cc":"IN","lat":9.82,"lng":77.98,"pop":51194},"tiruchengode":{"cc":"IN","lat":11.38,"lng":77.89,"pop":95335},"tiruchirappalli":{"cc":"IN","lat":10.82,"lng":78.7,"pop":1022518},"tiptr":{"cc":"IN","lat":13.26,"lng":76.48,"pop":60957},"tiptur":{"cc":"IN","lat":13.26,"lng":76.48,"pop":60957},"tinsukia":{"cc":"IN","lat":27.49,"lng":95.36,"pop":116322},"tindivanam":{"cc":"IN","lat":12.23,"lng":79.66,"pop":72796},"tilhar":{"cc":"IN","lat":27.96,"lng":79.74,"pop":57043},"tkamgarh":{"cc":"IN","lat":24.74,"lng":78.83,"pop":79106},"tikamgarh":{"cc":"IN","lat":24.74,"lng":78.83,"pop":79106},"thiruvarur":{"cc":"IN","lat":10.77,"lng":79.64,"pop":58777},"thanjavur":{"cc":"IN","lat":10.79,"lng":79.14,"pop":291067},"thnesar":{"cc":"IN","lat":29.97,"lng":76.83,"pop":155152},"thanesar":{"cc":"IN","lat":29.97,"lng":76.83,"pop":155152},"thne":{"cc":"IN","lat":19.2,"lng":72.96,"pop":1841488},"thane":{"cc":"IN","lat":19.2,"lng":72.96,"pop":1841488},"tezpur":{"cc":"IN","lat":26.63,"lng":92.8,"pop":75540},"thenkasi":{"cc":"IN","lat":8.96,"lng":77.32,"pop":70545},"teni":{"cc":"IN","lat":10.01,"lng":77.48,"pop":1034724},"thenali":{"cc":"IN","lat":16.24,"lng":80.64,"pop":164937},"tellicherry":{"cc":"IN","lat":11.75,"lng":75.49,"pop":97201},"teghra":{"cc":"IN","lat":25.49,"lng":85.94,"pop":56234},"tarn taran":{"cc":"IN","lat":31.45,"lng":74.93,"pop":66847},"tanuku":{"cc":"IN","lat":16.75,"lng":81.68,"pop":77962},"tandur":{"cc":"IN","lat":17.25,"lng":77.58,"pop":65115},"tanda":{"cc":"IN","lat":26.55,"lng":82.66,"pop":88073},"tnd":{"cc":"IN","lat":26.55,"lng":82.66,"pop":88073},"tambaram":{"cc":"IN","lat":12.92,"lng":80.13,"pop":174787},"taliparamba":{"cc":"IN","lat":12.04,"lng":75.36,"pop":72465},"talegaon dabhade":{"cc":"IN","lat":18.74,"lng":73.68,"pop":56435},"talegaon dbhde":{"cc":"IN","lat":18.74,"lng":73.68,"pop":56435},"tadpatri":{"cc":"IN","lat":14.91,"lng":78.01,"pop":108171},"tadepalligudem":{"cc":"IN","lat":16.81,"lng":81.53,"pop":112655},"tdepalle":{"cc":"IN","lat":16.48,"lng":80.6,"pop":64149},"tadepalle":{"cc":"IN","lat":16.48,"lng":80.6,"pop":64149},"suripet":{"cc":"IN","lat":17.14,"lng":79.62,"pop":111729},"suriapet":{"cc":"IN","lat":17.14,"lng":79.62,"pop":111729},"surendranagar":{"cc":"IN","lat":22.73,"lng":71.65,"pop":179628},"suratgarh":{"cc":"IN","lat":29.32,"lng":73.9,"pop":70536},"surat":{"cc":"IN","lat":21.2,"lng":72.83,"pop":4591246},"supaul":{"cc":"IN","lat":26.12,"lng":86.6,"pop":65437},"sunam":{"cc":"IN","lat":30.13,"lng":75.8,"pop":69069},"sunm":{"cc":"IN","lat":30.13,"lng":75.8,"pop":69069},"sultnpur":{"cc":"IN","lat":26.26,"lng":82.07,"pop":110368},"sultanpur":{"cc":"IN","lat":26.26,"lng":82.07,"pop":110368},"sujangarh":{"cc":"IN","lat":27.7,"lng":74.47,"pop":183808},"sjngarh":{"cc":"IN","lat":27.7,"lng":74.47,"pop":183808},"srivilliputhur":{"cc":"IN","lat":9.51,"lng":77.63,"pop":75396},"srinagar":{"cc":"IN","lat":34.09,"lng":74.81,"pop":1206419},"srikakulam":{"cc":"IN","lat":18.3,"lng":83.9,"pop":137944},"sri dungargarh":{"cc":"IN","lat":28.1,"lng":74.01,"pop":53294},"sri dngargarh":{"cc":"IN","lat":28.1,"lng":74.01,"pop":53294},"sopur":{"cc":"IN","lat":34.29,"lng":74.47,"pop":71292},"sonipat":{"cc":"IN","lat":28.99,"lng":77.02,"pop":289333},"sonpat":{"cc":"IN","lat":28.99,"lng":77.02,"pop":289333},"rajpur sonarpur":{"cc":"IN","lat":22.44,"lng":88.43,"pop":424368},"siwn":{"cc":"IN","lat":26.22,"lng":84.36,"pop":135066},"siwan":{"cc":"IN","lat":26.22,"lng":84.36,"pop":135066},"sivakasi":{"cc":"IN","lat":9.45,"lng":77.8,"pop":234704},"siuri":{"cc":"IN","lat":23.91,"lng":87.53,"pop":64659},"sitapur":{"cc":"IN","lat":27.56,"lng":80.68,"pop":164435},"stpur":{"cc":"IN","lat":27.56,"lng":80.68,"pop":164435},"stmarhi":{"cc":"IN","lat":26.59,"lng":85.49,"pop":67818},"sitamarhi":{"cc":"IN","lat":26.59,"lng":85.49,"pop":67818},"siruguppa":{"cc":"IN","lat":15.63,"lng":76.89,"pop":52492},"sirsilla":{"cc":"IN","lat":18.39,"lng":78.81,"pop":83186},"sirsi":{"cc":"IN","lat":14.62,"lng":74.84,"pop":62882},"sirsa":{"cc":"IN","lat":29.53,"lng":75.03,"pop":182534},"sironj":{"cc":"IN","lat":24.1,"lng":77.69,"pop":52460},"sirhind":{"cc":"IN","lat":30.64,"lng":76.38,"pop":60847},"sra":{"cc":"IN","lat":13.74,"lng":76.9,"pop":57928},"sira":{"cc":"IN","lat":13.74,"lng":76.9,"pop":57928},"sinnar":{"cc":"IN","lat":19.85,"lng":74.0,"pop":65299},"sindhnr":{"cc":"IN","lat":15.77,"lng":76.76,"pop":75837},"sindhnur":{"cc":"IN","lat":15.77,"lng":76.76,"pop":75837},"shimla":{"cc":"IN","lat":31.1,"lng":77.17,"pop":173503},"silvassa":{"cc":"IN","lat":20.27,"lng":73.0,"pop":98265},"sillod":{"cc":"IN","lat":20.3,"lng":75.65,"pop":58230},"silchar":{"cc":"IN","lat":24.83,"lng":92.8,"pop":178865},"skar":{"cc":"IN","lat":27.61,"lng":75.14,"pop":244497},"sikar":{"cc":"IN","lat":27.61,"lng":75.14,"pop":244497},"sikandarbd":{"cc":"IN","lat":28.45,"lng":77.7,"pop":73379},"sikandarabad":{"cc":"IN","lat":28.45,"lng":77.7,"pop":73379},"sihor":{"cc":"IN","lat":21.71,"lng":71.96,"pop":54547},"sidlaghatta":{"cc":"IN","lat":13.39,"lng":77.86,"pop":51159},"sidhi":{"cc":"IN","lat":24.4,"lng":81.88,"pop":54331},"siddipet":{"cc":"IN","lat":18.1,"lng":78.85,"pop":66737},"siddhapur":{"cc":"IN","lat":23.92,"lng":72.37,"pop":61867},"sibsagar":{"cc":"IN","lat":26.98,"lng":94.64,"pop":62104},"sibsgar":{"cc":"IN","lat":26.98,"lng":94.64,"pop":62104},"shyamnagar":{"cc":"IN","lat":22.83,"lng":88.37,"pop":441956},"shujlpur":{"cc":"IN","lat":23.41,"lng":76.71,"pop":51225},"shujalpur":{"cc":"IN","lat":23.41,"lng":76.71,"pop":51225},"shrrmpur":{"cc":"IN","lat":22.75,"lng":88.34,"pop":226317},"shrirampur":{"cc":"IN","lat":22.75,"lng":88.34,"pop":226317},"shorpur":{"cc":"IN","lat":16.52,"lng":76.76,"pop":51398},"shorapur":{"cc":"IN","lat":16.52,"lng":76.76,"pop":51398},"sholapur":{"cc":"IN","lat":17.67,"lng":75.91,"pop":997281},"shivpuri":{"cc":"IN","lat":25.42,"lng":77.66,"pop":179977},"shirpur":{"cc":"IN","lat":21.35,"lng":74.88,"pop":76905},"shivamogga":{"cc":"IN","lat":13.93,"lng":75.57,"pop":322650},"shillong":{"cc":"IN","lat":25.57,"lng":91.88,"pop":143229},"siliguri":{"cc":"IN","lat":26.71,"lng":88.43,"pop":515574},"shikohabad":{"cc":"IN","lat":27.11,"lng":78.59,"pop":99678},"shikohbd":{"cc":"IN","lat":27.11,"lng":78.59,"pop":99678},"sherkot":{"cc":"IN","lat":29.33,"lng":78.57,"pop":57361},"sheopur":{"cc":"IN","lat":25.66,"lng":76.7,"pop":71951},"shegaon":{"cc":"IN","lat":20.79,"lng":76.7,"pop":59672},"shantipur":{"cc":"IN","lat":23.25,"lng":88.43,"pop":149983},"shntipur":{"cc":"IN","lat":23.25,"lng":88.43,"pop":149983},"shamli":{"cc":"IN","lat":29.45,"lng":77.31,"pop":97966},"shmli":{"cc":"IN","lat":29.45,"lng":77.31,"pop":97966},"shjpur":{"cc":"IN","lat":23.43,"lng":76.28,"pop":69263},"shajapur":{"cc":"IN","lat":23.43,"lng":76.28,"pop":69263},"sheikhpura":{"cc":"IN","lat":25.14,"lng":85.84,"pop":62927},"shhpur":{"cc":"IN","lat":16.7,"lng":76.84,"pop":53366},"shahpur":{"cc":"IN","lat":16.7,"lng":76.84,"pop":53366},"shhjnpur":{"cc":"IN","lat":27.88,"lng":79.91,"pop":320434},"shahjanpur":{"cc":"IN","lat":27.88,"lng":79.91,"pop":320434},"shahdol":{"cc":"IN","lat":23.29,"lng":81.36,"pop":89289},"shhda":{"cc":"IN","lat":21.55,"lng":74.47,"pop":61376},"shahada":{"cc":"IN","lat":21.55,"lng":74.47,"pop":61376},"shhbd":{"cc":"IN","lat":27.64,"lng":79.94,"pop":73606},"shahabad":{"cc":"IN","lat":27.64,"lng":79.94,"pop":73606},"seoni":{"cc":"IN","lat":22.09,"lng":79.55,"pop":102343},"sendhwa":{"cc":"IN","lat":21.69,"lng":75.1,"pop":56485},"sehore":{"cc":"IN","lat":23.2,"lng":77.08,"pop":109118},"secunderabad":{"cc":"IN","lat":17.5,"lng":78.54,"pop":204182},"sawai madhopur":{"cc":"IN","lat":26.02,"lng":76.34,"pop":121106},"sattenapalle":{"cc":"IN","lat":16.39,"lng":80.15,"pop":56721},"satna":{"cc":"IN","lat":24.58,"lng":80.83,"pop":282977},"satara":{"cc":"IN","lat":17.69,"lng":73.99,"pop":120195},"sasaram":{"cc":"IN","lat":24.95,"lng":84.02,"pop":147408},"sasarm":{"cc":"IN","lat":24.95,"lng":84.02,"pop":147408},"sardarshahr":{"cc":"IN","lat":28.44,"lng":74.49,"pop":95911},"sardrshahr":{"cc":"IN","lat":28.44,"lng":74.49,"pop":95911},"sankarankovil":{"cc":"IN","lat":9.17,"lng":77.54,"pop":57277},"sangrr":{"cc":"IN","lat":30.25,"lng":75.84,"pop":88615},"sangrur":{"cc":"IN","lat":30.25,"lng":75.84,"pop":88615},"sangli":{"cc":"IN","lat":16.85,"lng":74.56,"pop":601214},"sngli":{"cc":"IN","lat":16.85,"lng":74.56,"pop":601214},"sangareddi":{"cc":"IN","lat":17.62,"lng":78.09,"pop":72344},"sangreddi":{"cc":"IN","lat":17.62,"lng":78.09,"pop":72344},"sangamner":{"cc":"IN","lat":19.57,"lng":74.21,"pop":67309},"sandila":{"cc":"IN","lat":27.07,"lng":80.51,"pop":53182},"sandla":{"cc":"IN","lat":27.07,"lng":80.51,"pop":53182},"sanand":{"cc":"IN","lat":22.99,"lng":72.38,"pop":95890},"snand":{"cc":"IN","lat":22.99,"lng":72.38,"pop":95890},"sambhal":{"cc":"IN","lat":28.58,"lng":78.57,"pop":196109},"sambalpur":{"cc":"IN","lat":21.47,"lng":83.98,"pop":189366},"samstipur":{"cc":"IN","lat":25.86,"lng":85.78,"pop":67925},"samastipur":{"cc":"IN","lat":25.86,"lng":85.78,"pop":67925},"samna":{"cc":"IN","lat":30.15,"lng":76.2,"pop":54072},"samana":{"cc":"IN","lat":30.15,"lng":76.2,"pop":54072},"samalkot":{"cc":"IN","lat":17.06,"lng":82.18,"pop":56864},"smalkot":{"cc":"IN","lat":17.06,"lng":82.18,"pop":56864},"salur":{"cc":"IN","lat":18.52,"lng":83.21,"pop":50206},"slr":{"cc":"IN","lat":18.52,"lng":83.21,"pop":50206},"sahibganj":{"cc":"IN","lat":25.24,"lng":87.63,"pop":95890},"sahaswan":{"cc":"IN","lat":28.07,"lng":78.75,"pop":60953},"sahaswn":{"cc":"IN","lat":28.07,"lng":78.75,"pop":60953},"saharsa":{"cc":"IN","lat":25.87,"lng":86.6,"pop":156540},"saharanpur":{"cc":"IN","lat":29.97,"lng":77.55,"pop":484873},"sahranpur":{"cc":"IN","lat":29.97,"lng":77.55,"pop":484873},"saugor":{"cc":"IN","lat":23.84,"lng":78.74,"pop":274556},"sagar":{"cc":"IN","lat":14.16,"lng":75.03,"pop":54550},"sgar":{"cc":"IN","lat":14.16,"lng":75.03,"pop":54550},"ropar":{"cc":"IN","lat":30.97,"lng":76.53,"pop":56038},"roorkee":{"cc":"IN","lat":29.87,"lng":77.89,"pop":103894},"rohtak":{"cc":"IN","lat":28.89,"lng":76.59,"pop":374292},"roha":{"cc":"IN","lat":18.44,"lng":73.12,"pop":90000},"robertsonpet":{"cc":"IN","lat":12.96,"lng":78.28,"pop":162230},"rishra":{"cc":"IN","lat":22.72,"lng":88.35,"pop":117014},"rishikesh":{"cc":"IN","lat":30.11,"lng":78.29,"pop":66390},"rishkesh":{"cc":"IN","lat":30.11,"lng":78.29,"pop":66390},"rewari":{"cc":"IN","lat":28.2,"lng":76.62,"pop":143021},"rewri":{"cc":"IN","lat":28.2,"lng":76.62,"pop":143021},"rewa":{"cc":"IN","lat":24.53,"lng":81.29,"pop":235654},"repalle":{"cc":"IN","lat":16.02,"lng":80.83,"pop":50866},"renukt":{"cc":"IN","lat":24.22,"lng":83.04,"pop":62413},"renukut":{"cc":"IN","lat":24.22,"lng":83.04,"pop":62413},"ryagada":{"cc":"IN","lat":19.17,"lng":83.41,"pop":71208},"rayagada":{"cc":"IN","lat":19.17,"lng":83.41,"pop":71208},"ryadrug":{"cc":"IN","lat":14.7,"lng":76.85,"pop":61749},"rayadrug":{"cc":"IN","lat":14.7,"lng":76.85,"pop":61749},"rayachoti":{"cc":"IN","lat":14.06,"lng":78.75,"pop":91234},"raxaul":{"cc":"IN","lat":26.98,"lng":84.85,"pop":55536},"rourkela":{"cc":"IN","lat":22.22,"lng":84.86,"pop":273317},"ratnagiri":{"cc":"IN","lat":16.99,"lng":73.31,"pop":76229},"ratlm":{"cc":"IN","lat":23.33,"lng":75.04,"pop":264914},"ratlam":{"cc":"IN","lat":23.33,"lng":75.04,"pop":264914},"rath":{"cc":"IN","lat":25.59,"lng":79.57,"pop":61728},"rth":{"cc":"IN","lat":25.59,"lng":79.57,"pop":61728},"ratangarh":{"cc":"IN","lat":28.08,"lng":74.62,"pop":71124},"rasipuram":{"cc":"IN","lat":11.46,"lng":78.19,"pop":50244},"rasapdipalem":{"cc":"IN","lat":17.73,"lng":83.32,"pop":1728128},"rasapudipalem":{"cc":"IN","lat":17.73,"lng":83.32,"pop":1728128},"rnipet":{"cc":"IN","lat":12.92,"lng":79.33,"pop":264330},"ranipet":{"cc":"IN","lat":12.92,"lng":79.33,"pop":264330},"raniganj":{"cc":"IN","lat":17.43,"lng":78.49,"pop":217910},"rnganj":{"cc":"IN","lat":23.62,"lng":87.13,"pop":131261},"ranebennur":{"cc":"IN","lat":14.62,"lng":75.63,"pop":106406},"ranchi":{"cc":"IN","lat":23.34,"lng":85.31,"pop":1120374},"ranaghat":{"cc":"IN","lat":23.18,"lng":88.57,"pop":70984},"rnght":{"cc":"IN","lat":23.18,"lng":88.57,"pop":70984},"rampur hat":{"cc":"IN","lat":24.18,"lng":87.78,"pop":53468},"rampur":{"cc":"IN","lat":28.81,"lng":79.03,"pop":296418},"rmpur":{"cc":"IN","lat":28.81,"lng":79.03,"pop":296418},"rmnagar":{"cc":"IN","lat":29.39,"lng":79.13,"pop":51244},"ramnagar":{"cc":"IN","lat":29.39,"lng":79.13,"pop":51244},"rmgundam":{"cc":"IN","lat":18.8,"lng":79.45,"pop":452261},"ramgundam":{"cc":"IN","lat":18.8,"lng":79.45,"pop":452261},"rmgarh":{"cc":"IN","lat":23.63,"lng":85.52,"pop":88781},"ramgarh":{"cc":"IN","lat":23.63,"lng":85.52,"pop":88781},"ramanathapuram":{"cc":"IN","lat":9.37,"lng":78.83,"pop":65314},"closepet":{"cc":"IN","lat":12.72,"lng":77.28,"pop":95167},"rajsamand":{"cc":"IN","lat":25.07,"lng":73.88,"pop":67798},"rjsamand":{"cc":"IN","lat":25.07,"lng":73.88,"pop":67798},"rajpura":{"cc":"IN","lat":30.48,"lng":76.59,"pop":92301},"raj-nandgaon":{"cc":"IN","lat":21.1,"lng":81.03,"pop":163114},"rj-nndgaon":{"cc":"IN","lat":21.1,"lng":81.03,"pop":163114},"rjkot":{"cc":"IN","lat":22.29,"lng":70.79,"pop":1390640},"rajkot":{"cc":"IN","lat":22.29,"lng":70.79,"pop":1390640},"rjgarh":{"cc":"IN","lat":28.64,"lng":75.39,"pop":59193},"rajgarh":{"cc":"IN","lat":28.64,"lng":75.39,"pop":59193},"rajapalayam":{"cc":"IN","lat":9.45,"lng":77.55,"pop":130442},"rzampeta":{"cc":"IN","lat":14.2,"lng":79.16,"pop":54050},"razampeta":{"cc":"IN","lat":14.2,"lng":79.16,"pop":54050},"rajamahendravaram":{"cc":"IN","lat":17.01,"lng":81.78,"pop":376333},"raigarh":{"cc":"IN","lat":21.9,"lng":83.4,"pop":150019},"riganj":{"cc":"IN","lat":25.61,"lng":88.12,"pop":170252},"raiganj":{"cc":"IN","lat":25.61,"lng":88.12,"pop":170252},"richr":{"cc":"IN","lat":16.21,"lng":77.36,"pop":234073},"raichur":{"cc":"IN","lat":16.21,"lng":77.36,"pop":234073},"rghogarh":{"cc":"IN","lat":24.44,"lng":77.2,"pop":63873},"raghogarh":{"cc":"IN","lat":24.44,"lng":77.2,"pop":63873},"raebareli":{"cc":"IN","lat":26.23,"lng":81.23,"pop":186433},"rabkavi":{"cc":"IN","lat":16.48,"lng":75.11,"pop":73835},"kollam":{"cc":"IN","lat":8.88,"lng":76.58,"pop":367107},"koyilandy":{"cc":"IN","lat":11.44,"lng":75.69,"pop":71873},"puttr":{"cc":"IN","lat":13.44,"lng":79.55,"pop":54092},"puttur":{"cc":"IN","lat":13.44,"lng":79.55,"pop":54092},"pusad":{"cc":"IN","lat":19.91,"lng":77.58,"pop":73046},"puruliya":{"cc":"IN","lat":23.33,"lng":86.36,"pop":122533},"purnia":{"cc":"IN","lat":25.78,"lng":87.47,"pop":282248},"puri":{"cc":"IN","lat":19.8,"lng":85.82,"pop":200564},"punganuru":{"cc":"IN","lat":13.37,"lng":78.57,"pop":54746},"punganru":{"cc":"IN","lat":13.37,"lng":78.57,"pop":54746},"pune":{"cc":"IN","lat":18.52,"lng":73.86,"pop":3124458},"punsa":{"cc":"IN","lat":22.24,"lng":76.39,"pop":350000},"punasa":{"cc":"IN","lat":22.24,"lng":76.39,"pop":350000},"puliyankudi":{"cc":"IN","lat":9.17,"lng":77.4,"pop":66034},"pulivendla":{"cc":"IN","lat":14.42,"lng":78.23,"pop":65706},"pudukkottai":{"cc":"IN","lat":10.38,"lng":78.82,"pop":117630},"proddatr":{"cc":"IN","lat":14.75,"lng":78.55,"pop":177797},"proddatur":{"cc":"IN","lat":14.75,"lng":78.55,"pop":177797},"port blair":{"cc":"IN","lat":11.67,"lng":92.75,"pop":112050},"porbandar":{"cc":"IN","lat":21.64,"lng":69.61,"pop":152760},"poonamalle":{"cc":"IN","lat":13.05,"lng":80.11,"pop":60607},"ponnuru":{"cc":"IN","lat":16.07,"lng":80.55,"pop":57170},"ponnru":{"cc":"IN","lat":16.07,"lng":80.55,"pop":57170},"ponnani":{"cc":"IN","lat":10.77,"lng":75.93,"pop":105512},"ponnni":{"cc":"IN","lat":10.77,"lng":75.93,"pop":105512},"puducherry":{"cc":"IN","lat":11.93,"lng":79.83,"pop":657209},"pollachi":{"cc":"IN","lat":10.66,"lng":77.01,"pop":90180},"pithapuram":{"cc":"IN","lat":17.12,"lng":82.25,"pop":54859},"pithpuram":{"cc":"IN","lat":17.12,"lng":82.25,"pop":54859},"pimpri":{"cc":"IN","lat":18.62,"lng":73.81,"pop":1284606},"pilkhua":{"cc":"IN","lat":28.71,"lng":77.66,"pop":74212},"plibht":{"cc":"IN","lat":28.63,"lng":79.8,"pop":131008},"pilibhit":{"cc":"IN","lat":28.63,"lng":79.8,"pop":131008},"piduguralla":{"cc":"IN","lat":16.48,"lng":79.89,"pop":63103},"pidugurlla":{"cc":"IN","lat":16.48,"lng":79.89,"pop":63103},"phaltan":{"cc":"IN","lat":17.99,"lng":74.43,"pop":53202},"phagwara":{"cc":"IN","lat":31.22,"lng":75.77,"pop":100146},"phagwra":{"cc":"IN","lat":31.22,"lng":75.77,"pop":100146},"petlad":{"cc":"IN","lat":22.48,"lng":72.8,"pop":55330},"petld":{"cc":"IN","lat":22.48,"lng":72.8,"pop":55330},"peranmpattu":{"cc":"IN","lat":12.93,"lng":78.72,"pop":51271},"peranampattu":{"cc":"IN","lat":12.93,"lng":78.72,"pop":51271},"payyanur":{"cc":"IN","lat":12.09,"lng":75.2,"pop":72111},"pattukkottai":{"cc":"IN","lat":10.42,"lng":79.32,"pop":73135},"patna":{"cc":"IN","lat":25.59,"lng":85.14,"pop":1684297},"patiala":{"cc":"IN","lat":30.34,"lng":76.39,"pop":446246},"patila":{"cc":"IN","lat":30.34,"lng":76.39,"pop":446246},"pathankot":{"cc":"IN","lat":32.27,"lng":75.65,"pop":174306},"pathnkot":{"cc":"IN","lat":32.27,"lng":75.65,"pop":174306},"parvatipuram":{"cc":"IN","lat":18.78,"lng":83.43,"pop":53844},"prvatipuram":{"cc":"IN","lat":18.78,"lng":83.43,"pop":53844},"parli vaijnth":{"cc":"IN","lat":18.85,"lng":76.53,"pop":94863},"parli vaijnath":{"cc":"IN","lat":18.85,"lng":76.53,"pop":94863},"parbhani":{"cc":"IN","lat":19.27,"lng":76.77,"pop":307170},"paramagudi":{"cc":"IN","lat":9.55,"lng":78.59,"pop":95579},"paralakhemundi":{"cc":"IN","lat":18.78,"lng":84.1,"pop":87152},"paradip garh":{"cc":"IN","lat":20.32,"lng":86.61,"pop":85868},"pardp garh":{"cc":"IN","lat":20.32,"lng":86.61,"pop":85868},"panvel":{"cc":"IN","lat":18.99,"lng":73.11,"pop":195373},"panruti":{"cc":"IN","lat":11.78,"lng":79.55,"pop":60323},"panna":{"cc":"IN","lat":24.72,"lng":80.19,"pop":59091},"panipat":{"cc":"IN","lat":29.39,"lng":76.97,"pop":295970},"pnihti":{"cc":"IN","lat":22.69,"lng":88.37,"pop":378705},"panihati":{"cc":"IN","lat":22.69,"lng":88.37,"pop":378705},"pandharpur":{"cc":"IN","lat":17.68,"lng":75.33,"pop":98923},"panjim":{"cc":"IN","lat":15.5,"lng":73.83,"pop":70991},"palwal":{"cc":"IN","lat":28.14,"lng":77.33,"pop":131926},"ploncha":{"cc":"IN","lat":17.6,"lng":80.71,"pop":75224},"paloncha":{"cc":"IN","lat":17.6,"lng":80.71,"pop":75224},"palani":{"cc":"IN","lat":10.45,"lng":77.52,"pop":70467},"palmaner":{"cc":"IN","lat":13.2,"lng":78.75,"pop":54035},"pallvaram":{"cc":"IN","lat":12.97,"lng":80.15,"pop":233984},"pallavaram":{"cc":"IN","lat":12.97,"lng":80.15,"pop":233984},"palitana":{"cc":"IN","lat":21.53,"lng":71.82,"pop":64497},"plitna":{"cc":"IN","lat":21.53,"lng":71.82,"pop":64497},"pli":{"cc":"IN","lat":25.77,"lng":73.32,"pop":230075},"pali":{"cc":"IN","lat":25.77,"lng":73.32,"pop":230075},"palakkad":{"cc":"IN","lat":10.77,"lng":76.65,"pop":132728},"palghar":{"cc":"IN","lat":19.7,"lng":72.77,"pop":72335},"plghar":{"cc":"IN","lat":19.7,"lng":72.77,"pop":72335},"palsa":{"cc":"IN","lat":18.77,"lng":84.41,"pop":65833},"palasa":{"cc":"IN","lat":18.77,"lng":84.41,"pop":65833},"palanpur":{"cc":"IN","lat":24.17,"lng":72.44,"pop":141592},"planpur":{"cc":"IN","lat":24.17,"lng":72.44,"pop":141592},"palakollu":{"cc":"IN","lat":16.52,"lng":81.73,"pop":81199},"pchora":{"cc":"IN","lat":20.67,"lng":75.35,"pop":59609},"pachora":{"cc":"IN","lat":20.67,"lng":75.35,"pop":59609},"ottapalam":{"cc":"IN","lat":10.77,"lng":76.38,"pop":53792},"dharashiv":{"cc":"IN","lat":18.18,"lng":76.04,"pop":112085},"orai":{"cc":"IN","lat":25.99,"lng":79.45,"pop":158265},"ongole":{"cc":"IN","lat":15.5,"lng":80.04,"pop":208344},"okha":{"cc":"IN","lat":22.47,"lng":69.07,"pop":62052},"ozar":{"cc":"IN","lat":20.09,"lng":73.93,"pop":51297},"obra":{"cc":"IN","lat":24.42,"lng":82.99,"pop":56110},"nzvd":{"cc":"IN","lat":16.79,"lng":80.85,"pop":58590},"nuzvid":{"cc":"IN","lat":16.79,"lng":80.85,"pop":58590},"nowrangapur":{"cc":"IN","lat":19.23,"lng":82.55,"pop":1220946},"nagaon":{"cc":"IN","lat":26.35,"lng":92.67,"pop":121628},"north lakhimpur":{"cc":"IN","lat":27.24,"lng":94.1,"pop":59841},"nokha":{"cc":"IN","lat":27.56,"lng":73.47,"pop":62699},"nizmbd":{"cc":"IN","lat":18.67,"lng":78.1,"pop":311152},"nizamabad":{"cc":"IN","lat":18.67,"lng":78.1,"pop":311152},"nirmal":{"cc":"IN","lat":19.1,"lng":78.34,"pop":88433},"nipni":{"cc":"IN","lat":16.4,"lng":74.38,"pop":62865},"nipani":{"cc":"IN","lat":16.4,"lng":74.38,"pop":62865},"nimbahera":{"cc":"IN","lat":24.62,"lng":74.68,"pop":61949},"nmbhera":{"cc":"IN","lat":24.62,"lng":74.68,"pop":61949},"neyyattinkara":{"cc":"IN","lat":8.4,"lng":77.09,"pop":88104},"neyyttinkara":{"cc":"IN","lat":8.4,"lng":77.09,"pop":88104},"neyveli":{"cc":"IN","lat":11.61,"lng":79.5,"pop":179150},"new delhi":{"cc":"IN","lat":28.62,"lng":77.21,"pop":317797},"nellore":{"cc":"IN","lat":14.45,"lng":79.99,"pop":547621},"nedumangd":{"cc":"IN","lat":8.6,"lng":77.0,"pop":60161},"nedumangad":{"cc":"IN","lat":8.6,"lng":77.0,"pop":60161},"nawalgarh":{"cc":"IN","lat":27.85,"lng":75.27,"pop":63948},"nawada":{"cc":"IN","lat":24.89,"lng":85.54,"pop":98029},"nawda":{"cc":"IN","lat":24.89,"lng":85.54,"pop":98029},"navsari":{"cc":"IN","lat":20.94,"lng":72.92,"pop":171109},"navadwip":{"cc":"IN","lat":23.41,"lng":88.37,"pop":111123},"navadwp":{"cc":"IN","lat":23.41,"lng":88.37,"pop":111123},"nasrbd":{"cc":"IN","lat":26.3,"lng":74.73,"pop":51747},"nasirabad":{"cc":"IN","lat":26.3,"lng":74.73,"pop":51747},"nashik":{"cc":"IN","lat":20.0,"lng":73.79,"pop":1486053},"narwana":{"cc":"IN","lat":29.6,"lng":76.12,"pop":62090},"narwna":{"cc":"IN","lat":29.6,"lng":76.12,"pop":62090},"narsimhapur":{"cc":"IN","lat":22.95,"lng":79.18,"pop":59966},"narnaul":{"cc":"IN","lat":28.04,"lng":76.11,"pop":74581},"narela":{"cc":"IN","lat":28.85,"lng":77.09,"pop":800000},"narasaraopet":{"cc":"IN","lat":16.23,"lng":80.05,"pop":117489},"narasapur":{"cc":"IN","lat":16.43,"lng":81.7,"pop":59306},"nanjangud":{"cc":"IN","lat":12.12,"lng":76.68,"pop":50598},"nanjangd":{"cc":"IN","lat":12.12,"lng":76.68,"pop":50598},"nangloi jat":{"cc":"IN","lat":28.68,"lng":77.07,"pop":205596},"nngloi jt":{"cc":"IN","lat":28.68,"lng":77.07,"pop":205596},"nandyl":{"cc":"IN","lat":15.48,"lng":78.48,"pop":211424},"nandyal":{"cc":"IN","lat":15.48,"lng":78.48,"pop":211424},"nandurbar":{"cc":"IN","lat":21.37,"lng":74.24,"pop":111037},"nanded":{"cc":"IN","lat":19.16,"lng":77.31,"pop":550564},"nmakkal":{"cc":"IN","lat":11.22,"lng":78.17,"pop":55997},"namakkal":{"cc":"IN","lat":11.22,"lng":78.17,"pop":55997},"nalgonda":{"cc":"IN","lat":17.05,"lng":79.27,"pop":154326},"naksalbri":{"cc":"IN","lat":26.68,"lng":88.22,"pop":57283},"naksalbari":{"cc":"IN","lat":26.68,"lng":88.22,"pop":57283},"najbbd":{"cc":"IN","lat":29.61,"lng":78.34,"pop":84006},"najibabad":{"cc":"IN","lat":29.61,"lng":78.34,"pop":84006},"najafgarh":{"cc":"IN","lat":28.61,"lng":76.98,"pop":1365000},"naihti":{"cc":"IN","lat":22.89,"lng":88.42,"pop":253221},"naihati":{"cc":"IN","lat":22.89,"lng":88.42,"pop":253221},"nagpur":{"cc":"IN","lat":21.15,"lng":79.08,"pop":2405665},"nagina":{"cc":"IN","lat":29.44,"lng":78.44,"pop":76593},"nagna":{"cc":"IN","lat":29.44,"lng":78.44,"pop":76593},"ngercoil":{"cc":"IN","lat":8.18,"lng":77.43,"pop":224849},"nagercoil":{"cc":"IN","lat":8.18,"lng":77.43,"pop":224849},"nagda":{"cc":"IN","lat":23.46,"lng":75.42,"pop":103501},"nagaur":{"cc":"IN","lat":27.2,"lng":73.73,"pop":105218},"ngaur":{"cc":"IN","lat":27.2,"lng":73.73,"pop":105218},"nagari":{"cc":"IN","lat":13.32,"lng":79.59,"pop":62253},"nagapattinam":{"cc":"IN","lat":10.76,"lng":79.84,"pop":102905},"nadid":{"cc":"IN","lat":22.69,"lng":72.86,"pop":225071},"nadiad":{"cc":"IN","lat":22.69,"lng":72.86,"pop":225071},"nabha":{"cc":"IN","lat":30.38,"lng":76.15,"pop":67972},"nbha":{"cc":"IN","lat":30.38,"lng":76.15,"pop":67972},"mysuru":{"cc":"IN","lat":12.3,"lng":76.64,"pop":920550},"muzaffarpur":{"cc":"IN","lat":26.12,"lng":85.39,"pop":354462},"muzaffarnagar":{"cc":"IN","lat":29.47,"lng":77.7,"pop":349706},"murwara":{"cc":"IN","lat":23.84,"lng":80.39,"pop":221883},"murwra":{"cc":"IN","lat":23.84,"lng":80.39,"pop":221883},"murdnagar":{"cc":"IN","lat":28.78,"lng":77.5,"pop":89482},"muradnagar":{"cc":"IN","lat":28.78,"lng":77.5,"pop":89482},"munnar":{"cc":"IN","lat":10.09,"lng":77.06,"pop":68000},"munger":{"cc":"IN","lat":25.37,"lng":86.47,"pop":213303},"mulbgal":{"cc":"IN","lat":13.16,"lng":78.39,"pop":57276},"mulbagal":{"cc":"IN","lat":13.16,"lng":78.39,"pop":57276},"muktsar":{"cc":"IN","lat":30.47,"lng":74.52,"pop":116747},"pandit deen dayal upadhyaya nagar":{"cc":"IN","lat":25.28,"lng":83.12,"pop":109650},"mudhol":{"cc":"IN","lat":16.33,"lng":75.28,"pop":52199},"mubarakpur":{"cc":"IN","lat":26.09,"lng":83.29,"pop":53263},"mothhri":{"cc":"IN","lat":26.65,"lng":84.92,"pop":126158},"mothihari":{"cc":"IN","lat":26.65,"lng":84.92,"pop":126158},"morena":{"cc":"IN","lat":26.5,"lng":78.0,"pop":200482},"morvi":{"cc":"IN","lat":22.82,"lng":70.84,"pop":210451},"moradabad":{"cc":"IN","lat":28.84,"lng":78.78,"pop":721139},"mordbd":{"cc":"IN","lat":28.84,"lng":78.78,"pop":721139},"mokameh":{"cc":"IN","lat":25.4,"lng":85.92,"pop":60678},"moga":{"cc":"IN","lat":30.81,"lng":75.17,"pop":163397},"modasa":{"cc":"IN","lat":23.46,"lng":73.3,"pop":67648},"modsa":{"cc":"IN","lat":23.46,"lng":73.3,"pop":67648},"mirzpur":{"cc":"IN","lat":25.14,"lng":82.57,"pop":220029},"mirzapur":{"cc":"IN","lat":25.14,"lng":82.57,"pop":220029},"miryalaguda":{"cc":"IN","lat":16.87,"lng":79.56,"pop":104918},"mhow":{"cc":"IN","lat":22.56,"lng":75.77,"pop":81702},"mettur":{"cc":"IN","lat":11.79,"lng":77.8,"pop":56743},"mettupalayam":{"cc":"IN","lat":11.3,"lng":76.93,"pop":69213},"meerut":{"cc":"IN","lat":28.98,"lng":77.71,"pop":1223184},"medinpur":{"cc":"IN","lat":22.42,"lng":87.32,"pop":153349},"medinipur":{"cc":"IN","lat":22.42,"lng":87.32,"pop":153349},"mayiladuthurai":{"cc":"IN","lat":11.1,"lng":79.66,"pop":86660},"mawna":{"cc":"IN","lat":29.1,"lng":77.92,"pop":76973},"mawana":{"cc":"IN","lat":29.1,"lng":77.92,"pop":76973},"mathura":{"cc":"IN","lat":27.5,"lng":77.67,"pop":330511},"masaurhi buzurg":{"cc":"IN","lat":25.35,"lng":85.03,"pop":59803},"mormugao":{"cc":"IN","lat":15.39,"lng":73.81,"pop":102345},"mrkpur":{"cc":"IN","lat":15.74,"lng":79.27,"pop":71092},"markapur":{"cc":"IN","lat":15.74,"lng":79.27,"pop":71092},"mnsa":{"cc":"IN","lat":29.99,"lng":75.4,"pop":82956},"mannargudi":{"cc":"IN","lat":10.67,"lng":79.45,"pop":66999},"mannarakkat":{"cc":"IN","lat":10.99,"lng":76.46,"pop":50921},"mannrakkt":{"cc":"IN","lat":10.99,"lng":76.46,"pop":50921},"manmd":{"cc":"IN","lat":20.25,"lng":74.44,"pop":80058},"manmad":{"cc":"IN","lat":20.25,"lng":74.44,"pop":80058},"manjeri":{"cc":"IN","lat":11.12,"lng":76.12,"pop":97102},"mangrol":{"cc":"IN","lat":21.12,"lng":70.11,"pop":69779},"mngrol":{"cc":"IN","lat":21.12,"lng":70.11,"pop":69779},"mangaluru":{"cc":"IN","lat":12.92,"lng":74.86,"pop":499487},"mangalagiri":{"cc":"IN","lat":16.43,"lng":80.57,"pop":107197},"mandya":{"cc":"IN","lat":12.52,"lng":76.9,"pop":137358},"mndvi":{"cc":"IN","lat":22.83,"lng":69.35,"pop":51376},"mandvi":{"cc":"IN","lat":22.83,"lng":69.35,"pop":51376},"mandsaur":{"cc":"IN","lat":24.07,"lng":75.07,"pop":141667},"mandl":{"cc":"IN","lat":22.6,"lng":80.37,"pop":55133},"mandla":{"cc":"IN","lat":22.6,"lng":80.37,"pop":55133},"mandi dabwli":{"cc":"IN","lat":29.97,"lng":74.7,"pop":52873},"mandi dabwali":{"cc":"IN","lat":29.97,"lng":74.7,"pop":52873},"mandapeta":{"cc":"IN","lat":16.86,"lng":81.93,"pop":56063},"mancherial":{"cc":"IN","lat":18.87,"lng":79.43,"pop":89935},"malkapur":{"cc":"IN","lat":20.89,"lng":76.2,"pop":67740},"malkpur":{"cc":"IN","lat":20.89,"lng":76.2,"pop":67740},"maler kotla":{"cc":"IN","lat":30.53,"lng":75.88,"pop":135424},"mler kotla":{"cc":"IN","lat":30.53,"lng":75.88,"pop":135424},"malegaon":{"cc":"IN","lat":20.55,"lng":74.53,"pop":481228},"malout":{"cc":"IN","lat":30.21,"lng":74.48,"pop":81406},"malappuram":{"cc":"IN","lat":11.04,"lng":76.08,"pop":101386},"makrana":{"cc":"IN","lat":27.04,"lng":74.72,"pop":94487},"makrna":{"cc":"IN","lat":27.04,"lng":74.72,"pop":94487},"mainpuri":{"cc":"IN","lat":27.23,"lng":79.03,"pop":94619},"mahuva":{"cc":"IN","lat":21.09,"lng":71.77,"pop":98519},"mahob":{"cc":"IN","lat":25.29,"lng":79.88,"pop":89170},"mahoba":{"cc":"IN","lat":25.29,"lng":79.88,"pop":89170},"mahesana":{"cc":"IN","lat":23.6,"lng":72.38,"pop":190753},"mahesna":{"cc":"IN","lat":23.6,"lng":72.38,"pop":190753},"mahbubnagar":{"cc":"IN","lat":16.74,"lng":77.99,"pop":190400},"mahbbnagar":{"cc":"IN","lat":16.74,"lng":77.99,"pop":190400},"mahasamund":{"cc":"IN","lat":21.11,"lng":82.09,"pop":54413},"mahsamund":{"cc":"IN","lat":21.11,"lng":82.09,"pop":54413},"madurai":{"cc":"IN","lat":9.92,"lng":78.12,"pop":1465625},"chennai":{"cc":"IN","lat":13.09,"lng":80.28,"pop":4681087},"madhyamgram":{"cc":"IN","lat":22.69,"lng":88.45,"pop":161126},"madhupur":{"cc":"IN","lat":24.27,"lng":86.64,"pop":55238},"madhubani":{"cc":"IN","lat":26.35,"lng":86.07,"pop":75736},"madhepura":{"cc":"IN","lat":25.92,"lng":86.79,"pop":54472},"madgaon":{"cc":"IN","lat":15.28,"lng":73.96,"pop":87650},"madanapalle":{"cc":"IN","lat":13.55,"lng":78.5,"pop":180180},"machilpatnam":{"cc":"IN","lat":16.19,"lng":81.14,"pop":192827},"machilipatnam":{"cc":"IN","lat":16.19,"lng":81.14,"pop":192827},"macherla":{"cc":"IN","lat":16.48,"lng":79.44,"pop":57290},"mcherla":{"cc":"IN","lat":16.48,"lng":79.44,"pop":57290},"lunglei":{"cc":"IN","lat":22.89,"lng":92.74,"pop":57011},"ludhiana":{"cc":"IN","lat":30.91,"lng":75.85,"pop":1618879},"lucknow":{"cc":"IN","lat":26.84,"lng":80.92,"pop":2472011},"luckeesarai":{"cc":"IN","lat":25.18,"lng":86.09,"pop":99979},"loni":{"cc":"IN","lat":28.75,"lng":77.29,"pop":516082},"lonavla":{"cc":"IN","lat":18.75,"lng":73.41,"pop":58562},"lohardaga":{"cc":"IN","lat":23.43,"lng":84.68,"pop":57411},"lohrdag":{"cc":"IN","lat":23.43,"lng":84.68,"pop":57411},"latur":{"cc":"IN","lat":18.4,"lng":76.57,"pop":382940},"lalitpur":{"cc":"IN","lat":24.69,"lng":78.42,"pop":126475},"lakhimpur":{"cc":"IN","lat":27.95,"lng":80.78,"pop":140223},"lakhmpur":{"cc":"IN","lat":27.95,"lng":80.78,"pop":140223},"lharpur":{"cc":"IN","lat":27.71,"lng":80.9,"pop":55911},"laharpur":{"cc":"IN","lat":27.71,"lng":80.9,"pop":55911},"ldnn":{"cc":"IN","lat":27.65,"lng":74.4,"pop":65575},"ladnun":{"cc":"IN","lat":27.65,"lng":74.4,"pop":65575},"laxmangarh":{"cc":"IN","lat":27.82,"lng":75.03,"pop":53392},"kurnool":{"cc":"IN","lat":15.83,"lng":78.04,"pop":460184},"kunnamkulam":{"cc":"IN","lat":10.65,"lng":76.07,"pop":63903},"kundla":{"cc":"IN","lat":21.34,"lng":71.31,"pop":76809},"kumbakonam":{"cc":"IN","lat":10.96,"lng":79.39,"pop":167155},"kulti":{"cc":"IN","lat":23.73,"lng":86.84,"pop":305405},"kukatpally":{"cc":"IN","lat":17.48,"lng":78.41,"pop":341709},"kuchman":{"cc":"IN","lat":27.15,"lng":74.86,"pop":61969},"kuchaman":{"cc":"IN","lat":27.15,"lng":74.86,"pop":61969},"krishnanagar":{"cc":"IN","lat":23.41,"lng":88.49,"pop":145926},"krishnagiri":{"cc":"IN","lat":12.52,"lng":78.21,"pop":71323},"kozhikode":{"cc":"IN","lat":11.25,"lng":75.78,"pop":550440},"kovilpatti":{"cc":"IN","lat":9.17,"lng":77.87,"pop":95057},"kottayam":{"cc":"IN","lat":9.59,"lng":76.52,"pop":55374},"kottagudem":{"cc":"IN","lat":17.55,"lng":80.62,"pop":79819},"kottagdem":{"cc":"IN","lat":17.55,"lng":80.62,"pop":79819},"kot kapura":{"cc":"IN","lat":30.58,"lng":74.83,"pop":91979},"kot kapra":{"cc":"IN","lat":30.58,"lng":74.83,"pop":91979},"kotharia":{"cc":"IN","lat":22.23,"lng":70.82,"pop":53794},"kota":{"cc":"IN","lat":25.18,"lng":75.84,"pop":1001694},"kosi":{"cc":"IN","lat":27.79,"lng":77.44,"pop":52492},"koratla":{"cc":"IN","lat":18.82,"lng":78.71,"pop":66504},"koppal":{"cc":"IN","lat":15.35,"lng":76.15,"pop":70698},"kopargaon":{"cc":"IN","lat":19.88,"lng":74.48,"pop":65273},"konnagar":{"cc":"IN","lat":22.71,"lng":88.34,"pop":76082},"konch":{"cc":"IN","lat":25.99,"lng":79.15,"pop":52773},"kollegl":{"cc":"IN","lat":12.15,"lng":77.11,"pop":57149},"kollegal":{"cc":"IN","lat":12.15,"lng":77.11,"pop":57149},"kolhapur":{"cc":"IN","lat":16.7,"lng":74.23,"pop":549236},"kolhpur":{"cc":"IN","lat":16.7,"lng":74.23,"pop":549236},"kolr":{"cc":"IN","lat":13.14,"lng":78.13,"pop":138462},"kolar":{"cc":"IN","lat":13.14,"lng":78.13,"pop":138462},"kohima":{"cc":"IN","lat":25.67,"lng":94.11,"pop":99039},"kodungallur":{"cc":"IN","lat":10.23,"lng":76.2,"pop":60190},"kodungallr":{"cc":"IN","lat":10.23,"lng":76.2,"pop":60190},"kodar":{"cc":"IN","lat":17.0,"lng":79.97,"pop":64234},"kodr":{"cc":"IN","lat":17.0,"lng":79.97,"pop":64234},"koch bihr":{"cc":"IN","lat":26.33,"lng":89.45,"pop":78737},"koch bihar":{"cc":"IN","lat":26.33,"lng":89.45,"pop":78737},"kishangarh":{"cc":"IN","lat":26.59,"lng":74.85,"pop":154886},"kishanganj":{"cc":"IN","lat":26.1,"lng":87.96,"pop":105782},"kiratpur":{"cc":"IN","lat":29.51,"lng":78.21,"pop":60223},"kratpur":{"cc":"IN","lat":29.51,"lng":78.21,"pop":60223},"khurja":{"cc":"IN","lat":28.25,"lng":77.86,"pop":105909},"khurai":{"cc":"IN","lat":24.04,"lng":78.33,"pop":51108},"khopoli":{"cc":"IN","lat":18.79,"lng":73.35,"pop":71141},"khatauli":{"cc":"IN","lat":29.28,"lng":77.73,"pop":64731},"khargone":{"cc":"IN","lat":21.82,"lng":75.61,"pop":116150},"khardah":{"cc":"IN","lat":22.72,"lng":88.38,"pop":128346},"kharar":{"cc":"IN","lat":30.75,"lng":76.65,"pop":74460},"kharakvasla":{"cc":"IN","lat":18.44,"lng":73.78,"pop":78684},"kharagpur":{"cc":"IN","lat":22.34,"lng":87.33,"pop":219665},"khanna":{"cc":"IN","lat":30.71,"lng":76.22,"pop":128137},"khandwa":{"cc":"IN","lat":21.82,"lng":76.35,"pop":200738},"khammam":{"cc":"IN","lat":17.25,"lng":80.14,"pop":196283},"khamgaon":{"cc":"IN","lat":20.71,"lng":76.57,"pop":94604},"khmgaon":{"cc":"IN","lat":20.71,"lng":76.57,"pop":94604},"khambht":{"cc":"IN","lat":22.32,"lng":72.62,"pop":99164},"khambhat":{"cc":"IN","lat":22.32,"lng":72.62,"pop":99164},"khagaul":{"cc":"IN","lat":25.58,"lng":85.05,"pop":51577},"khadki":{"cc":"IN","lat":18.56,"lng":73.85,"pop":75654},"keshod":{"cc":"IN","lat":21.3,"lng":70.25,"pop":76193},"keonjhargarh":{"cc":"IN","lat":21.63,"lng":85.6,"pop":60590},"kayamkulam":{"cc":"IN","lat":9.18,"lng":76.5,"pop":68634},"kvali":{"cc":"IN","lat":14.92,"lng":79.99,"pop":90099},"kavali":{"cc":"IN","lat":14.92,"lng":79.99,"pop":90099},"ktrs":{"cc":"IN","lat":23.8,"lng":86.3,"pop":57349},"katras":{"cc":"IN","lat":23.8,"lng":86.3,"pop":57349},"ktoya":{"cc":"IN","lat":23.65,"lng":88.13,"pop":78408},"katoya":{"cc":"IN","lat":23.65,"lng":88.13,"pop":78408},"katihar":{"cc":"IN","lat":25.54,"lng":87.57,"pop":240838},"kathua":{"cc":"IN","lat":32.37,"lng":75.53,"pop":59866},"kasibugga":{"cc":"IN","lat":18.76,"lng":84.42,"pop":57507},"ksbugga":{"cc":"IN","lat":18.76,"lng":84.42,"pop":57507},"kashipur":{"cc":"IN","lat":29.21,"lng":78.96,"pop":103138},"ksganj":{"cc":"IN","lat":27.81,"lng":78.65,"pop":99462},"kasganj":{"cc":"IN","lat":27.81,"lng":78.65,"pop":99462},"ksaragod":{"cc":"IN","lat":12.5,"lng":74.99,"pop":54172},"kasaragod":{"cc":"IN","lat":12.5,"lng":74.99,"pop":54172},"karwar":{"cc":"IN","lat":14.81,"lng":74.13,"pop":77139},"karur":{"cc":"IN","lat":10.96,"lng":78.08,"pop":234191},"karol bgh":{"cc":"IN","lat":28.65,"lng":77.19,"pop":505241},"karol bagh":{"cc":"IN","lat":28.65,"lng":77.19,"pop":505241},"karnal":{"cc":"IN","lat":29.69,"lng":76.98,"pop":302140},"karnl":{"cc":"IN","lat":29.69,"lng":76.98,"pop":302140},"karmnagar":{"cc":"IN","lat":18.44,"lng":79.13,"pop":289821},"karimnagar":{"cc":"IN","lat":18.44,"lng":79.13,"pop":289821},"karimganj":{"cc":"IN","lat":24.87,"lng":92.36,"pop":56854},"karmganj":{"cc":"IN","lat":24.87,"lng":92.36,"pop":56854},"karauli":{"cc":"IN","lat":26.5,"lng":77.03,"pop":82960},"karanja":{"cc":"IN","lat":20.48,"lng":77.49,"pop":67907},"kranja":{"cc":"IN","lat":20.48,"lng":77.49,"pop":67907},"karaikkudi":{"cc":"IN","lat":10.07,"lng":78.77,"pop":181851},"kraikkudi":{"cc":"IN","lat":10.07,"lng":78.77,"pop":181851},"karaikal":{"cc":"IN","lat":10.92,"lng":79.83,"pop":86838},"kraikl":{"cc":"IN","lat":10.92,"lng":79.83,"pop":86838},"karad":{"cc":"IN","lat":17.29,"lng":74.18,"pop":55663},"kard":{"cc":"IN","lat":17.29,"lng":74.18,"pop":55663},"kapurthala town":{"cc":"IN","lat":31.38,"lng":75.38,"pop":98916},"kanpur":{"cc":"IN","lat":26.47,"lng":80.35,"pop":2823249},"kannauj":{"cc":"IN","lat":27.06,"lng":79.92,"pop":76714},"kanhangad":{"cc":"IN","lat":12.31,"lng":75.11,"pop":125564},"kandukur":{"cc":"IN","lat":15.22,"lng":79.9,"pop":57246},"kandukr":{"cc":"IN","lat":15.22,"lng":79.9,"pop":57246},"kndi":{"cc":"IN","lat":23.96,"lng":88.04,"pop":54848},"kanchipuram":{"cc":"IN","lat":12.84,"lng":79.7,"pop":221715},"kanakapura":{"cc":"IN","lat":12.55,"lng":77.42,"pop":54014},"kamthi":{"cc":"IN","lat":21.22,"lng":79.2,"pop":86793},"kmthi":{"cc":"IN","lat":21.22,"lng":79.2,"pop":86793},"cumbum":{"cc":"IN","lat":9.74,"lng":77.28,"pop":68090},"kmrhti":{"cc":"IN","lat":22.67,"lng":88.37,"pop":332965},"kamarhati":{"cc":"IN","lat":22.67,"lng":88.37,"pop":332965},"kamareddi":{"cc":"IN","lat":18.32,"lng":78.34,"pop":80315},"kmreddi":{"cc":"IN","lat":18.32,"lng":78.34,"pop":80315},"kalyani":{"cc":"IN","lat":22.98,"lng":88.43,"pop":93184},"kalyn":{"cc":"IN","lat":19.24,"lng":73.14,"pop":1262255},"kalyan":{"cc":"IN","lat":19.24,"lng":73.14,"pop":1262255},"kalol":{"cc":"IN","lat":23.25,"lng":72.5,"pop":134426},"kalna":{"cc":"IN","lat":23.22,"lng":88.36,"pop":53964},"klna":{"cc":"IN","lat":23.22,"lng":88.36,"pop":53964},"kliyganj":{"cc":"IN","lat":25.63,"lng":88.33,"pop":51748},"kaliyaganj":{"cc":"IN","lat":25.63,"lng":88.33,"pop":51748},"kkinda":{"cc":"IN","lat":16.96,"lng":82.24,"pop":384182},"kakinada":{"cc":"IN","lat":16.96,"lng":82.24,"pop":384182},"kaithal":{"cc":"IN","lat":29.8,"lng":76.4,"pop":144915},"kairna":{"cc":"IN","lat":29.4,"lng":77.21,"pop":80432},"kairana":{"cc":"IN","lat":29.4,"lng":77.21,"pop":80432},"kadiri":{"cc":"IN","lat":14.11,"lng":78.16,"pop":89429},"kadayanallur":{"cc":"IN","lat":9.07,"lng":77.34,"pop":90364},"knchrpra":{"cc":"IN","lat":22.96,"lng":88.43,"pop":136954},"kanchrapara":{"cc":"IN","lat":22.96,"lng":88.43,"pop":136954},"jngadh":{"cc":"IN","lat":21.52,"lng":70.46,"pop":319462},"junagadh":{"cc":"IN","lat":21.52,"lng":70.46,"pop":319462},"jhumri telaiya":{"cc":"IN","lat":24.43,"lng":85.53,"pop":87867},"jalandhar":{"cc":"IN","lat":31.33,"lng":75.58,"pop":868929},"jorhat":{"cc":"IN","lat":26.76,"lng":94.2,"pop":126736},"jodhpur":{"cc":"IN","lat":26.27,"lng":73.01,"pop":1056191},"jnd":{"cc":"IN","lat":29.32,"lng":76.32,"pop":167592},"jind":{"cc":"IN","lat":29.32,"lng":76.32,"pop":167592},"jhunjhunn":{"cc":"IN","lat":28.13,"lng":75.4,"pop":118473},"jhunjhunun":{"cc":"IN","lat":28.13,"lng":75.4,"pop":118473},"jharsuguda":{"cc":"IN","lat":21.86,"lng":84.01,"pop":97730},"jharia":{"cc":"IN","lat":23.74,"lng":86.41,"pop":86938},"jhargram":{"cc":"IN","lat":22.45,"lng":86.99,"pop":57796},"jhrgrm":{"cc":"IN","lat":22.45,"lng":86.99,"pop":57796},"jhansi":{"cc":"IN","lat":25.46,"lng":78.58,"pop":412927},"jhnsi":{"cc":"IN","lat":25.46,"lng":78.58,"pop":412927},"jhlwr":{"cc":"IN","lat":24.6,"lng":76.16,"pop":66919},"jhalawar":{"cc":"IN","lat":24.6,"lng":76.16,"pop":66919},"jetpur":{"cc":"IN","lat":21.75,"lng":70.62,"pop":118302},"jeypore":{"cc":"IN","lat":18.86,"lng":82.57,"pop":84830},"jaunpur":{"cc":"IN","lat":25.75,"lng":82.69,"pop":169572},"jatani":{"cc":"IN","lat":20.16,"lng":85.71,"pop":63697},"jaora":{"cc":"IN","lat":23.64,"lng":75.13,"pop":74907},"jangipur":{"cc":"IN","lat":24.47,"lng":88.08,"pop":82548},"jangaon":{"cc":"IN","lat":17.73,"lng":79.15,"pop":52394},"jmuria":{"cc":"IN","lat":23.7,"lng":87.08,"pop":160242},"jamuria":{"cc":"IN","lat":23.7,"lng":87.08,"pop":160242},"jamui":{"cc":"IN","lat":24.93,"lng":86.23,"pop":87357},"jam":{"cc":"IN","lat":24.93,"lng":86.23,"pop":87357},"jamshedpur":{"cc":"IN","lat":22.8,"lng":86.19,"pop":1339438},"jamnagar":{"cc":"IN","lat":22.47,"lng":70.07,"pop":600943},"jammu":{"cc":"IN","lat":32.74,"lng":74.86,"pop":576198},"jamkhandi":{"cc":"IN","lat":16.5,"lng":75.29,"pop":68938},"jalpiguri":{"cc":"IN","lat":26.52,"lng":88.73,"pop":107832},"jalpaiguri":{"cc":"IN","lat":26.52,"lng":88.73,"pop":107832},"jalor":{"cc":"IN","lat":25.35,"lng":72.62,"pop":54081},"jalna":{"cc":"IN","lat":19.84,"lng":75.89,"pop":285577},"jlna":{"cc":"IN","lat":19.84,"lng":75.89,"pop":285577},"jalgaon":{"cc":"IN","lat":21.0,"lng":75.57,"pop":460228},"jlaun":{"cc":"IN","lat":26.15,"lng":79.34,"pop":55299},"jalaun":{"cc":"IN","lat":26.15,"lng":79.34,"pop":55299},"jaisalmer":{"cc":"IN","lat":26.92,"lng":70.9,"pop":67604},"jaipur":{"cc":"IN","lat":26.92,"lng":75.79,"pop":3046163},"jahangirabad":{"cc":"IN","lat":28.41,"lng":78.11,"pop":57363},"jahngrbd":{"cc":"IN","lat":28.41,"lng":78.11,"pop":57363},"jahanabad":{"cc":"IN","lat":25.21,"lng":84.99,"pop":103202},"jahnbd":{"cc":"IN","lat":25.21,"lng":84.99,"pop":103202},"jagtil":{"cc":"IN","lat":18.79,"lng":78.92,"pop":103930},"jagtial":{"cc":"IN","lat":18.79,"lng":78.92,"pop":103930},"jagraon":{"cc":"IN","lat":30.79,"lng":75.47,"pop":65305},"jagdalpur":{"cc":"IN","lat":19.08,"lng":82.02,"pop":125463},"jagadhri":{"cc":"IN","lat":30.17,"lng":77.3,"pop":124894},"jagdhri":{"cc":"IN","lat":30.17,"lng":77.3,"pop":124894},"jabalpur":{"cc":"IN","lat":23.17,"lng":79.95,"pop":1081677},"itrsi":{"cc":"IN","lat":22.61,"lng":77.76,"pop":100574},"itarsi":{"cc":"IN","lat":22.61,"lng":77.76,"pop":100574},"itanagar":{"cc":"IN","lat":27.09,"lng":93.61,"pop":59490},"islampur":{"cc":"IN","lat":26.27,"lng":88.19,"pop":55691},"islmpur":{"cc":"IN","lat":26.27,"lng":88.19,"pop":55691},"malda":{"cc":"IN","lat":25.0,"lng":88.15,"pop":170039},"indore":{"cc":"IN","lat":22.72,"lng":75.83,"pop":1994397},"imphal":{"cc":"IN","lat":24.81,"lng":93.94,"pop":277196},"ilkal":{"cc":"IN","lat":15.96,"lng":76.11,"pop":60242},"idappadi":{"cc":"IN","lat":11.59,"lng":77.84,"pop":54823},"ichalkaranji":{"cc":"IN","lat":16.69,"lng":74.46,"pop":287353},"hunsur":{"cc":"IN","lat":12.3,"lng":76.29,"pop":50865},"hunsr":{"cc":"IN","lat":12.3,"lng":76.29,"pop":50865},"hugli":{"cc":"IN","lat":22.91,"lng":88.4,"pop":177005},"hubballi":{"cc":"IN","lat":15.35,"lng":75.13,"pop":943788},"hosur":{"cc":"IN","lat":12.74,"lng":77.83,"pop":229528},"hosr":{"cc":"IN","lat":12.74,"lng":77.83,"pop":229528},"hosapete":{"cc":"IN","lat":15.27,"lng":76.39,"pop":206167},"hoskote":{"cc":"IN","lat":13.07,"lng":77.8,"pop":56980},"hoshirpur":{"cc":"IN","lat":31.54,"lng":75.91,"pop":168653},"hoshiarpur":{"cc":"IN","lat":31.54,"lng":75.91,"pop":168653},"narmadapuram":{"cc":"IN","lat":22.75,"lng":77.73,"pop":117988},"hodal":{"cc":"IN","lat":27.89,"lng":77.37,"pop":50143},"hisar":{"cc":"IN","lat":29.15,"lng":75.72,"pop":307024},"hiriyur":{"cc":"IN","lat":13.94,"lng":76.62,"pop":56416},"hiriyr":{"cc":"IN","lat":13.94,"lng":76.62,"pop":56416},"hingoli":{"cc":"IN","lat":19.71,"lng":77.14,"pop":85103},"hinganghat":{"cc":"IN","lat":20.55,"lng":78.84,"pop":101805},"hinganght":{"cc":"IN","lat":20.55,"lng":78.84,"pop":101805},"hindupur":{"cc":"IN","lat":13.83,"lng":77.49,"pop":151677},"hindaun":{"cc":"IN","lat":26.73,"lng":77.04,"pop":105452},"himatnagar":{"cc":"IN","lat":23.6,"lng":72.97,"pop":81137},"hilsa":{"cc":"IN","lat":25.32,"lng":85.28,"pop":51052},"hazribgh":{"cc":"IN","lat":23.99,"lng":85.36,"pop":153595},"hazaribagh":{"cc":"IN","lat":23.99,"lng":85.36,"pop":153595},"haveri":{"cc":"IN","lat":14.79,"lng":75.4,"pop":67102},"hveri":{"cc":"IN","lat":14.79,"lng":75.4,"pop":67102},"hathras":{"cc":"IN","lat":27.6,"lng":78.05,"pop":126882},"hthras":{"cc":"IN","lat":27.6,"lng":78.05,"pop":126882},"hassan":{"cc":"IN","lat":13.01,"lng":76.1,"pop":155006},"hasanpur":{"cc":"IN","lat":28.72,"lng":78.28,"pop":57481},"harihar":{"cc":"IN","lat":14.51,"lng":75.81,"pop":83219},"haridwar":{"cc":"IN","lat":29.95,"lng":78.16,"pop":186079},"hardo":{"cc":"IN","lat":27.39,"lng":80.13,"pop":122635},"hardoi":{"cc":"IN","lat":27.39,"lng":80.13,"pop":122635},"harda":{"cc":"IN","lat":22.34,"lng":77.1,"pop":74268},"hpur":{"cc":"IN","lat":28.73,"lng":77.78,"pop":242920},"hapur":{"cc":"IN","lat":28.73,"lng":77.78,"pop":242920},"howrah":{"cc":"IN","lat":22.58,"lng":88.32,"pop":1027672},"hanumngarh":{"cc":"IN","lat":29.58,"lng":74.33,"pop":155687},"hanumangarh":{"cc":"IN","lat":29.58,"lng":74.33,"pop":155687},"hansi":{"cc":"IN","lat":29.1,"lng":75.96,"pop":86770},"hnsi":{"cc":"IN","lat":29.1,"lng":75.96,"pop":86770},"hlol":{"cc":"IN","lat":22.5,"lng":73.47,"pop":64265},"halol":{"cc":"IN","lat":22.5,"lng":73.47,"pop":64265},"hlsahar":{"cc":"IN","lat":22.93,"lng":88.42,"pop":128172},"halisahar":{"cc":"IN","lat":22.93,"lng":88.42,"pop":128172},"haldwani":{"cc":"IN","lat":29.22,"lng":79.53,"pop":139497},"hajipur":{"cc":"IN","lat":25.69,"lng":85.21,"pop":147688},"hjpur":{"cc":"IN","lat":25.69,"lng":85.21,"pop":147688},"habra":{"cc":"IN","lat":22.84,"lng":88.66,"pop":139297},"hbra":{"cc":"IN","lat":22.84,"lng":88.66,"pop":139297},"gyanpur":{"cc":"IN","lat":25.33,"lng":82.47,"pop":200000},"gynpur":{"cc":"IN","lat":25.33,"lng":82.47,"pop":200000},"gwalior":{"cc":"IN","lat":26.23,"lng":78.17,"pop":1054420},"gurugram":{"cc":"IN","lat":28.46,"lng":77.03,"pop":886519},"gurdaspur":{"cc":"IN","lat":32.04,"lng":75.4,"pop":77928},"guntur":{"cc":"IN","lat":16.3,"lng":80.46,"pop":670073},"guntakal":{"cc":"IN","lat":15.17,"lng":77.36,"pop":126270},"guna":{"cc":"IN","lat":24.65,"lng":77.31,"pop":180935},"gumla":{"cc":"IN","lat":23.04,"lng":84.54,"pop":51264},"guml":{"cc":"IN","lat":23.04,"lng":84.54,"pop":51264},"kalaburagi":{"cc":"IN","lat":17.34,"lng":76.84,"pop":543147},"gdr":{"cc":"IN","lat":14.15,"lng":79.85,"pop":74851},"gudur":{"cc":"IN","lat":14.15,"lng":79.85,"pop":74851},"gudiyatham":{"cc":"IN","lat":12.95,"lng":78.87,"pop":93973},"gudivada":{"cc":"IN","lat":16.44,"lng":81.0,"pop":118167},"gudivda":{"cc":"IN","lat":16.44,"lng":81.0,"pop":118167},"goyerkta":{"cc":"IN","lat":26.7,"lng":89.03,"pop":66358},"goyerkata":{"cc":"IN","lat":26.7,"lng":89.03,"pop":66358},"gorakhpur":{"cc":"IN","lat":29.45,"lng":75.67,"pop":1324570},"gobichettipalayam":{"cc":"IN","lat":11.45,"lng":77.44,"pop":59523},"gondia":{"cc":"IN","lat":21.46,"lng":80.19,"pop":132813},"gondi":{"cc":"IN","lat":21.46,"lng":80.19,"pop":132813},"gondal":{"cc":"IN","lat":21.96,"lng":70.8,"pop":112197},"gond city":{"cc":"IN","lat":27.13,"lng":81.95,"pop":133583},"gonda city":{"cc":"IN","lat":27.13,"lng":81.95,"pop":133583},"gola gokarannth":{"cc":"IN","lat":28.08,"lng":80.47,"pop":58986},"gola gokarannath":{"cc":"IN","lat":28.08,"lng":80.47,"pop":58986},"gokak":{"cc":"IN","lat":16.17,"lng":74.82,"pop":79121},"gohna":{"cc":"IN","lat":29.14,"lng":76.7,"pop":65708},"gohana":{"cc":"IN","lat":29.14,"lng":76.7,"pop":65708},"gohad":{"cc":"IN","lat":26.43,"lng":78.44,"pop":58939},"godhra":{"cc":"IN","lat":22.78,"lng":73.61,"pop":143644},"golpra":{"cc":"IN","lat":26.18,"lng":90.63,"pop":53430},"goalpara":{"cc":"IN","lat":26.18,"lng":90.63,"pop":53430},"giridih":{"cc":"IN","lat":24.19,"lng":86.31,"pop":114533},"ghazipur":{"cc":"IN","lat":25.58,"lng":83.59,"pop":103095},"ghazpur":{"cc":"IN","lat":25.58,"lng":83.59,"pop":103095},"ghaziabad":{"cc":"IN","lat":28.67,"lng":77.44,"pop":1199191},"ghzibd":{"cc":"IN","lat":28.67,"lng":77.44,"pop":1199191},"ghtl":{"cc":"IN","lat":22.66,"lng":87.73,"pop":54658},"ghatal":{"cc":"IN","lat":22.66,"lng":87.73,"pop":54658},"guwahati":{"cc":"IN","lat":26.18,"lng":91.75,"pop":962334},"garhchiroli":{"cc":"IN","lat":20.18,"lng":80.01,"pop":54152},"gangtok":{"cc":"IN","lat":27.33,"lng":88.61,"pop":100286},"gangoh":{"cc":"IN","lat":29.78,"lng":77.26,"pop":59519},"gangavati":{"cc":"IN","lat":15.43,"lng":76.53,"pop":114642},"gangarampur":{"cc":"IN","lat":25.4,"lng":88.53,"pop":65316},"gangrmpur":{"cc":"IN","lat":25.4,"lng":88.53,"pop":65316},"gangpur":{"cc":"IN","lat":26.47,"lng":76.72,"pop":120115},"gangapur":{"cc":"IN","lat":26.47,"lng":76.72,"pop":120115},"sri ganganagar":{"cc":"IN","lat":29.92,"lng":73.87,"pop":237780},"gandhinagar":{"cc":"IN","lat":23.22,"lng":72.68,"pop":292797},"gandhidham":{"cc":"IN","lat":23.08,"lng":70.13,"pop":247992},"gndhdhm":{"cc":"IN","lat":23.08,"lng":70.13,"pop":247992},"gajraula":{"cc":"IN","lat":28.85,"lng":78.24,"pop":50380},"gadwal":{"cc":"IN","lat":16.24,"lng":77.8,"pop":63177},"gadwl":{"cc":"IN","lat":16.24,"lng":77.8,"pop":63177},"gadag":{"cc":"IN","lat":15.43,"lng":75.63,"pop":172612},"forbesganj":{"cc":"IN","lat":26.3,"lng":87.27,"pop":50475},"firozpur":{"cc":"IN","lat":30.93,"lng":74.61,"pop":110313},"frozbd":{"cc":"IN","lat":27.15,"lng":78.4,"pop":306409},"firozabad":{"cc":"IN","lat":27.15,"lng":78.4,"pop":306409},"fazilka":{"cc":"IN","lat":30.4,"lng":74.03,"pop":76492},"fatwa":{"cc":"IN","lat":25.51,"lng":85.31,"pop":50961},"fatehpur":{"cc":"IN","lat":25.93,"lng":80.81,"pop":166480},"fatehbd":{"cc":"IN","lat":29.52,"lng":75.46,"pop":70777},"fatehabad":{"cc":"IN","lat":29.52,"lng":75.46,"pop":70777},"farrukhbd":{"cc":"IN","lat":27.39,"lng":79.58,"pop":241152},"farrukhabad":{"cc":"IN","lat":27.39,"lng":79.58,"pop":241152},"faridkot":{"cc":"IN","lat":30.67,"lng":74.76,"pop":87695},"fardkot":{"cc":"IN","lat":30.67,"lng":74.76,"pop":87695},"faridabad":{"cc":"IN","lat":28.41,"lng":77.31,"pop":1414050},"fyzabad":{"cc":"IN","lat":26.78,"lng":82.15,"pop":153047},"fyzbd":{"cc":"IN","lat":26.78,"lng":82.15,"pop":153047},"etawah":{"cc":"IN","lat":26.78,"lng":79.02,"pop":257448},"etwah":{"cc":"IN","lat":26.78,"lng":79.02,"pop":257448},"etah":{"cc":"IN","lat":27.56,"lng":78.66,"pop":131023},"erode":{"cc":"IN","lat":11.34,"lng":77.73,"pop":521891},"emmiganur":{"cc":"IN","lat":15.77,"lng":77.48,"pop":95149},"emmiganr":{"cc":"IN","lat":15.77,"lng":77.48,"pop":95149},"eluru":{"cc":"IN","lat":16.71,"lng":81.1,"pop":218020},"durgapur":{"cc":"IN","lat":23.52,"lng":87.31,"pop":518872},"durg":{"cc":"IN","lat":21.19,"lng":81.28,"pop":268806},"dumraon":{"cc":"IN","lat":25.55,"lng":84.15,"pop":53618},"dam dam":{"cc":"IN","lat":22.63,"lng":88.42,"pop":122719},"dombivali":{"cc":"IN","lat":19.22,"lng":73.08,"pop":1247327},"doddaballapura":{"cc":"IN","lat":13.29,"lng":77.54,"pop":93105},"deesa":{"cc":"IN","lat":24.26,"lng":72.18,"pop":111160},"diphu":{"cc":"IN","lat":25.84,"lng":93.43,"pop":61797},"dindigul":{"cc":"IN","lat":10.37,"lng":77.98,"pop":292512},"dimapur":{"cc":"IN","lat":25.91,"lng":93.72,"pop":135860},"dimpur":{"cc":"IN","lat":25.91,"lng":93.72,"pop":135860},"deglur":{"cc":"IN","lat":18.55,"lng":77.58,"pop":54493},"ddwna":{"cc":"IN","lat":27.4,"lng":74.58,"pop":53749},"didwana":{"cc":"IN","lat":27.4,"lng":74.58,"pop":53749},"dibrugarh":{"cc":"IN","lat":27.48,"lng":94.91,"pop":145488},"dhri":{"cc":"IN","lat":30.37,"lng":75.87,"pop":55225},"dhuri":{"cc":"IN","lat":30.37,"lng":75.87,"pop":55225},"dhulian":{"cc":"IN","lat":24.68,"lng":87.95,"pop":77070},"dhulin":{"cc":"IN","lat":24.68,"lng":87.95,"pop":77070},"dhule":{"cc":"IN","lat":20.9,"lng":74.78,"pop":375559},"dhubri":{"cc":"IN","lat":26.02,"lng":89.99,"pop":63388},"dhrangadhra":{"cc":"IN","lat":22.99,"lng":71.47,"pop":75578},"dhrngadhra":{"cc":"IN","lat":22.99,"lng":71.47,"pop":75578},"dhoraji":{"cc":"IN","lat":21.73,"lng":70.45,"pop":84545},"dhone":{"cc":"IN","lat":15.4,"lng":77.87,"pop":59272},"dholka":{"cc":"IN","lat":22.73,"lng":72.44,"pop":80945},"dhenknl":{"cc":"IN","lat":20.66,"lng":85.6,"pop":67414},"dhenkanal":{"cc":"IN","lat":20.66,"lng":85.6,"pop":67414},"dhaulpur":{"cc":"IN","lat":26.69,"lng":77.88,"pop":133075},"dharmavaram":{"cc":"IN","lat":14.41,"lng":77.72,"pop":121874},"dharmapuri":{"cc":"IN","lat":12.13,"lng":78.16,"pop":68619},"dharavi":{"cc":"IN","lat":19.05,"lng":72.87,"pop":700000},"dhrvi":{"cc":"IN","lat":19.05,"lng":72.87,"pop":700000},"dharapuram":{"cc":"IN","lat":10.74,"lng":77.53,"pop":72291},"dhar":{"cc":"IN","lat":22.59,"lng":75.3,"pop":93917},"dhr":{"cc":"IN","lat":22.59,"lng":75.3,"pop":93917},"dhanbad":{"cc":"IN","lat":23.8,"lng":86.43,"pop":1196214},"dhamtari":{"cc":"IN","lat":20.71,"lng":81.55,"pop":101677},"dewas":{"cc":"IN","lat":22.97,"lng":76.06,"pop":289550},"devakottai":{"cc":"IN","lat":9.95,"lng":78.82,"pop":51865},"deoria":{"cc":"IN","lat":26.5,"lng":83.78,"pop":129570},"deolli":{"cc":"IN","lat":19.94,"lng":73.83,"pop":54027},"deolali":{"cc":"IN","lat":19.94,"lng":73.83,"pop":54027},"deoghar":{"cc":"IN","lat":24.49,"lng":86.7,"pop":203123},"deoband":{"cc":"IN","lat":29.7,"lng":77.68,"pop":88171},"delhi cantonment":{"cc":"IN","lat":28.6,"lng":77.13,"pop":110351},"delhi":{"cc":"IN","lat":28.65,"lng":77.23,"pop":11034555},"dehradun":{"cc":"IN","lat":30.32,"lng":78.03,"pop":522081},"davangere":{"cc":"IN","lat":14.47,"lng":75.93,"pop":435128},"dausa":{"cc":"IN","lat":26.89,"lng":76.34,"pop":85960},"daudnagar":{"cc":"IN","lat":25.03,"lng":84.4,"pop":52364},"datia":{"cc":"IN","lat":25.67,"lng":78.46,"pop":100284},"drjiling":{"cc":"IN","lat":27.03,"lng":88.27,"pop":123797},"darjiling":{"cc":"IN","lat":27.03,"lng":88.27,"pop":123797},"darbhanga":{"cc":"IN","lat":26.15,"lng":85.9,"pop":296039},"dandeli":{"cc":"IN","lat":15.27,"lng":74.62,"pop":52295},"dinapore":{"cc":"IN","lat":25.64,"lng":85.05,"pop":152940},"damoh":{"cc":"IN","lat":23.83,"lng":79.44,"pop":139561},"medininagar":{"cc":"IN","lat":24.04,"lng":84.07,"pop":78396},"dohad":{"cc":"IN","lat":22.83,"lng":74.26,"pop":118846},"dahanu":{"cc":"IN","lat":19.97,"lng":72.71,"pop":50287},"dhnu":{"cc":"IN","lat":19.97,"lng":72.71,"pop":50287},"dadri":{"cc":"IN","lat":28.55,"lng":77.55,"pop":70609},"ddri":{"cc":"IN","lat":28.55,"lng":77.55,"pop":70609},"dabwli":{"cc":"IN","lat":29.95,"lng":74.74,"pop":62113},"dabwali":{"cc":"IN","lat":29.95,"lng":74.74,"pop":62113},"dabra":{"cc":"IN","lat":25.89,"lng":78.33,"pop":61277},"dabhoi":{"cc":"IN","lat":22.18,"lng":73.43,"pop":56253},"dabhel":{"cc":"IN","lat":20.41,"lng":72.88,"pop":52578},"cuttack":{"cc":"IN","lat":20.46,"lng":85.88,"pop":610189},"kadapa":{"cc":"IN","lat":14.48,"lng":78.82,"pop":344893},"cuddalore":{"cc":"IN","lat":11.76,"lng":79.77,"pop":173636},"coimbatore":{"cc":"IN","lat":11.01,"lng":76.97,"pop":2136916},"churu":{"cc":"IN","lat":28.3,"lng":74.97,"pop":120157},"chru":{"cc":"IN","lat":28.3,"lng":74.97,"pop":120157},"chopda":{"cc":"IN","lat":21.25,"lng":75.3,"pop":72783},"chittoor":{"cc":"IN","lat":13.21,"lng":79.1,"pop":160722},"chittorgarh":{"cc":"IN","lat":24.89,"lng":74.62,"pop":116406},"chitradurga":{"cc":"IN","lat":14.22,"lng":76.4,"pop":145853},"chirala":{"cc":"IN","lat":15.82,"lng":80.35,"pop":92942},"chrla":{"cc":"IN","lat":15.82,"lng":80.35,"pop":92942},"chipln":{"cc":"IN","lat":17.53,"lng":73.51,"pop":55139},"chiplun":{"cc":"IN","lat":17.53,"lng":73.51,"pop":55139},"chintamani":{"cc":"IN","lat":13.4,"lng":78.05,"pop":76068},"chilakalurupet":{"cc":"IN","lat":16.09,"lng":80.17,"pop":101398},"chilakalrupet":{"cc":"IN","lat":16.09,"lng":80.17,"pop":101398},"chikmagalur":{"cc":"IN","lat":13.32,"lng":75.77,"pop":121484},"chikmagalr":{"cc":"IN","lat":13.32,"lng":75.77,"pop":121484},"chikhli":{"cc":"IN","lat":20.35,"lng":76.26,"pop":57889},"chik ballpur":{"cc":"IN","lat":13.44,"lng":77.73,"pop":63652},"chik ballapur":{"cc":"IN","lat":13.44,"lng":77.73,"pop":63652},"chidambaram":{"cc":"IN","lat":11.4,"lng":79.69,"pop":62153},"chhindwara":{"cc":"IN","lat":22.06,"lng":78.94,"pop":175052},"chhindwra":{"cc":"IN","lat":22.06,"lng":78.94,"pop":175052},"chhibramau":{"cc":"IN","lat":27.15,"lng":79.5,"pop":57071},"chhibrmau":{"cc":"IN","lat":27.15,"lng":79.5,"pop":57071},"chhatarpur":{"cc":"IN","lat":24.92,"lng":79.59,"pop":142128},"chpra":{"cc":"IN","lat":25.78,"lng":84.75,"pop":202352},"chapra":{"cc":"IN","lat":25.78,"lng":84.75,"pop":202352},"chengalpattu":{"cc":"IN","lat":12.69,"lng":79.98,"pop":65689},"chaumu":{"cc":"IN","lat":27.17,"lng":75.72,"pop":64417},"chas":{"cc":"IN","lat":23.64,"lng":86.17,"pop":141640},"charkhi dadri":{"cc":"IN","lat":28.59,"lng":76.27,"pop":56337},"charkhi ddri":{"cc":"IN","lat":28.59,"lng":76.27,"pop":56337},"channapatna":{"cc":"IN","lat":12.65,"lng":77.21,"pop":71942},"changanacheri":{"cc":"IN","lat":9.44,"lng":76.54,"pop":51430},"changancheri":{"cc":"IN","lat":9.44,"lng":76.54,"pop":51430},"chanda":{"cc":"IN","lat":19.95,"lng":79.3,"pop":328351},"chnda":{"cc":"IN","lat":19.95,"lng":79.3,"pop":328351},"chandigarh":{"cc":"IN","lat":30.74,"lng":76.79,"pop":970602},"chanduasi":{"cc":"IN","lat":28.45,"lng":78.78,"pop":112635},"chandannagar":{"cc":"IN","lat":22.86,"lng":88.37,"pop":180623},"chamrajnagar":{"cc":"IN","lat":11.92,"lng":76.94,"pop":69875},"challakere":{"cc":"IN","lat":14.32,"lng":76.65,"pop":55194},"chalisgaon":{"cc":"IN","lat":20.46,"lng":75.02,"pop":97551},"chakradharpur":{"cc":"IN","lat":22.68,"lng":85.63,"pop":56531},"chbsa":{"cc":"IN","lat":22.55,"lng":85.8,"pop":69565},"chaibasa":{"cc":"IN","lat":22.55,"lng":85.8,"pop":69565},"kannur":{"cc":"IN","lat":11.87,"lng":75.36,"pop":62836},"kolkata":{"cc":"IN","lat":22.56,"lng":88.36,"pop":4631392},"buxar":{"cc":"IN","lat":25.58,"lng":83.98,"pop":102861},"burhanpur":{"cc":"IN","lat":21.31,"lng":76.23,"pop":210886},"burhnpur":{"cc":"IN","lat":21.31,"lng":76.23,"pop":210886},"bundi":{"cc":"IN","lat":25.44,"lng":75.64,"pop":104919},"bndi":{"cc":"IN","lat":25.44,"lng":75.64,"pop":104919},"buldana":{"cc":"IN","lat":20.53,"lng":76.18,"pop":67431},"buldna":{"cc":"IN","lat":20.53,"lng":76.18,"pop":67431},"bulandshahr":{"cc":"IN","lat":28.4,"lng":77.86,"pop":198612},"budaun":{"cc":"IN","lat":28.04,"lng":79.13,"pop":161555},"brajarajnagar":{"cc":"IN","lat":21.82,"lng":83.92,"pop":80403},"brahmapur":{"cc":"IN","lat":19.31,"lng":84.79,"pop":356598},"botad":{"cc":"IN","lat":22.17,"lng":71.67,"pop":130327},"borsad":{"cc":"IN","lat":22.41,"lng":72.9,"pop":63377},"borivli":{"cc":"IN","lat":19.23,"lng":72.86,"pop":609617},"bongaigaon":{"cc":"IN","lat":26.48,"lng":90.56,"pop":67322},"mumbai":{"cc":"IN","lat":19.07,"lng":72.88,"pop":12691836},"bolpur":{"cc":"IN","lat":23.66,"lng":87.7,"pop":70998},"bokaro":{"cc":"IN","lat":23.67,"lng":86.15,"pop":564319},"bokro":{"cc":"IN","lat":23.67,"lng":86.15,"pop":564319},"bodinyakkanr":{"cc":"IN","lat":10.01,"lng":77.35,"pop":75680},"bodinayakkanur":{"cc":"IN","lat":10.01,"lng":77.35,"pop":75680},"bodhan":{"cc":"IN","lat":18.66,"lng":77.89,"pop":77573},"bobbili":{"cc":"IN","lat":18.57,"lng":83.36,"pop":56819},"biswan":{"cc":"IN","lat":27.5,"lng":81.0,"pop":52516},"biswn":{"cc":"IN","lat":27.5,"lng":81.0,"pop":52516},"bishnupur":{"cc":"IN","lat":23.07,"lng":87.32,"pop":64041},"bsalpur":{"cc":"IN","lat":28.29,"lng":79.8,"pop":68355},"bisalpur":{"cc":"IN","lat":28.29,"lng":79.8,"pop":68355},"beed":{"cc":"IN","lat":18.99,"lng":75.76,"pop":146709},"etawa":{"cc":"IN","lat":24.18,"lng":78.2,"pop":55185},"etwa":{"cc":"IN","lat":24.18,"lng":78.2,"pop":55185},"bilimora":{"cc":"IN","lat":20.77,"lng":72.96,"pop":510879},"bilaspur":{"cc":"IN","lat":22.08,"lng":82.16,"pop":365579},"bilspur":{"cc":"IN","lat":22.08,"lng":82.16,"pop":365579},"bikaner":{"cc":"IN","lat":28.02,"lng":73.31,"pop":644406},"bijnor":{"cc":"IN","lat":29.37,"lng":78.14,"pop":84593},"vijayapura":{"cc":"IN","lat":16.82,"lng":75.72,"pop":327427},"bihar sharif":{"cc":"IN","lat":25.2,"lng":85.52,"pop":297268},"bihr sharf":{"cc":"IN","lat":25.2,"lng":85.52,"pop":297268},"bidar":{"cc":"IN","lat":17.91,"lng":77.52,"pop":216020},"bhusawal":{"cc":"IN","lat":21.04,"lng":75.79,"pop":187421},"bhuj":{"cc":"IN","lat":23.25,"lng":69.67,"pop":148834},"bhubaneswar":{"cc":"IN","lat":20.27,"lng":85.83,"pop":885363},"bhopal":{"cc":"IN","lat":23.25,"lng":77.4,"pop":1798218},"bhongr":{"cc":"IN","lat":17.52,"lng":78.89,"pop":53339},"bhongir":{"cc":"IN","lat":17.52,"lng":78.89,"pop":53339},"bhiwni":{"cc":"IN","lat":28.79,"lng":76.14,"pop":196057},"bhiwani":{"cc":"IN","lat":28.79,"lng":76.14,"pop":196057},"bhiwandi":{"cc":"IN","lat":19.3,"lng":73.06,"pop":874032},"bhind":{"cc":"IN","lat":26.57,"lng":78.79,"pop":197585},"bhimunipatnam":{"cc":"IN","lat":17.89,"lng":83.45,"pop":55082},"bhmunipatnam":{"cc":"IN","lat":17.89,"lng":83.45,"pop":55082},"bhimavaram":{"cc":"IN","lat":16.54,"lng":81.52,"pop":146961},"bhilwara":{"cc":"IN","lat":25.35,"lng":74.64,"pop":359483},"bhilai":{"cc":"IN","lat":21.21,"lng":81.43,"pop":627734},"bhetia":{"cc":"IN","lat":22.79,"lng":86.14,"pop":174355},"bhayandar":{"cc":"IN","lat":19.3,"lng":72.85,"pop":809378},"bhawanipatna":{"cc":"IN","lat":19.91,"lng":83.17,"pop":69045},"bhawnipatna":{"cc":"IN","lat":19.91,"lng":83.17,"pop":69045},"bhavnagar":{"cc":"IN","lat":21.76,"lng":72.15,"pop":605882},"bhtpra":{"cc":"IN","lat":22.87,"lng":88.4,"pop":483129},"bhatpara":{"cc":"IN","lat":22.87,"lng":88.4,"pop":483129},"bathinda":{"cc":"IN","lat":30.21,"lng":74.94,"pop":285788},"bhatapara":{"cc":"IN","lat":21.73,"lng":81.95,"pop":57537},"bharch":{"cc":"IN","lat":21.69,"lng":72.98,"pop":169007},"bharuch":{"cc":"IN","lat":21.69,"lng":72.98,"pop":169007},"bhandra":{"cc":"IN","lat":21.17,"lng":79.65,"pop":91845},"bhandara":{"cc":"IN","lat":21.17,"lng":79.65,"pop":91845},"bhagalpur":{"cc":"IN","lat":25.24,"lng":86.97,"pop":400146},"bhgalpur":{"cc":"IN","lat":25.24,"lng":86.97,"pop":400146},"bhadreswar":{"cc":"IN","lat":22.82,"lng":88.34,"pop":121662},"bhadravati":{"cc":"IN","lat":13.85,"lng":75.71,"pop":163903},"bhadrvati":{"cc":"IN","lat":13.85,"lng":75.71,"pop":163903},"bhadrak":{"cc":"IN","lat":21.05,"lng":86.52,"pop":121338},"bhadrchalam":{"cc":"IN","lat":17.67,"lng":80.89,"pop":50087},"bhadrachalam":{"cc":"IN","lat":17.67,"lng":80.89,"pop":50087},"bhadohi":{"cc":"IN","lat":25.4,"lng":82.57,"pop":78568},"bhabhua":{"cc":"IN","lat":25.04,"lng":83.61,"pop":50179},"beypore":{"cc":"IN","lat":11.17,"lng":75.81,"pop":70751},"betl":{"cc":"IN","lat":21.9,"lng":77.9,"pop":103330},"betul":{"cc":"IN","lat":21.9,"lng":77.9,"pop":103330},"bettiah":{"cc":"IN","lat":26.8,"lng":84.5,"pop":132209},"ballari":{"cc":"IN","lat":15.14,"lng":76.92,"pop":410445},"belagavi":{"cc":"IN","lat":15.85,"lng":74.5,"pop":490045},"bela":{"cc":"IN","lat":25.92,"lng":82.0,"pop":73992},"begusarai":{"cc":"IN","lat":25.42,"lng":86.13,"pop":252008},"bewar":{"cc":"IN","lat":26.1,"lng":74.32,"pop":151152},"beawar":{"cc":"IN","lat":26.1,"lng":74.32,"pop":151152},"bawana":{"cc":"IN","lat":28.8,"lng":77.03,"pop":73680},"bawna":{"cc":"IN","lat":28.8,"lng":77.03,"pop":73680},"batala":{"cc":"IN","lat":31.81,"lng":75.2,"pop":158621},"batla":{"cc":"IN","lat":31.81,"lng":75.2,"pop":158621},"bast":{"cc":"IN","lat":26.79,"lng":82.72,"pop":115115},"basti":{"cc":"IN","lat":26.79,"lng":82.72,"pop":115115},"basoda":{"cc":"IN","lat":23.85,"lng":77.94,"pop":78289},"basmat":{"cc":"IN","lat":19.33,"lng":77.16,"pop":68846},"basirhat city":{"cc":"IN","lat":22.66,"lng":88.85,"pop":143007},"basavakalyan":{"cc":"IN","lat":17.87,"lng":76.95,"pop":69717},"barwni":{"cc":"IN","lat":22.03,"lng":74.9,"pop":55504},"barwani":{"cc":"IN","lat":22.03,"lng":74.9,"pop":55504},"baruni":{"cc":"IN","lat":25.48,"lng":85.97,"pop":84888},"bruni":{"cc":"IN","lat":25.48,"lng":85.97,"pop":84888},"baruipur":{"cc":"IN","lat":22.37,"lng":88.43,"pop":53128},"barshi":{"cc":"IN","lat":18.23,"lng":75.69,"pop":118722},"barnala":{"cc":"IN","lat":30.37,"lng":75.55,"pop":116449},"barnla":{"cc":"IN","lat":30.37,"lng":75.55,"pop":116449},"barmer":{"cc":"IN","lat":25.75,"lng":71.39,"pop":96225},"brmer":{"cc":"IN","lat":25.75,"lng":71.39,"pop":96225},"baripda":{"cc":"IN","lat":21.93,"lng":86.73,"pop":116849},"baripada":{"cc":"IN","lat":21.93,"lng":86.73,"pop":116849},"bri":{"cc":"IN","lat":26.65,"lng":77.62,"pop":62721},"barh":{"cc":"IN","lat":25.48,"lng":85.71,"pop":61470},"brh":{"cc":"IN","lat":25.48,"lng":85.71,"pop":61470},"bargarh":{"cc":"IN","lat":21.33,"lng":83.62,"pop":80625},"bareilly":{"cc":"IN","lat":28.37,"lng":79.43,"pop":745435},"brdoli":{"cc":"IN","lat":21.12,"lng":73.11,"pop":60821},"bardoli":{"cc":"IN","lat":21.12,"lng":73.11,"pop":60821},"barddhaman":{"cc":"IN","lat":23.26,"lng":87.86,"pop":301725},"barddhamn":{"cc":"IN","lat":23.26,"lng":87.86,"pop":301725},"baraut":{"cc":"IN","lat":29.1,"lng":77.26,"pop":93544},"brsat":{"cc":"IN","lat":22.72,"lng":88.48,"pop":298127},"barasat":{"cc":"IN","lat":22.72,"lng":88.48,"pop":298127},"baranagar":{"cc":"IN","lat":22.64,"lng":88.38,"pop":260072},"baran":{"cc":"IN","lat":25.1,"lng":76.52,"pop":117992},"brn":{"cc":"IN","lat":25.1,"lng":76.52,"pop":117992},"bramla":{"cc":"IN","lat":34.21,"lng":74.34,"pop":77276},"baramula":{"cc":"IN","lat":34.21,"lng":74.34,"pop":77276},"baramati":{"cc":"IN","lat":18.15,"lng":74.58,"pop":54415},"brmati":{"cc":"IN","lat":18.15,"lng":74.58,"pop":54415},"barakpur":{"cc":"IN","lat":22.77,"lng":88.36,"pop":148174},"brkpur":{"cc":"IN","lat":22.77,"lng":88.36,"pop":148174},"bapatla":{"cc":"IN","lat":15.9,"lng":80.47,"pop":70777},"bpatla":{"cc":"IN","lat":15.9,"lng":80.47,"pop":70777},"bnswra":{"cc":"IN","lat":23.54,"lng":74.44,"pop":101017},"banswara":{"cc":"IN","lat":23.54,"lng":74.44,"pop":101017},"bnsbria":{"cc":"IN","lat":22.95,"lng":88.4,"pop":108474},"bansbaria":{"cc":"IN","lat":22.95,"lng":88.4,"pop":108474},"bankura":{"cc":"IN","lat":23.23,"lng":87.07,"pop":133966},"bnkura":{"cc":"IN","lat":23.23,"lng":87.07,"pop":133966},"bangaon":{"cc":"IN","lat":23.05,"lng":88.83,"pop":111693},"bengaluru":{"cc":"IN","lat":12.97,"lng":77.59,"pop":8495492},"banda":{"cc":"IN","lat":25.48,"lng":80.33,"pop":152218},"bnda":{"cc":"IN","lat":25.48,"lng":80.33,"pop":152218},"balurghat":{"cc":"IN","lat":25.22,"lng":88.78,"pop":153279},"blurght":{"cc":"IN","lat":25.22,"lng":88.78,"pop":153279},"balrmpur":{"cc":"IN","lat":27.43,"lng":82.19,"pop":77396},"balrampur":{"cc":"IN","lat":27.43,"lng":82.19,"pop":77396},"balotra":{"cc":"IN","lat":25.83,"lng":72.24,"pop":74496},"bali":{"cc":"IN","lat":22.65,"lng":88.34,"pop":296973},"ballarpur":{"cc":"IN","lat":19.85,"lng":79.35,"pop":92146},"balasore":{"cc":"IN","lat":21.49,"lng":86.93,"pop":144373},"balangir":{"cc":"IN","lat":20.7,"lng":83.49,"pop":98238},"balngr":{"cc":"IN","lat":20.7,"lng":83.49,"pop":98238},"blght":{"cc":"IN","lat":21.82,"lng":80.19,"pop":84261},"balaghat":{"cc":"IN","lat":21.82,"lng":80.19,"pop":84261},"budge budge":{"cc":"IN","lat":22.48,"lng":88.18,"pop":76837},"baidyabati":{"cc":"IN","lat":22.78,"lng":88.33,"pop":115504},"baidyabti":{"cc":"IN","lat":22.78,"lng":88.33,"pop":115504},"bahraigh":{"cc":"IN","lat":27.57,"lng":81.59,"pop":182218},"baheri":{"cc":"IN","lat":28.77,"lng":79.5,"pop":63953},"baharampur":{"cc":"IN","lat":24.1,"lng":88.25,"pop":180547},"bahadurgarh":{"cc":"IN","lat":28.69,"lng":76.94,"pop":170767},"bagalkot":{"cc":"IN","lat":16.19,"lng":75.7,"pop":111933},"bagaha":{"cc":"IN","lat":27.1,"lng":84.09,"pop":112634},"badvel":{"cc":"IN","lat":14.75,"lng":79.06,"pop":70626},"badlapur":{"cc":"IN","lat":19.16,"lng":73.27,"pop":174226},"badagara":{"cc":"IN","lat":11.6,"lng":75.58,"pop":76493},"bada barabil":{"cc":"IN","lat":22.11,"lng":85.39,"pop":56870},"bada barabl":{"cc":"IN","lat":22.11,"lng":85.39,"pop":56870},"azamgarh":{"cc":"IN","lat":26.07,"lng":83.18,"pop":116644},"ayodhya":{"cc":"IN","lat":26.8,"lng":82.2,"pop":53293},"avadi":{"cc":"IN","lat":13.11,"lng":80.11,"pop":345996},"aurangbd":{"cc":"IN","lat":24.75,"lng":84.37,"pop":102244},"aurangabad":{"cc":"IN","lat":19.88,"lng":75.34,"pop":1175116},"auraiya":{"cc":"IN","lat":26.47,"lng":79.51,"pop":70508},"attur":{"cc":"IN","lat":11.59,"lng":78.6,"pop":61793},"attili":{"cc":"IN","lat":16.7,"lng":81.6,"pop":68196},"ashta":{"cc":"IN","lat":23.02,"lng":76.72,"pop":53184},"ashoknagar":{"cc":"IN","lat":24.58,"lng":77.73,"pop":81828},"sansol":{"cc":"IN","lat":23.68,"lng":86.98,"pop":504271},"asansol":{"cc":"IN","lat":23.68,"lng":86.98,"pop":504271},"arwal":{"cc":"IN","lat":25.24,"lng":84.67,"pop":51849},"aruppukkottai":{"cc":"IN","lat":9.51,"lng":78.1,"pop":87722},"arsikere":{"cc":"IN","lat":13.31,"lng":76.26,"pop":53216},"arcot":{"cc":"IN","lat":12.91,"lng":79.32,"pop":55955},"arria":{"cc":"IN","lat":26.15,"lng":87.51,"pop":79021},"araria":{"cc":"IN","lat":26.15,"lng":87.51,"pop":79021},"arni":{"cc":"IN","lat":12.67,"lng":79.29,"pop":63671},"armbgh":{"cc":"IN","lat":22.88,"lng":87.78,"pop":60639},"arambagh":{"cc":"IN","lat":22.88,"lng":87.78,"pop":60639},"arakkonam":{"cc":"IN","lat":13.08,"lng":79.67,"pop":79080},"arrah":{"cc":"IN","lat":25.56,"lng":84.66,"pop":261430},"aonla":{"cc":"IN","lat":28.27,"lng":79.17,"pop":50011},"ankleshwar":{"cc":"IN","lat":21.63,"lng":72.99,"pop":89457},"anjar":{"cc":"IN","lat":23.11,"lng":70.03,"pop":87183},"anjr":{"cc":"IN","lat":23.11,"lng":70.03,"pop":87183},"anjangaon":{"cc":"IN","lat":21.17,"lng":77.31,"pop":56380},"anantnag":{"cc":"IN","lat":33.73,"lng":75.15,"pop":150592},"anantapur":{"cc":"IN","lat":14.68,"lng":77.61,"pop":267161},"anand":{"cc":"IN","lat":22.55,"lng":72.96,"pop":209410},"anakapalle":{"cc":"IN","lat":17.69,"lng":83.0,"pop":86519},"mr":{"cc":"IN","lat":18.79,"lng":78.28,"pop":64023},"amur":{"cc":"IN","lat":18.79,"lng":78.28,"pop":64023},"amroha":{"cc":"IN","lat":28.9,"lng":78.47,"pop":176253},"amritsar":{"cc":"IN","lat":31.62,"lng":74.88,"pop":1159227},"amreli":{"cc":"IN","lat":21.6,"lng":71.21,"pop":117967},"amravati":{"cc":"IN","lat":20.93,"lng":77.75,"pop":647057},"ambur":{"cc":"IN","lat":12.79,"lng":78.72,"pop":114608},"ambikpur":{"cc":"IN","lat":23.12,"lng":83.2,"pop":121071},"ambikapur":{"cc":"IN","lat":23.12,"lng":83.2,"pop":121071},"ambattur":{"cc":"IN","lat":13.1,"lng":80.16,"pop":466205},"ambala":{"cc":"IN","lat":30.36,"lng":76.8,"pop":195153},"ambla":{"cc":"IN","lat":30.36,"lng":76.8,"pop":195153},"ambajogai":{"cc":"IN","lat":18.73,"lng":76.39,"pop":74114},"ambjogi":{"cc":"IN","lat":18.73,"lng":76.39,"pop":74114},"ambarnath":{"cc":"IN","lat":19.2,"lng":73.17,"pop":253475},"amalner":{"cc":"IN","lat":21.04,"lng":75.06,"pop":97369},"amalapuram":{"cc":"IN","lat":16.58,"lng":82.01,"pop":53231},"amalpuram":{"cc":"IN","lat":16.58,"lng":82.01,"pop":53231},"alwar":{"cc":"IN","lat":27.56,"lng":76.62,"pop":322568},"allinagaram":{"cc":"IN","lat":10.03,"lng":77.48,"pop":94453},"alappuzha":{"cc":"IN","lat":9.49,"lng":76.33,"pop":240991},"prayagraj":{"cc":"IN","lat":25.44,"lng":81.84,"pop":1073438},"alpur dur":{"cc":"IN","lat":26.48,"lng":89.52,"pop":65232},"alipur duar":{"cc":"IN","lat":26.48,"lng":89.52,"pop":65232},"algarh":{"cc":"IN","lat":27.88,"lng":78.07,"pop":753207},"aligarh":{"cc":"IN","lat":27.88,"lng":78.07,"pop":753207},"alandur":{"cc":"IN","lat":13.0,"lng":80.21,"pop":164430},"akot":{"cc":"IN","lat":21.1,"lng":77.06,"pop":92637},"akola":{"cc":"IN","lat":20.71,"lng":77.0,"pop":428857},"ajmer":{"cc":"IN","lat":26.45,"lng":74.64,"pop":542321},"aizawl":{"cc":"IN","lat":23.73,"lng":92.72,"pop":293416},"ahilyanagar":{"cc":"IN","lat":19.09,"lng":74.74,"pop":367140},"ahmedabad":{"cc":"IN","lat":23.03,"lng":72.59,"pop":6357693},"agra":{"cc":"IN","lat":27.18,"lng":78.02,"pop":1430055},"agartala":{"cc":"IN","lat":23.84,"lng":91.28,"pop":400004},"adoni":{"cc":"IN","lat":15.63,"lng":77.27,"pop":184625},"dilbd":{"cc":"IN","lat":19.67,"lng":78.54,"pop":118526},"adilabad":{"cc":"IN","lat":19.67,"lng":78.54,"pop":118526},"achalpur":{"cc":"IN","lat":21.26,"lng":77.51,"pop":112311},"bu road":{"cc":"IN","lat":24.48,"lng":72.78,"pop":55599},"abu road":{"cc":"IN","lat":24.48,"lng":72.78,"pop":55599},"abohar":{"cc":"IN","lat":30.14,"lng":74.2,"pop":145302},"contai":{"cc":"IN","lat":21.78,"lng":87.75,"pop":88702},"haldia":{"cc":"IN","lat":22.06,"lng":88.11,"pop":170695},"bankra":{"cc":"IN","lat":22.6,"lng":88.28,"pop":56273},"maheshtala":{"cc":"IN","lat":22.51,"lng":88.25,"pop":448317},"soyibug":{"cc":"IN","lat":34.08,"lng":74.71,"pop":104000},"soybug":{"cc":"IN","lat":34.08,"lng":74.71,"pop":104000},"roshanpura":{"cc":"IN","lat":28.6,"lng":76.99,"pop":57217},"madhavaram":{"cc":"IN","lat":13.15,"lng":80.23,"pop":119105},"ullagaram":{"cc":"IN","lat":12.98,"lng":80.2,"pop":53322},"kavanur":{"cc":"IN","lat":13.0,"lng":80.08,"pop":54986},"nerkunram":{"cc":"IN","lat":13.06,"lng":80.21,"pop":59790},"vrarghavapuram":{"cc":"IN","lat":13.07,"lng":80.11,"pop":64698},"viraraghavapuram":{"cc":"IN","lat":13.07,"lng":80.11,"pop":64698},"navi mumbai":{"cc":"IN","lat":19.04,"lng":73.02,"pop":2600000},"panchkula":{"cc":"IN","lat":30.69,"lng":76.85,"pop":211355},"shivaji nagar":{"cc":"IN","lat":18.53,"lng":73.85,"pop":1000000},"greater noida":{"cc":"IN","lat":28.5,"lng":77.54,"pop":293908},"zerakpur":{"cc":"IN","lat":30.66,"lng":76.82,"pop":95553},"bna":{"cc":"IN","lat":24.17,"lng":78.19,"pop":64529},"bina":{"cc":"IN","lat":24.17,"lng":78.19,"pop":64529},"mohali":{"cc":"IN","lat":30.68,"lng":76.72,"pop":166864},"pithampur":{"cc":"IN","lat":22.6,"lng":75.7,"pop":126200},"barbil":{"cc":"IN","lat":22.1,"lng":85.38,"pop":66540},"airoli":{"cc":"IN","lat":19.15,"lng":73.0,"pop":100000},"kotkapura":{"cc":"IN","lat":30.58,"lng":74.83,"pop":80741},"vapi":{"cc":"IN","lat":20.37,"lng":72.9,"pop":163630},"noida":{"cc":"IN","lat":28.58,"lng":77.33,"pop":293908},"bhiwadi":{"cc":"IN","lat":28.21,"lng":76.86,"pop":104921},"mandideep":{"cc":"IN","lat":23.08,"lng":77.53,"pop":59654},"singrauli":{"cc":"IN","lat":24.2,"lng":82.68,"pop":220257},"jaigaon":{"cc":"IN","lat":26.85,"lng":89.38,"pop":158664},"bellampalli":{"cc":"IN","lat":19.06,"lng":79.49,"pop":66660},"gaddi annaram":{"cc":"IN","lat":17.37,"lng":78.52,"pop":53622},"lal bahadur nagar":{"cc":"IN","lat":17.35,"lng":78.56,"pop":261987},"malkajgiri":{"cc":"IN","lat":17.45,"lng":78.53,"pop":150000},"mandamarri":{"cc":"IN","lat":18.97,"lng":79.47,"pop":66176},"chinnachowk":{"cc":"IN","lat":14.48,"lng":78.84,"pop":64053},"gajuwaka":{"cc":"IN","lat":17.7,"lng":83.22,"pop":258944},"metpalle":{"cc":"IN","lat":18.85,"lng":78.63,"pop":50902},"ponnur":{"cc":"IN","lat":16.07,"lng":80.55,"pop":59913},"quthbullapur":{"cc":"IN","lat":17.5,"lng":78.46,"pop":225816},"palwancha":{"cc":"IN","lat":17.58,"lng":80.68,"pop":80199},"serilingampalle":{"cc":"IN","lat":17.49,"lng":78.3,"pop":150525},"ashoknagar kalyangarh":{"cc":"IN","lat":22.86,"lng":88.64,"pop":111475},"pimpri-chinchwad":{"cc":"IN","lat":18.62,"lng":73.8,"pop":1727692},"kharghar":{"cc":"IN","lat":19.05,"lng":73.07,"pop":80612},"kumarapalayam":{"cc":"IN","lat":11.44,"lng":77.71,"pop":195071},"virudhachalam":{"cc":"IN","lat":11.51,"lng":79.33,"pop":73585},"electronic city phase i":{"cc":"IN","lat":12.85,"lng":77.66,"pop":76348},"ramagundam":{"cc":"IN","lat":18.75,"lng":79.47,"pop":242979},"shella":{"cc":"IN","lat":25.18,"lng":91.64,"pop":54039},"sultnganj":{"cc":"IN","lat":25.24,"lng":86.74,"pop":52892},"sultanganj":{"cc":"IN","lat":25.24,"lng":86.74,"pop":52892},"modinagar":{"cc":"IN","lat":28.83,"lng":77.57,"pop":475843},"modnagar":{"cc":"IN","lat":28.83,"lng":77.57,"pop":475843},"nimach":{"cc":"IN","lat":24.46,"lng":74.87,"pop":128561},"kagaznagar":{"cc":"IN","lat":19.33,"lng":79.47,"pop":57583},"kagazngr":{"cc":"IN","lat":19.33,"lng":79.47,"pop":57583},"thoothukudi":{"cc":"IN","lat":8.77,"lng":78.13,"pop":410760},"gadag-betageri":{"cc":"IN","lat":15.42,"lng":75.62,"pop":172813},"rabkavi-banhatti":{"cc":"IN","lat":16.47,"lng":75.12,"pop":77004},"rudrapur":{"cc":"IN","lat":28.98,"lng":79.4,"pop":154554},"sunabeda":{"cc":"IN","lat":18.73,"lng":82.83,"pop":50394},"rajgangpur":{"cc":"IN","lat":22.2,"lng":84.58,"pop":51362},"thodupuzha":{"cc":"IN","lat":9.89,"lng":76.72,"pop":52045},"neelankarai":{"cc":"IN","lat":12.95,"lng":80.26,"pop":76600},"srikalahasti":{"cc":"IN","lat":13.76,"lng":79.7,"pop":80056},"pammal":{"cc":"IN","lat":12.97,"lng":80.13,"pop":75870},"maduravoyal":{"cc":"IN","lat":13.07,"lng":80.16,"pop":86195},"srni":{"cc":"IN","lat":22.1,"lng":78.17,"pop":86141},"sarni":{"cc":"IN","lat":22.1,"lng":78.17,"pop":86141},"burri":{"cc":"IN","lat":28.76,"lng":77.2,"pop":146190},"burari":{"cc":"IN","lat":28.76,"lng":77.2,"pop":146190},"begampur":{"cc":"IN","lat":28.73,"lng":77.07,"pop":53682},"pth kaln":{"cc":"IN","lat":28.71,"lng":77.08,"pop":96002},"puth kalan":{"cc":"IN","lat":28.71,"lng":77.08,"pop":96002},"mundka":{"cc":"IN","lat":28.68,"lng":77.03,"pop":54541},"mndka":{"cc":"IN","lat":28.68,"lng":77.03,"pop":54541},"baprola":{"cc":"IN","lat":28.64,"lng":77.01,"pop":52744},"bprola":{"cc":"IN","lat":28.64,"lng":77.01,"pop":52744},"hashtsl":{"cc":"IN","lat":28.63,"lng":77.06,"pop":176877},"hashtsal":{"cc":"IN","lat":28.63,"lng":77.06,"pop":176877},"kapas herd":{"cc":"IN","lat":28.53,"lng":77.08,"pop":74073},"kpas herd":{"cc":"IN","lat":28.53,"lng":77.08,"pop":74073},"kirri sulemnnagar":{"cc":"IN","lat":28.7,"lng":77.06,"pop":283211},"kirari sulemannagar":{"cc":"IN","lat":28.7,"lng":77.06,"pop":283211},"shibbd daulotpur":{"cc":"IN","lat":28.75,"lng":77.11,"pop":54773},"sahibabad daulotpur":{"cc":"IN","lat":28.75,"lng":77.11,"pop":54773},"mukandpur":{"cc":"IN","lat":28.74,"lng":77.18,"pop":57135},"bhlswa jahangirpur":{"cc":"IN","lat":28.74,"lng":77.17,"pop":197148},"bhalswa jahangirpur":{"cc":"IN","lat":28.74,"lng":77.17,"pop":197148},"deoli":{"cc":"IN","lat":28.5,"lng":77.23,"pop":169122},"sadatpur gujran":{"cc":"IN","lat":28.73,"lng":77.25,"pop":97641},"sdatpur gujran":{"cc":"IN","lat":28.73,"lng":77.25,"pop":97641},"karawalnagar":{"cc":"IN","lat":28.73,"lng":77.27,"pop":224281},"karwalnagar":{"cc":"IN","lat":28.73,"lng":77.27,"pop":224281},"mustafabad":{"cc":"IN","lat":28.72,"lng":77.27,"pop":127167},"mustafbd":{"cc":"IN","lat":28.72,"lng":77.27,"pop":127167},"gokalpur":{"cc":"IN","lat":28.7,"lng":77.29,"pop":121870},"mandoli":{"cc":"IN","lat":28.7,"lng":77.31,"pop":120417},"jfarbd":{"cc":"IN","lat":28.68,"lng":77.27,"pop":54601},"jafarabad":{"cc":"IN","lat":28.68,"lng":77.27,"pop":54601},"chilla soroda bangar":{"cc":"IN","lat":28.6,"lng":77.3,"pop":83217},"chilla soroda bngar":{"cc":"IN","lat":28.6,"lng":77.3,"pop":83217},"dalupura":{"cc":"IN","lat":28.61,"lng":77.32,"pop":154791},"dalpura":{"cc":"IN","lat":28.61,"lng":77.32,"pop":154791},"molarband":{"cc":"IN","lat":28.5,"lng":77.31,"pop":91402},"molrband":{"cc":"IN","lat":28.5,"lng":77.31,"pop":91402},"jaitpur":{"cc":"IN","lat":28.51,"lng":77.33,"pop":59330},"gharroli":{"cc":"IN","lat":28.62,"lng":77.33,"pop":92540},"mthepur":{"cc":"IN","lat":28.5,"lng":77.32,"pop":69837},"mithepur":{"cc":"IN","lat":28.5,"lng":77.32,"pop":69837},"choudwar":{"cc":"IN","lat":20.54,"lng":85.92,"pop":52999},"benipur":{"cc":"IN","lat":26.06,"lng":86.15,"pop":75317},"birgaon":{"cc":"IN","lat":21.31,"lng":81.63,"pop":96294},"wri":{"cc":"IN","lat":21.15,"lng":79.01,"pop":54048},"wari":{"cc":"IN","lat":21.15,"lng":79.01,"pop":54048},"rniganj":{"cc":"IN","lat":17.43,"lng":78.49,"pop":217910},"jajmau":{"cc":"IN","lat":26.43,"lng":80.41,"pop":652831},"jjmau":{"cc":"IN","lat":26.43,"lng":80.41,"pop":652831},"kalamassery":{"cc":"IN","lat":10.06,"lng":76.33,"pop":71038},"bngarda chhota":{"cc":"IN","lat":22.74,"lng":75.81,"pop":64213},"bangarda chhota":{"cc":"IN","lat":22.74,"lng":75.81,"pop":64213},"gobindgarh":{"cc":"IN","lat":30.67,"lng":76.3,"pop":82266},"madhurampur dehri":{"cc":"IN","lat":24.97,"lng":84.2,"pop":137231},"bihat":{"cc":"IN","lat":25.43,"lng":86.02,"pop":67952},"biht":{"cc":"IN","lat":25.43,"lng":86.02,"pop":67952},"tennala":{"cc":"IN","lat":10.99,"lng":75.94,"pop":56546},"phusro":{"cc":"IN","lat":23.76,"lng":86.01,"pop":185555},"bagbera":{"cc":"IN","lat":22.76,"lng":86.19,"pop":78356},"barauni":{"cc":"IN","lat":25.47,"lng":85.98,"pop":71660},"savarkundla":{"cc":"IN","lat":21.34,"lng":71.3,"pop":78354},"rampura phul":{"cc":"IN","lat":30.28,"lng":75.24,"pop":51023},"idaiyarpalaiyam":{"cc":"IN","lat":11.04,"lng":76.92,"pop":83908},"idaiyarplaiyam":{"cc":"IN","lat":11.04,"lng":76.92,"pop":83908},"edattala":{"cc":"IN","lat":10.06,"lng":76.38,"pop":77811},"kurichchi":{"cc":"IN","lat":10.96,"lng":76.97,"pop":123667},"kuniyamuttr":{"cc":"IN","lat":10.96,"lng":76.95,"pop":95924},"kuniyamuttur":{"cc":"IN","lat":10.96,"lng":76.95,"pop":95924},"velamplaiyam":{"cc":"IN","lat":11.14,"lng":77.31,"pop":87427},"velampalaiyam":{"cc":"IN","lat":11.14,"lng":77.31,"pop":87427},"nerupperichchal":{"cc":"IN","lat":11.16,"lng":77.37,"pop":53579},"virapandi":{"cc":"IN","lat":11.06,"lng":77.35,"pop":50301},"vrapndi":{"cc":"IN","lat":11.06,"lng":77.35,"pop":50301},"nallr":{"cc":"IN","lat":11.1,"lng":77.39,"pop":70115},"nallur":{"cc":"IN","lat":11.1,"lng":77.39,"pop":70115},"periya semr":{"cc":"IN","lat":11.36,"lng":77.69,"pop":55282},"periya semur":{"cc":"IN","lat":11.36,"lng":77.69,"pop":55282},"vrappanchathiram":{"cc":"IN","lat":11.35,"lng":77.71,"pop":84453},"virappanchathiram":{"cc":"IN","lat":11.35,"lng":77.71,"pop":84453},"kasipalaiyam":{"cc":"IN","lat":11.32,"lng":77.71,"pop":73425},"ksiplaiyam":{"cc":"IN","lat":11.32,"lng":77.71,"pop":73425},"saunda":{"cc":"IN","lat":23.66,"lng":85.33,"pop":81915},"tndoni":{"cc":"IN","lat":10.93,"lng":78.09,"pop":53854},"tandoni":{"cc":"IN","lat":10.93,"lng":78.09,"pop":53854},"naiyr":{"cc":"IN","lat":9.96,"lng":78.11,"pop":63917},"anaiyur":{"cc":"IN","lat":9.96,"lng":78.11,"pop":63917},"avaniyapuram":{"cc":"IN","lat":9.88,"lng":78.11,"pop":89635},"avaniypuram":{"cc":"IN","lat":9.88,"lng":78.11,"pop":89635},"gunduplaiyam":{"cc":"IN","lat":11.94,"lng":79.8,"pop":300104},"gundupalaiyam":{"cc":"IN","lat":11.94,"lng":79.8,"pop":300104},"kushinagar":{"cc":"IN","lat":26.74,"lng":83.89,"pop":274403},"rohini":{"cc":"IN","lat":28.74,"lng":77.07,"pop":860000},"mulugu":{"cc":"IN","lat":18.19,"lng":79.94,"pop":297671},"kallakurichi":{"cc":"IN","lat":11.73,"lng":78.96,"pop":1682687},"amaravati":{"cc":"IN","lat":16.51,"lng":80.52,"pop":103000},"chirmiri":{"cc":"IN","lat":23.19,"lng":82.35,"pop":100800},"kanayannur":{"cc":"IN","lat":9.97,"lng":76.27,"pop":851406},"shahuwadi":{"cc":"IN","lat":16.91,"lng":73.95,"pop":180322},"byasanagar":{"cc":"IN","lat":20.96,"lng":86.13,"pop":56946},"mawlai-mawong":{"cc":"IN","lat":25.62,"lng":91.88,"pop":55012},"mawlai-mawiong":{"cc":"IN","lat":25.62,"lng":91.88,"pop":55012},"jaggaiahpet":{"cc":"IN","lat":16.89,"lng":80.1,"pop":53530},"phulwari sharif":{"cc":"IN","lat":25.58,"lng":85.07,"pop":81740},"dinapur nizamat":{"cc":"IN","lat":25.64,"lng":85.05,"pop":182429},"bhilai charoda":{"cc":"IN","lat":21.22,"lng":81.46,"pop":98008},"nithari":{"cc":"IN","lat":28.7,"lng":77.05,"pop":50464},"taj pul":{"cc":"IN","lat":28.49,"lng":77.31,"pop":68796},"ziauddin pur":{"cc":"IN","lat":28.71,"lng":77.28,"pop":68993},"pul pehlad":{"cc":"IN","lat":28.5,"lng":77.29,"pop":69657},"khajoori khas":{"cc":"IN","lat":28.71,"lng":77.26,"pop":76640},"sultan pur majra":{"cc":"IN","lat":28.69,"lng":77.08,"pop":181554},"vijalpor":{"cc":"IN","lat":20.92,"lng":72.91,"pop":81245},"panipat taraf makhdum zadgan":{"cc":"IN","lat":29.42,"lng":76.99,"pop":67998},"ambala sadar":{"cc":"IN","lat":30.34,"lng":76.86,"pop":104974},"raurkela industrial township":{"cc":"IN","lat":22.2,"lng":84.86,"pop":216410},"mango":{"cc":"IN","lat":22.83,"lng":86.22,"pop":223805},"vazhakkala":{"cc":"IN","lat":10.01,"lng":76.33,"pop":51242},"pallichal":{"cc":"IN","lat":8.45,"lng":77.03,"pop":53861},"moonniyur":{"cc":"IN","lat":11.06,"lng":75.9,"pop":55535},"cheruvannur":{"cc":"IN","lat":11.19,"lng":75.83,"pop":61614},"wadgaon kolhati":{"cc":"IN","lat":19.84,"lng":75.24,"pop":65620},"naya gaon":{"cc":"IN","lat":30.78,"lng":76.79,"pop":50869},"ramapuram":{"cc":"IN","lat":13.03,"lng":80.18,"pop":52295},"maraimalainagar":{"cc":"IN","lat":12.8,"lng":80.03,"pop":81872},"khanapuram haveli":{"cc":"IN","lat":17.26,"lng":80.17,"pop":53442},"kanpur cantonment":{"cc":"IN","lat":26.46,"lng":80.38,"pop":108534},"nani daman":{"cc":"IN","lat":20.41,"lng":72.83,"pop":62000},"zaxo":{"cc":"IQ","lat":37.15,"lng":42.69,"pop":95052},"umm qasr":{"cc":"IQ","lat":30.04,"lng":47.92,"pop":107620},"umm qar":{"cc":"IQ","lat":30.04,"lng":47.92,"pop":107620},"tuz khurmatu":{"cc":"IQ","lat":34.89,"lng":44.63,"pop":120712},"z khrmt":{"cc":"IQ","lat":34.89,"lng":44.63,"pop":120712},"sumayl":{"cc":"IQ","lat":36.86,"lng":42.85,"pop":152512},"snah":{"cc":"IQ","lat":36.81,"lng":43.04,"pop":128776},"sinah":{"cc":"IQ","lat":36.81,"lng":43.04,"pop":128776},"ash sharqt":{"cc":"IQ","lat":35.52,"lng":43.23,"pop":160000},"ash sharqat":{"cc":"IQ","lat":35.52,"lng":43.23,"pop":160000},"smarr":{"cc":"IQ","lat":34.2,"lng":43.89,"pop":158508},"samarra":{"cc":"IQ","lat":34.2,"lng":43.89,"pop":158508},"rnyah":{"cc":"IQ","lat":36.26,"lng":44.88,"pop":114173},"ranyah":{"cc":"IQ","lat":36.26,"lng":44.88,"pop":114173},"al qaim":{"cc":"IQ","lat":34.39,"lng":40.99,"pop":74100},"al qim":{"cc":"IQ","lat":34.39,"lng":40.99,"pop":74100},"al-hamdaniya":{"cc":"IQ","lat":36.27,"lng":43.38,"pop":50000},"qalat sukkar":{"cc":"IQ","lat":31.86,"lng":46.07,"pop":110000},"qeadiz":{"cc":"IQ","lat":36.18,"lng":45.13,"pop":140688},"qeladize":{"cc":"IQ","lat":36.18,"lng":45.13,"pop":140688},"khnaqn":{"cc":"IQ","lat":34.35,"lng":45.39,"pop":175000},"khanaqin":{"cc":"IQ","lat":34.35,"lng":45.39,"pop":175000},"kirkuk":{"cc":"IQ","lat":35.47,"lng":44.39,"pop":1031000},"karbala":{"cc":"IQ","lat":32.62,"lng":44.02,"pop":1218732},"kelar":{"cc":"IQ","lat":34.63,"lng":45.32,"pop":250000},"erbil":{"cc":"IQ","lat":36.19,"lng":44.01,"pop":1612700},"halabja":{"cc":"IQ","lat":35.18,"lng":45.99,"pop":57333},"xebat":{"cc":"IQ","lat":36.28,"lng":43.67,"pop":148047},"soran":{"cc":"IQ","lat":36.66,"lng":44.54,"pop":91589},"dihok":{"cc":"IQ","lat":36.87,"lng":42.99,"pop":340900},"bayj":{"cc":"IQ","lat":34.93,"lng":43.49,"pop":173677},"bayji":{"cc":"IQ","lat":34.93,"lng":43.49,"pop":173677},"baqubah":{"cc":"IQ","lat":33.75,"lng":44.61,"pop":152550},"baarkah":{"cc":"IQ","lat":36.32,"lng":44.04,"pop":130518},"baharkah":{"cc":"IQ","lat":36.32,"lng":44.04,"pop":130518},"baghdad":{"cc":"IQ","lat":33.34,"lng":44.4,"pop":7216000},"az zubayr":{"cc":"IQ","lat":30.39,"lng":47.7,"pop":122676},"as suwayrah":{"cc":"IQ","lat":32.93,"lng":44.78,"pop":77200},"a uwayrah":{"cc":"IQ","lat":32.93,"lng":44.78,"pop":77200},"sulaymaniyah":{"cc":"IQ","lat":35.56,"lng":45.43,"pop":878146},"as samawah":{"cc":"IQ","lat":31.33,"lng":45.29,"pop":152890},"ash shatrah":{"cc":"IQ","lat":31.41,"lng":46.17,"pop":182175},"ash sharah":{"cc":"IQ","lat":31.41,"lng":46.17,"pop":182175},"ash shmyah":{"cc":"IQ","lat":31.96,"lng":44.6,"pop":57661},"ash shamiyah":{"cc":"IQ","lat":31.96,"lng":44.6,"pop":57661},"ramadi":{"cc":"IQ","lat":33.42,"lng":43.31,"pop":223500},"an numnyah":{"cc":"IQ","lat":32.56,"lng":45.41,"pop":110000},"an numaniyah":{"cc":"IQ","lat":32.56,"lng":45.41,"pop":110000},"nasiriyah":{"cc":"IQ","lat":31.06,"lng":46.26,"pop":558400},"najaf":{"cc":"IQ","lat":32.03,"lng":44.35,"pop":482576},"al qurnah":{"cc":"IQ","lat":31.02,"lng":47.43,"pop":134174},"al-qsim":{"cc":"IQ","lat":32.3,"lng":44.68,"pop":93546},"al-qasim":{"cc":"IQ","lat":32.3,"lng":44.68,"pop":93546},"al-musayab":{"cc":"IQ","lat":32.78,"lng":44.29,"pop":101873},"al miqddyah":{"cc":"IQ","lat":33.98,"lng":44.94,"pop":155968},"al miqdadiyah":{"cc":"IQ","lat":33.98,"lng":44.94,"pop":155968},"al mawil al jaddah":{"cc":"IQ","lat":36.33,"lng":43.11,"pop":2065597},"al mawsil al jadidah":{"cc":"IQ","lat":36.33,"lng":43.11,"pop":2065597},"mosul":{"cc":"IQ","lat":36.34,"lng":43.12,"pop":1683000},"al mamdyah":{"cc":"IQ","lat":33.06,"lng":44.37,"pop":350000},"al mahmudiyah":{"cc":"IQ","lat":33.06,"lng":44.37,"pop":350000},"al madinah":{"cc":"IQ","lat":30.96,"lng":47.27,"pop":255000},"al madnah":{"cc":"IQ","lat":30.96,"lng":47.27,"pop":255000},"al-kut":{"cc":"IQ","lat":32.51,"lng":45.82,"pop":315162},"kufa":{"cc":"IQ","lat":32.05,"lng":44.44,"pop":110000},"khalis":{"cc":"IQ","lat":33.81,"lng":44.53,"pop":70046},"khli":{"cc":"IQ","lat":33.81,"lng":44.53,"pop":70046},"nahiyat al iskandariyah":{"cc":"IQ","lat":32.89,"lng":44.35,"pop":100600},"niyat al iskandaryah":{"cc":"IQ","lat":32.89,"lng":44.35,"pop":100600},"al hindyah":{"cc":"IQ","lat":32.54,"lng":44.22,"pop":139578},"al hindiyah":{"cc":"IQ","lat":32.54,"lng":44.22,"pop":139578},"al hillah":{"cc":"IQ","lat":32.46,"lng":44.42,"pop":455700},"al ayy":{"cc":"IQ","lat":32.17,"lng":46.04,"pop":78272},"al hayy":{"cc":"IQ","lat":32.17,"lng":46.04,"pop":78272},"al harithah":{"cc":"IQ","lat":30.58,"lng":47.76,"pop":92395},"al hrithah":{"cc":"IQ","lat":30.58,"lng":47.76,"pop":92395},"al fw":{"cc":"IQ","lat":29.97,"lng":48.47,"pop":104569},"al faw":{"cc":"IQ","lat":29.97,"lng":48.47,"pop":104569},"al falljah":{"cc":"IQ","lat":33.35,"lng":43.79,"pop":190159},"al fallujah":{"cc":"IQ","lat":33.35,"lng":43.79,"pop":190159},"basrah":{"cc":"IQ","lat":30.51,"lng":47.78,"pop":1326564},"al amarah":{"cc":"IQ","lat":31.84,"lng":47.14,"pop":323302},"al amrah":{"cc":"IQ","lat":31.84,"lng":47.14,"pop":323302},"al diwaniyah":{"cc":"IQ","lat":31.99,"lng":44.93,"pop":318801},"ab ghurayb":{"cc":"IQ","lat":33.31,"lng":44.18,"pop":900000},"abu ghurayb":{"cc":"IQ","lat":33.31,"lng":44.18,"pop":900000},"derbendixan":{"cc":"IQ","lat":35.11,"lng":45.69,"pop":54896},"derbendxan":{"cc":"IQ","lat":35.11,"lng":45.69,"pop":54896},"akra":{"cc":"IQ","lat":36.73,"lng":43.88,"pop":105370},"kra":{"cc":"IQ","lat":36.73,"lng":43.88,"pop":105370},"khasnahzan":{"cc":"IQ","lat":36.2,"lng":44.14,"pop":146639},"khasnahzn":{"cc":"IQ","lat":36.2,"lng":44.14,"pop":146639},"hajiawa":{"cc":"IQ","lat":36.24,"lng":44.79,"pop":80000},"sadr city":{"cc":"IQ","lat":33.39,"lng":44.46,"pop":1211849},"simele":{"cc":"IQ","lat":36.86,"lng":42.85,"pop":152512},"abu al-kahsib":{"cc":"IQ","lat":30.44,"lng":47.88,"pop":357771},"ab al-kahb":{"cc":"IQ","lat":30.44,"lng":47.88,"pop":357771},"sheldiz":{"cc":"IQ","lat":37.03,"lng":43.78,"pop":50000},"sheladiz":{"cc":"IQ","lat":37.03,"lng":43.78,"pop":50000},"alvand":{"cc":"IR","lat":36.19,"lng":50.06,"pop":90000},"nrbd":{"cc":"IR","lat":34.07,"lng":47.97,"pop":65547},"nurabad":{"cc":"IR","lat":34.07,"lng":47.97,"pop":65547},"javnrd":{"cc":"IR","lat":34.81,"lng":46.49,"pop":54354},"javanrud":{"cc":"IR","lat":34.81,"lng":46.49,"pop":54354},"qarchak":{"cc":"IR","lat":35.43,"lng":51.58,"pop":251834},"leeh":{"cc":"IR","lat":35.51,"lng":51.19,"pop":58683},"salehieh":{"cc":"IR","lat":35.51,"lng":51.19,"pop":58683},"golestn":{"cc":"IR","lat":35.52,"lng":51.18,"pop":240000},"golestan":{"cc":"IR","lat":35.52,"lng":51.18,"pop":240000},"shahre jadide andisheh":{"cc":"IR","lat":35.68,"lng":51.02,"pop":116062},"khorramdarreh":{"cc":"IR","lat":36.21,"lng":49.2,"pop":50528},"kamlshahr":{"cc":"IR","lat":35.86,"lng":50.87,"pop":141669},"kamalshahr":{"cc":"IR","lat":35.86,"lng":50.87,"pop":141669},"abadeh":{"cc":"IR","lat":28.83,"lng":53.17,"pop":59116},"bdeh":{"cc":"IR","lat":28.83,"lng":53.17,"pop":59116},"yasuj":{"cc":"IR","lat":30.67,"lng":51.59,"pop":96786},"zarand":{"cc":"IR","lat":30.81,"lng":56.56,"pop":58983},"zanjan":{"cc":"IR","lat":36.68,"lng":48.5,"pop":357471},"yazd":{"cc":"IR","lat":31.9,"lng":54.37,"pop":477905},"varamin":{"cc":"IR","lat":35.32,"lng":51.65,"pop":225628},"varmn":{"cc":"IR","lat":35.32,"lng":51.65,"pop":225628},"tuyserkan":{"cc":"IR","lat":34.55,"lng":48.44,"pop":50455},"tyserkn":{"cc":"IR","lat":34.55,"lng":48.44,"pop":50455},"torbat-e eydaryeh":{"cc":"IR","lat":35.27,"lng":59.22,"pop":140019},"torbat-e heydariyeh":{"cc":"IR","lat":35.27,"lng":59.22,"pop":140019},"tehran":{"cc":"IR","lat":35.69,"lng":51.42,"pop":7153309},"tkestn":{"cc":"IR","lat":36.07,"lng":49.7,"pop":71499},"takestan":{"cc":"IR","lat":36.07,"lng":49.7,"pop":71499},"takab":{"cc":"IR","lat":36.4,"lng":47.11,"pop":51541},"takb":{"cc":"IR","lat":36.4,"lng":47.11,"pop":51541},"tajrish":{"cc":"IR","lat":35.8,"lng":51.43,"pop":86000},"tajrsh":{"cc":"IR","lat":35.8,"lng":51.43,"pop":86000},"tabriz":{"cc":"IR","lat":38.08,"lng":46.29,"pop":1424641},"eqbaliyeh":{"cc":"IR","lat":36.23,"lng":49.92,"pop":55066},"eqblyeh":{"cc":"IR","lat":36.23,"lng":49.92,"pop":55066},"sirjan":{"cc":"IR","lat":29.45,"lng":55.68,"pop":199704},"shshtar":{"cc":"IR","lat":32.05,"lng":48.85,"pop":101878},"shushtar":{"cc":"IR","lat":32.05,"lng":48.85,"pop":101878},"shsh":{"cc":"IR","lat":32.19,"lng":48.24,"pop":77148},"shush":{"cc":"IR","lat":32.19,"lng":48.24,"pop":77148},"shirvan":{"cc":"IR","lat":37.4,"lng":57.93,"pop":82790},"shrvn":{"cc":"IR","lat":37.4,"lng":57.93,"pop":82790},"shiraz":{"cc":"IR","lat":29.61,"lng":52.53,"pop":1249942},"shahr-e kord":{"cc":"IR","lat":32.33,"lng":50.86,"pop":129153},"shahr-e babak":{"cc":"IR","lat":30.12,"lng":55.12,"pop":51620},"shahr-e bbak":{"cc":"IR","lat":30.12,"lng":55.12,"pop":51620},"semnan":{"cc":"IR","lat":35.58,"lng":53.39,"pop":124826},"saveh":{"cc":"IR","lat":35.02,"lng":50.36,"pop":220762},"sveh":{"cc":"IR","lat":35.02,"lng":50.36,"pop":220762},"sari":{"cc":"IR","lat":36.56,"lng":53.06,"pop":255396},"saqqez":{"cc":"IR","lat":36.25,"lng":46.27,"pop":165258},"sanandaj":{"cc":"IR","lat":35.31,"lng":47.0,"pop":349176},"salms":{"cc":"IR","lat":38.2,"lng":44.77,"pop":81606},"salmas":{"cc":"IR","lat":38.2,"lng":44.77,"pop":81606},"sabzevar":{"cc":"IR","lat":36.21,"lng":57.68,"pop":243700},"robat karim":{"cc":"IR","lat":35.48,"lng":51.08,"pop":105393},"rob karm":{"cc":"IR","lat":35.48,"lng":51.08,"pop":105393},"rasht":{"cc":"IR","lat":37.28,"lng":49.59,"pop":594590},"ramhormoz":{"cc":"IR","lat":31.28,"lng":49.6,"pop":74285},"rmhormoz":{"cc":"IR","lat":31.28,"lng":49.6,"pop":74285},"rafsanjan":{"cc":"IR","lat":30.41,"lng":55.99,"pop":147680},"rafsanjn":{"cc":"IR","lat":30.41,"lng":55.99,"pop":147680},"qchn":{"cc":"IR","lat":37.11,"lng":58.51,"pop":111752},"quchan":{"cc":"IR","lat":37.11,"lng":58.51,"pop":111752},"qorveh":{"cc":"IR","lat":35.17,"lng":47.81,"pop":87953},"qom":{"cc":"IR","lat":34.64,"lng":50.88,"pop":900000},"qazvin":{"cc":"IR","lat":36.27,"lng":50.0,"pop":333635},"qods":{"cc":"IR","lat":35.72,"lng":51.11,"pop":309605},"qem shahr":{"cc":"IR","lat":36.47,"lng":52.87,"pop":204953},"qaem shahr":{"cc":"IR","lat":36.47,"lng":52.87,"pop":204953},"pshv":{"cc":"IR","lat":35.31,"lng":51.73,"pop":53856},"pishva":{"cc":"IR","lat":35.31,"lng":51.73,"pop":53856},"piranshahr":{"cc":"IR","lat":36.7,"lng":45.14,"pop":168393},"parsabad":{"cc":"IR","lat":39.65,"lng":47.92,"pop":102996},"prsbd":{"cc":"IR","lat":39.65,"lng":47.92,"pop":102996},"oshnaviyeh":{"cc":"IR","lat":37.04,"lng":45.1,"pop":50661},"oshnavyeh":{"cc":"IR","lat":37.04,"lng":45.1,"pop":50661},"orumiyeh":{"cc":"IR","lat":37.55,"lng":45.08,"pop":577307},"ormyeh":{"cc":"IR","lat":37.55,"lng":45.08,"pop":577307},"omdyeh":{"cc":"IR","lat":30.76,"lng":49.7,"pop":67427},"omidiyeh":{"cc":"IR","lat":30.76,"lng":49.7,"pop":67427},"neyshbr":{"cc":"IR","lat":36.21,"lng":58.8,"pop":220929},"neyshabur":{"cc":"IR","lat":36.21,"lng":58.8,"pop":220929},"nek":{"cc":"IR","lat":36.65,"lng":53.3,"pop":60991},"neka":{"cc":"IR","lat":36.65,"lng":53.3,"pop":60991},"nazarbd":{"cc":"IR","lat":35.95,"lng":50.61,"pop":213388},"nazarabad":{"cc":"IR","lat":35.95,"lng":50.61,"pop":213388},"naqadeh":{"cc":"IR","lat":36.96,"lng":45.39,"pop":81598},"nahavand":{"cc":"IR","lat":34.19,"lng":48.37,"pop":76250},"nahvand":{"cc":"IR","lat":34.19,"lng":48.37,"pop":76250},"meshkn dasht":{"cc":"IR","lat":35.75,"lng":50.94,"pop":62005},"meshkin dasht":{"cc":"IR","lat":35.75,"lng":50.94,"pop":62005},"mnb":{"cc":"IR","lat":27.13,"lng":57.09,"pop":97986},"minab":{"cc":"IR","lat":27.13,"lng":57.09,"pop":97986},"mianeh":{"cc":"IR","lat":37.42,"lng":47.72,"pop":106291},"mneh":{"cc":"IR","lat":37.42,"lng":47.72,"pop":106291},"miandoab":{"cc":"IR","lat":36.97,"lng":46.11,"pop":134425},"mndob":{"cc":"IR","lat":36.97,"lng":46.11,"pop":134425},"meybod":{"cc":"IR","lat":32.25,"lng":54.02,"pop":51874},"meshgn shahr":{"cc":"IR","lat":38.4,"lng":47.68,"pop":74109},"meshgin shahr":{"cc":"IR","lat":38.4,"lng":47.68,"pop":74109},"masjed soleymn":{"cc":"IR","lat":31.94,"lng":49.3,"pop":100497},"masjed soleyman":{"cc":"IR","lat":31.94,"lng":49.3,"pop":100497},"mashhad":{"cc":"IR","lat":36.3,"lng":59.61,"pop":2307177},"marvdasht":{"cc":"IR","lat":29.87,"lng":52.8,"pop":148858},"marvn":{"cc":"IR","lat":35.52,"lng":46.18,"pop":136654},"marivan":{"cc":"IR","lat":35.52,"lng":46.18,"pop":136654},"mhdsht":{"cc":"IR","lat":35.73,"lng":50.81,"pop":62910},"mahdasht":{"cc":"IR","lat":35.73,"lng":50.81,"pop":62910},"marand":{"cc":"IR","lat":38.43,"lng":45.77,"pop":124191},"margheh":{"cc":"IR","lat":37.39,"lng":46.24,"pop":262604},"maragheh":{"cc":"IR","lat":37.39,"lng":46.24,"pop":262604},"malyer":{"cc":"IR","lat":34.3,"lng":48.82,"pop":170237},"malayer":{"cc":"IR","lat":34.3,"lng":48.82,"pop":170237},"malrd":{"cc":"IR","lat":35.67,"lng":50.98,"pop":56745},"malard":{"cc":"IR","lat":35.67,"lng":50.98,"pop":56745},"mahabad":{"cc":"IR","lat":36.76,"lng":45.72,"pop":168393},"mahbd":{"cc":"IR","lat":36.76,"lng":45.72,"pop":168393},"lar":{"cc":"IR","lat":27.68,"lng":54.34,"pop":62045},"langard":{"cc":"IR","lat":37.2,"lng":50.15,"pop":68148},"langarud":{"cc":"IR","lat":37.2,"lng":50.15,"pop":68148},"lhjn":{"cc":"IR","lat":37.2,"lng":50.01,"pop":101073},"lahijan":{"cc":"IR","lat":37.2,"lng":50.01,"pop":101073},"kut-e abdollah":{"cc":"IR","lat":31.24,"lng":48.66,"pop":56252},"kt-e abdollh":{"cc":"IR","lat":31.24,"lng":48.66,"pop":56252},"kuhdasht":{"cc":"IR","lat":33.53,"lng":47.61,"pop":89091},"khdasht":{"cc":"IR","lat":33.53,"lng":47.61,"pop":89091},"khy":{"cc":"IR","lat":38.55,"lng":44.95,"pop":198845},"khuy":{"cc":"IR","lat":38.55,"lng":44.95,"pop":198845},"khorramshahr":{"cc":"IR","lat":30.44,"lng":48.18,"pop":330606},"khorramabad":{"cc":"IR","lat":33.49,"lng":48.36,"pop":329825},"khomeyn":{"cc":"IR","lat":33.64,"lng":50.08,"pop":77425},"khalkhl":{"cc":"IR","lat":37.62,"lng":48.53,"pop":51024},"khalkhal":{"cc":"IR","lat":37.62,"lng":48.53,"pop":51024},"kermanshah":{"cc":"IR","lat":34.31,"lng":47.06,"pop":621100},"kerman":{"cc":"IR","lat":30.28,"lng":57.08,"pop":577514},"kzern":{"cc":"IR","lat":29.62,"lng":51.65,"pop":112360},"kazerun":{"cc":"IR","lat":29.62,"lng":51.65,"pop":112360},"kashmar":{"cc":"IR","lat":35.24,"lng":58.47,"pop":131517},"kshmar":{"cc":"IR","lat":35.24,"lng":58.47,"pop":131517},"kashan":{"cc":"IR","lat":33.98,"lng":51.43,"pop":304487},"karaj":{"cc":"IR","lat":35.83,"lng":50.99,"pop":1448075},"kangavar":{"cc":"IR","lat":34.5,"lng":47.97,"pop":51352},"kangvar":{"cc":"IR","lat":34.5,"lng":47.97,"pop":51352},"bandar-e kangn":{"cc":"IR","lat":27.83,"lng":52.06,"pop":60187},"bandar-e kangan":{"cc":"IR","lat":27.83,"lng":52.06,"pop":60187},"kamyaran":{"cc":"IR","lat":34.8,"lng":46.94,"pop":57077},"kmyrn":{"cc":"IR","lat":34.8,"lng":46.94,"pop":57077},"jahrom":{"cc":"IR","lat":28.5,"lng":53.56,"pop":141634},"izeh":{"cc":"IR","lat":31.83,"lng":49.87,"pop":119399},"zeh":{"cc":"IR","lat":31.83,"lng":49.87,"pop":119399},"lm":{"cc":"IR","lat":33.64,"lng":46.42,"pop":140940},"ilam":{"cc":"IR","lat":33.64,"lng":46.42,"pop":140940},"hashtgerd":{"cc":"IR","lat":35.96,"lng":50.68,"pop":55640},"harsin":{"cc":"IR","lat":34.27,"lng":47.59,"pop":57647},"harsn":{"cc":"IR","lat":34.27,"lng":47.59,"pop":57647},"hamadn":{"cc":"IR","lat":34.8,"lng":48.51,"pop":528256},"hamadan":{"cc":"IR","lat":34.8,"lng":48.51,"pop":528256},"gorgn":{"cc":"IR","lat":36.84,"lng":54.44,"pop":244937},"gorgan":{"cc":"IR","lat":36.84,"lng":54.44,"pop":244937},"gonbad-e kvs":{"cc":"IR","lat":37.25,"lng":55.17,"pop":151910},"gonbad-e kavus":{"cc":"IR","lat":37.25,"lng":55.17,"pop":151910},"golpayegan":{"cc":"IR","lat":33.45,"lng":50.29,"pop":58936},"golpyegn":{"cc":"IR","lat":33.45,"lng":50.29,"pop":58936},"bandar-e genveh":{"cc":"IR","lat":29.58,"lng":50.52,"pop":52750},"bandar-e genaveh":{"cc":"IR","lat":29.58,"lng":50.52,"pop":52750},"frzbd":{"cc":"IR","lat":28.84,"lng":52.57,"pop":65417},"firuzabad":{"cc":"IR","lat":28.84,"lng":52.57,"pop":65417},"fasa":{"cc":"IR","lat":28.94,"lng":53.65,"pop":98061},"fas":{"cc":"IR","lat":28.94,"lng":53.65,"pop":98061},"eslamabad-e gharb":{"cc":"IR","lat":34.11,"lng":46.53,"pop":90559},"eslmbd-e gharb":{"cc":"IR","lat":34.11,"lng":46.53,"pop":90559},"esfarayen":{"cc":"IR","lat":37.08,"lng":57.51,"pop":59490},"esfaryen":{"cc":"IR","lat":37.08,"lng":57.51,"pop":59490},"shahrud":{"cc":"IR","lat":36.42,"lng":54.98,"pop":165000},"dorud":{"cc":"IR","lat":33.49,"lng":49.06,"pop":121638},"dord":{"cc":"IR","lat":33.49,"lng":49.06,"pop":121638},"dogonbadan":{"cc":"IR","lat":30.36,"lng":50.8,"pop":96728},"dezful":{"cc":"IR","lat":32.38,"lng":48.41,"pop":264709},"dehdasht":{"cc":"IR","lat":30.79,"lng":50.57,"pop":57036},"ssangerd":{"cc":"IR","lat":31.56,"lng":48.19,"pop":51431},"susangerd":{"cc":"IR","lat":31.56,"lng":48.19,"pop":51431},"darab":{"cc":"IR","lat":28.75,"lng":54.54,"pop":70232},"drb":{"cc":"IR","lat":28.75,"lng":54.54,"pop":70232},"dmghn":{"cc":"IR","lat":36.17,"lng":54.34,"pop":67694},"damghan":{"cc":"IR","lat":36.17,"lng":54.34,"pop":67694},"chenrn":{"cc":"IR","lat":36.65,"lng":59.12,"pop":53879},"chenaran":{"cc":"IR","lat":36.65,"lng":59.12,"pop":53879},"chalus":{"cc":"IR","lat":36.66,"lng":51.42,"pop":107490},"chls":{"cc":"IR","lat":36.66,"lng":51.42,"pop":107490},"bushehr":{"cc":"IR","lat":28.97,"lng":50.84,"pop":165377},"bmahen":{"cc":"IR","lat":35.73,"lng":51.87,"pop":79034},"bumahen":{"cc":"IR","lat":35.73,"lng":51.87,"pop":79034},"bkn":{"cc":"IR","lat":36.52,"lng":46.21,"pop":193501},"bukan":{"cc":"IR","lat":36.52,"lng":46.21,"pop":193501},"borjerd":{"cc":"IR","lat":33.9,"lng":48.75,"pop":251958},"borujerd":{"cc":"IR","lat":33.9,"lng":48.75,"pop":251958},"borujen":{"cc":"IR","lat":31.97,"lng":51.29,"pop":57071},"borjen":{"cc":"IR","lat":31.97,"lng":51.29,"pop":57071},"borazjan":{"cc":"IR","lat":29.27,"lng":51.22,"pop":110567},"borzjn":{"cc":"IR","lat":29.27,"lng":51.22,"pop":110567},"bojnrd":{"cc":"IR","lat":37.47,"lng":57.33,"pop":192041},"bojnurd":{"cc":"IR","lat":37.47,"lng":57.33,"pop":192041},"brjand":{"cc":"IR","lat":32.87,"lng":59.22,"pop":196982},"birjand":{"cc":"IR","lat":32.87,"lng":59.22,"pop":196982},"bijar":{"cc":"IR","lat":35.87,"lng":47.61,"pop":50014},"bjr":{"cc":"IR","lat":35.87,"lng":47.61,"pop":50014},"bonb":{"cc":"IR","lat":37.34,"lng":46.06,"pop":80359},"bonab":{"cc":"IR","lat":37.34,"lng":46.06,"pop":80359},"behshahr":{"cc":"IR","lat":36.69,"lng":53.55,"pop":94702},"behbahan":{"cc":"IR","lat":30.6,"lng":50.24,"pop":122604},"behbahn":{"cc":"IR","lat":30.6,"lng":50.24,"pop":122604},"baneh":{"cc":"IR","lat":36.0,"lng":45.89,"pop":110218},"bneh":{"cc":"IR","lat":36.0,"lng":45.89,"pop":110218},"bandar-e torkaman":{"cc":"IR","lat":36.9,"lng":54.07,"pop":53970},"bandar-e mahshahr":{"cc":"IR","lat":30.56,"lng":49.19,"pop":162797},"bandar-e mhshahr":{"cc":"IR","lat":30.56,"lng":49.19,"pop":162797},"bandar-e anzali":{"cc":"IR","lat":37.47,"lng":49.46,"pop":118564},"bandar-e anzal":{"cc":"IR","lat":37.47,"lng":49.46,"pop":118564},"bandar abbas":{"cc":"IR","lat":27.19,"lng":56.28,"pop":352173},"bam":{"cc":"IR","lat":29.11,"lng":58.36,"pop":99268},"bbol":{"cc":"IR","lat":36.55,"lng":52.68,"pop":202796},"babol":{"cc":"IR","lat":36.55,"lng":52.68,"pop":202796},"asadabad":{"cc":"IR","lat":34.78,"lng":48.12,"pop":55703},"asadbd":{"cc":"IR","lat":34.78,"lng":48.12,"pop":55703},"ardakn":{"cc":"IR","lat":32.31,"lng":54.02,"pop":58834},"ardakan":{"cc":"IR","lat":32.31,"lng":54.02,"pop":58834},"ardabil":{"cc":"IR","lat":38.25,"lng":48.29,"pop":410753},"ardabl":{"cc":"IR","lat":38.25,"lng":48.29,"pop":410753},"rn bdgol":{"cc":"IR","lat":34.06,"lng":51.48,"pop":65404},"aran bidgol":{"cc":"IR","lat":34.06,"lng":51.48,"pop":65404},"arak":{"cc":"IR","lat":34.09,"lng":49.7,"pop":503647},"ark":{"cc":"IR","lat":34.09,"lng":49.7,"pop":503647},"andimeshk":{"cc":"IR","lat":32.46,"lng":48.35,"pop":135116},"andmeshk":{"cc":"IR","lat":32.46,"lng":48.35,"pop":135116},"amol":{"cc":"IR","lat":36.47,"lng":52.35,"pop":237528},"mol":{"cc":"IR","lat":36.47,"lng":52.35,"pop":237528},"shahrr":{"cc":"IR","lat":35.66,"lng":51.06,"pop":309607},"shahriar":{"cc":"IR","lat":35.66,"lng":51.06,"pop":309607},"algdarz":{"cc":"IR","lat":33.4,"lng":49.69,"pop":89268},"aligudarz":{"cc":"IR","lat":33.4,"lng":49.69,"pop":89268},"al bd-e katl":{"cc":"IR","lat":36.91,"lng":54.87,"pop":52838},"ali abad-e katul":{"cc":"IR","lat":36.91,"lng":54.87,"pop":52838},"ahvaz":{"cc":"IR","lat":31.32,"lng":48.68,"pop":841145},"ahar":{"cc":"IR","lat":38.48,"lng":47.07,"pop":100641},"byek":{"cc":"IR","lat":36.04,"lng":50.53,"pop":60107},"abyek":{"cc":"IR","lat":36.04,"lng":50.53,"pop":60107},"abhar":{"cc":"IR","lat":36.15,"lng":49.22,"pop":69889},"abadan":{"cc":"IR","lat":30.34,"lng":48.3,"pop":231476},"mohammad shahr":{"cc":"IR","lat":35.76,"lng":50.92,"pop":119418},"moammad shahr":{"cc":"IR","lat":35.76,"lng":50.92,"pop":119418},"bqershahr":{"cc":"IR","lat":35.53,"lng":51.4,"pop":65388},"baqershahr":{"cc":"IR","lat":35.53,"lng":51.4,"pop":65388},"shhn shahr":{"cc":"IR","lat":32.86,"lng":51.55,"pop":173329},"shahin shahr":{"cc":"IR","lat":32.86,"lng":51.55,"pop":173329},"zarrn shahr":{"cc":"IR","lat":32.39,"lng":51.38,"pop":55817},"zarrin shahr":{"cc":"IR","lat":32.39,"lng":51.38,"pop":55817},"shahre":{"cc":"IR","lat":32.01,"lng":51.86,"pop":134952},"shahreza":{"cc":"IR","lat":32.01,"lng":51.86,"pop":134952},"najafbd":{"cc":"IR","lat":32.63,"lng":51.37,"pop":235281},"najafabad":{"cc":"IR","lat":32.63,"lng":51.37,"pop":235281},"mobrakeh":{"cc":"IR","lat":32.35,"lng":51.5,"pop":69449},"mobarakeh":{"cc":"IR","lat":32.35,"lng":51.5,"pop":69449},"khomeyn shahr":{"cc":"IR","lat":32.69,"lng":51.54,"pop":277334},"khomeyni shahr":{"cc":"IR","lat":32.69,"lng":51.54,"pop":277334},"fld shahr":{"cc":"IR","lat":32.49,"lng":51.4,"pop":88426},"fulad shahr":{"cc":"IR","lat":32.49,"lng":51.4,"pop":88426},"isfahan":{"cc":"IR","lat":32.65,"lng":51.67,"pop":1547164},"baharestan":{"cc":"IR","lat":32.49,"lng":51.77,"pop":106433},"bahrestn":{"cc":"IR","lat":32.49,"lng":51.77,"pop":106433},"eslamshahr":{"cc":"IR","lat":35.55,"lng":51.24,"pop":450000},"zbol":{"cc":"IR","lat":31.03,"lng":61.49,"pop":121989},"zabol":{"cc":"IR","lat":31.03,"lng":61.49,"pop":121989},"zahedan":{"cc":"IR","lat":29.5,"lng":60.86,"pop":551980},"torbat-e jam":{"cc":"IR","lat":35.24,"lng":60.62,"pop":58928},"torbat-e jm":{"cc":"IR","lat":35.24,"lng":60.62,"pop":58928},"sarvn":{"cc":"IR","lat":27.37,"lng":62.33,"pop":60014},"saravan":{"cc":"IR","lat":27.37,"lng":62.33,"pop":60014},"khash":{"cc":"IR","lat":28.22,"lng":61.22,"pop":69603},"khsh":{"cc":"IR","lat":28.22,"lng":61.22,"pop":69603},"iranshahr":{"cc":"IR","lat":27.2,"lng":60.68,"pop":131232},"shahr-e adr":{"cc":"IR","lat":29.8,"lng":52.5,"pop":122226},"shahr-e sadra":{"cc":"IR","lat":29.8,"lng":52.5,"pop":122226},"fards":{"cc":"IR","lat":35.76,"lng":51.0,"pop":181174},"fardis":{"cc":"IR","lat":35.76,"lng":51.0,"pop":181174},"parand":{"cc":"IR","lat":35.47,"lng":50.98,"pop":97464},"mohammadiyeh":{"cc":"IR","lat":36.22,"lng":50.18,"pop":90513},"moammadyeh":{"cc":"IR","lat":36.22,"lng":50.18,"pop":90513},"shahrak-e pardsn":{"cc":"IR","lat":34.56,"lng":50.8,"pop":100000},"shahrak-e pardisan":{"cc":"IR","lat":34.56,"lng":50.8,"pop":100000},"abbshahr":{"cc":"IR","lat":35.58,"lng":51.11,"pop":53971},"sabbashahr":{"cc":"IR","lat":35.58,"lng":51.11,"pop":53971},"nasm shahr":{"cc":"IR","lat":35.57,"lng":51.16,"pop":200393},"nasim shahr":{"cc":"IR","lat":35.57,"lng":51.16,"pop":200393},"pards":{"cc":"IR","lat":35.75,"lng":51.81,"pop":114249},"pardis":{"cc":"IR","lat":35.75,"lng":51.81,"pop":114249},"kshn":{"cc":"IR","lat":34.0,"lng":51.44,"pop":304487},"jiroft":{"cc":"IR","lat":28.68,"lng":57.74,"pop":130429},"jroft":{"cc":"IR","lat":28.68,"lng":57.74,"pop":130429},"kahnuj":{"cc":"IR","lat":27.94,"lng":57.7,"pop":52624},"kahnj":{"cc":"IR","lat":27.94,"lng":57.7,"pop":52624},"bandar-e emam khomeyni":{"cc":"IR","lat":30.44,"lng":49.1,"pop":78353},"mehestan":{"cc":"IR","lat":35.99,"lng":50.75,"pop":85200},"pakdasht":{"cc":"IR","lat":35.48,"lng":51.68,"pop":236319},"pkdasht":{"cc":"IR","lat":35.48,"lng":51.68,"pop":236319},"andisheh":{"cc":"IR","lat":35.75,"lng":51.28,"pop":116062},"andsheh":{"cc":"IR","lat":35.75,"lng":51.28,"pop":116062},"nasimshahr":{"cc":"IR","lat":35.57,"lng":51.16,"pop":200393},"baghestan":{"cc":"IR","lat":35.65,"lng":51.13,"pop":83934},"bghestn":{"cc":"IR","lat":35.65,"lng":51.13,"pop":83934},"sahand":{"cc":"IR","lat":37.95,"lng":46.11,"pop":82494},"reykjavk":{"cc":"IS","lat":64.14,"lng":-21.9,"pop":118918},"reykjavik":{"cc":"IS","lat":64.14,"lng":-21.9,"pop":118918},"vittoria":{"cc":"IT","lat":36.95,"lng":14.53,"pop":50852},"trapani":{"cc":"IT","lat":38.02,"lng":12.54,"pop":67531},"siracusa":{"cc":"IT","lat":37.08,"lng":15.29,"pop":121605},"reggio calabria":{"cc":"IT","lat":38.11,"lng":15.66,"pop":182455},"ragusa":{"cc":"IT","lat":36.93,"lng":14.72,"pop":74251},"quartu santelena":{"cc":"IT","lat":39.23,"lng":9.25,"pop":66620},"palermo":{"cc":"IT","lat":38.12,"lng":13.36,"pop":648260},"modica":{"cc":"IT","lat":36.86,"lng":14.76,"pop":54456},"messina":{"cc":"IT","lat":38.19,"lng":15.55,"pop":219948},"mazara del vallo":{"cc":"IT","lat":37.66,"lng":12.59,"pop":51534},"marsala":{"cc":"IT","lat":37.8,"lng":12.44,"pop":77915},"gela":{"cc":"IT","lat":37.07,"lng":14.24,"pop":75001},"crotone":{"cc":"IT","lat":39.08,"lng":17.13,"pop":64603},"cosenza":{"cc":"IT","lat":39.3,"lng":16.25,"pop":63852},"catanzaro":{"cc":"IT","lat":38.88,"lng":16.6,"pop":78970},"catania":{"cc":"IT","lat":37.49,"lng":15.07,"pop":311584},"caltanissetta":{"cc":"IT","lat":37.49,"lng":14.06,"pop":62797},"cagliari":{"cc":"IT","lat":39.23,"lng":9.12,"pop":149257},"bagheria":{"cc":"IT","lat":38.08,"lng":13.51,"pop":53149},"vigevano":{"cc":"IT","lat":45.31,"lng":8.85,"pop":57970},"vicenza":{"cc":"IT","lat":45.55,"lng":11.55,"pop":111980},"viareggio":{"cc":"IT","lat":43.87,"lng":10.25,"pop":62169},"verona":{"cc":"IT","lat":45.44,"lng":10.99,"pop":258031},"venice":{"cc":"IT","lat":45.44,"lng":12.33,"pop":51298},"velletri":{"cc":"IT","lat":41.69,"lng":12.78,"pop":52911},"varese":{"cc":"IT","lat":45.82,"lng":8.83,"pop":80588},"udine":{"cc":"IT","lat":46.07,"lng":13.24,"pop":100170},"trieste":{"cc":"IT","lat":45.65,"lng":13.78,"pop":204338},"treviso":{"cc":"IT","lat":45.67,"lng":12.24,"pop":85760},"trento":{"cc":"IT","lat":46.07,"lng":11.12,"pop":120709},"trani":{"cc":"IT","lat":41.28,"lng":16.41,"pop":53981},"torre del greco":{"cc":"IT","lat":40.79,"lng":14.37,"pop":85332},"turin":{"cc":"IT","lat":45.07,"lng":7.69,"pop":847287},"terni":{"cc":"IT","lat":42.56,"lng":12.64,"pop":111189},"teramo":{"cc":"IT","lat":42.66,"lng":13.7,"pop":54338},"taranto":{"cc":"IT","lat":40.46,"lng":17.25,"pop":198585},"siena":{"cc":"IT","lat":43.32,"lng":11.33,"pop":53901},"sesto san giovanni":{"cc":"IT","lat":45.53,"lng":9.23,"pop":81822},"secondigliano":{"cc":"IT","lat":40.9,"lng":14.27,"pop":51874},"savona":{"cc":"IT","lat":44.31,"lng":8.48,"pop":61345},"sassari":{"cc":"IT","lat":40.73,"lng":8.56,"pop":91895},"san severo":{"cc":"IT","lat":41.69,"lng":15.38,"pop":51919},"salerno":{"cc":"IT","lat":40.68,"lng":14.79,"pop":125797},"rovigo":{"cc":"IT","lat":45.07,"lng":11.79,"pop":50279},"rome":{"cc":"IT","lat":41.89,"lng":12.51,"pop":2318895},"rimini":{"cc":"IT","lat":44.06,"lng":12.57,"pop":148688},"reggio nellemilia":{"cc":"IT","lat":44.7,"lng":10.63,"pop":171944},"ravenna":{"cc":"IT","lat":44.41,"lng":12.2,"pop":80868},"quarto oggiaro":{"cc":"IT","lat":45.51,"lng":9.14,"pop":182118},"prato":{"cc":"IT","lat":43.88,"lng":11.1,"pop":195089},"pozzuoli":{"cc":"IT","lat":40.84,"lng":14.1,"pop":81231},"potenza":{"cc":"IT","lat":40.64,"lng":15.81,"pop":56433},"portici":{"cc":"IT","lat":40.82,"lng":14.34,"pop":53801},"ponticelli":{"cc":"IT","lat":40.85,"lng":14.33,"pop":52284},"pistoia":{"cc":"IT","lat":43.93,"lng":10.92,"pop":73832},"pisa":{"cc":"IT","lat":43.71,"lng":10.4,"pop":109960},"pianura":{"cc":"IT","lat":40.86,"lng":14.17,"pop":57821},"piacenza":{"cc":"IT","lat":45.05,"lng":9.69,"pop":103607},"pescara":{"cc":"IT","lat":42.46,"lng":14.2,"pop":119554},"pesaro":{"cc":"IT","lat":43.91,"lng":12.92,"pop":77241},"perugia":{"cc":"IT","lat":43.11,"lng":12.39,"pop":120137},"pavia":{"cc":"IT","lat":45.19,"lng":9.16,"pop":65734},"padua":{"cc":"IT","lat":45.41,"lng":11.89,"pop":203725},"olbia":{"cc":"IT","lat":40.92,"lng":9.5,"pop":60345},"novara":{"cc":"IT","lat":45.45,"lng":8.62,"pop":101916},"naples":{"cc":"IT","lat":40.85,"lng":14.27,"pop":909048},"monza":{"cc":"IT","lat":45.58,"lng":9.27,"pop":124398},"montesilvano":{"cc":"IT","lat":42.51,"lng":14.15,"pop":53275},"moncalieri":{"cc":"IT","lat":45.0,"lng":7.68,"pop":56134},"molfetta":{"cc":"IT","lat":41.2,"lng":16.6,"pop":59557},"modena":{"cc":"IT","lat":44.65,"lng":10.93,"pop":184732},"milan":{"cc":"IT","lat":45.46,"lng":9.19,"pop":1371498},"mestre":{"cc":"IT","lat":45.49,"lng":12.25,"pop":147662},"matera":{"cc":"IT","lat":40.67,"lng":16.6,"pop":60403},"massa":{"cc":"IT","lat":44.04,"lng":10.14,"pop":64783},"manfredonia":{"cc":"IT","lat":41.63,"lng":15.92,"pop":56932},"lucca":{"cc":"IT","lat":43.84,"lng":10.5,"pop":81748},"livorno":{"cc":"IT","lat":43.54,"lng":10.33,"pop":157017},"lido di ostia":{"cc":"IT","lat":41.73,"lng":12.28,"pop":85301},"legnano":{"cc":"IT","lat":45.6,"lng":8.92,"pop":57589},"lecce":{"cc":"IT","lat":40.35,"lng":18.17,"pop":80695},"la spezia":{"cc":"IT","lat":44.1,"lng":9.82,"pop":93288},"imola":{"cc":"IT","lat":44.36,"lng":11.71,"pop":69953},"grosseto":{"cc":"IT","lat":42.76,"lng":11.11,"pop":60922},"giugliano in campania":{"cc":"IT","lat":40.93,"lng":14.2,"pop":80269},"genoa":{"cc":"IT","lat":44.4,"lng":8.94,"pop":580097},"gallarate":{"cc":"IT","lat":45.66,"lng":8.79,"pop":50439},"fuorigrotta":{"cc":"IT","lat":40.83,"lng":14.2,"pop":76521},"forl":{"cc":"IT","lat":44.22,"lng":12.04,"pop":116696},"forli":{"cc":"IT","lat":44.22,"lng":12.04,"pop":116696},"foligno":{"cc":"IT","lat":42.95,"lng":12.7,"pop":56918},"foggia":{"cc":"IT","lat":41.46,"lng":15.55,"pop":137032},"florence":{"cc":"IT","lat":43.78,"lng":11.25,"pop":367150},"ferrara":{"cc":"IT","lat":44.84,"lng":11.62,"pop":132009},"fano":{"cc":"IT","lat":43.84,"lng":13.02,"pop":60978},"ercolano":{"cc":"IT","lat":40.81,"lng":14.35,"pop":53576},"cuneo":{"cc":"IT","lat":44.39,"lng":7.55,"pop":55980},"cremona":{"cc":"IT","lat":45.13,"lng":10.02,"pop":71223},"como":{"cc":"IT","lat":45.81,"lng":9.08,"pop":84808},"cinisello balsamo":{"cc":"IT","lat":45.56,"lng":9.21,"pop":75943},"cesena":{"cc":"IT","lat":44.14,"lng":12.24,"pop":97137},"cerignola":{"cc":"IT","lat":41.27,"lng":15.9,"pop":54056},"cava de tirreni":{"cc":"IT","lat":40.7,"lng":14.71,"pop":53130},"cava d tirreni":{"cc":"IT","lat":40.7,"lng":14.71,"pop":53130},"castellammare di stabia":{"cc":"IT","lat":40.7,"lng":14.49,"pop":66164},"casoria":{"cc":"IT","lat":40.91,"lng":14.29,"pop":73918},"caserta":{"cc":"IT","lat":41.07,"lng":14.33,"pop":72844},"carrara":{"cc":"IT","lat":44.08,"lng":10.1,"pop":58666},"carpi":{"cc":"IT","lat":44.78,"lng":10.88,"pop":71148},"busto arsizio":{"cc":"IT","lat":45.61,"lng":8.85,"pop":83405},"brindisi":{"cc":"IT","lat":40.63,"lng":17.94,"pop":87141},"brescia":{"cc":"IT","lat":45.54,"lng":10.21,"pop":200423},"bolzano":{"cc":"IT","lat":46.49,"lng":11.34,"pop":107436},"bologna":{"cc":"IT","lat":44.49,"lng":11.34,"pop":394843},"bitonto":{"cc":"IT","lat":41.11,"lng":16.69,"pop":51661},"bisceglie":{"cc":"IT","lat":41.24,"lng":16.5,"pop":55385},"bergamo":{"cc":"IT","lat":45.7,"lng":9.67,"pop":121200},"benevento":{"cc":"IT","lat":41.13,"lng":14.78,"pop":58418},"barletta":{"cc":"IT","lat":41.31,"lng":16.28,"pop":93279},"aversa":{"cc":"IT","lat":40.97,"lng":14.21,"pop":52974},"asti":{"cc":"IT","lat":44.9,"lng":8.21,"pop":74348},"arezzo":{"cc":"IT","lat":43.46,"lng":11.88,"pop":100734},"aprilia":{"cc":"IT","lat":41.59,"lng":12.65,"pop":74977},"andria":{"cc":"IT","lat":41.23,"lng":16.3,"pop":99784},"ancona":{"cc":"IT","lat":43.61,"lng":13.51,"pop":89994},"altamura":{"cc":"IT","lat":40.83,"lng":16.55,"pop":70539},"alessandria":{"cc":"IT","lat":44.91,"lng":8.61,"pop":92104},"afragola":{"cc":"IT","lat":40.92,"lng":14.31,"pop":64470},"acilia-castel fusano-ostia antica":{"cc":"IT","lat":41.76,"lng":12.33,"pop":129362},"acerra":{"cc":"IT","lat":40.94,"lng":14.37,"pop":59910},"guidonia montecelio":{"cc":"IT","lat":41.99,"lng":12.72,"pop":89165},"lamezia terme":{"cc":"IT","lat":38.96,"lng":16.31,"pop":70501},"san carlo allarena":{"cc":"IT","lat":40.87,"lng":14.26,"pop":69094},"pozzo strada":{"cc":"IT","lat":45.07,"lng":7.63,"pop":54766},"barriera di milano":{"cc":"IT","lat":45.09,"lng":7.69,"pop":50354},"barriera di lanzo":{"cc":"IT","lat":45.11,"lng":7.65,"pop":50000},"campo di marte":{"cc":"IT","lat":43.78,"lng":11.28,"pop":88588},"arenella":{"cc":"IT","lat":40.86,"lng":14.22,"pop":67634},"circoiscrizione i":{"cc":"IT","lat":45.07,"lng":7.69,"pop":78523},"circoiscrizione ii":{"cc":"IT","lat":45.05,"lng":7.64,"pop":141344},"circoiscrizione iii":{"cc":"IT","lat":45.06,"lng":7.63,"pop":130709},"circoiscrizione iv":{"cc":"IT","lat":45.08,"lng":7.63,"pop":98787},"circoiscrizione v":{"cc":"IT","lat":45.1,"lng":7.66,"pop":126666},"circoiscrizione vi":{"cc":"IT","lat":45.1,"lng":7.7,"pop":107369},"circoiscrizione vii":{"cc":"IT","lat":45.08,"lng":7.7,"pop":89448},"circoiscrizione viii":{"cc":"IT","lat":45.04,"lng":7.67,"pop":134028},"spanish town":{"cc":"JM","lat":17.99,"lng":-76.96,"pop":145018},"portmore":{"cc":"JM","lat":17.97,"lng":-76.89,"pop":102861},"new kingston":{"cc":"JM","lat":18.01,"lng":-76.78,"pop":583958},"montego bay":{"cc":"JM","lat":18.47,"lng":-77.92,"pop":82867},"wd as sr":{"cc":"JO","lat":31.95,"lng":35.82,"pop":181212},"wadi as sir":{"cc":"JO","lat":31.95,"lng":35.82,"pop":181212},"madaba":{"cc":"JO","lat":31.72,"lng":35.79,"pop":82335},"mdab":{"cc":"JO","lat":31.72,"lng":35.79,"pop":82335},"maan":{"cc":"JO","lat":30.2,"lng":35.73,"pop":50350},"khuraybat as sq":{"cc":"JO","lat":31.88,"lng":35.92,"pop":186158},"khuraybat as suq":{"cc":"JO","lat":31.88,"lng":35.92,"pop":186158},"ayy khild":{"cc":"JO","lat":31.99,"lng":35.84,"pop":251000},"hayy khilda":{"cc":"JO","lat":31.99,"lng":35.84,"pop":251000},"irbid":{"cc":"JO","lat":32.56,"lng":35.85,"pop":569068},"zarqa":{"cc":"JO","lat":32.07,"lng":36.09,"pop":792665},"as salt":{"cc":"JO","lat":32.04,"lng":35.73,"pop":107874},"as sal":{"cc":"JO","lat":32.04,"lng":35.73,"pop":107874},"ar ramth":{"cc":"JO","lat":32.56,"lng":36.01,"pop":155693},"ar ramtha":{"cc":"JO","lat":32.56,"lng":36.01,"pop":155693},"amman":{"cc":"JO","lat":31.96,"lng":35.95,"pop":1275857},"mafraq":{"cc":"JO","lat":32.34,"lng":36.21,"pop":57118},"aqaba":{"cc":"JO","lat":29.53,"lng":35.01,"pop":95048},"ajln":{"cc":"JO","lat":32.33,"lng":35.75,"pop":125557},"ajlun":{"cc":"JO","lat":32.33,"lng":35.75,"pop":125557},"russeifa":{"cc":"JO","lat":32.02,"lng":36.05,"pop":268237},"az zulayl":{"cc":"JO","lat":32.12,"lng":36.28,"pop":50931},"rukban":{"cc":"JO","lat":33.31,"lng":38.7,"pop":85000},"uwayli":{"cc":"JO","lat":32.02,"lng":35.84,"pop":151016},"suwaylih":{"cc":"JO","lat":32.02,"lng":35.84,"pop":151016},"marj al hamam":{"cc":"JO","lat":31.9,"lng":35.85,"pop":82788},"atsugi":{"cc":"JP","lat":35.44,"lng":139.37,"pop":223960},"akashi":{"cc":"JP","lat":34.66,"lng":135.01,"pop":303601},"zushi":{"cc":"JP","lat":35.29,"lng":139.58,"pop":60055},"zama":{"cc":"JP","lat":35.49,"lng":139.39,"pop":132325},"yukuhashi":{"cc":"JP","lat":33.73,"lng":130.98,"pop":71426},"yki":{"cc":"JP","lat":36.3,"lng":139.88,"pop":50645},"yuki":{"cc":"JP","lat":36.3,"lng":139.88,"pop":50645},"yoshikawa":{"cc":"JP","lat":35.89,"lng":139.84,"pop":73262},"yono":{"cc":"JP","lat":35.88,"lng":139.63,"pop":102364},"yonago":{"cc":"JP","lat":35.43,"lng":133.33,"pop":148720},"yokota":{"cc":"JP","lat":35.75,"lng":139.38,"pop":69550},"yokosuka":{"cc":"JP","lat":35.28,"lng":139.67,"pop":409478},"yokohama":{"cc":"JP","lat":35.43,"lng":139.65,"pop":3777491},"yokkaichi":{"cc":"JP","lat":34.97,"lng":136.62,"pop":305424},"youkaichi":{"cc":"JP","lat":35.12,"lng":136.2,"pop":112819},"yawata":{"cc":"JP","lat":34.87,"lng":135.7,"pop":71656},"honmachi":{"cc":"JP","lat":32.5,"lng":130.6,"pop":123067},"yashio":{"cc":"JP","lat":35.82,"lng":139.84,"pop":93363},"yao":{"cc":"JP","lat":34.62,"lng":135.6,"pop":273213},"yanagawa":{"cc":"JP","lat":33.17,"lng":130.4,"pop":64475},"yamato-takada":{"cc":"JP","lat":34.52,"lng":135.75,"pop":61744},"yamaguchi":{"cc":"JP","lat":34.18,"lng":131.47,"pop":193966},"yaizu":{"cc":"JP","lat":34.87,"lng":138.32,"pop":139578},"utsunomiya":{"cc":"JP","lat":36.57,"lng":139.88,"pop":518757},"urayasu":{"cc":"JP","lat":35.66,"lng":139.9,"pop":171362},"uji":{"cc":"JP","lat":34.89,"lng":135.8,"pop":192925},"ueno-ebisumachi":{"cc":"JP","lat":34.76,"lng":136.13,"pop":61598},"ueda":{"cc":"JP","lat":36.4,"lng":138.28,"pop":157480},"ube":{"cc":"JP","lat":33.94,"lng":131.25,"pop":173733},"tsuyama":{"cc":"JP","lat":35.05,"lng":134.0,"pop":102294},"tsushima":{"cc":"JP","lat":35.17,"lng":136.72,"pop":67658},"tsurusaki":{"cc":"JP","lat":33.25,"lng":131.69,"pop":76968},"tsuruoka":{"cc":"JP","lat":38.72,"lng":139.82,"pop":125389},"tsuruga":{"cc":"JP","lat":35.65,"lng":136.06,"pop":68482},"tsubame":{"cc":"JP","lat":37.66,"lng":138.93,"pop":77382},"tsu":{"cc":"JP","lat":35.0,"lng":135.87,"pop":345070},"toyota":{"cc":"JP","lat":35.08,"lng":137.15,"pop":426162},"toyooka":{"cc":"JP","lat":35.54,"lng":134.82,"pop":78348},"toyonaka":{"cc":"JP","lat":34.78,"lng":135.47,"pop":401558},"toyokawa":{"cc":"JP","lat":34.82,"lng":137.4,"pop":184661},"toyohashi":{"cc":"JP","lat":34.77,"lng":137.38,"pop":377453},"toyama":{"cc":"JP","lat":36.7,"lng":137.22,"pop":415844},"tottori-shi":{"cc":"JP","lat":35.5,"lng":134.23,"pop":188465},"tosu":{"cc":"JP","lat":33.37,"lng":130.52,"pop":74196},"tondabayashich":{"cc":"JP","lat":34.5,"lng":135.6,"pop":132873},"tondabayashicho":{"cc":"JP","lat":34.5,"lng":135.6,"pop":132873},"tomigusuku":{"cc":"JP","lat":26.19,"lng":127.68,"pop":64612},"tokyo":{"cc":"JP","lat":35.69,"lng":139.69,"pop":9733276},"tokuyama":{"cc":"JP","lat":34.05,"lng":131.82,"pop":101133},"tokushima":{"cc":"JP","lat":34.07,"lng":134.57,"pop":267345},"tokorozawa":{"cc":"JP","lat":35.8,"lng":139.47,"pop":344194},"tokoname":{"cc":"JP","lat":34.88,"lng":136.85,"pop":58710},"toki":{"cc":"JP","lat":35.35,"lng":137.18,"pop":58567},"tkamachi":{"cc":"JP","lat":37.13,"lng":138.77,"pop":53333},"tokamachi":{"cc":"JP","lat":37.13,"lng":138.77,"pop":53333},"tochigi":{"cc":"JP","lat":36.38,"lng":139.73,"pop":159056},"tenri":{"cc":"JP","lat":34.58,"lng":135.83,"pop":71052},"tateyama":{"cc":"JP","lat":34.98,"lng":139.87,"pop":50064},"tatebayashi":{"cc":"JP","lat":36.25,"lng":139.53,"pop":81274},"nishi-tokyo-shi":{"cc":"JP","lat":35.73,"lng":139.54,"pop":207388},"tanashich":{"cc":"JP","lat":35.73,"lng":139.54,"pop":82112},"tanashicho":{"cc":"JP","lat":35.73,"lng":139.54,"pop":82112},"tanabe":{"cc":"JP","lat":33.73,"lng":135.37,"pop":70972},"tamano":{"cc":"JP","lat":34.52,"lng":133.95,"pop":67786},"tamana":{"cc":"JP","lat":32.95,"lng":130.57,"pop":64292},"takefu":{"cc":"JP","lat":35.9,"lng":136.17,"pop":75753},"takayama":{"cc":"JP","lat":36.13,"lng":137.25,"pop":88473},"takatsuki":{"cc":"JP","lat":34.85,"lng":135.62,"pop":354468},"takasaki":{"cc":"JP","lat":36.33,"lng":139.02,"pop":372973},"takarazuka":{"cc":"JP","lat":34.8,"lng":135.36,"pop":226432},"takaoka":{"cc":"JP","lat":36.75,"lng":137.02,"pop":170077},"takamatsu":{"cc":"JP","lat":34.33,"lng":134.05,"pop":418994},"takaishi":{"cc":"JP","lat":34.52,"lng":135.43,"pop":60511},"tajimi":{"cc":"JP","lat":35.32,"lng":137.13,"pop":107818},"tahara":{"cc":"JP","lat":34.67,"lng":137.27,"pop":60206},"tagawa":{"cc":"JP","lat":33.63,"lng":130.8,"pop":51608},"suzuka":{"cc":"JP","lat":34.88,"lng":136.58,"pop":195670},"suzaka":{"cc":"JP","lat":36.65,"lng":138.32,"pop":54022},"sumida":{"cc":"JP","lat":35.73,"lng":139.82,"pop":287766},"suita":{"cc":"JP","lat":34.76,"lng":135.52,"pop":385567},"soka":{"cc":"JP","lat":35.84,"lng":139.8,"pop":249645},"ska":{"cc":"JP","lat":35.84,"lng":139.8,"pop":249645},"soja":{"cc":"JP","lat":34.68,"lng":133.75,"pop":69030},"sja":{"cc":"JP","lat":34.68,"lng":133.75,"pop":69030},"shizuoka":{"cc":"JP","lat":34.98,"lng":138.38,"pop":693389},"shiraoka":{"cc":"JP","lat":36.02,"lng":139.66,"pop":52214},"shiojiri":{"cc":"JP","lat":36.1,"lng":137.97,"pop":67241},"shinagawa":{"cc":"JP","lat":33.64,"lng":133.01,"pop":422488},"shimonoseki":{"cc":"JP","lat":33.96,"lng":130.94,"pop":265684},"shimodate":{"cc":"JP","lat":36.3,"lng":139.98,"pop":63666},"minato":{"cc":"JP","lat":34.22,"lng":135.15,"pop":375339},"shimada":{"cc":"JP","lat":34.82,"lng":138.18,"pop":95719},"shiki":{"cc":"JP","lat":35.83,"lng":139.58,"pop":76445},"shibukawa":{"cc":"JP","lat":36.48,"lng":139.0,"pop":76098},"shibata":{"cc":"JP","lat":37.95,"lng":139.33,"pop":96236},"settsu":{"cc":"JP","lat":34.78,"lng":135.6,"pop":87456},"seto":{"cc":"JP","lat":35.23,"lng":137.1,"pop":127792},"sendai":{"cc":"JP","lat":38.27,"lng":140.87,"pop":1096704},"sekimachi":{"cc":"JP","lat":35.48,"lng":136.92,"pop":85283},"satte":{"cc":"JP","lat":36.07,"lng":139.73,"pop":55286},"sasebo":{"cc":"JP","lat":33.17,"lng":129.73,"pop":243223},"sano":{"cc":"JP","lat":36.32,"lng":139.58,"pop":117669},"sanjo":{"cc":"JP","lat":37.62,"lng":138.95,"pop":94642},"sanj":{"cc":"JP","lat":37.62,"lng":138.95,"pop":94642},"sandach":{"cc":"JP","lat":34.88,"lng":135.23,"pop":132858},"sandacho":{"cc":"JP","lat":34.88,"lng":135.23,"pop":132858},"sakurai":{"cc":"JP","lat":34.5,"lng":135.85,"pop":58386},"saku":{"cc":"JP","lat":36.22,"lng":138.48,"pop":99131},"sakata":{"cc":"JP","lat":38.92,"lng":139.85,"pop":100273},"sakaidecho":{"cc":"JP","lat":34.32,"lng":133.84,"pop":57090},"sakaidech":{"cc":"JP","lat":34.32,"lng":133.84,"pop":57090},"sakai":{"cc":"JP","lat":34.58,"lng":135.47,"pop":826161},"sakado":{"cc":"JP","lat":35.96,"lng":139.39,"pop":100275},"saiki":{"cc":"JP","lat":32.95,"lng":131.9,"pop":66851},"saga":{"cc":"JP","lat":33.23,"lng":130.3,"pop":233301},"sabae":{"cc":"JP","lat":35.95,"lng":136.18,"pop":68302},"oyama":{"cc":"JP","lat":36.3,"lng":139.8,"pop":167647},"otsu":{"cc":"JP","lat":35.0,"lng":135.87,"pop":345070},"ta":{"cc":"JP","lat":35.56,"lng":139.72,"pop":748081},"osaka":{"cc":"JP","lat":34.69,"lng":135.5,"pop":2753862},"onomichi":{"cc":"JP","lat":34.42,"lng":133.2,"pop":131170},"muta":{"cc":"JP","lat":33.03,"lng":130.45,"pop":131974},"omuta":{"cc":"JP","lat":33.03,"lng":130.45,"pop":131974},"mura":{"cc":"JP","lat":32.92,"lng":129.95,"pop":95397},"omura":{"cc":"JP","lat":32.92,"lng":129.95,"pop":95397},"ome":{"cc":"JP","lat":35.78,"lng":139.24,"pop":133535},"me":{"cc":"JP","lat":35.78,"lng":139.24,"pop":133535},"okegawa":{"cc":"JP","lat":36.0,"lng":139.56,"pop":75062},"okazaki":{"cc":"JP","lat":34.95,"lng":137.17,"pop":384654},"okayama":{"cc":"JP","lat":34.65,"lng":133.93,"pop":724691},"okaya":{"cc":"JP","lat":36.06,"lng":138.05,"pop":54286},"oita":{"cc":"JP","lat":33.23,"lng":131.6,"pop":477715},"ita":{"cc":"JP","lat":33.23,"lng":131.6,"pop":477715},"oi":{"cc":"JP","lat":35.85,"lng":139.52,"pop":50593},"ogaki":{"cc":"JP","lat":35.35,"lng":136.62,"pop":161539},"gaki":{"cc":"JP","lat":35.35,"lng":136.62,"pop":161539},"odawara":{"cc":"JP","lat":35.26,"lng":139.16,"pop":188856},"bu":{"cc":"JP","lat":35.02,"lng":136.95,"pop":93123},"obu":{"cc":"JP","lat":35.02,"lng":136.95,"pop":93123},"numazu":{"cc":"JP","lat":35.1,"lng":138.87,"pop":189486},"nonoichi":{"cc":"JP","lat":36.53,"lng":136.62,"pop":57238},"nogata":{"cc":"JP","lat":33.74,"lng":130.72,"pop":56821},"ngata":{"cc":"JP","lat":33.74,"lng":130.72,"pop":56821},"noda":{"cc":"JP","lat":35.95,"lng":139.87,"pop":154114},"nobeoka":{"cc":"JP","lat":32.58,"lng":131.67,"pop":119521},"nishio":{"cc":"JP","lat":34.87,"lng":137.05,"pop":169984},"nishinomiya":{"cc":"JP","lat":34.72,"lng":135.33,"pop":485587},"nikk":{"cc":"JP","lat":36.75,"lng":139.62,"pop":77661},"nikko":{"cc":"JP","lat":36.75,"lng":139.62,"pop":77661},"niitsu-honcho":{"cc":"JP","lat":37.8,"lng":139.12,"pop":65910},"niitsu-honch":{"cc":"JP","lat":37.8,"lng":139.12,"pop":65910},"niihama":{"cc":"JP","lat":33.96,"lng":133.31,"pop":123059},"niigata":{"cc":"JP","lat":37.92,"lng":139.04,"pop":797591},"nichinan":{"cc":"JP","lat":31.6,"lng":131.37,"pop":51241},"narutoch-mitsuishi":{"cc":"JP","lat":34.2,"lng":134.61,"pop":64082},"narutocho-mitsuishi":{"cc":"JP","lat":34.2,"lng":134.61,"pop":64082},"nara-shi":{"cc":"JP","lat":34.69,"lng":135.8,"pop":367353},"nanao":{"cc":"JP","lat":37.05,"lng":136.97,"pop":50300},"nakatsugawa":{"cc":"JP","lat":35.48,"lng":137.5,"pop":78930},"nakatsu":{"cc":"JP","lat":33.6,"lng":131.19,"pop":84701},"naha":{"cc":"JP","lat":26.21,"lng":127.68,"pop":317625},"nagoya":{"cc":"JP","lat":35.18,"lng":136.91,"pop":2332176},"nago":{"cc":"JP","lat":26.62,"lng":127.99,"pop":63554},"nagasaki":{"cc":"JP","lat":32.75,"lng":129.88,"pop":409118},"nagareyama":{"cc":"JP","lat":35.86,"lng":139.9,"pop":200136},"nagaoka":{"cc":"JP","lat":37.45,"lng":138.85,"pop":266936},"nagano":{"cc":"JP","lat":36.65,"lng":138.18,"pop":372760},"nagahama":{"cc":"JP","lat":35.38,"lng":136.27,"pop":113636},"nabari":{"cc":"JP","lat":34.62,"lng":136.08,"pop":77022},"musashino":{"cc":"JP","lat":35.71,"lng":139.56,"pop":150149},"murakami":{"cc":"JP","lat":38.23,"lng":139.48,"pop":58300},"muk":{"cc":"JP","lat":34.97,"lng":135.7,"pop":56859},"muko":{"cc":"JP","lat":34.97,"lng":135.7,"pop":56859},"moriyama":{"cc":"JP","lat":35.07,"lng":135.98,"pop":85485},"moriguchi":{"cc":"JP","lat":34.73,"lng":135.57,"pop":143096},"miyoshi":{"cc":"JP","lat":35.09,"lng":137.09,"pop":61952},"miyazaki":{"cc":"JP","lat":31.92,"lng":131.42,"pop":401339},"miyakonojo":{"cc":"JP","lat":31.73,"lng":131.07,"pop":161137},"miyakonoj":{"cc":"JP","lat":31.73,"lng":131.07,"pop":161137},"mishima":{"cc":"JP","lat":35.12,"lng":138.92,"pop":107851},"minoh":{"cc":"JP","lat":34.83,"lng":135.47,"pop":136868},"minamirinkan":{"cc":"JP","lat":35.5,"lng":139.44,"pop":224015},"miki":{"cc":"JP","lat":34.8,"lng":134.98,"pop":75450},"mihara":{"cc":"JP","lat":34.4,"lng":133.08,"pop":90573},"matsut":{"cc":"JP","lat":36.52,"lng":136.57,"pop":110408},"matsuto":{"cc":"JP","lat":36.52,"lng":136.57,"pop":110408},"matsumoto":{"cc":"JP","lat":36.23,"lng":137.97,"pop":241145},"matsue":{"cc":"JP","lat":35.48,"lng":133.05,"pop":203616},"matsudo":{"cc":"JP","lat":35.78,"lng":139.9,"pop":498575},"matsubara":{"cc":"JP","lat":34.57,"lng":135.55,"pop":130855},"marugame":{"cc":"JP","lat":34.28,"lng":133.78,"pop":109513},"maizuru":{"cc":"JP","lat":35.45,"lng":135.33,"pop":92465},"maebashi":{"cc":"JP","lat":36.4,"lng":139.08,"pop":332149},"maebaru-chuo":{"cc":"JP","lat":33.56,"lng":130.2,"pop":70339},"maebaru-ch":{"cc":"JP","lat":33.56,"lng":130.2,"pop":70339},"machida":{"cc":"JP","lat":35.54,"lng":139.45,"pop":431079},"kyoto":{"cc":"JP","lat":35.02,"lng":135.75,"pop":1463723},"kusatsu":{"cc":"JP","lat":35.02,"lng":135.97,"pop":143913},"kurume":{"cc":"JP","lat":33.32,"lng":130.52,"pop":303579},"kurihama":{"cc":"JP","lat":35.23,"lng":139.7,"pop":53782},"kure":{"cc":"JP","lat":34.23,"lng":132.57,"pop":214592},"kurashiki":{"cc":"JP","lat":34.58,"lng":133.77,"pop":483576},"kumamoto":{"cc":"JP","lat":32.81,"lng":130.69,"pop":738907},"kumagaya":{"cc":"JP","lat":36.13,"lng":139.39,"pop":195277},"kukich":{"cc":"JP","lat":36.07,"lng":139.67,"pop":150582},"kukichuo":{"cc":"JP","lat":36.07,"lng":139.67,"pop":150582},"kudamatsu":{"cc":"JP","lat":34.01,"lng":131.87,"pop":55887},"ktari":{"cc":"JP","lat":34.92,"lng":135.71,"pop":80608},"kotari":{"cc":"JP","lat":34.92,"lng":135.71,"pop":80608},"koshigaya":{"cc":"JP","lat":35.89,"lng":139.79,"pop":345353},"konosu":{"cc":"JP","lat":36.07,"lng":139.52,"pop":116828},"knosu":{"cc":"JP","lat":36.07,"lng":139.52,"pop":116828},"konan":{"cc":"JP","lat":35.33,"lng":136.87,"pop":98255},"knan":{"cc":"JP","lat":35.33,"lng":136.87,"pop":98255},"komatsu":{"cc":"JP","lat":36.4,"lng":136.45,"pop":108509},"komaki":{"cc":"JP","lat":35.28,"lng":136.92,"pop":148872},"kokubunji":{"cc":"JP","lat":35.7,"lng":139.48,"pop":129242},"kokubu-matsuki":{"cc":"JP","lat":31.73,"lng":130.77,"pop":57896},"koga":{"cc":"JP","lat":36.18,"lng":139.72,"pop":139344},"kofu":{"cc":"JP","lat":35.67,"lng":138.57,"pop":189591},"kobe":{"cc":"JP","lat":34.69,"lng":135.18,"pop":1525152},"kiyosu":{"cc":"JP","lat":35.22,"lng":136.83,"pop":67352},"kitakyushu":{"cc":"JP","lat":33.85,"lng":130.85,"pop":940978},"kishiwada":{"cc":"JP","lat":34.47,"lng":135.37,"pop":205561},"kisarazu":{"cc":"JP","lat":35.38,"lng":139.93,"pop":136166},"kiry":{"cc":"JP","lat":36.4,"lng":139.33,"pop":108991},"kiryu":{"cc":"JP","lat":36.4,"lng":139.33,"pop":108991},"kazo":{"cc":"JP","lat":36.12,"lng":139.6,"pop":112792},"kawasaki":{"cc":"JP","lat":35.52,"lng":139.72,"pop":1538262},"kawanishi":{"cc":"JP","lat":34.82,"lng":135.42,"pop":155165},"kawaguchi":{"cc":"JP","lat":35.81,"lng":139.71,"pop":607373},"kawagoe":{"cc":"JP","lat":35.91,"lng":139.49,"pop":354571},"kasukabe":{"cc":"JP","lat":35.98,"lng":139.75,"pop":229792},"kasugai":{"cc":"JP","lat":35.25,"lng":136.97,"pop":308681},"kashiwazaki":{"cc":"JP","lat":37.37,"lng":138.55,"pop":86183},"kashiwara":{"cc":"JP","lat":34.45,"lng":135.77,"pop":120922},"kashiwa":{"cc":"JP","lat":35.86,"lng":139.98,"pop":433436},"kashihara-shi":{"cc":"JP","lat":34.51,"lng":135.79,"pop":124521},"kashihara":{"cc":"JP","lat":34.58,"lng":135.62,"pop":79058},"kasaoka":{"cc":"JP","lat":34.51,"lng":133.5,"pop":50160},"kariya":{"cc":"JP","lat":34.98,"lng":136.98,"pop":153834},"karatsu":{"cc":"JP","lat":33.44,"lng":129.97,"pop":117663},"kanuma":{"cc":"JP","lat":36.55,"lng":139.73,"pop":94903},"kanoya":{"cc":"JP","lat":31.38,"lng":130.85,"pop":101096},"kanonjich":{"cc":"JP","lat":34.13,"lng":133.65,"pop":57438},"kanonjicho":{"cc":"JP","lat":34.13,"lng":133.65,"pop":57438},"kanazawa":{"cc":"JP","lat":36.6,"lng":136.62,"pop":466029},"kamirenjaku":{"cc":"JP","lat":35.69,"lng":139.55,"pop":195391},"kameoka":{"cc":"JP","lat":35.0,"lng":135.58,"pop":97181},"kamakura":{"cc":"JP","lat":35.31,"lng":139.55,"pop":172929},"kakogawach-honmachi":{"cc":"JP","lat":34.77,"lng":134.83,"pop":271634},"kakogawacho-honmachi":{"cc":"JP","lat":34.77,"lng":134.83,"pop":271634},"kakegawa":{"cc":"JP","lat":34.77,"lng":138.02,"pop":117925},"kakamigahara":{"cc":"JP","lat":35.42,"lng":136.87,"pop":144521},"kashima-shi":{"cc":"JP","lat":35.97,"lng":140.64,"pop":66950},"kaizuka":{"cc":"JP","lat":34.45,"lng":135.35,"pop":92632},"kagoshima":{"cc":"JP","lat":31.57,"lng":130.55,"pop":595049},"izumo":{"cc":"JP","lat":35.37,"lng":132.77,"pop":172775},"izumisano":{"cc":"JP","lat":34.42,"lng":135.32,"pop":100131},"izumitsu":{"cc":"JP","lat":34.5,"lng":135.4,"pop":74412},"izumiotsu":{"cc":"JP","lat":34.5,"lng":135.4,"pop":74412},"izumi":{"cc":"JP","lat":34.48,"lng":135.43,"pop":184615},"iwatsuki":{"cc":"JP","lat":35.96,"lng":139.7,"pop":108833},"iwata":{"cc":"JP","lat":34.7,"lng":137.85,"pop":166672},"iwakuni":{"cc":"JP","lat":34.16,"lng":132.22,"pop":129125},"iwade":{"cc":"JP","lat":34.25,"lng":135.32,"pop":53967},"itoman":{"cc":"JP","lat":26.13,"lng":127.67,"pop":61007},"it":{"cc":"JP","lat":34.97,"lng":139.08,"pop":68773},"ito":{"cc":"JP","lat":34.97,"lng":139.08,"pop":68773},"itami":{"cc":"JP","lat":34.78,"lng":135.4,"pop":198138},"itabashi":{"cc":"JP","lat":35.75,"lng":139.71,"pop":584483},"isesaki":{"cc":"JP","lat":36.32,"lng":139.2,"pop":211850},"isehara":{"cc":"JP","lat":35.4,"lng":139.31,"pop":103401},"ise":{"cc":"JP","lat":34.48,"lng":136.7,"pop":123533},"isahaya":{"cc":"JP","lat":32.84,"lng":130.04,"pop":135546},"inuyama":{"cc":"JP","lat":35.38,"lng":136.94,"pop":73995},"inazawa":{"cc":"JP","lat":35.25,"lng":136.78,"pop":134751},"ina":{"cc":"JP","lat":35.83,"lng":137.95,"pop":68177},"imarich-k":{"cc":"JP","lat":33.27,"lng":129.88,"pop":57940},"imaricho-ko":{"cc":"JP","lat":33.27,"lng":129.88,"pop":57940},"imaichi":{"cc":"JP","lat":36.72,"lng":139.68,"pop":64323},"ikoma":{"cc":"JP","lat":34.68,"lng":135.7,"pop":120741},"ikeda":{"cc":"JP","lat":34.82,"lng":135.43,"pop":104993},"iizuka":{"cc":"JP","lat":33.64,"lng":130.69,"pop":126364},"iida":{"cc":"JP","lat":35.52,"lng":137.82,"pop":101536},"ichinomiya":{"cc":"JP","lat":35.3,"lng":136.8,"pop":380073},"ibaraki":{"cc":"JP","lat":34.82,"lng":135.57,"pop":287730},"honjo":{"cc":"JP","lat":36.24,"lng":139.19,"pop":78569},"honj":{"cc":"JP","lat":36.24,"lng":139.19,"pop":78569},"hfu":{"cc":"JP","lat":34.05,"lng":131.57,"pop":116925},"hofu":{"cc":"JP","lat":34.05,"lng":131.57,"pop":116925},"hita":{"cc":"JP","lat":33.32,"lng":130.94,"pop":64874},"hiroshima":{"cc":"JP","lat":34.4,"lng":132.45,"pop":1200754},"hiratsuka":{"cc":"JP","lat":35.33,"lng":139.34,"pop":258422},"hirakata":{"cc":"JP","lat":34.81,"lng":135.65,"pop":406331},"hino":{"cc":"JP","lat":35.67,"lng":139.4,"pop":190435},"himimachi":{"cc":"JP","lat":36.86,"lng":136.99,"pop":54510},"himeji":{"cc":"JP","lat":34.82,"lng":134.7,"pop":530495},"hikone":{"cc":"JP","lat":35.25,"lng":136.25,"pop":113647},"higashiosaka":{"cc":"JP","lat":34.67,"lng":135.58,"pop":493940},"hekinan":{"cc":"JP","lat":34.88,"lng":136.98,"pop":72458},"hatsukaichi":{"cc":"JP","lat":34.35,"lng":132.33,"pop":114173},"hatogaya-honch":{"cc":"JP","lat":35.83,"lng":139.74,"pop":53062},"hatogaya-honcho":{"cc":"JP","lat":35.83,"lng":139.74,"pop":53062},"hashimoto":{"cc":"JP","lat":34.32,"lng":135.62,"pop":61063},"hanyu":{"cc":"JP","lat":36.17,"lng":139.53,"pop":58686},"hany":{"cc":"JP","lat":36.17,"lng":139.53,"pop":58686},"hanno":{"cc":"JP","lat":35.85,"lng":139.32,"pop":80361},"hann":{"cc":"JP","lat":35.85,"lng":139.32,"pop":80361},"handa":{"cc":"JP","lat":34.88,"lng":136.93,"pop":117884},"hamamatsu":{"cc":"JP","lat":34.7,"lng":137.73,"pop":791707},"hamakita":{"cc":"JP","lat":34.8,"lng":137.78,"pop":86502},"hamada":{"cc":"JP","lat":34.88,"lng":132.08,"pop":57142},"hadano":{"cc":"JP","lat":35.37,"lng":139.22,"pop":163787},"hachioji":{"cc":"JP","lat":35.66,"lng":139.32,"pop":579355},"hachiji":{"cc":"JP","lat":35.66,"lng":139.32,"pop":579355},"omihachiman":{"cc":"JP","lat":35.13,"lng":136.1,"pop":82233},"mihachiman":{"cc":"JP","lat":35.13,"lng":136.1,"pop":82233},"gyda":{"cc":"JP","lat":36.14,"lng":139.46,"pop":86343},"gyoda":{"cc":"JP","lat":36.14,"lng":139.46,"pop":86343},"gushikawa":{"cc":"JP","lat":26.36,"lng":127.87,"pop":65251},"gotemba":{"cc":"JP","lat":35.32,"lng":138.94,"pop":86614},"gion":{"cc":"JP","lat":34.43,"lng":132.47,"pop":68713},"ginowan":{"cc":"JP","lat":26.26,"lng":127.76,"pop":100125},"gifu":{"cc":"JP","lat":35.42,"lng":136.76,"pop":402557},"gamagori":{"cc":"JP","lat":34.83,"lng":137.23,"pop":80063},"gamagri":{"cc":"JP","lat":34.83,"lng":137.23,"pop":80063},"futtsu":{"cc":"JP","lat":35.31,"lng":139.82,"pop":51650},"honcho":{"cc":"JP","lat":35.7,"lng":139.99,"pop":644668},"honch":{"cc":"JP","lat":35.7,"lng":139.99,"pop":644668},"fukuyama":{"cc":"JP","lat":34.48,"lng":133.37,"pop":468812},"fukuroi":{"cc":"JP","lat":34.75,"lng":137.92,"pop":88395},"fukuoka":{"cc":"JP","lat":33.6,"lng":130.42,"pop":1612392},"fukui-shi":{"cc":"JP","lat":36.06,"lng":136.22,"pop":262328},"fukuchiyama":{"cc":"JP","lat":35.3,"lng":135.12,"pop":77306},"fukayacho":{"cc":"JP","lat":36.2,"lng":139.28,"pop":141268},"fukayach":{"cc":"JP","lat":36.2,"lng":139.28,"pop":141268},"fujisawa":{"cc":"JP","lat":35.35,"lng":139.48,"pop":439728},"fujioka":{"cc":"JP","lat":36.25,"lng":139.07,"pop":64539},"fujinomiya":{"cc":"JP","lat":35.22,"lng":138.62,"pop":132507},"fujieda":{"cc":"JP","lat":34.87,"lng":138.27,"pop":145032},"fuchch":{"cc":"JP","lat":34.57,"lng":133.24,"pop":50746},"fuchucho":{"cc":"JP","lat":34.57,"lng":133.24,"pop":50746},"daito":{"cc":"JP","lat":34.71,"lng":135.62,"pop":119367},"dait":{"cc":"JP","lat":34.71,"lng":135.62,"pop":119367},"chofu":{"cc":"JP","lat":35.66,"lng":139.55,"pop":242614},"chfu":{"cc":"JP","lat":35.66,"lng":139.55,"pop":242614},"chiry":{"cc":"JP","lat":35.0,"lng":137.03,"pop":72193},"chiryu":{"cc":"JP","lat":35.0,"lng":137.03,"pop":72193},"chikushino-shi":{"cc":"JP","lat":33.5,"lng":130.52,"pop":103311},"chigasaki":{"cc":"JP","lat":35.34,"lng":139.4,"pop":242798},"chichibu":{"cc":"JP","lat":35.99,"lng":139.08,"pop":61159},"beppu":{"cc":"JP","lat":33.28,"lng":131.5,"pop":122643},"ashiya":{"cc":"JP","lat":34.73,"lng":135.3,"pop":93922},"ashikaga":{"cc":"JP","lat":36.33,"lng":139.45,"pop":144746},"asakusa":{"cc":"JP","lat":35.72,"lng":139.8,"pop":62092},"annaka":{"cc":"JP","lat":36.33,"lng":138.9,"pop":57013},"anj":{"cc":"JP","lat":34.96,"lng":137.08,"pop":188693},"anjo":{"cc":"JP","lat":34.96,"lng":137.08,"pop":188693},"anan":{"cc":"JP","lat":33.92,"lng":134.65,"pop":70285},"amagasaki":{"cc":"JP","lat":34.72,"lng":135.42,"pop":459593},"aihara":{"cc":"JP","lat":35.6,"lng":139.32,"pop":725493},"ageo":{"cc":"JP","lat":35.97,"lng":139.61,"pop":226940},"okinawa":{"cc":"JP","lat":26.34,"lng":127.8,"pop":142752},"hikari":{"cc":"JP","lat":33.95,"lng":131.95,"pop":51040},"hasuda":{"cc":"JP","lat":35.97,"lng":139.65,"pop":61540},"kamifukuoka":{"cc":"JP","lat":35.87,"lng":139.51,"pop":52323},"sayama":{"cc":"JP","lat":35.85,"lng":139.41,"pop":160843},"fussa":{"cc":"JP","lat":35.74,"lng":139.32,"pop":56786},"wako":{"cc":"JP","lat":35.79,"lng":139.62,"pop":83989},"shimotoda":{"cc":"JP","lat":35.81,"lng":139.69,"pop":140899},"kimitsu":{"cc":"JP","lat":35.35,"lng":139.87,"pop":83058},"miura":{"cc":"JP","lat":35.14,"lng":139.62,"pop":51483},"wakayama":{"cc":"JP","lat":34.23,"lng":135.17,"pop":356729},"uwajima":{"cc":"JP","lat":33.22,"lng":132.56,"pop":70809},"saij":{"cc":"JP","lat":33.92,"lng":133.18,"pop":104791},"saijo":{"cc":"JP","lat":33.92,"lng":133.18,"pop":104791},"matsuyama":{"cc":"JP","lat":33.84,"lng":132.77,"pop":511192},"imabari":{"cc":"JP","lat":34.07,"lng":133.0,"pop":170986},"yotsukaido":{"cc":"JP","lat":35.65,"lng":140.17,"pop":95266},"yotsukaid":{"cc":"JP","lat":35.65,"lng":140.17,"pop":95266},"yonezawa":{"cc":"JP","lat":37.91,"lng":140.12,"pop":94486},"yokote":{"cc":"JP","lat":39.32,"lng":140.55,"pop":85555},"yamagata":{"cc":"JP","lat":38.23,"lng":140.37,"pop":248772},"yachimata":{"cc":"JP","lat":35.65,"lng":140.32,"pop":68769},"ushiku":{"cc":"JP","lat":35.97,"lng":140.13,"pop":84651},"tsukuba":{"cc":"JP","lat":36.08,"lng":140.12,"pop":241656},"toride":{"cc":"JP","lat":35.9,"lng":140.08,"pop":104524},"tomiya":{"cc":"JP","lat":38.39,"lng":140.89,"pop":52433},"togane":{"cc":"JP","lat":35.55,"lng":140.37,"pop":66332},"tgane":{"cc":"JP","lat":35.55,"lng":140.37,"pop":66332},"tend":{"cc":"JP","lat":38.35,"lng":140.37,"pop":65393},"tendo":{"cc":"JP","lat":38.35,"lng":140.37,"pop":65393},"tagajo-shi":{"cc":"JP","lat":38.3,"lng":141.0,"pop":62827},"tagaj-shi":{"cc":"JP","lat":38.3,"lng":141.0,"pop":62827},"sukagawa":{"cc":"JP","lat":37.28,"lng":140.38,"pop":74992},"shiroi":{"cc":"JP","lat":35.8,"lng":140.07,"pop":62441},"shiogama":{"cc":"JP","lat":38.32,"lng":141.03,"pop":52662},"sakura":{"cc":"JP","lat":35.72,"lng":140.23,"pop":173740},"rygasaki":{"cc":"JP","lat":35.9,"lng":140.18,"pop":85761},"ryugasaki":{"cc":"JP","lat":35.9,"lng":140.18,"pop":85761},"tawara":{"cc":"JP","lat":36.87,"lng":140.03,"pop":72087},"otawara":{"cc":"JP","lat":36.87,"lng":140.03,"pop":72087},"oami":{"cc":"JP","lat":35.52,"lng":140.32,"pop":53239},"ami":{"cc":"JP","lat":35.52,"lng":140.32,"pop":53239},"nihommatsu":{"cc":"JP","lat":37.58,"lng":140.43,"pop":53557},"natori-shi":{"cc":"JP","lat":38.17,"lng":140.88,"pop":78718},"narita":{"cc":"JP","lat":35.78,"lng":140.32,"pop":132906},"naka":{"cc":"JP","lat":36.05,"lng":140.17,"pop":53137},"moriya":{"cc":"JP","lat":35.93,"lng":140.0,"pop":68777},"morioka":{"cc":"JP","lat":39.7,"lng":141.15,"pop":290700},"mooka":{"cc":"JP","lat":36.43,"lng":140.02,"pop":78720},"mobara":{"cc":"JP","lat":35.43,"lng":140.3,"pop":88330},"mizusawa":{"cc":"JP","lat":39.13,"lng":141.13,"pop":61281},"miyako":{"cc":"JP","lat":39.65,"lng":141.94,"pop":51150},"mito":{"cc":"JP","lat":36.35,"lng":140.45,"pop":270685},"kuroiso":{"cc":"JP","lat":36.97,"lng":140.05,"pop":61230},"koriyama":{"cc":"JP","lat":37.4,"lng":140.38,"pop":327692},"kriyama":{"cc":"JP","lat":37.4,"lng":140.38,"pop":327692},"kitakami":{"cc":"JP","lat":39.28,"lng":141.12,"pop":93045},"kesennuma":{"cc":"JP","lat":38.9,"lng":141.58,"pop":61147},"katsuta":{"cc":"JP","lat":36.38,"lng":140.53,"pop":155968},"katori-shi":{"cc":"JP","lat":35.9,"lng":140.5,"pop":74469},"iwaki":{"cc":"JP","lat":37.05,"lng":140.88,"pop":357309},"ishioka":{"cc":"JP","lat":36.18,"lng":140.27,"pop":73061},"ishinomaki":{"cc":"JP","lat":38.42,"lng":141.3,"pop":140151},"inada":{"cc":"JP","lat":36.43,"lng":140.52,"pop":53502},"ichinoseki":{"cc":"JP","lat":38.92,"lng":141.13,"pop":114476},"ichihara":{"cc":"JP","lat":35.52,"lng":140.08,"pop":283531},"hitachi":{"cc":"JP","lat":36.6,"lng":140.65,"pop":174508},"hanamaki":{"cc":"JP","lat":39.38,"lng":141.12,"pop":94691},"furukawa":{"cc":"JP","lat":38.57,"lng":140.96,"pop":76312},"fukushima":{"cc":"JP","lat":37.75,"lng":140.47,"pop":294237},"date":{"cc":"JP","lat":40.27,"lng":140.56,"pop":69237},"choshi":{"cc":"JP","lat":35.73,"lng":140.83,"pop":58431},"chiba":{"cc":"JP","lat":35.6,"lng":140.12,"pop":979768},"asahi":{"cc":"JP","lat":35.72,"lng":140.65,"pop":64690},"akita":{"cc":"JP","lat":39.72,"lng":140.12,"pop":307672},"abiko":{"cc":"JP","lat":35.87,"lng":140.02,"pop":131771},"tomakomai":{"cc":"JP","lat":42.64,"lng":141.6,"pop":174806},"mutsu":{"cc":"JP","lat":41.29,"lng":141.22,"pop":56244},"sapporo":{"cc":"JP","lat":43.07,"lng":141.35,"pop":1973832},"otaru":{"cc":"JP","lat":43.19,"lng":141.0,"pop":115333},"odate":{"cc":"JP","lat":40.27,"lng":140.56,"pop":69237},"obihiro":{"cc":"JP","lat":42.92,"lng":143.2,"pop":166536},"noshiro":{"cc":"JP","lat":40.21,"lng":140.03,"pop":52283},"muroran":{"cc":"JP","lat":42.32,"lng":140.99,"pop":96197},"kushiro":{"cc":"JP","lat":42.98,"lng":144.37,"pop":167875},"kitami":{"cc":"JP","lat":43.8,"lng":143.89,"pop":119135},"iwamizawa":{"cc":"JP","lat":43.2,"lng":141.76,"pop":85107},"ishikari":{"cc":"JP","lat":43.24,"lng":141.35,"pop":58755},"kitahiroshima":{"cc":"JP","lat":42.98,"lng":141.57,"pop":58918},"hirosaki":{"cc":"JP","lat":40.59,"lng":140.47,"pop":168739},"hakodate":{"cc":"JP","lat":41.78,"lng":140.74,"pop":275730},"hachinohe":{"cc":"JP","lat":40.5,"lng":141.5,"pop":239046},"ebetsu":{"cc":"JP","lat":43.11,"lng":141.55,"pop":133953},"chitose":{"cc":"JP","lat":42.82,"lng":141.65,"pop":97950},"asahikawa":{"cc":"JP","lat":43.77,"lng":142.36,"pop":333530},"aomori":{"cc":"JP","lat":40.82,"lng":140.73,"pop":298394},"goshogawara":{"cc":"JP","lat":40.8,"lng":140.44,"pop":53576},"neyagawa":{"cc":"JP","lat":34.77,"lng":135.63,"pop":238549},"owariasahi":{"cc":"JP","lat":35.21,"lng":137.03,"pop":83144},"hitachi-naka":{"cc":"JP","lat":36.4,"lng":140.53,"pop":156581},"chikusei":{"cc":"JP","lat":36.32,"lng":139.98,"pop":100753},"tsuchiura":{"cc":"JP","lat":36.09,"lng":140.21,"pop":144399},"kamisu":{"cc":"JP","lat":35.9,"lng":140.67,"pop":95454},"bando":{"cc":"JP","lat":36.07,"lng":139.87,"pop":57128},"band":{"cc":"JP","lat":36.07,"lng":139.87,"pop":57128},"azumino":{"cc":"JP","lat":36.29,"lng":137.89,"pop":94222},"chikuma":{"cc":"JP","lat":36.53,"lng":138.09,"pop":59381},"ritto":{"cc":"JP","lat":35.03,"lng":136.0,"pop":70312},"ritt":{"cc":"JP","lat":35.03,"lng":136.0,"pop":70312},"kka":{"cc":"JP","lat":34.98,"lng":136.16,"pop":89619},"koka":{"cc":"JP","lat":34.98,"lng":136.16,"pop":89619},"kashiba":{"cc":"JP","lat":34.53,"lng":135.71,"pop":78113},"imizu":{"cc":"JP","lat":36.77,"lng":137.13,"pop":90742},"ebina":{"cc":"JP","lat":35.38,"lng":139.4,"pop":136516},"tama":{"cc":"JP","lat":35.64,"lng":139.47,"pop":148285},"musashimurayama":{"cc":"JP","lat":35.74,"lng":139.43,"pop":70829},"akishima":{"cc":"JP","lat":35.72,"lng":139.38,"pop":113949},"higashiyamato":{"cc":"JP","lat":35.76,"lng":139.45,"pop":83901},"misato saitama":{"cc":"JP","lat":35.84,"lng":139.88,"pop":142145},"niiza":{"cc":"JP","lat":35.82,"lng":139.56,"pop":166017},"kaga":{"cc":"JP","lat":36.3,"lng":136.33,"pop":67793},"noj":{"cc":"JP","lat":33.54,"lng":130.48,"pop":102085},"onojo":{"cc":"JP","lat":33.54,"lng":130.48,"pop":102085},"kasuga":{"cc":"JP","lat":33.53,"lng":130.46,"pop":111023},"aizu-wakamatsu":{"cc":"JP","lat":37.49,"lng":139.95,"pop":118159},"minami-soma":{"cc":"JP","lat":37.63,"lng":140.98,"pop":59005},"minami-sma":{"cc":"JP","lat":37.63,"lng":140.98,"pop":59005},"urasoe":{"cc":"JP","lat":26.26,"lng":127.73,"pop":115690},"uruma":{"cc":"JP","lat":26.38,"lng":127.86,"pop":125303},"joso":{"cc":"JP","lat":36.04,"lng":139.96,"pop":60834},"js":{"cc":"JP","lat":36.04,"lng":139.96,"pop":60834},"midori":{"cc":"JP","lat":36.44,"lng":139.28,"pop":50266},"miyakojima":{"cc":"JP","lat":24.79,"lng":125.31,"pop":54908},"fujimino":{"cc":"JP","lat":35.9,"lng":139.52,"pop":113597},"hidaka":{"cc":"JP","lat":35.92,"lng":139.36,"pop":55294},"higashi-matsuyama":{"cc":"JP","lat":36.03,"lng":139.42,"pop":91791},"iruma":{"cc":"JP","lat":35.82,"lng":139.37,"pop":147166},"kitamoto":{"cc":"JP","lat":36.03,"lng":139.54,"pop":66022},"tsurugashima":{"cc":"JP","lat":35.96,"lng":139.4,"pop":70117},"kinokawa":{"cc":"JP","lat":34.27,"lng":135.41,"pop":60592},"nasushiobara":{"cc":"JP","lat":36.98,"lng":140.07,"pop":115794},"shimotsuke":{"cc":"JP","lat":36.41,"lng":139.87,"pop":60274},"inzai":{"cc":"JP","lat":35.83,"lng":140.16,"pop":105463},"yachiyo":{"cc":"JP","lat":35.74,"lng":140.12,"pop":199498},"oshu":{"cc":"JP","lat":39.14,"lng":141.17,"pop":112937},"sh":{"cc":"JP","lat":39.14,"lng":141.17,"pop":112937},"osaki":{"cc":"JP","lat":38.59,"lng":140.97,"pop":128763},"kurihara":{"cc":"JP","lat":38.75,"lng":141.0,"pop":66565},"kosai":{"cc":"JP","lat":34.7,"lng":137.52,"pop":59770},"susono":{"cc":"JP","lat":35.17,"lng":138.91,"pop":51216},"daisen":{"cc":"JP","lat":39.44,"lng":140.49,"pop":91143},"yurihonj":{"cc":"JP","lat":39.39,"lng":140.06,"pop":76077},"yurihonjo":{"cc":"JP","lat":39.39,"lng":140.06,"pop":76077},"towada":{"cc":"JP","lat":40.62,"lng":141.21,"pop":60697},"kitanagoya":{"cc":"JP","lat":35.25,"lng":136.88,"pop":86385},"nisshin":{"cc":"JP","lat":35.14,"lng":137.05,"pop":91795},"toyoake":{"cc":"JP","lat":35.04,"lng":137.0,"pop":69295},"aisai":{"cc":"JP","lat":35.16,"lng":136.73,"pop":60829},"hashima":{"cc":"JP","lat":35.33,"lng":136.68,"pop":67909},"kani":{"cc":"JP","lat":35.4,"lng":137.06,"pop":102143},"minokamo":{"cc":"JP","lat":35.48,"lng":137.02,"pop":56972},"jetsu":{"cc":"JP","lat":37.15,"lng":138.24,"pop":189430},"joetsu":{"cc":"JP","lat":37.15,"lng":138.24,"pop":189430},"minamiuonuma":{"cc":"JP","lat":37.08,"lng":138.87,"pop":55354},"sado":{"cc":"JP","lat":38.02,"lng":138.36,"pop":51492},"fujiidera":{"cc":"JP","lat":34.57,"lng":135.6,"pop":63688},"habikino":{"cc":"JP","lat":34.55,"lng":135.59,"pop":109479},"hannan":{"cc":"JP","lat":34.33,"lng":135.25,"pop":52350},"kawachi-nagano":{"cc":"JP","lat":34.44,"lng":135.58,"pop":101692},"sennan":{"cc":"JP","lat":34.35,"lng":135.27,"pop":60102},"shijnawate":{"cc":"JP","lat":34.73,"lng":135.68,"pop":55177},"shijonawate":{"cc":"JP","lat":34.73,"lng":135.68,"pop":55177},"saitama":{"cc":"JP","lat":35.91,"lng":139.66,"pop":1324854},"higashimurayama":{"cc":"JP","lat":35.75,"lng":139.47,"pop":151815},"kirishima":{"cc":"JP","lat":31.74,"lng":130.76,"pop":123205},"arashiyama":{"cc":"JP","lat":35.01,"lng":135.68,"pop":50000},"dazaifu":{"cc":"JP","lat":33.51,"lng":130.52,"pop":73164},"amakusa":{"cc":"JP","lat":32.46,"lng":130.19,"pop":83082},"kamigyo-ku":{"cc":"JP","lat":35.03,"lng":135.76,"pop":83000},"kamigy-ku":{"cc":"JP","lat":35.03,"lng":135.76,"pop":83000},"katsushika":{"cc":"JP","lat":35.73,"lng":139.85,"pop":453093},"toshima":{"cc":"JP","lat":35.76,"lng":139.74,"pop":301599},"yotsuya":{"cc":"JP","lat":35.69,"lng":139.72,"pop":74800},"nakano":{"cc":"JP","lat":35.7,"lng":139.67,"pop":344880},"katanawa":{"cc":"JP","lat":33.52,"lng":130.42,"pop":50112},"jima":{"cc":"JP","lat":35.69,"lng":139.83,"pop":63254},"ojima":{"cc":"JP","lat":35.69,"lng":139.83,"pop":63254},"arakawa":{"cc":"JP","lat":35.74,"lng":139.78,"pop":216900},"adachi":{"cc":"JP","lat":35.76,"lng":139.81,"pop":695043},"edogawe":{"cc":"JP","lat":35.69,"lng":139.87,"pop":697932},"eniwa":{"cc":"JP","lat":42.89,"lng":141.58,"pop":70331},"minami-alps":{"cc":"JP","lat":35.62,"lng":138.46,"pop":71618},"kot":{"cc":"JP","lat":32.78,"lng":130.75,"pop":543730},"koto":{"cc":"JP","lat":32.78,"lng":130.75,"pop":543730},"arao":{"cc":"JP","lat":32.98,"lng":130.45,"pop":53675},"iga":{"cc":"JP","lat":34.76,"lng":136.13,"pop":88895},"kuwana":{"cc":"JP","lat":35.05,"lng":136.67,"pop":140051},"matsusaka":{"cc":"JP","lat":34.58,"lng":136.54,"pop":159145},"takizawa":{"cc":"JP","lat":39.8,"lng":141.13,"pop":55579},"yasu":{"cc":"JP","lat":35.1,"lng":136.02,"pop":50695},"yame":{"cc":"JP","lat":33.23,"lng":130.65,"pop":60608},"yamatokriyama":{"cc":"JP","lat":34.61,"lng":135.77,"pop":83285},"yamatokoriyama":{"cc":"JP","lat":34.61,"lng":135.77,"pop":83285},"yamato":{"cc":"JP","lat":35.47,"lng":139.45,"pop":242065},"takasago":{"cc":"JP","lat":34.76,"lng":134.79,"pop":87722},"tachikawa":{"cc":"JP","lat":35.71,"lng":139.42,"pop":183581},"sagamihara":{"cc":"JP","lat":35.57,"lng":139.24,"pop":720780},"ogori":{"cc":"JP","lat":33.39,"lng":130.55,"pop":59360},"ogri":{"cc":"JP","lat":33.39,"lng":130.55,"pop":59360},"nagakute":{"cc":"JP","lat":35.17,"lng":137.06,"pop":60162},"munakata":{"cc":"JP","lat":33.8,"lng":130.56,"pop":97095},"mitoyo":{"cc":"JP","lat":34.21,"lng":133.67,"pop":65713},"kunitachi":{"cc":"JP","lat":35.68,"lng":139.44,"pop":77130},"kizugawa":{"cc":"JP","lat":34.74,"lng":135.84,"pop":77907},"katano":{"cc":"JP","lat":34.79,"lng":135.69,"pop":75033},"hyga":{"cc":"JP","lat":32.42,"lng":131.64,"pop":60037},"hyuga":{"cc":"JP","lat":32.42,"lng":131.64,"pop":60037},"higashihiroshima":{"cc":"JP","lat":34.41,"lng":132.74,"pop":196608},"higashikurume":{"cc":"JP","lat":35.75,"lng":139.51,"pop":117020},"hamura":{"cc":"JP","lat":35.76,"lng":139.32,"pop":54622},"fuchu":{"cc":"JP","lat":35.67,"lng":139.48,"pop":262790},"fuch":{"cc":"JP","lat":35.67,"lng":139.48,"pop":262790},"ayase":{"cc":"JP","lat":35.44,"lng":139.43,"pop":83913},"aira":{"cc":"JP","lat":31.77,"lng":130.59,"pop":76348},"ama":{"cc":"JP","lat":35.18,"lng":136.8,"pop":86126},"kodaira":{"cc":"JP","lat":35.73,"lng":139.49,"pop":198739},"kiyose":{"cc":"JP","lat":35.78,"lng":139.53,"pop":76208},"joyo":{"cc":"JP","lat":34.84,"lng":135.81,"pop":74607},"jy":{"cc":"JP","lat":34.84,"lng":135.81,"pop":74607},"kamagaya":{"cc":"JP","lat":35.77,"lng":140.0,"pop":109932},"tatsuno":{"cc":"JP","lat":34.83,"lng":134.54,"pop":74316},"kai":{"cc":"JP","lat":35.68,"lng":138.51,"pop":75313},"warabi":{"cc":"JP","lat":35.82,"lng":139.69,"pop":75614},"itoshima":{"cc":"JP","lat":33.54,"lng":130.18,"pop":98877},"akiruno":{"cc":"JP","lat":35.73,"lng":139.23,"pop":81912},"shikokuch":{"cc":"JP","lat":33.98,"lng":133.55,"pop":82754},"shikokuchuo":{"cc":"JP","lat":33.98,"lng":133.55,"pop":82754},"narashino":{"cc":"JP","lat":35.68,"lng":140.04,"pop":176197},"sodegaura":{"cc":"JP","lat":35.41,"lng":140.02,"pop":64901},"echizen":{"cc":"JP","lat":35.89,"lng":136.17,"pop":83078},"shirakawa":{"cc":"JP","lat":37.12,"lng":140.26,"pop":59491},"mizuho":{"cc":"JP","lat":35.39,"lng":136.67,"pop":56388},"tanba":{"cc":"JP","lat":35.16,"lng":135.04,"pop":62152},"tokai":{"cc":"JP","lat":35.02,"lng":136.91,"pop":113787},"tkai":{"cc":"JP","lat":35.02,"lng":136.91,"pop":113787},"kshi":{"cc":"JP","lat":32.89,"lng":130.78,"pop":61772},"koshi":{"cc":"JP","lat":32.89,"lng":130.78,"pop":61772},"uki":{"cc":"JP","lat":32.62,"lng":130.66,"pop":59928},"kyotanabe":{"cc":"JP","lat":34.8,"lng":135.77,"pop":73753},"kytanabe":{"cc":"JP","lat":34.8,"lng":135.77,"pop":73753},"kytango":{"cc":"JP","lat":35.61,"lng":135.04,"pop":50860},"kyotango":{"cc":"JP","lat":35.61,"lng":135.04,"pop":50860},"inagi":{"cc":"JP","lat":35.63,"lng":139.5,"pop":93151},"koganei":{"cc":"JP","lat":35.7,"lng":139.51,"pop":126074},"komae":{"cc":"JP","lat":35.63,"lng":139.58,"pop":84772},"sanyoonoda":{"cc":"JP","lat":34.03,"lng":131.16,"pop":60326},"sanyonoda":{"cc":"JP","lat":34.03,"lng":131.16,"pop":60326},"shunan":{"cc":"JP","lat":34.08,"lng":131.83,"pop":149632},"shnan":{"cc":"JP","lat":34.08,"lng":131.83,"pop":149632},"fuefuki":{"cc":"JP","lat":35.64,"lng":138.64,"pop":69463},"fukutsu":{"cc":"JP","lat":33.78,"lng":130.49,"pop":67033},"asakura":{"cc":"JP","lat":33.41,"lng":130.72,"pop":50273},"chiyoda":{"cc":"JP","lat":35.68,"lng":139.75,"pop":66680},"setagaya":{"cc":"JP","lat":35.64,"lng":139.65,"pop":940071},"shinjuku":{"cc":"JP","lat":35.69,"lng":139.71,"pop":349385},"akihabara":{"cc":"JP","lat":35.7,"lng":139.77,"pop":77200},"taito":{"cc":"JP","lat":35.71,"lng":139.78,"pop":211444},"meguro":{"cc":"JP","lat":35.63,"lng":139.7,"pop":288088},"bunkyo":{"cc":"JP","lat":35.53,"lng":139.42,"pop":240069},"shibuya":{"cc":"JP","lat":35.66,"lng":139.71,"pop":230609},"suginami":{"cc":"JP","lat":36.2,"lng":140.28,"pop":588354},"ichikawa":{"cc":"JP","lat":35.73,"lng":139.91,"pop":496676},"tamba":{"cc":"JP","lat":35.17,"lng":135.03,"pop":61471},"minamiarupusu":{"cc":"JP","lat":35.61,"lng":138.46,"pop":69459},"chuo":{"cc":"JP","lat":35.67,"lng":139.78,"pop":169179},"minato city":{"cc":"JP","lat":35.66,"lng":139.75,"pop":260486},"wanguru":{"cc":"KE","lat":-0.68,"lng":37.36,"pop":51722},"wajir":{"cc":"KE","lat":1.75,"lng":40.06,"pop":90116},"voi":{"cc":"KE","lat":-3.4,"lng":38.56,"pop":53353},"ukunda":{"cc":"KE","lat":-4.29,"lng":39.56,"pop":77686},"thika":{"cc":"KE","lat":-1.03,"lng":37.07,"pop":251407},"ruiru":{"cc":"KE","lat":-1.15,"lng":36.96,"pop":490120},"nyeri":{"cc":"KE","lat":-0.42,"lng":36.95,"pop":80081},"ngong":{"cc":"KE","lat":-1.35,"lng":36.67,"pop":102323},"narok":{"cc":"KE","lat":-1.08,"lng":35.87,"pop":65430},"nanyuki":{"cc":"KE","lat":0.01,"lng":37.07,"pop":72813},"nakuru":{"cc":"KE","lat":-0.31,"lng":36.07,"pop":570674},"naivasha":{"cc":"KE","lat":-0.71,"lng":36.43,"pop":198444},"nairobi":{"cc":"KE","lat":-1.28,"lng":36.82,"pop":4397073},"mwala":{"cc":"KE","lat":-1.35,"lng":37.45,"pop":181896},"mombasa":{"cc":"KE","lat":-4.05,"lng":39.66,"pop":1208333},"migori":{"cc":"KE","lat":-1.06,"lng":34.47,"pop":71668},"meru":{"cc":"KE","lat":0.05,"lng":37.66,"pop":80191},"matuga":{"cc":"KE","lat":-4.17,"lng":39.57,"pop":194252},"mandera":{"cc":"KE","lat":3.94,"lng":41.86,"pop":114718},"malindi":{"cc":"KE","lat":-3.22,"lng":40.12,"pop":119859},"machakos":{"cc":"KE","lat":-1.52,"lng":37.27,"pop":63767},"lodwar":{"cc":"KE","lat":3.12,"lng":35.6,"pop":82970},"limuru":{"cc":"KE","lat":-1.11,"lng":36.64,"pop":159314},"ongata rongai":{"cc":"KE","lat":-1.4,"lng":36.76,"pop":172569},"kitale":{"cc":"KE","lat":1.02,"lng":35.01,"pop":162174},"kisumu":{"cc":"KE","lat":-0.1,"lng":34.76,"pop":397957},"kisii":{"cc":"KE","lat":-0.68,"lng":34.77,"pop":112417},"kiserian":{"cc":"KE","lat":-1.43,"lng":36.69,"pop":76903},"kimilili":{"cc":"KE","lat":0.79,"lng":34.72,"pop":56050},"kilifi":{"cc":"KE","lat":-3.63,"lng":39.85,"pop":74270},"kikuyu":{"cc":"KE","lat":-1.25,"lng":36.66,"pop":323881},"kiambu":{"cc":"KE","lat":-1.17,"lng":36.84,"pop":147870},"khwisero":{"cc":"KE","lat":0.17,"lng":34.59,"pop":113294},"kericho":{"cc":"KE","lat":-0.37,"lng":35.28,"pop":53804},"karuri":{"cc":"KE","lat":-1.18,"lng":36.76,"pop":194342},"kapenguria":{"cc":"KE","lat":1.24,"lng":35.11,"pop":56000},"kakamega":{"cc":"KE","lat":0.28,"lng":34.75,"pop":1867579},"jomvu":{"cc":"KE","lat":-3.99,"lng":39.61,"pop":163415},"isiolo":{"cc":"KE","lat":0.35,"lng":37.58,"pop":78650},"githunguri":{"cc":"KE","lat":-1.06,"lng":36.78,"pop":63319},"gilgil":{"cc":"KE","lat":-0.5,"lng":36.32,"pop":60711},"upper gilgil":{"cc":"KE","lat":-0.21,"lng":36.27,"pop":60711},"garissa":{"cc":"KE","lat":-0.45,"lng":39.65,"pop":163399},"embu":{"cc":"KE","lat":-0.54,"lng":37.46,"pop":64979},"el wak":{"cc":"KE","lat":2.81,"lng":40.93,"pop":60732},"eldoret":{"cc":"KE","lat":0.52,"lng":35.27,"pop":475716},"bungoma":{"cc":"KE","lat":0.56,"lng":34.56,"pop":68031},"athi river":{"cc":"KE","lat":-1.46,"lng":36.98,"pop":81302},"kitengela":{"cc":"KE","lat":-1.48,"lng":36.96,"pop":154436},"juja":{"cc":"KE","lat":-1.1,"lng":37.01,"pop":156041},"langata":{"cc":"KE","lat":-1.37,"lng":36.73,"pop":172569},"imara daima estate":{"cc":"KE","lat":-1.32,"lng":36.88,"pop":52837},"mlolongo":{"cc":"KE","lat":-1.4,"lng":36.94,"pop":136351},"mtwapa":{"cc":"KE","lat":-3.94,"lng":39.75,"pop":90677},"tokmok":{"cc":"KG","lat":42.84,"lng":75.3,"pop":71443},"osh":{"cc":"KG","lat":40.53,"lng":72.8,"pop":322164},"karakol":{"cc":"KG","lat":42.49,"lng":78.39,"pop":84351},"manas":{"cc":"KG","lat":40.94,"lng":72.99,"pop":123239},"bishkek":{"cc":"KG","lat":42.87,"lng":74.59,"pop":900000},"phnom penh":{"cc":"KH","lat":11.56,"lng":104.92,"pop":1573544},"ta khmau":{"cc":"KH","lat":11.48,"lng":104.95,"pop":52066},"takeo":{"cc":"KH","lat":10.99,"lng":104.78,"pop":843931},"siem reap":{"cc":"KH","lat":13.36,"lng":103.86,"pop":139458},"pursat":{"cc":"KH","lat":12.54,"lng":103.92,"pop":52476},"preaek prasab":{"cc":"KH","lat":12.35,"lng":106.04,"pop":64466},"paoy paet":{"cc":"KH","lat":13.66,"lng":102.56,"pop":98934},"dangkao":{"cc":"KH","lat":11.51,"lng":104.89,"pop":76421},"sihanoukville":{"cc":"KH","lat":10.61,"lng":103.53,"pop":73036},"kampong chhnang":{"cc":"KH","lat":12.25,"lng":104.67,"pop":75244},"kampong cham":{"cc":"KH","lat":11.99,"lng":105.46,"pop":61750},"battambang":{"cc":"KH","lat":13.1,"lng":103.2,"pop":119251},"anlong veaeng":{"cc":"KH","lat":14.23,"lng":104.08,"pop":56927},"moroni":{"cc":"KM","lat":-11.7,"lng":43.26,"pop":74749},"wnsan":{"cc":"KP","lat":39.15,"lng":127.44,"pop":329207},"wonsan":{"cc":"KP","lat":39.15,"lng":127.44,"pop":329207},"nchn-p":{"cc":"KP","lat":38.57,"lng":125.43,"pop":95597},"unchon-up":{"cc":"KP","lat":38.57,"lng":125.43,"pop":95597},"ullyul":{"cc":"KP","lat":38.51,"lng":125.19,"pop":107997},"llyul":{"cc":"KP","lat":38.51,"lng":125.19,"pop":107997},"tokchon":{"cc":"KP","lat":39.75,"lng":126.26,"pop":237133},"tkchn":{"cc":"KP","lat":39.75,"lng":126.26,"pop":237133},"taetan-up":{"cc":"KP","lat":38.09,"lng":125.3,"pop":64258},"taetan-p":{"cc":"KP","lat":38.09,"lng":125.3,"pop":64258},"sunchon":{"cc":"KP","lat":39.43,"lng":125.93,"pop":437000},"sunchn":{"cc":"KP","lat":39.43,"lng":125.93,"pop":437000},"songnim-ni":{"cc":"KP","lat":38.76,"lng":125.64,"pop":152425},"sinwn-p":{"cc":"KP","lat":38.24,"lng":125.76,"pop":83161},"sinwon-up":{"cc":"KP","lat":38.24,"lng":125.76,"pop":83161},"sinchon-up":{"cc":"KP","lat":38.35,"lng":125.48,"pop":141407},"sinchn-p":{"cc":"KP","lat":38.35,"lng":125.48,"pop":141407},"sariwn-si":{"cc":"KP","lat":38.51,"lng":125.76,"pop":310100},"sariwon-si":{"cc":"KP","lat":38.51,"lng":125.76,"pop":310100},"samchn":{"cc":"KP","lat":38.36,"lng":125.33,"pop":86042},"samchon":{"cc":"KP","lat":38.36,"lng":125.33,"pop":86042},"pyongyang":{"cc":"KP","lat":39.03,"lng":125.75,"pop":3222000},"pyngsng":{"cc":"KP","lat":39.25,"lng":125.87,"pop":100000},"pyongsong":{"cc":"KP","lat":39.25,"lng":125.87,"pop":100000},"pongchn-p":{"cc":"KP","lat":38.12,"lng":126.2,"pop":79740},"pongchon-up":{"cc":"KP","lat":38.12,"lng":126.2,"pop":79740},"paechn-p":{"cc":"KP","lat":37.99,"lng":126.3,"pop":159825},"paechon-up":{"cc":"KP","lat":37.99,"lng":126.3,"pop":159825},"ongjin":{"cc":"KP","lat":37.93,"lng":125.36,"pop":64247},"nampo":{"cc":"KP","lat":38.74,"lng":125.41,"pop":455000},"mangyngdae-ri":{"cc":"KP","lat":38.99,"lng":125.66,"pop":321690},"mangyongdae-ri":{"cc":"KP","lat":38.99,"lng":125.66,"pop":321690},"kwail-up":{"cc":"KP","lat":38.45,"lng":125.02,"pop":89895},"kwail-p":{"cc":"KP","lat":38.45,"lng":125.02,"pop":89895},"kangsn":{"cc":"KP","lat":38.94,"lng":125.58,"pop":102436},"kangson":{"cc":"KP","lat":38.94,"lng":125.58,"pop":102436},"kangnyng":{"cc":"KP","lat":37.91,"lng":125.51,"pop":106827},"kangnyong":{"cc":"KP","lat":37.91,"lng":125.51,"pop":106827},"kaesng":{"cc":"KP","lat":37.97,"lng":126.55,"pop":338155},"kaesong":{"cc":"KP","lat":37.97,"lng":126.55,"pop":338155},"kaechon":{"cc":"KP","lat":39.7,"lng":125.89,"pop":319554},"kaechn":{"cc":"KP","lat":39.7,"lng":125.89,"pop":319554},"hngnam":{"cc":"KP","lat":39.84,"lng":127.63,"pop":346082},"hungnam":{"cc":"KP","lat":39.84,"lng":127.63,"pop":346082},"hamhng":{"cc":"KP","lat":39.92,"lng":127.54,"pop":559056},"hamhung":{"cc":"KP","lat":39.92,"lng":127.54,"pop":559056},"haeju":{"cc":"KP","lat":38.04,"lng":125.71,"pop":222396},"chongdan-up":{"cc":"KP","lat":37.97,"lng":125.94,"pop":142607},"chngdan-p":{"cc":"KP","lat":37.97,"lng":125.94,"pop":142607},"chaeryong-up":{"cc":"KP","lat":38.4,"lng":125.62,"pop":53330},"chaeryng-p":{"cc":"KP","lat":38.4,"lng":125.62,"pop":53330},"chaeryng-ni":{"cc":"KP","lat":38.74,"lng":125.23,"pop":125631},"chaeryong-ni":{"cc":"KP","lat":38.74,"lng":125.23,"pop":125631},"anju":{"cc":"KP","lat":39.62,"lng":125.66,"pop":50196},"paekak":{"cc":"KP","lat":39.46,"lng":125.61,"pop":125924},"yuktae-dong":{"cc":"KP","lat":40.02,"lng":128.16,"pop":76427},"ndk":{"cc":"KP","lat":42.52,"lng":130.33,"pop":89244},"undok":{"cc":"KP","lat":42.52,"lng":130.33,"pop":89244},"uiju":{"cc":"KP","lat":40.2,"lng":124.53,"pop":50081},"sinuiju":{"cc":"KP","lat":40.1,"lng":124.4,"pop":288112},"siniju":{"cc":"KP","lat":40.1,"lng":124.4,"pop":288112},"sinpo":{"cc":"KP","lat":40.04,"lng":128.19,"pop":152759},"rang":{"cc":"KP","lat":41.45,"lng":129.66,"pop":87757},"orang":{"cc":"KP","lat":41.45,"lng":129.66,"pop":87757},"namyang-nodongjagu":{"cc":"KP","lat":42.95,"lng":129.86,"pop":65956},"rajin":{"cc":"KP","lat":42.26,"lng":130.28,"pop":66224},"hwasng":{"cc":"KP","lat":41.26,"lng":129.49,"pop":99557},"hwasong":{"cc":"KP","lat":41.26,"lng":129.49,"pop":99557},"myngchn":{"cc":"KP","lat":41.07,"lng":129.43,"pop":65797},"myongchon":{"cc":"KP","lat":41.07,"lng":129.43,"pop":65797},"manpo":{"cc":"KP","lat":41.15,"lng":126.29,"pop":116760},"kilju":{"cc":"KP","lat":40.96,"lng":129.33,"pop":63652},"kanggye":{"cc":"KP","lat":40.97,"lng":126.59,"pop":209530},"hyesan-dong":{"cc":"KP","lat":41.4,"lng":128.19,"pop":97794},"hyesan":{"cc":"KP","lat":41.4,"lng":128.18,"pop":192680},"hwadae":{"cc":"KP","lat":40.84,"lng":129.5,"pop":67677},"hongwn":{"cc":"KP","lat":40.03,"lng":127.96,"pop":70923},"hongwon":{"cc":"KP","lat":40.03,"lng":127.96,"pop":70923},"chongjin":{"cc":"KP","lat":41.8,"lng":129.78,"pop":327000},"changam-chon":{"cc":"KP","lat":40.61,"lng":128.78,"pop":207299},"mynggan-dong":{"cc":"KP","lat":41.14,"lng":129.49,"pop":99557},"myonggan-dong":{"cc":"KP","lat":41.14,"lng":129.49,"pop":99557},"yeongju":{"cc":"KR","lat":36.82,"lng":128.63,"pop":84625},"yeonggwang":{"cc":"KR","lat":35.28,"lng":126.51,"pop":51688},"eisen":{"cc":"KR","lat":35.97,"lng":128.93,"pop":56006},"yeoju":{"cc":"KR","lat":37.3,"lng":127.63,"pop":111897},"yecheon":{"cc":"KR","lat":36.66,"lng":128.46,"pop":54873},"yangsan":{"cc":"KR","lat":35.34,"lng":129.03,"pop":358074},"yangpyng":{"cc":"KR","lat":37.49,"lng":127.49,"pop":83367},"yangpyong":{"cc":"KR","lat":37.49,"lng":127.49,"pop":83367},"yangju":{"cc":"KR","lat":37.83,"lng":127.06,"pop":179923},"wonju":{"cc":"KR","lat":37.35,"lng":127.95,"pop":332849},"wnju":{"cc":"KR","lat":37.35,"lng":127.95,"pop":332849},"tallang-dong":{"cc":"KR","lat":33.49,"lng":126.48,"pop":54954},"wanju":{"cc":"KR","lat":35.85,"lng":127.15,"pop":84009},"ulsan":{"cc":"KR","lat":35.54,"lng":129.32,"pop":1098421},"uijeongbu-si":{"cc":"KR","lat":37.74,"lng":127.05,"pop":479141},"daejeon":{"cc":"KR","lat":36.35,"lng":127.38,"pop":1441203},"daegu":{"cc":"KR","lat":35.87,"lng":128.59,"pop":2365523},"boryeong":{"cc":"KR","lat":36.35,"lng":126.6,"pop":94191},"suwon":{"cc":"KR","lat":37.29,"lng":127.01,"pop":1234582},"suncheon":{"cc":"KR","lat":34.95,"lng":127.49,"pop":276375},"seoul":{"cc":"KR","lat":37.57,"lng":126.98,"pop":10349312},"seosan":{"cc":"KR","lat":36.78,"lng":126.45,"pop":74208},"sokcho":{"cc":"KR","lat":38.21,"lng":128.59,"pop":81164},"siheungdong":{"cc":"KR","lat":37.45,"lng":126.91,"pop":128142},"sangju":{"cc":"KR","lat":36.42,"lng":128.16,"pop":101267},"pyeongtaek":{"cc":"KR","lat":36.99,"lng":127.09,"pop":364694},"buyeo":{"cc":"KR","lat":36.27,"lng":126.91,"pop":59823},"busan":{"cc":"KR","lat":35.1,"lng":129.03,"pop":3285147},"bucheon-si":{"cc":"KR","lat":37.5,"lng":126.78,"pop":850731},"pohang":{"cc":"KR","lat":36.03,"lng":129.36,"pop":492041},"osan":{"cc":"KR","lat":37.15,"lng":127.07,"pop":238788},"asan":{"cc":"KR","lat":36.78,"lng":127.0,"pop":97749},"okcheon":{"cc":"KR","lat":36.3,"lng":127.57,"pop":56634},"kosong":{"cc":"KR","lat":38.38,"lng":128.47,"pop":62446},"nangen":{"cc":"KR","lat":35.41,"lng":127.39,"pop":81257},"mungyeong":{"cc":"KR","lat":36.59,"lng":128.2,"pop":77304},"muan":{"cc":"KR","lat":34.99,"lng":126.48,"pop":92009},"mokpo":{"cc":"KR","lat":34.81,"lng":126.39,"pop":268402},"miryang":{"cc":"KR","lat":35.49,"lng":128.75,"pop":53103},"masan":{"cc":"KR","lat":35.13,"lng":126.83,"pop":434371},"gyeongsan-si":{"cc":"KR","lat":35.82,"lng":128.74,"pop":266951},"gyeongju":{"cc":"KR","lat":35.84,"lng":129.21,"pop":245365},"kwangyang":{"cc":"KR","lat":34.98,"lng":127.59,"pop":89281},"gwangju":{"cc":"KR","lat":35.15,"lng":126.92,"pop":1401235},"guri-si":{"cc":"KR","lat":37.6,"lng":127.14,"pop":195236},"gunsan":{"cc":"KR","lat":35.98,"lng":126.71,"pop":264656},"gunpo":{"cc":"KR","lat":37.37,"lng":126.95,"pop":286485},"gumi":{"cc":"KR","lat":36.11,"lng":128.34,"pop":404691},"goyang-si":{"cc":"KR","lat":37.66,"lng":126.83,"pop":1061752},"gongju":{"cc":"KR","lat":36.46,"lng":127.12,"pop":72435},"kyosai":{"cc":"KR","lat":34.85,"lng":128.59,"pop":72124},"kochang":{"cc":"KR","lat":35.43,"lng":126.7,"pop":72996},"gimpo-si":{"cc":"KR","lat":37.62,"lng":126.71,"pop":203391},"kimhae":{"cc":"KR","lat":35.23,"lng":128.88,"pop":531966},"gimcheon":{"cc":"KR","lat":36.12,"lng":128.12,"pop":150000},"gijang":{"cc":"KR","lat":35.24,"lng":129.21,"pop":176388},"gapyeong":{"cc":"KR","lat":37.83,"lng":127.51,"pop":55415},"gangneung":{"cc":"KR","lat":37.75,"lng":128.87,"pop":208161},"iksan":{"cc":"KR","lat":35.94,"lng":126.95,"pop":307000},"incheon":{"cc":"KR","lat":37.46,"lng":126.71,"pop":3015482},"icheon-si":{"cc":"KR","lat":37.28,"lng":127.44,"pop":196230},"hwasun":{"cc":"KR","lat":35.06,"lng":126.99,"pop":59914},"hwaseong-si":{"cc":"KR","lat":37.21,"lng":126.82,"pop":640890},"hongseong":{"cc":"KR","lat":36.6,"lng":126.67,"pop":89174},"hongchon":{"cc":"KR","lat":37.69,"lng":127.89,"pop":75251},"hongchn":{"cc":"KR","lat":37.69,"lng":127.89,"pop":75251},"tongyeong":{"cc":"KR","lat":34.85,"lng":128.43,"pop":70641},"chungju":{"cc":"KR","lat":36.98,"lng":127.93,"pop":209483},"chuncheon":{"cc":"KR","lat":37.87,"lng":127.73,"pop":284855},"jeonju":{"cc":"KR","lat":35.82,"lng":127.15,"pop":638421},"cheongju-si":{"cc":"KR","lat":36.64,"lng":127.49,"pop":852147},"cheonan":{"cc":"KR","lat":36.81,"lng":127.15,"pop":658831},"chinju":{"cc":"KR","lat":35.19,"lng":128.08,"pop":307242},"chinchon":{"cc":"KR","lat":36.86,"lng":127.44,"pop":60964},"chinchn":{"cc":"KR","lat":36.86,"lng":127.44,"pop":60964},"jeju city":{"cc":"KR","lat":33.51,"lng":126.52,"pop":488844},"changwon":{"cc":"KR","lat":35.23,"lng":128.68,"pop":1025702},"anyang-si":{"cc":"KR","lat":37.39,"lng":126.93,"pop":595644},"anseong":{"cc":"KR","lat":37.01,"lng":127.27,"pop":69255},"ansan-si":{"cc":"KR","lat":37.32,"lng":126.82,"pop":623256},"andong":{"cc":"KR","lat":36.57,"lng":128.72,"pop":153348},"sinhyeon":{"cc":"KR","lat":34.88,"lng":128.63,"pop":82560},"yeosu":{"cc":"KR","lat":34.76,"lng":127.66,"pop":268823},"gwangyang":{"cc":"KR","lat":34.94,"lng":127.7,"pop":154266},"donghae city":{"cc":"KR","lat":37.54,"lng":129.11,"pop":101128},"pubal":{"cc":"KR","lat":37.29,"lng":127.51,"pop":63026},"seongnam-si":{"cc":"KR","lat":37.44,"lng":127.14,"pop":914832},"hanam":{"cc":"KR","lat":37.54,"lng":127.21,"pop":254415},"hwado":{"cc":"KR","lat":37.65,"lng":127.31,"pop":106358},"namyangju":{"cc":"KR","lat":37.64,"lng":127.21,"pop":90798},"ungsang":{"cc":"KR","lat":35.41,"lng":129.17,"pop":83360},"wabu":{"cc":"KR","lat":37.59,"lng":127.22,"pop":96775},"naeso":{"cc":"KR","lat":35.25,"lng":128.52,"pop":80987},"naes":{"cc":"KR","lat":35.25,"lng":128.52,"pop":80987},"hwawon":{"cc":"KR","lat":35.8,"lng":128.5,"pop":64718},"hwawn":{"cc":"KR","lat":35.8,"lng":128.5,"pop":64718},"gwangmyeong":{"cc":"KR","lat":37.48,"lng":126.87,"pop":357545},"sinan":{"cc":"KR","lat":34.83,"lng":126.11,"pop":53150},"uiwang":{"cc":"KR","lat":37.37,"lng":126.95,"pop":63040},"seogwipo":{"cc":"KR","lat":33.25,"lng":126.56,"pop":178552},"changnyeong":{"cc":"KR","lat":35.54,"lng":128.5,"pop":74668},"geoje":{"cc":"KR","lat":34.81,"lng":128.71,"pop":232921},"sejong":{"cc":"KR","lat":36.59,"lng":127.29,"pop":394630},"jeongeup":{"cc":"KR","lat":35.6,"lng":126.92,"pop":139876},"yeongam":{"cc":"KR","lat":34.8,"lng":126.7,"pop":51573},"awall":{"cc":"KW","lat":29.33,"lng":48.03,"pop":164212},"hawalli":{"cc":"KW","lat":29.33,"lng":48.03,"pop":164212},"as slimyah":{"cc":"KW","lat":29.33,"lng":48.08,"pop":147649},"as salimiyah":{"cc":"KW","lat":29.33,"lng":48.08,"pop":147649},"ar rumaythyah":{"cc":"KW","lat":29.31,"lng":48.07,"pop":58135},"ar rumaythiyah":{"cc":"KW","lat":29.31,"lng":48.07,"pop":58135},"ar riqqah":{"cc":"KW","lat":29.15,"lng":48.09,"pop":52068},"kuwait city":{"cc":"KW","lat":29.37,"lng":47.97,"pop":60064},"al fal":{"cc":"KW","lat":29.08,"lng":48.13,"pop":68290},"al fahahil":{"cc":"KW","lat":29.08,"lng":48.13,"pop":68290},"al farwaniyah":{"cc":"KW","lat":29.28,"lng":47.96,"pop":86525},"al farwnyah":{"cc":"KW","lat":29.28,"lng":47.96,"pop":86525},"al amad":{"cc":"KW","lat":29.08,"lng":48.08,"pop":637411},"al ahmadi":{"cc":"KW","lat":29.08,"lng":48.08,"pop":637411},"ab as slim":{"cc":"KW","lat":29.26,"lng":48.06,"pop":139163},"sabah as salim":{"cc":"KW","lat":29.26,"lng":48.06,"pop":139163},"zhanaozen":{"cc":"KZ","lat":43.34,"lng":52.86,"pop":103598},"oral":{"cc":"KZ","lat":51.25,"lng":51.43,"pop":330000},"qulsary":{"cc":"KZ","lat":46.95,"lng":54.02,"pop":51216},"karagandy":{"cc":"KZ","lat":49.8,"lng":73.1,"pop":497777},"atyrau":{"cc":"KZ","lat":47.1,"lng":51.88,"pop":290700},"aktobe":{"cc":"KZ","lat":50.28,"lng":57.21,"pop":500757},"aktau":{"cc":"KZ","lat":43.66,"lng":51.17,"pop":147443},"zhezqazghan":{"cc":"KZ","lat":47.79,"lng":67.71,"pop":104357},"taraz":{"cc":"KZ","lat":42.9,"lng":71.37,"pop":358153},"turkistan":{"cc":"KZ","lat":43.29,"lng":68.26,"pop":227098},"temirtau":{"cc":"KZ","lat":50.05,"lng":72.95,"pop":170600},"taldykorgan":{"cc":"KZ","lat":45.02,"lng":78.37,"pop":116558},"shymkent":{"cc":"KZ","lat":42.31,"lng":69.6,"pop":1200000},"semey":{"cc":"KZ","lat":50.42,"lng":80.25,"pop":292780},"sarqant":{"cc":"KZ","lat":45.41,"lng":79.92,"pop":76919},"rudnyy":{"cc":"KZ","lat":52.97,"lng":63.11,"pop":124000},"kyzylorda":{"cc":"KZ","lat":44.85,"lng":65.51,"pop":354800},"kostanay":{"cc":"KZ","lat":53.21,"lng":63.62,"pop":210000},"petropavl":{"cc":"KZ","lat":54.87,"lng":69.15,"pop":200920},"pavlodar":{"cc":"KZ","lat":52.28,"lng":76.97,"pop":329002},"ust-kamenogorsk":{"cc":"KZ","lat":49.97,"lng":82.61,"pop":319067},"satpayev":{"cc":"KZ","lat":47.9,"lng":67.54,"pop":69782},"baikonur":{"cc":"KZ","lat":45.62,"lng":63.32,"pop":70000},"ridder":{"cc":"KZ","lat":50.35,"lng":83.52,"pop":52664},"kokshetau":{"cc":"KZ","lat":53.28,"lng":69.39,"pop":150649},"kentau":{"cc":"KZ","lat":43.52,"lng":68.5,"pop":57408},"ekibastuz":{"cc":"KZ","lat":51.72,"lng":75.32,"pop":121470},"balqash":{"cc":"KZ","lat":46.85,"lng":74.98,"pop":81364},"astana":{"cc":"KZ","lat":51.18,"lng":71.45,"pop":1544142},"almaty":{"cc":"KZ","lat":43.25,"lng":76.91,"pop":1977011},"vientiane":{"cc":"LA","lat":17.97,"lng":102.6,"pop":840940},"xam nua":{"cc":"LA","lat":20.42,"lng":104.05,"pop":56900},"savannakhet":{"cc":"LA","lat":16.57,"lng":104.76,"pop":125760},"pakse":{"cc":"LA","lat":15.12,"lng":105.8,"pop":77900},"thakhek":{"cc":"LA","lat":17.41,"lng":104.83,"pop":90800},"thakhk":{"cc":"LA","lat":17.41,"lng":104.83,"pop":90800},"luang prabang":{"cc":"LA","lat":19.89,"lng":102.15,"pop":55027},"ban khoan":{"cc":"LA","lat":20.35,"lng":100.09,"pop":65348},"zahle":{"cc":"LB","lat":33.85,"lng":35.9,"pop":78145},"zahl":{"cc":"LB","lat":33.85,"lng":35.9,"pop":78145},"tyre":{"cc":"LB","lat":33.27,"lng":35.19,"pop":135204},"sidon":{"cc":"LB","lat":33.56,"lng":35.37,"pop":163554},"ras bayrut":{"cc":"LB","lat":33.9,"lng":35.48,"pop":1251739},"ras bayrt":{"cc":"LB","lat":33.9,"lng":35.48,"pop":1251739},"jounieh":{"cc":"LB","lat":33.98,"lng":35.62,"pop":96315},"aarsal":{"cc":"LB","lat":34.18,"lng":36.42,"pop":50000},"aarsl":{"cc":"LB","lat":34.18,"lng":36.42,"pop":50000},"habboch":{"cc":"LB","lat":33.41,"lng":35.48,"pop":98433},"habbouch":{"cc":"LB","lat":33.41,"lng":35.48,"pop":98433},"beirut":{"cc":"LB","lat":33.89,"lng":35.5,"pop":1916100},"nabaty et tahta":{"cc":"LB","lat":33.38,"lng":35.48,"pop":120000},"nabatiye et tahta":{"cc":"LB","lat":33.38,"lng":35.48,"pop":120000},"ghazieh":{"cc":"LB","lat":33.52,"lng":35.37,"pop":50000},"aley":{"cc":"LB","lat":33.81,"lng":35.6,"pop":130000},"vavuniya":{"cc":"LK","lat":8.75,"lng":80.5,"pop":60176},"valvedditturai":{"cc":"LK","lat":9.82,"lng":80.17,"pop":78205},"trincomalee":{"cc":"LK","lat":8.58,"lng":81.23,"pop":108420},"point pedro":{"cc":"LK","lat":9.82,"lng":80.23,"pop":89810},"pita kotte":{"cc":"LK","lat":6.89,"lng":79.9,"pop":118179},"negombo":{"cc":"LK","lat":7.21,"lng":79.84,"pop":137223},"dehiwala-mount lavinia":{"cc":"LK","lat":6.84,"lng":79.87,"pop":219827},"moratuwa":{"cc":"LK","lat":6.77,"lng":79.88,"pop":168280},"matara":{"cc":"LK","lat":5.95,"lng":80.54,"pop":76254},"maharagama":{"cc":"LK","lat":6.85,"lng":79.93,"pop":195355},"sri jayewardenepura kotte":{"cc":"LK","lat":6.88,"lng":79.91,"pop":115826},"kotikawatta":{"cc":"LK","lat":6.93,"lng":79.91,"pop":64565},"kolonnawa":{"cc":"LK","lat":6.93,"lng":79.88,"pop":64887},"katunayaka":{"cc":"LK","lat":7.17,"lng":79.89,"pop":84643},"kandy":{"cc":"LK","lat":7.29,"lng":80.63,"pop":111701},"kalmunai":{"cc":"LK","lat":7.41,"lng":81.83,"pop":100171},"jaffna":{"cc":"LK","lat":9.67,"lng":80.01,"pop":169102},"hendala":{"cc":"LK","lat":6.99,"lng":79.88,"pop":56978},"galle":{"cc":"LK","lat":6.05,"lng":80.21,"pop":93118},"dambulla":{"cc":"LK","lat":7.86,"lng":80.65,"pop":66716},"beliatta":{"cc":"LK","lat":6.05,"lng":80.73,"pop":58675},"batticaloa":{"cc":"LK","lat":7.71,"lng":81.69,"pop":86742},"battaramulla south":{"cc":"LK","lat":6.9,"lng":79.92,"pop":75633},"anuradhapura":{"cc":"LK","lat":8.31,"lng":80.41,"pop":60943},"ambalantota":{"cc":"LK","lat":6.12,"lng":81.02,"pop":80506},"ambalangoda":{"cc":"LK","lat":6.24,"lng":80.05,"pop":56783},"monrovia":{"cc":"LR","lat":6.3,"lng":-10.8,"pop":1542549},"kakata":{"cc":"LR","lat":6.53,"lng":-10.35,"pop":52247},"gbarnga":{"cc":"LR","lat":7.0,"lng":-9.47,"pop":86031},"ganta":{"cc":"LR","lat":7.24,"lng":-8.98,"pop":63523},"buchanan":{"cc":"LR","lat":5.88,"lng":-10.05,"pop":75854},"maseru":{"cc":"LS","lat":-29.32,"lng":27.48,"pop":359753},"maputsoe":{"cc":"LS","lat":-28.89,"lng":27.9,"pop":61916},"vilnius":{"cc":"LT","lat":54.69,"lng":25.28,"pop":542366},"iauliai":{"cc":"LT","lat":55.93,"lng":23.32,"pop":99462},"siauliai":{"cc":"LT","lat":55.93,"lng":23.32,"pop":99462},"panevezys":{"cc":"LT","lat":55.73,"lng":24.36,"pop":85885},"panevys":{"cc":"LT","lat":55.73,"lng":24.36,"pop":85885},"klaipda":{"cc":"LT","lat":55.71,"lng":21.14,"pop":172292},"klaipeda":{"cc":"LT","lat":55.71,"lng":21.14,"pop":172292},"kaunas":{"cc":"LT","lat":54.9,"lng":23.91,"pop":289380},"dainava":{"cc":"LT","lat":54.92,"lng":23.97,"pop":70000},"luxembourg":{"cc":"LU","lat":49.61,"lng":6.13,"pop":76684},"riga":{"cc":"LV","lat":56.95,"lng":24.11,"pop":742572},"liepja":{"cc":"LV","lat":56.5,"lng":21.01,"pop":67421},"liepaja":{"cc":"LV","lat":56.5,"lng":21.01,"pop":67421},"jurmala":{"cc":"LV","lat":56.97,"lng":23.77,"pop":52001},"jrmala":{"cc":"LV","lat":56.97,"lng":23.77,"pop":52001},"jelgava":{"cc":"LV","lat":56.65,"lng":23.71,"pop":54834},"daugavpils":{"cc":"LV","lat":55.88,"lng":26.53,"pop":78126},"tobruk":{"cc":"LY","lat":32.09,"lng":23.95,"pop":141499},"darnah":{"cc":"LY","lat":32.77,"lng":22.64,"pop":102581},"benghazi":{"cc":"LY","lat":32.11,"lng":20.07,"pop":757490},"al marj":{"cc":"LY","lat":32.49,"lng":20.83,"pop":85315},"al bay":{"cc":"LY","lat":32.76,"lng":21.76,"pop":129439},"al bayda":{"cc":"LY","lat":32.76,"lng":21.76,"pop":129439},"ajdabiya":{"cc":"LY","lat":30.76,"lng":20.23,"pop":131773},"zliten":{"cc":"LY","lat":32.47,"lng":14.57,"pop":203790},"tarhuna":{"cc":"LY","lat":32.44,"lng":13.63,"pop":52420},"tajura":{"cc":"LY","lat":32.88,"lng":13.35,"pop":100000},"tjr":{"cc":"LY","lat":32.88,"lng":13.35,"pop":100000},"sirte":{"cc":"LY","lat":31.21,"lng":16.59,"pop":106705},"urmn":{"cc":"LY","lat":32.76,"lng":12.57,"pop":77114},"surman":{"cc":"LY","lat":32.76,"lng":12.57,"pop":77114},"sabratah":{"cc":"LY","lat":32.79,"lng":12.49,"pop":83398},"abrtah":{"cc":"LY","lat":32.79,"lng":12.49,"pop":83398},"sabha":{"cc":"LY","lat":27.04,"lng":14.43,"pop":149329},"qasr bin ghashir":{"cc":"LY","lat":32.68,"lng":13.18,"pop":100069},"qar bin ghashr":{"cc":"LY","lat":32.68,"lng":13.18,"pop":100069},"misratah":{"cc":"LY","lat":32.38,"lng":15.09,"pop":355657},"janzr":{"cc":"LY","lat":32.82,"lng":13.02,"pop":154389},"janzur":{"cc":"LY","lat":32.82,"lng":13.02,"pop":154389},"zawiya":{"cc":"LY","lat":32.75,"lng":12.73,"pop":186123},"az zwyah":{"cc":"LY","lat":32.76,"lng":12.73,"pop":200000},"az zawiyah":{"cc":"LY","lat":32.76,"lng":12.73,"pop":200000},"as sawn":{"cc":"LY","lat":32.72,"lng":13.07,"pop":57069},"as sawani":{"cc":"LY","lat":32.72,"lng":13.07,"pop":57069},"al ajaylat":{"cc":"LY","lat":32.76,"lng":12.38,"pop":130546},"al khums":{"cc":"LY","lat":32.65,"lng":14.26,"pop":201943},"al jumayl":{"cc":"LY","lat":32.85,"lng":12.06,"pop":102000},"al jadid":{"cc":"LY","lat":27.05,"lng":14.4,"pop":126386},"al jadd":{"cc":"LY","lat":27.05,"lng":14.4,"pop":126386},"al urshah":{"cc":"LY","lat":32.76,"lng":12.67,"pop":81119},"al hurshah":{"cc":"LY","lat":32.76,"lng":12.67,"pop":81119},"al aziziyah":{"cc":"LY","lat":32.53,"lng":13.02,"pop":52404},"al azzyah":{"cc":"LY","lat":32.53,"lng":13.02,"pop":52404},"msalatah":{"cc":"LY","lat":32.58,"lng":14.04,"pop":73907},"msaltah":{"cc":"LY","lat":32.58,"lng":14.04,"pop":73907},"youssoufia":{"cc":"MA","lat":32.25,"lng":-8.53,"pop":73848},"tiznit":{"cc":"MA","lat":29.7,"lng":-9.73,"pop":81569},"tirhanimne":{"cc":"MA","lat":35.24,"lng":-3.95,"pop":55827},"tirhanimine":{"cc":"MA","lat":35.24,"lng":-3.95,"pop":55827},"tiflet":{"cc":"MA","lat":33.89,"lng":-6.31,"pop":94684},"tetouan":{"cc":"MA","lat":35.58,"lng":-5.37,"pop":415810},"ttouan":{"cc":"MA","lat":35.58,"lng":-5.37,"pop":415810},"temara":{"cc":"MA","lat":33.93,"lng":-6.91,"pop":342345},"taza":{"cc":"MA","lat":34.21,"lng":-4.01,"pop":162110},"taroudant":{"cc":"MA","lat":30.47,"lng":-8.88,"pop":87520},"taourirt":{"cc":"MA","lat":34.41,"lng":-2.9,"pop":112908},"tan-tan":{"cc":"MA","lat":28.44,"lng":-11.1,"pop":79942},"tangier":{"cc":"MA","lat":35.77,"lng":-5.8,"pop":1035141},"souq sebt oulad nemma":{"cc":"MA","lat":32.3,"lng":-6.7,"pop":65601},"sidi slimane":{"cc":"MA","lat":34.26,"lng":-5.93,"pop":101541},"sidi kacem":{"cc":"MA","lat":34.22,"lng":-5.71,"pop":82632},"sidi bennour":{"cc":"MA","lat":32.65,"lng":-8.43,"pop":60948},"settat":{"cc":"MA","lat":33.0,"lng":-7.62,"pop":155333},"sefrou":{"cc":"MA","lat":33.83,"lng":-4.83,"pop":87234},"sal":{"cc":"MA","lat":34.05,"lng":-6.8,"pop":972299},"safi":{"cc":"MA","lat":32.3,"lng":-9.24,"pop":336883},"rabat":{"cc":"MA","lat":34.01,"lng":-6.83,"pop":1655753},"oulad teima":{"cc":"MA","lat":30.39,"lng":-9.21,"pop":97608},"oulad tema":{"cc":"MA","lat":30.39,"lng":-9.21,"pop":97608},"oujda":{"cc":"MA","lat":34.68,"lng":-1.91,"pop":539711},"oued zem":{"cc":"MA","lat":32.86,"lng":-6.57,"pop":104029},"ouezzane":{"cc":"MA","lat":34.8,"lng":-5.58,"pop":65088},"ouarzazate":{"cc":"MA","lat":30.92,"lng":-6.89,"pop":77603},"nador":{"cc":"MA","lat":35.17,"lng":-2.93,"pop":176600},"al aaroui":{"cc":"MA","lat":35.01,"lng":-3.01,"pop":51976},"mohammedia":{"cc":"MA","lat":33.69,"lng":-7.38,"pop":227799},"midelt":{"cc":"MA","lat":32.69,"lng":-4.75,"pop":60390},"meknes":{"cc":"MA","lat":33.89,"lng":-5.55,"pop":568295},"mdiq":{"cc":"MA","lat":35.68,"lng":-5.33,"pop":61398},"martil":{"cc":"MA","lat":35.62,"lng":-5.28,"pop":70274},"marrakesh":{"cc":"MA","lat":31.63,"lng":-8.0,"pop":995871},"larache":{"cc":"MA","lat":35.19,"lng":-6.16,"pop":136505},"ksar el kebir":{"cc":"MA","lat":35.0,"lng":-5.9,"pop":138262},"khouribga":{"cc":"MA","lat":32.88,"lng":-6.91,"pop":214241},"khenifra":{"cc":"MA","lat":32.93,"lng":-5.66,"pop":128318},"kenitra":{"cc":"MA","lat":34.26,"lng":-6.58,"pop":470949},"kasba tadla":{"cc":"MA","lat":32.6,"lng":-6.27,"pop":51697},"inezgane":{"cc":"MA","lat":30.36,"lng":-9.54,"pop":142320},"ifrane":{"cc":"MA","lat":33.53,"lng":-5.11,"pop":73782},"guercif":{"cc":"MA","lat":34.23,"lng":-3.35,"pop":99238},"guelmim":{"cc":"MA","lat":28.99,"lng":-10.06,"pop":129200},"fnidek":{"cc":"MA","lat":35.85,"lng":-5.36,"pop":84558},"al fqih ben alah":{"cc":"MA","lat":32.5,"lng":-6.69,"pop":111402},"al fqih ben calah":{"cc":"MA","lat":32.5,"lng":-6.69,"pop":111402},"fes al bali":{"cc":"MA","lat":34.07,"lng":-4.95,"pop":156000},"fs al bali":{"cc":"MA","lat":34.07,"lng":-4.95,"pop":156000},"fes":{"cc":"MA","lat":34.03,"lng":-5.0,"pop":1191905},"essaouira":{"cc":"MA","lat":31.51,"lng":-9.77,"pop":85137},"el kelaa des srarhna":{"cc":"MA","lat":32.05,"lng":-7.41,"pop":103982},"el jadida":{"cc":"MA","lat":33.26,"lng":-8.51,"pop":212863},"ad darwa":{"cc":"MA","lat":33.37,"lng":-7.54,"pop":52108},"dar bouazza":{"cc":"MA","lat":33.52,"lng":-7.82,"pop":165295},"casablanca":{"cc":"MA","lat":33.59,"lng":-7.61,"pop":3665954},"bouskoura":{"cc":"MA","lat":33.45,"lng":-7.65,"pop":112501},"berkane":{"cc":"MA","lat":34.92,"lng":-2.32,"pop":119284},"benslimane":{"cc":"MA","lat":33.62,"lng":-7.12,"pop":62352},"ben jerrar":{"cc":"MA","lat":30.26,"lng":-9.5,"pop":53026},"beni mellal":{"cc":"MA","lat":32.34,"lng":-6.35,"pop":210397},"beni enzar":{"cc":"MA","lat":35.26,"lng":-2.93,"pop":61786},"ben guerir":{"cc":"MA","lat":32.24,"lng":-7.95,"pop":96777},"berrechid":{"cc":"MA","lat":33.27,"lng":-7.59,"pop":149201},"azrou":{"cc":"MA","lat":33.43,"lng":-5.22,"pop":59348},"khemisset":{"cc":"MA","lat":33.82,"lng":-6.07,"pop":143640},"al hocema":{"cc":"MA","lat":35.25,"lng":-3.94,"pop":395644},"al hoceima":{"cc":"MA","lat":35.25,"lng":-3.94,"pop":395644},"ain harrouda":{"cc":"MA","lat":33.64,"lng":-7.45,"pop":68161},"an harrouda":{"cc":"MA","lat":33.64,"lng":-7.45,"pop":68161},"ain el aouda":{"cc":"MA","lat":33.8,"lng":-6.79,"pop":54397},"agadir":{"cc":"MA","lat":30.42,"lng":-9.6,"pop":698310},"skhirate":{"cc":"MA","lat":33.85,"lng":-7.03,"pop":65272},"errachidia":{"cc":"MA","lat":31.93,"lng":-4.43,"pop":100870},"dchira el jihadia":{"cc":"MA","lat":30.37,"lng":-9.55,"pop":109564},"ait melloul":{"cc":"MA","lat":30.34,"lng":-9.5,"pop":187652},"lqoliaa":{"cc":"MA","lat":30.3,"lng":-9.47,"pop":90890},"my drarga":{"cc":"MA","lat":30.38,"lng":-9.47,"pop":55631},"sidi taibi":{"cc":"MA","lat":34.19,"lng":-6.68,"pop":51050},"sale al jadida":{"cc":"MA","lat":34.0,"lng":-6.74,"pop":200000},"sal al jadida":{"cc":"MA","lat":34.0,"lng":-6.74,"pop":200000},"bejaad":{"cc":"MA","lat":32.77,"lng":-6.39,"pop":51206},"bejad":{"cc":"MA","lat":32.77,"lng":-6.39,"pop":51206},"ouislane":{"cc":"MA","lat":33.91,"lng":-5.49,"pop":95995},"lahraouyine":{"cc":"MA","lat":33.54,"lng":-7.53,"pop":70783},"souk el arbaa":{"cc":"MA","lat":34.68,"lng":-6.0,"pop":75635},"tiraspol":{"cc":"MD","lat":46.84,"lng":29.63,"pop":157000},"ribnita":{"cc":"MD","lat":47.77,"lng":29.01,"pop":55455},"rbnia":{"cc":"MD","lat":47.77,"lng":29.01,"pop":55455},"chisinau":{"cc":"MD","lat":47.01,"lng":28.86,"pop":635994},"bender":{"cc":"MD","lat":46.83,"lng":29.48,"pop":110175},"balti":{"cc":"MD","lat":47.76,"lng":27.93,"pop":125000},"podgorica":{"cc":"ME","lat":42.44,"lng":19.26,"pop":236852},"niki":{"cc":"ME","lat":42.77,"lng":18.94,"pop":58212},"niksic":{"cc":"ME","lat":42.77,"lng":18.94,"pop":58212},"toamasina":{"cc":"MG","lat":-18.15,"lng":49.4,"pop":345107},"toliara":{"cc":"MG","lat":-23.35,"lng":43.67,"pop":178725},"tlanaro":{"cc":"MG","lat":-25.03,"lng":46.98,"pop":71258},"tolanaro":{"cc":"MG","lat":-25.03,"lng":46.98,"pop":71258},"sambava":{"cc":"MG","lat":-14.27,"lng":50.17,"pop":89003},"morondava":{"cc":"MG","lat":-20.29,"lng":44.32,"pop":56671},"moramanga":{"cc":"MG","lat":-18.95,"lng":48.23,"pop":60456},"mahajanga":{"cc":"MG","lat":-15.72,"lng":46.32,"pop":260556},"ivato":{"cc":"MG","lat":-18.8,"lng":47.48,"pop":52376},"imerintsiatosika":{"cc":"MG","lat":-18.98,"lng":47.32,"pop":74085},"fianarantsoa":{"cc":"MG","lat":-21.45,"lng":47.09,"pop":203105},"antsiranana":{"cc":"MG","lat":-12.32,"lng":49.29,"pop":136959},"antsirabe":{"cc":"MG","lat":-19.87,"lng":47.03,"pop":260907},"antsalova":{"cc":"MG","lat":-18.67,"lng":44.62,"pop":58280},"antanifotsy":{"cc":"MG","lat":-19.65,"lng":47.32,"pop":70626},"antananarivo":{"cc":"MG","lat":-18.91,"lng":47.54,"pop":1349501},"antalaha":{"cc":"MG","lat":-14.9,"lng":50.28,"pop":71898},"hell-ville":{"cc":"MG","lat":-13.4,"lng":48.27,"pop":53219},"ambovombe":{"cc":"MG","lat":-25.18,"lng":46.09,"pop":69265},"ambilobe":{"cc":"MG","lat":-13.2,"lng":49.05,"pop":66029},"ambatondrazaka":{"cc":"MG","lat":-17.83,"lng":48.42,"pop":50463},"ambanja":{"cc":"MG","lat":-13.67,"lng":48.45,"pop":63884},"veles":{"cc":"MK","lat":41.72,"lng":21.77,"pop":57873},"tetovo":{"cc":"MK","lat":42.01,"lng":20.97,"pop":63176},"skopje":{"cc":"MK","lat":42.0,"lng":21.43,"pop":474889},"prilep":{"cc":"MK","lat":41.35,"lng":21.55,"pop":73814},"kumanovo":{"cc":"MK","lat":42.13,"lng":21.72,"pop":75051},"gostivar":{"cc":"MK","lat":41.8,"lng":20.91,"pop":50974},"bitola":{"cc":"MK","lat":41.03,"lng":21.34,"pop":69287},"cair":{"cc":"MK","lat":42.02,"lng":21.44,"pop":64773},"air":{"cc":"MK","lat":42.02,"lng":21.44,"pop":64773},"kisela voda":{"cc":"MK","lat":41.95,"lng":21.5,"pop":58216},"timbuktu":{"cc":"ML","lat":16.77,"lng":-3.01,"pop":84208},"sikasso":{"cc":"ML","lat":11.32,"lng":-5.67,"pop":349324},"segou":{"cc":"ML","lat":13.44,"lng":-6.26,"pop":205787},"sgou":{"cc":"ML","lat":13.44,"lng":-6.26,"pop":205787},"san":{"cc":"ML","lat":13.3,"lng":-4.9,"pop":103227},"nioro":{"cc":"ML","lat":15.23,"lng":-9.59,"pop":51933},"niono":{"cc":"ML","lat":14.25,"lng":-5.99,"pop":52584},"mopti":{"cc":"ML","lat":14.48,"lng":-4.18,"pop":186187},"markala":{"cc":"ML","lat":13.68,"lng":-6.07,"pop":53738},"koutiala":{"cc":"ML","lat":12.39,"lng":-5.47,"pop":218031},"koulikoro":{"cc":"ML","lat":12.86,"lng":-7.56,"pop":64128},"kati":{"cc":"ML","lat":12.74,"lng":-8.07,"pop":130254},"kalaban koro":{"cc":"ML","lat":12.57,"lng":-8.03,"pop":148247},"gao":{"cc":"ML","lat":16.27,"lng":-0.04,"pop":133110},"plngana":{"cc":"ML","lat":13.43,"lng":-6.22,"pop":50552},"pelengana":{"cc":"ML","lat":13.43,"lng":-6.22,"pop":50552},"fana":{"cc":"ML","lat":12.78,"lng":-6.96,"pop":56809},"bougouni":{"cc":"ML","lat":11.42,"lng":-7.48,"pop":90234},"bamako":{"cc":"ML","lat":12.61,"lng":-7.98,"pop":4227569},"dialakorodji":{"cc":"ML","lat":12.7,"lng":-7.96,"pop":70619},"yenangyaung":{"cc":"MM","lat":20.47,"lng":94.87,"pop":110553},"yawnghwe":{"cc":"MM","lat":20.66,"lng":96.93,"pop":188083},"yamethin":{"cc":"MM","lat":20.43,"lng":96.14,"pop":59867},"taungoo":{"cc":"MM","lat":18.94,"lng":96.43,"pop":106945},"thongwa":{"cc":"MM","lat":16.76,"lng":96.52,"pop":52496},"thayetmyo":{"cc":"MM","lat":19.32,"lng":95.18,"pop":98185},"thaton":{"cc":"MM","lat":16.92,"lng":97.37,"pop":123727},"tharyarwady":{"cc":"MM","lat":17.65,"lng":95.79,"pop":54386},"thanhlyin":{"cc":"MM","lat":16.78,"lng":96.25,"pop":78667},"thanbyuzayat":{"cc":"MM","lat":15.97,"lng":97.73,"pop":57208},"dawei":{"cc":"MM","lat":14.08,"lng":98.19,"pop":136783},"taunggyi":{"cc":"MM","lat":20.79,"lng":97.04,"pop":160115},"taungdwingyi":{"cc":"MM","lat":20.01,"lng":95.55,"pop":70094},"taikkyi":{"cc":"MM","lat":17.31,"lng":95.96,"pop":88000},"tachilek":{"cc":"MM","lat":20.45,"lng":99.88,"pop":51553},"thanlyin":{"cc":"MM","lat":16.77,"lng":96.25,"pop":69448},"sittwe":{"cc":"MM","lat":20.15,"lng":92.9,"pop":177743},"shwegu":{"cc":"MM","lat":24.23,"lng":96.79,"pop":58696},"shwebo":{"cc":"MM","lat":22.57,"lng":95.7,"pop":88914},"sagaing":{"cc":"MM","lat":21.88,"lng":95.98,"pop":78739},"yangon":{"cc":"MM","lat":16.81,"lng":96.16,"pop":4477638},"pyinmana":{"cc":"MM","lat":19.74,"lng":96.21,"pop":97409},"pyay":{"cc":"MM","lat":18.82,"lng":95.22,"pop":135308},"bago":{"cc":"MM","lat":17.34,"lng":96.48,"pop":244376},"pakokku":{"cc":"MM","lat":21.33,"lng":95.08,"pop":126938},"hpa-an":{"cc":"MM","lat":16.89,"lng":97.63,"pop":50000},"nyaunglebin":{"cc":"MM","lat":17.95,"lng":96.72,"pop":89626},"myitkyina":{"cc":"MM","lat":25.38,"lng":97.4,"pop":90894},"myingyan":{"cc":"MM","lat":21.46,"lng":95.39,"pop":141713},"myaungmya":{"cc":"MM","lat":16.6,"lng":94.92,"pop":58205},"mu-se":{"cc":"MM","lat":24.0,"lng":97.9,"pop":165022},"mudon":{"cc":"MM","lat":16.26,"lng":97.72,"pop":89123},"mawlamyine":{"cc":"MM","lat":16.49,"lng":97.63,"pop":438861},"monywa":{"cc":"MM","lat":22.11,"lng":95.14,"pop":182011},"mng yang":{"cc":"MM","lat":21.85,"lng":99.68,"pop":117108},"moeng yang":{"cc":"MM","lat":21.85,"lng":99.68,"pop":117108},"mogok":{"cc":"MM","lat":22.92,"lng":96.51,"pop":89855},"mingaladon":{"cc":"MM","lat":16.92,"lng":96.1,"pop":136000},"minbu":{"cc":"MM","lat":20.18,"lng":94.88,"pop":57342},"myeik":{"cc":"MM","lat":12.44,"lng":98.6,"pop":173298},"meiktila":{"cc":"MM","lat":20.88,"lng":95.86,"pop":177442},"pyin oo lwin":{"cc":"MM","lat":22.04,"lng":96.46,"pop":117303},"mandalay":{"cc":"MM","lat":21.97,"lng":96.08,"pop":1208099},"manaung":{"cc":"MM","lat":18.85,"lng":93.73,"pop":50680},"magway":{"cc":"MM","lat":20.15,"lng":94.93,"pop":96954},"lashio":{"cc":"MM","lat":22.94,"lng":97.75,"pop":131000},"lakang":{"cc":"MM","lat":24.66,"lng":97.19,"pop":85423},"kyauktan":{"cc":"MM","lat":16.64,"lng":96.33,"pop":132765},"kyaukse":{"cc":"MM","lat":21.61,"lng":96.14,"pop":50480},"kyaukpyu":{"cc":"MM","lat":19.43,"lng":93.55,"pop":180000},"kyaiklat":{"cc":"MM","lat":16.45,"lng":95.72,"pop":52425},"kng tung":{"cc":"MM","lat":21.63,"lng":99.93,"pop":171620},"keng tung":{"cc":"MM","lat":21.63,"lng":99.93,"pop":171620},"kyimyindine":{"cc":"MM","lat":16.81,"lng":96.12,"pop":111514},"kawthoung":{"cc":"MM","lat":9.98,"lng":98.55,"pop":57949},"kanbe":{"cc":"MM","lat":16.71,"lng":96.0,"pop":58146},"kalemyo":{"cc":"MM","lat":23.19,"lng":94.06,"pop":348573},"kalaw":{"cc":"MM","lat":20.63,"lng":96.56,"pop":93032},"insein":{"cc":"MM","lat":16.89,"lng":96.1,"pop":247675},"hpakan":{"cc":"MM","lat":25.61,"lng":96.31,"pop":60123},"hpkn":{"cc":"MM","lat":25.61,"lng":96.31,"pop":60123},"hinthada":{"cc":"MM","lat":17.65,"lng":95.46,"pop":134947},"heho":{"cc":"MM","lat":20.72,"lng":96.82,"pop":93041},"gwa":{"cc":"MM","lat":17.59,"lng":94.58,"pop":66015},"dawbon":{"cc":"MM","lat":16.52,"lng":95.6,"pop":75325},"chauk":{"cc":"MM","lat":20.9,"lng":94.82,"pop":90870},"buthidaung town":{"cc":"MM","lat":20.88,"lng":92.53,"pop":55545},"bogale":{"cc":"MM","lat":16.29,"lng":95.4,"pop":68938},"bhamo":{"cc":"MM","lat":24.25,"lng":97.23,"pop":54721},"pathein":{"cc":"MM","lat":16.78,"lng":94.73,"pop":237089},"ann":{"cc":"MM","lat":19.8,"lng":94.05,"pop":119714},"amarapura":{"cc":"MM","lat":21.91,"lng":96.05,"pop":237618},"myaydo":{"cc":"MM","lat":19.37,"lng":95.22,"pop":57395},"san chaung":{"cc":"MM","lat":17.1,"lng":96.1,"pop":99619},"set ka lay":{"cc":"MM","lat":16.81,"lng":96.11,"pop":111514},"nay pyi taw":{"cc":"MM","lat":19.75,"lng":96.13,"pop":925000},"hlaingthaya":{"cc":"MM","lat":16.85,"lng":96.07,"pop":687867},"sangyoung":{"cc":"MM","lat":16.81,"lng":96.13,"pop":89618},"mingala tangnyunt":{"cc":"MM","lat":16.79,"lng":96.17,"pop":132494},"ulan bator":{"cc":"MN","lat":47.91,"lng":106.88,"pop":844818},"erdenet":{"cc":"MN","lat":49.03,"lng":104.08,"pop":97814},"darhan":{"cc":"MN","lat":49.49,"lng":105.92,"pop":83883},"taipa":{"cc":"MO","lat":22.16,"lng":113.56,"pop":112051},"macau":{"cc":"MO","lat":22.2,"lng":113.55,"pop":649335},"se":{"cc":"MO","lat":22.19,"lng":113.55,"pop":52200},"fort-de-france":{"cc":"MQ","lat":14.6,"lng":-61.07,"pop":89995},"zouerat":{"cc":"MR","lat":22.74,"lng":-12.47,"pop":55183},"zourat":{"cc":"MR","lat":22.74,"lng":-12.47,"pop":55183},"nouakchott":{"cc":"MR","lat":18.09,"lng":-15.98,"pop":1184530},"nouadhibou":{"cc":"MR","lat":20.94,"lng":-17.04,"pop":146048},"nema":{"cc":"MR","lat":16.62,"lng":-7.26,"pop":60000},"nma":{"cc":"MR","lat":16.62,"lng":-7.26,"pop":60000},"kiffa":{"cc":"MR","lat":16.62,"lng":-11.4,"pop":62051},"kaedi":{"cc":"MR","lat":16.15,"lng":-13.51,"pop":56283},"ksar":{"cc":"MR","lat":18.1,"lng":-15.96,"pop":57758},"dar naim":{"cc":"MR","lat":18.11,"lng":-15.93,"pop":61089},"mbera":{"cc":"MR","lat":15.86,"lng":-5.79,"pop":58985},"vacoas":{"cc":"MU","lat":-20.3,"lng":57.48,"pop":115289},"quatre bornes":{"cc":"MU","lat":-20.26,"lng":57.48,"pop":77308},"port louis":{"cc":"MU","lat":-20.16,"lng":57.5,"pop":155226},"curepipe":{"cc":"MU","lat":-20.32,"lng":57.53,"pop":78618},"beau bassin-rose hill":{"cc":"MU","lat":-20.23,"lng":57.47,"pop":111355},"male":{"cc":"MV","lat":4.18,"lng":73.51,"pop":103693},"karonga":{"cc":"MW","lat":-9.93,"lng":33.93,"pop":69486},"zomba":{"cc":"MW","lat":-15.39,"lng":35.32,"pop":118440},"mzuzu":{"cc":"MW","lat":-11.47,"lng":34.02,"pop":249564},"mangochi":{"cc":"MW","lat":-14.48,"lng":35.26,"pop":60338},"lilongwe":{"cc":"MW","lat":-13.97,"lng":33.79,"pop":1115815},"kasungu":{"cc":"MW","lat":-13.03,"lng":33.48,"pop":66152},"blantyre":{"cc":"MW","lat":-15.78,"lng":35.01,"pop":902588},"ciudad valles":{"cc":"MX","lat":22.0,"lng":-99.01,"pop":124644},"zumpango":{"cc":"MX","lat":19.8,"lng":-99.1,"pop":280455},"yautepec":{"cc":"MX","lat":18.88,"lng":-99.07,"pop":105780},"xochimilco":{"cc":"MX","lat":19.25,"lng":-99.1,"pop":442178},"xico":{"cc":"MX","lat":19.27,"lng":-98.95,"pop":384327},"lvaro obregn":{"cc":"MX","lat":19.36,"lng":-99.2,"pop":726664},"alvaro obregon":{"cc":"MX","lat":19.36,"lng":-99.2,"pop":726664},"villahermosa":{"cc":"MX","lat":17.99,"lng":-92.94,"pop":353577},"gustavo adolfo madero":{"cc":"MX","lat":19.49,"lng":-99.11,"pop":1185772},"veracruz":{"cc":"MX","lat":19.18,"lng":-96.14,"pop":428323},"tuxtla":{"cc":"MX","lat":16.75,"lng":-93.12,"pop":604147},"tuxpam de rodriguez cano":{"cc":"MX","lat":20.96,"lng":-97.41,"pop":84750},"txpam de rodrguez cano":{"cc":"MX","lat":20.96,"lng":-97.41,"pop":84750},"tultepec":{"cc":"MX","lat":19.68,"lng":-99.13,"pop":65338},"tulancingo":{"cc":"MX","lat":20.08,"lng":-98.36,"pop":102406},"toluca":{"cc":"MX","lat":19.29,"lng":-99.65,"pop":489333},"san bernardino tlaxcalancingo":{"cc":"MX","lat":19.03,"lng":-98.28,"pop":54517},"tlalpan":{"cc":"MX","lat":19.3,"lng":-99.16,"pop":574577},"tlalnepantla":{"cc":"MX","lat":19.54,"lng":-99.2,"pop":653410},"tlahuac":{"cc":"MX","lat":19.29,"lng":-99.01,"pop":305076},"tlhuac":{"cc":"MX","lat":19.29,"lng":-99.01,"pop":305076},"teziutlan":{"cc":"MX","lat":19.82,"lng":-97.36,"pop":103583},"texcoco de mora":{"cc":"MX","lat":19.51,"lng":-98.88,"pop":105165},"cuautitlan izcalli":{"cc":"MX","lat":19.64,"lng":-99.22,"pop":555163},"cuautitln izcalli":{"cc":"MX","lat":19.64,"lng":-99.22,"pop":555163},"tepeji del ro de ocampo":{"cc":"MX","lat":19.9,"lng":-99.34,"pop":80612},"tepeji del rio de ocampo":{"cc":"MX","lat":19.9,"lng":-99.34,"pop":80612},"teoloyucan":{"cc":"MX","lat":19.74,"lng":-99.18,"pop":51255},"temixco":{"cc":"MX","lat":18.85,"lng":-99.23,"pop":97788},"tehuacan":{"cc":"MX","lat":18.46,"lng":-97.4,"pop":248716},"tehuacn":{"cc":"MX","lat":18.46,"lng":-97.4,"pop":248716},"taxco de alarcn":{"cc":"MX","lat":18.55,"lng":-99.61,"pop":50399},"taxco de alarcon":{"cc":"MX","lat":18.55,"lng":-99.61,"pop":50399},"tapachula":{"cc":"MX","lat":14.91,"lng":-92.26,"pop":353706},"tampico":{"cc":"MX","lat":22.29,"lng":-97.88,"pop":309003},"santo domingo tehuantepec":{"cc":"MX","lat":16.32,"lng":-95.24,"pop":67739},"santa maria chimalhuacan":{"cc":"MX","lat":19.42,"lng":-98.95,"pop":70519},"santa mara chimalhuacn":{"cc":"MX","lat":19.42,"lng":-98.95,"pop":70519},"santa cruz xoxocotln":{"cc":"MX","lat":17.03,"lng":-96.74,"pop":67086},"santa cruz xoxocotlan":{"cc":"MX","lat":17.03,"lng":-96.74,"pop":67086},"san pablo de las salinas":{"cc":"MX","lat":19.67,"lng":-99.09,"pop":156191},"zinacantepec":{"cc":"MX","lat":19.28,"lng":-99.73,"pop":54220},"san mateo atenco":{"cc":"MX","lat":19.27,"lng":-99.53,"pop":67890},"san martin texmelucan de labastida":{"cc":"MX","lat":19.28,"lng":-98.44,"pop":155738},"san juan del rio":{"cc":"MX","lat":20.39,"lng":-100.0,"pop":138878},"san juan del ro":{"cc":"MX","lat":20.39,"lng":-100.0,"pop":138878},"tuxtepec":{"cc":"MX","lat":18.09,"lng":-96.13,"pop":159452},"san cristobal de las casas":{"cc":"MX","lat":16.73,"lng":-92.64,"pop":215874},"san cristbal de las casas":{"cc":"MX","lat":16.73,"lng":-92.64,"pop":215874},"san andrs tuxtla":{"cc":"MX","lat":18.45,"lng":-95.21,"pop":61769},"san andres tuxtla":{"cc":"MX","lat":18.45,"lng":-95.21,"pop":61769},"salina cruz":{"cc":"MX","lat":16.18,"lng":-95.19,"pop":84438},"rioverde":{"cc":"MX","lat":21.93,"lng":-99.99,"pop":53128},"ciudad ro bravo":{"cc":"MX","lat":25.99,"lng":-98.09,"pop":95647},"ciudad rio bravo":{"cc":"MX","lat":25.99,"lng":-98.09,"pop":95647},"reynosa":{"cc":"MX","lat":26.08,"lng":-98.28,"pop":589466},"puebla":{"cc":"MX","lat":19.05,"lng":-98.21,"pop":1692181},"poza rica de hidalgo":{"cc":"MX","lat":20.53,"lng":-97.46,"pop":185242},"polanco":{"cc":"MX","lat":19.43,"lng":-99.2,"pop":50000},"playa del carmen":{"cc":"MX","lat":20.63,"lng":-87.08,"pop":149923},"pijijiapan":{"cc":"MX","lat":15.69,"lng":-93.21,"pop":50079},"paraiso":{"cc":"MX","lat":18.4,"lng":-93.21,"pop":86632},"papantla de olarte":{"cc":"MX","lat":20.45,"lng":-97.32,"pop":53546},"pachuca de soto":{"cc":"MX","lat":20.12,"lng":-98.73,"pop":256584},"orizaba":{"cc":"MX","lat":18.85,"lng":-97.1,"pop":123182},"oaxaca":{"cc":"MX","lat":17.06,"lng":-96.73,"pop":255029},"nuevo laredo":{"cc":"MX","lat":27.48,"lng":-99.52,"pop":416055},"nicols romero":{"cc":"MX","lat":19.64,"lng":-99.31,"pop":281799},"nicolas romero":{"cc":"MX","lat":19.64,"lng":-99.31,"pop":281799},"naucalpan de juarez":{"cc":"MX","lat":19.48,"lng":-99.24,"pop":834434},"naucalpan de jurez":{"cc":"MX","lat":19.48,"lng":-99.24,"pop":834434},"montemorelos":{"cc":"MX","lat":25.19,"lng":-99.83,"pop":67428},"minatitln":{"cc":"MX","lat":18.0,"lng":-94.56,"pop":112046},"minatitlan":{"cc":"MX","lat":18.0,"lng":-94.56,"pop":112046},"heroica matamoros":{"cc":"MX","lat":25.88,"lng":-97.5,"pop":510739},"martinez de la torre":{"cc":"MX","lat":20.07,"lng":-97.06,"pop":60074},"martnez de la torre":{"cc":"MX","lat":20.07,"lng":-97.06,"pop":60074},"magdalena contreras":{"cc":"MX","lat":19.33,"lng":-99.21,"pop":238431},"los reyes acaquilpan":{"cc":"MX","lat":19.36,"lng":-98.98,"pop":85359},"kanasin":{"cc":"MX","lat":20.93,"lng":-89.56,"pop":77240},"kanasn":{"cc":"MX","lat":20.93,"lng":-89.56,"pop":77240},"heroica ciudad de juchitan de zaragoza":{"cc":"MX","lat":16.43,"lng":-95.02,"pop":88280},"heroica ciudad de juchitn de zaragoza":{"cc":"MX","lat":16.43,"lng":-95.02,"pop":88280},"jiutepec":{"cc":"MX","lat":18.88,"lng":-99.18,"pop":215357},"xalapa de enriquez":{"cc":"MX","lat":19.53,"lng":-96.92,"pop":424755},"xalapa de enrquez":{"cc":"MX","lat":19.53,"lng":-96.92,"pop":424755},"ixtapaluca":{"cc":"MX","lat":19.32,"lng":-98.88,"pop":322271},"iztapalapa":{"cc":"MX","lat":19.36,"lng":-99.06,"pop":1835486},"iztacalco":{"cc":"MX","lat":19.4,"lng":-99.1,"pop":384326},"iguala de la independencia":{"cc":"MX","lat":18.35,"lng":-99.54,"pop":118468},"huauchinango":{"cc":"MX","lat":20.17,"lng":-98.05,"pop":56206},"ciudad de huajuapan de leon":{"cc":"MX","lat":17.81,"lng":-97.78,"pop":53043},"ciudad de huajuapan de len":{"cc":"MX","lat":17.81,"lng":-97.78,"pop":53043},"ciudad mante":{"cc":"MX","lat":22.74,"lng":-98.97,"pop":84787},"ecatepec de morelos":{"cc":"MX","lat":19.6,"lng":-99.06,"pop":1645352},"cuernavaca":{"cc":"MX","lat":18.93,"lng":-99.23,"pop":338650},"cuautla":{"cc":"MX","lat":18.81,"lng":-98.94,"pop":157336},"cuautitlan":{"cc":"MX","lat":19.67,"lng":-99.18,"pop":178847},"cuautitln":{"cc":"MX","lat":19.67,"lng":-99.18,"pop":178847},"delegacion cuajimalpa de morelos":{"cc":"MX","lat":19.37,"lng":-99.29,"pop":160491},"delegacin cuajimalpa de morelos":{"cc":"MX","lat":19.37,"lng":-99.29,"pop":160491},"cozumel":{"cc":"MX","lat":20.5,"lng":-86.94,"pop":77236},"coyoacan":{"cc":"MX","lat":19.35,"lng":-99.16,"pop":614447},"coyoacn":{"cc":"MX","lat":19.35,"lng":-99.16,"pop":614447},"comitan":{"cc":"MX","lat":16.24,"lng":-92.14,"pop":166178},"comitn":{"cc":"MX","lat":16.24,"lng":-92.14,"pop":166178},"coatzacoalcos":{"cc":"MX","lat":18.15,"lng":-94.44,"pop":310698},"coatepec":{"cc":"MX","lat":19.45,"lng":-96.96,"pop":53621},"coacalco":{"cc":"MX","lat":19.63,"lng":-99.11,"pop":277959},"ciudad victoria":{"cc":"MX","lat":23.74,"lng":-99.14,"pop":332100},"ciudad nezahualcoyotl":{"cc":"MX","lat":19.4,"lng":-99.01,"pop":1077208},"ciudad madero":{"cc":"MX","lat":22.25,"lng":-97.84,"pop":197216},"mexico city":{"cc":"MX","lat":19.43,"lng":-99.13,"pop":12294193},"ciudad del carmen":{"cc":"MX","lat":18.65,"lng":-91.83,"pop":191238},"cholula":{"cc":"MX","lat":19.06,"lng":-98.3,"pop":292881},"chilpancingo":{"cc":"MX","lat":17.55,"lng":-99.5,"pop":187251},"chicoloapan":{"cc":"MX","lat":19.42,"lng":-98.9,"pop":172919},"chetumal":{"cc":"MX","lat":18.52,"lng":-88.3,"pop":169028},"chalco":{"cc":"MX","lat":19.26,"lng":-98.9,"pop":168720},"cancn":{"cc":"MX","lat":21.17,"lng":-86.85,"pop":888797},"cancun":{"cc":"MX","lat":21.17,"lng":-86.85,"pop":888797},"campeche":{"cc":"MX","lat":19.84,"lng":-90.52,"pop":220389},"cadereyta jimnez":{"cc":"MX","lat":25.59,"lng":-100.0,"pop":68111},"cadereyta jimenez":{"cc":"MX","lat":25.59,"lng":-100.0,"pop":68111},"cadereyta":{"cc":"MX","lat":25.58,"lng":-99.98,"pop":67994},"azcapotzalco":{"cc":"MX","lat":19.49,"lng":-99.19,"pop":414711},"atlixco":{"cc":"MX","lat":18.91,"lng":-98.44,"pop":86690},"ciudad lpez mateos":{"cc":"MX","lat":19.56,"lng":-99.26,"pop":489160},"ciudad lopez mateos":{"cc":"MX","lat":19.56,"lng":-99.26,"pop":489160},"amozoc de mota":{"cc":"MX","lat":19.05,"lng":-98.05,"pop":95322},"acayucan":{"cc":"MX","lat":17.95,"lng":-94.91,"pop":50934},"acapulco de juarez":{"cc":"MX","lat":16.85,"lng":-99.91,"pop":658609},"acapulco de jurez":{"cc":"MX","lat":16.85,"lng":-99.91,"pop":658609},"huamantla":{"cc":"MX","lat":19.31,"lng":-97.93,"pop":51996},"tlaxcala":{"cc":"MX","lat":19.32,"lng":-98.24,"pop":84670},"villa vicente guerrero":{"cc":"MX","lat":19.12,"lng":-98.17,"pop":60001},"tepexpan":{"cc":"MX","lat":19.61,"lng":-98.94,"pop":102667},"benito juarez":{"cc":"MX","lat":19.37,"lng":-99.16,"pop":385439},"venustiano carranza":{"cc":"MX","lat":19.44,"lng":-99.1,"pop":430978},"miguel hidalgo":{"cc":"MX","lat":19.43,"lng":-99.2,"pop":372889},"cuauhtemoc":{"cc":"MX","lat":19.45,"lng":-99.15,"pop":531831},"cuauhtmoc":{"cc":"MX","lat":19.45,"lng":-99.15,"pop":531831},"huixquilucan":{"cc":"MX","lat":19.36,"lng":-99.35,"pop":124846},"santiago teyahualco":{"cc":"MX","lat":19.66,"lng":-99.12,"pop":53684},"ojo de agua":{"cc":"MX","lat":19.68,"lng":-99.01,"pop":386290},"ixtapa-zihuatanejo":{"cc":"MX","lat":17.64,"lng":-101.55,"pop":67408},"zapopan":{"cc":"MX","lat":20.72,"lng":-103.39,"pop":1476491},"zamora de hidalgo":{"cc":"MX","lat":19.98,"lng":-102.29,"pop":186102},"zacatecas":{"cc":"MX","lat":22.77,"lng":-102.58,"pop":129011},"zacapu":{"cc":"MX","lat":19.82,"lng":-101.79,"pop":50112},"frontera":{"cc":"MX","lat":26.93,"lng":-101.45,"pop":69462},"el pueblito":{"cc":"MX","lat":20.54,"lng":-100.44,"pop":71254},"garca":{"cc":"MX","lat":25.8,"lng":-100.59,"pop":93641},"garcia":{"cc":"MX","lat":25.8,"lng":-100.59,"pop":93641},"ciudad de villa de lvarez":{"cc":"MX","lat":19.27,"lng":-103.74,"pop":117600},"ciudad de villa de alvarez":{"cc":"MX","lat":19.27,"lng":-103.74,"pop":117600},"valle de santiago":{"cc":"MX","lat":20.39,"lng":-101.19,"pop":68058},"uruapan":{"cc":"MX","lat":19.42,"lng":-102.06,"pop":299523},"uriangato":{"cc":"MX","lat":20.14,"lng":-101.18,"pop":51382},"torren":{"cc":"MX","lat":25.54,"lng":-103.42,"pop":735340},"torreon":{"cc":"MX","lat":25.54,"lng":-103.42,"pop":735340},"tonal":{"cc":"MX","lat":20.62,"lng":-103.24,"pop":408759},"tonala":{"cc":"MX","lat":20.62,"lng":-103.24,"pop":408759},"tlaquepaque":{"cc":"MX","lat":20.64,"lng":-103.29,"pop":650123},"tijuana":{"cc":"MX","lat":32.5,"lng":-117.0,"pop":1922523},"san francisco tesistan":{"cc":"MX","lat":20.8,"lng":-103.48,"pop":62397},"san francisco tesistn":{"cc":"MX","lat":20.8,"lng":-103.48,"pop":62397},"tepic":{"cc":"MX","lat":21.51,"lng":-104.89,"pop":332863},"tepatitlan de morelos":{"cc":"MX","lat":20.82,"lng":-102.76,"pop":91959},"tepatitln de morelos":{"cc":"MX","lat":20.82,"lng":-102.76,"pop":91959},"tecomn":{"cc":"MX","lat":18.92,"lng":-103.88,"pop":85689},"tecoman":{"cc":"MX","lat":18.92,"lng":-103.88,"pop":85689},"tecate":{"cc":"MX","lat":32.57,"lng":-116.63,"pop":64764},"soledad de graciano snchez":{"cc":"MX","lat":22.19,"lng":-100.94,"pop":332072},"soledad de graciano sanchez":{"cc":"MX","lat":22.19,"lng":-100.94,"pop":332072},"silao de la victoria":{"cc":"MX","lat":20.94,"lng":-101.43,"pop":74242},"santa catarina":{"cc":"MX","lat":25.67,"lng":-100.46,"pop":304052},"san nicols de los garza":{"cc":"MX","lat":25.74,"lng":-100.3,"pop":412199},"san nicolas de los garza":{"cc":"MX","lat":25.74,"lng":-100.3,"pop":412199},"san miguel de allende":{"cc":"MX","lat":20.92,"lng":-100.74,"pop":174615},"san luis ro colorado":{"cc":"MX","lat":32.46,"lng":-114.77,"pop":176685},"san luis rio colorado":{"cc":"MX","lat":32.46,"lng":-114.77,"pop":176685},"san luis potosi":{"cc":"MX","lat":22.15,"lng":-100.97,"pop":722772},"san luis potos":{"cc":"MX","lat":22.15,"lng":-100.97,"pop":722772},"cabo san lucas":{"cc":"MX","lat":22.89,"lng":-109.91,"pop":202694},"san jos del cabo":{"cc":"MX","lat":23.05,"lng":-109.7,"pop":136285},"san jose del cabo":{"cc":"MX","lat":23.05,"lng":-109.7,"pop":136285},"san francisco del rincn":{"cc":"MX","lat":21.02,"lng":-101.86,"pop":71139},"san francisco del rincon":{"cc":"MX","lat":21.02,"lng":-101.86,"pop":71139},"saltillo":{"cc":"MX","lat":25.43,"lng":-100.98,"pop":709671},"sahuayo de morelos":{"cc":"MX","lat":20.06,"lng":-102.72,"pop":64431},"sabinas":{"cc":"MX","lat":27.86,"lng":-101.12,"pop":54905},"rosarito":{"cc":"MX","lat":32.36,"lng":-117.05,"pop":100660},"ramos arizpe":{"cc":"MX","lat":25.54,"lng":-100.95,"pop":66554},"santiago de quertaro":{"cc":"MX","lat":20.59,"lng":-100.39,"pop":1594212},"santiago de queretaro":{"cc":"MX","lat":20.59,"lng":-100.39,"pop":1594212},"puerto vallarta":{"cc":"MX","lat":20.62,"lng":-105.23,"pop":224166},"puerto penasco":{"cc":"MX","lat":31.32,"lng":-113.54,"pop":62689},"puerto peasco":{"cc":"MX","lat":31.32,"lng":-113.54,"pop":62689},"piedras negras":{"cc":"MX","lat":28.7,"lng":-100.52,"pop":150178},"patzcuaro":{"cc":"MX","lat":19.51,"lng":-101.61,"pop":55298},"ptzcuaro":{"cc":"MX","lat":19.51,"lng":-101.61,"pop":55298},"ocotlan":{"cc":"MX","lat":20.35,"lng":-102.77,"pop":83769},"ocotln":{"cc":"MX","lat":20.35,"lng":-102.77,"pop":83769},"nuevo casas grandes":{"cc":"MX","lat":30.42,"lng":-107.91,"pop":55553},"navojoa":{"cc":"MX","lat":27.07,"lng":-109.44,"pop":113836},"morelia":{"cc":"MX","lat":19.7,"lng":-101.18,"pop":743275},"monterrey":{"cc":"MX","lat":25.68,"lng":-100.32,"pop":1135512},"monclova":{"cc":"MX","lat":26.91,"lng":-101.42,"pop":215271},"mexicali":{"cc":"MX","lat":32.63,"lng":-115.45,"pop":1032686},"mazatln":{"cc":"MX","lat":23.22,"lng":-106.42,"pop":381583},"mazatlan":{"cc":"MX","lat":23.22,"lng":-106.42,"pop":381583},"matehuala":{"cc":"MX","lat":23.65,"lng":-100.64,"pop":77328},"matamoros":{"cc":"MX","lat":25.53,"lng":-103.23,"pop":52233},"los mochis":{"cc":"MX","lat":25.79,"lng":-109.0,"pop":256613},"len de los aldama":{"cc":"MX","lat":21.12,"lng":-101.68,"pop":1579803},"leon de los aldama":{"cc":"MX","lat":21.12,"lng":-101.68,"pop":1579803},"la piedad de cabadas":{"cc":"MX","lat":20.34,"lng":-102.02,"pop":83323},"lagos de moreno":{"cc":"MX","lat":21.36,"lng":-101.93,"pop":98206},"ciudad benito jurez":{"cc":"MX","lat":25.65,"lng":-100.09,"pop":308285},"ciudad benito juarez":{"cc":"MX","lat":25.65,"lng":-100.09,"pop":308285},"jacona de plancarte":{"cc":"MX","lat":19.96,"lng":-102.31,"pop":53860},"irapuato":{"cc":"MX","lat":20.67,"lng":-101.36,"pop":380941},"hidalgo del parral":{"cc":"MX","lat":26.93,"lng":-105.67,"pop":104836},"herica zitcuaro":{"cc":"MX","lat":19.44,"lng":-100.36,"pop":84307},"heroica zitacuaro":{"cc":"MX","lat":19.44,"lng":-100.36,"pop":84307},"nogales":{"cc":"MX","lat":31.31,"lng":-110.94,"pop":264782},"heroica caborca":{"cc":"MX","lat":30.72,"lng":-112.16,"pop":59922},"hermosillo":{"cc":"MX","lat":29.09,"lng":-110.97,"pop":812229},"heroica guaymas":{"cc":"MX","lat":27.92,"lng":-110.9,"pop":117253},"guasave":{"cc":"MX","lat":25.57,"lng":-108.47,"pop":71196},"guanajuato":{"cc":"MX","lat":21.02,"lng":-101.26,"pop":72237},"guamuchil":{"cc":"MX","lat":25.46,"lng":-108.08,"pop":72500},"guamchil":{"cc":"MX","lat":25.46,"lng":-108.08,"pop":72500},"guadalupe":{"cc":"MX","lat":25.68,"lng":-100.26,"pop":673616},"gomez palacio":{"cc":"MX","lat":25.57,"lng":-103.5,"pop":257352},"gmez palacio":{"cc":"MX","lat":25.57,"lng":-103.5,"pop":257352},"ciudad general escobedo":{"cc":"MX","lat":25.8,"lng":-100.32,"pop":454967},"san pedro garza garcia":{"cc":"MX","lat":25.66,"lng":-100.4,"pop":132128},"san pedro garza garca":{"cc":"MX","lat":25.66,"lng":-100.4,"pop":132128},"fresnillo":{"cc":"MX","lat":23.17,"lng":-102.87,"pop":143281},"victoria de durango":{"cc":"MX","lat":24.02,"lng":-104.66,"pop":518709},"culiacn":{"cc":"MX","lat":24.8,"lng":-107.39,"pop":808416},"culiacan":{"cc":"MX","lat":24.8,"lng":-107.39,"pop":808416},"cortazar":{"cc":"MX","lat":20.48,"lng":-100.96,"pop":61658},"colima":{"cc":"MX","lat":19.24,"lng":-103.71,"pop":146965},"ciudad obregn":{"cc":"MX","lat":27.49,"lng":-109.94,"pop":329404},"ciudad obregon":{"cc":"MX","lat":27.49,"lng":-109.94,"pop":329404},"lerdo":{"cc":"MX","lat":25.54,"lng":-103.52,"pop":79669},"ciudad jurez":{"cc":"MX","lat":31.72,"lng":-106.46,"pop":1512450},"ciudad juarez":{"cc":"MX","lat":31.72,"lng":-106.46,"pop":1512450},"ciudad hidalgo":{"cc":"MX","lat":19.69,"lng":-100.56,"pop":60542},"ciudad guzman":{"cc":"MX","lat":19.7,"lng":-103.46,"pop":111975},"ciudad guzmn":{"cc":"MX","lat":19.7,"lng":-103.46,"pop":111975},"ciudad delicias":{"cc":"MX","lat":28.19,"lng":-105.47,"pop":148045},"ciudad acuna":{"cc":"MX","lat":29.32,"lng":-100.95,"pop":216099},"ciudad acua":{"cc":"MX","lat":29.32,"lng":-100.95,"pop":216099},"chihuahua":{"cc":"MX","lat":28.64,"lng":-106.09,"pop":925762},"celaya":{"cc":"MX","lat":20.52,"lng":-100.81,"pop":340387},"arandas":{"cc":"MX","lat":20.71,"lng":-102.35,"pop":52175},"ciudad apodaca":{"cc":"MX","lat":25.78,"lng":-100.19,"pop":467157},"apatzingn":{"cc":"MX","lat":19.09,"lng":-102.36,"pop":102362},"apatzingan":{"cc":"MX","lat":19.09,"lng":-102.36,"pop":102362},"aguascalientes":{"cc":"MX","lat":21.88,"lng":-102.28,"pop":722250},"agua prieta":{"cc":"MX","lat":31.32,"lng":-109.54,"pop":77254},"acmbaro":{"cc":"MX","lat":20.03,"lng":-100.72,"pop":57972},"acambaro":{"cc":"MX","lat":20.03,"lng":-100.72,"pop":57972},"dolores hidalgo":{"cc":"MX","lat":21.16,"lng":-100.93,"pop":67101},"ciudad lzaro crdenas":{"cc":"MX","lat":17.96,"lng":-102.2,"pop":196003},"ciudad lazaro cardenas":{"cc":"MX","lat":17.96,"lng":-102.2,"pop":196003},"benito jurez":{"cc":"MX","lat":19.37,"lng":-99.16,"pop":385439},"colonia del valle":{"cc":"MX","lat":19.39,"lng":-99.16,"pop":250000},"colonia lindavista":{"cc":"MX","lat":19.49,"lng":-99.12,"pop":100000},"colonia nativitas":{"cc":"MX","lat":19.38,"lng":-99.14,"pop":60000},"hacienda santa fe":{"cc":"MX","lat":20.52,"lng":-103.38,"pop":86935},"fuentes del valle":{"cc":"MX","lat":19.63,"lng":-99.14,"pop":74087},"san salvador tizatlalli":{"cc":"MX","lat":19.26,"lng":-99.59,"pop":61367},"jardines de la silla":{"cc":"MX","lat":25.63,"lng":-100.19,"pop":53742},"maran":{"cc":"MY","lat":3.59,"lng":102.77,"pop":111056},"tanjong malim":{"cc":"MY","lat":3.68,"lng":101.52,"pop":66103},"kuala kubu baharu":{"cc":"MY","lat":3.56,"lng":101.66,"pop":194387},"parit sulung":{"cc":"MY","lat":1.98,"lng":102.88,"pop":82399},"batu pahat":{"cc":"MY","lat":1.85,"lng":102.93,"pop":156236},"simpang renggam":{"cc":"MY","lat":1.82,"lng":103.31,"pop":59033},"kampung pasir gudang baru":{"cc":"MY","lat":1.47,"lng":103.88,"pop":145639},"pasir gudang":{"cc":"MY","lat":1.46,"lng":103.91,"pop":534659},"kampung larkin lama":{"cc":"MY","lat":1.5,"lng":103.74,"pop":500000},"kota tinggi":{"cc":"MY","lat":1.74,"lng":103.9,"pop":52743},"taman senai":{"cc":"MY","lat":1.6,"lng":103.64,"pop":73176},"kulai":{"cc":"MY","lat":1.66,"lng":103.6,"pop":63762},"skudai":{"cc":"MY","lat":1.54,"lng":103.66,"pop":159733},"kempas":{"cc":"MY","lat":1.55,"lng":103.7,"pop":62011},"pelentong":{"cc":"MY","lat":1.52,"lng":103.82,"pop":583640},"masai":{"cc":"MY","lat":1.49,"lng":103.88,"pop":141730},"johor bahru":{"cc":"MY","lat":1.47,"lng":103.76,"pop":858118},"gelang patah":{"cc":"MY","lat":1.45,"lng":103.59,"pop":64375},"kluang":{"cc":"MY","lat":2.03,"lng":103.32,"pop":323762},"segamat":{"cc":"MY","lat":2.51,"lng":102.82,"pop":69816},"pagoh":{"cc":"MY","lat":2.15,"lng":102.77,"pop":95202},"muar":{"cc":"MY","lat":2.04,"lng":102.57,"pop":314776},"kuala selangor":{"cc":"MY","lat":3.35,"lng":101.25,"pop":55887},"kapar":{"cc":"MY","lat":3.13,"lng":101.38,"pop":269627},"shah alam":{"cc":"MY","lat":3.09,"lng":101.53,"pop":740750},"klang":{"cc":"MY","lat":3.04,"lng":101.44,"pop":240016},"cukai":{"cc":"MY","lat":4.25,"lng":103.42,"pop":82425},"val dor":{"cc":"MY","lat":5.25,"lng":100.49,"pop":88600},"kota kinabalu":{"cc":"MY","lat":5.97,"lng":116.07,"pop":500421},"donggongon":{"cc":"MY","lat":5.91,"lng":116.1,"pop":78086},"semporna":{"cc":"MY","lat":4.48,"lng":118.61,"pop":62641},"labuan":{"cc":"MY","lat":5.28,"lng":115.25,"pop":95120},"lahad datu":{"cc":"MY","lat":5.02,"lng":118.33,"pop":105622},"sandakan":{"cc":"MY","lat":5.84,"lng":118.12,"pop":439050},"keningau":{"cc":"MY","lat":5.34,"lng":116.16,"pop":77650},"tawau":{"cc":"MY","lat":4.24,"lng":117.89,"pop":372615},"kulim":{"cc":"MY","lat":5.36,"lng":100.56,"pop":170889},"padang serai":{"cc":"MY","lat":5.51,"lng":100.55,"pop":50757},"bau":{"cc":"MY","lat":1.42,"lng":110.15,"pop":52643},"simpang empat":{"cc":"MY","lat":4.95,"lng":100.63,"pop":58004},"taiping":{"cc":"MY","lat":4.85,"lng":100.73,"pop":217647},"ipoh":{"cc":"MY","lat":4.58,"lng":101.08,"pop":759952},"kuala terengganu":{"cc":"MY","lat":5.33,"lng":103.14,"pop":426500},"malacca":{"cc":"MY","lat":2.2,"lng":102.24,"pop":579000},"semenyih":{"cc":"MY","lat":2.95,"lng":101.84,"pop":92491},"seremban":{"cc":"MY","lat":2.73,"lng":101.94,"pop":372917},"port dickson":{"cc":"MY","lat":2.52,"lng":101.8,"pop":119300},"sepang":{"cc":"MY","lat":2.69,"lng":101.75,"pop":212050},"taman senawang indah":{"cc":"MY","lat":2.69,"lng":101.99,"pop":64497},"temerluh":{"cc":"MY","lat":3.45,"lng":102.42,"pop":59916},"perai":{"cc":"MY","lat":5.38,"lng":100.38,"pop":65301},"bukit mertajam":{"cc":"MY","lat":5.36,"lng":100.47,"pop":212329},"tasek glugor":{"cc":"MY","lat":5.48,"lng":100.5,"pop":135786},"bayan lepas":{"cc":"MY","lat":5.3,"lng":100.26,"pop":130455},"george town":{"cc":"MY","lat":5.41,"lng":100.34,"pop":158336},"serendah":{"cc":"MY","lat":3.36,"lng":101.6,"pop":71202},"rawang":{"cc":"MY","lat":3.32,"lng":101.58,"pop":199095},"sungai buloh":{"cc":"MY","lat":3.21,"lng":101.56,"pop":222858},"petaling jaya":{"cc":"MY","lat":3.11,"lng":101.61,"pop":807879},"kuala lumpur":{"cc":"MY","lat":3.14,"lng":101.69,"pop":1453975},"setapak":{"cc":"MY","lat":3.21,"lng":101.73,"pop":353268},"batu caves":{"cc":"MY","lat":3.24,"lng":101.68,"pop":254083},"ampang":{"cc":"MY","lat":3.15,"lng":101.77,"pop":126285},"hulu langat":{"cc":"MY","lat":3.11,"lng":101.81,"pop":55251},"kuantan":{"cc":"MY","lat":3.81,"lng":103.33,"pop":548014},"parit":{"cc":"MY","lat":4.48,"lng":100.92,"pop":60988},"sitiawan":{"cc":"MY","lat":4.22,"lng":100.7,"pop":156234},"teluk intan":{"cc":"MY","lat":4.02,"lng":101.02,"pop":232800},"yan besar":{"cc":"MY","lat":5.8,"lng":100.37,"pop":67653},"sungai petani":{"cc":"MY","lat":5.65,"lng":100.49,"pop":544851},"pasir puteh":{"cc":"MY","lat":5.83,"lng":102.4,"pop":137400},"kuala krai":{"cc":"MY","lat":5.53,"lng":102.2,"pop":105007},"kuching":{"cc":"MY","lat":1.55,"lng":110.33,"pop":402738},"sibu":{"cc":"MY","lat":2.3,"lng":111.82,"pop":198239},"kangar":{"cc":"MY","lat":6.44,"lng":100.2,"pop":63869},"jitra":{"cc":"MY","lat":6.27,"lng":100.42,"pop":63489},"alor setar":{"cc":"MY","lat":6.12,"lng":100.36,"pop":417800},"pasir mas":{"cc":"MY","lat":6.05,"lng":102.14,"pop":230424},"kota bharu":{"cc":"MY","lat":6.12,"lng":102.24,"pop":568900},"bintulu":{"cc":"MY","lat":3.17,"lng":113.03,"pop":151617},"marudi":{"cc":"MY","lat":4.18,"lng":114.32,"pop":90100},"miri":{"cc":"MY","lat":4.4,"lng":113.99,"pop":300543},"ulu tiram":{"cc":"MY","lat":1.6,"lng":103.82,"pop":75350},"seri kembangan":{"cc":"MY","lat":3.03,"lng":101.72,"pop":130252},"serian":{"cc":"MY","lat":1.17,"lng":110.57,"pop":58059},"sentul":{"cc":"MY","lat":3.18,"lng":101.68,"pop":100000},"puchong":{"cc":"MY","lat":3.0,"lng":101.62,"pop":375181},"kepong":{"cc":"MY","lat":3.21,"lng":101.64,"pop":85960},"kampung kangkar teberau":{"cc":"MY","lat":1.53,"lng":103.75,"pop":412373},"kampung sungai kajang":{"cc":"MY","lat":3.42,"lng":101.17,"pop":84031},"kampung sungai glugur":{"cc":"MY","lat":5.37,"lng":100.31,"pop":145600},"kampung sungai ara":{"cc":"MY","lat":5.33,"lng":100.27,"pop":140849},"kampong sidam":{"cc":"MY","lat":5.53,"lng":100.57,"pop":60983},"pendang":{"cc":"MY","lat":6.0,"lng":100.48,"pop":94033},"ijok":{"cc":"MY","lat":3.32,"lng":101.4,"pop":100899},"kampong dungun":{"cc":"MY","lat":3.22,"lng":101.32,"pop":58674},"kampung bukit baharu":{"cc":"MY","lat":2.22,"lng":102.29,"pop":55656},"kampung baru subang":{"cc":"MY","lat":3.15,"lng":101.53,"pop":833571},"kampong baharu cheras batu sebelas":{"cc":"MY","lat":3.05,"lng":101.77,"pop":232100},"kampung baru balakong":{"cc":"MY","lat":3.03,"lng":101.75,"pop":69302},"jelutong":{"cc":"MY","lat":5.39,"lng":100.32,"pop":63507},"cheras":{"cc":"MY","lat":3.11,"lng":101.73,"pop":135823},"bukit tengah":{"cc":"MY","lat":5.35,"lng":100.44,"pop":54416},"putrajaya":{"cc":"MY","lat":2.94,"lng":101.69,"pop":50000},"kota kuala muda":{"cc":"MY","lat":5.59,"lng":100.37,"pop":544984},"cyberjaya":{"cc":"MY","lat":2.92,"lng":101.66,"pop":79200},"bandar labuan":{"cc":"MY","lat":5.28,"lng":115.25,"pop":54752},"bercham":{"cc":"MY","lat":4.64,"lng":101.14,"pop":150000},"kampung manjoi":{"cc":"MY","lat":4.62,"lng":101.07,"pop":86266},"johor jaya":{"cc":"MY","lat":1.54,"lng":103.81,"pop":66000},"sri petaling":{"cc":"MY","lat":3.07,"lng":101.69,"pop":50000},"seri manjung":{"cc":"MY","lat":4.2,"lng":100.67,"pop":100000},"selayang baru utara":{"cc":"MY","lat":3.25,"lng":101.67,"pop":542409},"subang jaya":{"cc":"MY","lat":3.04,"lng":101.58,"pop":708296},"iskandar puteri":{"cc":"MY","lat":1.39,"lng":103.62,"pop":575977},"putra heights":{"cc":"MY","lat":2.99,"lng":101.57,"pop":60000},"kajang":{"cc":"MY","lat":2.99,"lng":101.79,"pop":236240},"bukit bintang":{"cc":"MY","lat":3.15,"lng":101.71,"pop":120529},"bandar sunway":{"cc":"MY","lat":3.07,"lng":101.61,"pop":200000},"kota damansara":{"cc":"MY","lat":3.15,"lng":101.58,"pop":500000},"damansara damai":{"cc":"MY","lat":3.2,"lng":101.59,"pop":85000},"kuala nerus":{"cc":"MY","lat":5.37,"lng":103.02,"pop":93485},"taman petaling":{"cc":"MY","lat":3.2,"lng":101.65,"pop":423062},"taman melati":{"cc":"MY","lat":3.22,"lng":101.72,"pop":50000},"ara damansara":{"cc":"MY","lat":3.12,"lng":101.59,"pop":60000},"seremban 2":{"cc":"MY","lat":2.69,"lng":101.91,"pop":62000},"bukit indah":{"cc":"MY","lat":1.48,"lng":103.66,"pop":60000},"wangsa maju":{"cc":"MY","lat":3.2,"lng":101.74,"pop":215600},"kuchai lama":{"cc":"MY","lat":3.08,"lng":101.69,"pop":50000},"taman melawati":{"cc":"MY","lat":3.21,"lng":101.75,"pop":99304},"perling":{"cc":"MY","lat":1.48,"lng":103.68,"pop":101263},"mukim pulai":{"cc":"MY","lat":1.53,"lng":103.67,"pop":505661},"bandar mahkota cheras":{"cc":"MY","lat":3.05,"lng":101.8,"pop":100000},"paya terubong":{"cc":"MY","lat":5.37,"lng":100.28,"pop":226712},"setia alam":{"cc":"MY","lat":3.1,"lng":101.46,"pop":150000},"bandar kinrara":{"cc":"MY","lat":3.05,"lng":101.64,"pop":93822},"bandar bukit raja":{"cc":"MY","lat":3.09,"lng":101.43,"pop":146534},"pandamaran":{"cc":"MY","lat":3.01,"lng":101.42,"pop":53916},"bandar saujana utama":{"cc":"MY","lat":3.21,"lng":101.48,"pop":72000},"bukit rahman putra":{"cc":"MY","lat":3.22,"lng":101.56,"pop":607000},"setia tropika":{"cc":"MY","lat":1.55,"lng":103.72,"pop":60279},"bandar tasik puteri":{"cc":"MY","lat":3.29,"lng":101.47,"pop":150000},"titiwangsa":{"cc":"MY","lat":3.18,"lng":101.7,"pop":122096},"bandar seri alam":{"cc":"MY","lat":1.5,"lng":103.88,"pop":220000},"bandar utama":{"cc":"MY","lat":3.15,"lng":101.61,"pop":200000},"bukit jalil":{"cc":"MY","lat":3.05,"lng":101.68,"pop":200000},"xai-xai":{"cc":"MZ","lat":-25.05,"lng":33.64,"pop":154356},"mocuba":{"cc":"MZ","lat":-16.84,"lng":36.99,"pop":196001},"tete":{"cc":"MZ","lat":-16.16,"lng":33.59,"pop":357000},"ressano garcia":{"cc":"MZ","lat":-25.44,"lng":32.0,"pop":110000},"quelimane":{"cc":"MZ","lat":-17.88,"lng":36.89,"pop":349842},"pemba":{"cc":"MZ","lat":-12.97,"lng":40.52,"pop":232932},"nampula":{"cc":"MZ","lat":-15.12,"lng":39.27,"pop":770379},"nametil":{"cc":"MZ","lat":-15.72,"lng":39.34,"pop":52457},"nacala":{"cc":"MZ","lat":-14.56,"lng":40.69,"pop":239808},"montepuez":{"cc":"MZ","lat":-13.13,"lng":39.0,"pop":88442},"monapo":{"cc":"MZ","lat":-14.92,"lng":40.3,"pop":50134},"mozambique":{"cc":"MZ","lat":-15.03,"lng":40.73,"pop":55829},"maxixe":{"cc":"MZ","lat":-23.86,"lng":35.35,"pop":126408},"matola":{"cc":"MZ","lat":-25.96,"lng":32.46,"pop":1198988},"maputo":{"cc":"MZ","lat":-25.97,"lng":32.58,"pop":1254837},"manhia":{"cc":"MZ","lat":-25.4,"lng":32.81,"pop":65240},"manhica":{"cc":"MZ","lat":-25.4,"lng":32.81,"pop":65240},"mandimba":{"cc":"MZ","lat":-14.35,"lng":35.65,"pop":118922},"lichinga":{"cc":"MZ","lat":-13.31,"lng":35.24,"pop":281341},"inhambane":{"cc":"MZ","lat":-23.86,"lng":35.38,"pop":95388},"gurue":{"cc":"MZ","lat":-15.47,"lng":36.98,"pop":168971},"gur":{"cc":"MZ","lat":-15.47,"lng":36.98,"pop":168971},"cuamba":{"cc":"MZ","lat":-14.8,"lng":36.54,"pop":91780},"chokw":{"cc":"MZ","lat":-24.53,"lng":32.98,"pop":63695},"chokwe":{"cc":"MZ","lat":-24.53,"lng":32.98,"pop":63695},"chimoio":{"cc":"MZ","lat":-19.12,"lng":33.48,"pop":422046},"chibuto":{"cc":"MZ","lat":-24.69,"lng":33.53,"pop":73393},"beira":{"cc":"MZ","lat":-19.84,"lng":34.84,"pop":687764},"angoche":{"cc":"MZ","lat":-16.23,"lng":39.91,"pop":104540},"windhoek":{"cc":"NA","lat":-22.56,"lng":17.08,"pop":386219},"swakopmund":{"cc":"NA","lat":-22.68,"lng":14.53,"pop":53009},"rundu":{"cc":"NA","lat":-17.92,"lng":19.77,"pop":75180},"walvis bay":{"cc":"NA","lat":-22.96,"lng":14.51,"pop":73598},"nouma":{"cc":"NC","lat":-22.27,"lng":166.45,"pop":93060},"noumea":{"cc":"NC","lat":-22.27,"lng":166.45,"pop":93060},"birni n konni":{"cc":"NE","lat":13.8,"lng":5.25,"pop":85494},"zinder":{"cc":"NE","lat":13.81,"lng":8.99,"pop":318874},"tessaoua":{"cc":"NE","lat":13.76,"lng":7.99,"pop":58750},"tahoua":{"cc":"NE","lat":14.89,"lng":5.27,"pop":159468},"niamey":{"cc":"NE","lat":13.51,"lng":2.11,"pop":1323691},"maradi":{"cc":"NE","lat":13.5,"lng":7.1,"pop":361702},"dosso":{"cc":"NE","lat":13.05,"lng":3.19,"pop":79406},"dogondoutchi":{"cc":"NE","lat":13.64,"lng":4.03,"pop":50037},"diffa":{"cc":"NE","lat":13.32,"lng":12.61,"pop":54082},"arlit":{"cc":"NE","lat":18.74,"lng":7.39,"pop":106448},"alaghsas":{"cc":"NE","lat":17.02,"lng":8.02,"pop":88561},"agadez":{"cc":"NE","lat":16.97,"lng":7.99,"pop":149549},"zaria":{"cc":"NG","lat":11.11,"lng":7.72,"pop":980000},"yola":{"cc":"NG","lat":9.21,"lng":12.48,"pop":460000},"yenagoa":{"cc":"NG","lat":4.93,"lng":6.27,"pop":365000},"wukari":{"cc":"NG","lat":7.87,"lng":9.78,"pop":92933},"warri":{"cc":"NG","lat":5.52,"lng":5.75,"pop":910000},"uyo":{"cc":"NG","lat":5.05,"lng":7.93,"pop":436606},"uromi":{"cc":"NG","lat":6.7,"lng":6.33,"pop":108608},"umuahia":{"cc":"NG","lat":5.52,"lng":7.49,"pop":370000},"ughelli":{"cc":"NG","lat":5.49,"lng":6.0,"pop":79986},"ugep":{"cc":"NG","lat":5.81,"lng":8.08,"pop":200276},"uga":{"cc":"NG","lat":5.94,"lng":7.08,"pop":64179},"surulere":{"cc":"NG","lat":6.5,"lng":3.36,"pop":191920},"suleja":{"cc":"NG","lat":9.18,"lng":7.18,"pop":162135},"sokoto":{"cc":"NG","lat":13.06,"lng":5.24,"pop":1040000},"shomolu":{"cc":"NG","lat":6.54,"lng":3.37,"pop":154390},"shagamu":{"cc":"NG","lat":6.85,"lng":3.65,"pop":214558},"sapele":{"cc":"NG","lat":5.89,"lng":5.68,"pop":305000},"potiskum":{"cc":"NG","lat":11.71,"lng":11.08,"pop":86002},"port harcourt":{"cc":"NG","lat":4.78,"lng":7.01,"pop":2120000},"pindiga":{"cc":"NG","lat":9.98,"lng":10.95,"pop":106322},"ozubulu":{"cc":"NG","lat":5.96,"lng":6.85,"pop":73812},"oyo":{"cc":"NG","lat":7.85,"lng":3.93,"pop":736072},"oyan":{"cc":"NG","lat":8.05,"lng":4.77,"pop":73622},"owo":{"cc":"NG","lat":7.2,"lng":5.59,"pop":276574},"owerri":{"cc":"NG","lat":5.48,"lng":7.03,"pop":545000},"osogbo":{"cc":"NG","lat":7.77,"lng":4.56,"pop":645000},"oshodi":{"cc":"NG","lat":6.56,"lng":3.34,"pop":170870},"orita-eruwa":{"cc":"NG","lat":7.56,"lng":3.44,"pop":71027},"onitsha":{"cc":"NG","lat":6.15,"lng":6.79,"pop":1553000},"ondo":{"cc":"NG","lat":7.09,"lng":4.84,"pop":375000},"olupona":{"cc":"NG","lat":7.6,"lng":4.19,"pop":95002},"okrika":{"cc":"NG","lat":4.74,"lng":7.08,"pop":133271},"okigwe":{"cc":"NG","lat":5.83,"lng":7.35,"pop":115499},"okene":{"cc":"NG","lat":7.55,"lng":6.24,"pop":479178},"oke mesi":{"cc":"NG","lat":7.82,"lng":4.92,"pop":79563},"ohafia-ifigh":{"cc":"NG","lat":5.61,"lng":7.81,"pop":73355},"ogbomoso":{"cc":"NG","lat":8.13,"lng":4.24,"pop":433030},"ogaminana":{"cc":"NG","lat":7.59,"lng":6.22,"pop":84373},"offa":{"cc":"NG","lat":8.15,"lng":4.72,"pop":113830},"ode":{"cc":"NG","lat":7.79,"lng":5.71,"pop":75463},"obonoma":{"cc":"NG","lat":4.71,"lng":6.79,"pop":68584},"numan":{"cc":"NG","lat":9.46,"lng":12.03,"pop":77617},"nsukka":{"cc":"NG","lat":6.86,"lng":7.4,"pop":111017},"nnewi":{"cc":"NG","lat":6.02,"lng":6.92,"pop":193987},"nkwerre":{"cc":"NG","lat":5.76,"lng":7.1,"pop":62973},"nkpor":{"cc":"NG","lat":6.15,"lng":6.83,"pop":103733},"nguru":{"cc":"NG","lat":12.88,"lng":10.46,"pop":111014},"mushin":{"cc":"NG","lat":6.53,"lng":3.35,"pop":199000},"mubi":{"cc":"NG","lat":10.27,"lng":13.27,"pop":225705},"modakeke":{"cc":"NG","lat":7.38,"lng":4.26,"pop":119529},"minna":{"cc":"NG","lat":9.62,"lng":6.55,"pop":425000},"malumfashi":{"cc":"NG","lat":11.79,"lng":7.62,"pop":70709},"makurdi":{"cc":"NG","lat":7.73,"lng":8.52,"pop":390000},"makoko":{"cc":"NG","lat":6.5,"lng":3.39,"pop":85840},"maiduguri":{"cc":"NG","lat":11.85,"lng":13.16,"pop":1110000},"lokoja":{"cc":"NG","lat":7.8,"lng":6.74,"pop":60579},"lere":{"cc":"NG","lat":10.39,"lng":8.57,"pop":93290},"lalupon":{"cc":"NG","lat":7.47,"lng":4.07,"pop":81130},"lagos":{"cc":"NG","lat":6.45,"lng":3.39,"pop":15388000},"lafiagi":{"cc":"NG","lat":8.85,"lng":5.42,"pop":102779},"lafia":{"cc":"NG","lat":8.49,"lng":8.52,"pop":127236},"kuje":{"cc":"NG","lat":8.88,"lng":7.23,"pop":97367},"kontagora":{"cc":"NG","lat":10.4,"lng":5.47,"pop":98754},"kisi":{"cc":"NG","lat":9.08,"lng":3.85,"pop":155510},"keffi":{"cc":"NG","lat":8.85,"lng":7.87,"pop":85911},"kaura namoda":{"cc":"NG","lat":12.59,"lng":6.59,"pop":69725},"katsina":{"cc":"NG","lat":12.99,"lng":7.6,"pop":670000},"kano":{"cc":"NG","lat":12.0,"lng":8.52,"pop":4910000},"kagoro":{"cc":"NG","lat":9.61,"lng":8.39,"pop":77008},"kafanchan":{"cc":"NG","lat":9.58,"lng":8.29,"pop":79522},"kaduna":{"cc":"NG","lat":10.53,"lng":7.44,"pop":1850000},"jos":{"cc":"NG","lat":9.93,"lng":8.89,"pop":1040000},"jimeta":{"cc":"NG","lat":9.28,"lng":12.46,"pop":248148},"jega":{"cc":"NG","lat":12.22,"lng":4.38,"pop":73495},"jalingo":{"cc":"NG","lat":8.89,"lng":11.36,"pop":117757},"iwo":{"cc":"NG","lat":7.64,"lng":4.18,"pop":250443},"isieke":{"cc":"NG","lat":6.38,"lng":8.04,"pop":89990},"iseyin":{"cc":"NG","lat":7.97,"lng":3.6,"pop":365300},"ise-ekiti":{"cc":"NG","lat":7.46,"lng":5.42,"pop":190063},"irewe":{"cc":"NG","lat":6.42,"lng":3.14,"pop":139494},"ipoti":{"cc":"NG","lat":7.87,"lng":5.08,"pop":82113},"inisa":{"cc":"NG","lat":7.85,"lng":4.33,"pop":164161},"ilorin":{"cc":"NG","lat":8.5,"lng":4.54,"pop":1080000},"ilobu":{"cc":"NG","lat":7.84,"lng":4.49,"pop":118089},"ilesa":{"cc":"NG","lat":7.63,"lng":4.74,"pop":325000},"ila orangun":{"cc":"NG","lat":8.02,"lng":4.9,"pop":179192},"ikot ekpene":{"cc":"NG","lat":5.18,"lng":7.71,"pop":254806},"ikom":{"cc":"NG","lat":5.97,"lng":8.71,"pop":79103},"ikirun":{"cc":"NG","lat":7.91,"lng":4.67,"pop":134240},"ikire":{"cc":"NG","lat":7.37,"lng":4.19,"pop":222160},"ikere-ekiti":{"cc":"NG","lat":7.5,"lng":5.23,"pop":103054},"ikeja":{"cc":"NG","lat":6.6,"lng":3.34,"pop":313196},"ikare":{"cc":"NG","lat":7.53,"lng":5.75,"pop":465000},"ijero-ekiti":{"cc":"NG","lat":7.82,"lng":5.07,"pop":167632},"ijebu ode":{"cc":"NG","lat":6.82,"lng":3.92,"pop":360000},"ijebu-jesa":{"cc":"NG","lat":7.68,"lng":4.82,"pop":51730},"ijebu-igbo":{"cc":"NG","lat":6.97,"lng":4.0,"pop":109261},"ihiala":{"cc":"NG","lat":5.85,"lng":6.86,"pop":83265},"igede-ekiti":{"cc":"NG","lat":7.67,"lng":5.13,"pop":87282},"igbo-ukwu":{"cc":"NG","lat":6.02,"lng":7.02,"pop":75224},"igbo-ora":{"cc":"NG","lat":7.43,"lng":3.29,"pop":92719},"igboho":{"cc":"NG","lat":8.84,"lng":3.76,"pop":136764},"igbara-odo":{"cc":"NG","lat":7.5,"lng":5.06,"pop":74121},"ifo":{"cc":"NG","lat":6.81,"lng":3.2,"pop":88272},"ile-ife":{"cc":"NG","lat":7.48,"lng":4.56,"pop":560000},"idanre":{"cc":"NG","lat":7.11,"lng":5.12,"pop":86468},"idah":{"cc":"NG","lat":7.11,"lng":6.74,"pop":68703},"ibadan":{"cc":"NG","lat":7.38,"lng":3.91,"pop":3649000},"hadejia":{"cc":"NG","lat":12.45,"lng":10.04,"pop":110753},"gusau":{"cc":"NG","lat":12.17,"lng":6.66,"pop":226857},"gombe":{"cc":"NG","lat":10.29,"lng":11.17,"pop":560000},"gbongan":{"cc":"NG","lat":7.48,"lng":4.35,"pop":139485},"gboko":{"cc":"NG","lat":7.32,"lng":9.0,"pop":365000},"gashua":{"cc":"NG","lat":12.87,"lng":11.04,"pop":125817},"gamboru":{"cc":"NG","lat":12.37,"lng":14.21,"pop":84672},"funtua":{"cc":"NG","lat":11.52,"lng":7.31,"pop":136811},"fiditi":{"cc":"NG","lat":7.71,"lng":3.92,"pop":71461},"ezza-ohu":{"cc":"NG","lat":6.44,"lng":8.08,"pop":67414},"esuk oron":{"cc":"NG","lat":4.8,"lng":8.25,"pop":112033},"epe":{"cc":"NG","lat":6.58,"lng":3.98,"pop":84711},"enugu-ukwu":{"cc":"NG","lat":6.17,"lng":7.01,"pop":68785},"enugu":{"cc":"NG","lat":6.44,"lng":7.5,"pop":950000},"emure-ekiti":{"cc":"NG","lat":7.44,"lng":5.46,"pop":90645},"ekpoma":{"cc":"NG","lat":6.74,"lng":6.14,"pop":59618},"ejigbo":{"cc":"NG","lat":7.9,"lng":4.31,"pop":138357},"eha amufu":{"cc":"NG","lat":6.66,"lng":7.76,"pop":70779},"efon-alaaye":{"cc":"NG","lat":7.66,"lng":4.92,"pop":279319},"effium":{"cc":"NG","lat":6.63,"lng":8.06,"pop":86945},"ebute ikorodu":{"cc":"NG","lat":6.6,"lng":3.49,"pop":535619},"daura":{"cc":"NG","lat":11.55,"lng":11.41,"pop":78277},"calabar":{"cc":"NG","lat":4.96,"lng":8.33,"pop":540000},"buguma":{"cc":"NG","lat":4.74,"lng":6.86,"pop":135404},"biu":{"cc":"NG","lat":10.61,"lng":12.19,"pop":95005},"birnin kebbi":{"cc":"NG","lat":12.45,"lng":4.2,"pop":108164},"bida":{"cc":"NG","lat":9.08,"lng":6.01,"pop":400000},"benin city":{"cc":"NG","lat":6.34,"lng":5.63,"pop":1782000},"bende":{"cc":"NG","lat":5.56,"lng":7.63,"pop":79618},"bauchi":{"cc":"NG","lat":10.31,"lng":9.84,"pop":693700},"bama":{"cc":"NG","lat":11.52,"lng":13.69,"pop":118121},"azare":{"cc":"NG","lat":11.67,"lng":10.19,"pop":105687},"awka":{"cc":"NG","lat":6.21,"lng":7.07,"pop":167738},"auchi":{"cc":"NG","lat":7.07,"lng":6.26,"pop":62907},"atani":{"cc":"NG","lat":6.01,"lng":6.75,"pop":230000},"asaba":{"cc":"NG","lat":6.2,"lng":6.73,"pop":73374},"aramoko-ekiti":{"cc":"NG","lat":7.7,"lng":5.04,"pop":74491},"apomu":{"cc":"NG","lat":7.35,"lng":4.18,"pop":71656},"amaigbo":{"cc":"NG","lat":5.79,"lng":7.84,"pop":127300},"aliayabiagba":{"cc":"NG","lat":6.45,"lng":3.33,"pop":228000},"alasia":{"cc":"NG","lat":6.47,"lng":3.17,"pop":100000},"akure":{"cc":"NG","lat":7.25,"lng":5.19,"pop":730000},"aku":{"cc":"NG","lat":6.71,"lng":7.32,"pop":73742},"agulu":{"cc":"NG","lat":6.1,"lng":7.06,"pop":79021},"agege":{"cc":"NG","lat":6.62,"lng":3.33,"pop":683600},"agbor":{"cc":"NG","lat":6.25,"lng":6.19,"pop":67610},"afikpo":{"cc":"NG","lat":5.89,"lng":7.94,"pop":71866},"ado-ekiti":{"cc":"NG","lat":7.62,"lng":5.22,"pop":435000},"abuja":{"cc":"NG","lat":9.06,"lng":7.5,"pop":2690000},"abeokuta":{"cc":"NG","lat":7.16,"lng":3.35,"pop":735000},"abakaliki":{"cc":"NG","lat":6.32,"lng":8.11,"pop":134102},"aba":{"cc":"NG","lat":5.11,"lng":7.37,"pop":1160000},"obalende":{"cc":"NG","lat":6.45,"lng":3.42,"pop":342000},"ajegunle":{"cc":"NG","lat":6.45,"lng":3.33,"pop":550000},"alimosho":{"cc":"NG","lat":6.61,"lng":3.3,"pop":308290},"akowonjo":{"cc":"NG","lat":6.61,"lng":3.31,"pop":308900},"lekki":{"cc":"NG","lat":6.45,"lng":3.48,"pop":401272},"chakwama":{"cc":"NG","lat":11.56,"lng":9.66,"pop":200000},"tipitapa":{"cc":"NI","lat":12.2,"lng":-86.1,"pop":50000},"nueva guinea":{"cc":"NI","lat":11.69,"lng":-84.46,"pop":52929},"mateare":{"cc":"NI","lat":12.24,"lng":-86.43,"pop":61234},"matagalpa":{"cc":"NI","lat":12.93,"lng":-85.92,"pop":109089},"masaya":{"cc":"NI","lat":11.97,"lng":-86.1,"pop":130113},"managua":{"cc":"NI","lat":12.13,"lng":-86.25,"pop":973087},"juigalpa":{"cc":"NI","lat":12.11,"lng":-85.37,"pop":50000},"jinotega":{"cc":"NI","lat":13.09,"lng":-86.0,"pop":55000},"estel":{"cc":"NI","lat":13.09,"lng":-86.36,"pop":96422},"esteli":{"cc":"NI","lat":13.09,"lng":-86.36,"pop":96422},"el viejo":{"cc":"NI","lat":12.66,"lng":-87.17,"pop":53504},"chinandega":{"cc":"NI","lat":12.63,"lng":-87.13,"pop":126387},"ciudad sandino":{"cc":"NI","lat":12.16,"lng":-86.34,"pop":50000},"zwolle":{"cc":"NL","lat":52.51,"lng":6.09,"pop":129840},"zoetermeer":{"cc":"NL","lat":52.06,"lng":4.49,"pop":115845},"zeist":{"cc":"NL","lat":52.09,"lng":5.23,"pop":60949},"zaanstad":{"cc":"NL","lat":52.45,"lng":4.81,"pop":140085},"zaandam":{"cc":"NL","lat":52.44,"lng":4.83,"pop":71708},"vlaardingen":{"cc":"NL","lat":51.91,"lng":4.34,"pop":73798},"venlo":{"cc":"NL","lat":51.37,"lng":6.17,"pop":101988},"velsen-zuid":{"cc":"NL","lat":52.46,"lng":4.65,"pop":67758},"veenendaal":{"cc":"NL","lat":52.03,"lng":5.56,"pop":61271},"utrecht":{"cc":"NL","lat":52.09,"lng":5.12,"pop":376435},"tilburg":{"cc":"NL","lat":51.56,"lng":5.09,"pop":221947},"spijkenisse":{"cc":"NL","lat":51.84,"lng":4.33,"pop":74988},"s-hertogenbosch":{"cc":"NL","lat":51.7,"lng":5.3,"pop":160783},"the hague":{"cc":"NL","lat":52.08,"lng":4.3,"pop":474292},"schiedam":{"cc":"NL","lat":51.92,"lng":4.39,"pop":75438},"rotterdam":{"cc":"NL","lat":51.92,"lng":4.48,"pop":868135},"roosendaal":{"cc":"NL","lat":51.53,"lng":4.47,"pop":77725},"purmerend":{"cc":"NL","lat":52.51,"lng":4.96,"pop":80117},"oss":{"cc":"NL","lat":51.77,"lng":5.52,"pop":76430},"oosterhout":{"cc":"NL","lat":51.65,"lng":4.86,"pop":53107},"nijmegen":{"cc":"NL","lat":51.84,"lng":5.85,"pop":177359},"nieuwegein":{"cc":"NL","lat":52.03,"lng":5.08,"pop":61489},"maastricht":{"cc":"NL","lat":50.85,"lng":5.69,"pop":122378},"lelystad":{"cc":"NL","lat":52.51,"lng":5.47,"pop":79811},"leiden":{"cc":"NL","lat":52.16,"lng":4.49,"pop":119713},"leeuwarden":{"cc":"NL","lat":53.2,"lng":5.81,"pop":124481},"hoorn":{"cc":"NL","lat":52.64,"lng":5.06,"pop":68852},"hoofddorp":{"cc":"NL","lat":52.3,"lng":4.69,"pop":132734},"hilversum":{"cc":"NL","lat":52.22,"lng":5.18,"pop":83640},"hengelo":{"cc":"NL","lat":52.27,"lng":6.79,"pop":82311},"helmond":{"cc":"NL","lat":51.48,"lng":5.66,"pop":74740},"heerlen":{"cc":"NL","lat":50.88,"lng":5.98,"pop":93084},"hardenberg":{"cc":"NL","lat":52.58,"lng":6.62,"pop":57909},"haarlem":{"cc":"NL","lat":52.38,"lng":4.64,"pop":162543},"groningen":{"cc":"NL","lat":53.22,"lng":6.57,"pop":244807},"gouda":{"cc":"NL","lat":52.02,"lng":4.71,"pop":71952},"enschede":{"cc":"NL","lat":52.22,"lng":6.9,"pop":153655},"emmen":{"cc":"NL","lat":52.78,"lng":6.91,"pop":57010},"eindhoven":{"cc":"NL","lat":51.44,"lng":5.48,"pop":235691},"dordrecht":{"cc":"NL","lat":51.81,"lng":4.67,"pop":119260},"deventer":{"cc":"NL","lat":52.26,"lng":6.16,"pop":97331},"den helder":{"cc":"NL","lat":52.96,"lng":4.76,"pop":59569},"delft":{"cc":"NL","lat":52.01,"lng":4.36,"pop":95060},"capelle aan den ijssel":{"cc":"NL","lat":51.93,"lng":4.58,"pop":65255},"breda":{"cc":"NL","lat":51.59,"lng":4.78,"pop":184126},"bergen op zoom":{"cc":"NL","lat":51.49,"lng":4.29,"pop":66256},"assen":{"cc":"NL","lat":53.0,"lng":6.56,"pop":68836},"arnhem":{"cc":"NL","lat":51.98,"lng":5.91,"pop":162424},"apeldoorn":{"cc":"NL","lat":52.21,"lng":5.97,"pop":136670},"amsterdam":{"cc":"NL","lat":52.37,"lng":4.89,"pop":741636},"amstelveen":{"cc":"NL","lat":52.3,"lng":4.86,"pop":79639},"amersfoort":{"cc":"NL","lat":52.16,"lng":5.39,"pop":139914},"alphen aan den rijn":{"cc":"NL","lat":52.13,"lng":4.66,"pop":70251},"almere stad":{"cc":"NL","lat":52.37,"lng":5.21,"pop":176432},"almelo":{"cc":"NL","lat":52.36,"lng":6.66,"pop":72725},"alkmaar":{"cc":"NL","lat":52.63,"lng":4.75,"pop":94853},"amsterdam-zuidoost":{"cc":"NL","lat":52.31,"lng":4.97,"pop":84811},"trondheim":{"cc":"NO","lat":63.43,"lng":10.4,"pop":216518},"tonsberg":{"cc":"NO","lat":59.27,"lng":10.41,"pop":55387},"tnsberg":{"cc":"NO","lat":59.27,"lng":10.41,"pop":55387},"stavanger":{"cc":"NO","lat":58.97,"lng":5.73,"pop":151669},"skien":{"cc":"NO","lat":59.21,"lng":9.61,"pop":50595},"sarpsborg":{"cc":"NO","lat":59.28,"lng":11.11,"pop":59038},"sandnes":{"cc":"NO","lat":58.85,"lng":5.74,"pop":85386},"sandefjord":{"cc":"NO","lat":59.13,"lng":10.22,"pop":64345},"oslo":{"cc":"NO","lat":59.91,"lng":10.75,"pop":1082575},"lillestrom":{"cc":"NO","lat":59.96,"lng":11.05,"pop":89684},"lillestrm":{"cc":"NO","lat":59.96,"lng":11.05,"pop":89684},"kristiansand":{"cc":"NO","lat":58.15,"lng":8.0,"pop":117237},"fredrikstad":{"cc":"NO","lat":59.22,"lng":10.93,"pop":83761},"drammen":{"cc":"NO","lat":59.74,"lng":10.2,"pop":106013},"bergen":{"cc":"NO","lat":60.39,"lng":5.32,"pop":294029},"asker":{"cc":"NO","lat":59.83,"lng":10.44,"pop":61906},"alesund":{"cc":"NO","lat":62.47,"lng":6.15,"pop":52626},"lesund":{"cc":"NO","lat":62.47,"lng":6.15,"pop":52626},"rajbiraj":{"cc":"NP","lat":26.54,"lng":86.75,"pop":69803},"rjbirj":{"cc":"NP","lat":26.54,"lng":86.75,"pop":69803},"pokhara":{"cc":"NP","lat":28.27,"lng":83.97,"pop":600051},"bhimdatta":{"cc":"NP","lat":28.96,"lng":80.18,"pop":88381},"lahn":{"cc":"NP","lat":26.72,"lng":86.48,"pop":102955},"lahan":{"cc":"NP","lat":26.72,"lng":86.48,"pop":102955},"kathmandu":{"cc":"NP","lat":27.7,"lng":85.32,"pop":1442271},"janakpur":{"cc":"NP","lat":26.73,"lng":85.93,"pop":195438},"hetauda":{"cc":"NP","lat":27.43,"lng":85.03,"pop":195951},"gulariy":{"cc":"NP","lat":28.21,"lng":81.35,"pop":53107},"gulariya":{"cc":"NP","lat":28.21,"lng":81.35,"pop":53107},"dharan":{"cc":"NP","lat":26.81,"lng":87.28,"pop":173096},"dharn":{"cc":"NP","lat":26.81,"lng":87.28,"pop":173096},"dhangadhi":{"cc":"NP","lat":28.7,"lng":80.59,"pop":204788},"dhangahi":{"cc":"NP","lat":28.7,"lng":80.59,"pop":204788},"chautr":{"cc":"NP","lat":27.78,"lng":85.71,"pop":51347},"chautara":{"cc":"NP","lat":27.78,"lng":85.71,"pop":51347},"butwl":{"cc":"NP","lat":27.69,"lng":83.45,"pop":195054},"butwal":{"cc":"NP","lat":27.69,"lng":83.45,"pop":195054},"birganj":{"cc":"NP","lat":27.02,"lng":84.88,"pop":268273},"birgaj":{"cc":"NP","lat":27.02,"lng":84.88,"pop":268273},"biratnagar":{"cc":"NP","lat":26.46,"lng":87.27,"pop":244750},"siddharthanagar":{"cc":"NP","lat":27.5,"lng":83.45,"pop":63367},"banep":{"cc":"NP","lat":27.63,"lng":85.52,"pop":67629},"banepa":{"cc":"NP","lat":27.63,"lng":85.52,"pop":67629},"birendranagar":{"cc":"NP","lat":28.6,"lng":81.62,"pop":154886},"nepalgunj":{"cc":"NP","lat":28.05,"lng":81.62,"pop":166258},"inaruwa":{"cc":"NP","lat":26.61,"lng":87.15,"pop":70093},"triyuga":{"cc":"NP","lat":26.79,"lng":86.7,"pop":71405},"madhyapur thimi":{"cc":"NP","lat":27.68,"lng":85.39,"pop":119955},"porirua":{"cc":"NZ","lat":-41.13,"lng":174.85,"pop":61500},"palmerston north":{"cc":"NZ","lat":-40.36,"lng":175.61,"pop":90500},"north shore":{"cc":"NZ","lat":-36.8,"lng":174.75,"pop":258697},"new plymouth":{"cc":"NZ","lat":-39.07,"lng":174.08,"pop":90100},"nelson":{"cc":"NZ","lat":-41.27,"lng":173.28,"pop":54400},"napier":{"cc":"NZ","lat":-39.49,"lng":176.91,"pop":66400},"manukau city":{"cc":"NZ","lat":-36.99,"lng":174.88,"pop":362000},"lower hutt":{"cc":"NZ","lat":-41.22,"lng":174.92,"pop":114200},"invercargill":{"cc":"NZ","lat":-46.4,"lng":168.35,"pop":58000},"dunedin":{"cc":"NZ","lat":-45.87,"lng":170.5,"pop":132800},"christchurch":{"cc":"NZ","lat":-43.53,"lng":172.63,"pop":419200},"auckland":{"cc":"NZ","lat":-36.85,"lng":174.76,"pop":1547200},"tauranga":{"cc":"NZ","lat":-37.69,"lng":176.17,"pop":161000},"whangarei":{"cc":"NZ","lat":-35.73,"lng":174.32,"pop":50900},"papatoetoe":{"cc":"NZ","lat":-36.97,"lng":174.84,"pop":56010},"rotorua":{"cc":"NZ","lat":-38.14,"lng":176.25,"pop":65901},"sur":{"cc":"OM","lat":22.57,"lng":59.53,"pop":71152},"sohar":{"cc":"OM","lat":24.35,"lng":56.71,"pop":108274},"samail":{"cc":"OM","lat":23.3,"lng":57.95,"pop":80538},"samil":{"cc":"OM","lat":23.3,"lng":57.95,"pop":80538},"salalah":{"cc":"OM","lat":17.02,"lng":54.09,"pop":163140},"allah":{"cc":"OM","lat":17.02,"lng":54.09,"pop":163140},"aam":{"cc":"OM","lat":24.17,"lng":56.89,"pop":140000},"saham":{"cc":"OM","lat":24.17,"lng":56.89,"pop":140000},"qurayyt":{"cc":"OM","lat":23.26,"lng":58.92,"pop":63133},"nizw":{"cc":"OM","lat":22.93,"lng":57.53,"pop":72076},"nizwa":{"cc":"OM","lat":22.93,"lng":57.53,"pop":72076},"muscat":{"cc":"OM","lat":23.58,"lng":58.41,"pop":797000},"ibri":{"cc":"OM","lat":23.23,"lng":56.52,"pop":163473},"ibr":{"cc":"OM","lat":23.23,"lng":56.52,"pop":163473},"bawshar":{"cc":"OM","lat":23.58,"lng":58.4,"pop":383257},"barka":{"cc":"OM","lat":23.68,"lng":57.89,"pop":81647},"bark":{"cc":"OM","lat":23.68,"lng":57.89,"pop":81647},"bahla":{"cc":"OM","lat":22.98,"lng":57.3,"pop":54338},"bahl":{"cc":"OM","lat":22.98,"lng":57.3,"pop":54338},"as suwayq":{"cc":"OM","lat":23.85,"lng":57.44,"pop":107143},"seeb":{"cc":"OM","lat":23.67,"lng":58.19,"pop":470878},"rustaq":{"cc":"OM","lat":23.39,"lng":57.42,"pop":120000},"al khbrah":{"cc":"OM","lat":23.97,"lng":57.09,"pop":50223},"al khaburah":{"cc":"OM","lat":23.97,"lng":57.09,"pop":50223},"al buraymi":{"cc":"OM","lat":24.25,"lng":55.79,"pop":73670},"al buraym":{"cc":"OM","lat":24.25,"lng":55.79,"pop":73670},"tocumen":{"cc":"PA","lat":9.09,"lng":-79.38,"pop":50844},"san miguelito":{"cc":"PA","lat":9.05,"lng":-79.47,"pop":321501},"pedregal":{"cc":"PA","lat":9.07,"lng":-79.43,"pop":51641},"panama city":{"cc":"PA","lat":8.99,"lng":-79.52,"pop":408168},"las cumbres":{"cc":"PA","lat":9.09,"lng":-79.54,"pop":69102},"la chorrera":{"cc":"PA","lat":8.88,"lng":-79.78,"pop":61232},"juan diaz":{"cc":"PA","lat":9.04,"lng":-79.44,"pop":100636},"juan daz":{"cc":"PA","lat":9.04,"lng":-79.44,"pop":100636},"david":{"cc":"PA","lat":8.43,"lng":-82.43,"pop":82907},"arraijn":{"cc":"PA","lat":8.94,"lng":-79.64,"pop":76815},"arraijan":{"cc":"PA","lat":8.94,"lng":-79.64,"pop":76815},"tumbes":{"cc":"PE","lat":-3.56,"lng":-80.44,"pop":96946},"tingo mara":{"cc":"PE","lat":-9.3,"lng":-76.0,"pop":53177},"tingo maria":{"cc":"PE","lat":-9.3,"lng":-76.0,"pop":53177},"talara":{"cc":"PE","lat":-4.58,"lng":-81.27,"pop":99074},"sullana":{"cc":"PE","lat":-4.9,"lng":-80.69,"pop":160789},"pucallpa":{"cc":"PE","lat":-8.38,"lng":-74.55,"pop":326040},"piura":{"cc":"PE","lat":-5.18,"lng":-80.66,"pop":630000},"paita":{"cc":"PE","lat":-5.09,"lng":-81.11,"pop":56151},"moyobamba":{"cc":"PE","lat":-6.03,"lng":-76.97,"pop":50073},"iquitos":{"cc":"PE","lat":-3.75,"lng":-73.25,"pop":377609},"huaraz":{"cc":"PE","lat":-9.53,"lng":-77.53,"pop":118836},"huanuco":{"cc":"PE","lat":-9.93,"lng":-76.24,"pop":196627},"hunuco":{"cc":"PE","lat":-9.93,"lng":-76.24,"pop":196627},"chulucanas":{"cc":"PE","lat":-5.09,"lng":-80.16,"pop":68835},"chimbote":{"cc":"PE","lat":-9.08,"lng":-78.59,"pop":316966},"chiclayo":{"cc":"PE","lat":-6.77,"lng":-79.85,"pop":609400},"catacaos":{"cc":"PE","lat":-5.27,"lng":-80.68,"pop":57304},"cajamarca":{"cc":"PE","lat":-7.16,"lng":-78.5,"pop":201329},"belen":{"cc":"PE","lat":-3.76,"lng":-73.25,"pop":57824},"tarma":{"cc":"PE","lat":-11.42,"lng":-75.69,"pop":51350},"tacna":{"cc":"PE","lat":-18.01,"lng":-70.25,"pop":286240},"santiago de surco":{"cc":"PE","lat":-12.14,"lng":-77.01,"pop":251648},"san isidro":{"cc":"PE","lat":-12.1,"lng":-77.04,"pop":68309},"puno":{"cc":"PE","lat":-15.84,"lng":-70.02,"pop":128637},"puerto maldonado":{"cc":"PE","lat":-12.59,"lng":-69.2,"pop":85024},"pisco":{"cc":"PE","lat":-13.71,"lng":-76.21,"pop":61869},"moquegua":{"cc":"PE","lat":-17.2,"lng":-70.94,"pop":69882},"miraflores":{"cc":"PE","lat":-12.11,"lng":-77.03,"pop":187401},"lima":{"cc":"PE","lat":-12.04,"lng":-77.03,"pop":7737002},"juliaca":{"cc":"PE","lat":-15.5,"lng":-70.13,"pop":245675},"villa poeta jos glvez barrenechea":{"cc":"PE","lat":-12.21,"lng":-76.91,"pop":61000},"villa poeta jose galvez barrenechea":{"cc":"PE","lat":-12.21,"lng":-76.91,"pop":61000},"ilo":{"cc":"PE","lat":-17.63,"lng":-71.34,"pop":53476},"ica":{"cc":"PE","lat":-14.08,"lng":-75.73,"pop":282407},"huaral":{"cc":"PE","lat":-11.49,"lng":-77.21,"pop":62174},"huancayo":{"cc":"PE","lat":-12.07,"lng":-75.21,"pop":456250},"huacho":{"cc":"PE","lat":-11.12,"lng":-77.61,"pop":54545},"cusco":{"cc":"PE","lat":-13.53,"lng":-71.97,"pop":428450},"chosica":{"cc":"PE","lat":-11.94,"lng":-76.71,"pop":88606},"chincha alta":{"cc":"PE","lat":-13.41,"lng":-76.13,"pop":153076},"cerro de pasco":{"cc":"PE","lat":-10.67,"lng":-76.25,"pop":58899},"callao":{"cc":"PE","lat":-12.05,"lng":-77.13,"pop":1226200},"ayacucho":{"cc":"PE","lat":-13.16,"lng":-74.22,"pop":140033},"arequipa":{"cc":"PE","lat":-16.4,"lng":-71.54,"pop":1195700},"abancay":{"cc":"PE","lat":-13.63,"lng":-72.88,"pop":72277},"santa anita - los ficus":{"cc":"PE","lat":-12.05,"lng":-76.97,"pop":184614},"san francisco de borja":{"cc":"PE","lat":-12.09,"lng":-77.0,"pop":105076},"ciudad satelite":{"cc":"PE","lat":-16.43,"lng":-71.53,"pop":76410},"chilca":{"cc":"PE","lat":-12.09,"lng":-75.21,"pop":73371},"jesus maria":{"cc":"PE","lat":-12.07,"lng":-77.04,"pop":66171},"wanchaq":{"cc":"PE","lat":-13.52,"lng":-71.97,"pop":59134},"selva alegre":{"cc":"PE","lat":-16.37,"lng":-71.53,"pop":72696},"brea":{"cc":"PE","lat":-12.06,"lng":-77.05,"pop":81909},"brena":{"cc":"PE","lat":-12.06,"lng":-77.05,"pop":81909},"port moresby":{"cc":"PG","lat":-9.48,"lng":147.15,"pop":283733},"lae":{"cc":"PG","lat":-6.72,"lng":147.0,"pop":76255},"zamboanga":{"cc":"PH","lat":6.91,"lng":122.07,"pop":1018849},"virac":{"cc":"PH","lat":13.58,"lng":124.24,"pop":75135},"villasis":{"cc":"PH","lat":15.9,"lng":120.59,"pop":65086},"victorias":{"cc":"PH","lat":10.9,"lng":123.07,"pop":86510},"valenzuela":{"cc":"PH","lat":14.7,"lng":120.97,"pop":725173},"nia valencia":{"cc":"PH","lat":7.91,"lng":125.09,"pop":223620},"urdaneta":{"cc":"PH","lat":15.98,"lng":120.57,"pop":145935},"ualog":{"cc":"PH","lat":10.57,"lng":123.39,"pop":60548},"tupi":{"cc":"PH","lat":6.33,"lng":124.95,"pop":78599},"tunasan":{"cc":"PH","lat":14.38,"lng":121.05,"pop":61374},"tuguegarao":{"cc":"PH","lat":17.62,"lng":121.72,"pop":167297},"tubod":{"cc":"PH","lat":8.06,"lng":123.79,"pop":50395},"tinongan":{"cc":"PH","lat":10.21,"lng":123.04,"pop":62146},"taytay":{"cc":"PH","lat":14.56,"lng":121.13,"pop":231460},"tayabas":{"cc":"PH","lat":14.03,"lng":121.59,"pop":115318},"tarlac city":{"cc":"PH","lat":15.48,"lng":120.6,"pop":401892},"tanza":{"cc":"PH","lat":14.68,"lng":120.94,"pop":105510},"tanjay":{"cc":"PH","lat":9.52,"lng":123.16,"pop":84593},"tanay":{"cc":"PH","lat":14.5,"lng":121.28,"pop":59950},"tanauan":{"cc":"PH","lat":14.09,"lng":121.15,"pop":68456},"talisay":{"cc":"PH","lat":10.24,"lng":123.85,"pop":133148},"talavera":{"cc":"PH","lat":15.59,"lng":120.92,"pop":64610},"magugpo poblacion":{"cc":"PH","lat":7.45,"lng":125.8,"pop":233254},"taguig":{"cc":"PH","lat":14.52,"lng":121.08,"pop":1308085},"tagbilaran city":{"cc":"PH","lat":9.66,"lng":123.85,"pop":86411},"tagaytay":{"cc":"PH","lat":14.1,"lng":120.93,"pop":87811},"tacurong":{"cc":"PH","lat":6.69,"lng":124.68,"pop":116945},"tacloban":{"cc":"PH","lat":11.24,"lng":125.0,"pop":259353},"tabaco":{"cc":"PH","lat":13.36,"lng":123.73,"pop":57860},"surigao":{"cc":"PH","lat":9.79,"lng":125.5,"pop":87832},"surallah":{"cc":"PH","lat":6.38,"lng":124.75,"pop":91412},"sultan kudarat":{"cc":"PH","lat":7.23,"lng":124.26,"pop":124965},"subic":{"cc":"PH","lat":14.88,"lng":120.23,"pop":67664},"sorsogon":{"cc":"PH","lat":12.97,"lng":123.99,"pop":187670},"solana":{"cc":"PH","lat":17.65,"lng":121.69,"pop":71475},"sipalay":{"cc":"PH","lat":9.75,"lng":122.4,"pop":73847},"siocon":{"cc":"PH","lat":7.71,"lng":122.14,"pop":51239},"silang":{"cc":"PH","lat":14.22,"lng":120.97,"pop":119475},"sibonga":{"cc":"PH","lat":10.02,"lng":123.62,"pop":54610},"santo tomas":{"cc":"PH","lat":14.11,"lng":121.14,"pop":57438},"santol":{"cc":"PH","lat":15.16,"lng":120.57,"pop":298976},"san pablo":{"cc":"PH","lat":14.07,"lng":121.33,"pop":300166},"san leonardo":{"cc":"PH","lat":15.36,"lng":120.96,"pop":69180},"san jose del monte":{"cc":"PH","lat":14.81,"lng":121.05,"pop":357828},"san ildefonso":{"cc":"PH","lat":15.08,"lng":120.94,"pop":65669},"sagay":{"cc":"PH","lat":10.94,"lng":123.42,"pop":72153},"sablayan":{"cc":"PH","lat":12.83,"lng":120.77,"pop":91406},"roxas city":{"cc":"PH","lat":11.59,"lng":122.75,"pop":185236},"rosales":{"cc":"PH","lat":15.89,"lng":120.63,"pop":67510},"quezon city":{"cc":"PH","lat":14.65,"lng":121.05,"pop":3084270},"quezon":{"cc":"PH","lat":7.73,"lng":125.1,"pop":114521},"pulong santa cruz":{"cc":"PH","lat":14.27,"lng":121.08,"pop":126844},"pulilan":{"cc":"PH","lat":14.9,"lng":120.85,"pop":111384},"puerto princesa":{"cc":"PH","lat":9.74,"lng":118.74,"pop":222673},"prosperidad":{"cc":"PH","lat":8.58,"lng":125.9,"pop":90162},"port area":{"cc":"PH","lat":14.59,"lng":120.97,"pop":72605},"polomolok":{"cc":"PH","lat":6.22,"lng":125.06,"pop":63987},"polangui":{"cc":"PH","lat":13.29,"lng":123.49,"pop":89176},"plaridel":{"cc":"PH","lat":14.89,"lng":120.86,"pop":120939},"patuto":{"cc":"PH","lat":14.12,"lng":120.97,"pop":52883},"pateros":{"cc":"PH","lat":14.54,"lng":121.07,"pop":63840},"pasay":{"cc":"PH","lat":14.54,"lng":121.0,"pop":416522},"paranaque city":{"cc":"PH","lat":14.48,"lng":121.02,"pop":703245},"paombong":{"cc":"PH","lat":14.83,"lng":120.79,"pop":58453},"paniqui":{"cc":"PH","lat":15.67,"lng":120.58,"pop":106190},"pandi":{"cc":"PH","lat":14.87,"lng":120.96,"pop":162725},"panalanoy":{"cc":"PH","lat":11.25,"lng":125.01,"pop":189090},"panabo":{"cc":"PH","lat":7.31,"lng":125.68,"pop":211242},"pagbilao":{"cc":"PH","lat":13.97,"lng":121.7,"pop":82132},"pagadian":{"cc":"PH","lat":7.83,"lng":123.44,"pop":206483},"paco":{"cc":"PH","lat":14.59,"lng":120.99,"pop":79839},"ozamiz city":{"cc":"PH","lat":8.15,"lng":123.84,"pop":93082},"oroquieta":{"cc":"PH","lat":8.49,"lng":123.8,"pop":71373},"ormoc":{"cc":"PH","lat":11.01,"lng":124.61,"pop":238545},"orion":{"cc":"PH","lat":14.62,"lng":120.58,"pop":63044},"olongapo":{"cc":"PH","lat":14.83,"lng":120.28,"pop":221178},"obando":{"cc":"PH","lat":14.71,"lng":120.94,"pop":59929},"oas":{"cc":"PH","lat":13.26,"lng":123.5,"pop":64890},"norzagaray":{"cc":"PH","lat":14.91,"lng":121.05,"pop":140697},"navotas":{"cc":"PH","lat":14.67,"lng":120.95,"pop":249463},"nasugbu":{"cc":"PH","lat":14.07,"lng":120.63,"pop":62857},"naic":{"cc":"PH","lat":14.32,"lng":120.77,"pop":55195},"naga":{"cc":"PH","lat":13.62,"lng":123.18,"pop":174931},"muricay":{"cc":"PH","lat":7.83,"lng":123.48,"pop":132094},"muntinlupa":{"cc":"PH","lat":14.39,"lng":121.05,"pop":552225},"muoz":{"cc":"PH","lat":15.72,"lng":120.9,"pop":85061},"munoz":{"cc":"PH","lat":15.72,"lng":120.9,"pop":85061},"rodriguez":{"cc":"PH","lat":14.76,"lng":121.2,"pop":134432},"monkayo":{"cc":"PH","lat":7.82,"lng":126.05,"pop":96405},"minglanilla":{"cc":"PH","lat":10.24,"lng":123.8,"pop":62058},"midsayap":{"cc":"PH","lat":7.19,"lng":124.53,"pop":117365},"meycauayan":{"cc":"PH","lat":14.74,"lng":120.96,"pop":228023},"mauban":{"cc":"PH","lat":14.19,"lng":121.73,"pop":70135},"mati":{"cc":"PH","lat":6.96,"lng":126.22,"pop":105908},"masinloc":{"cc":"PH","lat":15.54,"lng":119.95,"pop":56579},"mariveles":{"cc":"PH","lat":14.43,"lng":120.49,"pop":156200},"marilao":{"cc":"PH","lat":14.76,"lng":120.95,"pop":83276},"marikina city":{"cc":"PH","lat":14.65,"lng":121.11,"pop":471323},"mariano":{"cc":"PH","lat":8.83,"lng":125.12,"pop":70516},"marawi city":{"cc":"PH","lat":8.0,"lng":124.28,"pop":259993},"maramag":{"cc":"PH","lat":7.76,"lng":125.01,"pop":109864},"mantampay":{"cc":"PH","lat":8.17,"lng":124.22,"pop":265032},"mansilingan":{"cc":"PH","lat":10.63,"lng":122.98,"pop":454150},"manolo fortich":{"cc":"PH","lat":8.37,"lng":124.86,"pop":118075},"manila":{"cc":"PH","lat":14.6,"lng":120.98,"pop":1600000},"mangaldan":{"cc":"PH","lat":16.07,"lng":120.4,"pop":88818},"mandaue city":{"cc":"PH","lat":10.32,"lng":123.92,"pop":331320},"mandaluyong city":{"cc":"PH","lat":14.58,"lng":121.04,"pop":465902},"manaoag":{"cc":"PH","lat":16.04,"lng":120.49,"pop":59115},"malugun":{"cc":"PH","lat":6.28,"lng":125.28,"pop":52248},"malungun":{"cc":"PH","lat":6.28,"lng":125.28,"pop":52248},"malolos":{"cc":"PH","lat":14.84,"lng":120.81,"pop":269809},"malita":{"cc":"PH","lat":6.42,"lng":125.61,"pop":118438},"malaybalay":{"cc":"PH","lat":8.16,"lng":125.13,"pop":61524},"malapatan":{"cc":"PH","lat":5.97,"lng":125.29,"pop":82577},"malabon":{"cc":"PH","lat":14.67,"lng":120.94,"pop":365525},"makati city":{"cc":"PH","lat":14.55,"lng":121.03,"pop":510383},"magsaysay":{"cc":"PH","lat":6.77,"lng":125.18,"pop":57936},"magalang":{"cc":"PH","lat":15.22,"lng":120.66,"pop":68988},"maco":{"cc":"PH","lat":7.36,"lng":125.86,"pop":87680},"mabalacat city":{"cc":"PH","lat":15.22,"lng":120.57,"pop":188050},"lupon":{"cc":"PH","lat":6.9,"lng":126.01,"pop":68717},"lucena":{"cc":"PH","lat":13.93,"lng":121.62,"pop":228758},"lubao":{"cc":"PH","lat":14.94,"lng":120.6,"pop":55645},"los banos":{"cc":"PH","lat":14.17,"lng":121.24,"pop":117030},"los baos":{"cc":"PH","lat":14.17,"lng":121.24,"pop":117030},"lipa city":{"cc":"PH","lat":13.94,"lng":121.16,"pop":212287},"lingayen":{"cc":"PH","lat":16.02,"lng":120.23,"pop":56580},"limay":{"cc":"PH","lat":14.56,"lng":120.6,"pop":81960},"libon":{"cc":"PH","lat":13.3,"lng":123.44,"pop":68846},"libertad":{"cc":"PH","lat":8.94,"lng":125.5,"pop":250353},"legaspi":{"cc":"PH","lat":13.14,"lng":123.74,"pop":179481},"la trinidad":{"cc":"PH","lat":16.45,"lng":120.59,"pop":142925},"las pias":{"cc":"PH","lat":14.45,"lng":120.98,"pop":615549},"las pinas":{"cc":"PH","lat":14.45,"lng":120.98,"pop":615549},"lapu-lapu city":{"cc":"PH","lat":10.31,"lng":123.95,"pop":497813},"laoag":{"cc":"PH","lat":18.2,"lng":120.6,"pop":112117},"lambayong":{"cc":"PH","lat":6.52,"lng":125.04,"pop":81288},"la carlota":{"cc":"PH","lat":10.42,"lng":122.92,"pop":67740},"koronadal":{"cc":"PH","lat":6.5,"lng":124.85,"pop":201844},"kidapawan":{"cc":"PH","lat":7.01,"lng":125.09,"pop":79652},"kawit":{"cc":"PH","lat":14.44,"lng":120.9,"pop":73210},"kalibo":{"cc":"PH","lat":11.71,"lng":122.36,"pop":93218},"kalamansig":{"cc":"PH","lat":6.55,"lng":124.05,"pop":52257},"kabankalan":{"cc":"PH","lat":9.98,"lng":122.81,"pop":210893},"jolo":{"cc":"PH","lat":6.05,"lng":121.0,"pop":101002},"itogon":{"cc":"PH","lat":16.36,"lng":120.68,"pop":59736},"isulan":{"cc":"PH","lat":6.63,"lng":124.61,"pop":101455},"city of isabela":{"cc":"PH","lat":6.7,"lng":121.97,"pop":67336},"iriga city":{"cc":"PH","lat":13.43,"lng":123.41,"pop":115306},"indang":{"cc":"PH","lat":14.2,"lng":120.88,"pop":70092},"imus":{"cc":"PH","lat":14.43,"lng":120.94,"pop":481949},"impasugong":{"cc":"PH","lat":8.31,"lng":125.0,"pop":55901},"iloilo":{"cc":"PH","lat":10.7,"lng":122.56,"pop":473728},"iligan city":{"cc":"PH","lat":8.25,"lng":124.4,"pop":312323},"iligan":{"cc":"PH","lat":8.23,"lng":124.24,"pop":342618},"ilagan":{"cc":"PH","lat":17.15,"lng":121.89,"pop":164020},"himamaylan":{"cc":"PH","lat":10.1,"lng":122.87,"pop":117286},"hagonoy":{"cc":"PH","lat":14.83,"lng":120.73,"pop":123531},"guyong":{"cc":"PH","lat":14.84,"lng":120.98,"pop":155391},"guiguinto":{"cc":"PH","lat":14.83,"lng":120.88,"pop":118173},"gubat":{"cc":"PH","lat":12.92,"lng":124.12,"pop":61095},"gingoog":{"cc":"PH","lat":8.83,"lng":125.1,"pop":138895},"general trias":{"cc":"PH","lat":14.39,"lng":120.88,"pop":96022},"general santos":{"cc":"PH","lat":6.11,"lng":125.17,"pop":722059},"gapan":{"cc":"PH","lat":15.31,"lng":120.95,"pop":129610},"escalante":{"cc":"PH","lat":10.84,"lng":123.5,"pop":97050},"enrique b magalona":{"cc":"PH","lat":10.88,"lng":122.98,"pop":64290},"el nido":{"cc":"PH","lat":11.19,"lng":119.4,"pop":51367},"dumaguete":{"cc":"PH","lat":9.31,"lng":123.31,"pop":113541},"don carlos":{"cc":"PH","lat":7.68,"lng":125.0,"pop":73592},"dipolog":{"cc":"PH","lat":8.57,"lng":123.33,"pop":93549},"dinalupihan":{"cc":"PH","lat":14.88,"lng":120.45,"pop":66670},"dinaig":{"cc":"PH","lat":7.17,"lng":124.21,"pop":116768},"digos":{"cc":"PH","lat":6.75,"lng":125.36,"pop":116122},"davao":{"cc":"PH","lat":7.07,"lng":125.61,"pop":1848947},"dasmarinas":{"cc":"PH","lat":14.33,"lng":120.94,"pop":441876},"dasmarias":{"cc":"PH","lat":14.33,"lng":120.94,"pop":441876},"dapitan":{"cc":"PH","lat":8.66,"lng":123.42,"pop":87699},"danao":{"cc":"PH","lat":10.52,"lng":124.03,"pop":70270},"dagupan":{"cc":"PH","lat":16.04,"lng":120.33,"pop":171271},"daet":{"cc":"PH","lat":14.11,"lng":122.96,"pop":78142},"daanbantayan":{"cc":"PH","lat":11.25,"lng":124.01,"pop":95080},"cupang":{"cc":"PH","lat":14.43,"lng":121.04,"pop":57482},"cotabato":{"cc":"PH","lat":7.22,"lng":124.25,"pop":383383},"cebu city":{"cc":"PH","lat":10.32,"lng":123.89,"pop":965332},"cavite city":{"cc":"PH","lat":14.48,"lng":120.9,"pop":115932},"catbalogan":{"cc":"PH","lat":11.78,"lng":124.89,"pop":107896},"catarman":{"cc":"PH","lat":12.5,"lng":124.64,"pop":97738},"carmona":{"cc":"PH","lat":14.31,"lng":121.06,"pop":112140},"cogan":{"cc":"PH","lat":10.59,"lng":124.02,"pop":60230},"cardona":{"cc":"PH","lat":14.49,"lng":121.23,"pop":51493},"capas":{"cc":"PH","lat":15.33,"lng":120.59,"pop":162724},"candelaria":{"cc":"PH","lat":13.93,"lng":121.42,"pop":137933},"calumpit":{"cc":"PH","lat":14.92,"lng":120.77,"pop":122187},"caloocan":{"cc":"PH","lat":14.65,"lng":120.97,"pop":1712945},"calbayog city":{"cc":"PH","lat":12.07,"lng":124.6,"pop":67921},"calauan":{"cc":"PH","lat":14.15,"lng":121.32,"pop":89670},"calauag":{"cc":"PH","lat":13.96,"lng":122.29,"pop":68999},"calasiao":{"cc":"PH","lat":16.01,"lng":120.36,"pop":100686},"calapan":{"cc":"PH","lat":13.41,"lng":121.18,"pop":66008},"calamba":{"cc":"PH","lat":14.21,"lng":121.17,"pop":575046},"calabanga":{"cc":"PH","lat":13.71,"lng":123.21,"pop":88918},"cainta":{"cc":"PH","lat":14.58,"lng":121.12,"pop":283172},"cagayan de oro":{"cc":"PH","lat":8.48,"lng":124.65,"pop":741617},"cabuyao":{"cc":"PH","lat":14.27,"lng":121.13,"pop":308745},"cabanatuan city":{"cc":"PH","lat":15.49,"lng":120.97,"pop":343672},"butuan":{"cc":"PH","lat":8.95,"lng":125.54,"pop":309709},"bustos":{"cc":"PH","lat":14.96,"lng":120.92,"pop":80565},"burauen":{"cc":"PH","lat":10.98,"lng":124.89,"pop":54635},"bunawan":{"cc":"PH","lat":8.17,"lng":125.99,"pop":50999},"buluan":{"cc":"PH","lat":6.72,"lng":124.8,"pop":60931},"bulaon":{"cc":"PH","lat":15.08,"lng":120.66,"pop":131818},"bulacan":{"cc":"PH","lat":14.79,"lng":120.88,"pop":83101},"budta":{"cc":"PH","lat":7.2,"lng":124.44,"pop":1273715},"brookes point":{"cc":"PH","lat":8.77,"lng":117.84,"pop":76715},"borongan":{"cc":"PH","lat":11.61,"lng":125.43,"pop":71431},"bongabon":{"cc":"PH","lat":15.63,"lng":121.14,"pop":69376},"bocaue":{"cc":"PH","lat":14.8,"lng":120.93,"pop":98649},"bislig":{"cc":"PH","lat":8.22,"lng":126.32,"pop":99872},"binonga":{"cc":"PH","lat":10.77,"lng":122.98,"pop":83980},"binangonan":{"cc":"PH","lat":14.46,"lng":121.19,"pop":219204},"binan":{"cc":"PH","lat":14.34,"lng":121.08,"pop":300000},"bian":{"cc":"PH","lat":14.34,"lng":121.08,"pop":300000},"bayugan":{"cc":"PH","lat":8.76,"lng":125.77,"pop":110313},"bayawan":{"cc":"PH","lat":9.36,"lng":122.8,"pop":126744},"bayambang":{"cc":"PH","lat":15.81,"lng":120.46,"pop":129506},"bauang":{"cc":"PH","lat":16.53,"lng":120.33,"pop":77670},"batangas":{"cc":"PH","lat":13.76,"lng":121.06,"pop":237370},"batac city":{"cc":"PH","lat":18.06,"lng":120.56,"pop":56781},"bantayan":{"cc":"PH","lat":11.17,"lng":123.72,"pop":87394},"banga":{"cc":"PH","lat":6.42,"lng":124.78,"pop":91536},"baga":{"cc":"PH","lat":6.42,"lng":124.78,"pop":58855},"bambang":{"cc":"PH","lat":16.39,"lng":121.11,"pop":60146},"bamban":{"cc":"PH","lat":15.27,"lng":120.57,"pop":78260},"baliuag":{"cc":"PH","lat":14.95,"lng":120.9,"pop":135679},"balayan":{"cc":"PH","lat":13.94,"lng":120.73,"pop":50115},"balanga":{"cc":"PH","lat":14.68,"lng":120.54,"pop":72954},"balagtas":{"cc":"PH","lat":14.82,"lng":120.87,"pop":59826},"bais":{"cc":"PH","lat":9.59,"lng":123.12,"pop":88050},"baguio":{"cc":"PH","lat":16.42,"lng":120.59,"pop":272714},"bagong barrio":{"cc":"PH","lat":14.67,"lng":120.99,"pop":77490},"bago city":{"cc":"PH","lat":10.53,"lng":122.83,"pop":192993},"bacoor":{"cc":"PH","lat":14.46,"lng":120.94,"pop":356974},"bacolod city":{"cc":"PH","lat":10.67,"lng":122.95,"pop":454898},"arayat":{"cc":"PH","lat":15.15,"lng":120.77,"pop":87987},"aparri":{"cc":"PH","lat":18.36,"lng":121.64,"pop":68368},"apalit":{"cc":"PH","lat":14.95,"lng":120.77,"pop":121057},"antipolo":{"cc":"PH","lat":14.63,"lng":121.12,"pop":913712},"angono":{"cc":"PH","lat":14.53,"lng":121.15,"pop":134975},"angeles city":{"cc":"PH","lat":15.15,"lng":120.58,"pop":483452},"angat":{"cc":"PH","lat":14.93,"lng":121.03,"pop":67862},"alicia":{"cc":"PH","lat":16.78,"lng":121.7,"pop":74699},"alabel":{"cc":"PH","lat":6.1,"lng":125.29,"pop":90120},"malingao":{"cc":"PH","lat":7.16,"lng":124.47,"pop":1121974},"jose rizal":{"cc":"PH","lat":8.88,"lng":117.5,"pop":59040},"commonwealth":{"cc":"PH","lat":14.7,"lng":121.08,"pop":215034},"bagong silangan":{"cc":"PH","lat":14.71,"lng":121.11,"pop":106886},"pasig city":{"cc":"PH","lat":14.59,"lng":121.06,"pop":853050},"poblacion":{"cc":"PH","lat":14.38,"lng":121.03,"pop":124554},"banco filipino homes":{"cc":"PH","lat":14.43,"lng":121.02,"pop":92752},"bagong silang":{"cc":"PH","lat":14.78,"lng":121.04,"pop":261729},"mandaluyong":{"cc":"PH","lat":14.58,"lng":121.04,"pop":425000},"sharifabad":{"cc":"PK","lat":33.43,"lng":73.36,"pop":55027},"rawalakot":{"cc":"PK","lat":33.86,"lng":73.76,"pop":50000},"pir jo goth":{"cc":"PK","lat":27.59,"lng":68.62,"pop":54266},"khairpur mirs":{"cc":"PK","lat":27.53,"lng":68.76,"pop":191044},"zhob":{"cc":"PK","lat":31.34,"lng":69.45,"pop":50537},"zahir pir":{"cc":"PK","lat":28.81,"lng":70.52,"pop":76979},"yazman":{"cc":"PK","lat":29.12,"lng":71.74,"pop":60738},"wazirabad":{"cc":"PK","lat":32.44,"lng":74.12,"pop":152624},"vihari":{"cc":"PK","lat":30.04,"lng":72.36,"pop":112840},"usta muhammad":{"cc":"PK","lat":28.18,"lng":68.04,"pop":64632},"umarkot":{"cc":"PK","lat":25.36,"lng":69.74,"pop":144558},"ubauro":{"cc":"PK","lat":28.16,"lng":69.73,"pop":50981},"turbat":{"cc":"PK","lat":26.0,"lng":63.05,"pop":75694},"tordher":{"cc":"PK","lat":33.99,"lng":72.29,"pop":150000},"topi":{"cc":"PK","lat":34.07,"lng":72.62,"pop":74867},"toba tek singh":{"cc":"PK","lat":30.97,"lng":72.48,"pop":123102},"thul":{"cc":"PK","lat":28.24,"lng":68.78,"pop":88554},"taunsa":{"cc":"PK","lat":30.7,"lng":70.65,"pop":115704},"tando muhammad khan":{"cc":"PK","lat":25.12,"lng":68.54,"pop":114406},"tando jam":{"cc":"PK","lat":25.43,"lng":68.53,"pop":71760},"tando bago":{"cc":"PK","lat":24.79,"lng":68.97,"pop":426535},"tando allahyar":{"cc":"PK","lat":25.46,"lng":68.72,"pop":421923},"tando adam":{"cc":"PK","lat":25.77,"lng":68.66,"pop":174291},"talhar":{"cc":"PK","lat":24.88,"lng":68.81,"pop":200014},"talagang":{"cc":"PK","lat":32.93,"lng":72.42,"pop":79431},"swabi":{"cc":"PK","lat":34.12,"lng":72.47,"pop":97363},"sukkur":{"cc":"PK","lat":27.7,"lng":68.86,"pop":563851},"skardu":{"cc":"PK","lat":35.3,"lng":75.63,"pop":260000},"sinjhoro":{"cc":"PK","lat":26.03,"lng":68.81,"pop":354709},"sibi":{"cc":"PK","lat":29.54,"lng":67.88,"pop":64069},"sialkot":{"cc":"PK","lat":32.49,"lng":74.53,"pop":911817},"shujaabad":{"cc":"PK","lat":29.88,"lng":71.29,"pop":151115},"shorkot":{"cc":"PK","lat":31.91,"lng":70.88,"pop":67439},"shikarpur":{"cc":"PK","lat":27.96,"lng":68.64,"pop":204938},"shekhupura":{"cc":"PK","lat":31.71,"lng":73.99,"pop":591424},"shakargarh":{"cc":"PK","lat":32.26,"lng":75.16,"pop":126742},"shahkot":{"cc":"PK","lat":31.57,"lng":73.49,"pop":244868},"shahdadpur":{"cc":"PK","lat":25.93,"lng":68.62,"pop":113342},"shahdad kot":{"cc":"PK","lat":27.85,"lng":67.91,"pop":120687},"shabqadar":{"cc":"PK","lat":34.22,"lng":71.55,"pop":102340},"sargodha":{"cc":"PK","lat":32.09,"lng":72.67,"pop":975886},"sarai alamgir":{"cc":"PK","lat":32.9,"lng":73.76,"pop":73967},"sangla hill":{"cc":"PK","lat":31.72,"lng":73.38,"pop":103709},"sanghar":{"cc":"PK","lat":26.05,"lng":68.95,"pop":62033},"sambrial":{"cc":"PK","lat":32.48,"lng":74.35,"pop":119571},"sakrand":{"cc":"PK","lat":26.14,"lng":68.27,"pop":72040},"sahiwal":{"cc":"PK","lat":31.97,"lng":72.33,"pop":538344},"saddiqabad":{"cc":"PK","lat":28.31,"lng":70.13,"pop":274210},"rohri":{"cc":"PK","lat":27.69,"lng":68.9,"pop":92135},"renala khurd":{"cc":"PK","lat":30.88,"lng":73.6,"pop":100054},"rawalpindi":{"cc":"PK","lat":33.6,"lng":73.05,"pop":3357612},"ratodero":{"cc":"PK","lat":27.8,"lng":68.29,"pop":81935},"rajanpur":{"cc":"PK","lat":29.1,"lng":70.33,"pop":50682},"raja jang":{"cc":"PK","lat":31.22,"lng":74.25,"pop":100000},"rahim yar khan":{"cc":"PK","lat":28.42,"lng":70.3,"pop":517000},"rabwah":{"cc":"PK","lat":31.76,"lng":72.91,"pop":70000},"quetta":{"cc":"PK","lat":30.18,"lng":67.0,"pop":1565546},"qubo saeed khan":{"cc":"PK","lat":27.87,"lng":67.71,"pop":99308},"kambar":{"cc":"PK","lat":27.59,"lng":68.0,"pop":77481},"qadirpur ran":{"cc":"PK","lat":30.29,"lng":71.67,"pop":200000},"qabula":{"cc":"PK","lat":30.18,"lng":73.07,"pop":52495},"pir mahal":{"cc":"PK","lat":30.77,"lng":72.43,"pop":52476},"pindi gheb":{"cc":"PK","lat":33.24,"lng":72.26,"pop":63810},"pindi bhattian":{"cc":"PK","lat":31.9,"lng":73.27,"pop":493222},"phalia":{"cc":"PK","lat":32.43,"lng":73.58,"pop":62453},"peshawar":{"cc":"PK","lat":34.01,"lng":71.58,"pop":4758762},"pattoki":{"cc":"PK","lat":31.02,"lng":73.85,"pop":113735},"pasrur":{"cc":"PK","lat":32.26,"lng":74.66,"pop":102717},"pano aqil":{"cc":"PK","lat":27.86,"lng":69.11,"pop":102701},"pakpattan":{"cc":"PK","lat":30.34,"lng":73.39,"pop":126706},"paharpur":{"cc":"PK","lat":32.11,"lng":70.97,"pop":76027},"pabbi":{"cc":"PK","lat":34.01,"lng":71.79,"pop":52701},"okara":{"cc":"PK","lat":30.81,"lng":73.45,"pop":533693},"new mirpur city":{"cc":"PK","lat":33.15,"lng":73.75,"pop":124352},"nawabshah":{"cc":"PK","lat":26.24,"lng":68.4,"pop":363138},"narowal":{"cc":"PK","lat":32.1,"lng":74.87,"pop":130692},"nankana sahib":{"cc":"PK","lat":31.45,"lng":73.71,"pop":130041},"muzaffargarh":{"cc":"PK","lat":30.07,"lng":71.19,"pop":235541},"muzaffarbd":{"cc":"PK","lat":34.37,"lng":73.47,"pop":725000},"muzaffarabad":{"cc":"PK","lat":34.37,"lng":73.47,"pop":725000},"muridke":{"cc":"PK","lat":31.8,"lng":74.26,"pop":254291},"multan":{"cc":"PK","lat":30.2,"lng":71.48,"pop":2169915},"moro":{"cc":"PK","lat":26.66,"lng":68.0,"pop":142685},"model town":{"cc":"PK","lat":31.48,"lng":74.33,"pop":100000},"mithi":{"cc":"PK","lat":24.74,"lng":69.8,"pop":52376},"mirpur mathelo":{"cc":"PK","lat":28.02,"lng":69.55,"pop":74651},"mirpur khas":{"cc":"PK","lat":25.53,"lng":69.01,"pop":267833},"mingora":{"cc":"PK","lat":34.78,"lng":72.36,"pop":361112},"minchinabad":{"cc":"PK","lat":30.16,"lng":73.57,"pop":67164},"mianwali":{"cc":"PK","lat":32.58,"lng":71.53,"pop":129500},"mian channun":{"cc":"PK","lat":30.44,"lng":72.36,"pop":140112},"matli":{"cc":"PK","lat":25.04,"lng":68.66,"pop":50398},"mardan":{"cc":"PK","lat":34.2,"lng":72.05,"pop":300424},"mansehra":{"cc":"PK","lat":34.33,"lng":73.2,"pop":66486},"manjhand":{"cc":"PK","lat":25.91,"lng":68.24,"pop":140766},"mandi bahauddin":{"cc":"PK","lat":32.59,"lng":73.49,"pop":129733},"malir cantonment":{"cc":"PK","lat":24.94,"lng":67.21,"pop":300000},"mailsi":{"cc":"PK","lat":29.8,"lng":72.17,"pop":125431},"lodhran":{"cc":"PK","lat":29.53,"lng":71.63,"pop":144512},"layyah":{"cc":"PK","lat":30.96,"lng":70.94,"pop":151274},"larkana":{"cc":"PK","lat":27.56,"lng":68.21,"pop":364033},"lalian":{"cc":"PK","lat":31.82,"lng":72.8,"pop":52542},"lala musa":{"cc":"PK","lat":32.7,"lng":73.96,"pop":65197},"lahore":{"cc":"PK","lat":31.56,"lng":74.35,"pop":13004135},"kunri":{"cc":"PK","lat":25.18,"lng":69.57,"pop":237063},"kunjah":{"cc":"PK","lat":32.53,"lng":73.97,"pop":90905},"kotri":{"cc":"PK","lat":25.37,"lng":68.31,"pop":106615},"kot radha kishan":{"cc":"PK","lat":31.17,"lng":74.1,"pop":102057},"kot mumin":{"cc":"PK","lat":32.19,"lng":73.03,"pop":51021},"kot malik barkhurdar":{"cc":"PK","lat":30.2,"lng":66.99,"pop":69359},"kot addu":{"cc":"PK","lat":30.47,"lng":70.97,"pop":104217},"kohat":{"cc":"PK","lat":33.58,"lng":71.45,"pop":151427},"khuzdar":{"cc":"PK","lat":27.81,"lng":66.61,"pop":218112},"khushb":{"cc":"PK","lat":32.3,"lng":72.35,"pop":102793},"khushab":{"cc":"PK","lat":32.3,"lng":72.35,"pop":102793},"khurarianwala":{"cc":"PK","lat":31.5,"lng":73.27,"pop":96743},"khewra":{"cc":"PK","lat":32.65,"lng":73.01,"pop":80000},"kharian":{"cc":"PK","lat":32.82,"lng":73.89,"pop":103036},"khanpur":{"cc":"PK","lat":28.65,"lng":70.66,"pop":142426},"garhi khairo":{"cc":"PK","lat":28.06,"lng":67.98,"pop":193297},"kasur":{"cc":"PK","lat":31.12,"lng":74.45,"pop":510875},"karachi":{"cc":"PK","lat":24.86,"lng":67.01,"pop":11624219},"kandhkot":{"cc":"PK","lat":28.25,"lng":69.18,"pop":99155},"kamoke":{"cc":"PK","lat":31.98,"lng":74.22,"pop":292023},"kamalia":{"cc":"PK","lat":30.73,"lng":72.65,"pop":166617},"kahror pakka":{"cc":"PK","lat":29.62,"lng":71.91,"pop":69743},"kahna nau":{"cc":"PK","lat":31.37,"lng":74.37,"pop":79301},"kabirwala":{"cc":"PK","lat":30.4,"lng":71.86,"pop":91932},"chak jhumra":{"cc":"PK","lat":31.57,"lng":73.18,"pop":385169},"jhelum":{"cc":"PK","lat":32.93,"lng":73.73,"pop":190425},"jhang sadr":{"cc":"PK","lat":31.27,"lng":72.32,"pop":606533},"jauharabad":{"cc":"PK","lat":32.29,"lng":72.28,"pop":113188},"jaranwala":{"cc":"PK","lat":31.33,"lng":73.42,"pop":150380},"jamrud":{"cc":"PK","lat":34.0,"lng":71.38,"pop":56642},"jampur":{"cc":"PK","lat":29.64,"lng":70.6,"pop":155243},"jalalpur pirwala":{"cc":"PK","lat":29.51,"lng":71.22,"pop":500000},"jalalpur jattan":{"cc":"PK","lat":32.64,"lng":74.21,"pop":146743},"jahanian":{"cc":"PK","lat":30.04,"lng":71.82,"pop":50318},"jahangira":{"cc":"PK","lat":33.96,"lng":72.22,"pop":57011},"jacobabad":{"cc":"PK","lat":28.28,"lng":68.44,"pop":219315},"islamabad":{"cc":"PK","lat":33.72,"lng":73.04,"pop":601600},"hujra shah muqim":{"cc":"PK","lat":30.74,"lng":73.82,"pop":76462},"haveli lakha":{"cc":"PK","lat":30.45,"lng":73.69,"pop":122389},"hasilpur":{"cc":"PK","lat":29.69,"lng":72.55,"pop":168146},"harunabad":{"cc":"PK","lat":29.61,"lng":73.14,"pop":149679},"haripur":{"cc":"PK","lat":34.0,"lng":72.93,"pop":56977},"hala":{"cc":"PK","lat":25.81,"lng":68.42,"pop":71094},"hafizabad":{"cc":"PK","lat":32.07,"lng":73.69,"pop":318621},"gwadar":{"cc":"PK","lat":25.12,"lng":62.33,"pop":70852},"gujrat":{"cc":"PK","lat":32.57,"lng":74.08,"pop":574240},"gujranwala":{"cc":"PK","lat":32.16,"lng":74.19,"pop":2511118},"gujar khan":{"cc":"PK","lat":33.25,"lng":73.3,"pop":69374},"gojra":{"cc":"PK","lat":31.15,"lng":72.68,"pop":214000},"gilgit":{"cc":"PK","lat":35.92,"lng":74.31,"pop":216760},"ghotki":{"cc":"PK","lat":28.0,"lng":69.32,"pop":119879},"gambat":{"cc":"PK","lat":27.35,"lng":68.52,"pop":93884},"fort abbas":{"cc":"PK","lat":29.19,"lng":72.86,"pop":83192},"fatehjang":{"cc":"PK","lat":33.56,"lng":72.64,"pop":81321},"faruka":{"cc":"PK","lat":31.89,"lng":72.41,"pop":60000},"faqirwali":{"cc":"PK","lat":29.47,"lng":73.03,"pop":61586},"faisalabad":{"cc":"PK","lat":31.42,"lng":73.09,"pop":3800193},"eminabad":{"cc":"PK","lat":32.04,"lng":74.26,"pop":150646},"dullewala":{"cc":"PK","lat":31.83,"lng":71.44,"pop":54277},"dokri":{"cc":"PK","lat":27.37,"lng":68.1,"pop":125000},"dipalpur":{"cc":"PK","lat":30.67,"lng":73.65,"pop":99858},"dinga":{"cc":"PK","lat":32.64,"lng":73.72,"pop":89922},"dijkot":{"cc":"PK","lat":31.22,"lng":73.0,"pop":96934},"digri":{"cc":"PK","lat":25.16,"lng":69.11,"pop":234578},"dera ismail khan":{"cc":"PK","lat":31.83,"lng":70.9,"pop":763195},"dera ghazi khan":{"cc":"PK","lat":30.05,"lng":70.64,"pop":494464},"daur":{"cc":"PK","lat":26.46,"lng":68.32,"pop":128958},"daska kalan":{"cc":"PK","lat":32.32,"lng":74.35,"pop":126924},"darya khan":{"cc":"PK","lat":31.78,"lng":71.1,"pop":68622},"dajal":{"cc":"PK","lat":29.56,"lng":70.38,"pop":200000},"dadu":{"cc":"PK","lat":26.73,"lng":67.78,"pop":201017},"chunian":{"cc":"PK","lat":30.97,"lng":73.98,"pop":634236},"chuhar kana":{"cc":"PK","lat":31.75,"lng":73.8,"pop":69321},"chitral":{"cc":"PK","lat":35.85,"lng":71.79,"pop":57157},"chishtian":{"cc":"PK","lat":29.8,"lng":72.86,"pop":149939},"chiniot":{"cc":"PK","lat":31.72,"lng":72.98,"pop":318165},"chichawatni":{"cc":"PK","lat":30.53,"lng":72.69,"pop":112191},"charsadda":{"cc":"PK","lat":34.15,"lng":71.74,"pop":120170},"chaman":{"cc":"PK","lat":30.92,"lng":66.45,"pop":130139},"chakwal":{"cc":"PK","lat":32.93,"lng":72.85,"pop":101200},"burewala":{"cc":"PK","lat":30.17,"lng":72.65,"pop":361664},"buni":{"cc":"PK","lat":36.27,"lng":72.26,"pop":50000},"bhawana":{"cc":"PK","lat":31.57,"lng":72.65,"pop":373841},"bhalwal":{"cc":"PK","lat":32.27,"lng":72.9,"pop":74744},"bhakkar":{"cc":"PK","lat":31.63,"lng":71.06,"pop":131658},"phool nagar":{"cc":"PK","lat":31.2,"lng":73.95,"pop":114530},"bat khela":{"cc":"PK","lat":34.62,"lng":71.97,"pop":73525},"battagram":{"cc":"PK","lat":34.68,"lng":73.02,"pop":700000},"basirpur":{"cc":"PK","lat":30.58,"lng":73.84,"pop":65541},"bannu":{"cc":"PK","lat":32.99,"lng":70.6,"pop":1357890},"bahawalpur":{"cc":"PK","lat":29.4,"lng":71.68,"pop":903795},"bahawalnagar":{"cc":"PK","lat":30.0,"lng":73.25,"pop":241873},"badin":{"cc":"PK","lat":24.66,"lng":68.84,"pop":117455},"attock city":{"cc":"PK","lat":33.77,"lng":72.36,"pop":141945},"arifwala":{"cc":"PK","lat":30.29,"lng":73.07,"pop":854462},"ahmadpur east":{"cc":"PK","lat":29.14,"lng":71.26,"pop":196718},"abbottabad":{"cc":"PK","lat":34.15,"lng":73.21,"pop":275890},"dera murad jamali":{"cc":"PK","lat":28.55,"lng":68.22,"pop":106952},"dhirkot":{"cc":"PK","lat":34.04,"lng":73.58,"pop":195000},"nowshera kalan":{"cc":"PK","lat":34.02,"lng":71.97,"pop":88003},"daharki":{"cc":"PK","lat":28.05,"lng":69.7,"pop":90177},"arif wala":{"cc":"PK","lat":26.32,"lng":66.3,"pop":157063},"alahabad":{"cc":"PK","lat":30.88,"lng":74.06,"pop":80084},"wah cantt":{"cc":"PK","lat":33.77,"lng":72.75,"pop":400733},"hub":{"cc":"PK","lat":25.03,"lng":66.89,"pop":195661},"zoliborz":{"cc":"PL","lat":52.27,"lng":20.99,"pop":50934},"oliborz":{"cc":"PL","lat":52.27,"lng":20.99,"pop":50934},"zamo":{"cc":"PL","lat":50.72,"lng":23.25,"pop":66034},"zamosc":{"cc":"PL","lat":50.72,"lng":23.25,"pop":66034},"wola":{"cc":"PL","lat":52.23,"lng":20.96,"pop":140958},"wawer":{"cc":"PL","lat":52.2,"lng":21.18,"pop":77205},"warsaw":{"cc":"PL","lat":52.23,"lng":21.01,"pop":1702139},"tomaszw mazowiecki":{"cc":"PL","lat":51.53,"lng":20.01,"pop":67197},"tomaszow mazowiecki":{"cc":"PL","lat":51.53,"lng":20.01,"pop":67197},"tarnw":{"cc":"PL","lat":50.01,"lng":20.99,"pop":117799},"tarnow":{"cc":"PL","lat":50.01,"lng":20.99,"pop":117799},"tarnobrzeg":{"cc":"PL","lat":50.57,"lng":21.68,"pop":50459},"targwek":{"cc":"PL","lat":52.29,"lng":21.05,"pop":124279},"targowek":{"cc":"PL","lat":52.29,"lng":21.05,"pop":124279},"suwaki":{"cc":"PL","lat":54.11,"lng":22.93,"pop":69222},"suwalki":{"cc":"PL","lat":54.11,"lng":22.93,"pop":69222},"starachowice":{"cc":"PL","lat":51.04,"lng":21.07,"pop":53739},"stalowa wola":{"cc":"PL","lat":50.58,"lng":22.05,"pop":66495},"rdmiecie":{"cc":"PL","lat":52.23,"lng":21.02,"pop":99950},"srodmiescie":{"cc":"PL","lat":52.23,"lng":21.02,"pop":99950},"siedlce":{"cc":"PL","lat":52.17,"lng":22.29,"pop":77185},"rzeszw":{"cc":"PL","lat":50.04,"lng":22.0,"pop":198317},"rzeszow":{"cc":"PL","lat":50.04,"lng":22.0,"pop":198317},"radom":{"cc":"PL","lat":51.4,"lng":21.15,"pop":226794},"przemyl":{"cc":"PL","lat":49.78,"lng":22.77,"pop":67013},"przemysl":{"cc":"PL","lat":49.78,"lng":22.77,"pop":67013},"pruszkw":{"cc":"PL","lat":52.17,"lng":20.81,"pop":55371},"pruszkow":{"cc":"PL","lat":52.17,"lng":20.81,"pop":55371},"ostrowiec swietokrzyski":{"cc":"PL","lat":50.93,"lng":21.39,"pop":73989},"ostrowiec witokrzyski":{"cc":"PL","lat":50.93,"lng":21.39,"pop":73989},"ostroleka":{"cc":"PL","lat":53.09,"lng":21.58,"pop":53740},"ostroka":{"cc":"PL","lat":53.09,"lng":21.58,"pop":53740},"olsztyn":{"cc":"PL","lat":53.78,"lng":20.49,"pop":169793},"ochota":{"cc":"PL","lat":52.22,"lng":20.99,"pop":82774},"nowy sacz":{"cc":"PL","lat":49.62,"lng":20.7,"pop":84376},"nowy scz":{"cc":"PL","lat":49.62,"lng":20.7,"pop":84376},"mokotow":{"cc":"PL","lat":52.19,"lng":21.03,"pop":217683},"mokotw":{"cc":"PL","lat":52.19,"lng":21.03,"pop":217683},"mielec":{"cc":"PL","lat":50.29,"lng":21.42,"pop":59509},"lublin":{"cc":"PL","lat":51.25,"lng":22.57,"pop":336339},"oma":{"cc":"PL","lat":53.18,"lng":22.06,"pop":62019},"lomza":{"cc":"PL","lat":53.18,"lng":22.06,"pop":62019},"legionowo":{"cc":"PL","lat":52.4,"lng":20.93,"pop":50786},"kielce":{"cc":"PL","lat":50.87,"lng":20.63,"pop":192468},"elk":{"cc":"PL","lat":53.83,"lng":22.36,"pop":55769},"ek":{"cc":"PL","lat":53.83,"lng":22.36,"pop":55769},"chem":{"cc":"PL","lat":51.14,"lng":23.47,"pop":60231},"chelm":{"cc":"PL","lat":51.14,"lng":23.47,"pop":60231},"bielany":{"cc":"PL","lat":52.29,"lng":20.94,"pop":131910},"biaystok":{"cc":"PL","lat":53.13,"lng":23.16,"pop":295683},"bialystok":{"cc":"PL","lat":53.13,"lng":23.16,"pop":295683},"bialoleka":{"cc":"PL","lat":52.32,"lng":20.97,"pop":129106},"biaoeka":{"cc":"PL","lat":52.32,"lng":20.97,"pop":129106},"biala podlaska":{"cc":"PL","lat":52.03,"lng":23.12,"pop":57541},"biaa podlaska":{"cc":"PL","lat":52.03,"lng":23.12,"pop":57541},"bemowo":{"cc":"PL","lat":52.25,"lng":20.91,"pop":123932},"ory":{"cc":"PL","lat":50.05,"lng":18.7,"pop":63174},"zory":{"cc":"PL","lat":50.05,"lng":18.7,"pop":63174},"zielona gora":{"cc":"PL","lat":51.94,"lng":15.51,"pop":118433},"zielona gra":{"cc":"PL","lat":51.94,"lng":15.51,"pop":118433},"zgierz":{"cc":"PL","lat":51.86,"lng":19.41,"pop":58036},"zawiercie":{"cc":"PL","lat":50.49,"lng":19.42,"pop":53159},"zabrze":{"cc":"PL","lat":50.32,"lng":18.79,"pop":192177},"wrzeszcz":{"cc":"PL","lat":54.38,"lng":18.61,"pop":65000},"wroclaw":{"cc":"PL","lat":51.1,"lng":17.03,"pop":672545},"wrocaw":{"cc":"PL","lat":51.1,"lng":17.03,"pop":672545},"wocawek":{"cc":"PL","lat":52.65,"lng":19.07,"pop":120339},"wloclawek":{"cc":"PL","lat":52.65,"lng":19.07,"pop":120339},"wabrzych":{"cc":"PL","lat":50.77,"lng":16.28,"pop":127431},"walbrzych":{"cc":"PL","lat":50.77,"lng":16.28,"pop":127431},"tychy":{"cc":"PL","lat":50.14,"lng":18.97,"pop":130000},"toru":{"cc":"PL","lat":53.01,"lng":18.6,"pop":196935},"torun":{"cc":"PL","lat":53.01,"lng":18.6,"pop":196935},"tczew":{"cc":"PL","lat":54.09,"lng":18.78,"pop":60133},"tarnowskie gory":{"cc":"PL","lat":50.45,"lng":18.86,"pop":60938},"tarnowskie gry":{"cc":"PL","lat":50.45,"lng":18.86,"pop":60938},"szczecin":{"cc":"PL","lat":53.43,"lng":14.55,"pop":395513},"swietochlowice":{"cc":"PL","lat":50.3,"lng":18.92,"pop":55600},"witochowice":{"cc":"PL","lat":50.3,"lng":18.92,"pop":55600},"swidnica":{"cc":"PL","lat":50.84,"lng":16.49,"pop":60351},"widnica":{"cc":"PL","lat":50.84,"lng":16.49,"pop":60351},"stargard":{"cc":"PL","lat":53.34,"lng":15.05,"pop":71224},"sosnowiec":{"cc":"PL","lat":50.29,"lng":19.1,"pop":227295},"supsk":{"cc":"PL","lat":54.46,"lng":17.03,"pop":98608},"slupsk":{"cc":"PL","lat":54.46,"lng":17.03,"pop":98608},"siemianowice slaskie":{"cc":"PL","lat":50.33,"lng":19.03,"pop":73121},"siemianowice lskie":{"cc":"PL","lat":50.33,"lng":19.03,"pop":73121},"rybnik":{"cc":"PL","lat":50.1,"lng":18.54,"pop":142510},"ruda slaska":{"cc":"PL","lat":50.26,"lng":18.86,"pop":146189},"ruda lska":{"cc":"PL","lat":50.26,"lng":18.86,"pop":146189},"raciborz":{"cc":"PL","lat":50.09,"lng":18.22,"pop":58464},"racibrz":{"cc":"PL","lat":50.09,"lng":18.22,"pop":58464},"poznan":{"cc":"PL","lat":52.41,"lng":16.93,"pop":536151},"pozna":{"cc":"PL","lat":52.41,"lng":16.93,"pop":536151},"plock":{"cc":"PL","lat":52.55,"lng":19.71,"pop":127474},"pock":{"cc":"PL","lat":52.55,"lng":19.71,"pop":127474},"piotrkw trybunalski":{"cc":"PL","lat":51.41,"lng":19.7,"pop":80128},"piotrkow trybunalski":{"cc":"PL","lat":51.41,"lng":19.7,"pop":80128},"pia":{"cc":"PL","lat":53.15,"lng":16.74,"pop":75532},"pila":{"cc":"PL","lat":53.15,"lng":16.74,"pop":75532},"piekary slaskie":{"cc":"PL","lat":50.38,"lng":18.93,"pop":59757},"piekary lskie":{"cc":"PL","lat":50.38,"lng":18.93,"pop":59757},"pabianice":{"cc":"PL","lat":51.66,"lng":19.35,"pop":70542},"ostrw wielkopolski":{"cc":"PL","lat":51.66,"lng":17.81,"pop":72898},"ostrow wielkopolski":{"cc":"PL","lat":51.66,"lng":17.81,"pop":72898},"opole":{"cc":"PL","lat":50.67,"lng":17.93,"pop":127676},"mysowice":{"cc":"PL","lat":50.21,"lng":19.17,"pop":72124},"myslowice":{"cc":"PL","lat":50.21,"lng":19.17,"pop":72124},"lubin":{"cc":"PL","lat":51.4,"lng":16.2,"pop":77532},"lodz":{"cc":"PL","lat":51.77,"lng":19.47,"pop":639890},"leszno":{"cc":"PL","lat":51.84,"lng":16.57,"pop":63565},"legnica":{"cc":"PL","lat":51.21,"lng":16.16,"pop":106033},"krakow":{"cc":"PL","lat":50.06,"lng":19.94,"pop":816614},"krakw":{"cc":"PL","lat":50.06,"lng":19.94,"pop":816614},"koszalin":{"cc":"PL","lat":54.19,"lng":16.17,"pop":107450},"konin":{"cc":"PL","lat":52.22,"lng":18.25,"pop":81258},"kedzierzyn-kozle":{"cc":"PL","lat":50.35,"lng":18.23,"pop":65636},"kdzierzyn-kole":{"cc":"PL","lat":50.35,"lng":18.23,"pop":65636},"katowice":{"cc":"PL","lat":50.26,"lng":19.02,"pop":286960},"kalisz":{"cc":"PL","lat":51.76,"lng":18.09,"pop":108759},"jelenia gra":{"cc":"PL","lat":50.9,"lng":15.73,"pop":77366},"jelenia gora":{"cc":"PL","lat":50.9,"lng":15.73,"pop":77366},"jaworzno":{"cc":"PL","lat":50.21,"lng":19.27,"pop":96541},"jastrzbie zdrj":{"cc":"PL","lat":49.96,"lng":18.57,"pop":95813},"jastrzebie zdroj":{"cc":"PL","lat":49.96,"lng":18.57,"pop":95813},"inowroclaw":{"cc":"PL","lat":52.8,"lng":18.26,"pop":77597},"inowrocaw":{"cc":"PL","lat":52.8,"lng":18.26,"pop":77597},"grudzidz":{"cc":"PL","lat":53.48,"lng":18.75,"pop":92552},"grudziadz":{"cc":"PL","lat":53.48,"lng":18.75,"pop":92552},"gorzw wielkopolski":{"cc":"PL","lat":52.73,"lng":15.23,"pop":114567},"gorzow wielkopolski":{"cc":"PL","lat":52.73,"lng":15.23,"pop":114567},"gniezno":{"cc":"PL","lat":52.53,"lng":17.58,"pop":70269},"glogow":{"cc":"PL","lat":51.66,"lng":16.08,"pop":65400},"gogw":{"cc":"PL","lat":51.66,"lng":16.08,"pop":65400},"gliwice":{"cc":"PL","lat":50.3,"lng":18.68,"pop":198835},"gdynia":{"cc":"PL","lat":54.52,"lng":18.53,"pop":257000},"gdask":{"cc":"PL","lat":54.35,"lng":18.65,"pop":487371},"gdansk":{"cc":"PL","lat":54.35,"lng":18.65,"pop":487371},"fordon":{"cc":"PL","lat":53.15,"lng":18.17,"pop":70000},"elblg":{"cc":"PL","lat":54.15,"lng":19.41,"pop":127558},"elblag":{"cc":"PL","lat":54.15,"lng":19.41,"pop":127558},"dbrowa grnicza":{"cc":"PL","lat":50.33,"lng":19.2,"pop":116971},"dabrowa gornicza":{"cc":"PL","lat":50.33,"lng":19.2,"pop":116971},"czstochowa":{"cc":"PL","lat":50.8,"lng":19.12,"pop":248125},"czestochowa":{"cc":"PL","lat":50.8,"lng":19.12,"pop":248125},"chorzw":{"cc":"PL","lat":50.31,"lng":18.97,"pop":113430},"chorzow":{"cc":"PL","lat":50.31,"lng":18.97,"pop":113430},"bytom":{"cc":"PL","lat":50.35,"lng":18.93,"pop":189186},"bydgoszcz":{"cc":"PL","lat":53.12,"lng":18.01,"pop":330038},"bielsko-biala":{"cc":"PL","lat":49.82,"lng":19.05,"pop":176515},"bechatw":{"cc":"PL","lat":51.37,"lng":19.36,"pop":62896},"belchatow":{"cc":"PL","lat":51.37,"lng":19.36,"pop":62896},"bedzin":{"cc":"PL","lat":50.33,"lng":19.13,"pop":58236},"bdzin":{"cc":"PL","lat":50.33,"lng":19.13,"pop":58236},"ursynw":{"cc":"PL","lat":52.15,"lng":21.05,"pop":149775},"ursynow":{"cc":"PL","lat":52.15,"lng":21.05,"pop":149775},"praga polnoc":{"cc":"PL","lat":52.25,"lng":21.03,"pop":93192},"praga pnoc":{"cc":"PL","lat":52.25,"lng":21.03,"pop":93192},"praga poludnie":{"cc":"PL","lat":52.24,"lng":21.09,"pop":179836},"praga poudnie":{"cc":"PL","lat":52.24,"lng":21.09,"pop":179836},"psie pole":{"cc":"PL","lat":51.15,"lng":17.04,"pop":95615},"arecibo":{"cc":"PR","lat":18.47,"lng":-66.72,"pop":87754},"bayamon":{"cc":"PR","lat":18.4,"lng":-66.16,"pop":203499},"bayamn":{"cc":"PR","lat":18.4,"lng":-66.16,"pop":203499},"caguas":{"cc":"PR","lat":18.23,"lng":-66.05,"pop":86804},"carolina":{"cc":"PR","lat":18.38,"lng":-65.96,"pop":170404},"guaynabo":{"cc":"PR","lat":18.36,"lng":-66.11,"pop":81360},"mayagueez":{"cc":"PR","lat":18.2,"lng":-67.14,"pop":73077},"mayagez":{"cc":"PR","lat":18.2,"lng":-67.14,"pop":73077},"ponce":{"cc":"PR","lat":18.01,"lng":-66.62,"pop":137491},"trujillo alto":{"cc":"PR","lat":18.35,"lng":-66.01,"pop":75243},"rafah":{"cc":"PS","lat":31.3,"lng":34.24,"pop":126305},"rafa":{"cc":"PS","lat":31.3,"lng":34.24,"pop":126305},"khn ynis":{"cc":"PS","lat":31.34,"lng":34.31,"pop":173183},"khan yunis":{"cc":"PS","lat":31.34,"lng":34.31,"pop":173183},"jably":{"cc":"PS","lat":31.53,"lng":34.48,"pop":168568},"jabalya":{"cc":"PS","lat":31.53,"lng":34.48,"pop":168568},"gaza":{"cc":"PS","lat":31.5,"lng":34.47,"pop":410000},"dayr al bala":{"cc":"PS","lat":31.42,"lng":34.35,"pop":59504},"dayr al balah":{"cc":"PS","lat":31.42,"lng":34.35,"pop":59504},"bayt lahya":{"cc":"PS","lat":31.55,"lng":34.5,"pop":56919},"bayt lhy":{"cc":"PS","lat":31.55,"lng":34.5,"pop":56919},"nablus":{"cc":"PS","lat":32.22,"lng":35.25,"pop":130326},"battir":{"cc":"PS","lat":31.7,"lng":35.12,"pop":56746},"hebron":{"cc":"PS","lat":31.53,"lng":35.09,"pop":160470},"east jerusalem":{"cc":"PS","lat":31.78,"lng":35.23,"pop":428304},"setubal":{"cc":"PT","lat":38.52,"lng":-8.89,"pop":118166},"setbal":{"cc":"PT","lat":38.52,"lng":-8.89,"pop":118166},"rio de mouro":{"cc":"PT","lat":38.77,"lng":-9.33,"pop":54695},"queluz":{"cc":"PT","lat":38.76,"lng":-9.25,"pop":103399},"odivelas":{"cc":"PT","lat":38.79,"lng":-9.18,"pop":54624},"monsanto":{"cc":"PT","lat":39.46,"lng":-8.71,"pop":50000},"loures":{"cc":"PT","lat":38.83,"lng":-9.17,"pop":66231},"lisbon":{"cc":"PT","lat":38.73,"lng":-9.15,"pop":517802},"leiria":{"cc":"PT","lat":39.74,"lng":-8.81,"pop":128640},"funchal":{"cc":"PT","lat":32.67,"lng":-16.93,"pop":105795},"faro":{"cc":"PT","lat":37.02,"lng":-7.93,"pop":70347},"vora":{"cc":"PT","lat":38.57,"lng":-7.9,"pop":53591},"evora":{"cc":"PT","lat":38.57,"lng":-7.9,"pop":53591},"corroios":{"cc":"PT","lat":38.64,"lng":-9.15,"pop":52520},"cacem":{"cc":"PT","lat":38.77,"lng":-9.3,"pop":93982},"cacm":{"cc":"PT","lat":38.77,"lng":-9.3,"pop":93982},"barreiro":{"cc":"PT","lat":38.66,"lng":-9.07,"pop":51280},"amora":{"cc":"PT","lat":38.63,"lng":-9.12,"pop":52577},"amadora":{"cc":"PT","lat":38.75,"lng":-9.23,"pop":178858},"algueirao":{"cc":"PT","lat":38.8,"lng":-9.34,"pop":66250},"algueiro":{"cc":"PT","lat":38.8,"lng":-9.34,"pop":66250},"vila nova de gaia":{"cc":"PT","lat":41.12,"lng":-8.61,"pop":70811},"porto":{"cc":"PT","lat":41.15,"lng":-8.61,"pop":252687},"felgueiras":{"cc":"PT","lat":41.37,"lng":-8.19,"pop":58065},"coimbra":{"cc":"PT","lat":40.21,"lng":-8.42,"pop":140796},"braga":{"cc":"PT","lat":41.55,"lng":-8.42,"pop":193324},"aveiro":{"cc":"PT","lat":40.65,"lng":-8.65,"pop":80880},"villa hayes":{"cc":"PY","lat":-25.09,"lng":-57.53,"pop":57217},"villa elisa":{"cc":"PY","lat":-25.37,"lng":-57.59,"pop":64099},"san lorenzo":{"cc":"PY","lat":-25.34,"lng":-57.51,"pop":227876},"presidente franco":{"cc":"PY","lat":-25.56,"lng":-54.61,"pop":54292},"pedro juan caballero":{"cc":"PY","lat":-22.55,"lng":-55.74,"pop":75109},"nemby":{"cc":"PY","lat":-25.39,"lng":-57.54,"pop":94641},"limpio":{"cc":"PY","lat":-25.17,"lng":-57.49,"pop":96143},"lambar":{"cc":"PY","lat":-25.35,"lng":-57.61,"pop":126377},"lambare":{"cc":"PY","lat":-25.35,"lng":-57.61,"pop":126377},"itaugu":{"cc":"PY","lat":-25.39,"lng":-57.35,"pop":64997},"itaugua":{"cc":"PY","lat":-25.39,"lng":-57.35,"pop":64997},"fernando de la mora":{"cc":"PY","lat":-25.34,"lng":-57.52,"pop":120167},"encarnacin":{"cc":"PY","lat":-27.33,"lng":-55.87,"pop":74983},"encarnacion":{"cc":"PY","lat":-27.33,"lng":-55.87,"pop":74983},"coronel oviedo":{"cc":"PY","lat":-25.45,"lng":-56.44,"pop":51286},"mariano roque alonso":{"cc":"PY","lat":-25.21,"lng":-57.53,"pop":72008},"ciudad del este":{"cc":"PY","lat":-25.5,"lng":-54.65,"pop":301815},"capiat":{"cc":"PY","lat":-25.36,"lng":-57.45,"pop":198553},"capiata":{"cc":"PY","lat":-25.36,"lng":-57.45,"pop":198553},"caaguaz":{"cc":"PY","lat":-25.47,"lng":-56.02,"pop":54808},"caaguazu":{"cc":"PY","lat":-25.47,"lng":-56.02,"pop":54808},"caacupe":{"cc":"PY","lat":-25.39,"lng":-57.14,"pop":56864},"caacup":{"cc":"PY","lat":-25.39,"lng":-57.14,"pop":56864},"asuncion":{"cc":"PY","lat":-25.29,"lng":-57.65,"pop":1482200},"asuncin":{"cc":"PY","lat":-25.29,"lng":-57.65,"pop":1482200},"az zaayin":{"cc":"QA","lat":25.58,"lng":51.48,"pop":54339},"az zayin":{"cc":"QA","lat":25.58,"lng":51.48,"pop":54339},"ar rayyan":{"cc":"QA","lat":25.29,"lng":51.42,"pop":272465},"ar rayyn":{"cc":"QA","lat":25.29,"lng":51.42,"pop":272465},"doha":{"cc":"QA","lat":25.29,"lng":51.53,"pop":344939},"al manrah":{"cc":"QA","lat":25.27,"lng":51.53,"pop":65493},"al mar al atq":{"cc":"QA","lat":25.25,"lng":51.56,"pop":76774},"al matar al atiq":{"cc":"QA","lat":25.25,"lng":51.56,"pop":76774},"lusail":{"cc":"QA","lat":25.42,"lng":51.51,"pop":198600},"saint-pierre":{"cc":"RE","lat":-21.34,"lng":55.48,"pop":84077},"saint-paul":{"cc":"RE","lat":-21.01,"lng":55.27,"pop":105240},"saint-andr":{"cc":"RE","lat":-20.96,"lng":55.65,"pop":57150},"saint-andre":{"cc":"RE","lat":-20.96,"lng":55.65,"pop":57150},"le tampon":{"cc":"RE","lat":-21.28,"lng":55.52,"pop":81943},"zalu":{"cc":"RO","lat":47.2,"lng":23.05,"pop":52359},"zalau":{"cc":"RO","lat":47.2,"lng":23.05,"pop":52359},"vaslui":{"cc":"RO","lat":46.63,"lng":27.73,"pop":63035},"tulcea":{"cc":"RO","lat":45.18,"lng":28.81,"pop":65624},"trgu mure":{"cc":"RO","lat":46.54,"lng":24.56,"pop":212752},"targu mures":{"cc":"RO","lat":46.54,"lng":24.56,"pop":212752},"targu jiu":{"cc":"RO","lat":45.05,"lng":23.28,"pop":73545},"trgu jiu":{"cc":"RO","lat":45.05,"lng":23.28,"pop":73545},"targoviste":{"cc":"RO","lat":44.93,"lng":25.46,"pop":66965},"trgovite":{"cc":"RO","lat":44.93,"lng":25.46,"pop":66965},"timisoara":{"cc":"RO","lat":45.75,"lng":21.23,"pop":250849},"timioara":{"cc":"RO","lat":45.75,"lng":21.23,"pop":250849},"suceava":{"cc":"RO","lat":47.63,"lng":26.25,"pop":84308},"slatina":{"cc":"RO","lat":44.43,"lng":24.37,"pop":63487},"sibiu":{"cc":"RO","lat":45.8,"lng":24.15,"pop":134309},"sfntu gheorghe":{"cc":"RO","lat":45.87,"lng":25.78,"pop":50080},"sfantu gheorghe":{"cc":"RO","lat":45.87,"lng":25.78,"pop":50080},"satu mare":{"cc":"RO","lat":47.8,"lng":22.86,"pop":112490},"roman":{"cc":"RO","lat":46.92,"lng":26.93,"pop":67819},"ramnicu valcea":{"cc":"RO","lat":45.1,"lng":24.37,"pop":93151},"rmnicu vlcea":{"cc":"RO","lat":45.1,"lng":24.37,"pop":93151},"reia":{"cc":"RO","lat":45.3,"lng":21.89,"pop":81228},"resita":{"cc":"RO","lat":45.3,"lng":21.89,"pop":81228},"ploiesti":{"cc":"RO","lat":44.95,"lng":26.02,"pop":180540},"ploieti":{"cc":"RO","lat":44.95,"lng":26.02,"pop":180540},"pitesti":{"cc":"RO","lat":44.85,"lng":24.87,"pop":141275},"piteti":{"cc":"RO","lat":44.85,"lng":24.87,"pop":141275},"piatra neam":{"cc":"RO","lat":46.92,"lng":26.33,"pop":102688},"piatra neamt":{"cc":"RO","lat":46.92,"lng":26.33,"pop":102688},"oradea":{"cc":"RO","lat":47.05,"lng":21.92,"pop":183105},"media":{"cc":"RO","lat":46.17,"lng":24.35,"pop":53040},"medias":{"cc":"RO","lat":46.17,"lng":24.35,"pop":53040},"iasi":{"cc":"RO","lat":47.17,"lng":27.6,"pop":378954},"iai":{"cc":"RO","lat":47.17,"lng":27.6,"pop":378954},"hunedoara":{"cc":"RO","lat":45.75,"lng":22.9,"pop":69136},"giurgiu":{"cc":"RO","lat":43.89,"lng":25.96,"pop":54551},"galati":{"cc":"RO","lat":45.44,"lng":28.05,"pop":217851},"galai":{"cc":"RO","lat":45.44,"lng":28.05,"pop":217851},"focani":{"cc":"RO","lat":45.7,"lng":27.18,"pop":66648},"focsani":{"cc":"RO","lat":45.7,"lng":27.18,"pop":66648},"drobeta-turnu severin":{"cc":"RO","lat":44.63,"lng":22.65,"pop":79865},"deva":{"cc":"RO","lat":45.88,"lng":22.9,"pop":67802},"craiova":{"cc":"RO","lat":44.32,"lng":23.8,"pop":234140},"constana":{"cc":"RO","lat":44.18,"lng":28.63,"pop":317832},"constanta":{"cc":"RO","lat":44.18,"lng":28.63,"pop":317832},"cluj-napoca":{"cc":"RO","lat":46.77,"lng":23.6,"pop":286598},"buzu":{"cc":"RO","lat":45.15,"lng":26.83,"pop":103481},"buzau":{"cc":"RO","lat":45.15,"lng":26.83,"pop":103481},"bucharest":{"cc":"RO","lat":44.43,"lng":26.11,"pop":1877155},"brasov":{"cc":"RO","lat":45.65,"lng":25.61,"pop":253200},"braov":{"cc":"RO","lat":45.65,"lng":25.61,"pop":253200},"brila":{"cc":"RO","lat":45.27,"lng":27.97,"pop":154686},"braila":{"cc":"RO","lat":45.27,"lng":27.97,"pop":154686},"botoani":{"cc":"RO","lat":47.75,"lng":26.67,"pop":90010},"botosani":{"cc":"RO","lat":47.75,"lng":26.67,"pop":90010},"bistrita":{"cc":"RO","lat":47.13,"lng":24.5,"pop":78877},"bistria":{"cc":"RO","lat":47.13,"lng":24.5,"pop":78877},"barlad":{"cc":"RO","lat":46.23,"lng":27.67,"pop":67818},"brlad":{"cc":"RO","lat":46.23,"lng":27.67,"pop":67818},"baia mare":{"cc":"RO","lat":47.66,"lng":23.57,"pop":108759},"bacau":{"cc":"RO","lat":46.57,"lng":26.91,"pop":136087},"bacu":{"cc":"RO","lat":46.57,"lng":26.91,"pop":136087},"arad":{"cc":"RO","lat":46.18,"lng":21.32,"pop":169065},"alba iulia":{"cc":"RO","lat":46.07,"lng":23.58,"pop":64227},"sector 1":{"cc":"RO","lat":44.49,"lng":26.05,"pop":225453},"sector 2":{"cc":"RO","lat":44.45,"lng":26.13,"pop":290507},"sector 3":{"cc":"RO","lat":44.42,"lng":26.17,"pop":385439},"sector 4":{"cc":"RO","lat":44.38,"lng":26.12,"pop":287828},"sector 5":{"cc":"RO","lat":44.39,"lng":26.07,"pop":271575},"sector 6":{"cc":"RO","lat":44.44,"lng":26.02,"pop":367760},"zrenjanin":{"cc":"RS","lat":45.38,"lng":20.38,"pop":79773},"zemun":{"cc":"RS","lat":44.85,"lng":20.4,"pop":155591},"vranje":{"cc":"RS","lat":42.55,"lng":21.9,"pop":56199},"smederevo":{"cc":"RS","lat":44.66,"lng":20.93,"pop":62000},"panevo":{"cc":"RS","lat":44.87,"lng":20.64,"pop":76654},"pancevo":{"cc":"RS","lat":44.87,"lng":20.64,"pop":76654},"novi pazar":{"cc":"RS","lat":43.14,"lng":20.51,"pop":85996},"ni":{"cc":"RS","lat":43.32,"lng":21.9,"pop":250000},"nis":{"cc":"RS","lat":43.32,"lng":21.9,"pop":250000},"leskovac":{"cc":"RS","lat":43.0,"lng":21.95,"pop":94758},"kruevac":{"cc":"RS","lat":43.58,"lng":21.33,"pop":75256},"krusevac":{"cc":"RS","lat":43.58,"lng":21.33,"pop":75256},"kraljevo":{"cc":"RS","lat":43.73,"lng":20.69,"pop":82846},"kragujevac":{"cc":"RS","lat":44.02,"lng":20.92,"pop":147473},"cacak":{"cc":"RS","lat":43.89,"lng":20.35,"pop":117072},"aak":{"cc":"RS","lat":43.89,"lng":20.35,"pop":117072},"belgrade":{"cc":"RS","lat":44.8,"lng":20.47,"pop":1273651},"valjevo":{"cc":"RS","lat":44.28,"lng":19.9,"pop":61035},"uice":{"cc":"RS","lat":43.86,"lng":19.85,"pop":63577},"uzice":{"cc":"RS","lat":43.86,"lng":19.85,"pop":63577},"subotica":{"cc":"RS","lat":46.1,"lng":19.67,"pop":100000},"abac":{"cc":"RS","lat":44.75,"lng":19.69,"pop":55114},"sabac":{"cc":"RS","lat":44.75,"lng":19.69,"pop":55114},"novi sad":{"cc":"RS","lat":45.25,"lng":19.84,"pop":215400},"sosnovka":{"cc":"RU","lat":60.02,"lng":30.35,"pop":66227},"zyuzino":{"cc":"RU","lat":55.66,"lng":37.57,"pop":121000},"zyablikovo":{"cc":"RU","lat":55.62,"lng":37.77,"pop":129000},"zlatoust":{"cc":"RU","lat":55.17,"lng":59.65,"pop":191366},"zhulebino":{"cc":"RU","lat":55.7,"lng":37.85,"pop":150000},"zhukovsky":{"cc":"RU","lat":55.6,"lng":38.12,"pop":97200},"zhigulvsk":{"cc":"RU","lat":53.4,"lng":49.51,"pop":57094},"zhigulevsk":{"cc":"RU","lat":53.4,"lng":49.51,"pop":57094},"zheleznogorsk":{"cc":"RU","lat":52.34,"lng":35.36,"pop":97900},"zheleznodorozhnyy":{"cc":"RU","lat":55.74,"lng":38.02,"pop":141648},"zelenograd":{"cc":"RU","lat":55.98,"lng":37.18,"pop":215727},"zelenodolsk":{"cc":"RU","lat":55.84,"lng":48.52,"pop":99600},"zarechnyy":{"cc":"RU","lat":53.2,"lng":45.19,"pop":63579},"zamoskvorechye":{"cc":"RU","lat":55.73,"lng":37.63,"pop":55000},"yoshkar-ola":{"cc":"RU","lat":56.64,"lng":47.89,"pop":268272},"yeysk":{"cc":"RU","lat":46.69,"lng":38.28,"pop":87814},"yessentuki":{"cc":"RU","lat":44.05,"lng":42.86,"pop":81015},"yelets":{"cc":"RU","lat":52.61,"lng":38.51,"pop":115688},"yelabuga":{"cc":"RU","lat":55.76,"lng":52.04,"pop":72643},"yegoryevsk":{"cc":"RU","lat":55.38,"lng":39.04,"pop":85200},"yasenevo":{"cc":"RU","lat":55.61,"lng":37.52,"pop":180000},"yartsevo":{"cc":"RU","lat":55.06,"lng":32.7,"pop":52706},"yaroslavl":{"cc":"RU","lat":57.63,"lng":39.87,"pop":608722},"vyshniy volochk":{"cc":"RU","lat":57.59,"lng":34.57,"pop":53800},"vyshniy volochek":{"cc":"RU","lat":57.59,"lng":34.57,"pop":53800},"vyksa":{"cc":"RU","lat":55.32,"lng":42.17,"pop":61664},"vykhino-zhulebino":{"cc":"RU","lat":55.7,"lng":37.81,"pop":216000},"vyborg":{"cc":"RU","lat":60.71,"lng":28.75,"pop":78633},"vyazma":{"cc":"RU","lat":55.21,"lng":34.3,"pop":55500},"votkinsk":{"cc":"RU","lat":57.05,"lng":53.99,"pop":98633},"voskresensk":{"cc":"RU","lat":55.31,"lng":38.69,"pop":77086},"voronezh":{"cc":"RU","lat":51.67,"lng":39.19,"pop":1047549},"altufyevskiy":{"cc":"RU","lat":55.88,"lng":37.58,"pop":54000},"volzhsky":{"cc":"RU","lat":48.79,"lng":44.78,"pop":323293},"volzhsk":{"cc":"RU","lat":55.87,"lng":48.36,"pop":58000},"volsk":{"cc":"RU","lat":52.04,"lng":47.38,"pop":70500},"vologda":{"cc":"RU","lat":59.22,"lng":39.88,"pop":312420},"nagornyy":{"cc":"RU","lat":55.65,"lng":37.62,"pop":76000},"volgograd":{"cc":"RU","lat":48.71,"lng":44.5,"pop":1013533},"volgodonsk":{"cc":"RU","lat":47.51,"lng":42.15,"pop":167731},"novovladykino":{"cc":"RU","lat":55.85,"lng":37.58,"pop":50000},"vladimir":{"cc":"RU","lat":56.14,"lng":40.4,"pop":357024},"vladikavkaz":{"cc":"RU","lat":43.04,"lng":44.67,"pop":306258},"vidnoye":{"cc":"RU","lat":55.55,"lng":37.71,"pop":51721},"veshnyaki":{"cc":"RU","lat":55.72,"lng":37.82,"pop":122000},"velikiye luki":{"cc":"RU","lat":56.34,"lng":30.54,"pop":103149},"vatutino":{"cc":"RU","lat":55.88,"lng":37.69,"pop":50000},"vagonoremont":{"cc":"RU","lat":55.9,"lng":37.55,"pop":50000},"uzlovaya":{"cc":"RU","lat":53.98,"lng":38.16,"pop":58458},"uritsk":{"cc":"RU","lat":59.84,"lng":30.18,"pop":55037},"ulyanovsk":{"cc":"RU","lat":54.33,"lng":48.39,"pop":626540},"ukhta":{"cc":"RU","lat":63.57,"lng":53.69,"pop":102187},"ufa":{"cc":"RU","lat":54.74,"lng":55.97,"pop":1120547},"tver":{"cc":"RU","lat":56.86,"lng":35.9,"pop":420065},"tuymazy":{"cc":"RU","lat":54.61,"lng":53.71,"pop":68829},"tula":{"cc":"RU","lat":54.2,"lng":37.62,"pop":482873},"tuapse":{"cc":"RU","lat":44.1,"lng":39.08,"pop":64234},"troparevo":{"cc":"RU","lat":55.66,"lng":37.48,"pop":118000},"troparvo":{"cc":"RU","lat":55.66,"lng":37.48,"pop":118000},"tolyatti":{"cc":"RU","lat":53.53,"lng":49.35,"pop":702879},"timashyovsk":{"cc":"RU","lat":45.62,"lng":38.95,"pop":53940},"tikhvin":{"cc":"RU","lat":59.64,"lng":33.53,"pop":62075},"tikhoretsk":{"cc":"RU","lat":45.85,"lng":40.12,"pop":64387},"tyoply stan":{"cc":"RU","lat":55.62,"lng":37.49,"pop":125000},"tekstilshchiki":{"cc":"RU","lat":55.7,"lng":37.74,"pop":100000},"tambov":{"cc":"RU","lat":52.74,"lng":41.44,"pop":293661},"taganrog":{"cc":"RU","lat":47.24,"lng":38.91,"pop":279056},"taganskiy":{"cc":"RU","lat":55.73,"lng":37.67,"pop":116000},"syzran":{"cc":"RU","lat":53.16,"lng":48.47,"pop":189338},"syktyvkar":{"cc":"RU","lat":61.66,"lng":50.82,"pop":245083},"sviblovo":{"cc":"RU","lat":55.85,"lng":37.63,"pop":60000},"stupino":{"cc":"RU","lat":54.9,"lng":38.07,"pop":60999},"strogino":{"cc":"RU","lat":55.82,"lng":37.41,"pop":152000},"sterlitamak":{"cc":"RU","lat":53.64,"lng":55.95,"pop":267231},"stavropol":{"cc":"RU","lat":45.03,"lng":41.96,"pop":433931},"staryy oskol":{"cc":"RU","lat":51.3,"lng":37.85,"pop":226977},"sosnovyy bor":{"cc":"RU","lat":59.9,"lng":29.09,"pop":68563},"solntsevo":{"cc":"RU","lat":55.64,"lng":37.38,"pop":120000},"solnechnogorsk":{"cc":"RU","lat":56.18,"lng":36.97,"pop":58891},"solikamsk":{"cc":"RU","lat":59.67,"lng":56.74,"pop":100812},"sokolniki":{"cc":"RU","lat":55.8,"lng":37.67,"pop":57000},"sokol":{"cc":"RU","lat":55.8,"lng":37.52,"pop":57000},"sochi":{"cc":"RU","lat":43.6,"lng":39.72,"pop":327608},"smolensk":{"cc":"RU","lat":54.78,"lng":32.05,"pop":330025},"slavyansk-na-kubani":{"cc":"RU","lat":45.25,"lng":38.12,"pop":65196},"sibay":{"cc":"RU","lat":52.72,"lng":58.67,"pop":61590},"shuya":{"cc":"RU","lat":56.85,"lng":41.39,"pop":60705},"mikhaylovsk":{"cc":"RU","lat":45.13,"lng":42.03,"pop":59198},"shchukino":{"cc":"RU","lat":55.8,"lng":37.45,"pop":102000},"shchyolkovo":{"cc":"RU","lat":55.92,"lng":37.97,"pop":113000},"shchekino":{"cc":"RU","lat":54.01,"lng":37.51,"pop":60700},"shchkino":{"cc":"RU","lat":54.01,"lng":37.51,"pop":60700},"shakhty":{"cc":"RU","lat":47.72,"lng":40.22,"pop":221312},"severomorsk":{"cc":"RU","lat":69.07,"lng":33.41,"pop":53921},"severodvinsk":{"cc":"RU","lat":64.56,"lng":39.83,"pop":194292},"severnyy":{"cc":"RU","lat":55.94,"lng":37.55,"pop":200000},"serpukhov":{"cc":"RU","lat":54.92,"lng":37.42,"pop":128158},"sergiyev posad":{"cc":"RU","lat":56.31,"lng":38.14,"pop":109252},"semnovskoye":{"cc":"RU","lat":55.68,"lng":37.55,"pop":50000},"semenovskoye":{"cc":"RU","lat":55.68,"lng":37.55,"pop":50000},"sarov":{"cc":"RU","lat":54.95,"lng":43.32,"pop":88000},"saratov":{"cc":"RU","lat":51.54,"lng":45.99,"pop":844858},"sarapul":{"cc":"RU","lat":56.48,"lng":53.8,"pop":98830},"saransk":{"cc":"RU","lat":54.18,"lng":45.17,"pop":318841},"saint petersburg":{"cc":"RU","lat":59.94,"lng":30.31,"pop":5351935},"salsk":{"cc":"RU","lat":46.47,"lng":41.54,"pop":61000},"salavat":{"cc":"RU","lat":53.38,"lng":55.91,"pop":159893},"rzhev":{"cc":"RU","lat":56.26,"lng":34.33,"pop":62246},"rybinsk":{"cc":"RU","lat":58.05,"lng":38.84,"pop":216724},"rybatskoye":{"cc":"RU","lat":59.84,"lng":30.5,"pop":55076},"ryazan":{"cc":"RU","lat":54.63,"lng":39.7,"pop":538962},"rostov-on-don":{"cc":"RU","lat":47.22,"lng":39.71,"pop":1130305},"rossosh":{"cc":"RU","lat":51.12,"lng":38.51,"pop":64323},"roslavl":{"cc":"RU","lat":53.95,"lng":32.86,"pop":56971},"revda":{"cc":"RU","lat":56.8,"lng":59.94,"pop":61785},"reutov":{"cc":"RU","lat":55.76,"lng":37.86,"pop":78370},"ramenskoye":{"cc":"RU","lat":55.56,"lng":38.24,"pop":96000},"ramenki":{"cc":"RU","lat":55.7,"lng":37.5,"pop":130000},"pyatigorsk":{"cc":"RU","lat":44.05,"lng":43.05,"pop":142865},"pushkino":{"cc":"RU","lat":55.99,"lng":37.83,"pop":102816},"pushkin":{"cc":"RU","lat":59.71,"lng":30.4,"pop":92889},"pskov":{"cc":"RU","lat":57.82,"lng":28.33,"pop":210501},"prokhladnyy":{"cc":"RU","lat":43.76,"lng":44.03,"pop":60800},"kotlovka":{"cc":"RU","lat":55.66,"lng":37.6,"pop":64000},"pokrovskoye-streshnevo":{"cc":"RU","lat":55.81,"lng":37.46,"pop":55000},"pokrovskoye-streshnvo":{"cc":"RU","lat":55.81,"lng":37.46,"pop":55000},"podolsk":{"cc":"RU","lat":55.42,"lng":37.55,"pop":179400},"ryazanskiy":{"cc":"RU","lat":55.73,"lng":37.77,"pop":101000},"petrozavodsk":{"cc":"RU","lat":61.78,"lng":34.35,"pop":279190},"petrodvorets":{"cc":"RU","lat":59.9,"lng":29.8,"pop":61973},"peterhof":{"cc":"RU","lat":59.88,"lng":29.9,"pop":73199},"pervouralsk":{"cc":"RU","lat":56.91,"lng":59.94,"pop":133600},"perm":{"cc":"RU","lat":58.01,"lng":56.25,"pop":982419},"novo-peredelkino":{"cc":"RU","lat":55.65,"lng":37.34,"pop":115536},"penza":{"cc":"RU","lat":53.2,"lng":45.01,"pop":523553},"pavlovskiy posad":{"cc":"RU","lat":55.78,"lng":38.65,"pop":60051},"ozerki":{"cc":"RU","lat":60.04,"lng":30.31,"pop":95000},"otradnyy":{"cc":"RU","lat":53.38,"lng":51.35,"pop":50127},"ostankinskiy":{"cc":"RU","lat":55.83,"lng":37.62,"pop":60000},"orsk":{"cc":"RU","lat":51.23,"lng":58.49,"pop":246836},"orenburg":{"cc":"RU","lat":51.77,"lng":55.1,"pop":564773},"orl":{"cc":"RU","lat":52.97,"lng":36.08,"pop":303696},"orel":{"cc":"RU","lat":52.97,"lng":36.08,"pop":303696},"orekhovo-zuyevo":{"cc":"RU","lat":55.81,"lng":38.99,"pop":120000},"orekhovo-borisovo severnoye":{"cc":"RU","lat":55.62,"lng":37.68,"pop":128000},"sunzha":{"cc":"RU","lat":43.32,"lng":45.05,"pop":71841},"oktyabrsky":{"cc":"RU","lat":54.48,"lng":53.47,"pop":108200},"odintsovo":{"cc":"RU","lat":55.67,"lng":37.28,"pop":137041},"ochakovo-matveyevskoye":{"cc":"RU","lat":55.68,"lng":37.45,"pop":114000},"obninsk":{"cc":"RU","lat":55.11,"lng":36.61,"pop":107392},"novyye kuzminki":{"cc":"RU","lat":55.7,"lng":37.75,"pop":143000},"novyye cheremushki":{"cc":"RU","lat":55.7,"lng":37.58,"pop":101000},"novyye chermushki":{"cc":"RU","lat":55.7,"lng":37.58,"pop":101000},"novotroitsk":{"cc":"RU","lat":51.2,"lng":58.31,"pop":106186},"novoshakhtinsk":{"cc":"RU","lat":47.76,"lng":39.93,"pop":99478},"novorossiysk":{"cc":"RU","lat":44.73,"lng":37.76,"pop":241856},"novomoskovsk":{"cc":"RU","lat":54.01,"lng":38.29,"pop":130982},"novokuzminki":{"cc":"RU","lat":55.72,"lng":37.78,"pop":50000},"novokuybyshevsk":{"cc":"RU","lat":53.1,"lng":49.94,"pop":111800},"novokhovrino":{"cc":"RU","lat":55.87,"lng":37.5,"pop":50000},"novogireyevo":{"cc":"RU","lat":55.75,"lng":37.82,"pop":95000},"novocherkassk":{"cc":"RU","lat":47.42,"lng":40.09,"pop":166974},"novocheboksarsk":{"cc":"RU","lat":56.11,"lng":47.48,"pop":128468},"velikiy novgorod":{"cc":"RU","lat":58.52,"lng":31.27,"pop":222868},"noginsk":{"cc":"RU","lat":55.86,"lng":38.45,"pop":115979},"nizhny tagil":{"cc":"RU","lat":57.92,"lng":59.97,"pop":381116},"nizhniy novgorod":{"cc":"RU","lat":56.33,"lng":44.0,"pop":1259013},"nizhnekamsk":{"cc":"RU","lat":55.64,"lng":51.82,"pop":234297},"nikolskoye":{"cc":"RU","lat":55.68,"lng":37.48,"pop":50000},"nevinnomyssk":{"cc":"RU","lat":44.63,"lng":41.94,"pop":134345},"neftekamsk":{"cc":"RU","lat":56.09,"lng":54.26,"pop":126805},"nazran":{"cc":"RU","lat":43.23,"lng":44.77,"pop":164131},"naro-fominsk":{"cc":"RU","lat":55.39,"lng":36.73,"pop":72632},"nalchik":{"cc":"RU","lat":43.5,"lng":43.62,"pop":239300},"naberezhnyye chelny":{"cc":"RU","lat":55.74,"lng":52.42,"pop":509870},"mytishchi":{"cc":"RU","lat":55.91,"lng":37.73,"pop":160542},"murom":{"cc":"RU","lat":55.57,"lng":42.02,"pop":126931},"murmansk":{"cc":"RU","lat":68.97,"lng":33.1,"pop":295374},"moscow":{"cc":"RU","lat":55.75,"lng":37.62,"pop":10381222},"mineralnye vody":{"cc":"RU","lat":44.21,"lng":43.14,"pop":76280},"mikhaylovka":{"cc":"RU","lat":50.06,"lng":43.23,"pop":58898},"michurinsk":{"cc":"RU","lat":52.91,"lng":40.48,"pop":93499},"meleuz":{"cc":"RU","lat":52.96,"lng":55.93,"pop":65362},"maykop":{"cc":"RU","lat":44.61,"lng":40.1,"pop":141970},"marino":{"cc":"RU","lat":55.65,"lng":37.72,"pop":243000},"yaroslavskiy":{"cc":"RU","lat":55.88,"lng":37.72,"pop":91000},"makhachkala":{"cc":"RU","lat":42.98,"lng":47.5,"pop":596356},"magnitogorsk":{"cc":"RU","lat":53.4,"lng":59.01,"pop":413351},"lyublino":{"cc":"RU","lat":55.68,"lng":37.76,"pop":172000},"lyubertsy":{"cc":"RU","lat":55.68,"lng":37.89,"pop":154650},"lytkarino":{"cc":"RU","lat":55.58,"lng":37.91,"pop":50619},"lysva":{"cc":"RU","lat":58.11,"lng":57.81,"pop":68660},"lobnya":{"cc":"RU","lat":56.03,"lng":37.47,"pop":61772},"liski":{"cc":"RU","lat":50.98,"lng":39.5,"pop":55939},"lipetsk":{"cc":"RU","lat":52.59,"lng":39.55,"pop":509735},"likhobory":{"cc":"RU","lat":55.85,"lng":37.57,"pop":50000},"lianozovo":{"cc":"RU","lat":55.9,"lng":37.59,"pop":86000},"komendantsky aerodrom":{"cc":"RU","lat":60.0,"lng":30.28,"pop":84052},"leninogorsk":{"cc":"RU","lat":54.6,"lng":52.45,"pop":66263},"tsaritsyno":{"cc":"RU","lat":55.63,"lng":37.65,"pop":123000},"lefortovo":{"cc":"RU","lat":55.77,"lng":37.7,"pop":91000},"labinsk":{"cc":"RU","lat":44.64,"lng":40.74,"pop":61945},"kuznetsk":{"cc":"RU","lat":53.12,"lng":46.6,"pop":90480},"kuzminki":{"cc":"RU","lat":55.7,"lng":37.8,"pop":143000},"kursk":{"cc":"RU","lat":51.73,"lng":36.18,"pop":448733},"kupchino":{"cc":"RU","lat":59.86,"lng":30.39,"pop":54198},"kuntsevo":{"cc":"RU","lat":55.74,"lng":37.4,"pop":147497},"kungur":{"cc":"RU","lat":57.41,"lng":56.97,"pop":66389},"kumertau":{"cc":"RU","lat":52.76,"lng":55.79,"pop":65321},"kstovo":{"cc":"RU","lat":56.15,"lng":44.2,"pop":67242},"krymsk":{"cc":"RU","lat":44.93,"lng":37.99,"pop":57555},"kropotkin":{"cc":"RU","lat":45.44,"lng":40.57,"pop":79599},"biryulvo zapadnoye":{"cc":"RU","lat":55.59,"lng":37.65,"pop":89000},"biryulevo zapadnoye":{"cc":"RU","lat":55.59,"lng":37.65,"pop":89000},"krasnokamsk":{"cc":"RU","lat":58.08,"lng":55.76,"pop":52689},"krasnogorsk":{"cc":"RU","lat":55.82,"lng":37.33,"pop":92932},"krasnodar":{"cc":"RU","lat":45.05,"lng":38.98,"pop":899541},"presnenskiy":{"cc":"RU","lat":55.76,"lng":37.56,"pop":122000},"kozhukhovo":{"cc":"RU","lat":55.71,"lng":37.68,"pop":50000},"kozeyevo":{"cc":"RU","lat":55.87,"lng":37.62,"pop":50000},"kovrov":{"cc":"RU","lat":56.36,"lng":41.32,"pop":154224},"kotlas":{"cc":"RU","lat":61.26,"lng":46.65,"pop":59180},"kostroma":{"cc":"RU","lat":57.77,"lng":40.93,"pop":277280},"kolpino":{"cc":"RU","lat":59.75,"lng":30.59,"pop":138979},"kolomna":{"cc":"RU","lat":55.07,"lng":38.78,"pop":147690},"klintsy":{"cc":"RU","lat":52.76,"lng":32.24,"pop":66336},"klin":{"cc":"RU","lat":56.33,"lng":36.73,"pop":80778},"klimovsk":{"cc":"RU","lat":55.36,"lng":37.53,"pop":55206},"kizlyar":{"cc":"RU","lat":43.85,"lng":46.71,"pop":50564},"kislovodsk":{"cc":"RU","lat":43.91,"lng":42.72,"pop":132771},"kirovo-chepetsk":{"cc":"RU","lat":58.55,"lng":50.03,"pop":90252},"kirov":{"cc":"RU","lat":58.6,"lng":49.66,"pop":507155},"kirishi":{"cc":"RU","lat":59.47,"lng":32.04,"pop":56190},"kingisepp":{"cc":"RU","lat":59.38,"lng":28.61,"pop":50566},"kineshma":{"cc":"RU","lat":57.44,"lng":42.13,"pop":92983},"kimry":{"cc":"RU","lat":56.87,"lng":37.36,"pop":52070},"khoroshvo-mnevniki":{"cc":"RU","lat":55.78,"lng":37.47,"pop":159000},"khoroshevo-mnevniki":{"cc":"RU","lat":55.78,"lng":37.47,"pop":159000},"khimki":{"cc":"RU","lat":55.9,"lng":37.43,"pop":239967},"khasavyurt":{"cc":"RU","lat":43.25,"lng":46.59,"pop":126829},"kazan":{"cc":"RU","lat":55.79,"lng":49.12,"pop":1243500},"kaspiysk":{"cc":"RU","lat":42.88,"lng":47.64,"pop":81752},"kamyshin":{"cc":"RU","lat":50.09,"lng":45.41,"pop":128626},"kamensk-shakhtinsky":{"cc":"RU","lat":48.32,"lng":40.26,"pop":75814},"kaluga":{"cc":"RU","lat":54.53,"lng":36.27,"pop":340851},"korolev":{"cc":"RU","lat":55.91,"lng":37.83,"pop":139798},"kaliningrad":{"cc":"RU","lat":54.71,"lng":20.51,"pop":475056},"izmaylovo":{"cc":"RU","lat":55.8,"lng":37.78,"pop":104000},"izhevsk":{"cc":"RU","lat":56.85,"lng":53.2,"pop":648213},"ivanteyevka":{"cc":"RU","lat":55.97,"lng":37.92,"pop":51085},"ivanovskoye":{"cc":"RU","lat":55.77,"lng":37.83,"pop":128000},"ivanovo":{"cc":"RU","lat":57.0,"lng":40.97,"pop":406113},"ishimbay":{"cc":"RU","lat":53.45,"lng":56.04,"pop":70421},"gus-khrustalnyy":{"cc":"RU","lat":55.61,"lng":40.65,"pop":62746},"gukovo":{"cc":"RU","lat":48.05,"lng":39.93,"pop":66079},"gubkin":{"cc":"RU","lat":51.28,"lng":37.54,"pop":87000},"grozny":{"cc":"RU","lat":43.31,"lng":45.69,"pop":297137},"grazhdanka":{"cc":"RU","lat":60.02,"lng":30.42,"pop":71128},"golyanovo":{"cc":"RU","lat":55.82,"lng":37.81,"pop":158000},"glazov":{"cc":"RU","lat":58.14,"lng":52.66,"pop":100676},"georgiyevsk":{"cc":"RU","lat":44.15,"lng":43.47,"pop":72649},"gelendzhik":{"cc":"RU","lat":44.58,"lng":38.07,"pop":50715},"gatchina":{"cc":"RU","lat":59.58,"lng":30.13,"pop":89761},"fryazino":{"cc":"RU","lat":55.96,"lng":38.05,"pop":52255},"fryazevo":{"cc":"RU","lat":55.73,"lng":38.46,"pop":53212},"fili":{"cc":"RU","lat":55.75,"lng":37.49,"pop":80000},"ezhva":{"cc":"RU","lat":61.81,"lng":50.73,"pop":56000},"engels":{"cc":"RU","lat":51.48,"lng":46.11,"pop":196011},"elista":{"cc":"RU","lat":46.31,"lng":44.26,"pop":106971},"elektrostal":{"cc":"RU","lat":55.79,"lng":38.46,"pop":144387},"dzerzhinsk":{"cc":"RU","lat":56.24,"lng":43.46,"pop":233126},"dubna":{"cc":"RU","lat":56.74,"lng":37.19,"pop":60604},"dorogomilovo":{"cc":"RU","lat":55.74,"lng":37.55,"pop":68000},"domodedovo":{"cc":"RU","lat":55.44,"lng":37.75,"pop":53887},"dolgoprudnyy":{"cc":"RU","lat":55.95,"lng":37.5,"pop":68259},"dmitrov":{"cc":"RU","lat":56.34,"lng":37.52,"pop":61607},"dimitrovgrad":{"cc":"RU","lat":54.21,"lng":49.62,"pop":132226},"derbent":{"cc":"RU","lat":42.07,"lng":48.29,"pop":105965},"dachnoye":{"cc":"RU","lat":59.84,"lng":30.26,"pop":72822},"chusovoy":{"cc":"RU","lat":58.29,"lng":57.81,"pop":50205},"chistopol":{"cc":"RU","lat":55.37,"lng":50.64,"pop":62200},"cherkessk":{"cc":"RU","lat":44.22,"lng":42.05,"pop":122395},"cherepovets":{"cc":"RU","lat":59.13,"lng":37.9,"pop":315738},"chermushki":{"cc":"RU","lat":55.66,"lng":37.56,"pop":106587},"cheremushki":{"cc":"RU","lat":55.66,"lng":37.56,"pop":106587},"chekhov":{"cc":"RU","lat":55.15,"lng":37.46,"pop":75643},"cheboksary":{"cc":"RU","lat":56.13,"lng":47.25,"pop":492331},"chaykovskiy":{"cc":"RU","lat":56.76,"lng":54.11,"pop":86712},"chapayevsk":{"cc":"RU","lat":52.98,"lng":49.71,"pop":70147},"buzuluk":{"cc":"RU","lat":52.78,"lng":52.26,"pop":87714},"buynaksk":{"cc":"RU","lat":42.82,"lng":47.13,"pop":62689},"buguruslan":{"cc":"RU","lat":53.66,"lng":52.44,"pop":53511},"bugulma":{"cc":"RU","lat":54.54,"lng":52.8,"pop":91900},"budyonnovsk":{"cc":"RU","lat":44.78,"lng":44.17,"pop":67962},"bryansk":{"cc":"RU","lat":53.27,"lng":34.32,"pop":427236},"brateyevo":{"cc":"RU","lat":55.64,"lng":37.76,"pop":102000},"borovichi":{"cc":"RU","lat":58.39,"lng":33.92,"pop":56571},"borisoglebsk":{"cc":"RU","lat":51.37,"lng":42.1,"pop":68597},"bor":{"cc":"RU","lat":56.36,"lng":44.07,"pop":60647},"bogorodskoye":{"cc":"RU","lat":55.81,"lng":37.72,"pop":103000},"biryulevo":{"cc":"RU","lat":55.59,"lng":37.68,"pop":144000},"biryulvo":{"cc":"RU","lat":55.59,"lng":37.68,"pop":144000},"bibirevo":{"cc":"RU","lat":55.88,"lng":37.6,"pop":159000},"berezniki":{"cc":"RU","lat":59.41,"lng":56.82,"pop":167748},"beloretsk":{"cc":"RU","lat":53.96,"lng":58.4,"pop":70468},"belorechensk":{"cc":"RU","lat":44.77,"lng":39.87,"pop":54526},"belgorod":{"cc":"RU","lat":50.6,"lng":36.58,"pop":345289},"belebey":{"cc":"RU","lat":54.11,"lng":54.12,"pop":62582},"bataysk":{"cc":"RU","lat":47.14,"lng":39.76,"pop":109962},"balashov":{"cc":"RU","lat":51.55,"lng":43.17,"pop":98107},"balashikha":{"cc":"RU","lat":55.79,"lng":37.95,"pop":150103},"balakovo":{"cc":"RU","lat":52.03,"lng":47.8,"pop":199572},"novaya balakhna":{"cc":"RU","lat":56.49,"lng":43.6,"pop":63083},"babushkin":{"cc":"RU","lat":55.87,"lng":37.73,"pop":86000},"azov":{"cc":"RU","lat":47.11,"lng":39.41,"pop":82133},"astrakhan":{"cc":"RU","lat":46.35,"lng":48.04,"pop":533925},"arzamas":{"cc":"RU","lat":55.4,"lng":43.84,"pop":109479},"armavir":{"cc":"RU","lat":45.0,"lng":41.11,"pop":199548},"arkhangelsk":{"cc":"RU","lat":64.55,"lng":40.55,"pop":349742},"apatity":{"cc":"RU","lat":67.58,"lng":33.41,"pop":61186},"anapa":{"cc":"RU","lat":44.89,"lng":37.32,"pop":53600},"almetyevsk":{"cc":"RU","lat":54.9,"lng":52.32,"pop":140437},"aleksin":{"cc":"RU","lat":54.5,"lng":37.07,"pop":66885},"alekseyevka":{"cc":"RU","lat":55.63,"lng":37.8,"pop":78000},"aleksandrov":{"cc":"RU","lat":56.4,"lng":38.71,"pop":64088},"levoberezhnyy":{"cc":"RU","lat":55.86,"lng":37.47,"pop":52000},"adler":{"cc":"RU","lat":43.43,"lng":39.92,"pop":70200},"pavlovo":{"cc":"RU","lat":55.97,"lng":43.09,"pop":63338},"zarinsk":{"cc":"RU","lat":53.71,"lng":84.94,"pop":52209},"yurga":{"cc":"RU","lat":55.72,"lng":84.89,"pop":84220},"yekaterinburg":{"cc":"RU","lat":56.86,"lng":60.62,"pop":1495066},"vorkuta":{"cc":"RU","lat":67.51,"lng":64.07,"pop":80039},"verkhnyaya pyshma":{"cc":"RU","lat":56.97,"lng":60.58,"pop":59061},"zelenogorsk":{"cc":"RU","lat":56.11,"lng":94.59,"pop":71354},"tyumen":{"cc":"RU","lat":57.15,"lng":65.53,"pop":768358},"troitsk":{"cc":"RU","lat":54.09,"lng":61.57,"pop":82338},"tomsk":{"cc":"RU","lat":56.5,"lng":84.98,"pop":574002},"tobolsk":{"cc":"RU","lat":58.2,"lng":68.25,"pop":113800},"talnakh":{"cc":"RU","lat":69.49,"lng":88.4,"pop":59051},"surgut":{"cc":"RU","lat":61.26,"lng":73.42,"pop":300367},"shadrinsk":{"cc":"RU","lat":56.09,"lng":63.64,"pop":79479},"serov":{"cc":"RU","lat":59.6,"lng":60.59,"pop":98438},"rubtsovsk":{"cc":"RU","lat":51.51,"lng":81.21,"pop":161065},"prokopyevsk":{"cc":"RU","lat":53.92,"lng":86.72,"pop":219000},"polevskoy":{"cc":"RU","lat":56.44,"lng":60.19,"pop":65770},"omsk":{"cc":"RU","lat":54.99,"lng":73.37,"pop":1172070},"nyagan":{"cc":"RU","lat":62.14,"lng":65.39,"pop":52137},"noyabrsk":{"cc":"RU","lat":63.19,"lng":75.44,"pop":110000},"novyy urengoy":{"cc":"RU","lat":66.08,"lng":76.63,"pop":94212},"novosibirsk":{"cc":"RU","lat":55.02,"lng":82.93,"pop":1612833},"novokuznetsk":{"cc":"RU","lat":53.76,"lng":87.14,"pop":539616},"novoaltaysk":{"cc":"RU","lat":53.41,"lng":83.94,"pop":61050},"norilsk":{"cc":"RU","lat":69.35,"lng":88.2,"pop":140800},"nizhnevartovsk":{"cc":"RU","lat":60.93,"lng":76.55,"pop":244937},"nefteyugansk":{"cc":"RU","lat":61.1,"lng":72.6,"pop":112632},"nazarovo":{"cc":"RU","lat":56.01,"lng":90.42,"pop":55252},"minusinsk":{"cc":"RU","lat":53.7,"lng":91.71,"pop":72781},"miass":{"cc":"RU","lat":55.05,"lng":60.11,"pop":167500},"mezhdurechensk":{"cc":"RU","lat":53.69,"lng":88.06,"pop":101026},"lesosibirsk":{"cc":"RU","lat":58.24,"lng":92.48,"pop":65945},"leninsk-kuznetsky":{"cc":"RU","lat":54.66,"lng":86.17,"pop":109023},"kyzyl":{"cc":"RU","lat":51.71,"lng":94.44,"pop":116983},"kurgan":{"cc":"RU","lat":55.45,"lng":65.34,"pop":309285},"krasnoyarsk":{"cc":"RU","lat":56.04,"lng":92.93,"pop":1090811},"krasnoturinsk":{"cc":"RU","lat":59.77,"lng":60.21,"pop":62600},"kopeysk":{"cc":"RU","lat":55.12,"lng":61.62,"pop":70780},"kiselvsk":{"cc":"RU","lat":53.99,"lng":86.66,"pop":104000},"kiselevsk":{"cc":"RU","lat":53.99,"lng":86.66,"pop":104000},"khanty-mansiysk":{"cc":"RU","lat":61.0,"lng":69.03,"pop":101466},"kemerovo":{"cc":"RU","lat":55.35,"lng":86.1,"pop":558973},"kansk":{"cc":"RU","lat":56.2,"lng":95.72,"pop":101502},"kamensk-uralskiy":{"cc":"RU","lat":56.41,"lng":61.93,"pop":182500},"iskitim":{"cc":"RU","lat":54.64,"lng":83.3,"pop":61827},"ishim":{"cc":"RU","lat":56.11,"lng":69.49,"pop":67762},"gorno-altaysk":{"cc":"RU","lat":51.96,"lng":85.92,"pop":63214},"chernogorsk":{"cc":"RU","lat":53.83,"lng":91.31,"pop":71582},"chelyabinsk":{"cc":"RU","lat":55.16,"lng":61.43,"pop":1202371},"biysk":{"cc":"RU","lat":52.53,"lng":85.2,"pop":215430},"berezovskiy":{"cc":"RU","lat":55.67,"lng":86.27,"pop":55000},"berzovskiy":{"cc":"RU","lat":55.67,"lng":86.27,"pop":55000},"berdsk":{"cc":"RU","lat":54.75,"lng":83.1,"pop":90250},"belovo":{"cc":"RU","lat":54.42,"lng":86.3,"pop":75764},"barnaul":{"cc":"RU","lat":53.36,"lng":83.73,"pop":632372},"asbest":{"cc":"RU","lat":57.01,"lng":61.46,"pop":74583},"anzhero-sudzhensk":{"cc":"RU","lat":56.08,"lng":86.02,"pop":82526},"akademgorodok":{"cc":"RU","lat":54.85,"lng":83.11,"pop":50000},"achinsk":{"cc":"RU","lat":56.27,"lng":90.5,"pop":117634},"abakan":{"cc":"RU","lat":53.72,"lng":91.43,"pop":184168},"snezhinsk":{"cc":"RU","lat":56.08,"lng":60.75,"pop":50086},"ozersk":{"cc":"RU","lat":55.76,"lng":60.7,"pop":81023},"novouralsk":{"cc":"RU","lat":57.25,"lng":60.09,"pop":93849},"seversk":{"cc":"RU","lat":56.6,"lng":84.89,"pop":109844},"yakutsk":{"cc":"RU","lat":62.03,"lng":129.72,"pop":235600},"vladivostok":{"cc":"RU","lat":43.11,"lng":131.87,"pop":604901},"ust-ilimsk":{"cc":"RU","lat":58.0,"lng":102.66,"pop":100271},"ussuriysk":{"cc":"RU","lat":43.8,"lng":131.96,"pop":157068},"usolye-sibirskoye":{"cc":"RU","lat":52.75,"lng":103.65,"pop":85900},"ulan-ude":{"cc":"RU","lat":51.83,"lng":107.6,"pop":360278},"tulun":{"cc":"RU","lat":54.57,"lng":100.58,"pop":51330},"svobodnyy":{"cc":"RU","lat":51.37,"lng":128.14,"pop":61017},"neryungri":{"cc":"RU","lat":56.66,"lng":124.72,"pop":66320},"nakhodka":{"cc":"RU","lat":42.84,"lng":132.92,"pop":146920},"krasnokamensk":{"cc":"RU","lat":50.09,"lng":118.03,"pop":54316},"komsomolsk-on-amur":{"cc":"RU","lat":50.55,"lng":137.01,"pop":275908},"khabarovsk":{"cc":"RU","lat":48.46,"lng":135.1,"pop":618150},"irkutsk":{"cc":"RU","lat":52.3,"lng":104.29,"pop":623869},"cheremkhovo":{"cc":"RU","lat":53.15,"lng":103.08,"pop":57395},"blagoveshchensk":{"cc":"RU","lat":50.28,"lng":127.53,"pop":225091},"birobidzhan":{"cc":"RU","lat":48.79,"lng":132.92,"pop":73623},"belogorsk":{"cc":"RU","lat":50.91,"lng":128.51,"pop":67911},"artem":{"cc":"RU","lat":43.36,"lng":132.19,"pop":102300},"artm":{"cc":"RU","lat":43.36,"lng":132.19,"pop":102300},"arsenyev":{"cc":"RU","lat":44.16,"lng":133.27,"pop":58700},"angarsk":{"cc":"RU","lat":52.56,"lng":103.91,"pop":243158},"bratsk":{"cc":"RU","lat":56.13,"lng":101.61,"pop":256600},"yuzhno-sakhalinsk":{"cc":"RU","lat":46.95,"lng":142.74,"pop":198973},"petropavlovsk-kamchatsky":{"cc":"RU","lat":53.06,"lng":158.63,"pop":181216},"magadan":{"cc":"RU","lat":59.56,"lng":150.8,"pop":92782},"chertanovo yuzhnoye":{"cc":"RU","lat":55.59,"lng":37.6,"pop":142000},"orekhovo-borisovo":{"cc":"RU","lat":55.61,"lng":37.73,"pop":144000},"metrogorodok":{"cc":"RU","lat":55.81,"lng":37.79,"pop":50000},"kogalym":{"cc":"RU","lat":62.27,"lng":74.48,"pop":57800},"lesnoy":{"cc":"RU","lat":57.62,"lng":63.08,"pop":55100},"krasnaya glinka":{"cc":"RU","lat":53.74,"lng":52.94,"pop":85566},"kurortnyy":{"cc":"RU","lat":60.17,"lng":29.91,"pop":70589},"chernaya rechka":{"cc":"RU","lat":59.99,"lng":30.3,"pop":56429},"untolovo":{"cc":"RU","lat":60.01,"lng":30.21,"pop":50000},"petrogradka":{"cc":"RU","lat":59.97,"lng":30.31,"pop":130455},"vasylevsky ostrov":{"cc":"RU","lat":59.94,"lng":30.25,"pop":203058},"parnas":{"cc":"RU","lat":60.07,"lng":30.35,"pop":66693},"kalininskiy":{"cc":"RU","lat":60.0,"lng":30.39,"pop":504641},"krasnogvargeisky":{"cc":"RU","lat":59.97,"lng":30.48,"pop":337091},"admiralteisky":{"cc":"RU","lat":59.92,"lng":30.3,"pop":157897},"akademicheskoe":{"cc":"RU","lat":60.01,"lng":30.39,"pop":103304},"finlyandskiy":{"cc":"RU","lat":59.97,"lng":30.36,"pop":72292},"centralniy":{"cc":"RU","lat":59.93,"lng":30.36,"pop":214625},"svetlanovskiy":{"cc":"RU","lat":60.0,"lng":30.33,"pop":85508},"vostochnoe degunino":{"cc":"RU","lat":55.88,"lng":37.56,"pop":95000},"obruchevo":{"cc":"RU","lat":55.66,"lng":37.52,"pop":85616},"kisilevsk":{"cc":"RU","lat":54.0,"lng":86.65,"pop":83431},"gorod solnetchnogorsk":{"cc":"RU","lat":56.19,"lng":36.98,"pop":62000},"musanze":{"cc":"RW","lat":-1.5,"lng":29.63,"pop":153368},"nyagatare":{"cc":"RW","lat":-1.3,"lng":30.32,"pop":100000},"muhanga":{"cc":"RW","lat":-2.02,"lng":29.71,"pop":82797},"kigali":{"cc":"RW","lat":-1.95,"lng":30.06,"pop":1132686},"gitarama":{"cc":"RW","lat":-2.07,"lng":29.76,"pop":87613},"gisenyi":{"cc":"RW","lat":-1.7,"lng":29.26,"pop":172357},"butare":{"cc":"RW","lat":-2.6,"lng":29.74,"pop":62823},"yanbu":{"cc":"SA","lat":24.09,"lng":38.06,"pop":200161},"turayf":{"cc":"SA","lat":31.67,"lng":38.66,"pop":66014},"urayf":{"cc":"SA","lat":31.67,"lng":38.66,"pop":66014},"tarut":{"cc":"SA","lat":26.57,"lng":50.04,"pop":85371},"trt":{"cc":"SA","lat":26.57,"lng":50.04,"pop":85371},"unaizah":{"cc":"SA","lat":26.1,"lng":44.0,"pop":183319},"sultanah":{"cc":"SA","lat":24.49,"lng":39.59,"pop":946697},"sulnah":{"cc":"SA","lat":24.49,"lng":39.59,"pop":946697},"sayhat":{"cc":"SA","lat":26.48,"lng":50.05,"pop":66702},"sayht":{"cc":"SA","lat":26.48,"lng":50.05,"pop":66702},"sakakah":{"cc":"SA","lat":29.97,"lng":40.21,"pop":128332},"sabya":{"cc":"SA","lat":17.15,"lng":42.63,"pop":228375},"aby":{"cc":"SA","lat":17.15,"lng":42.63,"pop":228375},"ras tanura":{"cc":"SA","lat":26.71,"lng":50.07,"pop":62314},"rabigh":{"cc":"SA","lat":22.8,"lng":39.03,"pop":72928},"rbigh":{"cc":"SA","lat":22.8,"lng":39.03,"pop":72928},"qalat bishah":{"cc":"SA","lat":20.0,"lng":42.61,"pop":81828},"qalat bshah":{"cc":"SA","lat":20.0,"lng":42.61,"pop":81828},"najrn":{"cc":"SA","lat":17.49,"lng":44.13,"pop":505652},"najran":{"cc":"SA","lat":17.49,"lng":44.13,"pop":505652},"makkah":{"cc":"SA","lat":21.43,"lng":39.83,"pop":1578722},"king faisal military city":{"cc":"SA","lat":28.45,"lng":45.97,"pop":65000},"khamis mushait":{"cc":"SA","lat":18.3,"lng":42.73,"pop":387553},"jizan":{"cc":"SA","lat":16.89,"lng":42.55,"pop":105198},"jeddah":{"cc":"SA","lat":21.49,"lng":39.19,"pop":4697000},"hail":{"cc":"SA","lat":27.52,"lng":41.69,"pop":605930},"hafar al-batin":{"cc":"SA","lat":28.43,"lng":45.97,"pop":271642},"buraydah":{"cc":"SA","lat":26.33,"lng":43.97,"pop":745353},"baljurashi":{"cc":"SA","lat":19.86,"lng":41.56,"pop":51787},"az zulfi":{"cc":"SA","lat":26.3,"lng":44.82,"pop":125000},"az zulf":{"cc":"SA","lat":26.3,"lng":44.82,"pop":125000},"dhahran":{"cc":"SA","lat":26.29,"lng":50.11,"pop":99540},"taif":{"cc":"SA","lat":21.27,"lng":40.42,"pop":688693},"thuqbah":{"cc":"SA","lat":26.26,"lng":50.2,"pop":248888},"riyadh":{"cc":"SA","lat":24.69,"lng":46.72,"pop":4205961},"ar rass":{"cc":"SA","lat":25.87,"lng":43.5,"pop":81728},"arar":{"cc":"SA","lat":30.98,"lng":41.04,"pop":148540},"al qatif":{"cc":"SA","lat":26.57,"lng":50.01,"pop":98259},"al qaf":{"cc":"SA","lat":26.57,"lng":50.01,"pop":98259},"al mubarraz":{"cc":"SA","lat":25.41,"lng":49.59,"pop":290802},"madinah":{"cc":"SA","lat":24.47,"lng":39.61,"pop":1300000},"al lith":{"cc":"SA","lat":20.15,"lng":40.27,"pop":72000},"al lth":{"cc":"SA","lat":20.15,"lng":40.27,"pop":72000},"khobar":{"cc":"SA","lat":26.28,"lng":50.21,"pop":165799},"al kharj":{"cc":"SA","lat":24.16,"lng":47.33,"pop":425300},"al khafj":{"cc":"SA","lat":28.44,"lng":48.49,"pop":54857},"al khafji":{"cc":"SA","lat":28.44,"lng":48.49,"pop":54857},"al jubayl":{"cc":"SA","lat":27.02,"lng":49.62,"pop":237274},"al huff":{"cc":"SA","lat":25.36,"lng":49.59,"pop":293179},"al hufuf":{"cc":"SA","lat":25.36,"lng":49.59,"pop":293179},"al bahah":{"cc":"SA","lat":20.01,"lng":41.47,"pop":88419},"ad diryah":{"cc":"SA","lat":24.75,"lng":46.54,"pop":61609},"ad diriyah":{"cc":"SA","lat":24.75,"lng":46.54,"pop":61609},"ad dawadimi":{"cc":"SA","lat":24.51,"lng":44.39,"pop":86861},"ad dawdim":{"cc":"SA","lat":24.51,"lng":44.39,"pop":86861},"dammam":{"cc":"SA","lat":26.43,"lng":50.1,"pop":1252523},"ab arsh":{"cc":"SA","lat":16.97,"lng":42.83,"pop":69632},"abu arish":{"cc":"SA","lat":16.97,"lng":42.83,"pop":69632},"abha":{"cc":"SA","lat":18.22,"lng":42.51,"pop":210886},"ash shaf":{"cc":"SA","lat":21.07,"lng":40.32,"pop":72190},"ash shafa":{"cc":"SA","lat":21.07,"lng":40.32,"pop":72190},"sabt alalayah":{"cc":"SA","lat":19.58,"lng":41.96,"pop":100000},"bariq":{"cc":"SA","lat":18.93,"lng":41.93,"pop":75351},"honiara":{"cc":"SB","lat":-9.43,"lng":159.95,"pop":56298},"dongola":{"cc":"SD","lat":19.18,"lng":30.48,"pop":56167},"wad medani":{"cc":"SD","lat":14.4,"lng":33.52,"pop":332714},"umm ruwaba":{"cc":"SD","lat":12.91,"lng":31.22,"pop":56833},"omdurman":{"cc":"SD","lat":15.64,"lng":32.48,"pop":1849659},"singa":{"cc":"SD","lat":13.15,"lng":33.93,"pop":250000},"shendi":{"cc":"SD","lat":16.69,"lng":33.43,"pop":63746},"sennar":{"cc":"SD","lat":13.57,"lng":33.57,"pop":130122},"rabak":{"cc":"SD","lat":13.18,"lng":32.74,"pop":135281},"nyala":{"cc":"SD","lat":12.05,"lng":24.88,"pop":565734},"mellit":{"cc":"SD","lat":14.13,"lng":25.55,"pop":50165},"kosti":{"cc":"SD","lat":13.16,"lng":32.66,"pop":345068},"kassala":{"cc":"SD","lat":15.45,"lng":36.4,"pop":401477},"kas":{"cc":"SD","lat":12.51,"lng":24.29,"pop":55255},"kadugli":{"cc":"SD","lat":11.01,"lng":29.72,"pop":87666},"new halfa":{"cc":"SD","lat":15.33,"lng":35.6,"pop":63589},"dilling":{"cc":"SD","lat":12.05,"lng":29.65,"pop":59089},"port sudan":{"cc":"SD","lat":19.62,"lng":37.22,"pop":489725},"buram":{"cc":"SD","lat":10.86,"lng":25.16,"pop":65473},"burm":{"cc":"SD","lat":10.86,"lng":25.16,"pop":65473},"atbara":{"cc":"SD","lat":17.7,"lng":33.99,"pop":112021},"er roseires":{"cc":"SD","lat":11.87,"lng":34.39,"pop":58712},"an nuhud":{"cc":"SD","lat":12.7,"lng":28.43,"pop":108008},"an nuhd":{"cc":"SD","lat":12.7,"lng":28.43,"pop":108008},"el obeid":{"cc":"SD","lat":13.18,"lng":30.22,"pop":393311},"al qadarif":{"cc":"SD","lat":14.03,"lng":35.38,"pop":363945},"al manqil":{"cc":"SD","lat":14.25,"lng":32.99,"pop":128297},"al manaqil":{"cc":"SD","lat":14.25,"lng":32.99,"pop":128297},"khartoum north":{"cc":"SD","lat":15.65,"lng":32.53,"pop":1012211},"khartoum":{"cc":"SD","lat":15.55,"lng":32.53,"pop":1974647},"el geneina fort":{"cc":"SD","lat":13.47,"lng":22.46,"pop":134264},"al-junaynah":{"cc":"SD","lat":13.45,"lng":22.45,"pop":162981},"el fasher":{"cc":"SD","lat":13.63,"lng":25.35,"pop":252609},"ad douiem":{"cc":"SD","lat":14.0,"lng":32.31,"pop":87068},"el daein":{"cc":"SD","lat":11.46,"lng":26.13,"pop":264734},"ad-damir":{"cc":"SD","lat":17.6,"lng":33.97,"pop":103941},"ad-damazin":{"cc":"SD","lat":11.79,"lng":34.36,"pop":186051},"gereida":{"cc":"SD","lat":11.28,"lng":25.14,"pop":120000},"ardamata":{"cc":"SD","lat":13.48,"lng":22.49,"pop":55637},"rdamat":{"cc":"SD","lat":13.48,"lng":22.49,"pop":55637},"umea":{"cc":"SE","lat":63.83,"lng":20.26,"pop":130224},"ume":{"cc":"SE","lat":63.83,"lng":20.26,"pop":130224},"lulea":{"cc":"SE","lat":65.58,"lng":22.15,"pop":77832},"lule":{"cc":"SE","lat":65.58,"lng":22.15,"pop":77832},"vxj":{"cc":"SE","lat":56.88,"lng":14.81,"pop":71282},"vaexjoe":{"cc":"SE","lat":56.88,"lng":14.81,"pop":71282},"vsters":{"cc":"SE","lat":59.62,"lng":16.55,"pop":127799},"vaesteras":{"cc":"SE","lat":59.62,"lng":16.55,"pop":127799},"vasastaden":{"cc":"SE","lat":59.35,"lng":18.03,"pop":58458},"uppsala":{"cc":"SE","lat":59.86,"lng":17.64,"pop":177074},"tby":{"cc":"SE","lat":59.44,"lng":18.07,"pop":58123},"taby":{"cc":"SE","lat":59.44,"lng":18.07,"pop":58123},"sundsvall":{"cc":"SE","lat":62.39,"lng":17.31,"pop":57606},"stockholm":{"cc":"SE","lat":59.33,"lng":18.07,"pop":1515017},"solna":{"cc":"SE","lat":59.36,"lng":18.0,"pop":66909},"sollentuna":{"cc":"SE","lat":59.43,"lng":17.95,"pop":139606},"soedertaelje":{"cc":"SE","lat":59.2,"lng":17.63,"pop":70777},"sdertlje":{"cc":"SE","lat":59.2,"lng":17.63,"pop":70777},"sdermalm":{"cc":"SE","lat":59.31,"lng":18.08,"pop":127323},"soedermalm":{"cc":"SE","lat":59.31,"lng":18.08,"pop":127323},"oerebro":{"cc":"SE","lat":59.27,"lng":15.21,"pop":155989},"rebro":{"cc":"SE","lat":59.27,"lng":15.21,"pop":155989},"norrkping":{"cc":"SE","lat":58.59,"lng":16.18,"pop":93765},"norrkoeping":{"cc":"SE","lat":58.59,"lng":16.18,"pop":93765},"moelndal":{"cc":"SE","lat":57.66,"lng":12.01,"pop":59430},"mlndal":{"cc":"SE","lat":57.66,"lng":12.01,"pop":59430},"malm":{"cc":"SE","lat":55.61,"lng":13.0,"pop":362133},"malmoe":{"cc":"SE","lat":55.61,"lng":13.0,"pop":362133},"lund":{"cc":"SE","lat":55.71,"lng":13.19,"pop":87244},"linkoeping":{"cc":"SE","lat":58.41,"lng":15.62,"pop":166673},"linkping":{"cc":"SE","lat":58.41,"lng":15.62,"pop":166673},"kungsholmen":{"cc":"SE","lat":59.33,"lng":18.04,"pop":69363},"karlstad":{"cc":"SE","lat":59.38,"lng":13.5,"pop":61492},"karlskrona":{"cc":"SE","lat":56.16,"lng":15.59,"pop":66675},"jnkping":{"cc":"SE","lat":57.78,"lng":14.16,"pop":112766},"joenkoeping":{"cc":"SE","lat":57.78,"lng":14.16,"pop":112766},"huddinge":{"cc":"SE","lat":59.24,"lng":17.98,"pop":90182},"helsingborg":{"cc":"SE","lat":56.05,"lng":12.69,"pop":104250},"haninge":{"cc":"SE","lat":59.17,"lng":18.14,"pop":74968},"halmstad":{"cc":"SE","lat":56.67,"lng":12.86,"pop":70480},"gothenburg":{"cc":"SE","lat":57.71,"lng":11.97,"pop":608462},"gvle":{"cc":"SE","lat":60.67,"lng":17.14,"pop":74884},"gaevle":{"cc":"SE","lat":60.67,"lng":17.14,"pop":74884},"eskilstuna":{"cc":"SE","lat":59.37,"lng":16.51,"pop":67359},"bromma":{"cc":"SE","lat":59.34,"lng":17.94,"pop":72000},"boras":{"cc":"SE","lat":57.72,"lng":12.94,"pop":71700},"bors":{"cc":"SE","lat":57.72,"lng":12.94,"pop":71700},"ulu bedok":{"cc":"SG","lat":1.33,"lng":103.93,"pop":276990},"toa payoh new town":{"cc":"SG","lat":1.34,"lng":103.85,"pop":120650},"tampines estate":{"cc":"SG","lat":1.36,"lng":103.94,"pop":265340},"singapore":{"cc":"SG","lat":1.29,"lng":103.85,"pop":5638700},"serangoon":{"cc":"SG","lat":1.36,"lng":103.9,"pop":116900},"sembawang estate":{"cc":"SG","lat":1.45,"lng":103.83,"pop":110090},"punggol":{"cc":"SG","lat":1.41,"lng":103.91,"pop":204150},"matilda estate":{"cc":"SG","lat":1.4,"lng":103.9,"pop":52200},"kampong pasir ris":{"cc":"SG","lat":1.38,"lng":103.93,"pop":144260},"kembangan":{"cc":"SG","lat":1.32,"lng":103.91,"pop":130252},"kallang":{"cc":"SG","lat":1.33,"lng":103.87,"pop":101290},"geylang":{"cc":"SG","lat":1.32,"lng":103.89,"pop":110201},"bukit timah":{"cc":"SG","lat":1.33,"lng":103.79,"pop":85900},"bukit merah estate":{"cc":"SG","lat":1.28,"lng":103.82,"pop":151250},"bishan new town":{"cc":"SG","lat":1.35,"lng":103.85,"pop":87320},"bukit batok new town":{"cc":"SG","lat":1.36,"lng":103.76,"pop":158030},"hougang new town":{"cc":"SG","lat":1.36,"lng":103.89,"pop":227560},"jurong east":{"cc":"SG","lat":1.33,"lng":103.74,"pop":72960},"jurong town":{"cc":"SG","lat":1.33,"lng":103.72,"pop":262730},"jurong west":{"cc":"SG","lat":1.35,"lng":103.72,"pop":253840},"serangoon new town":{"cc":"SG","lat":1.35,"lng":103.87,"pop":116900},"tampines new town":{"cc":"SG","lat":1.35,"lng":103.95,"pop":259900},"yishun new town":{"cc":"SG","lat":1.43,"lng":103.83,"pop":228730},"woodlands":{"cc":"SG","lat":1.44,"lng":103.79,"pop":254440},"ang mo kio new town":{"cc":"SG","lat":1.38,"lng":103.84,"pop":159340},"bukit panjang new town":{"cc":"SG","lat":1.38,"lng":103.76,"pop":138050},"bedok new town":{"cc":"SG","lat":1.33,"lng":103.94,"pop":276990},"clementi housing estate":{"cc":"SG","lat":1.32,"lng":103.76,"pop":92420},"pasir ris new town":{"cc":"SG","lat":1.37,"lng":103.95,"pop":54420},"queenstown estate":{"cc":"SG","lat":1.29,"lng":103.8,"pop":101480},"choa chu kang new town":{"cc":"SG","lat":1.38,"lng":103.75,"pop":187550},"novena":{"cc":"SG","lat":1.32,"lng":103.84,"pop":53160},"sengkang new town":{"cc":"SG","lat":1.39,"lng":103.89,"pop":267600},"maribor":{"cc":"SI","lat":46.56,"lng":15.65,"pop":96209},"ljubljana":{"cc":"SI","lat":46.05,"lng":14.51,"pop":272220},"presov":{"cc":"SK","lat":49.0,"lng":21.24,"pop":82927},"preov":{"cc":"SK","lat":49.0,"lng":21.24,"pop":82927},"koice":{"cc":"SK","lat":48.71,"lng":21.26,"pop":225044},"kosice":{"cc":"SK","lat":48.71,"lng":21.26,"pop":225044},"zilina":{"cc":"SK","lat":49.22,"lng":18.74,"pop":81219},"ilina":{"cc":"SK","lat":49.22,"lng":18.74,"pop":81219},"trnava":{"cc":"SK","lat":48.38,"lng":17.59,"pop":62806},"trenn":{"cc":"SK","lat":48.89,"lng":18.04,"pop":58278},"trencin":{"cc":"SK","lat":48.89,"lng":18.04,"pop":58278},"petralka":{"cc":"SK","lat":48.12,"lng":17.13,"pop":112380},"petrzalka":{"cc":"SK","lat":48.12,"lng":17.13,"pop":112380},"nitra":{"cc":"SK","lat":48.31,"lng":18.08,"pop":86329},"martin":{"cc":"SK","lat":49.07,"lng":18.92,"pop":51139},"bratislava":{"cc":"SK","lat":48.15,"lng":17.11,"pop":423737},"bansk bystrica":{"cc":"SK","lat":48.74,"lng":19.15,"pop":74590},"banska bystrica":{"cc":"SK","lat":48.74,"lng":19.15,"pop":74590},"makeni":{"cc":"SL","lat":8.89,"lng":-12.04,"pop":85116},"koidu":{"cc":"SL","lat":8.64,"lng":-10.97,"pop":128030},"kenema":{"cc":"SL","lat":7.88,"lng":-11.19,"pop":255110},"freetown":{"cc":"SL","lat":8.49,"lng":-13.24,"pop":802639},"bo":{"cc":"SL","lat":7.96,"lng":-11.74,"pop":233684},"ziguinchor":{"cc":"SN","lat":12.57,"lng":-16.27,"pop":214874},"touba":{"cc":"SN","lat":14.86,"lng":-15.88,"pop":1120824},"tivaouane":{"cc":"SN","lat":14.95,"lng":-16.82,"pop":102658},"tibo":{"cc":"SN","lat":14.63,"lng":-16.23,"pop":100289},"tiebo":{"cc":"SN","lat":14.63,"lng":-16.23,"pop":100289},"thies nones":{"cc":"SN","lat":14.78,"lng":-16.97,"pop":252320},"this nones":{"cc":"SN","lat":14.78,"lng":-16.97,"pop":252320},"thies":{"cc":"SN","lat":14.79,"lng":-16.93,"pop":317763},"this":{"cc":"SN","lat":14.79,"lng":-16.93,"pop":317763},"tambacounda":{"cc":"SN","lat":13.77,"lng":-13.67,"pop":149071},"rufisque":{"cc":"SN","lat":14.72,"lng":-17.27,"pop":295459},"richard-toll":{"cc":"SN","lat":16.46,"lng":-15.7,"pop":73147},"pikine":{"cc":"SN","lat":14.76,"lng":-17.39,"pop":1170791},"keur mdoune":{"cc":"SN","lat":14.76,"lng":-15.9,"pop":77255},"keurmedoune":{"cc":"SN","lat":14.76,"lng":-15.9,"pop":77255},"mbour":{"cc":"SN","lat":14.42,"lng":-16.96,"pop":284189},"mbake":{"cc":"SN","lat":14.79,"lng":-15.91,"pop":101451},"mbak":{"cc":"SN","lat":14.79,"lng":-15.91,"pop":101451},"louga":{"cc":"SN","lat":15.62,"lng":-16.22,"pop":113365},"kolda":{"cc":"SN","lat":12.89,"lng":-14.94,"pop":103574},"kaolack":{"cc":"SN","lat":14.15,"lng":-16.07,"pop":298904},"kaffrine":{"cc":"SN","lat":14.11,"lng":-15.55,"pop":57307},"dougnane":{"cc":"SN","lat":14.96,"lng":-16.87,"pop":69556},"diourbel":{"cc":"SN","lat":14.65,"lng":-16.24,"pop":157554},"dakar":{"cc":"SN","lat":14.69,"lng":-17.44,"pop":2646503},"bargny guedj":{"cc":"SN","lat":14.69,"lng":-17.23,"pop":51188},"bargny gudj":{"cc":"SN","lat":14.69,"lng":-17.23,"pop":51188},"bargny":{"cc":"SN","lat":14.7,"lng":-17.23,"pop":69242},"bargny ngoude":{"cc":"SN","lat":14.69,"lng":-17.24,"pop":51188},"guediawaye":{"cc":"SN","lat":14.77,"lng":-17.4,"pop":329659},"gudiawaye":{"cc":"SN","lat":14.77,"lng":-17.4,"pop":329659},"rufisque est":{"cc":"SN","lat":14.72,"lng":-17.27,"pop":221066},"ruqi":{"cc":"SO","lat":9.97,"lng":43.43,"pop":148702},"qoryooley":{"cc":"SO","lat":1.79,"lng":44.53,"pop":51720},"mogadishu":{"cc":"SO","lat":2.04,"lng":45.34,"pop":2587183},"marka":{"cc":"SO","lat":1.72,"lng":44.77,"pop":230100},"kismayo":{"cc":"SO","lat":-0.36,"lng":42.55,"pop":234852},"kaambooni":{"cc":"SO","lat":-1.64,"lng":41.59,"pop":79000},"hargeysa":{"cc":"SO","lat":9.56,"lng":44.06,"pop":477876},"gebiley":{"cc":"SO","lat":9.7,"lng":43.62,"pop":77320},"garoowe":{"cc":"SO","lat":8.4,"lng":48.48,"pop":57300},"gaalkacyo":{"cc":"SO","lat":6.77,"lng":47.43,"pop":61200},"el dibir":{"cc":"SO","lat":11.77,"lng":51.22,"pop":200000},"cabudwaaq":{"cc":"SO","lat":6.25,"lng":46.22,"pop":120000},"burao":{"cc":"SO","lat":9.52,"lng":45.53,"pop":99270},"bosaso":{"cc":"SO","lat":11.28,"lng":49.18,"pop":74287},"borama":{"cc":"SO","lat":9.94,"lng":43.18,"pop":597842},"berbera":{"cc":"SO","lat":10.44,"lng":45.01,"pop":242344},"beledweyne":{"cc":"SO","lat":4.74,"lng":45.2,"pop":55410},"baidoa":{"cc":"SO","lat":3.11,"lng":43.65,"pop":129839},"afgooye":{"cc":"SO","lat":2.14,"lng":45.12,"pop":65461},"balanbale":{"cc":"SO","lat":5.77,"lng":45.76,"pop":68000},"laascaanood":{"cc":"SO","lat":8.48,"lng":47.36,"pop":60100},"beled hawo":{"cc":"SO","lat":3.93,"lng":41.88,"pop":73000},"paramaribo":{"cc":"SR","lat":5.87,"lng":-55.17,"pop":223757},"yei":{"cc":"SS","lat":4.09,"lng":30.68,"pop":260720},"winejok":{"cc":"SS","lat":9.01,"lng":27.57,"pop":300000},"wau":{"cc":"SS","lat":7.7,"lng":27.99,"pop":127384},"malakal":{"cc":"SS","lat":9.53,"lng":31.66,"pop":160765},"kuacjok":{"cc":"SS","lat":8.3,"lng":27.98,"pop":78000},"juba":{"cc":"SS","lat":4.85,"lng":31.58,"pop":450000},"sao tome":{"cc":"ST","lat":0.34,"lng":6.73,"pop":53300},"so tom":{"cc":"ST","lat":0.34,"lng":6.73,"pop":53300},"usulutn":{"cc":"SV","lat":13.34,"lng":-88.44,"pop":51910},"usulutan":{"cc":"SV","lat":13.34,"lng":-88.44,"pop":51910},"soyapango":{"cc":"SV","lat":13.71,"lng":-89.14,"pop":329708},"sonsonate":{"cc":"SV","lat":13.72,"lng":-89.72,"pop":59468},"san salvador":{"cc":"SV","lat":13.69,"lng":-89.19,"pop":525990},"santa tecla":{"cc":"SV","lat":13.68,"lng":-89.28,"pop":124694},"mejicanos":{"cc":"SV","lat":13.72,"lng":-89.19,"pop":160317},"delgado":{"cc":"SV","lat":13.72,"lng":-89.17,"pop":71594},"apopa":{"cc":"SV","lat":13.81,"lng":-89.18,"pop":112158},"ars":{"cc":"SY","lat":34.89,"lng":35.89,"pop":458327},"tartus":{"cc":"SY","lat":34.89,"lng":35.89,"pop":458327},"tadmur":{"cc":"SY","lat":34.56,"lng":38.28,"pop":51015},"as salamiyah":{"cc":"SY","lat":35.01,"lng":37.05,"pop":94887},"as salamyah":{"cc":"SY","lat":35.01,"lng":37.05,"pop":94887},"kabbasin":{"cc":"SY","lat":36.43,"lng":37.57,"pop":51230},"al-yarmk":{"cc":"SY","lat":33.47,"lng":36.3,"pop":99999},"al-yarmuk":{"cc":"SY","lat":33.47,"lng":36.3,"pop":99999},"manbij":{"cc":"SY","lat":36.53,"lng":37.95,"pop":99497},"jaramana":{"cc":"SY","lat":33.49,"lng":36.35,"pop":99999},"jaramn":{"cc":"SY","lat":33.49,"lng":36.35,"pop":99999},"jablah":{"cc":"SY","lat":35.36,"lng":35.93,"pop":65915},"idlib":{"cc":"SY","lat":35.93,"lng":36.63,"pop":128840},"homs":{"cc":"SY","lat":34.72,"lng":36.73,"pop":775404},"hamah":{"cc":"SY","lat":35.13,"lng":36.76,"pop":460602},"amh":{"cc":"SY","lat":35.13,"lng":36.76,"pop":460602},"aleppo":{"cc":"SY","lat":36.2,"lng":37.16,"pop":2098210},"dm":{"cc":"SY","lat":33.57,"lng":36.4,"pop":111864},"duma":{"cc":"SY","lat":33.57,"lng":36.4,"pop":111864},"damascus":{"cc":"SY","lat":33.51,"lng":36.29,"pop":1569394},"deir ez-zor":{"cc":"SY","lat":35.34,"lng":40.14,"pop":271800},"darayya":{"cc":"SY","lat":33.46,"lng":36.23,"pop":71596},"drayy":{"cc":"SY","lat":33.46,"lng":36.23,"pop":71596},"dar":{"cc":"SY","lat":32.62,"lng":36.1,"pop":97969},"dara":{"cc":"SY","lat":32.62,"lng":36.1,"pop":97969},"babila":{"cc":"SY","lat":33.47,"lng":36.33,"pop":50880},"babl":{"cc":"SY","lat":33.47,"lng":36.33,"pop":50880},"izz":{"cc":"SY","lat":36.59,"lng":37.05,"pop":66138},"izaz":{"cc":"SY","lat":36.59,"lng":37.05,"pop":66138},"ayn al arab":{"cc":"SY","lat":36.89,"lng":38.35,"pop":50000},"at tall":{"cc":"SY","lat":33.61,"lng":36.31,"pop":55561},"al-tabqa":{"cc":"SY","lat":35.84,"lng":38.55,"pop":87880},"as-suwayda":{"cc":"SY","lat":32.71,"lng":36.57,"pop":59052},"as safrah":{"cc":"SY","lat":36.08,"lng":37.37,"pop":63708},"as safirah":{"cc":"SY","lat":36.08,"lng":37.37,"pop":63708},"ar rastan":{"cc":"SY","lat":34.93,"lng":36.73,"pop":53152},"ar raqqah":{"cc":"SY","lat":35.95,"lng":39.01,"pop":531952},"al qamishli":{"cc":"SY","lat":37.05,"lng":41.23,"pop":184231},"al qmishl":{"cc":"SY","lat":37.05,"lng":41.23,"pop":184231},"al maydn":{"cc":"SY","lat":35.02,"lng":40.45,"pop":54534},"al mayadin":{"cc":"SY","lat":35.02,"lng":40.45,"pop":54534},"latakia":{"cc":"SY","lat":35.53,"lng":35.79,"pop":709000},"al asakah":{"cc":"SY","lat":36.5,"lng":40.75,"pop":422445},"al hasakah":{"cc":"SY","lat":36.5,"lng":40.75,"pop":422445},"al bab":{"cc":"SY","lat":36.37,"lng":37.52,"pop":130745},"al bb":{"cc":"SY","lat":36.37,"lng":37.52,"pop":130745},"albu kamal":{"cc":"SY","lat":34.45,"lng":40.92,"pop":57572},"lb kaml":{"cc":"SY","lat":34.45,"lng":40.92,"pop":57572},"mbabane":{"cc":"SZ","lat":-26.32,"lng":31.13,"pop":76218},"manzini":{"cc":"SZ","lat":-26.5,"lng":31.38,"pop":110537},"goz beida":{"cc":"TD","lat":12.23,"lng":21.41,"pop":58941},"am timan":{"cc":"TD","lat":11.04,"lng":20.28,"pop":74691},"abch":{"cc":"TD","lat":13.83,"lng":20.83,"pop":139983},"abeche":{"cc":"TD","lat":13.83,"lng":20.83,"pop":139983},"sarh":{"cc":"TD","lat":9.15,"lng":18.38,"pop":138928},"pala":{"cc":"TD","lat":9.36,"lng":14.91,"pop":70677},"ndjamena":{"cc":"TD","lat":12.11,"lng":15.04,"pop":1359526},"moundou":{"cc":"TD","lat":8.57,"lng":16.08,"pop":196124},"mongo":{"cc":"TD","lat":12.19,"lng":18.69,"pop":53768},"mao":{"cc":"TD","lat":14.12,"lng":15.31,"pop":50681},"koumra":{"cc":"TD","lat":8.92,"lng":17.55,"pop":54109},"kelo":{"cc":"TD","lat":9.31,"lng":15.81,"pop":82677},"doba":{"cc":"TD","lat":8.66,"lng":16.85,"pop":70942},"dressia":{"cc":"TD","lat":9.76,"lng":16.27,"pop":50113},"deressia":{"cc":"TD","lat":9.76,"lng":16.27,"pop":50113},"bongor":{"cc":"TD","lat":10.28,"lng":15.37,"pop":63699},"bol":{"cc":"TD","lat":13.47,"lng":14.71,"pop":51389},"tsevie":{"cc":"TG","lat":6.43,"lng":1.21,"pop":55775},"tsvi":{"cc":"TG","lat":6.43,"lng":1.21,"pop":55775},"sokode":{"cc":"TG","lat":8.98,"lng":1.13,"pop":117811},"sokod":{"cc":"TG","lat":8.98,"lng":1.13,"pop":117811},"lome":{"cc":"TG","lat":6.13,"lng":1.22,"pop":2188376},"lom":{"cc":"TG","lat":6.13,"lng":1.22,"pop":2188376},"kpalim":{"cc":"TG","lat":6.9,"lng":0.63,"pop":75084},"kpalime":{"cc":"TG","lat":6.9,"lng":0.63,"pop":75084},"kara":{"cc":"TG","lat":9.55,"lng":1.19,"pop":104207},"dapaong":{"cc":"TG","lat":10.86,"lng":0.21,"pop":58071},"bassar":{"cc":"TG","lat":9.25,"lng":0.78,"pop":61845},"atakpam":{"cc":"TG","lat":7.53,"lng":1.13,"pop":80683},"atakpame":{"cc":"TG","lat":7.53,"lng":1.13,"pop":80683},"ban talat yai":{"cc":"TH","lat":7.88,"lng":98.4,"pop":52192},"trang":{"cc":"TH","lat":7.56,"lng":99.61,"pop":66713},"tha maka":{"cc":"TH","lat":13.9,"lng":99.77,"pop":52907},"surat thani":{"cc":"TH","lat":9.14,"lng":99.33,"pop":132040},"ratchaburi":{"cc":"TH","lat":13.54,"lng":99.82,"pop":92448},"phuket":{"cc":"TH","lat":7.89,"lng":98.4,"pop":79308},"nakhon si thammarat":{"cc":"TH","lat":8.43,"lng":99.97,"pop":102152},"lampang":{"cc":"TH","lat":18.29,"lng":99.49,"pop":156139},"kanchanaburi":{"cc":"TH","lat":14.0,"lng":99.55,"pop":63699},"kamphaeng phet":{"cc":"TH","lat":16.48,"lng":99.52,"pop":58787},"hua hin":{"cc":"TH","lat":12.57,"lng":99.96,"pop":126355},"chumphon":{"cc":"TH","lat":10.5,"lng":99.18,"pop":55835},"chiang rai":{"cc":"TH","lat":19.91,"lng":99.83,"pop":78756},"chiang mai":{"cc":"TH","lat":18.79,"lng":98.98,"pop":127240},"ko samui":{"cc":"TH","lat":9.54,"lng":99.94,"pop":50000},"ban ko sire":{"cc":"TH","lat":7.89,"lng":98.43,"pop":71284},"ban pong":{"cc":"TH","lat":13.82,"lng":99.88,"pop":57559},"ban i chang":{"cc":"TH","lat":13.71,"lng":99.9,"pop":119858},"ban mai":{"cc":"TH","lat":7.2,"lng":100.55,"pop":86899},"yan nawa":{"cc":"TH","lat":13.7,"lng":100.54,"pop":81521},"yala":{"cc":"TH","lat":6.54,"lng":101.28,"pop":93558},"uttaradit":{"cc":"TH","lat":17.63,"lng":100.09,"pop":58313},"udon thani":{"cc":"TH","lat":17.42,"lng":102.79,"pop":130531},"ubon ratchathani":{"cc":"TH","lat":15.24,"lng":104.85,"pop":122533},"thon buri":{"cc":"TH","lat":13.72,"lng":100.49,"pop":119708},"taling chan":{"cc":"TH","lat":13.78,"lng":100.46,"pop":105299},"suphan buri":{"cc":"TH","lat":14.47,"lng":100.12,"pop":53399},"songkhla":{"cc":"TH","lat":7.2,"lng":100.6,"pop":61758},"si racha":{"cc":"TH","lat":13.17,"lng":100.93,"pop":178916},"si maha phot":{"cc":"TH","lat":13.97,"lng":101.51,"pop":100563},"sattahip":{"cc":"TH","lat":12.67,"lng":100.9,"pop":65444},"saraburi":{"cc":"TH","lat":14.53,"lng":100.92,"pop":67763},"samut sakhon":{"cc":"TH","lat":13.55,"lng":100.27,"pop":63498},"samut prakan":{"cc":"TH","lat":13.6,"lng":100.6,"pop":388920},"sakon nakhon":{"cc":"TH","lat":17.16,"lng":104.15,"pop":76237},"rayong":{"cc":"TH","lat":12.68,"lng":101.26,"pop":106737},"rat burana":{"cc":"TH","lat":13.68,"lng":100.51,"pop":86695},"prachantakham":{"cc":"TH","lat":14.06,"lng":101.52,"pop":59696},"pom prap sattru phai":{"cc":"TH","lat":13.76,"lng":100.51,"pop":51006},"phra pradaeng":{"cc":"TH","lat":13.66,"lng":100.53,"pop":196129},"phra phutthabat":{"cc":"TH","lat":14.73,"lng":100.8,"pop":57008},"phra nakhon si ayutthaya":{"cc":"TH","lat":14.35,"lng":100.58,"pop":50830},"phra khanong":{"cc":"TH","lat":13.7,"lng":100.6,"pop":90354},"phitsanulok":{"cc":"TH","lat":16.82,"lng":100.26,"pop":62584},"phetchabun":{"cc":"TH","lat":16.42,"lng":101.16,"pop":50656},"phasi charoen":{"cc":"TH","lat":13.71,"lng":100.44,"pop":122070},"pak kret":{"cc":"TH","lat":13.91,"lng":100.5,"pop":190272},"mueang nonthaburi":{"cc":"TH","lat":13.86,"lng":100.51,"pop":254375},"nong khai":{"cc":"TH","lat":17.88,"lng":102.74,"pop":63609},"nong khaem":{"cc":"TH","lat":13.71,"lng":100.35,"pop":150218},"nong chok":{"cc":"TH","lat":13.86,"lng":100.86,"pop":157138},"nakhon sawan":{"cc":"TH","lat":15.7,"lng":100.14,"pop":82305},"nakhon ratchasima":{"cc":"TH","lat":14.97,"lng":102.1,"pop":126391},"nakhon pathom":{"cc":"TH","lat":13.82,"lng":100.04,"pop":117927},"maha sarakham":{"cc":"TH","lat":16.18,"lng":103.3,"pop":51584},"lop buri":{"cc":"TH","lat":14.8,"lng":100.65,"pop":57761},"bangkok":{"cc":"TH","lat":13.75,"lng":100.5,"pop":5104476},"krathum baen":{"cc":"TH","lat":13.65,"lng":100.26,"pop":72819},"klaeng":{"cc":"TH","lat":12.78,"lng":101.65,"pop":55619},"khon kaen":{"cc":"TH","lat":16.45,"lng":102.83,"pop":114459},"khlong san":{"cc":"TH","lat":13.73,"lng":100.51,"pop":73263},"khlong luang":{"cc":"TH","lat":14.06,"lng":100.65,"pop":118551},"kalasin":{"cc":"TH","lat":16.43,"lng":103.51,"pop":55102},"kabin buri":{"cc":"TH","lat":13.95,"lng":101.72,"pop":140056},"hat yai":{"cc":"TH","lat":7.01,"lng":100.48,"pop":191696},"dusit":{"cc":"TH","lat":13.78,"lng":100.52,"pop":107655},"chon buri":{"cc":"TH","lat":13.36,"lng":100.98,"pop":219164},"chanthaburi":{"cc":"TH","lat":12.61,"lng":102.1,"pop":99819},"chaiyaphum":{"cc":"TH","lat":15.81,"lng":102.03,"pop":58350},"ban tha kham":{"cc":"TH","lat":13.64,"lng":100.44,"pop":61011},"ban samae dam":{"cc":"TH","lat":13.59,"lng":100.39,"pop":125133},"pattaya":{"cc":"TH","lat":12.93,"lng":100.88,"pop":116417},"na di":{"cc":"TH","lat":14.12,"lng":101.78,"pop":57466},"ban lam luk ka":{"cc":"TH","lat":13.98,"lng":100.78,"pop":60700},"ban khlong prawet":{"cc":"TH","lat":13.72,"lng":100.68,"pop":160671},"bang rak":{"cc":"TH","lat":13.73,"lng":100.52,"pop":99273},"bang kruai":{"cc":"TH","lat":13.8,"lng":100.47,"pop":78305},"bangkok yai":{"cc":"TH","lat":13.72,"lng":100.48,"pop":72321},"bangkok noi":{"cc":"TH","lat":13.76,"lng":100.48,"pop":117793},"bang khun thian":{"cc":"TH","lat":13.66,"lng":100.43,"pop":165491},"bang kapi":{"cc":"TH","lat":13.77,"lng":100.65,"pop":147800},"bang phlat":{"cc":"TH","lat":13.79,"lng":100.5,"pop":92325},"bang na":{"cc":"TH","lat":13.67,"lng":100.64,"pop":95912},"din daeng":{"cc":"TH","lat":13.79,"lng":100.57,"pop":130220},"bang sue":{"cc":"TH","lat":13.81,"lng":100.53,"pop":125440},"khlong toei":{"cc":"TH","lat":13.71,"lng":100.58,"pop":109041},"lat krabang":{"cc":"TH","lat":13.72,"lng":100.78,"pop":163175},"bang khae":{"cc":"TH","lat":13.69,"lng":100.41,"pop":193002},"bueng kum":{"cc":"TH","lat":13.79,"lng":100.67,"pop":145830},"chatuchak":{"cc":"TH","lat":13.83,"lng":100.56,"pop":160906},"chom thong":{"cc":"TH","lat":13.68,"lng":100.48,"pop":158005},"huai khwang":{"cc":"TH","lat":13.78,"lng":100.58,"pop":78175},"khan na yao":{"cc":"TH","lat":13.83,"lng":100.68,"pop":88678},"lak si":{"cc":"TH","lat":13.89,"lng":100.58,"pop":109770},"lat phrao":{"cc":"TH","lat":13.8,"lng":100.61,"pop":122182},"pathum wan":{"cc":"TH","lat":13.74,"lng":100.52,"pop":53263},"phaya thai":{"cc":"TH","lat":13.78,"lng":100.54,"pop":70238},"ratchathewi":{"cc":"TH","lat":13.76,"lng":100.53,"pop":73035},"sai mai":{"cc":"TH","lat":13.92,"lng":100.65,"pop":188123},"saphan sung":{"cc":"TH","lat":13.77,"lng":100.68,"pop":89825},"sathon":{"cc":"TH","lat":13.71,"lng":100.53,"pop":84916},"suan luang":{"cc":"TH","lat":13.73,"lng":100.65,"pop":115658},"thawi watthana":{"cc":"TH","lat":13.78,"lng":100.38,"pop":76351},"thung khru":{"cc":"TH","lat":13.63,"lng":100.51,"pop":116473},"wang thonglang":{"cc":"TH","lat":13.79,"lng":100.61,"pop":114768},"watthana":{"cc":"TH","lat":13.73,"lng":100.59,"pop":171150},"ban lak song":{"cc":"TH","lat":13.69,"lng":100.4,"pop":52144},"bang bon":{"cc":"TH","lat":13.66,"lng":100.4,"pop":105161},"phra nakhon":{"cc":"TH","lat":13.77,"lng":100.5,"pop":51231},"sathorn":{"cc":"TH","lat":13.75,"lng":100.52,"pop":79624},"huamak":{"cc":"TH","lat":13.76,"lng":100.65,"pop":67798},"latkrabang":{"cc":"TH","lat":13.73,"lng":100.75,"pop":173987},"khlong sam wa":{"cc":"TH","lat":13.87,"lng":100.74,"pop":169489},"khlong chan":{"cc":"TH","lat":13.78,"lng":100.65,"pop":76934},"bang khae nuea":{"cc":"TH","lat":13.71,"lng":100.39,"pop":59821},"tha raeng":{"cc":"TH","lat":13.87,"lng":100.65,"pop":97658},"anusawari":{"cc":"TH","lat":13.89,"lng":100.61,"pop":94550},"bang sue subdistrict":{"cc":"TH","lat":13.81,"lng":100.53,"pop":79405},"wat tha phra":{"cc":"TH","lat":13.73,"lng":100.48,"pop":53111},"khlong kum":{"cc":"TH","lat":13.79,"lng":100.68,"pop":69071},"istaravshan":{"cc":"TJ","lat":39.91,"lng":69.0,"pop":273500},"bokhtar":{"cc":"TJ","lat":37.84,"lng":68.78,"pop":110800},"klob":{"cc":"TJ","lat":37.91,"lng":69.78,"pop":214700},"kulob":{"cc":"TJ","lat":37.91,"lng":69.78,"pop":214700},"dushanbe":{"cc":"TJ","lat":38.54,"lng":68.78,"pop":679400},"khujand":{"cc":"TJ","lat":40.28,"lng":69.62,"pop":191000},"konibodom":{"cc":"TJ","lat":40.29,"lng":70.43,"pop":211100},"isfara":{"cc":"TJ","lat":40.13,"lng":70.63,"pop":274000},"dili":{"cc":"TL","lat":-8.56,"lng":125.57,"pop":150000},"balkanabat":{"cc":"TM","lat":39.51,"lng":54.37,"pop":87822},"ashgabat":{"cc":"TM","lat":37.95,"lng":58.38,"pop":1030063},"tuerkmenbasy":{"cc":"TM","lat":40.02,"lng":52.96,"pop":91745},"trkmenbay":{"cc":"TM","lat":40.02,"lng":52.96,"pop":91745},"dasoguz":{"cc":"TM","lat":41.84,"lng":59.97,"pop":201142},"daoguz":{"cc":"TM","lat":41.84,"lng":59.97,"pop":201142},"tejen":{"cc":"TM","lat":37.38,"lng":60.51,"pop":67488},"mary":{"cc":"TM","lat":37.59,"lng":61.83,"pop":167027},"tuerkmenabat":{"cc":"TM","lat":39.07,"lng":63.58,"pop":230861},"trkmenabat":{"cc":"TM","lat":39.07,"lng":63.58,"pop":230861},"bayramaly":{"cc":"TM","lat":37.62,"lng":62.17,"pop":70376},"oued lill":{"cc":"TN","lat":36.83,"lng":10.04,"pop":66100},"tunis":{"cc":"TN","lat":36.82,"lng":10.17,"pop":693210},"tataouine":{"cc":"TN","lat":32.93,"lng":10.45,"pop":66924},"sousse":{"cc":"TN","lat":35.83,"lng":10.64,"pop":221715},"sukrah":{"cc":"TN","lat":36.88,"lng":10.25,"pop":159862},"sakiet ez zit":{"cc":"TN","lat":34.8,"lng":10.76,"pop":100000},"sakiet ed daier":{"cc":"TN","lat":34.79,"lng":10.81,"pop":125204},"skanes":{"cc":"TN","lat":35.77,"lng":10.79,"pop":64222},"sfax":{"cc":"TN","lat":34.74,"lng":10.76,"pop":280566},"rades":{"cc":"TN","lat":36.77,"lng":10.27,"pop":72209},"rads":{"cc":"TN","lat":36.77,"lng":10.27,"pop":72209},"klibia":{"cc":"TN","lat":36.85,"lng":11.09,"pop":62993},"kelibia":{"cc":"TN","lat":36.85,"lng":11.09,"pop":62993},"ksar hellal":{"cc":"TN","lat":35.65,"lng":10.89,"pop":55415},"gafsa":{"cc":"TN","lat":34.42,"lng":8.78,"pop":95242},"gabes":{"cc":"TN","lat":33.88,"lng":10.1,"pop":110075},"gabs":{"cc":"TN","lat":33.88,"lng":10.1,"pop":110075},"nabeul":{"cc":"TN","lat":36.46,"lng":10.74,"pop":70437},"msaken":{"cc":"TN","lat":35.73,"lng":10.58,"pop":89745},"menzel bourguiba":{"cc":"TN","lat":37.15,"lng":9.79,"pop":58800},"medenine":{"cc":"TN","lat":33.35,"lng":10.51,"pop":71406},"jendouba":{"cc":"TN","lat":36.5,"lng":8.78,"pop":51408},"zarzis":{"cc":"TN","lat":33.5,"lng":11.11,"pop":79316},"djemmal":{"cc":"TN","lat":35.62,"lng":10.76,"pop":55285},"houmt souk":{"cc":"TN","lat":33.88,"lng":10.86,"pop":89228},"feriana":{"cc":"TN","lat":34.95,"lng":8.57,"pop":75000},"ben gardane":{"cc":"TN","lat":33.14,"lng":11.22,"pop":87404},"ben arous":{"cc":"TN","lat":36.75,"lng":10.22,"pop":88322},"le bardo":{"cc":"TN","lat":36.81,"lng":10.13,"pop":71961},"bizerte":{"cc":"TN","lat":37.27,"lng":9.87,"pop":138430},"bja":{"cc":"TN","lat":36.73,"lng":9.18,"pop":61568},"beja":{"cc":"TN","lat":36.73,"lng":9.18,"pop":61568},"sidi husayn":{"cc":"TN","lat":36.76,"lng":10.12,"pop":130255},"sd usayn":{"cc":"TN","lat":36.76,"lng":10.12,"pop":130255},"aryanah":{"cc":"TN","lat":36.86,"lng":10.19,"pop":114486},"kairouan":{"cc":"TN","lat":35.68,"lng":10.1,"pop":139070},"kasserine":{"cc":"TN","lat":35.17,"lng":8.84,"pop":84365},"kelaa kebira":{"cc":"TN","lat":35.87,"lng":10.54,"pop":63264},"monastir":{"cc":"TN","lat":35.78,"lng":10.83,"pop":93306},"moknine":{"cc":"TN","lat":35.63,"lng":10.9,"pop":62802},"la mohammedia":{"cc":"TN","lat":36.67,"lng":10.16,"pop":66593},"la marsa":{"cc":"TN","lat":36.88,"lng":10.32,"pop":92987},"el mgarsa":{"cc":"TN","lat":33.82,"lng":10.99,"pop":63528},"mahdia":{"cc":"TN","lat":35.5,"lng":11.06,"pop":51803},"le kram":{"cc":"TN","lat":36.84,"lng":10.32,"pop":88302},"el kef":{"cc":"TN","lat":36.17,"lng":8.7,"pop":53596},"hammamet":{"cc":"TN","lat":36.4,"lng":10.62,"pop":106326},"douane":{"cc":"TN","lat":36.45,"lng":10.76,"pop":60192},"rawad":{"cc":"TN","lat":36.89,"lng":10.19,"pop":94961},"el mourouj":{"cc":"TN","lat":36.71,"lng":10.21,"pop":120732},"mnihla":{"cc":"TN","lat":36.85,"lng":10.11,"pop":58641},"douar hicher":{"cc":"TN","lat":36.83,"lng":10.09,"pop":82532},"ettadhamen":{"cc":"TN","lat":36.83,"lng":10.11,"pop":84312},"yksekova":{"cc":"TR","lat":37.57,"lng":44.29,"pop":71729},"yueksekova":{"cc":"TR","lat":37.57,"lng":44.29,"pop":71729},"yozgat":{"cc":"TR","lat":39.82,"lng":34.8,"pop":87881},"viranehir":{"cc":"TR","lat":37.22,"lng":39.76,"pop":154163},"viransehir":{"cc":"TR","lat":37.22,"lng":39.76,"pop":154163},"van":{"cc":"TR","lat":38.49,"lng":43.38,"pop":525016},"uak":{"cc":"TR","lat":38.67,"lng":29.41,"pop":369433},"usak":{"cc":"TR","lat":38.67,"lng":29.41,"pop":369433},"urla":{"cc":"TR","lat":38.32,"lng":26.76,"pop":62989},"anlurfa":{"cc":"TR","lat":37.17,"lng":38.79,"pop":449549},"sanliurfa":{"cc":"TR","lat":37.17,"lng":38.79,"pop":449549},"arsuz":{"cc":"TR","lat":36.41,"lng":35.89,"pop":109550},"turgutlu":{"cc":"TR","lat":38.5,"lng":27.7,"pop":103292},"torbal":{"cc":"TR","lat":38.18,"lng":27.34,"pop":50303},"torbali":{"cc":"TR","lat":38.18,"lng":27.34,"pop":50303},"tavsanli":{"cc":"TR","lat":39.54,"lng":29.5,"pop":52182},"tavanl":{"cc":"TR","lat":39.54,"lng":29.5,"pop":52182},"tatvan":{"cc":"TR","lat":38.49,"lng":42.28,"pop":73222},"tarsus":{"cc":"TR","lat":36.92,"lng":34.89,"pop":350732},"suru":{"cc":"TR","lat":36.98,"lng":38.43,"pop":101178},"suruc":{"cc":"TR","lat":36.98,"lng":38.43,"pop":101178},"sorgun":{"cc":"TR","lat":39.81,"lng":35.19,"pop":62862},"soma":{"cc":"TR","lat":39.19,"lng":27.61,"pop":98714},"soeke":{"cc":"TR","lat":37.75,"lng":27.41,"pop":68230},"ske":{"cc":"TR","lat":37.75,"lng":27.41,"pop":68230},"siverek":{"cc":"TR","lat":37.76,"lng":39.32,"pop":175341},"sivas":{"cc":"TR","lat":39.75,"lng":37.02,"pop":264022},"sirnak":{"cc":"TR","lat":37.51,"lng":42.45,"pop":67662},"rnak":{"cc":"TR","lat":37.51,"lng":42.45,"pop":67662},"silvan":{"cc":"TR","lat":38.14,"lng":41.01,"pop":65956},"silopi":{"cc":"TR","lat":37.24,"lng":42.46,"pop":114645},"silifke":{"cc":"TR","lat":36.38,"lng":33.93,"pop":132665},"siirt":{"cc":"TR","lat":37.93,"lng":41.94,"pop":114034},"seydiehir":{"cc":"TR","lat":37.42,"lng":31.85,"pop":51089},"seydisehir":{"cc":"TR","lat":37.42,"lng":31.85,"pop":51089},"samandag":{"cc":"TR","lat":36.08,"lng":35.98,"pop":123447},"samanda":{"cc":"TR","lat":36.08,"lng":35.98,"pop":123447},"salihli":{"cc":"TR","lat":38.48,"lng":28.15,"pop":119311},"reyhanli":{"cc":"TR","lat":36.27,"lng":36.57,"pop":56995},"reyhanl":{"cc":"TR","lat":36.27,"lng":36.57,"pop":56995},"polatli":{"cc":"TR","lat":39.58,"lng":32.14,"pop":93262},"polatl":{"cc":"TR","lat":39.58,"lng":32.14,"pop":93262},"patnos":{"cc":"TR","lat":39.22,"lng":42.86,"pop":87451},"osmaniye":{"cc":"TR","lat":37.07,"lng":36.25,"pop":202837},"demi":{"cc":"TR","lat":38.23,"lng":27.97,"pop":67153},"oedemis":{"cc":"TR","lat":38.23,"lng":27.97,"pop":67153},"nusaybin":{"cc":"TR","lat":37.07,"lng":41.21,"pop":88977},"nizip":{"cc":"TR","lat":37.01,"lng":37.79,"pop":82308},"nigde":{"cc":"TR","lat":37.97,"lng":34.68,"pop":91039},"nide":{"cc":"TR","lat":37.97,"lng":34.68,"pop":91039},"nevehir":{"cc":"TR","lat":38.62,"lng":34.71,"pop":75527},"nevsehir":{"cc":"TR","lat":38.62,"lng":34.71,"pop":75527},"nazilli":{"cc":"TR","lat":37.92,"lng":28.32,"pop":119370},"mus":{"cc":"TR","lat":38.73,"lng":41.48,"pop":82536},"mu":{"cc":"TR","lat":38.73,"lng":41.48,"pop":82536},"mula":{"cc":"TR","lat":37.22,"lng":28.37,"pop":92328},"mugla":{"cc":"TR","lat":37.22,"lng":28.37,"pop":92328},"midyat":{"cc":"TR","lat":37.42,"lng":41.34,"pop":76268},"mersin":{"cc":"TR","lat":36.81,"lng":34.64,"pop":537842},"menemen":{"cc":"TR","lat":38.61,"lng":27.07,"pop":53489},"mardin":{"cc":"TR","lat":37.31,"lng":40.74,"pop":129864},"manisa":{"cc":"TR","lat":38.61,"lng":27.43,"pop":243971},"manavgat":{"cc":"TR","lat":36.79,"lng":31.44,"pop":99254},"malatya":{"cc":"TR","lat":38.35,"lng":38.32,"pop":750491},"kuetahya":{"cc":"TR","lat":39.42,"lng":29.98,"pop":185008},"ktahya":{"cc":"TR","lat":39.42,"lng":29.98,"pop":185008},"kusadasi":{"cc":"TR","lat":37.86,"lng":27.26,"pop":63177},"kuadas":{"cc":"TR","lat":37.86,"lng":27.26,"pop":63177},"kozan":{"cc":"TR","lat":37.46,"lng":35.82,"pop":88115},"konya":{"cc":"TR","lat":37.87,"lng":32.48,"pop":1433861},"konak":{"cc":"TR","lat":38.4,"lng":27.1,"pop":332277},"kzltepe":{"cc":"TR","lat":37.19,"lng":40.58,"pop":150174},"kiziltepe":{"cc":"TR","lat":37.19,"lng":40.58,"pop":150174},"kirsehir":{"cc":"TR","lat":39.15,"lng":34.16,"pop":150700},"krehir":{"cc":"TR","lat":39.15,"lng":34.16,"pop":150700},"kirikkale":{"cc":"TR","lat":39.85,"lng":33.51,"pop":186960},"krkkale":{"cc":"TR","lat":39.85,"lng":33.51,"pop":186960},"krkhan":{"cc":"TR","lat":36.5,"lng":36.36,"pop":60916},"kirikhan":{"cc":"TR","lat":36.5,"lng":36.36,"pop":60916},"kilis":{"cc":"TR","lat":36.72,"lng":37.12,"pop":111648},"kayseri":{"cc":"TR","lat":38.73,"lng":35.49,"pop":1452458},"karsiyaka":{"cc":"TR","lat":38.46,"lng":27.11,"pop":339624},"karyaka":{"cc":"TR","lat":38.46,"lng":27.11,"pop":339624},"karaman":{"cc":"TR","lat":37.18,"lng":33.22,"pop":175390},"agri":{"cc":"TR","lat":39.71,"lng":43.04,"pop":124483},"ar":{"cc":"TR","lat":39.71,"lng":43.04,"pop":124483},"khta":{"cc":"TR","lat":37.79,"lng":38.62,"pop":97875},"kahta":{"cc":"TR","lat":37.79,"lng":38.62,"pop":97875},"kahramanmara":{"cc":"TR","lat":37.58,"lng":36.93,"pop":384953},"kahramanmaras":{"cc":"TR","lat":37.58,"lng":36.93,"pop":384953},"kadirli":{"cc":"TR","lat":37.37,"lng":36.1,"pop":70248},"izmir":{"cc":"TR","lat":38.41,"lng":27.14,"pop":2938292},"isparta":{"cc":"TR","lat":37.76,"lng":30.55,"pop":172334},"iskenderun":{"cc":"TR","lat":36.59,"lng":36.17,"pop":251682},"igdir":{"cc":"TR","lat":39.92,"lng":44.05,"pop":101700},"idr":{"cc":"TR","lat":39.92,"lng":44.05,"pop":101700},"glba":{"cc":"TR","lat":39.79,"lng":32.81,"pop":165201},"goelbasi":{"cc":"TR","lat":39.79,"lng":32.81,"pop":165201},"gaziantep":{"cc":"TR","lat":37.06,"lng":37.38,"pop":2222415},"fethiye":{"cc":"TR","lat":36.64,"lng":29.13,"pop":60437},"eskiehir":{"cc":"TR","lat":39.78,"lng":30.52,"pop":921630},"eskisehir":{"cc":"TR","lat":39.78,"lng":30.52,"pop":921630},"erzurum":{"cc":"TR","lat":39.91,"lng":41.28,"pop":767848},"erzincan":{"cc":"TR","lat":39.74,"lng":39.49,"pop":150714},"ergani":{"cc":"TR","lat":38.27,"lng":39.75,"pop":52684},"ereli":{"cc":"TR","lat":37.51,"lng":34.05,"pop":156253},"eregli":{"cc":"TR","lat":37.51,"lng":34.05,"pop":156253},"ercis":{"cc":"TR","lat":39.03,"lng":43.36,"pop":91915},"erci":{"cc":"TR","lat":39.03,"lng":43.36,"pop":91915},"elbistan":{"cc":"TR","lat":38.21,"lng":37.2,"pop":80456},"elazig":{"cc":"TR","lat":38.67,"lng":39.22,"pop":443363},"elaz":{"cc":"TR","lat":38.67,"lng":39.22,"pop":443363},"doertyol":{"cc":"TR","lat":36.84,"lng":36.23,"pop":56513},"drtyol":{"cc":"TR","lat":36.84,"lng":36.23,"pop":56513},"doubayazt":{"cc":"TR","lat":39.55,"lng":44.08,"pop":70171},"dogubayazit":{"cc":"TR","lat":39.55,"lng":44.08,"pop":70171},"diyarbakir":{"cc":"TR","lat":37.91,"lng":40.22,"pop":1833684},"diyarbakr":{"cc":"TR","lat":37.91,"lng":40.22,"pop":1833684},"denizli":{"cc":"TR","lat":37.77,"lng":29.09,"pop":313238},"hakkri":{"cc":"TR","lat":37.57,"lng":43.74,"pop":77699},"hakkari":{"cc":"TR","lat":37.57,"lng":43.74,"pop":77699},"cizre":{"cc":"TR","lat":37.33,"lng":42.18,"pop":134041},"ceyhan":{"cc":"TR","lat":37.02,"lng":35.82,"pop":96303},"ili":{"cc":"TR","lat":41.06,"lng":28.99,"pop":314684},"cigli":{"cc":"TR","lat":38.5,"lng":27.07,"pop":214065},"burdur":{"cc":"TR","lat":37.72,"lng":30.29,"pop":95436},"bozueyuek":{"cc":"TR","lat":39.91,"lng":30.04,"pop":55365},"bozyk":{"cc":"TR","lat":39.91,"lng":30.04,"pop":55365},"bolvadin":{"cc":"TR","lat":38.71,"lng":31.05,"pop":55870},"bitlis":{"cc":"TR","lat":38.4,"lng":42.11,"pop":53023},"bismil":{"cc":"TR","lat":37.85,"lng":40.66,"pop":74493},"bingl":{"cc":"TR","lat":38.88,"lng":40.49,"pop":128935},"bingoel":{"cc":"TR","lat":38.88,"lng":40.49,"pop":128935},"bergama":{"cc":"TR","lat":39.12,"lng":27.18,"pop":57200},"belek":{"cc":"TR","lat":36.86,"lng":31.07,"pop":73260},"batman":{"cc":"TR","lat":37.89,"lng":41.13,"pop":452157},"balikesir":{"cc":"TR","lat":39.65,"lng":27.89,"pop":238151},"balkesir":{"cc":"TR","lat":39.65,"lng":27.89,"pop":238151},"ayvalik":{"cc":"TR","lat":39.32,"lng":26.69,"pop":70002},"ayvalk":{"cc":"TR","lat":39.32,"lng":26.69,"pop":70002},"aydin":{"cc":"TR","lat":37.85,"lng":27.84,"pop":163022},"aydn":{"cc":"TR","lat":37.85,"lng":27.84,"pop":163022},"antalya":{"cc":"TR","lat":36.91,"lng":30.7,"pop":1335002},"antakya":{"cc":"TR","lat":36.21,"lng":36.16,"pop":399045},"ankara":{"cc":"TR","lat":39.92,"lng":32.85,"pop":3517182},"anamur":{"cc":"TR","lat":36.08,"lng":32.84,"pop":57128},"alanya":{"cc":"TR","lat":36.54,"lng":32.0,"pop":364180},"akehir":{"cc":"TR","lat":38.36,"lng":31.42,"pop":64446},"aksehir":{"cc":"TR","lat":38.36,"lng":31.42,"pop":64446},"aksaray":{"cc":"TR","lat":38.37,"lng":34.03,"pop":327575},"akhisar":{"cc":"TR","lat":38.92,"lng":27.84,"pop":84659},"akapnar":{"cc":"TR","lat":38.95,"lng":38.94,"pop":84366},"akcapinar":{"cc":"TR","lat":38.95,"lng":38.94,"pop":84366},"ahlat":{"cc":"TR","lat":38.75,"lng":42.48,"pop":64695},"afyonkarahisar":{"cc":"TR","lat":38.76,"lng":30.54,"pop":251799},"adyaman":{"cc":"TR","lat":37.76,"lng":38.28,"pop":290883},"adiyaman":{"cc":"TR","lat":37.76,"lng":38.28,"pop":290883},"adilcevaz":{"cc":"TR","lat":38.8,"lng":42.73,"pop":52781},"adana":{"cc":"TR","lat":36.99,"lng":35.33,"pop":1816750},"batikent":{"cc":"TR","lat":39.97,"lng":32.73,"pop":300000},"zonguldak":{"cc":"TR","lat":41.45,"lng":31.79,"pop":101749},"zile":{"cc":"TR","lat":40.3,"lng":35.89,"pop":55680},"zeytinburnu":{"cc":"TR","lat":40.99,"lng":28.9,"pop":280896},"koerfez":{"cc":"TR","lat":40.77,"lng":29.78,"pop":90580},"krfez":{"cc":"TR","lat":40.77,"lng":29.78,"pop":90580},"yalova":{"cc":"TR","lat":40.66,"lng":29.28,"pop":71289},"skdar":{"cc":"TR","lat":41.02,"lng":29.01,"pop":524452},"ueskuedar":{"cc":"TR","lat":41.02,"lng":29.01,"pop":524452},"nye":{"cc":"TR","lat":41.14,"lng":37.29,"pop":77585},"uenye":{"cc":"TR","lat":41.14,"lng":37.29,"pop":77585},"umraniye":{"cc":"TR","lat":41.02,"lng":29.12,"pop":573265},"turhal":{"cc":"TR","lat":40.39,"lng":36.08,"pop":110884},"trabzon":{"cc":"TR","lat":41.01,"lng":39.73,"pop":244083},"tokat":{"cc":"TR","lat":40.31,"lng":36.55,"pop":129702},"tekirdag":{"cc":"TR","lat":40.98,"lng":27.51,"pop":122287},"tekirda":{"cc":"TR","lat":40.98,"lng":27.51,"pop":122287},"sisli":{"cc":"TR","lat":41.06,"lng":28.99,"pop":314684},"silivri":{"cc":"TR","lat":41.07,"lng":28.25,"pop":53167},"samsun":{"cc":"TR","lat":41.28,"lng":36.34,"pop":394050},"rize":{"cc":"TR","lat":41.02,"lng":40.52,"pop":119828},"orhangazi":{"cc":"TR","lat":40.49,"lng":29.31,"pop":51792},"ordu":{"cc":"TR","lat":40.98,"lng":37.89,"pop":229214},"mustafakemalpaa":{"cc":"TR","lat":40.04,"lng":28.41,"pop":101412},"mustafakemalpasa":{"cc":"TR","lat":40.04,"lng":28.41,"pop":101412},"merzifon":{"cc":"TR","lat":40.87,"lng":35.46,"pop":50658},"maltepe":{"cc":"TR","lat":40.94,"lng":29.16,"pop":427040},"lleburgaz":{"cc":"TR","lat":41.4,"lng":27.36,"pop":90899},"lueleburgaz":{"cc":"TR","lat":41.4,"lng":27.36,"pop":90899},"kuecuekcekmece":{"cc":"TR","lat":40.99,"lng":28.77,"pop":792030},"kkekmece":{"cc":"TR","lat":40.99,"lng":28.77,"pop":792030},"kirklareli":{"cc":"TR","lat":41.74,"lng":27.23,"pop":58223},"krklareli":{"cc":"TR","lat":41.74,"lng":27.23,"pop":58223},"kavakli":{"cc":"TR","lat":41.09,"lng":28.33,"pop":50502},"kavakl":{"cc":"TR","lat":41.09,"lng":28.33,"pop":50502},"kastamonu":{"cc":"TR","lat":41.38,"lng":33.78,"pop":125622},"kars":{"cc":"TR","lat":40.6,"lng":43.09,"pop":91450},"karabuek":{"cc":"TR","lat":41.2,"lng":32.63,"pop":125403},"karabk":{"cc":"TR","lat":41.2,"lng":32.63,"pop":125403},"izmit":{"cc":"TR","lat":40.76,"lng":29.93,"pop":196571},"istanbul":{"cc":"TR","lat":41.01,"lng":28.95,"pop":15701602},"inegol":{"cc":"TR","lat":40.08,"lng":29.51,"pop":133959},"goelcuek":{"cc":"TR","lat":40.72,"lng":29.82,"pop":56189},"glck":{"cc":"TR","lat":40.72,"lng":29.82,"pop":56189},"giresun":{"cc":"TR","lat":40.92,"lng":38.39,"pop":125682},"gemlik":{"cc":"TR","lat":40.43,"lng":29.16,"pop":71063},"gebze":{"cc":"TR","lat":40.8,"lng":29.43,"pop":281436},"fatsa":{"cc":"TR","lat":41.03,"lng":37.5,"pop":82160},"fatih":{"cc":"TR","lat":41.02,"lng":28.94,"pop":356025},"esenyurt":{"cc":"TR","lat":41.03,"lng":28.68,"pop":983571},"esenler":{"cc":"TR","lat":41.04,"lng":28.88,"pop":520235},"erbaa":{"cc":"TR","lat":40.67,"lng":36.57,"pop":52185},"eminoenue":{"cc":"TR","lat":41.02,"lng":28.97,"pop":55548},"eminn":{"cc":"TR","lat":41.02,"lng":28.97,"pop":55548},"edirne":{"cc":"TR","lat":41.68,"lng":26.56,"pop":180002},"dzce":{"cc":"TR","lat":40.84,"lng":31.16,"pop":194097},"duezce":{"cc":"TR","lat":40.84,"lng":31.16,"pop":194097},"derince":{"cc":"TR","lat":40.76,"lng":29.81,"pop":125485},"ubuk":{"cc":"TR","lat":40.24,"lng":33.03,"pop":62602},"cubuk":{"cc":"TR","lat":40.24,"lng":33.03,"pop":62602},"corum":{"cc":"TR","lat":40.55,"lng":34.95,"pop":269595},"orum":{"cc":"TR","lat":40.55,"lng":34.95,"pop":269595},"orlu":{"cc":"TR","lat":41.16,"lng":27.8,"pop":202578},"corlu":{"cc":"TR","lat":41.16,"lng":27.8,"pop":202578},"erkezky":{"cc":"TR","lat":41.29,"lng":28.0,"pop":84234},"cerkezkoey":{"cc":"TR","lat":41.29,"lng":28.0,"pop":84234},"carsamba":{"cc":"TR","lat":41.2,"lng":36.72,"pop":50459},"aramba":{"cc":"TR","lat":41.2,"lng":36.72,"pop":50459},"ankr":{"cc":"TR","lat":40.6,"lng":33.62,"pop":90564},"cankiri":{"cc":"TR","lat":40.6,"lng":33.62,"pop":90564},"anakkale":{"cc":"TR","lat":40.16,"lng":26.41,"pop":143622},"canakkale":{"cc":"TR","lat":40.16,"lng":26.41,"pop":143622},"bursa":{"cc":"TR","lat":40.2,"lng":29.06,"pop":3101833},"bolu":{"cc":"TR","lat":40.74,"lng":31.61,"pop":184682},"bilecik":{"cc":"TR","lat":40.14,"lng":29.98,"pop":74457},"biga":{"cc":"TR","lat":40.23,"lng":27.24,"pop":61066},"bartn":{"cc":"TR","lat":41.64,"lng":32.34,"pop":81692},"bartin":{"cc":"TR","lat":41.64,"lng":32.34,"pop":81692},"bandrma":{"cc":"TR","lat":40.35,"lng":27.98,"pop":107631},"bandirma":{"cc":"TR","lat":40.35,"lng":27.98,"pop":107631},"baclar":{"cc":"TR","lat":41.04,"lng":28.86,"pop":740069},"bagcilar":{"cc":"TR","lat":41.04,"lng":28.86,"pop":740069},"bafra":{"cc":"TR","lat":41.57,"lng":35.9,"pop":92944},"arnavutky":{"cc":"TR","lat":41.18,"lng":28.74,"pop":198165},"arnavutkoey":{"cc":"TR","lat":41.18,"lng":28.74,"pop":198165},"ardeen":{"cc":"TR","lat":41.19,"lng":40.98,"pop":67965},"ardesen":{"cc":"TR","lat":41.19,"lng":40.98,"pop":67965},"amasya":{"cc":"TR","lat":40.65,"lng":35.83,"pop":114921},"adapazar":{"cc":"TR","lat":40.78,"lng":30.4,"pop":286787},"adapazari":{"cc":"TR","lat":40.78,"lng":30.4,"pop":286787},"merter keresteciler":{"cc":"TR","lat":41.01,"lng":28.89,"pop":50000},"gngren merter":{"cc":"TR","lat":41.01,"lng":28.89,"pop":50000},"guengoeren merter":{"cc":"TR","lat":41.01,"lng":28.89,"pop":50000},"atasehir":{"cc":"TR","lat":40.98,"lng":29.12,"pop":361615},"ataehir":{"cc":"TR","lat":40.98,"lng":29.12,"pop":361615},"basaksehir":{"cc":"TR","lat":41.11,"lng":28.79,"pop":193750},"baakehir":{"cc":"TR","lat":41.11,"lng":28.79,"pop":193750},"beylikdz":{"cc":"TR","lat":40.98,"lng":28.64,"pop":415290},"beylikduezue":{"cc":"TR","lat":40.98,"lng":28.64,"pop":415290},"bueyuekcekmece":{"cc":"TR","lat":41.02,"lng":28.59,"pop":163140},"bykekmece":{"cc":"TR","lat":41.02,"lng":28.59,"pop":163140},"cankaya":{"cc":"TR","lat":39.92,"lng":32.86,"pop":792189},"ankaya":{"cc":"TR","lat":39.92,"lng":32.86,"pop":792189},"bahcelievler":{"cc":"TR","lat":41.0,"lng":28.86,"pop":576799},"bahelievler":{"cc":"TR","lat":41.0,"lng":28.86,"pop":576799},"sultangazi":{"cc":"TR","lat":41.11,"lng":28.87,"pop":436935},"sultanbeyli":{"cc":"TR","lat":40.96,"lng":29.27,"pop":358201},"sancaktepe":{"cc":"TR","lat":41.0,"lng":29.23,"pop":489848},"karabaglar":{"cc":"TR","lat":38.38,"lng":27.13,"pop":479338},"karabalar":{"cc":"TR","lat":38.38,"lng":27.13,"pop":479338},"muratpaa":{"cc":"TR","lat":36.89,"lng":30.76,"pop":450000},"muratpasa":{"cc":"TR","lat":36.89,"lng":30.76,"pop":450000},"niluefer":{"cc":"TR","lat":40.21,"lng":28.92,"pop":536365},"nilfer":{"cc":"TR","lat":40.21,"lng":28.92,"pop":536365},"merkezefendi":{"cc":"TR","lat":37.81,"lng":29.04,"pop":280341},"mon repos":{"cc":"TT","lat":10.28,"lng":-61.45,"pop":56380},"chaguanas":{"cc":"TT","lat":10.52,"lng":-61.42,"pop":67433},"douliu":{"cc":"TW","lat":23.71,"lng":120.54,"pop":107924},"yongkang":{"cc":"TW","lat":23.02,"lng":120.26,"pop":233730},"yuanlin":{"cc":"TW","lat":23.96,"lng":120.58,"pop":124725},"yingge":{"cc":"TW","lat":24.96,"lng":121.35,"pop":87920},"wufeng":{"cc":"TW","lat":24.06,"lng":120.7,"pop":65567},"caotun":{"cc":"TW","lat":23.98,"lng":120.69,"pop":96838},"toufen":{"cc":"TW","lat":24.69,"lng":120.91,"pop":106310},"taitung":{"cc":"TW","lat":22.76,"lng":121.14,"pop":103260},"taipei":{"cc":"TW","lat":25.05,"lng":121.53,"pop":7871900},"xinying":{"cc":"TW","lat":23.31,"lng":120.31,"pop":74972},"tainan":{"cc":"TW","lat":22.99,"lng":120.21,"pop":1856642},"taichung":{"cc":"TW","lat":24.15,"lng":120.68,"pop":2850285},"daxi":{"cc":"TW","lat":24.88,"lng":121.29,"pop":94222},"shulin":{"cc":"TW","lat":24.99,"lng":121.42,"pop":180044},"banqiao":{"cc":"TW","lat":25.01,"lng":121.47,"pop":551221},"sanxia":{"cc":"TW","lat":24.93,"lng":121.37,"pop":115185},"puli":{"cc":"TW","lat":23.97,"lng":120.97,"pop":86406},"bade":{"cc":"TW","lat":24.93,"lng":121.28,"pop":209148},"neili":{"cc":"TW","lat":24.97,"lng":121.26,"pop":112845},"neihu":{"cc":"TW","lat":25.08,"lng":121.59,"pop":274538},"miaoli":{"cc":"TW","lat":24.56,"lng":120.82,"pop":86327},"magong":{"cc":"TW","lat":23.57,"lng":119.59,"pop":63745},"fengshan":{"cc":"TW","lat":22.63,"lng":120.36,"pop":356463},"kaohsiung":{"cc":"TW","lat":22.62,"lng":120.31,"pop":2737660},"hualien city":{"cc":"TW","lat":23.98,"lng":121.6,"pop":99458},"hsinchu":{"cc":"TW","lat":24.8,"lng":120.97,"pop":453536},"xihu":{"cc":"TW","lat":23.96,"lng":120.48,"pop":54033},"xizhi":{"cc":"TW","lat":25.07,"lng":121.66,"pop":204619},"zhudong":{"cc":"TW","lat":24.73,"lng":121.09,"pop":96518},"zhubei":{"cc":"TW","lat":24.84,"lng":121.01,"pop":212695},"keelung":{"cc":"TW","lat":25.13,"lng":121.74,"pop":362487},"chiayi city":{"cc":"TW","lat":23.48,"lng":120.45,"pop":263188},"chang-hua":{"cc":"TW","lat":24.07,"lng":120.56,"pop":226564},"changhua":{"cc":"TW","lat":24.07,"lng":120.55,"pop":226564},"new taipei city":{"cc":"TW","lat":25.06,"lng":121.46,"pop":4004367},"zanzibar":{"cc":"TZ","lat":-6.16,"lng":39.2,"pop":709809},"vwawa":{"cc":"TZ","lat":-9.11,"lng":32.93,"pop":85000},"vikindu":{"cc":"TZ","lat":-7.01,"lng":39.3,"pop":70000},"uyovu":{"cc":"TZ","lat":-3.28,"lng":31.53,"pop":60849},"utengule":{"cc":"TZ","lat":-8.9,"lng":33.33,"pop":50000},"ushirombo":{"cc":"TZ","lat":-3.49,"lng":31.96,"pop":95052},"tunduma":{"cc":"TZ","lat":-9.3,"lng":32.77,"pop":219309},"tukuyu":{"cc":"TZ","lat":-9.25,"lng":33.65,"pop":50000},"tarime":{"cc":"TZ","lat":-1.35,"lng":34.37,"pop":133043},"tanga":{"cc":"TZ","lat":-5.07,"lng":39.1,"pop":393429},"tabora":{"cc":"TZ","lat":-5.02,"lng":32.83,"pop":308741},"sumbawanga":{"cc":"TZ","lat":-7.97,"lng":31.62,"pop":303986},"singida":{"cc":"TZ","lat":-4.82,"lng":34.74,"pop":232459},"shinyanga":{"cc":"TZ","lat":-3.66,"lng":33.42,"pop":139727},"sengerema":{"cc":"TZ","lat":-2.67,"lng":32.65,"pop":110000},"nzega":{"cc":"TZ","lat":-4.22,"lng":33.18,"pop":125193},"njombe":{"cc":"TZ","lat":-9.35,"lng":34.77,"pop":92537},"mwanza":{"cc":"TZ","lat":-2.52,"lng":32.9,"pop":1104521},"musoma":{"cc":"TZ","lat":-1.5,"lng":33.8,"pop":164172},"moshi":{"cc":"TZ","lat":-3.35,"lng":37.33,"pop":221733},"morogoro":{"cc":"TZ","lat":-6.82,"lng":37.66,"pop":471409},"mbeya":{"cc":"TZ","lat":-8.9,"lng":33.45,"pop":541603},"masumbwe":{"cc":"TZ","lat":-3.63,"lng":32.18,"pop":50000},"makumbako":{"cc":"TZ","lat":-8.85,"lng":34.83,"pop":116232},"korogwe":{"cc":"TZ","lat":-5.15,"lng":38.48,"pop":62032},"kondoa":{"cc":"TZ","lat":-4.9,"lng":35.78,"pop":80443},"kilosa":{"cc":"TZ","lat":-6.83,"lng":36.98,"pop":91889},"kigoma":{"cc":"TZ","lat":-4.88,"lng":29.63,"pop":232388},"kibaha":{"cc":"TZ","lat":-6.77,"lng":38.92,"pop":265360},"katumba":{"cc":"TZ","lat":-9.23,"lng":33.62,"pop":108558},"katoro":{"cc":"TZ","lat":-3.0,"lng":31.93,"pop":75000},"kasulu":{"cc":"TZ","lat":-4.58,"lng":30.1,"pop":238321},"kahama":{"cc":"TZ","lat":-3.83,"lng":32.6,"pop":453654},"iringa":{"cc":"TZ","lat":-7.77,"lng":35.7,"pop":202490},"ifakara":{"cc":"TZ","lat":-8.13,"lng":36.68,"pop":205843},"handeni":{"cc":"TZ","lat":-5.43,"lng":38.02,"pop":108968},"geita":{"cc":"TZ","lat":-2.87,"lng":32.23,"pop":318006},"dodoma":{"cc":"TZ","lat":-6.17,"lng":35.74,"pop":765179},"dar es salaam":{"cc":"TZ","lat":-6.82,"lng":39.27,"pop":5383728},"chake chake":{"cc":"TZ","lat":-5.25,"lng":39.77,"pop":52047},"buseresere":{"cc":"TZ","lat":-3.05,"lng":31.89,"pop":52870},"bunda":{"cc":"TZ","lat":-2.02,"lng":33.87,"pop":182970},"bukoba":{"cc":"TZ","lat":-1.33,"lng":31.81,"pop":144938},"bariadi":{"cc":"TZ","lat":-2.8,"lng":33.98,"pop":260927},"bagamoyo":{"cc":"TZ","lat":-6.44,"lng":38.9,"pop":82426},"babati":{"cc":"TZ","lat":-4.22,"lng":35.75,"pop":67445},"arusha":{"cc":"TZ","lat":-3.37,"lng":36.68,"pop":617631},"songea":{"cc":"TZ","lat":-10.68,"lng":35.65,"pop":286285},"mtwara":{"cc":"TZ","lat":-10.27,"lng":40.18,"pop":140793},"mbinga":{"cc":"TZ","lat":-10.93,"lng":35.02,"pop":60868},"masasi":{"cc":"TZ","lat":-10.72,"lng":38.8,"pop":89700},"lindi":{"cc":"TZ","lat":-10.0,"lng":39.72,"pop":95096},"merelani":{"cc":"TZ","lat":-3.56,"lng":36.98,"pop":50000},"kibaigwa":{"cc":"TZ","lat":-6.08,"lng":36.65,"pop":50054},"mafinga":{"cc":"TZ","lat":-8.3,"lng":35.29,"pop":99305},"druzhkivka":{"cc":"UA","lat":48.62,"lng":37.53,"pop":53977},"zhytomyr":{"cc":"UA","lat":50.26,"lng":28.68,"pop":261624},"zaporizhzhya":{"cc":"UA","lat":47.85,"lng":35.12,"pop":710052},"yevpatoriya":{"cc":"UA","lat":45.2,"lng":33.37,"pop":107040},"yenakiyeve":{"cc":"UA","lat":48.24,"lng":38.2,"pop":76673},"yalta":{"cc":"UA","lat":44.5,"lng":34.17,"pop":77003},"vyhurivshchyna-troyeshchyna":{"cc":"UA","lat":50.51,"lng":30.6,"pop":240000},"vinnytsya":{"cc":"UA","lat":49.23,"lng":28.47,"pop":430091},"uzhhorod":{"cc":"UA","lat":48.62,"lng":22.29,"pop":115449},"uman":{"cc":"UA","lat":48.75,"lng":30.22,"pop":81525},"chystyakove":{"cc":"UA","lat":48.04,"lng":38.6,"pop":53462},"ternopil":{"cc":"UA","lat":49.55,"lng":25.59,"pop":225238},"siverskodonetsk":{"cc":"UA","lat":48.94,"lng":38.49,"pop":99067},"dovzhansk":{"cc":"UA","lat":48.08,"lng":39.65,"pop":62691},"sumy":{"cc":"UA","lat":50.92,"lng":34.8,"pop":256474},"stryi":{"cc":"UA","lat":49.26,"lng":23.85,"pop":61404},"kadiyivka":{"cc":"UA","lat":48.57,"lng":38.64,"pop":73248},"sotsmisto":{"cc":"UA","lat":48.74,"lng":37.59,"pop":53370},"snizhne":{"cc":"UA","lat":48.02,"lng":38.76,"pop":55587},"smila":{"cc":"UA","lat":49.23,"lng":31.88,"pop":66475},"slovyansk":{"cc":"UA","lat":48.85,"lng":37.6,"pop":105141},"simferopol":{"cc":"UA","lat":44.96,"lng":34.11,"pop":336460},"sykhiv":{"cc":"UA","lat":49.79,"lng":24.06,"pop":151131},"shostka":{"cc":"UA","lat":51.86,"lng":33.47,"pop":73197},"shakhtarsk":{"cc":"UA","lat":48.06,"lng":38.44,"pop":71700},"sevastopol":{"cc":"UA","lat":44.61,"lng":33.52,"pop":547820},"rubizhne":{"cc":"UA","lat":49.01,"lng":38.38,"pop":55247},"rivne":{"cc":"UA","lat":50.62,"lng":26.24,"pop":243873},"pryluky":{"cc":"UA","lat":50.6,"lng":32.38,"pop":52553},"poltava":{"cc":"UA","lat":49.59,"lng":34.55,"pop":279593},"voznesenskyi":{"cc":"UA","lat":47.93,"lng":37.63,"pop":85399},"pervomaysk":{"cc":"UA","lat":48.04,"lng":30.85,"pop":62426},"pavlohrad":{"cc":"UA","lat":48.53,"lng":35.87,"pop":101430},"oleksandriya":{"cc":"UA","lat":48.67,"lng":33.12,"pop":76097},"odesa":{"cc":"UA","lat":46.49,"lng":30.74,"pop":1010537},"samar":{"cc":"UA","lat":48.63,"lng":35.26,"pop":70550},"zvyahel":{"cc":"UA","lat":50.59,"lng":27.61,"pop":55925},"nizhyn":{"cc":"UA","lat":51.05,"lng":31.89,"pop":66983},"nyzhnodniprovsk":{"cc":"UA","lat":48.48,"lng":35.12,"pop":160123},"nikopol":{"cc":"UA","lat":47.57,"lng":34.39,"pop":105160},"mykolayiv":{"cc":"UA","lat":46.98,"lng":31.99,"pop":470011},"mukachevo":{"cc":"UA","lat":48.44,"lng":22.72,"pop":85569},"melitopol":{"cc":"UA","lat":46.85,"lng":35.38,"pop":148851},"mariupol":{"cc":"UA","lat":47.1,"lng":37.54,"pop":230000},"makiyivka":{"cc":"UA","lat":48.05,"lng":37.93,"pop":338968},"lviv":{"cc":"UA","lat":49.84,"lng":24.02,"pop":717273},"lutsk":{"cc":"UA","lat":50.76,"lng":25.35,"pop":215986},"luhansk":{"cc":"UA","lat":48.57,"lng":39.31,"pop":397677},"lozova":{"cc":"UA","lat":48.89,"lng":36.31,"pop":54026},"lysychansk":{"cc":"UA","lat":48.91,"lng":38.42,"pop":93340},"kyiv":{"cc":"UA","lat":50.45,"lng":30.52,"pop":2952301},"kryvyy rih":{"cc":"UA","lat":47.91,"lng":33.39,"pop":603904},"kryukiv":{"cc":"UA","lat":49.03,"lng":33.44,"pop":75578},"kremenchuk":{"cc":"UA","lat":49.06,"lng":33.4,"pop":224997},"khrustalnyi":{"cc":"UA","lat":48.14,"lng":38.92,"pop":79533},"pokrovsk":{"cc":"UA","lat":48.28,"lng":37.18,"pop":60127},"kramatorsk":{"cc":"UA","lat":48.73,"lng":37.57,"pop":147145},"kovel":{"cc":"UA","lat":51.22,"lng":24.7,"pop":67575},"korosten":{"cc":"UA","lat":50.95,"lng":28.64,"pop":61496},"kostyantynivka":{"cc":"UA","lat":48.53,"lng":37.71,"pop":67350},"konotop":{"cc":"UA","lat":51.23,"lng":33.2,"pop":84787},"kolomyia":{"cc":"UA","lat":48.52,"lng":25.04,"pop":60821},"kropyvnytskyi":{"cc":"UA","lat":48.51,"lng":32.27,"pop":219676},"khmelnytskyi":{"cc":"UA","lat":49.42,"lng":26.98,"pop":274452},"kherson":{"cc":"UA","lat":46.64,"lng":32.61,"pop":66000},"khartsyzk":{"cc":"UA","lat":48.04,"lng":38.14,"pop":56182},"kharkiv":{"cc":"UA","lat":49.98,"lng":36.25,"pop":1421125},"kerch":{"cc":"UA","lat":45.36,"lng":36.48,"pop":148932},"kamyanets-podilskyi":{"cc":"UA","lat":48.68,"lng":26.59,"pop":97908},"kalush":{"cc":"UA","lat":49.02,"lng":24.37,"pop":65088},"izmayil":{"cc":"UA","lat":45.35,"lng":28.84,"pop":69932},"ivano-frankivsk":{"cc":"UA","lat":48.92,"lng":24.71,"pop":238196},"irpin":{"cc":"UA","lat":50.52,"lng":30.24,"pop":65167},"inhulets":{"cc":"UA","lat":47.73,"lng":33.25,"pop":62173},"chornomorsk":{"cc":"UA","lat":46.3,"lng":30.66,"pop":57983},"horlivka":{"cc":"UA","lat":48.3,"lng":38.02,"pop":239828},"feodosiya":{"cc":"UA","lat":45.03,"lng":35.38,"pop":68562},"enerhodar":{"cc":"UA","lat":47.49,"lng":34.66,"pop":52887},"drohobych":{"cc":"UA","lat":49.35,"lng":23.51,"pop":73682},"dnipro":{"cc":"UA","lat":48.47,"lng":35.04,"pop":968502},"kamyanske":{"cc":"UA","lat":48.52,"lng":34.61,"pop":226845},"sheptytskyi":{"cc":"UA","lat":50.39,"lng":24.24,"pop":64297},"chernivtsi":{"cc":"UA","lat":48.29,"lng":25.93,"pop":264298},"chernihiv":{"cc":"UA","lat":51.51,"lng":31.29,"pop":282747},"cherkasy":{"cc":"UA","lat":49.44,"lng":32.06,"pop":269836},"brovary":{"cc":"UA","lat":50.51,"lng":30.79,"pop":109806},"boryspil":{"cc":"UA","lat":50.35,"lng":30.95,"pop":64117},"bohuniya":{"cc":"UA","lat":50.28,"lng":28.61,"pop":147324},"bila tserkva":{"cc":"UA","lat":49.8,"lng":30.12,"pop":207273},"berdychiv":{"cc":"UA","lat":49.89,"lng":28.58,"pop":73046},"berdyansk":{"cc":"UA","lat":46.76,"lng":36.79,"pop":106311},"bakhmut":{"cc":"UA","lat":48.59,"lng":38.0,"pop":80500},"antratsyt":{"cc":"UA","lat":48.12,"lng":39.09,"pop":52150},"alchevsk":{"cc":"UA","lat":48.47,"lng":38.8,"pop":106062},"saltivka":{"cc":"UA","lat":50.02,"lng":36.35,"pop":409300},"obolon":{"cc":"UA","lat":50.51,"lng":30.51,"pop":239500},"cheremushky":{"cc":"UA","lat":46.43,"lng":30.71,"pop":120000},"borshchahivka":{"cc":"UA","lat":50.43,"lng":30.39,"pop":179900},"avtozavodskyi":{"cc":"UA","lat":49.1,"lng":33.43,"pop":157382},"oleksiyivka":{"cc":"UA","lat":50.05,"lng":36.19,"pop":100500},"holosiyiv":{"cc":"UA","lat":50.34,"lng":30.55,"pop":62200},"pechersk":{"cc":"UA","lat":50.44,"lng":30.52,"pop":100900},"svyatoshyn":{"cc":"UA","lat":50.46,"lng":30.35,"pop":53000},"dniprovskyi":{"cc":"UA","lat":50.45,"lng":30.6,"pop":357900},"desna":{"cc":"UA","lat":50.52,"lng":30.68,"pop":368500},"shevchenkivskyi":{"cc":"UA","lat":50.02,"lng":36.22,"pop":220660},"fortechnyi":{"cc":"UA","lat":48.5,"lng":32.25,"pop":167451},"podilskyi":{"cc":"UA","lat":48.5,"lng":32.28,"pop":86652},"bohodukhivskyi":{"cc":"UA","lat":47.97,"lng":37.86,"pop":90600},"yuzivskyi":{"cc":"UA","lat":48.0,"lng":37.8,"pop":94228},"kalynivskyi":{"cc":"UA","lat":48.01,"lng":37.85,"pop":103249},"kyivskyi":{"cc":"UA","lat":50.04,"lng":36.29,"pop":182900},"rutchenkivskyi":{"cc":"UA","lat":47.98,"lng":37.7,"pop":168029},"bosse":{"cc":"UA","lat":47.96,"lng":37.8,"pop":50000},"oleksandrivskyi":{"cc":"UA","lat":47.97,"lng":37.8,"pop":100330},"chumakivskyi":{"cc":"UA","lat":47.96,"lng":37.94,"pop":103005},"tekstylnyk":{"cc":"UA","lat":47.95,"lng":37.7,"pop":75000},"shevchenko":{"cc":"UA","lat":49.56,"lng":34.54,"pop":147600},"rayon khtz":{"cc":"UA","lat":49.94,"lng":36.37,"pop":131000},"pravyi bereh":{"cc":"UA","lat":47.11,"lng":37.59,"pop":352088},"nyvky":{"cc":"UA","lat":50.46,"lng":30.41,"pop":71700},"pozniaky":{"cc":"UA","lat":50.4,"lng":30.62,"pop":104400},"darnytsya":{"cc":"UA","lat":50.42,"lng":30.7,"pop":343384},"voskresenka":{"cc":"UA","lat":50.48,"lng":30.6,"pop":84200},"vynohradar":{"cc":"UA","lat":50.51,"lng":30.42,"pop":57500},"vidradnyi":{"cc":"UA","lat":50.43,"lng":30.42,"pop":69800},"chokolivka":{"cc":"UA","lat":50.42,"lng":30.45,"pop":73600},"darnytskyi masyv":{"cc":"UA","lat":50.44,"lng":30.63,"pop":68900},"lisovyi masyv":{"cc":"UA","lat":50.47,"lng":30.63,"pop":87300},"shulyavka":{"cc":"UA","lat":50.45,"lng":30.45,"pop":62200},"mykilska borshchahivka":{"cc":"UA","lat":50.43,"lng":30.37,"pop":127400},"kharkivskyi masyv":{"cc":"UA","lat":50.41,"lng":30.66,"pop":93700},"smolyanskyi":{"cc":"UA","lat":48.01,"lng":37.74,"pop":116779},"tsentralno-miskyi":{"cc":"UA","lat":48.3,"lng":38.03,"pop":118283},"khanzhonkivskyi":{"cc":"UA","lat":48.1,"lng":38.04,"pop":53040},"hruzkyi":{"cc":"UA","lat":48.07,"lng":37.94,"pop":52265},"hirnytskyi":{"cc":"UA","lat":48.02,"lng":37.97,"pop":107216},"berestovskyi":{"cc":"UA","lat":48.04,"lng":37.88,"pop":80671},"verhunskyi":{"cc":"UA","lat":48.59,"lng":39.37,"pop":185593},"vilkhivskyi":{"cc":"UA","lat":48.54,"lng":39.28,"pop":126340},"kovpakivskyi":{"cc":"UA","lat":50.93,"lng":34.79,"pop":142447},"zarichnyi":{"cc":"UA","lat":50.9,"lng":34.81,"pop":150694},"kindrativskyi":{"cc":"UA","lat":48.3,"lng":38.05,"pop":101565},"mykytivskyi":{"cc":"UA","lat":48.31,"lng":38.0,"pop":70474},"tsentralnyi":{"cc":"UA","lat":47.1,"lng":37.55,"pop":179582},"kalmiuskyi":{"cc":"UA","lat":47.11,"lng":37.54,"pop":101498},"livoberezhnyi":{"cc":"UA","lat":47.11,"lng":37.64,"pop":122175},"prymorskyi":{"cc":"UA","lat":47.07,"lng":37.5,"pop":71008},"desnyanskyi":{"cc":"UA","lat":51.51,"lng":31.32,"pop":179600},"novozavodskyi":{"cc":"UA","lat":51.49,"lng":31.26,"pop":179600},"korolyov":{"cc":"UA","lat":50.24,"lng":28.7,"pop":114034},"skhidni kvartaly":{"cc":"UA","lat":48.57,"lng":39.38,"pop":102500},"pivdenna borshchahivka":{"cc":"UA","lat":50.41,"lng":30.4,"pop":50500},"industrialnyi":{"cc":"UA","lat":49.95,"lng":36.37,"pop":157900},"nemyshlyanskyi":{"cc":"UA","lat":49.96,"lng":36.33,"pop":144200},"novobavarskyi":{"cc":"UA","lat":49.95,"lng":36.16,"pop":108100},"osnovyanskyi":{"cc":"UA","lat":49.94,"lng":36.24,"pop":93000},"saltivskyi":{"cc":"UA","lat":50.0,"lng":36.32,"pop":302600},"slobidskyi":{"cc":"UA","lat":49.94,"lng":36.28,"pop":146850},"kholodna hora":{"cc":"UA","lat":50.0,"lng":36.18,"pop":89000},"wakiso":{"cc":"UG","lat":0.4,"lng":32.46,"pop":87900},"soroti":{"cc":"UG","lat":1.71,"lng":33.61,"pop":60900},"rutoma":{"cc":"UG","lat":-0.57,"lng":30.38,"pop":86100},"njeru":{"cc":"UG","lat":0.44,"lng":33.18,"pop":178800},"mukono":{"cc":"UG","lat":0.35,"lng":32.76,"pop":191300},"mubende":{"cc":"UG","lat":0.56,"lng":31.39,"pop":121600},"mpondwe":{"cc":"UG","lat":0.04,"lng":29.72,"pop":58600},"mityana":{"cc":"UG","lat":0.42,"lng":32.02,"pop":105200},"mbarara":{"cc":"UG","lat":-0.6,"lng":30.65,"pop":221300},"masindi":{"cc":"UG","lat":1.67,"lng":31.71,"pop":110500},"masaka":{"cc":"UG","lat":-0.33,"lng":31.73,"pop":116600},"lugazi":{"cc":"UG","lat":0.37,"lng":32.94,"pop":128400},"lira":{"cc":"UG","lat":2.25,"lng":32.9,"pop":119323},"kotido":{"cc":"UG","lat":2.98,"lng":34.13,"pop":75700},"koboko":{"cc":"UG","lat":3.41,"lng":30.96,"pop":64500},"kitgum":{"cc":"UG","lat":3.28,"lng":32.89,"pop":56891},"kira":{"cc":"UG","lat":0.4,"lng":32.63,"pop":462900},"katabi":{"cc":"UG","lat":0.08,"lng":32.47,"pop":154300},"kasese":{"cc":"UG","lat":0.18,"lng":30.08,"pop":115400},"kasangati":{"cc":"UG","lat":0.44,"lng":32.6,"pop":207800},"kapchorwa":{"cc":"UG","lat":1.4,"lng":34.45,"pop":51200},"kamuli":{"cc":"UG","lat":0.95,"lng":33.12,"pop":67800},"kampala":{"cc":"UG","lat":0.32,"lng":32.58,"pop":1680600},"kajansi":{"cc":"UG","lat":0.22,"lng":32.53,"pop":135600},"kabale":{"cc":"UG","lat":-1.25,"lng":29.99,"pop":53200},"jinja":{"cc":"UG","lat":0.44,"lng":33.2,"pop":93061},"iganga":{"cc":"UG","lat":0.61,"lng":33.47,"pop":65500},"ibanda":{"cc":"UG","lat":-0.13,"lng":30.5,"pop":117700},"hoima":{"cc":"UG","lat":1.43,"lng":31.35,"pop":122700},"gulu":{"cc":"UG","lat":2.77,"lng":32.3,"pop":177400},"fort portal":{"cc":"UG","lat":0.66,"lng":30.27,"pop":60800},"entebbe":{"cc":"UG","lat":0.06,"lng":32.48,"pop":102600},"bwizibwera":{"cc":"UG","lat":-0.59,"lng":30.63,"pop":79157},"bunamwaya":{"cc":"UG","lat":0.25,"lng":32.56,"pop":413400},"arua":{"cc":"UG","lat":3.02,"lng":30.91,"pop":72400},"apac":{"cc":"UG","lat":1.98,"lng":32.54,"pop":67700},"nakivale refugee camp":{"cc":"UG","lat":-0.74,"lng":31.0,"pop":68400},"kyengera":{"cc":"UG","lat":0.3,"lng":32.5,"pop":285400},"nansana":{"cc":"UG","lat":0.36,"lng":32.53,"pop":532800},"cordova":{"cc":"US","lat":35.16,"lng":-89.78,"pop":68779},"decatur":{"cc":"US","lat":39.84,"lng":-88.95,"pop":73254},"dothan":{"cc":"US","lat":31.22,"lng":-85.39,"pop":68567},"hoover":{"cc":"US","lat":33.41,"lng":-86.81,"pop":84848},"huntsville":{"cc":"US","lat":34.73,"lng":-86.59,"pop":215006},"mobile":{"cc":"US","lat":30.69,"lng":-88.04,"pop":183289},"montgomery":{"cc":"US","lat":32.37,"lng":-86.3,"pop":195287},"tuscaloosa":{"cc":"US","lat":33.21,"lng":-87.57,"pop":111338},"conway":{"cc":"US","lat":35.09,"lng":-92.44,"pop":64980},"fayetteville":{"cc":"US","lat":35.05,"lng":-78.88,"pop":201963},"fort smith":{"cc":"US","lat":35.39,"lng":-94.4,"pop":88194},"jonesboro":{"cc":"US","lat":35.84,"lng":-90.7,"pop":73907},"little rock":{"cc":"US","lat":34.75,"lng":-92.29,"pop":202591},"north little rock":{"cc":"US","lat":34.77,"lng":-92.27,"pop":66504},"rogers":{"cc":"US","lat":36.33,"lng":-94.12,"pop":63159},"springdale":{"cc":"US","lat":36.19,"lng":-94.13,"pop":77859},"wilmington":{"cc":"US","lat":34.24,"lng":-77.95,"pop":115933},"allapattah":{"cc":"US","lat":25.81,"lng":-80.22,"pop":54289},"boca raton":{"cc":"US","lat":26.36,"lng":-80.08,"pop":93235},"bonita springs":{"cc":"US","lat":26.34,"lng":-81.78,"pop":51704},"boynton beach":{"cc":"US","lat":26.53,"lng":-80.07,"pop":73966},"bradenton":{"cc":"US","lat":27.5,"lng":-82.57,"pop":54437},"brandon":{"cc":"US","lat":27.94,"lng":-82.29,"pop":103483},"cape coral":{"cc":"US","lat":26.56,"lng":-81.95,"pop":175229},"carol city":{"cc":"US","lat":25.94,"lng":-80.25,"pop":63031},"clearwater":{"cc":"US","lat":27.97,"lng":-82.8,"pop":117292},"coconut creek":{"cc":"US","lat":26.25,"lng":-80.18,"pop":59302},"coral gables":{"cc":"US","lat":25.72,"lng":-80.27,"pop":51117},"coral springs":{"cc":"US","lat":26.27,"lng":-80.27,"pop":129485},"davie":{"cc":"US","lat":26.06,"lng":-80.23,"pop":100882},"daytona beach":{"cc":"US","lat":29.21,"lng":-81.02,"pop":72647},"deerfield beach":{"cc":"US","lat":26.32,"lng":-80.1,"pop":79768},"delray beach":{"cc":"US","lat":26.46,"lng":-80.07,"pop":66255},"deltona":{"cc":"US","lat":28.9,"lng":-81.26,"pop":88474},"doral":{"cc":"US","lat":25.82,"lng":-80.36,"pop":75874},"east pensacola heights":{"cc":"US","lat":30.43,"lng":-87.18,"pop":54104},"flagami":{"cc":"US","lat":25.76,"lng":-80.32,"pop":50834},"fort lauderdale":{"cc":"US","lat":26.12,"lng":-80.14,"pop":183146},"fort myers":{"cc":"US","lat":26.62,"lng":-81.84,"pop":74013},"fountainebleau":{"cc":"US","lat":25.77,"lng":-80.35,"pop":59764},"gainesville":{"cc":"US","lat":29.65,"lng":-82.32,"pop":145214},"hialeah":{"cc":"US","lat":25.86,"lng":-80.28,"pop":237069},"hollywood":{"cc":"US","lat":34.1,"lng":-118.33,"pop":167664},"homestead":{"cc":"US","lat":25.47,"lng":-80.48,"pop":80737},"jacksonville":{"cc":"US","lat":30.33,"lng":-81.66,"pop":1009833},"jupiter":{"cc":"US","lat":26.93,"lng":-80.09,"pop":62707},"kendale lakes":{"cc":"US","lat":25.71,"lng":-80.41,"pop":56148},"kendall":{"cc":"US","lat":25.68,"lng":-80.32,"pop":80241},"kissimmee":{"cc":"US","lat":28.3,"lng":-81.42,"pop":69152},"lakeland":{"cc":"US","lat":28.04,"lng":-81.95,"pop":104401},"largo":{"cc":"US","lat":27.91,"lng":-82.79,"pop":81000},"lauderhill":{"cc":"US","lat":26.14,"lng":-80.21,"pop":71579},"lehigh acres":{"cc":"US","lat":26.63,"lng":-81.62,"pop":86784},"miami":{"cc":"US","lat":25.77,"lng":-80.19,"pop":487014},"miami beach":{"cc":"US","lat":25.79,"lng":-80.13,"pop":92312},"miami gardens":{"cc":"US","lat":25.94,"lng":-80.25,"pop":113187},"north miami":{"cc":"US","lat":25.89,"lng":-80.19,"pop":62435},"north port":{"cc":"US","lat":27.04,"lng":-82.24,"pop":62345},"ocala":{"cc":"US","lat":29.19,"lng":-82.14,"pop":58218},"orlando":{"cc":"US","lat":28.54,"lng":-81.38,"pop":334854},"palm bay":{"cc":"US","lat":28.03,"lng":-80.59,"pop":119760},"palm beach gardens":{"cc":"US","lat":26.82,"lng":-80.14,"pop":52923},"palm coast":{"cc":"US","lat":29.58,"lng":-81.21,"pop":82893},"palm harbor":{"cc":"US","lat":28.08,"lng":-82.76,"pop":57439},"pembroke pines":{"cc":"US","lat":26.0,"lng":-80.22,"pop":166611},"pensacola":{"cc":"US","lat":30.42,"lng":-87.22,"pop":53724},"pine hills":{"cc":"US","lat":28.56,"lng":-81.45,"pop":60076},"pinellas park":{"cc":"US","lat":27.84,"lng":-82.7,"pop":51617},"plantation":{"cc":"US","lat":26.13,"lng":-80.23,"pop":92560},"poinciana":{"cc":"US","lat":28.14,"lng":-81.46,"pop":53193},"pompano beach":{"cc":"US","lat":26.24,"lng":-80.12,"pop":107762},"port charlotte":{"cc":"US","lat":26.98,"lng":-82.09,"pop":54392},"port orange":{"cc":"US","lat":29.14,"lng":-81.0,"pop":59866},"port saint lucie":{"cc":"US","lat":27.29,"lng":-80.35,"pop":164603},"riverview":{"cc":"US","lat":27.87,"lng":-82.33,"pop":71050},"st petersburg":{"cc":"US","lat":27.77,"lng":-82.68,"pop":257083},"sanford":{"cc":"US","lat":28.8,"lng":-81.27,"pop":58111},"sarasota":{"cc":"US","lat":27.34,"lng":-82.53,"pop":55118},"spring hill":{"cc":"US","lat":28.48,"lng":-82.53,"pop":98621},"sunrise":{"cc":"US","lat":26.13,"lng":-80.11,"pop":84439},"tallahassee":{"cc":"US","lat":30.44,"lng":-84.28,"pop":201731},"tamarac":{"cc":"US","lat":26.21,"lng":-80.25,"pop":64681},"tamiami":{"cc":"US","lat":25.76,"lng":-80.4,"pop":55271},"tampa":{"cc":"US","lat":27.95,"lng":-82.46,"pop":414547},"the hammocks":{"cc":"US","lat":25.67,"lng":-80.44,"pop":51003},"the villages":{"cc":"US","lat":28.93,"lng":-81.96,"pop":51442},"town n country":{"cc":"US","lat":28.01,"lng":-82.58,"pop":78442},"west hollywood":{"cc":"US","lat":26.02,"lng":-80.18,"pop":60806},"west palm beach":{"cc":"US","lat":26.72,"lng":-80.05,"pop":120932},"weston":{"cc":"US","lat":26.1,"lng":-80.4,"pop":69959},"albany":{"cc":"US","lat":42.65,"lng":-73.76,"pop":101228},"alpharetta":{"cc":"US","lat":34.08,"lng":-84.29,"pop":63693},"atlanta":{"cc":"US","lat":33.75,"lng":-84.39,"pop":510823},"brookhaven":{"cc":"US","lat":33.86,"lng":-84.34,"pop":51910},"columbus":{"cc":"US","lat":39.96,"lng":-83.0,"pop":913175},"macon":{"cc":"US","lat":32.84,"lng":-83.63,"pop":91351},"marietta":{"cc":"US","lat":33.95,"lng":-84.55,"pop":59067},"roswell":{"cc":"US","lat":34.02,"lng":-84.36,"pop":94501},"sandy springs":{"cc":"US","lat":33.92,"lng":-84.38,"pop":105330},"savannah":{"cc":"US","lat":32.08,"lng":-81.1,"pop":147780},"smyrna":{"cc":"US","lat":33.88,"lng":-84.51,"pop":56146},"valdosta":{"cc":"US","lat":30.83,"lng":-83.28,"pop":55724},"warner robins":{"cc":"US","lat":32.62,"lng":-83.63,"pop":73490},"springfield":{"cc":"US","lat":37.22,"lng":-93.3,"pop":170188},"bloomington":{"cc":"US","lat":44.84,"lng":-93.3,"pop":86435},"carmel":{"cc":"US","lat":39.98,"lng":-86.12,"pop":88713},"evansville":{"cc":"US","lat":37.97,"lng":-87.56,"pop":119943},"fishers":{"cc":"US","lat":39.96,"lng":-86.01,"pop":76794},"greenwood":{"cc":"US","lat":39.61,"lng":-86.11,"pop":55586},"indianapolis":{"cc":"US","lat":39.77,"lng":-86.16,"pop":887642},"terre haute":{"cc":"US","lat":39.47,"lng":-87.41,"pop":60825},"kansas city":{"cc":"US","lat":39.1,"lng":-94.58,"pop":475378},"lawrence":{"cc":"US","lat":38.97,"lng":-95.24,"pop":93917},"lenexa":{"cc":"US","lat":38.95,"lng":-94.73,"pop":52490},"manhattan":{"cc":"US","lat":40.78,"lng":-73.97,"pop":1487536},"olathe":{"cc":"US","lat":38.88,"lng":-94.82,"pop":134305},"overland park":{"cc":"US","lat":38.98,"lng":-94.67,"pop":186515},"shawnee":{"cc":"US","lat":39.04,"lng":-94.72,"pop":65046},"topeka":{"cc":"US","lat":39.05,"lng":-95.68,"pop":125963},"wichita":{"cc":"US","lat":37.69,"lng":-97.34,"pop":396119},"bowling green":{"cc":"US","lat":36.99,"lng":-86.44,"pop":63616},"lexington":{"cc":"US","lat":37.99,"lng":-84.48,"pop":320347},"lexington-fayette":{"cc":"US","lat":38.05,"lng":-84.46,"pop":314488},"louisville":{"cc":"US","lat":38.25,"lng":-85.76,"pop":624444},"meads":{"cc":"US","lat":38.41,"lng":-82.71,"pop":288649},"owensboro":{"cc":"US","lat":37.77,"lng":-87.11,"pop":59042},"baton rouge":{"cc":"US","lat":30.44,"lng":-91.19,"pop":227470},"bossier city":{"cc":"US","lat":32.52,"lng":-93.73,"pop":68094},"kenner":{"cc":"US","lat":29.99,"lng":-90.24,"pop":67091},"lafayette":{"cc":"US","lat":30.22,"lng":-92.02,"pop":121374},"lake charles":{"cc":"US","lat":30.21,"lng":-93.2,"pop":76070},"metairie":{"cc":"US","lat":29.98,"lng":-90.15,"pop":138481},"metairie terrace":{"cc":"US","lat":29.98,"lng":-90.16,"pop":142489},"new orleans":{"cc":"US","lat":29.95,"lng":-90.08,"pop":362701},"shreveport":{"cc":"US","lat":32.53,"lng":-93.75,"pop":187593},"baltimore":{"cc":"US","lat":39.29,"lng":-76.61,"pop":585708},"bethesda":{"cc":"US","lat":38.98,"lng":-77.1,"pop":60858},"bowie":{"cc":"US","lat":38.94,"lng":-76.73,"pop":58025},"columbia":{"cc":"US","lat":34.0,"lng":-81.03,"pop":142416},"dundalk":{"cc":"US","lat":39.25,"lng":-76.52,"pop":63597},"ellicott city":{"cc":"US","lat":39.27,"lng":-76.8,"pop":65834},"frederick":{"cc":"US","lat":39.41,"lng":-77.41,"pop":69479},"gaithersburg":{"cc":"US","lat":39.14,"lng":-77.2,"pop":67456},"germantown":{"cc":"US","lat":39.17,"lng":-77.27,"pop":86395},"glen burnie":{"cc":"US","lat":39.16,"lng":-76.62,"pop":67639},"rockville":{"cc":"US","lat":39.08,"lng":-77.15,"pop":66980},"silver spring":{"cc":"US","lat":38.99,"lng":-77.03,"pop":71452},"towson":{"cc":"US","lat":39.4,"lng":-76.6,"pop":55197},"waldorf":{"cc":"US","lat":38.62,"lng":-76.94,"pop":67752},"blue springs":{"cc":"US","lat":39.02,"lng":-94.28,"pop":54148},"east independence":{"cc":"US","lat":39.1,"lng":-94.36,"pop":110675},"florissant":{"cc":"US","lat":38.79,"lng":-90.32,"pop":52268},"independence":{"cc":"US","lat":39.09,"lng":-94.42,"pop":117255},"joplin":{"cc":"US","lat":37.08,"lng":-94.51,"pop":51818},"lees summit":{"cc":"US","lat":38.91,"lng":-94.38,"pop":95094},"ofallon":{"cc":"US","lat":38.81,"lng":-90.7,"pop":85040},"saint charles":{"cc":"US","lat":38.78,"lng":-90.48,"pop":65794},"saint joseph":{"cc":"US","lat":39.77,"lng":-94.85,"pop":76780},"st louis":{"cc":"US","lat":38.63,"lng":-90.2,"pop":279695},"gulfport":{"cc":"US","lat":30.37,"lng":-89.09,"pop":71856},"jackson":{"cc":"US","lat":32.3,"lng":-90.18,"pop":153701},"southaven":{"cc":"US","lat":34.99,"lng":-90.01,"pop":52589},"west gulfport":{"cc":"US","lat":30.4,"lng":-89.09,"pop":71329},"asheville":{"cc":"US","lat":35.6,"lng":-82.55,"pop":95056},"cary":{"cc":"US","lat":35.79,"lng":-78.78,"pop":159769},"chapel hill":{"cc":"US","lat":35.91,"lng":-79.06,"pop":59568},"charlotte":{"cc":"US","lat":35.23,"lng":-80.84,"pop":911311},"concord":{"cc":"US","lat":37.98,"lng":-122.03,"pop":128667},"durham":{"cc":"US","lat":35.99,"lng":-78.9,"pop":257636},"gastonia":{"cc":"US","lat":35.26,"lng":-81.19,"pop":74543},"greensboro":{"cc":"US","lat":36.07,"lng":-79.79,"pop":285342},"greenville":{"cc":"US","lat":35.61,"lng":-77.37,"pop":90597},"high point":{"cc":"US","lat":35.96,"lng":-80.01,"pop":110268},"huntersville":{"cc":"US","lat":35.41,"lng":-80.84,"pop":52704},"raleigh":{"cc":"US","lat":35.77,"lng":-78.64,"pop":482295},"rocky mount":{"cc":"US","lat":35.94,"lng":-77.79,"pop":55806},"west raleigh":{"cc":"US","lat":35.79,"lng":-78.66,"pop":338759},"winston-salem":{"cc":"US","lat":36.1,"lng":-80.24,"pop":241218},"camden":{"cc":"US","lat":39.93,"lng":-75.12,"pop":76119},"cherry hill":{"cc":"US","lat":39.93,"lng":-75.03,"pop":70475},"south vineland":{"cc":"US","lat":39.45,"lng":-75.03,"pop":58122},"toms river":{"cc":"US","lat":39.95,"lng":-74.2,"pop":88791},"vineland":{"cc":"US","lat":39.49,"lng":-75.03,"pop":60818},"cincinnati":{"cc":"US","lat":39.13,"lng":-84.51,"pop":311097},"dayton":{"cc":"US","lat":39.76,"lng":-84.19,"pop":135512},"broken arrow":{"cc":"US","lat":36.05,"lng":-95.79,"pop":106563},"edmond":{"cc":"US","lat":35.65,"lng":-97.48,"pop":90092},"enid":{"cc":"US","lat":36.4,"lng":-97.88,"pop":51776},"lawton":{"cc":"US","lat":34.61,"lng":-98.39,"pop":96655},"midwest city":{"cc":"US","lat":35.45,"lng":-97.4,"pop":57249},"moore":{"cc":"US","lat":35.34,"lng":-97.49,"pop":60451},"norman":{"cc":"US","lat":35.22,"lng":-97.44,"pop":128026},"oklahoma city":{"cc":"US","lat":35.47,"lng":-97.52,"pop":681054},"tulsa":{"cc":"US","lat":36.15,"lng":-95.99,"pop":413066},"havertown":{"cc":"US","lat":39.98,"lng":-75.31,"pop":50430},"philadelphia":{"cc":"US","lat":39.95,"lng":-75.16,"pop":1573916},"charleston":{"cc":"US","lat":32.78,"lng":-79.93,"pop":132609},"mount pleasant":{"cc":"US","lat":32.79,"lng":-79.86,"pop":81317},"north charleston":{"cc":"US","lat":32.85,"lng":-79.97,"pop":108304},"rock hill":{"cc":"US","lat":34.92,"lng":-81.03,"pop":71548},"bartlett":{"cc":"US","lat":35.2,"lng":-89.87,"pop":58579},"chattanooga":{"cc":"US","lat":35.05,"lng":-85.31,"pop":181099},"clarksville":{"cc":"US","lat":36.53,"lng":-87.36,"pop":166722},"east chattanooga":{"cc":"US","lat":35.07,"lng":-85.25,"pop":154024},"franklin":{"cc":"US","lat":35.93,"lng":-86.87,"pop":72639},"hendersonville":{"cc":"US","lat":36.3,"lng":-86.62,"pop":56018},"johnson city":{"cc":"US","lat":36.31,"lng":-82.35,"pop":66027},"kingsport":{"cc":"US","lat":36.55,"lng":-82.56,"pop":53014},"knoxville":{"cc":"US","lat":35.96,"lng":-83.92,"pop":190740},"memphis":{"cc":"US","lat":35.15,"lng":-90.05,"pop":633104},"murfreesboro":{"cc":"US","lat":35.85,"lng":-86.39,"pop":165430},"nashville":{"cc":"US","lat":36.17,"lng":-86.78,"pop":689447},"new south memphis":{"cc":"US","lat":35.09,"lng":-90.06,"pop":641608},"abilene":{"cc":"US","lat":32.45,"lng":-99.73,"pop":125182},"alief":{"cc":"US","lat":29.71,"lng":-95.6,"pop":98725},"allen":{"cc":"US","lat":33.1,"lng":-96.67,"pop":98143},"arlington":{"cc":"US","lat":32.74,"lng":-97.11,"pop":388125},"atascocita":{"cc":"US","lat":30.0,"lng":-95.18,"pop":65844},"austin":{"cc":"US","lat":30.27,"lng":-97.74,"pop":974447},"baytown":{"cc":"US","lat":29.74,"lng":-94.98,"pop":76335},"beaumont":{"cc":"US","lat":30.09,"lng":-94.1,"pop":115282},"brownsville":{"cc":"US","lat":25.9,"lng":-97.5,"pop":186738},"bryan":{"cc":"US","lat":30.67,"lng":-96.37,"pop":82118},"carrollton":{"cc":"US","lat":32.95,"lng":-96.89,"pop":133168},"cedar park":{"cc":"US","lat":30.51,"lng":-97.82,"pop":65945},"celina":{"cc":"US","lat":33.32,"lng":-96.78,"pop":64427},"college station":{"cc":"US","lat":30.63,"lng":-96.33,"pop":107889},"conroe":{"cc":"US","lat":30.31,"lng":-95.46,"pop":68602},"corpus christi":{"cc":"US","lat":27.8,"lng":-97.4,"pop":316239},"cypress":{"cc":"US","lat":29.97,"lng":-95.7,"pop":200839},"dallas":{"cc":"US","lat":32.78,"lng":-96.81,"pop":1326087},"desoto":{"cc":"US","lat":32.59,"lng":-96.86,"pop":52486},"denton":{"cc":"US","lat":33.21,"lng":-97.13,"pop":131044},"edinburg":{"cc":"US","lat":26.3,"lng":-98.16,"pop":84497},"euless":{"cc":"US","lat":32.84,"lng":-97.08,"pop":54219},"flower mound":{"cc":"US","lat":33.01,"lng":-97.1,"pop":71253},"fort worth":{"cc":"US","lat":32.73,"lng":-97.32,"pop":1008106},"frisco":{"cc":"US","lat":33.15,"lng":-96.82,"pop":154407},"galveston":{"cc":"US","lat":29.3,"lng":-94.8,"pop":50180},"garland":{"cc":"US","lat":32.91,"lng":-96.64,"pop":236897},"grand prairie":{"cc":"US","lat":32.75,"lng":-97.0,"pop":187809},"grapevine":{"cc":"US","lat":32.93,"lng":-97.08,"pop":51404},"harlingen":{"cc":"US","lat":26.19,"lng":-97.7,"pop":65774},"houston":{"cc":"US","lat":29.76,"lng":-95.36,"pop":2314157},"irving":{"cc":"US","lat":32.81,"lng":-96.95,"pop":236607},"killeen":{"cc":"US","lat":31.12,"lng":-97.73,"pop":140806},"laredo":{"cc":"US","lat":27.51,"lng":-99.51,"pop":256153},"league city":{"cc":"US","lat":29.51,"lng":-95.09,"pop":98312},"leander":{"cc":"US","lat":30.58,"lng":-97.85,"pop":59202},"lewisville":{"cc":"US","lat":33.05,"lng":-96.99,"pop":104039},"longview":{"cc":"US","lat":32.5,"lng":-94.74,"pop":82287},"mcallen":{"cc":"US","lat":26.2,"lng":-98.23,"pop":140269},"mckinney":{"cc":"US","lat":33.2,"lng":-96.62,"pop":162898},"mesquite":{"cc":"US","lat":32.77,"lng":-96.6,"pop":144788},"mission":{"cc":"US","lat":26.22,"lng":-98.33,"pop":83298},"missouri city":{"cc":"US","lat":29.62,"lng":-95.54,"pop":74139},"new braunfels":{"cc":"US","lat":29.7,"lng":-98.12,"pop":70543},"north richland hills":{"cc":"US","lat":32.83,"lng":-97.23,"pop":69204},"pasadena":{"cc":"US","lat":29.69,"lng":-95.21,"pop":153784},"pearland":{"cc":"US","lat":29.56,"lng":-95.29,"pop":108821},"pflugerville":{"cc":"US","lat":30.44,"lng":-97.62,"pop":57122},"pharr":{"cc":"US","lat":26.19,"lng":-98.18,"pop":76538},"plano":{"cc":"US","lat":33.02,"lng":-96.7,"pop":283558},"port arthur":{"cc":"US","lat":29.89,"lng":-93.94,"pop":55340},"richardson":{"cc":"US","lat":32.95,"lng":-96.73,"pop":110815},"round rock":{"cc":"US","lat":30.51,"lng":-97.68,"pop":115997},"rowlett":{"cc":"US","lat":32.9,"lng":-96.56,"pop":60236},"spring":{"cc":"US","lat":30.08,"lng":-95.42,"pop":54298},"sugar land":{"cc":"US","lat":29.62,"lng":-95.63,"pop":88156},"temple":{"cc":"US","lat":31.1,"lng":-97.34,"pop":72277},"the woodlands":{"cc":"US","lat":30.16,"lng":-95.49,"pop":93847},"tyler":{"cc":"US","lat":32.35,"lng":-95.3,"pop":103700},"university of texas":{"cc":"US","lat":30.29,"lng":-97.74,"pop":53082},"waco":{"cc":"US","lat":31.55,"lng":-97.15,"pop":132356},"wichita falls":{"cc":"US","lat":33.91,"lng":-98.49,"pop":104710},"centreville":{"cc":"US","lat":38.84,"lng":-77.43,"pop":71135},"chesapeake":{"cc":"US","lat":36.82,"lng":-76.27,"pop":235429},"dale city":{"cc":"US","lat":38.64,"lng":-77.31,"pop":65969},"east hampton":{"cc":"US","lat":37.04,"lng":-76.33,"pop":147993},"hampton":{"cc":"US","lat":37.03,"lng":-76.35,"pop":137148},"harrisonburg":{"cc":"US","lat":38.45,"lng":-78.87,"pop":52538},"leesburg":{"cc":"US","lat":39.12,"lng":-77.56,"pop":51209},"lynchburg":{"cc":"US","lat":37.41,"lng":-79.14,"pop":79812},"newport news":{"cc":"US","lat":36.98,"lng":-76.43,"pop":186247},"norfolk":{"cc":"US","lat":36.85,"lng":-76.29,"pop":238005},"portsmouth heights":{"cc":"US","lat":36.82,"lng":-76.37,"pop":99049},"reston":{"cc":"US","lat":38.97,"lng":-77.34,"pop":58404},"roanoke":{"cc":"US","lat":37.27,"lng":-79.94,"pop":100011},"south suffolk":{"cc":"US","lat":36.72,"lng":-76.59,"pop":80690},"suffolk":{"cc":"US","lat":36.73,"lng":-76.58,"pop":88161},"virginia beach":{"cc":"US","lat":36.85,"lng":-75.98,"pop":454808},"west lynchburg":{"cc":"US","lat":37.4,"lng":-79.18,"pop":65517},"auburn":{"cc":"US","lat":47.31,"lng":-122.23,"pop":77006},"revere":{"cc":"US","lat":42.41,"lng":-71.01,"pop":53422},"danbury":{"cc":"US","lat":41.39,"lng":-73.45,"pop":84657},"east hartford":{"cc":"US","lat":41.78,"lng":-72.61,"pop":51252},"east norwalk":{"cc":"US","lat":41.11,"lng":-73.4,"pop":84530},"fairfield":{"cc":"US","lat":38.25,"lng":-122.04,"pop":112970},"hamden":{"cc":"US","lat":41.4,"lng":-72.9,"pop":59847},"hartford":{"cc":"US","lat":41.76,"lng":-72.69,"pop":121054},"meriden":{"cc":"US","lat":41.54,"lng":-72.81,"pop":59988},"milford":{"cc":"US","lat":41.22,"lng":-73.06,"pop":52759},"new britain":{"cc":"US","lat":41.66,"lng":-72.78,"pop":72808},"new haven":{"cc":"US","lat":41.31,"lng":-72.93,"pop":130322},"north stamford":{"cc":"US","lat":41.14,"lng":-73.54,"pop":121230},"norwalk":{"cc":"US","lat":33.9,"lng":-118.08,"pop":107140},"stamford":{"cc":"US","lat":41.05,"lng":-73.54,"pop":128874},"stratford":{"cc":"US","lat":41.18,"lng":-73.13,"pop":51384},"waterbury":{"cc":"US","lat":41.56,"lng":-73.05,"pop":108802},"west hartford":{"cc":"US","lat":41.76,"lng":-72.74,"pop":63268},"west haven":{"cc":"US","lat":41.27,"lng":-72.95,"pop":54927},"ames":{"cc":"US","lat":42.03,"lng":-93.62,"pop":65060},"ankeny":{"cc":"US","lat":41.73,"lng":-93.61,"pop":56764},"cedar rapids":{"cc":"US","lat":42.01,"lng":-91.64,"pop":130405},"council bluffs":{"cc":"US","lat":41.26,"lng":-95.86,"pop":62597},"davenport":{"cc":"US","lat":41.52,"lng":-90.58,"pop":102582},"des moines":{"cc":"US","lat":41.6,"lng":-93.61,"pop":214133},"dubuque":{"cc":"US","lat":42.5,"lng":-90.66,"pop":58799},"iowa city":{"cc":"US","lat":41.66,"lng":-91.53,"pop":74220},"sioux city":{"cc":"US","lat":42.5,"lng":-96.4,"pop":82821},"west des moines":{"cc":"US","lat":41.58,"lng":-93.71,"pop":64113},"albany park":{"cc":"US","lat":41.97,"lng":-87.72,"pop":52079},"arlington heights":{"cc":"US","lat":42.09,"lng":-87.98,"pop":75926},"belmont cragin":{"cc":"US","lat":41.93,"lng":-87.77,"pop":79159},"berwyn":{"cc":"US","lat":41.85,"lng":-87.79,"pop":56368},"bolingbrook":{"cc":"US","lat":41.7,"lng":-88.07,"pop":74306},"champaign":{"cc":"US","lat":40.12,"lng":-88.24,"pop":86096},"chicago":{"cc":"US","lat":41.85,"lng":-87.65,"pop":2664452},"chicago lawn":{"cc":"US","lat":41.78,"lng":-87.7,"pop":55551},"cicero":{"cc":"US","lat":41.85,"lng":-87.75,"pop":83886},"des plaines":{"cc":"US","lat":42.03,"lng":-87.88,"pop":58677},"edgewater":{"cc":"US","lat":41.98,"lng":-87.66,"pop":54873},"elgin":{"cc":"US","lat":42.04,"lng":-88.28,"pop":112111},"evanston":{"cc":"US","lat":42.04,"lng":-87.69,"pop":75527},"hoffman estates":{"cc":"US","lat":42.04,"lng":-88.08,"pop":52138},"irving park":{"cc":"US","lat":41.95,"lng":-87.74,"pop":56520},"joliet":{"cc":"US","lat":41.53,"lng":-88.08,"pop":147861},"lincoln park":{"cc":"US","lat":41.92,"lng":-87.65,"pop":66959},"logan square":{"cc":"US","lat":41.92,"lng":-87.7,"pop":73702},"mount prospect":{"cc":"US","lat":42.07,"lng":-87.94,"pop":54747},"naperville":{"cc":"US","lat":41.79,"lng":-88.15,"pop":147100},"near north side":{"cc":"US","lat":41.9,"lng":-87.63,"pop":85711},"normal":{"cc":"US","lat":40.51,"lng":-88.99,"pop":54373},"north peoria":{"cc":"US","lat":40.72,"lng":-89.58,"pop":113004},"oak lawn":{"cc":"US","lat":41.71,"lng":-87.76,"pop":56781},"oak park":{"cc":"US","lat":41.89,"lng":-87.78,"pop":52287},"orland park":{"cc":"US","lat":41.63,"lng":-87.85,"pop":58619},"palatine":{"cc":"US","lat":42.11,"lng":-88.03,"pop":69308},"peoria":{"cc":"US","lat":33.58,"lng":-112.24,"pop":190985},"portage park":{"cc":"US","lat":41.96,"lng":-87.77,"pop":64841},"rockford":{"cc":"US","lat":42.27,"lng":-89.09,"pop":148278},"rogers park":{"cc":"US","lat":42.01,"lng":-87.67,"pop":54402},"schaumburg":{"cc":"US","lat":42.03,"lng":-88.08,"pop":74693},"skokie":{"cc":"US","lat":42.03,"lng":-87.73,"pop":64821},"south lawndale":{"cc":"US","lat":41.84,"lng":-87.71,"pop":73826},"south shore":{"cc":"US","lat":41.76,"lng":-87.58,"pop":51451},"tinley park":{"cc":"US","lat":41.57,"lng":-87.78,"pop":57143},"uptown":{"cc":"US","lat":41.97,"lng":-87.65,"pop":55137},"waukegan":{"cc":"US","lat":42.36,"lng":-87.84,"pop":88475},"west ridge":{"cc":"US","lat":42.0,"lng":-87.69,"pop":72211},"west town":{"cc":"US","lat":41.89,"lng":-87.67,"pop":86429},"wheaton":{"cc":"US","lat":41.87,"lng":-88.11,"pop":53715},"anderson":{"cc":"US","lat":40.11,"lng":-85.68,"pop":55305},"elkhart":{"cc":"US","lat":41.68,"lng":-85.98,"pop":52348},"fort wayne":{"cc":"US","lat":41.13,"lng":-85.13,"pop":260326},"gary":{"cc":"US","lat":41.59,"lng":-87.35,"pop":77156},"hammond":{"cc":"US","lat":41.58,"lng":-87.5,"pop":77614},"kokomo":{"cc":"US","lat":40.49,"lng":-86.13,"pop":57995},"muncie":{"cc":"US","lat":40.19,"lng":-85.39,"pop":70087},"noblesville":{"cc":"US","lat":40.05,"lng":-86.01,"pop":59093},"south bend":{"cc":"US","lat":41.68,"lng":-86.25,"pop":101516},"boston":{"cc":"US","lat":42.36,"lng":-71.06,"pop":653833},"brockton":{"cc":"US","lat":42.08,"lng":-71.02,"pop":95314},"brookline":{"cc":"US","lat":42.33,"lng":-71.12,"pop":58732},"chicopee":{"cc":"US","lat":42.15,"lng":-72.61,"pop":56741},"dorchester":{"cc":"US","lat":42.3,"lng":-71.07,"pop":97826},"fall river":{"cc":"US","lat":41.7,"lng":-71.16,"pop":94000},"framingham":{"cc":"US","lat":42.28,"lng":-71.42,"pop":68318},"framingham center":{"cc":"US","lat":42.3,"lng":-71.44,"pop":65413},"haverhill":{"cc":"US","lat":42.78,"lng":-71.08,"pop":62765},"lowell":{"cc":"US","lat":42.63,"lng":-71.32,"pop":110699},"lynn":{"cc":"US","lat":42.47,"lng":-70.95,"pop":92457},"malden":{"cc":"US","lat":42.43,"lng":-71.07,"pop":61068},"medford":{"cc":"US","lat":42.33,"lng":-122.88,"pop":79805},"methuen":{"cc":"US","lat":42.73,"lng":-71.19,"pop":52044},"new bedford":{"cc":"US","lat":41.64,"lng":-70.93,"pop":101079},"north chicopee":{"cc":"US","lat":42.18,"lng":-72.6,"pop":55179},"peabody":{"cc":"US","lat":42.53,"lng":-70.93,"pop":52504},"quincy":{"cc":"US","lat":42.25,"lng":-71.0,"pop":93618},"somerville":{"cc":"US","lat":42.39,"lng":-71.1,"pop":80318},"south boston":{"cc":"US","lat":42.33,"lng":-71.05,"pop":571281},"south peabody":{"cc":"US","lat":42.51,"lng":-70.95,"pop":50293},"waltham":{"cc":"US","lat":42.38,"lng":-71.24,"pop":63378},"portland":{"cc":"US","lat":45.52,"lng":-122.68,"pop":652503},"ann arbor":{"cc":"US","lat":42.28,"lng":-83.74,"pop":117070},"battle creek":{"cc":"US","lat":42.32,"lng":-85.18,"pop":51589},"canton":{"cc":"US","lat":42.31,"lng":-83.48,"pop":86825},"clinton township":{"cc":"US","lat":42.59,"lng":-82.92,"pop":99753},"dearborn":{"cc":"US","lat":42.32,"lng":-83.18,"pop":95171},"dearborn heights":{"cc":"US","lat":42.34,"lng":-83.27,"pop":56145},"detroit":{"cc":"US","lat":42.33,"lng":-83.05,"pop":645705},"farmington hills":{"cc":"US","lat":42.49,"lng":-83.38,"pop":81330},"flint":{"cc":"US","lat":43.01,"lng":-83.69,"pop":98310},"grand rapids":{"cc":"US","lat":42.96,"lng":-85.67,"pop":195097},"kalamazoo":{"cc":"US","lat":42.29,"lng":-85.59,"pop":76041},"kentwood":{"cc":"US","lat":42.87,"lng":-85.64,"pop":51357},"lansing":{"cc":"US","lat":42.73,"lng":-84.56,"pop":112644},"livonia":{"cc":"US","lat":42.37,"lng":-83.35,"pop":94635},"novi":{"cc":"US","lat":42.48,"lng":-83.48,"pop":58723},"pontiac":{"cc":"US","lat":42.64,"lng":-83.29,"pop":59917},"rochester hills":{"cc":"US","lat":42.66,"lng":-83.15,"pop":73424},"royal oak":{"cc":"US","lat":42.49,"lng":-83.14,"pop":59008},"shelby":{"cc":"US","lat":42.67,"lng":-83.03,"pop":74099},"southfield":{"cc":"US","lat":42.47,"lng":-83.22,"pop":73156},"saint clair shores":{"cc":"US","lat":42.5,"lng":-82.89,"pop":59715},"sterling heights":{"cc":"US","lat":42.58,"lng":-83.03,"pop":132052},"taylor":{"cc":"US","lat":42.24,"lng":-83.27,"pop":61568},"troy":{"cc":"US","lat":42.61,"lng":-83.15,"pop":83280},"warren":{"cc":"US","lat":42.49,"lng":-83.01,"pop":134056},"westland":{"cc":"US","lat":42.32,"lng":-83.4,"pop":82000},"wyoming":{"cc":"US","lat":42.91,"lng":-85.71,"pop":75275},"apple valley":{"cc":"US","lat":34.5,"lng":-117.19,"pop":72174},"blaine":{"cc":"US","lat":45.16,"lng":-93.23,"pop":62124},"brooklyn park":{"cc":"US","lat":45.09,"lng":-93.36,"pop":79149},"burnsville":{"cc":"US","lat":44.77,"lng":-93.28,"pop":61481},"coon rapids":{"cc":"US","lat":45.12,"lng":-93.29,"pop":62240},"duluth":{"cc":"US","lat":46.78,"lng":-92.11,"pop":86110},"eagan":{"cc":"US","lat":44.8,"lng":-93.17,"pop":66286},"eden prairie":{"cc":"US","lat":44.85,"lng":-93.47,"pop":63496},"edina":{"cc":"US","lat":44.89,"lng":-93.35,"pop":50138},"lakeville":{"cc":"US","lat":44.65,"lng":-93.24,"pop":60633},"maple grove":{"cc":"US","lat":45.07,"lng":-93.46,"pop":68385},"minneapolis":{"cc":"US","lat":44.98,"lng":-93.26,"pop":410939},"minnetonka":{"cc":"US","lat":44.91,"lng":-93.5,"pop":51669},"minnetonka mills":{"cc":"US","lat":44.94,"lng":-93.44,"pop":50117},"rochester":{"cc":"US","lat":43.15,"lng":-77.62,"pop":209802},"saint cloud":{"cc":"US","lat":45.56,"lng":-94.16,"pop":65842},"saint paul":{"cc":"US","lat":44.94,"lng":-93.09,"pop":303176},"west coon rapids":{"cc":"US","lat":45.16,"lng":-93.35,"pop":62528},"woodbury":{"cc":"US","lat":44.92,"lng":-92.96,"pop":67855},"fargo":{"cc":"US","lat":46.88,"lng":-96.79,"pop":118523},"grand forks":{"cc":"US","lat":47.93,"lng":-97.03,"pop":57011},"bellevue":{"cc":"US","lat":47.61,"lng":-122.2,"pop":139820},"grand island":{"cc":"US","lat":40.93,"lng":-98.34,"pop":51440},"omaha":{"cc":"US","lat":41.26,"lng":-95.94,"pop":486051},"nashua":{"cc":"US","lat":42.77,"lng":-71.47,"pop":87970},"bayonne":{"cc":"US","lat":40.67,"lng":-74.11,"pop":66311},"brick":{"cc":"US","lat":40.06,"lng":-74.14,"pop":76021},"clifton":{"cc":"US","lat":40.86,"lng":-74.16,"pop":86334},"east orange":{"cc":"US","lat":40.77,"lng":-74.2,"pop":64949},"edison":{"cc":"US","lat":40.52,"lng":-74.41,"pop":102548},"elizabeth":{"cc":"US","lat":40.66,"lng":-74.21,"pop":129007},"hoboken":{"cc":"US","lat":40.74,"lng":-74.03,"pop":53635},"irvington":{"cc":"US","lat":40.73,"lng":-74.23,"pop":61323},"jersey city":{"cc":"US","lat":40.73,"lng":-74.08,"pop":264290},"middletown":{"cc":"US","lat":40.39,"lng":-74.12,"pop":65490},"new brunswick":{"cc":"US","lat":40.49,"lng":-74.45,"pop":57035},"newark":{"cc":"US","lat":40.74,"lng":-74.17,"pop":281944},"north bergen":{"cc":"US","lat":40.8,"lng":-74.01,"pop":63484},"parsippany":{"cc":"US","lat":40.86,"lng":-74.43,"pop":51144},"passaic":{"cc":"US","lat":40.86,"lng":-74.13,"pop":71085},"paterson":{"cc":"US","lat":40.92,"lng":-74.17,"pop":147754},"perth amboy":{"cc":"US","lat":40.51,"lng":-74.27,"pop":52682},"piscataway":{"cc":"US","lat":40.5,"lng":-74.4,"pop":56044},"plainfield":{"cc":"US","lat":40.63,"lng":-74.41,"pop":51217},"trenton":{"cc":"US","lat":40.22,"lng":-74.74,"pop":89620},"union":{"cc":"US","lat":40.7,"lng":-74.26,"pop":56771},"union city":{"cc":"US","lat":37.6,"lng":-122.02,"pop":74494},"wayne":{"cc":"US","lat":40.93,"lng":-74.28,"pop":57915},"west new york":{"cc":"US","lat":40.79,"lng":-74.01,"pop":53366},"amherst":{"cc":"US","lat":42.98,"lng":-78.8,"pop":122366},"astoria":{"cc":"US","lat":40.77,"lng":-73.93,"pop":150165},"bayside":{"cc":"US","lat":40.77,"lng":-73.78,"pop":66455},"bensonhurst":{"cc":"US","lat":40.6,"lng":-73.99,"pop":60000},"borough park":{"cc":"US","lat":40.63,"lng":-74.0,"pop":149248},"the bronx":{"cc":"US","lat":40.85,"lng":-73.87,"pop":1385108},"brooklyn":{"cc":"US","lat":40.65,"lng":-73.95,"pop":2736074},"buffalo":{"cc":"US","lat":42.89,"lng":-78.88,"pop":258071},"bushwick":{"cc":"US","lat":40.69,"lng":-73.92,"pop":112620},"canarsie":{"cc":"US","lat":40.64,"lng":-73.9,"pop":87366},"cheektowaga":{"cc":"US","lat":42.9,"lng":-78.75,"pop":75178},"chinatown":{"cc":"US","lat":37.8,"lng":-122.41,"pop":100574},"clay":{"cc":"US","lat":43.19,"lng":-76.17,"pop":58206},"coney island":{"cc":"US","lat":40.58,"lng":-73.99,"pop":60000},"corona":{"cc":"US","lat":33.88,"lng":-117.57,"pop":164226},"cypress hills":{"cc":"US","lat":40.68,"lng":-73.89,"pop":54944},"east flatbush":{"cc":"US","lat":40.65,"lng":-73.93,"pop":178464},"east new york":{"cc":"US","lat":40.67,"lng":-73.88,"pop":173198},"east village":{"cc":"US","lat":40.73,"lng":-73.99,"pop":62832},"elmhurst":{"cc":"US","lat":40.74,"lng":-73.88,"pop":113364},"flatbush":{"cc":"US","lat":40.65,"lng":-73.96,"pop":93361},"flatlands":{"cc":"US","lat":40.62,"lng":-73.93,"pop":63601},"fordham":{"cc":"US","lat":40.86,"lng":-73.9,"pop":94678},"forest hills":{"cc":"US","lat":40.72,"lng":-73.85,"pop":67714},"greenburgh":{"cc":"US","lat":41.03,"lng":-73.84,"pop":86764},"harlem":{"cc":"US","lat":40.81,"lng":-73.95,"pop":116345},"hempstead":{"cc":"US","lat":40.71,"lng":-73.62,"pop":55547},"irondequoit":{"cc":"US","lat":43.21,"lng":-77.58,"pop":51692},"jackson heights":{"cc":"US","lat":40.76,"lng":-73.89,"pop":67067},"jamaica":{"cc":"US","lat":40.69,"lng":-73.81,"pop":216866},"kings bridge":{"cc":"US","lat":40.88,"lng":-73.91,"pop":75132},"levittown":{"cc":"US","lat":40.16,"lng":-74.83,"pop":52983},"mott haven":{"cc":"US","lat":40.81,"lng":-73.92,"pop":51450},"mount vernon":{"cc":"US","lat":40.91,"lng":-73.84,"pop":68628},"new rochelle":{"cc":"US","lat":40.91,"lng":-73.78,"pop":79846},"new york city":{"cc":"US","lat":40.71,"lng":-74.01,"pop":8804190},"ozone park":{"cc":"US","lat":40.68,"lng":-73.84,"pop":53985},"park slope":{"cc":"US","lat":40.67,"lng":-73.99,"pop":65047},"parkchester":{"cc":"US","lat":40.84,"lng":-73.86,"pop":65876},"queens village":{"cc":"US","lat":40.73,"lng":-73.74,"pop":51919},"queens":{"cc":"US","lat":40.68,"lng":-73.84,"pop":2316841},"ridgewood":{"cc":"US","lat":40.7,"lng":-73.91,"pop":69317},"schenectady":{"cc":"US","lat":42.81,"lng":-73.94,"pop":65305},"sheepshead bay":{"cc":"US","lat":40.59,"lng":-73.94,"pop":122534},"south ozone park":{"cc":"US","lat":40.67,"lng":-73.82,"pop":75878},"staten island":{"cc":"US","lat":40.56,"lng":-74.14,"pop":468730},"syracuse":{"cc":"US","lat":43.05,"lng":-76.15,"pop":144142},"upper west side":{"cc":"US","lat":40.79,"lng":-73.98,"pop":226989},"utica":{"cc":"US","lat":43.1,"lng":-75.23,"pop":61100},"washington heights":{"cc":"US","lat":40.85,"lng":-73.94,"pop":152613},"west albany":{"cc":"US","lat":42.68,"lng":-73.78,"pop":93794},"white plains":{"cc":"US","lat":41.03,"lng":-73.76,"pop":58459},"yonkers":{"cc":"US","lat":40.93,"lng":-73.9,"pop":201116},"akron":{"cc":"US","lat":41.08,"lng":-81.52,"pop":197542},"cleveland":{"cc":"US","lat":41.5,"lng":-81.7,"pop":365379},"elyria":{"cc":"US","lat":41.37,"lng":-82.11,"pop":53775},"lorain":{"cc":"US","lat":41.45,"lng":-82.18,"pop":63647},"youngstown":{"cc":"US","lat":41.1,"lng":-80.65,"pop":64628},"abington":{"cc":"US","lat":40.12,"lng":-75.12,"pop":55310},"allentown":{"cc":"US","lat":40.61,"lng":-75.49,"pop":120207},"bensalem":{"cc":"US","lat":40.1,"lng":-74.95,"pop":60427},"erie":{"cc":"US","lat":42.13,"lng":-80.09,"pop":99475},"harrisburg":{"cc":"US","lat":40.27,"lng":-76.88,"pop":50183},"lancaster":{"cc":"US","lat":34.7,"lng":-118.14,"pop":161103},"pittsburgh":{"cc":"US","lat":40.44,"lng":-80.0,"pop":304391},"scranton":{"cc":"US","lat":41.41,"lng":-75.66,"pop":77118},"cranston":{"cc":"US","lat":41.78,"lng":-71.44,"pop":81073},"pawtucket":{"cc":"US","lat":41.88,"lng":-71.38,"pop":71591},"providence":{"cc":"US","lat":41.82,"lng":-71.41,"pop":190934},"warwick":{"cc":"US","lat":41.7,"lng":-71.42,"pop":81699},"sioux falls":{"cc":"US","lat":43.54,"lng":-96.73,"pop":171544},"appleton":{"cc":"US","lat":44.26,"lng":-88.42,"pop":74139},"eau claire":{"cc":"US","lat":44.81,"lng":-91.5,"pop":67778},"green bay":{"cc":"US","lat":44.52,"lng":-88.02,"pop":105207},"janesville":{"cc":"US","lat":42.68,"lng":-89.02,"pop":64123},"kenosha":{"cc":"US","lat":42.58,"lng":-87.82,"pop":99858},"la crosse":{"cc":"US","lat":43.8,"lng":-91.24,"pop":52306},"madison":{"cc":"US","lat":43.07,"lng":-89.4,"pop":280305},"milwaukee":{"cc":"US","lat":43.04,"lng":-87.91,"pop":563531},"north la crosse":{"cc":"US","lat":43.85,"lng":-91.25,"pop":50470},"oshkosh":{"cc":"US","lat":44.02,"lng":-88.54,"pop":66555},"racine":{"cc":"US","lat":42.73,"lng":-87.78,"pop":77742},"waukesha":{"cc":"US","lat":43.01,"lng":-88.23,"pop":71970},"west allis":{"cc":"US","lat":43.02,"lng":-88.01,"pop":60620},"bridgeport":{"cc":"US","lat":41.18,"lng":-73.19,"pop":147629},"buckeye":{"cc":"US","lat":33.37,"lng":-112.58,"pop":50876},"casa grande":{"cc":"US","lat":32.88,"lng":-111.76,"pop":51460},"casas adobes":{"cc":"US","lat":32.32,"lng":-111.0,"pop":66795},"catalina foothills":{"cc":"US","lat":32.3,"lng":-110.92,"pop":50796},"chandler":{"cc":"US","lat":33.31,"lng":-111.84,"pop":260828},"deer valley":{"cc":"US","lat":33.68,"lng":-112.13,"pop":165656},"flagstaff":{"cc":"US","lat":35.2,"lng":-111.65,"pop":70320},"gilbert":{"cc":"US","lat":33.35,"lng":-111.79,"pop":247542},"glendale":{"cc":"US","lat":33.54,"lng":-112.19,"pop":240126},"goodyear":{"cc":"US","lat":33.44,"lng":-112.36,"pop":79003},"lake havasu city":{"cc":"US","lat":34.48,"lng":-114.32,"pop":53553},"maryvale":{"cc":"US","lat":33.5,"lng":-112.18,"pop":208189},"mesa":{"cc":"US","lat":33.42,"lng":-111.82,"pop":471825},"phoenix":{"cc":"US","lat":33.45,"lng":-112.07,"pop":1650070},"scottsdale":{"cc":"US","lat":33.51,"lng":-111.9,"pop":236839},"surprise":{"cc":"US","lat":33.63,"lng":-112.33,"pop":143148},"tempe":{"cc":"US","lat":33.41,"lng":-111.91,"pop":175826},"tempe junction":{"cc":"US","lat":33.41,"lng":-111.94,"pop":158368},"tucson":{"cc":"US","lat":32.22,"lng":-110.93,"pop":542629},"yuma":{"cc":"US","lat":32.73,"lng":-114.62,"pop":95548},"alameda":{"cc":"US","lat":37.77,"lng":-122.26,"pop":78630},"alhambra":{"cc":"US","lat":33.5,"lng":-112.13,"pop":127764},"aliso viejo":{"cc":"US","lat":33.57,"lng":-117.73,"pop":50195},"anaheim":{"cc":"US","lat":33.84,"lng":-117.91,"pop":350742},"antioch":{"cc":"US","lat":38.0,"lng":-121.81,"pop":110542},"arcadia":{"cc":"US","lat":34.14,"lng":-118.04,"pop":58408},"bakersfield":{"cc":"US","lat":35.37,"lng":-119.02,"pop":373640},"baldwin park":{"cc":"US","lat":34.09,"lng":-117.96,"pop":77071},"bellflower":{"cc":"US","lat":33.88,"lng":-118.12,"pop":78441},"berkeley":{"cc":"US","lat":37.87,"lng":-122.27,"pop":120972},"boyle heights":{"cc":"US","lat":34.03,"lng":-118.21,"pop":92785},"buena park":{"cc":"US","lat":33.87,"lng":-118.0,"pop":83270},"burbank":{"cc":"US","lat":34.18,"lng":-118.31,"pop":105319},"camarillo":{"cc":"US","lat":34.22,"lng":-119.04,"pop":67608},"canoga park":{"cc":"US","lat":34.2,"lng":-118.6,"pop":60578},"canyon country":{"cc":"US","lat":34.42,"lng":-118.47,"pop":59530},"carlsbad":{"cc":"US","lat":33.16,"lng":-117.35,"pop":114746},"carmichael":{"cc":"US","lat":38.62,"lng":-121.33,"pop":61762},"carson":{"cc":"US","lat":33.83,"lng":-118.28,"pop":93281},"castro valley":{"cc":"US","lat":37.69,"lng":-122.09,"pop":61388},"cathedral city":{"cc":"US","lat":33.78,"lng":-116.47,"pop":53826},"chico":{"cc":"US","lat":39.73,"lng":-121.84,"pop":121345},"chino hills":{"cc":"US","lat":33.99,"lng":-117.76,"pop":78309},"chula vista":{"cc":"US","lat":32.64,"lng":-117.08,"pop":265757},"citrus heights":{"cc":"US","lat":38.71,"lng":-121.28,"pop":87056},"clovis":{"cc":"US","lat":36.83,"lng":-119.7,"pop":104180},"colton":{"cc":"US","lat":34.07,"lng":-117.31,"pop":54621},"compton":{"cc":"US","lat":33.9,"lng":-118.22,"pop":98462},"costa mesa":{"cc":"US","lat":33.64,"lng":-117.92,"pop":113204},"cupertino":{"cc":"US","lat":37.32,"lng":-122.03,"pop":60572},"daly city":{"cc":"US","lat":37.71,"lng":-122.46,"pop":106562},"davis":{"cc":"US","lat":38.54,"lng":-121.74,"pop":67666},"delano":{"cc":"US","lat":35.77,"lng":-119.25,"pop":52733},"diamond bar":{"cc":"US","lat":34.03,"lng":-117.81,"pop":56897},"downey":{"cc":"US","lat":33.94,"lng":-118.13,"pop":114219},"east los angeles":{"cc":"US","lat":34.02,"lng":-118.17,"pop":126496},"el cajon":{"cc":"US","lat":32.79,"lng":-116.96,"pop":103679},"el monte":{"cc":"US","lat":34.07,"lng":-118.03,"pop":116732},"elk grove":{"cc":"US","lat":38.41,"lng":-121.37,"pop":166913},"encinitas":{"cc":"US","lat":33.04,"lng":-117.29,"pop":62930},"escondido":{"cc":"US","lat":33.12,"lng":-117.09,"pop":151038},"folsom":{"cc":"US","lat":38.68,"lng":-121.18,"pop":76375},"fontana":{"cc":"US","lat":34.09,"lng":-117.44,"pop":212704},"fountain valley":{"cc":"US","lat":33.71,"lng":-117.95,"pop":56987},"fremont":{"cc":"US","lat":37.55,"lng":-121.99,"pop":232206},"fresno":{"cc":"US","lat":36.75,"lng":-119.77,"pop":542107},"fullerton":{"cc":"US","lat":33.87,"lng":-117.93,"pop":140847},"garden grove":{"cc":"US","lat":33.77,"lng":-117.94,"pop":175393},"gardena":{"cc":"US","lat":33.89,"lng":-118.31,"pop":60447},"gilroy":{"cc":"US","lat":37.01,"lng":-121.57,"pop":53231},"glendora":{"cc":"US","lat":34.14,"lng":-117.87,"pop":52009},"hacienda heights":{"cc":"US","lat":33.99,"lng":-117.97,"pop":54038},"hanford":{"cc":"US","lat":36.33,"lng":-119.65,"pop":55659},"hawthorne":{"cc":"US","lat":33.92,"lng":-118.35,"pop":88451},"hayward":{"cc":"US","lat":37.67,"lng":-122.08,"pop":158289},"hemet":{"cc":"US","lat":33.75,"lng":-116.97,"pop":83861},"hesperia":{"cc":"US","lat":34.43,"lng":-117.3,"pop":93295},"highland":{"cc":"US","lat":34.13,"lng":-117.21,"pop":54854},"huntington beach":{"cc":"US","lat":33.66,"lng":-118.0,"pop":201899},"huntington park":{"cc":"US","lat":33.98,"lng":-118.23,"pop":59430},"indio":{"cc":"US","lat":33.72,"lng":-116.22,"pop":87533},"inglewood":{"cc":"US","lat":33.96,"lng":-118.35,"pop":111666},"irvine":{"cc":"US","lat":33.67,"lng":-117.82,"pop":256927},"koreatown":{"cc":"US","lat":34.06,"lng":-118.3,"pop":124281},"la habra":{"cc":"US","lat":33.93,"lng":-117.95,"pop":62131},"la mesa":{"cc":"US","lat":32.77,"lng":-117.02,"pop":60089},"laguna niguel":{"cc":"US","lat":33.52,"lng":-117.71,"pop":65806},"lake elsinore":{"cc":"US","lat":33.67,"lng":-117.33,"pop":61981},"lake forest":{"cc":"US","lat":33.65,"lng":-117.69,"pop":82492},"livermore":{"cc":"US","lat":37.68,"lng":-121.77,"pop":88126},"lodi":{"cc":"US","lat":38.13,"lng":-121.27,"pop":64596},"long beach":{"cc":"US","lat":33.77,"lng":-118.19,"pop":474140},"lynwood":{"cc":"US","lat":33.93,"lng":-118.21,"pop":71989},"madera":{"cc":"US","lat":36.96,"lng":-120.06,"pop":64208},"manteca":{"cc":"US","lat":37.8,"lng":-121.22,"pop":75448},"menifee":{"cc":"US","lat":33.73,"lng":-117.15,"pop":87174},"merced":{"cc":"US","lat":37.3,"lng":-120.48,"pop":82436},"milpitas":{"cc":"US","lat":37.43,"lng":-121.91,"pop":77604},"mira mesa":{"cc":"US","lat":32.92,"lng":-117.14,"pop":70000},"mission viejo":{"cc":"US","lat":33.6,"lng":-117.67,"pop":97156},"modesto":{"cc":"US","lat":37.64,"lng":-121.0,"pop":211266},"montebello":{"cc":"US","lat":34.01,"lng":-118.11,"pop":63921},"monterey park":{"cc":"US","lat":34.06,"lng":-118.12,"pop":61468},"moreno valley":{"cc":"US","lat":33.94,"lng":-117.23,"pop":204198},"mountain view":{"cc":"US","lat":37.39,"lng":-122.08,"pop":80435},"murrieta":{"cc":"US","lat":33.55,"lng":-117.21,"pop":109830},"napa":{"cc":"US","lat":38.3,"lng":-122.29,"pop":80434},"national city":{"cc":"US","lat":32.68,"lng":-117.1,"pop":61060},"newport beach":{"cc":"US","lat":33.62,"lng":-117.93,"pop":87127},"north hollywood":{"cc":"US","lat":34.17,"lng":-118.38,"pop":64587},"northridge":{"cc":"US","lat":34.23,"lng":-118.54,"pop":68469},"novato":{"cc":"US","lat":38.11,"lng":-122.57,"pop":55530},"oakland":{"cc":"US","lat":37.8,"lng":-122.27,"pop":419267},"oceanside":{"cc":"US","lat":33.2,"lng":-117.38,"pop":175691},"ontario":{"cc":"US","lat":34.06,"lng":-117.65,"pop":171214},"orange":{"cc":"US","lat":33.79,"lng":-117.85,"pop":140992},"oxnard":{"cc":"US","lat":34.2,"lng":-119.18,"pop":207254},"palm desert":{"cc":"US","lat":33.72,"lng":-116.38,"pop":51869},"palmdale":{"cc":"US","lat":34.58,"lng":-118.12,"pop":158351},"palo alto":{"cc":"US","lat":37.44,"lng":-122.14,"pop":66853},"paramount":{"cc":"US","lat":33.89,"lng":-118.16,"pop":55412},"perris":{"cc":"US","lat":33.78,"lng":-117.23,"pop":74971},"petaluma":{"cc":"US","lat":38.23,"lng":-122.64,"pop":60438},"pico rivera":{"cc":"US","lat":33.98,"lng":-118.1,"pop":64218},"pittsburg":{"cc":"US","lat":38.03,"lng":-121.88,"pop":69424},"placentia":{"cc":"US","lat":33.87,"lng":-117.87,"pop":52495},"pleasanton":{"cc":"US","lat":37.66,"lng":-121.87,"pop":79510},"pomona":{"cc":"US","lat":34.06,"lng":-117.75,"pop":153266},"porterville":{"cc":"US","lat":36.07,"lng":-119.02,"pop":56058},"poway":{"cc":"US","lat":32.96,"lng":-117.04,"pop":50157},"rancho cordova":{"cc":"US","lat":38.59,"lng":-121.3,"pop":71017},"rancho cucamonga":{"cc":"US","lat":34.11,"lng":-117.59,"pop":175236},"rancho penasquitos":{"cc":"US","lat":32.96,"lng":-117.12,"pop":60000},"redlands":{"cc":"US","lat":34.06,"lng":-117.18,"pop":71035},"redondo beach":{"cc":"US","lat":33.85,"lng":-118.39,"pop":68166},"redwood city":{"cc":"US","lat":37.49,"lng":-122.24,"pop":85288},"reseda":{"cc":"US","lat":34.2,"lng":-118.54,"pop":65000},"rialto":{"cc":"US","lat":34.11,"lng":-117.37,"pop":103132},"riverside":{"cc":"US","lat":33.95,"lng":-117.4,"pop":317261},"rocklin":{"cc":"US","lat":38.79,"lng":-121.24,"pop":61213},"rosemead":{"cc":"US","lat":34.08,"lng":-118.07,"pop":54908},"roseville":{"cc":"US","lat":38.75,"lng":-121.29,"pop":130269},"sacramento":{"cc":"US","lat":38.58,"lng":-121.49,"pop":524943},"salinas":{"cc":"US","lat":36.68,"lng":-121.66,"pop":157380},"san bernardino":{"cc":"US","lat":34.11,"lng":-117.29,"pop":216108},"san clemente":{"cc":"US","lat":33.43,"lng":-117.61,"pop":65526},"san diego":{"cc":"US","lat":32.72,"lng":-117.16,"pop":1404452},"san leandro":{"cc":"US","lat":37.72,"lng":-122.16,"pop":90712},"san ramon":{"cc":"US","lat":37.78,"lng":-121.98,"pop":76134},"santa barbara":{"cc":"US","lat":34.42,"lng":-119.7,"pop":91842},"santa clarita":{"cc":"US","lat":34.39,"lng":-118.54,"pop":182371},"santa monica":{"cc":"US","lat":34.02,"lng":-118.49,"pop":93220},"santee":{"cc":"US","lat":32.84,"lng":-116.97,"pop":57787},"north hills":{"cc":"US","lat":34.24,"lng":-118.48,"pop":56946},"sherman oaks":{"cc":"US","lat":34.15,"lng":-118.45,"pop":52677},"simi valley":{"cc":"US","lat":34.27,"lng":-118.78,"pop":126788},"south gate":{"cc":"US","lat":33.95,"lng":-118.21,"pop":96401},"south san francisco":{"cc":"US","lat":37.65,"lng":-122.41,"pop":67271},"south whittier":{"cc":"US","lat":33.95,"lng":-118.04,"pop":57156},"stockton":{"cc":"US","lat":37.96,"lng":-121.29,"pop":305658},"sunnyvale":{"cc":"US","lat":37.37,"lng":-122.04,"pop":155805},"sylmar":{"cc":"US","lat":34.31,"lng":-118.45,"pop":79614},"temecula":{"cc":"US","lat":33.49,"lng":-117.15,"pop":110003},"thousand oaks":{"cc":"US","lat":34.17,"lng":-118.84,"pop":129339},"torrance":{"cc":"US","lat":33.84,"lng":-118.34,"pop":143592},"tracy":{"cc":"US","lat":37.74,"lng":-121.43,"pop":87075},"tulare":{"cc":"US","lat":36.21,"lng":-119.35,"pop":62315},"turlock":{"cc":"US","lat":37.49,"lng":-120.85,"pop":72292},"tustin":{"cc":"US","lat":33.75,"lng":-117.83,"pop":80583},"universal city":{"cc":"US","lat":34.14,"lng":-118.35,"pop":105000},"upland":{"cc":"US","lat":34.1,"lng":-117.65,"pop":76443},"vacaville":{"cc":"US","lat":38.36,"lng":-121.99,"pop":96803},"vallejo":{"cc":"US","lat":38.1,"lng":-122.26,"pop":121692},"van nuys":{"cc":"US","lat":34.19,"lng":-118.45,"pop":136443},"ventura":{"cc":"US","lat":34.28,"lng":-119.29,"pop":96769},"victorville":{"cc":"US","lat":34.54,"lng":-117.29,"pop":122225},"visalia":{"cc":"US","lat":36.33,"lng":-119.29,"pop":130104},"vista":{"cc":"US","lat":33.2,"lng":-117.24,"pop":100890},"walnut creek":{"cc":"US","lat":37.91,"lng":-122.06,"pop":68910},"watsonville":{"cc":"US","lat":36.91,"lng":-121.76,"pop":53628},"west covina":{"cc":"US","lat":34.07,"lng":-117.94,"pop":108484},"west sacramento":{"cc":"US","lat":38.58,"lng":-121.53,"pop":52721},"westminster":{"cc":"US","lat":39.84,"lng":-105.04,"pop":116317},"whittier":{"cc":"US","lat":33.98,"lng":-118.03,"pop":87438},"woodland":{"cc":"US","lat":38.68,"lng":-121.77,"pop":58567},"woodland hills":{"cc":"US","lat":34.17,"lng":-118.61,"pop":70000},"yorba linda":{"cc":"US","lat":33.89,"lng":-117.81,"pop":67973},"yuba city":{"cc":"US","lat":39.14,"lng":-121.62,"pop":66941},"yucaipa":{"cc":"US","lat":34.03,"lng":-117.04,"pop":53328},"arvada":{"cc":"US","lat":39.8,"lng":-105.09,"pop":115368},"broomfield":{"cc":"US","lat":39.92,"lng":-105.09,"pop":65065},"castle rock":{"cc":"US","lat":39.37,"lng":-104.86,"pop":55591},"centennial":{"cc":"US","lat":39.58,"lng":-104.88,"pop":109741},"colorado springs":{"cc":"US","lat":38.83,"lng":-104.82,"pop":456568},"commerce city":{"cc":"US","lat":39.81,"lng":-104.93,"pop":53696},"denver":{"cc":"US","lat":39.74,"lng":-104.98,"pop":729019},"grand junction":{"cc":"US","lat":39.06,"lng":-108.55,"pop":60358},"highlands ranch":{"cc":"US","lat":39.55,"lng":-104.97,"pop":96713},"pueblo":{"cc":"US","lat":38.25,"lng":-104.61,"pop":109412},"thornton":{"cc":"US","lat":39.87,"lng":-104.97,"pop":133451},"albuquerque":{"cc":"US","lat":35.08,"lng":-106.65,"pop":564559},"las cruces":{"cc":"US","lat":32.31,"lng":-106.78,"pop":101643},"rio rancho":{"cc":"US","lat":35.23,"lng":-106.66,"pop":87521},"carson city":{"cc":"US","lat":39.16,"lng":-119.77,"pop":58639},"enterprise":{"cc":"US","lat":36.03,"lng":-115.24,"pop":108481},"henderson":{"cc":"US","lat":36.04,"lng":-114.98,"pop":285667},"las vegas":{"cc":"US","lat":36.17,"lng":-115.14,"pop":641903},"north las vegas":{"cc":"US","lat":36.2,"lng":-115.12,"pop":234807},"paradise":{"cc":"US","lat":36.1,"lng":-115.15,"pop":223167},"reno":{"cc":"US","lat":39.53,"lng":-119.81,"pop":264165},"sparks":{"cc":"US","lat":39.53,"lng":-119.75,"pop":96094},"spring valley":{"cc":"US","lat":36.11,"lng":-115.25,"pop":178395},"sunrise manor":{"cc":"US","lat":36.21,"lng":-115.07,"pop":189372},"amarillo":{"cc":"US","lat":35.22,"lng":-101.83,"pop":198645},"el paso":{"cc":"US","lat":31.76,"lng":-106.49,"pop":678815},"lubbock":{"cc":"US","lat":33.58,"lng":-101.86,"pop":249042},"midland":{"cc":"US","lat":32.0,"lng":-102.08,"pop":132524},"odessa":{"cc":"US","lat":31.85,"lng":-102.37,"pop":114428},"san angelo":{"cc":"US","lat":31.46,"lng":-100.44,"pop":99893},"saint george":{"cc":"US","lat":37.1,"lng":-113.58,"pop":72897},"avondale":{"cc":"US","lat":33.44,"lng":-112.35,"pop":80684},"ahwatukee foothills":{"cc":"US","lat":33.34,"lng":-111.98,"pop":83464},"redding":{"cc":"US","lat":40.59,"lng":-122.39,"pop":91582},"boulder":{"cc":"US","lat":40.01,"lng":-105.27,"pop":106803},"fort collins":{"cc":"US","lat":40.59,"lng":-105.08,"pop":170924},"greeley":{"cc":"US","lat":40.42,"lng":-104.71,"pop":108795},"longmont":{"cc":"US","lat":40.17,"lng":-105.1,"pop":92088},"loveland":{"cc":"US","lat":40.4,"lng":-105.07,"pop":75182},"boise":{"cc":"US","lat":43.61,"lng":-116.2,"pop":235684},"caldwell":{"cc":"US","lat":43.66,"lng":-116.69,"pop":51686},"idaho falls":{"cc":"US","lat":43.47,"lng":-112.03,"pop":59184},"meridian":{"cc":"US","lat":43.61,"lng":-116.39,"pop":90739},"nampa":{"cc":"US","lat":43.54,"lng":-116.56,"pop":89839},"pocatello":{"cc":"US","lat":42.87,"lng":-112.45,"pop":54441},"billings":{"cc":"US","lat":45.78,"lng":-108.5,"pop":117116},"great falls":{"cc":"US","lat":47.5,"lng":-111.3,"pop":59638},"missoula":{"cc":"US","lat":46.87,"lng":-113.99,"pop":71022},"bismarck":{"cc":"US","lat":46.81,"lng":-100.78,"pop":75092},"beaverton":{"cc":"US","lat":45.49,"lng":-122.8,"pop":96577},"bend":{"cc":"US","lat":44.06,"lng":-121.32,"pop":87014},"corvallis":{"cc":"US","lat":44.56,"lng":-123.26,"pop":55780},"eugene":{"cc":"US","lat":44.05,"lng":-123.09,"pop":176654},"gresham":{"cc":"US","lat":45.5,"lng":-122.43,"pop":110553},"hillsboro":{"cc":"US","lat":45.52,"lng":-122.99,"pop":102347},"tigard":{"cc":"US","lat":45.43,"lng":-122.77,"pop":51253},"rapid city":{"cc":"US","lat":44.08,"lng":-103.23,"pop":73569},"layton":{"cc":"US","lat":41.06,"lng":-111.97,"pop":74143},"lehi":{"cc":"US","lat":40.39,"lng":-111.85,"pop":58486},"logan":{"cc":"US","lat":41.74,"lng":-111.83,"pop":50371},"millcreek":{"cc":"US","lat":40.69,"lng":-111.88,"pop":62139},"ogden":{"cc":"US","lat":41.22,"lng":-111.97,"pop":85444},"orem":{"cc":"US","lat":40.3,"lng":-111.69,"pop":94457},"provo":{"cc":"US","lat":40.23,"lng":-111.66,"pop":115162},"salt lake city":{"cc":"US","lat":40.76,"lng":-111.89,"pop":215548},"sandy":{"cc":"US","lat":40.59,"lng":-111.88,"pop":87461},"sandy hills":{"cc":"US","lat":40.58,"lng":-111.85,"pop":89575},"south jordan":{"cc":"US","lat":40.56,"lng":-111.93,"pop":66648},"taylorsville":{"cc":"US","lat":40.67,"lng":-111.94,"pop":60514},"west jordan":{"cc":"US","lat":40.61,"lng":-111.94,"pop":111946},"west valley city":{"cc":"US","lat":40.69,"lng":-112.0,"pop":136208},"bellingham":{"cc":"US","lat":48.76,"lng":-122.49,"pop":85146},"burien":{"cc":"US","lat":47.47,"lng":-122.35,"pop":50467},"everett":{"cc":"US","lat":47.98,"lng":-122.2,"pop":108010},"federal way":{"cc":"US","lat":47.32,"lng":-122.31,"pop":95171},"kennewick":{"cc":"US","lat":46.21,"lng":-119.14,"pop":78896},"kent":{"cc":"US","lat":47.38,"lng":-122.23,"pop":126952},"kirkland":{"cc":"US","lat":47.68,"lng":-122.21,"pop":87281},"marysville":{"cc":"US","lat":48.05,"lng":-122.18,"pop":66773},"olympia":{"cc":"US","lat":47.04,"lng":-122.9,"pop":55733},"pasco":{"cc":"US","lat":46.24,"lng":-119.1,"pop":69451},"redmond":{"cc":"US","lat":47.67,"lng":-122.12,"pop":60598},"renton":{"cc":"US","lat":47.48,"lng":-122.22,"pop":100242},"richland":{"cc":"US","lat":46.29,"lng":-119.28,"pop":54248},"sammamish":{"cc":"US","lat":47.64,"lng":-122.08,"pop":52253},"seattle":{"cc":"US","lat":47.61,"lng":-122.33,"pop":780995},"shoreline":{"cc":"US","lat":47.76,"lng":-122.34,"pop":55439},"south hill":{"cc":"US","lat":47.14,"lng":-122.27,"pop":52431},"spokane":{"cc":"US","lat":47.66,"lng":-117.43,"pop":229447},"spokane valley":{"cc":"US","lat":47.67,"lng":-117.24,"pop":94919},"tacoma":{"cc":"US","lat":47.25,"lng":-122.44,"pop":222906},"yakima":{"cc":"US","lat":46.6,"lng":-120.51,"pop":93701},"casper":{"cc":"US","lat":42.87,"lng":-106.31,"pop":60285},"cheyenne":{"cc":"US","lat":41.14,"lng":-104.82,"pop":65132},"honolulu":{"cc":"US","lat":21.31,"lng":-157.86,"pop":350964},"anchorage":{"cc":"US","lat":61.22,"lng":-149.9,"pop":289600},"johns creek":{"cc":"US","lat":34.03,"lng":-84.2,"pop":83335},"morningside heights":{"cc":"US","lat":40.81,"lng":-73.96,"pop":55929},"east harlem":{"cc":"US","lat":40.79,"lng":-73.94,"pop":115921},"alafaya":{"cc":"US","lat":28.56,"lng":-81.21,"pop":78113},"little havana":{"cc":"US","lat":25.77,"lng":-80.23,"pop":53430},"briarwood":{"cc":"US","lat":40.71,"lng":-73.82,"pop":53877},"city of milford":{"cc":"US","lat":41.22,"lng":-73.06,"pop":51271},"west bloomfield township":{"cc":"US","lat":42.57,"lng":-83.38,"pop":64690},"arden-arcade":{"cc":"US","lat":38.6,"lng":-121.38,"pop":92186},"florence-graham":{"cc":"US","lat":33.97,"lng":-118.24,"pop":63387},"tri-cities":{"cc":"US","lat":46.25,"lng":-119.2,"pop":244036},"san tan valley":{"cc":"US","lat":33.19,"lng":-111.53,"pop":81321},"enchanted hills":{"cc":"US","lat":35.34,"lng":-106.59,"pop":87521},"eastvale":{"cc":"US","lat":33.96,"lng":-117.56,"pop":59039},"financial district":{"cc":"US","lat":40.71,"lng":-74.01,"pop":60976},"sunset park":{"cc":"US","lat":40.65,"lng":-74.01,"pop":126000},"center city":{"cc":"US","lat":39.95,"lng":-75.16,"pop":57239},"stonecrest":{"cc":"US","lat":33.71,"lng":-84.13,"pop":50000},"valley glen":{"cc":"US","lat":34.19,"lng":-118.42,"pop":60000},"encanto":{"cc":"US","lat":33.48,"lng":-112.08,"pop":54614},"central city":{"cc":"US","lat":33.44,"lng":-112.06,"pop":58161},"south fulton":{"cc":"US","lat":33.59,"lng":-84.67,"pop":107436},"mid-city":{"cc":"US","lat":34.04,"lng":-118.36,"pop":83000},"downtown dc":{"cc":"US","lat":38.89,"lng":-77.02,"pop":52560},"the trails of frisco":{"cc":"US","lat":33.16,"lng":-96.87,"pop":51059},"tacuaremb":{"cc":"UY","lat":-31.72,"lng":-55.98,"pop":60586},"tacuarembo":{"cc":"UY","lat":-31.72,"lng":-55.98,"pop":60586},"rivera":{"cc":"UY","lat":-30.91,"lng":-55.55,"pop":84775},"paysandu":{"cc":"UY","lat":-32.32,"lng":-58.08,"pop":81550},"paysand":{"cc":"UY","lat":-32.32,"lng":-58.08,"pop":81550},"montevideo":{"cc":"UY","lat":-34.9,"lng":-56.19,"pop":1270737},"melo":{"cc":"UY","lat":-32.37,"lng":-54.16,"pop":56013},"maldonado":{"cc":"UY","lat":-34.9,"lng":-54.95,"pop":102000},"las piedras":{"cc":"UY","lat":-34.73,"lng":-56.22,"pop":69682},"nukus":{"cc":"UZ","lat":42.46,"lng":59.61,"pop":332500},"qunghirot":{"cc":"UZ","lat":43.04,"lng":58.84,"pop":80090},"qnghirot":{"cc":"UZ","lat":43.04,"lng":58.84,"pop":80090},"xojayli shahri":{"cc":"UZ","lat":42.41,"lng":59.45,"pop":67800},"oltinkol":{"cc":"UZ","lat":43.07,"lng":58.9,"pop":59122},"urgut shahri":{"cc":"UZ","lat":39.42,"lng":67.26,"pop":65300},"tirmiz":{"cc":"UZ","lat":37.22,"lng":67.28,"pop":182800},"shahrisabz":{"cc":"UZ","lat":39.06,"lng":66.83,"pop":142700},"samarkand":{"cc":"UZ","lat":39.65,"lng":66.96,"pop":595200},"qarshi":{"cc":"UZ","lat":38.86,"lng":65.79,"pop":278300},"kattaqorgon shahri":{"cc":"UZ","lat":39.91,"lng":66.27,"pop":90600},"koson":{"cc":"UZ","lat":39.04,"lng":65.58,"pop":68900},"kogon shahri":{"cc":"UZ","lat":39.73,"lng":64.55,"pop":62300},"denov":{"cc":"UZ","lat":38.27,"lng":67.9,"pop":78300},"bukhara":{"cc":"UZ","lat":39.77,"lng":64.43,"pop":280187},"yunusobod":{"cc":"UZ","lat":41.37,"lng":69.28,"pop":352000},"yangiyul":{"cc":"UZ","lat":41.11,"lng":69.05,"pop":61700},"yangiyl":{"cc":"UZ","lat":41.11,"lng":69.05,"pop":61700},"urganch":{"cc":"UZ","lat":41.55,"lng":60.63,"pop":145000},"tytepa":{"cc":"UZ","lat":41.03,"lng":69.36,"pop":51400},"tuytepa":{"cc":"UZ","lat":41.03,"lng":69.36,"pop":51400},"tashkent":{"cc":"UZ","lat":41.26,"lng":69.22,"pop":1978028},"shahrixon":{"cc":"UZ","lat":40.71,"lng":72.06,"pop":71400},"qoqon":{"cc":"UZ","lat":40.53,"lng":70.94,"pop":259700},"parkent":{"cc":"UZ","lat":41.29,"lng":69.68,"pop":60200},"olmaliq":{"cc":"UZ","lat":40.84,"lng":69.6,"pop":133400},"navoiy":{"cc":"UZ","lat":40.08,"lng":65.38,"pop":144158},"namangan":{"cc":"UZ","lat":41.0,"lng":71.67,"pop":713220},"margilon":{"cc":"UZ","lat":40.47,"lng":71.72,"pop":253500},"quvasoy":{"cc":"UZ","lat":40.3,"lng":71.98,"pop":96900},"xiva":{"cc":"UZ","lat":41.39,"lng":60.36,"pop":115000},"kosonsoy":{"cc":"UZ","lat":41.25,"lng":71.55,"pop":50900},"jizzax":{"cc":"UZ","lat":40.13,"lng":67.83,"pop":179200},"gurlan":{"cc":"UZ","lat":41.84,"lng":60.39,"pop":50900},"guliston":{"cc":"UZ","lat":40.5,"lng":68.78,"pop":90398},"fergana":{"cc":"UZ","lat":40.38,"lng":71.78,"pop":299200},"chust":{"cc":"UZ","lat":41.0,"lng":71.24,"pop":100200},"chirchiq":{"cc":"UZ","lat":41.47,"lng":69.58,"pop":162800},"chilanzar":{"cc":"UZ","lat":41.28,"lng":69.18,"pop":260700},"sergeli":{"cc":"UZ","lat":41.2,"lng":69.22,"pop":105700},"chortoq":{"cc":"UZ","lat":41.07,"lng":71.82,"pop":53400},"beshariq":{"cc":"UZ","lat":40.44,"lng":70.61,"pop":96900},"beruniy":{"cc":"UZ","lat":41.69,"lng":60.75,"pop":66090},"bekobod":{"cc":"UZ","lat":40.22,"lng":69.27,"pop":96900},"angren":{"cc":"UZ","lat":41.02,"lng":70.14,"pop":191300},"andijon":{"cc":"UZ","lat":40.78,"lng":72.35,"pop":747800},"anaco":{"cc":"VE","lat":9.43,"lng":-64.46,"pop":139397},"alto barinas":{"cc":"VE","lat":8.59,"lng":-70.23,"pop":284289},"zaraza":{"cc":"VE","lat":9.35,"lng":-65.32,"pop":74017},"yaritagua":{"cc":"VE","lat":10.08,"lng":-69.12,"pop":113343},"villa de cura":{"cc":"VE","lat":10.04,"lng":-67.49,"pop":99669},"villa bruzual":{"cc":"VE","lat":9.33,"lng":-69.12,"pop":55244},"valle de la pascua":{"cc":"VE","lat":9.22,"lng":-66.01,"pop":153136},"valera":{"cc":"VE","lat":9.32,"lng":-70.6,"pop":244708},"urena":{"cc":"VE","lat":7.92,"lng":-72.44,"pop":56509},"urea":{"cc":"VE","lat":7.92,"lng":-72.44,"pop":56509},"upata":{"cc":"VE","lat":8.02,"lng":-62.41,"pop":112617},"turmero":{"cc":"VE","lat":10.23,"lng":-67.47,"pop":344700},"tucupita":{"cc":"VE","lat":9.06,"lng":-62.05,"pop":99778},"tinaquillo":{"cc":"VE","lat":9.92,"lng":-68.3,"pop":115937},"tariba":{"cc":"VE","lat":7.82,"lng":-72.22,"pop":138402},"triba":{"cc":"VE","lat":7.82,"lng":-72.22,"pop":138402},"socopo":{"cc":"VE","lat":8.23,"lng":-70.82,"pop":72352},"socop":{"cc":"VE","lat":8.23,"lng":-70.82,"pop":72352},"san timoteo":{"cc":"VE","lat":9.79,"lng":-71.07,"pop":81017},"santa teresa del tuy":{"cc":"VE","lat":10.23,"lng":-66.66,"pop":278890},"santa cruz de mara":{"cc":"VE","lat":10.79,"lng":-71.69,"pop":69781},"san juan de los morros":{"cc":"VE","lat":9.91,"lng":-67.35,"pop":160868},"san juan bautista":{"cc":"VE","lat":11.01,"lng":-63.94,"pop":90387},"san jos de guanipa":{"cc":"VE","lat":8.89,"lng":-64.17,"pop":83092},"san jose de guanipa":{"cc":"VE","lat":8.89,"lng":-64.17,"pop":83092},"san joaquin":{"cc":"VE","lat":10.26,"lng":-67.79,"pop":69894},"san joaqun":{"cc":"VE","lat":10.26,"lng":-67.79,"pop":69894},"san carlos del zulia":{"cc":"VE","lat":9.0,"lng":-71.93,"pop":126353},"san carlos":{"cc":"VE","lat":9.66,"lng":-68.59,"pop":120375},"san antonio del tachira":{"cc":"VE","lat":7.81,"lng":-72.44,"pop":66392},"san antonio del tchira":{"cc":"VE","lat":7.81,"lng":-72.44,"pop":66392},"san antonio de los altos":{"cc":"VE","lat":10.39,"lng":-66.95,"pop":63873},"rubio":{"cc":"VE","lat":7.7,"lng":-72.36,"pop":93197},"la villa del rosario":{"cc":"VE","lat":10.33,"lng":-72.31,"pop":82766},"qubor":{"cc":"VE","lat":9.93,"lng":-69.62,"pop":51377},"quibor":{"cc":"VE","lat":9.93,"lng":-69.62,"pop":51377},"punto fijo":{"cc":"VE","lat":11.69,"lng":-70.2,"pop":141729},"punta de mata":{"cc":"VE","lat":9.69,"lng":-63.61,"pop":61080},"punta cardn":{"cc":"VE","lat":11.66,"lng":-70.22,"pop":113999},"punta cardon":{"cc":"VE","lat":11.66,"lng":-70.22,"pop":113999},"puerto la cruz":{"cc":"VE","lat":10.21,"lng":-64.63,"pop":370000},"puerto cabello":{"cc":"VE","lat":10.47,"lng":-68.01,"pop":174000},"puerto ayacucho":{"cc":"VE","lat":5.66,"lng":-67.58,"pop":125840},"porlamar":{"cc":"VE","lat":10.96,"lng":-63.87,"pop":216234},"petare":{"cc":"VE","lat":10.48,"lng":-66.81,"pop":364684},"pampatar":{"cc":"VE","lat":11.0,"lng":-63.79,"pop":64983},"pampn":{"cc":"VE","lat":9.45,"lng":-70.48,"pop":59657},"pampan":{"cc":"VE","lat":9.45,"lng":-70.48,"pop":59657},"palo negro":{"cc":"VE","lat":10.17,"lng":-67.54,"pop":128875},"ocumare del tuy":{"cc":"VE","lat":10.12,"lng":-66.78,"pop":166072},"nirgua":{"cc":"VE","lat":10.15,"lng":-68.56,"pop":54080},"mene grande":{"cc":"VE","lat":9.85,"lng":-70.93,"pop":60580},"mariara":{"cc":"VE","lat":10.3,"lng":-67.72,"pop":116142},"maracay":{"cc":"VE","lat":10.25,"lng":-67.59,"pop":464700},"maracaibo":{"cc":"VE","lat":10.64,"lng":-71.61,"pop":1752602},"maiquetia":{"cc":"VE","lat":10.59,"lng":-66.96,"pop":52564},"maiqueta":{"cc":"VE","lat":10.59,"lng":-66.96,"pop":52564},"machiques":{"cc":"VE","lat":10.06,"lng":-72.55,"pop":132734},"los teques":{"cc":"VE","lat":10.35,"lng":-67.04,"pop":252242},"los rastrojos":{"cc":"VE","lat":10.03,"lng":-69.24,"pop":100497},"los dos caminos":{"cc":"VE","lat":10.49,"lng":-66.83,"pop":58168},"la victoria":{"cc":"VE","lat":10.23,"lng":-67.33,"pop":126721},"lander":{"cc":"VE","lat":10.18,"lng":-66.7,"pop":176346},"la concepcion":{"cc":"VE","lat":10.62,"lng":-71.84,"pop":120478},"la concepcin":{"cc":"VE","lat":10.62,"lng":-71.84,"pop":120478},"gueiguee":{"cc":"VE","lat":10.08,"lng":-67.78,"pop":80627},"gige":{"cc":"VE","lat":10.08,"lng":-67.78,"pop":80627},"guatire":{"cc":"VE","lat":10.47,"lng":-66.54,"pop":227666},"guarenas":{"cc":"VE","lat":10.47,"lng":-66.62,"pop":248588},"guanare":{"cc":"VE","lat":9.04,"lng":-69.73,"pop":112286},"guacara":{"cc":"VE","lat":10.23,"lng":-67.88,"pop":198883},"el vigia":{"cc":"VE","lat":8.61,"lng":-71.66,"pop":162289},"el viga":{"cc":"VE","lat":8.61,"lng":-71.66,"pop":162289},"el tocuyo":{"cc":"VE","lat":9.79,"lng":-69.79,"pop":74829},"el tigre":{"cc":"VE","lat":8.89,"lng":-64.25,"pop":222450},"el limon":{"cc":"VE","lat":10.31,"lng":-67.63,"pop":148247},"el limn":{"cc":"VE","lat":10.31,"lng":-67.63,"pop":148247},"el hatillo":{"cc":"VE","lat":10.42,"lng":-66.83,"pop":57591},"ejido":{"cc":"VE","lat":8.55,"lng":-71.24,"pop":120978},"cumana":{"cc":"VE","lat":10.46,"lng":-64.18,"pop":405626},"cuman":{"cc":"VE","lat":10.46,"lng":-64.18,"pop":405626},"ca":{"cc":"VE","lat":10.16,"lng":-66.88,"pop":182558},"cua":{"cc":"VE","lat":10.16,"lng":-66.88,"pop":182558},"coro":{"cc":"VE","lat":11.41,"lng":-69.68,"pop":246657},"cocorote":{"cc":"VE","lat":10.32,"lng":-68.78,"pop":52803},"ciudad piar":{"cc":"VE","lat":7.45,"lng":-63.32,"pop":51967},"ciudad ojeda":{"cc":"VE","lat":10.2,"lng":-71.31,"pop":240283},"ciudad guayana":{"cc":"VE","lat":8.35,"lng":-62.64,"pop":978202},"ciudad bolivia":{"cc":"VE","lat":8.35,"lng":-70.57,"pop":52476},"ciudad bolivar":{"cc":"VE","lat":8.12,"lng":-63.55,"pop":412619},"ciudad bolvar":{"cc":"VE","lat":8.12,"lng":-63.55,"pop":412619},"chivacoa":{"cc":"VE","lat":10.16,"lng":-68.89,"pop":70298},"charallave":{"cc":"VE","lat":10.24,"lng":-66.86,"pop":129182},"chacao":{"cc":"VE","lat":10.5,"lng":-66.85,"pop":64609},"tacarigua":{"cc":"VE","lat":10.09,"lng":-67.92,"pop":69636},"caucagueito":{"cc":"VE","lat":10.49,"lng":-66.74,"pop":52556},"caucagito":{"cc":"VE","lat":10.49,"lng":-66.74,"pop":52556},"catia la mar":{"cc":"VE","lat":10.61,"lng":-67.03,"pop":106822},"carupano":{"cc":"VE","lat":10.67,"lng":-63.25,"pop":167187},"carpano":{"cc":"VE","lat":10.67,"lng":-63.25,"pop":167187},"carora":{"cc":"VE","lat":10.17,"lng":-70.08,"pop":121741},"caracas":{"cc":"VE","lat":10.49,"lng":-66.88,"pop":3000000},"cantaura":{"cc":"VE","lat":9.31,"lng":-64.36,"pop":68885},"calabozo":{"cc":"VE","lat":8.92,"lng":-67.43,"pop":168605},"caicara del orinoco":{"cc":"VE","lat":7.64,"lng":-66.17,"pop":67277},"cagua":{"cc":"VE","lat":10.19,"lng":-67.46,"pop":119033},"cabudare":{"cc":"VE","lat":10.03,"lng":-69.26,"pop":102686},"cabimas":{"cc":"VE","lat":10.4,"lng":-71.45,"pop":351736},"bocono":{"cc":"VE","lat":9.25,"lng":-70.25,"pop":68990},"bocon":{"cc":"VE","lat":9.25,"lng":-70.25,"pop":68990},"biruaca":{"cc":"VE","lat":7.84,"lng":-67.52,"pop":76553},"baruta":{"cc":"VE","lat":10.43,"lng":-66.88,"pop":244216},"barquisimeto":{"cc":"VE","lat":10.06,"lng":-69.36,"pop":1240714},"barinitas":{"cc":"VE","lat":8.76,"lng":-70.41,"pop":51556},"barinas":{"cc":"VE","lat":8.62,"lng":-70.23,"pop":397279},"araure":{"cc":"VE","lat":9.58,"lng":-69.24,"pop":181820},"altagracia de orituco":{"cc":"VE","lat":9.86,"lng":-66.38,"pop":68207},"los puertos de altagracia":{"cc":"VE","lat":10.71,"lng":-71.52,"pop":101527},"acarigua":{"cc":"VE","lat":9.55,"lng":-69.2,"pop":188278},"san josecito":{"cc":"VE","lat":7.66,"lng":-72.22,"pop":54669},"maturn":{"cc":"VE","lat":9.75,"lng":-63.18,"pop":647459},"maturin":{"cc":"VE","lat":9.75,"lng":-63.18,"pop":647459},"la fra":{"cc":"VE","lat":8.22,"lng":-72.25,"pop":61568},"la fria":{"cc":"VE","lat":8.22,"lng":-72.25,"pop":61568},"el cafetal":{"cc":"VE","lat":10.47,"lng":-66.83,"pop":80029},"la dolorita":{"cc":"VE","lat":10.49,"lng":-66.79,"pop":56846},"guasdualito":{"cc":"VE","lat":7.24,"lng":-70.73,"pop":64608},"san fernando de apure":{"cc":"VE","lat":7.89,"lng":-67.47,"pop":229197},"saint croix":{"cc":"VI","lat":17.73,"lng":-64.75,"pop":50601},"yen vinh":{"cc":"VN","lat":18.67,"lng":105.67,"pop":107082},"yn vinh":{"cc":"VN","lat":18.67,"lng":105.67,"pop":107082},"yen bai":{"cc":"VN","lat":21.72,"lng":104.91,"pop":100631},"yn bi":{"cc":"VN","lat":21.72,"lng":104.91,"pop":100631},"xun lc":{"cc":"VN","lat":10.93,"lng":107.23,"pop":253140},"xuan loc":{"cc":"VN","lat":10.93,"lng":107.23,"pop":253140},"xom cai nuoc":{"cc":"VN","lat":9.8,"lng":105.1,"pop":54397},"xm ci nc":{"cc":"VN","lat":9.8,"lng":105.1,"pop":54397},"trang bom":{"cc":"VN","lat":10.95,"lng":107.01,"pop":57560},"trng bom":{"cc":"VN","lat":10.95,"lng":107.01,"pop":57560},"vng tu":{"cc":"VN","lat":10.35,"lng":107.08,"pop":464860},"vung tau":{"cc":"VN","lat":10.35,"lng":107.08,"pop":464860},"vnh yn":{"cc":"VN","lat":21.31,"lng":105.6,"pop":119128},"vinh yen":{"cc":"VN","lat":21.31,"lng":105.6,"pop":119128},"vnh tuy":{"cc":"VN","lat":21.0,"lng":105.88,"pop":86618},"vinh tuy":{"cc":"VN","lat":21.0,"lng":105.88,"pop":86618},"vinh long":{"cc":"VN","lat":10.25,"lng":105.97,"pop":137870},"vnh long":{"cc":"VN","lat":10.25,"lng":105.97,"pop":137870},"vnh chu":{"cc":"VN","lat":9.32,"lng":105.98,"pop":183918},"vinh chau":{"cc":"VN","lat":9.32,"lng":105.98,"pop":183918},"vinh":{"cc":"VN","lat":18.67,"lng":105.69,"pop":790000},"viet yen":{"cc":"VN","lat":21.27,"lng":106.13,"pop":205900},"vit yn":{"cc":"VN","lat":21.27,"lng":106.13,"pop":205900},"viet tri":{"cc":"VN","lat":21.32,"lng":105.4,"pop":415280},"vit tr":{"cc":"VN","lat":21.32,"lng":105.4,"pop":415280},"thnh ph ung b":{"cc":"VN","lat":21.03,"lng":106.77,"pop":63829},"thanh pho uong bi":{"cc":"VN","lat":21.03,"lng":106.77,"pop":63829},"tuy hoa":{"cc":"VN","lat":13.1,"lng":109.32,"pop":155921},"tuy ha":{"cc":"VN","lat":13.1,"lng":109.32,"pop":155921},"tuyn quang":{"cc":"VN","lat":21.82,"lng":105.21,"pop":104645},"tuyen quang":{"cc":"VN","lat":21.82,"lng":105.21,"pop":104645},"tra vinh":{"cc":"VN","lat":9.95,"lng":106.34,"pop":160310},"tr vinh":{"cc":"VN","lat":9.95,"lng":106.34,"pop":160310},"trng bng":{"cc":"VN","lat":11.03,"lng":106.36,"pop":161831},"trang bang":{"cc":"VN","lat":11.03,"lng":106.36,"pop":161831},"long bien":{"cc":"VN","lat":21.03,"lng":105.9,"pop":347829},"tnh bin":{"cc":"VN","lat":10.6,"lng":104.94,"pop":143098},"tinh bien":{"cc":"VN","lat":10.6,"lng":104.94,"pop":143098},"thuong cat":{"cc":"VN","lat":21.09,"lng":105.73,"pop":87406},"thng ct":{"cc":"VN","lat":21.09,"lng":105.73,"pop":87406},"th c":{"cc":"VN","lat":10.85,"lng":106.77,"pop":524670},"thu gjuc":{"cc":"VN","lat":10.85,"lng":106.77,"pop":524670},"th du mt":{"cc":"VN","lat":10.98,"lng":106.65,"pop":373105},"thu dau mot":{"cc":"VN","lat":10.98,"lng":106.65,"pop":373105},"thuan thanh":{"cc":"VN","lat":21.05,"lng":106.08,"pop":199577},"thun thanh":{"cc":"VN","lat":21.05,"lng":106.08,"pop":199577},"thot not":{"cc":"VN","lat":10.27,"lng":105.53,"pop":158225},"tht nt":{"cc":"VN","lat":10.27,"lng":105.53,"pop":158225},"thoi lai":{"cc":"VN","lat":10.07,"lng":105.56,"pop":109684},"thi lai":{"cc":"VN","lat":10.07,"lng":105.56,"pop":109684},"ho chi minh city":{"cc":"VN","lat":10.82,"lng":106.63,"pop":14002598},"thanh liet":{"cc":"VN","lat":20.97,"lng":105.82,"pop":76238},"thanh lit":{"cc":"VN","lat":20.97,"lng":105.82,"pop":76238},"thanh hoa":{"cc":"VN","lat":19.8,"lng":105.77,"pop":850000},"thanh ha":{"cc":"VN","lat":19.8,"lng":105.77,"pop":850000},"thi nguyn":{"cc":"VN","lat":21.59,"lng":105.85,"pop":420000},"thai nguyen":{"cc":"VN","lat":21.59,"lng":105.85,"pop":420000},"thai binh":{"cc":"VN","lat":20.45,"lng":106.34,"pop":53071},"thi bnh":{"cc":"VN","lat":20.45,"lng":106.34,"pop":53071},"ty ninh":{"cc":"VN","lat":11.31,"lng":106.1,"pop":135254},"tay ninh":{"cc":"VN","lat":11.31,"lng":106.1,"pop":135254},"tay ho":{"cc":"VN","lat":21.07,"lng":105.81,"pop":168300},"ty h":{"cc":"VN","lat":21.07,"lng":105.81,"pop":168300},"tn chu":{"cc":"VN","lat":10.8,"lng":105.24,"pop":175211},"tan chau":{"cc":"VN","lat":10.8,"lng":105.24,"pop":175211},"tan binh":{"cc":"VN","lat":10.8,"lng":106.66,"pop":89373},"tn bnh":{"cc":"VN","lat":10.8,"lng":106.66,"pop":89373},"tan an":{"cc":"VN","lat":10.54,"lng":106.41,"pop":215250},"tn an":{"cc":"VN","lat":10.54,"lng":106.41,"pop":215250},"tam k":{"cc":"VN","lat":15.57,"lng":108.47,"pop":165240},"tam ky":{"cc":"VN","lat":15.57,"lng":108.47,"pop":165240},"son tay":{"cc":"VN","lat":21.14,"lng":105.51,"pop":230577},"sn ty":{"cc":"VN","lat":21.14,"lng":105.51,"pop":230577},"son la":{"cc":"VN","lat":21.33,"lng":103.92,"pop":106052},"sn la":{"cc":"VN","lat":21.33,"lng":103.92,"pop":106052},"sng cu":{"cc":"VN","lat":13.46,"lng":109.22,"pop":94066},"song cau":{"cc":"VN","lat":13.46,"lng":109.22,"pop":94066},"sc trng":{"cc":"VN","lat":9.6,"lng":105.97,"pop":221430},"soc trang":{"cc":"VN","lat":9.6,"lng":105.97,"pop":221430},"sam son":{"cc":"VN","lat":19.73,"lng":105.9,"pop":129801},"sm sn":{"cc":"VN","lat":19.73,"lng":105.9,"pop":129801},"sa dec":{"cc":"VN","lat":10.29,"lng":105.76,"pop":214610},"rch gi":{"cc":"VN","lat":10.01,"lng":105.08,"pop":459860},"rach gia":{"cc":"VN","lat":10.01,"lng":105.08,"pop":459860},"qui nhon":{"cc":"VN","lat":13.78,"lng":109.22,"pop":519208},"ba gjon":{"cc":"VN","lat":17.75,"lng":106.42,"pop":106413},"ba n":{"cc":"VN","lat":17.75,"lng":106.42,"pop":106413},"qung ngi":{"cc":"VN","lat":15.12,"lng":108.79,"pop":278496},"quang ngai":{"cc":"VN","lat":15.12,"lng":108.79,"pop":278496},"pleiku":{"cc":"VN","lat":13.98,"lng":108.0,"pop":114225},"tu son":{"cc":"VN","lat":21.1,"lng":105.97,"pop":65697},"t sn":{"cc":"VN","lat":21.1,"lng":105.97,"pop":65697},"phu tho":{"cc":"VN","lat":21.4,"lng":105.22,"pop":91650},"ph th":{"cc":"VN","lat":21.4,"lng":105.22,"pop":91650},"phu my":{"cc":"VN","lat":10.63,"lng":107.07,"pop":287055},"ph m":{"cc":"VN","lat":10.63,"lng":107.07,"pop":287055},"ph l":{"cc":"VN","lat":20.55,"lng":105.91,"pop":136654},"phu ly":{"cc":"VN","lat":20.55,"lng":105.91,"pop":136654},"phuc yen":{"cc":"VN","lat":21.24,"lng":105.7,"pop":180000},"phc yn":{"cc":"VN","lat":21.24,"lng":105.7,"pop":180000},"phong thanh":{"cc":"VN","lat":9.32,"lng":105.35,"pop":53912},"phong thnh":{"cc":"VN","lat":9.32,"lng":105.35,"pop":53912},"phong gjien":{"cc":"VN","lat":16.58,"lng":107.36,"pop":114820},"phong in":{"cc":"VN","lat":16.58,"lng":107.36,"pop":114820},"phan thiet":{"cc":"VN","lat":10.93,"lng":108.1,"pop":228536},"phan thit":{"cc":"VN","lat":10.93,"lng":108.1,"pop":228536},"phan rang-thap cham":{"cc":"VN","lat":11.56,"lng":108.99,"pop":207998},"phan rang-thp chm":{"cc":"VN","lat":11.56,"lng":108.99,"pop":207998},"mn":{"cc":"VN","lat":10.11,"lng":105.62,"pop":129683},"o mon":{"cc":"VN","lat":10.11,"lng":105.62,"pop":129683},"ninh hoa":{"cc":"VN","lat":12.49,"lng":109.12,"pop":230566},"ninh ha":{"cc":"VN","lat":12.49,"lng":109.12,"pop":230566},"nha trang":{"cc":"VN","lat":12.25,"lng":109.19,"pop":579000},"nghi sn":{"cc":"VN","lat":19.33,"lng":105.82,"pop":302210},"nghi son":{"cc":"VN","lat":19.33,"lng":105.82,"pop":302210},"nghia lo":{"cc":"VN","lat":21.6,"lng":104.52,"pop":68206},"ngha l":{"cc":"VN","lat":21.6,"lng":104.52,"pop":68206},"nghia gjo":{"cc":"VN","lat":21.05,"lng":105.8,"pop":96418},"ngha":{"cc":"VN","lat":21.05,"lng":105.8,"pop":96418},"nam gjinh":{"cc":"VN","lat":20.43,"lng":106.18,"pop":448225},"nam nh":{"cc":"VN","lat":20.43,"lng":106.18,"pop":448225},"my tho":{"cc":"VN","lat":10.36,"lng":106.36,"pop":270700},"m tho":{"cc":"VN","lat":10.36,"lng":106.36,"pop":270700},"my hao":{"cc":"VN","lat":20.92,"lng":106.08,"pop":115608},"m ho":{"cc":"VN","lat":20.92,"lng":106.08,"pop":115608},"mng ci":{"cc":"VN","lat":21.52,"lng":107.97,"pop":108553},"mong cai":{"cc":"VN","lat":21.52,"lng":107.97,"pop":108553},"thi tran mao khe":{"cc":"VN","lat":21.06,"lng":106.59,"pop":72012},"th trn mo kh":{"cc":"VN","lat":21.06,"lng":106.59,"pop":72012},"long xuyen":{"cc":"VN","lat":10.39,"lng":105.44,"pop":286140},"long xuyn":{"cc":"VN","lat":10.39,"lng":105.44,"pop":286140},"long m":{"cc":"VN","lat":9.68,"lng":105.57,"pop":61781},"long my":{"cc":"VN","lat":9.68,"lng":105.57,"pop":61781},"lao cai":{"cc":"VN","lat":22.49,"lng":103.97,"pop":130671},"lo cai":{"cc":"VN","lat":22.49,"lng":103.97,"pop":130671},"lang son":{"cc":"VN","lat":21.85,"lng":106.76,"pop":200108},"lng sn":{"cc":"VN","lat":21.85,"lng":106.76,"pop":200108},"th trn phc bu":{"cc":"VN","lat":10.53,"lng":107.4,"pop":51895},"thi tran phuoc buu":{"cc":"VN","lat":10.53,"lng":107.4,"pop":51895},"la gi":{"cc":"VN","lat":10.66,"lng":107.77,"pop":160652},"k anh":{"cc":"VN","lat":18.06,"lng":106.3,"pop":150226},"ky anh":{"cc":"VN","lat":18.06,"lng":106.3,"pop":150226},"kon tum":{"cc":"VN","lat":14.35,"lng":108.01,"pop":205762},"kien an":{"cc":"VN","lat":20.81,"lng":106.63,"pop":118047},"kin an":{"cc":"VN","lat":20.81,"lng":106.63,"pop":118047},"hng tr":{"cc":"VN","lat":16.53,"lng":107.48,"pop":72677},"huong tra":{"cc":"VN","lat":16.53,"lng":107.48,"pop":72677},"huong thuy":{"cc":"VN","lat":16.42,"lng":107.64,"pop":95299},"hng thy":{"cc":"VN","lat":16.42,"lng":107.64,"pop":95299},"hung yen":{"cc":"VN","lat":20.65,"lng":106.05,"pop":118646},"hng yn":{"cc":"VN","lat":20.65,"lng":106.05,"pop":118646},"hue":{"cc":"VN","lat":16.46,"lng":107.6,"pop":1380000},"hu":{"cc":"VN","lat":16.46,"lng":107.6,"pop":1380000},"hng ng":{"cc":"VN","lat":10.8,"lng":105.35,"pop":101155},"hong ngu":{"cc":"VN","lat":10.8,"lng":105.35,"pop":101155},"ha long":{"cc":"VN","lat":20.95,"lng":107.07,"pop":270054},"h long":{"cc":"VN","lat":20.95,"lng":107.07,"pop":270054},"ha bnh":{"cc":"VN","lat":20.82,"lng":105.34,"pop":105260},"hoa binh":{"cc":"VN","lat":20.82,"lng":105.34,"pop":105260},"ha tinh":{"cc":"VN","lat":18.34,"lng":105.91,"pop":266321},"h tnh":{"cc":"VN","lat":18.34,"lng":105.91,"pop":266321},"h tin":{"cc":"VN","lat":10.38,"lng":104.49,"pop":100560},"ha tien":{"cc":"VN","lat":10.38,"lng":104.49,"pop":100560},"hanoi":{"cc":"VN","lat":21.02,"lng":105.84,"pop":8053663},"haiphong":{"cc":"VN","lat":20.86,"lng":106.68,"pop":2625200},"hi dng":{"cc":"VN","lat":20.94,"lng":106.33,"pop":241373},"hai duong":{"cc":"VN","lat":20.94,"lng":106.33,"pop":241373},"hi chu":{"cc":"VN","lat":15.92,"lng":108.13,"pop":131427},"hai chau":{"cc":"VN","lat":15.92,"lng":108.13,"pop":131427},"h giang":{"cc":"VN","lat":22.82,"lng":104.98,"pop":55559},"ha giang":{"cc":"VN","lat":22.82,"lng":104.98,"pop":55559},"h ng":{"cc":"VN","lat":20.97,"lng":105.78,"pop":50877},"ha gjong":{"cc":"VN","lat":20.97,"lng":105.78,"pop":50877},"go vap":{"cc":"VN","lat":10.82,"lng":106.68,"pop":110850},"g vp":{"cc":"VN","lat":10.82,"lng":106.68,"pop":110850},"go cong":{"cc":"VN","lat":10.37,"lng":106.67,"pop":97709},"g cng":{"cc":"VN","lat":10.37,"lng":106.67,"pop":97709},"gia rai":{"cc":"VN","lat":9.23,"lng":105.46,"pop":145340},"gi rai":{"cc":"VN","lat":9.23,"lng":105.46,"pop":145340},"gia ngha":{"cc":"VN","lat":12.0,"lng":107.69,"pop":85082},"gia nghia":{"cc":"VN","lat":12.0,"lng":107.69,"pop":85082},"c trng":{"cc":"VN","lat":11.74,"lng":108.37,"pop":161232},"gjuc trong":{"cc":"VN","lat":11.74,"lng":108.37,"pop":161232},"c ph":{"cc":"VN","lat":14.81,"lng":108.96,"pop":155743},"gjuc pho":{"cc":"VN","lat":14.81,"lng":108.96,"pop":155743},"gjo son":{"cc":"VN","lat":20.71,"lng":106.79,"pop":51417},"sn":{"cc":"VN","lat":20.71,"lng":106.79,"pop":51417},"gjong xoai":{"cc":"VN","lat":11.53,"lng":106.88,"pop":168000},"ng xoi":{"cc":"VN","lat":11.53,"lng":106.88,"pop":168000},"th trn ng triu":{"cc":"VN","lat":21.08,"lng":106.51,"pop":248896},"thi tran gjong trieu":{"cc":"VN","lat":21.08,"lng":106.51,"pop":248896},"gjong hoi":{"cc":"VN","lat":17.47,"lng":106.62,"pop":133672},"ng hi":{"cc":"VN","lat":17.47,"lng":106.62,"pop":133672},"ng h":{"cc":"VN","lat":16.82,"lng":107.1,"pop":164228},"dong ha":{"cc":"VN","lat":16.82,"lng":107.1,"pop":164228},"dien bien phu":{"cc":"VN","lat":21.39,"lng":103.02,"pop":84672},"gjien ban":{"cc":"VN","lat":15.89,"lng":108.25,"pop":226564},"in bn":{"cc":"VN","lat":15.89,"lng":108.25,"pop":226564},"d an":{"cc":"VN","lat":10.91,"lng":106.77,"pop":463023},"di an":{"cc":"VN","lat":10.91,"lng":106.77,"pop":463023},"da nang":{"cc":"VN","lat":16.07,"lng":108.22,"pop":1276000},"da lat":{"cc":"VN","lat":11.95,"lng":108.44,"pop":258014},"lt":{"cc":"VN","lat":11.95,"lng":108.44,"pop":258014},"thi tran gjai tu":{"cc":"VN","lat":21.63,"lng":105.64,"pop":179192},"th trn i t":{"cc":"VN","lat":21.63,"lng":105.64,"pop":179192},"dai mo":{"cc":"VN","lat":20.98,"lng":105.77,"pop":59980},"di m":{"cc":"VN","lat":20.98,"lng":105.77,"pop":59980},"cu chi":{"cc":"VN","lat":10.97,"lng":106.49,"pop":75000},"c chi":{"cc":"VN","lat":10.97,"lng":106.49,"pop":75000},"co gjo":{"cc":"VN","lat":10.09,"lng":105.43,"pop":116576},"chu":{"cc":"VN","lat":21.37,"lng":106.57,"pop":127881},"chon thanh":{"cc":"VN","lat":11.43,"lng":106.64,"pop":121083},"chn thnh":{"cc":"VN","lat":11.43,"lng":106.64,"pop":121083},"ch ln":{"cc":"VN","lat":10.75,"lng":106.65,"pop":561000},"cho lon":{"cc":"VN","lat":10.75,"lng":106.65,"pop":561000},"ch linh":{"cc":"VN","lat":21.07,"lng":106.32,"pop":220421},"chi linh":{"cc":"VN","lat":21.07,"lng":106.32,"pop":220421},"chau phong":{"cc":"VN","lat":10.72,"lng":105.13,"pop":56322},"chu phong":{"cc":"VN","lat":10.72,"lng":105.13,"pop":56322},"chau gjoc":{"cc":"VN","lat":10.7,"lng":105.12,"pop":70239},"chu c":{"cc":"VN","lat":10.7,"lng":105.12,"pop":70239},"cao lanh":{"cc":"VN","lat":10.46,"lng":105.63,"pop":211912},"cao lnh":{"cc":"VN","lat":10.46,"lng":105.63,"pop":211912},"cao bang":{"cc":"VN","lat":22.67,"lng":106.26,"pop":73549},"cao bng":{"cc":"VN","lat":22.67,"lng":106.26,"pop":73549},"cn th":{"cc":"VN","lat":10.04,"lng":105.79,"pop":1507187},"can tho":{"cc":"VN","lat":10.04,"lng":105.79,"pop":1507187},"cn gi":{"cc":"VN","lat":10.41,"lng":106.95,"pop":55137},"can gio":{"cc":"VN","lat":10.41,"lng":106.95,"pop":55137},"can gjuoc":{"cc":"VN","lat":10.51,"lng":106.6,"pop":50473},"cn c":{"cc":"VN","lat":10.51,"lng":106.6,"pop":50473},"can giuoc":{"cc":"VN","lat":10.61,"lng":106.67,"pop":152200},"cn giuc":{"cc":"VN","lat":10.61,"lng":106.67,"pop":152200},"cam ranh":{"cc":"VN","lat":11.92,"lng":109.16,"pop":146771},"cam pha mines":{"cc":"VN","lat":21.02,"lng":107.3,"pop":135477},"cm ph mines":{"cc":"VN","lat":21.02,"lng":107.3,"pop":135477},"cm ph":{"cc":"VN","lat":21.01,"lng":107.27,"pop":190232},"cam pha":{"cc":"VN","lat":21.01,"lng":107.27,"pop":190232},"c mau":{"cc":"VN","lat":9.18,"lng":105.15,"pop":226372},"ca mau":{"cc":"VN","lat":9.18,"lng":105.15,"pop":226372},"ci rng":{"cc":"VN","lat":10.0,"lng":105.75,"pop":86278},"cai rang":{"cc":"VN","lat":10.0,"lng":105.75,"pop":86278},"cai ly":{"cc":"VN","lat":10.4,"lng":106.12,"pop":143050},"cai lay":{"cc":"VN","lat":10.4,"lng":106.12,"pop":143050},"buon ma thuot":{"cc":"VN","lat":12.67,"lng":108.04,"pop":434256},"bun ma thut":{"cc":"VN","lat":12.67,"lng":108.04,"pop":434256},"bun h":{"cc":"VN","lat":12.95,"lng":108.3,"pop":127920},"buon ho":{"cc":"VN","lat":12.95,"lng":108.3,"pop":127920},"binh thuy":{"cc":"VN","lat":10.07,"lng":105.74,"pop":113565},"bnh thy":{"cc":"VN","lat":10.07,"lng":105.74,"pop":113565},"bm sn":{"cc":"VN","lat":20.08,"lng":105.86,"pop":53754},"bim son":{"cc":"VN","lat":20.08,"lng":105.86,"pop":53754},"bin ha":{"cc":"VN","lat":10.94,"lng":106.82,"pop":1272235},"bien hoa":{"cc":"VN","lat":10.94,"lng":106.82,"pop":1272235},"bn tre":{"cc":"VN","lat":10.24,"lng":106.38,"pop":124449},"ben tre":{"cc":"VN","lat":10.24,"lng":106.38,"pop":124449},"ben cat":{"cc":"VN","lat":11.15,"lng":106.6,"pop":364578},"bn ct":{"cc":"VN","lat":11.15,"lng":106.6,"pop":364578},"ba vi":{"cc":"VN","lat":21.08,"lng":105.38,"pop":282600},"ba v":{"cc":"VN","lat":21.08,"lng":105.38,"pop":282600},"bo lc":{"cc":"VN","lat":11.55,"lng":107.81,"pop":170920},"bao loc":{"cc":"VN","lat":11.55,"lng":107.81,"pop":170920},"th trn thun chu":{"cc":"VN","lat":21.44,"lng":103.69,"pop":153000},"thi tran thuan chau":{"cc":"VN","lat":21.44,"lng":103.69,"pop":153000},"bac quang":{"cc":"VN","lat":22.48,"lng":104.87,"pop":118690},"bc quang":{"cc":"VN","lat":22.48,"lng":104.87,"pop":118690},"bc ninh":{"cc":"VN","lat":21.19,"lng":106.08,"pop":287658},"bac ninh":{"cc":"VN","lat":21.19,"lng":106.08,"pop":287658},"bac lieu":{"cc":"VN","lat":9.29,"lng":105.73,"pop":156110},"bc liu":{"cc":"VN","lat":9.29,"lng":105.73,"pop":156110},"bch mai":{"cc":"VN","lat":20.98,"lng":105.83,"pop":91308},"bach mai":{"cc":"VN","lat":20.98,"lng":105.83,"pop":91308},"bc giang":{"cc":"VN","lat":21.27,"lng":106.19,"pop":450000},"bac giang":{"cc":"VN","lat":21.27,"lng":106.19,"pop":450000},"lai vung":{"cc":"VN","lat":10.26,"lng":105.59,"pop":80649},"an nhn":{"cc":"VN","lat":13.89,"lng":109.11,"pop":308396},"an nhon":{"cc":"VN","lat":13.89,"lng":109.11,"pop":308396},"an khe":{"cc":"VN","lat":13.95,"lng":108.65,"pop":81600},"an kh":{"cc":"VN","lat":13.95,"lng":108.65,"pop":81600},"an hi":{"cc":"VN","lat":16.07,"lng":108.23,"pop":82635},"an hai":{"cc":"VN","lat":16.07,"lng":108.23,"pop":82635},"bnh thnh":{"cc":"VN","lat":10.81,"lng":106.71,"pop":552164},"binh thanh":{"cc":"VN","lat":10.81,"lng":106.71,"pop":552164},"ba dinh":{"cc":"VN","lat":21.04,"lng":105.83,"pop":221893},"mui ne":{"cc":"VN","lat":10.93,"lng":108.28,"pop":50166},"tn uyn":{"cc":"VN","lat":11.08,"lng":106.79,"pop":52873},"tan uyen":{"cc":"VN","lat":11.08,"lng":106.79,"pop":52873},"cung kiem":{"cc":"VN","lat":21.19,"lng":106.16,"pop":80000},"cung kim":{"cc":"VN","lat":21.19,"lng":106.16,"pop":80000},"phu quoc":{"cc":"VN","lat":10.22,"lng":103.97,"pop":294419},"bnh minh":{"cc":"VN","lat":10.07,"lng":105.82,"pop":94862},"binh minh":{"cc":"VN","lat":10.07,"lng":105.82,"pop":94862},"thanh pho ba ria":{"cc":"VN","lat":10.5,"lng":107.17,"pop":235192},"thnh ph b ra":{"cc":"VN","lat":10.5,"lng":107.17,"pop":235192},"sc sn":{"cc":"VN","lat":21.26,"lng":105.85,"pop":85431},"soc son":{"cc":"VN","lat":21.26,"lng":105.85,"pop":85431},"cau giay":{"cc":"VN","lat":21.03,"lng":105.8,"pop":292536},"cu giy":{"cc":"VN","lat":21.03,"lng":105.8,"pop":292536},"thanh xun":{"cc":"VN","lat":20.99,"lng":105.8,"pop":293292},"thanh xuan":{"cc":"VN","lat":20.99,"lng":105.8,"pop":293292},"gjong gja":{"cc":"VN","lat":21.01,"lng":105.83,"pop":371606},"ng a":{"cc":"VN","lat":21.01,"lng":105.83,"pop":371606},"hon kim":{"cc":"VN","lat":21.03,"lng":105.85,"pop":135618},"hoan kiem":{"cc":"VN","lat":21.03,"lng":105.85,"pop":135618},"hai b trng":{"cc":"VN","lat":21.01,"lng":105.85,"pop":303586},"hai ba trung":{"cc":"VN","lat":21.01,"lng":105.85,"pop":303586},"thi ha":{"cc":"VN","lat":18.92,"lng":104.97,"pop":66127},"thai hoa":{"cc":"VN","lat":18.92,"lng":104.97,"pop":66127},"thanh kh":{"cc":"VN","lat":16.07,"lng":108.19,"pop":201240},"thanh khe":{"cc":"VN","lat":16.07,"lng":108.19,"pop":201240},"cam le":{"cc":"VN","lat":16.02,"lng":108.2,"pop":78837},"cm l":{"cc":"VN","lat":16.02,"lng":108.2,"pop":78837},"sn tr":{"cc":"VN","lat":16.06,"lng":108.23,"pop":86890},"son tra":{"cc":"VN","lat":16.06,"lng":108.23,"pop":86890},"ha cng":{"cc":"VN","lat":16.04,"lng":108.18,"pop":119363},"hoa cuong":{"cc":"VN","lat":16.04,"lng":108.18,"pop":119363},"nui thanh":{"cc":"VN","lat":15.43,"lng":108.66,"pop":69406},"ni thnh":{"cc":"VN","lat":15.43,"lng":108.66,"pop":69406},"long khanh":{"cc":"VN","lat":10.93,"lng":107.25,"pop":171276},"long khnh":{"cc":"VN","lat":10.93,"lng":107.25,"pop":171276},"hoa thanh":{"cc":"VN","lat":11.29,"lng":106.13,"pop":147666},"ha thnh":{"cc":"VN","lat":11.29,"lng":106.13,"pop":147666},"duyn hi":{"cc":"VN","lat":9.63,"lng":106.49,"pop":69961},"duyen hai":{"cc":"VN","lat":9.63,"lng":106.49,"pop":69961},"vnh thnh":{"cc":"VN","lat":10.22,"lng":105.4,"pop":98399},"vinh thanh":{"cc":"VN","lat":10.22,"lng":105.4,"pop":98399},"nga bay":{"cc":"VN","lat":9.81,"lng":105.82,"pop":101192},"ng by":{"cc":"VN","lat":9.81,"lng":105.82,"pop":101192},"trn vn thi":{"cc":"VN","lat":9.08,"lng":104.98,"pop":55897},"tran van thoi":{"cc":"VN","lat":9.08,"lng":104.98,"pop":55897},"qun bn":{"cc":"VN","lat":10.77,"lng":106.71,"pop":199329},"quan bon":{"cc":"VN","lat":10.77,"lng":106.71,"pop":199329},"qun su":{"cc":"VN","lat":10.75,"lng":106.65,"pop":271050},"quan sau":{"cc":"VN","lat":10.75,"lng":106.65,"pop":271050},"qun nm":{"cc":"VN","lat":10.76,"lng":106.67,"pop":187510},"quan nam":{"cc":"VN","lat":10.76,"lng":106.67,"pop":187510},"quan muoi mot":{"cc":"VN","lat":10.76,"lng":106.64,"pop":332536},"qun mi mt":{"cc":"VN","lat":10.76,"lng":106.64,"pop":332536},"quan muoi":{"cc":"VN","lat":10.77,"lng":106.67,"pop":399000},"qun mi":{"cc":"VN","lat":10.77,"lng":106.67,"pop":399000},"quan ba":{"cc":"VN","lat":10.77,"lng":106.69,"pop":220375},"qun ba":{"cc":"VN","lat":10.77,"lng":106.69,"pop":220375},"gia lm":{"cc":"VN","lat":21.02,"lng":105.94,"pop":309353},"gia lam":{"cc":"VN","lat":21.02,"lng":105.94,"pop":309353},"cua nam":{"cc":"VN","lat":21.02,"lng":105.85,"pop":52750},"ca nam":{"cc":"VN","lat":21.02,"lng":105.85,"pop":52750},"quan gjuc thinh":{"cc":"VN","lat":10.31,"lng":105.74,"pop":132000},"qun c thnh":{"cc":"VN","lat":10.31,"lng":105.74,"pop":132000},"huyen lam ha":{"cc":"VN","lat":11.82,"lng":108.21,"pop":144707},"huyn lm h":{"cc":"VN","lat":11.82,"lng":108.21,"pop":144707},"ph quc":{"cc":"VN","lat":10.29,"lng":104.01,"pop":179480},"thun an":{"cc":"VN","lat":10.92,"lng":106.71,"pop":588616},"thuan an":{"cc":"VN","lat":10.92,"lng":106.71,"pop":588616},"bac tu liem":{"cc":"VN","lat":21.07,"lng":105.75,"pop":340605},"bc t lim":{"cc":"VN","lat":21.07,"lng":105.75,"pop":340605},"vinhomes ocean park":{"cc":"VN","lat":20.99,"lng":105.95,"pop":60000},"vinhomes smart city":{"cc":"VN","lat":21.0,"lng":105.74,"pop":50000},"vinhomes times city":{"cc":"VN","lat":20.99,"lng":105.87,"pop":50000},"thnh ph sng cng":{"cc":"VN","lat":21.48,"lng":105.84,"pop":128357},"thanh pho song cong":{"cc":"VN","lat":21.48,"lng":105.84,"pop":128357},"nga nam":{"cc":"VN","lat":9.57,"lng":105.6,"pop":58588},"ng nm":{"cc":"VN","lat":9.57,"lng":105.6,"pop":58588},"yen hoa":{"cc":"VN","lat":21.02,"lng":105.79,"pop":77029},"yn ha":{"cc":"VN","lat":21.02,"lng":105.79,"pop":77029},"linh m":{"cc":"VN","lat":20.96,"lng":105.83,"pop":70000},"linh gjam":{"cc":"VN","lat":20.96,"lng":105.83,"pop":70000},"bo gje":{"cc":"VN","lat":21.06,"lng":105.87,"pop":120028},"hoang mai":{"cc":"VN","lat":19.27,"lng":105.72,"pop":113360},"hong mai":{"cc":"VN","lat":19.27,"lng":105.72,"pop":113360},"pho yen":{"cc":"VN","lat":21.42,"lng":105.89,"pop":231363},"ph yn":{"cc":"VN","lat":21.42,"lng":105.89,"pop":231363},"duong noi":{"cc":"VN","lat":20.98,"lng":105.75,"pop":56091},"dng ni":{"cc":"VN","lat":20.98,"lng":105.75,"pop":56091},"gjinh cong":{"cc":"VN","lat":20.98,"lng":105.83,"pop":85502},"nh cng":{"cc":"VN","lat":20.98,"lng":105.83,"pop":85502},"ng ngc":{"cc":"VN","lat":21.08,"lng":105.77,"pop":83544},"gjong ngac":{"cc":"VN","lat":21.08,"lng":105.77,"pop":83544},"ging v":{"cc":"VN","lat":21.03,"lng":105.81,"pop":76658},"giang vo":{"cc":"VN","lat":21.03,"lng":105.81,"pop":76658},"hong lit":{"cc":"VN","lat":20.96,"lng":105.84,"pop":55820},"hoang liet":{"cc":"VN","lat":20.96,"lng":105.84,"pop":55820},"khuong gjinh":{"cc":"VN","lat":20.98,"lng":105.82,"pop":93780},"khng nh":{"cc":"VN","lat":20.98,"lng":105.82,"pop":93780},"kin hng":{"cc":"VN","lat":20.96,"lng":105.79,"pop":70833},"kien hung":{"cc":"VN","lat":20.96,"lng":105.79,"pop":70833},"phc li":{"cc":"VN","lat":21.05,"lng":105.93,"pop":66790},"phuc loi":{"cc":"VN","lat":21.05,"lng":105.93,"pop":66790},"tuong mai":{"cc":"VN","lat":20.99,"lng":105.86,"pop":136292},"tng mai":{"cc":"VN","lat":20.99,"lng":105.86,"pop":136292},"ferizaj":{"cc":"XK","lat":42.37,"lng":21.16,"pop":59504},"suva reka":{"cc":"XK","lat":42.36,"lng":20.82,"pop":72229},"prizren":{"cc":"XK","lat":42.21,"lng":20.74,"pop":171464},"pristina":{"cc":"XK","lat":42.67,"lng":21.17,"pop":550000},"mitrovic":{"cc":"XK","lat":42.88,"lng":20.87,"pop":107045},"mitrovice":{"cc":"XK","lat":42.88,"lng":20.87,"pop":107045},"gjilan":{"cc":"XK","lat":42.46,"lng":21.47,"pop":51912},"glogovac":{"cc":"XK","lat":42.63,"lng":20.89,"pop":58579},"decan":{"cc":"XK","lat":42.54,"lng":20.29,"pop":50500},"dean":{"cc":"XK","lat":42.54,"lng":20.29,"pop":50500},"gjakove":{"cc":"XK","lat":42.38,"lng":20.43,"pop":94158},"gjakov":{"cc":"XK","lat":42.38,"lng":20.43,"pop":94158},"zabd":{"cc":"YE","lat":14.2,"lng":43.32,"pop":52590},"zabid":{"cc":"YE","lat":14.2,"lng":43.32,"pop":52590},"taiz":{"cc":"YE","lat":13.58,"lng":44.02,"pop":940600},"sayyn":{"cc":"YE","lat":15.17,"lng":44.32,"pop":69404},"sayyan":{"cc":"YE","lat":15.17,"lng":44.32,"pop":69404},"sanaa":{"cc":"YE","lat":15.35,"lng":44.21,"pop":1937451},"sadah":{"cc":"YE","lat":16.94,"lng":43.76,"pop":51870},"ibb":{"cc":"YE","lat":13.97,"lng":44.18,"pop":771514},"dhamar":{"cc":"YE","lat":14.54,"lng":44.41,"pop":160114},"dhamr":{"cc":"YE","lat":14.54,"lng":44.41,"pop":160114},"amran":{"cc":"YE","lat":15.66,"lng":43.94,"pop":90792},"amrn":{"cc":"YE","lat":15.66,"lng":43.94,"pop":90792},"mukalla":{"cc":"YE","lat":14.54,"lng":49.12,"pop":594951},"al udaydah":{"cc":"YE","lat":14.8,"lng":42.95,"pop":734699},"al hudaydah":{"cc":"YE","lat":14.8,"lng":42.95,"pop":734699},"aden":{"cc":"YE","lat":12.78,"lng":45.04,"pop":1079670},"mamoudzou":{"cc":"YT","lat":-12.78,"lng":45.23,"pop":54831},"roodepoort":{"cc":"ZA","lat":-26.16,"lng":27.87,"pop":326416},"emalahleni":{"cc":"ZA","lat":-25.87,"lng":29.23,"pop":373403},"westonaria":{"cc":"ZA","lat":-26.32,"lng":27.65,"pop":156831},"welkom":{"cc":"ZA","lat":-27.98,"lng":26.74,"pop":431944},"bela bela":{"cc":"ZA","lat":-24.88,"lng":28.28,"pop":90210},"vryheid":{"cc":"ZA","lat":-27.77,"lng":30.79,"pop":150012},"vryburg":{"cc":"ZA","lat":-26.96,"lng":24.73,"pop":55879},"virginia":{"cc":"ZA","lat":-28.1,"lng":26.87,"pop":122502},"viljoenskroon":{"cc":"ZA","lat":-27.21,"lng":26.95,"pop":54955},"vereeniging":{"cc":"ZA","lat":-26.67,"lng":27.93,"pop":474681},"vanderbijlpark":{"cc":"ZA","lat":-26.71,"lng":27.84,"pop":246754},"upington":{"cc":"ZA","lat":-28.45,"lng":21.26,"pop":71373},"mthatha":{"cc":"ZA","lat":-31.59,"lng":28.78,"pop":164848},"kariega":{"cc":"ZA","lat":-33.76,"lng":25.4,"pop":291052},"trichardt":{"cc":"ZA","lat":-26.49,"lng":29.23,"pop":52776},"tongaat":{"cc":"ZA","lat":-29.57,"lng":31.12,"pop":64829},"tokoza":{"cc":"ZA","lat":-26.36,"lng":28.13,"pop":106000},"thohoyandou":{"cc":"ZA","lat":-22.95,"lng":30.48,"pop":107144},"thaba nchu":{"cc":"ZA","lat":-29.21,"lng":26.84,"pop":72721},"thembisa":{"cc":"ZA","lat":-26.0,"lng":28.23,"pop":511655},"stilfontein":{"cc":"ZA","lat":-26.84,"lng":26.77,"pop":93110},"kwadukuza":{"cc":"ZA","lat":-29.33,"lng":31.29,"pop":161177},"standerton":{"cc":"ZA","lat":-26.93,"lng":29.24,"pop":101101},"springs":{"cc":"ZA","lat":-26.25,"lng":28.4,"pop":186394},"soweto":{"cc":"ZA","lat":-26.27,"lng":27.86,"pop":1695047},"soshanguve":{"cc":"ZA","lat":-25.47,"lng":28.1,"pop":872309},"schweizer-reneke":{"cc":"ZA","lat":-27.19,"lng":25.33,"pop":70214},"sasolburg":{"cc":"ZA","lat":-26.81,"lng":27.82,"pop":135828},"rustenburg":{"cc":"ZA","lat":-25.67,"lng":27.24,"pop":373695},"richards bay":{"cc":"ZA","lat":-28.78,"lng":32.04,"pop":252968},"randfontein":{"cc":"ZA","lat":-26.18,"lng":27.7,"pop":133654},"randburg":{"cc":"ZA","lat":-26.09,"lng":28.0,"pop":337053},"queenstown":{"cc":"ZA","lat":-31.9,"lng":26.88,"pop":118599},"pretoria":{"cc":"ZA","lat":-25.74,"lng":28.19,"pop":2112693},"mokopane":{"cc":"ZA","lat":-24.19,"lng":29.01,"pop":101090},"potchefstroom":{"cc":"ZA","lat":-26.72,"lng":27.1,"pop":178285},"port shepstone":{"cc":"ZA","lat":-30.74,"lng":30.45,"pop":52793},"gqeberha":{"cc":"ZA","lat":-33.96,"lng":25.61,"pop":1050078},"pinetown":{"cc":"ZA","lat":-29.82,"lng":30.89,"pop":144026},"piet retief":{"cc":"ZA","lat":-27.01,"lng":30.81,"pop":84349},"polokwane":{"cc":"ZA","lat":-23.9,"lng":29.47,"pop":272461},"pietermaritzburg":{"cc":"ZA","lat":-29.62,"lng":30.39,"pop":839327},"phuthaditjhaba":{"cc":"ZA","lat":-28.52,"lng":28.82,"pop":84258},"phalaborwa":{"cc":"ZA","lat":-23.94,"lng":31.14,"pop":109468},"parys":{"cc":"ZA","lat":-26.9,"lng":27.46,"pop":71319},"oudtshoorn":{"cc":"ZA","lat":-33.6,"lng":22.2,"pop":73694},"orkney":{"cc":"ZA","lat":-26.98,"lng":26.67,"pop":110052},"odendaalsrus":{"cc":"ZA","lat":-27.87,"lng":26.69,"pop":76371},"modimolle":{"cc":"ZA","lat":-24.7,"lng":28.4,"pop":50306},"nkowakowa":{"cc":"ZA","lat":-23.89,"lng":30.29,"pop":51350},"nigel":{"cc":"ZA","lat":-26.43,"lng":28.48,"pop":140644},"mbombela":{"cc":"ZA","lat":-25.48,"lng":30.97,"pop":110159},"mpumalanga":{"cc":"ZA","lat":-29.81,"lng":30.64,"pop":140121},"mossel bay":{"cc":"ZA","lat":-34.18,"lng":22.15,"pop":78940},"mondlo":{"cc":"ZA","lat":-27.98,"lng":30.72,"pop":53892},"mmabatho":{"cc":"ZA","lat":-25.85,"lng":25.63,"pop":76754},"middelburg":{"cc":"ZA","lat":-25.78,"lng":29.46,"pop":196263},"mdantsane":{"cc":"ZA","lat":-32.93,"lng":27.78,"pop":205504},"mafikeng":{"cc":"ZA","lat":-25.87,"lng":25.64,"pop":77110},"mabopane":{"cc":"ZA","lat":-25.51,"lng":28.06,"pop":110972},"louis trichardt":{"cc":"ZA","lat":-23.04,"lng":29.9,"pop":86854},"lichtenburg":{"cc":"ZA","lat":-26.15,"lng":26.16,"pop":65863},"ladysmith":{"cc":"ZA","lat":-28.56,"lng":29.78,"pop":143446},"kwaggafontein":{"cc":"ZA","lat":-25.33,"lng":28.94,"pop":54040},"kutloanong":{"cc":"ZA","lat":-27.83,"lng":26.75,"pop":95008},"krugersdorp":{"cc":"ZA","lat":-26.09,"lng":27.78,"pop":378821},"kroonstad":{"cc":"ZA","lat":-27.65,"lng":27.23,"pop":117152},"kokstad":{"cc":"ZA","lat":-30.55,"lng":29.42,"pop":61751},"knysna":{"cc":"ZA","lat":-34.04,"lng":23.05,"pop":68659},"klerksdorp":{"cc":"ZA","lat":-26.85,"lng":26.67,"pop":227039},"qonce":{"cc":"ZA","lat":-32.88,"lng":27.39,"pop":93072},"kimberley":{"cc":"ZA","lat":-28.73,"lng":24.76,"pop":142089},"johannesburg":{"cc":"ZA","lat":-26.2,"lng":28.04,"pop":9418183},"hammanskraal":{"cc":"ZA","lat":-25.41,"lng":28.29,"pop":112950},"grahamstown":{"cc":"ZA","lat":-33.3,"lng":26.53,"pop":91548},"graaff reinet":{"cc":"ZA","lat":-32.25,"lng":24.53,"pop":62896},"germiston":{"cc":"ZA","lat":-26.23,"lng":28.18,"pop":255863},"george":{"cc":"ZA","lat":-33.96,"lng":22.46,"pop":188580},"ga-rankuwa":{"cc":"ZA","lat":-25.62,"lng":27.99,"pop":90945},"fort beaufort":{"cc":"ZA","lat":-32.77,"lng":26.63,"pop":58419},"fochville":{"cc":"ZA","lat":-26.49,"lng":27.49,"pop":62416},"evaton":{"cc":"ZA","lat":-26.53,"lng":27.85,"pop":725468},"ermelo":{"cc":"ZA","lat":-26.53,"lng":29.98,"pop":100324},"embalenhle":{"cc":"ZA","lat":-26.53,"lng":29.07,"pop":142443},"east london":{"cc":"ZA","lat":-33.02,"lng":27.91,"pop":478676},"durban":{"cc":"ZA","lat":-29.86,"lng":31.03,"pop":3338026},"carletonville":{"cc":"ZA","lat":-26.36,"lng":27.4,"pop":182304},"brits":{"cc":"ZA","lat":-25.63,"lng":27.78,"pop":122497},"brakpan":{"cc":"ZA","lat":-26.24,"lng":28.37,"pop":305692},"botshabelo":{"cc":"ZA","lat":-29.27,"lng":26.73,"pop":309714},"bothaville":{"cc":"ZA","lat":-27.39,"lng":26.62,"pop":71934},"boksburg":{"cc":"ZA","lat":-26.21,"lng":28.26,"pop":445168},"bloemfontein":{"cc":"ZA","lat":-29.12,"lng":26.21,"pop":556637},"bhisho":{"cc":"ZA","lat":-32.85,"lng":27.44,"pop":137287},"bethal":{"cc":"ZA","lat":-26.46,"lng":29.47,"pop":72821},"benoni":{"cc":"ZA","lat":-26.19,"lng":28.32,"pop":605344},"barberton":{"cc":"ZA","lat":-25.79,"lng":31.05,"pop":67927},"alexandra":{"cc":"ZA","lat":-26.11,"lng":28.1,"pop":179624},"alberton":{"cc":"ZA","lat":-26.27,"lng":28.12,"pop":121536},"ekangala":{"cc":"ZA","lat":-25.67,"lng":28.73,"pop":58099},"somaroboro":{"cc":"ZA","lat":-25.35,"lng":28.83,"pop":114369},"midrand":{"cc":"ZA","lat":-25.98,"lng":28.12,"pop":87387},"centurion":{"cc":"ZA","lat":-25.86,"lng":28.19,"pop":236580},"stellenbosch":{"cc":"ZA","lat":-33.93,"lng":18.87,"pop":96228},"saldanha":{"cc":"ZA","lat":-33.01,"lng":17.94,"pop":68284},"paarl":{"cc":"ZA","lat":-33.73,"lng":18.98,"pop":236910},"kraaifontein":{"cc":"ZA","lat":-33.85,"lng":18.72,"pop":57911},"hermanus":{"cc":"ZA","lat":-34.42,"lng":19.23,"pop":56139},"durbanville":{"cc":"ZA","lat":-33.83,"lng":18.65,"pop":54286},"cape town":{"cc":"ZA","lat":-33.93,"lng":18.42,"pop":4772846},"atlantis":{"cc":"ZA","lat":-33.57,"lng":18.48,"pop":82736},"athlone":{"cc":"ZA","lat":-33.97,"lng":18.5,"pop":237414},"somerset west":{"cc":"ZA","lat":-34.08,"lng":18.82,"pop":225289},"musina":{"cc":"ZA","lat":-22.35,"lng":30.04,"pop":51132},"diepsloot":{"cc":"ZA","lat":-25.93,"lng":28.01,"pop":350000},"etwatwa":{"cc":"ZA","lat":-26.13,"lng":28.45,"pop":151866},"ivory park":{"cc":"ZA","lat":-26.0,"lng":28.2,"pop":184383},"ntuzuma":{"cc":"ZA","lat":-29.74,"lng":30.95,"pop":125394},"nchelenge":{"cc":"ZM","lat":-9.35,"lng":28.73,"pop":77746},"nakonde":{"cc":"ZM","lat":-9.34,"lng":32.74,"pop":91107},"mpulungu":{"cc":"ZM","lat":-8.76,"lng":31.11,"pop":55405},"solwezi":{"cc":"ZM","lat":-12.17,"lng":26.39,"pop":301370},"samfya":{"cc":"ZM","lat":-11.36,"lng":29.56,"pop":51309},"petauke":{"cc":"ZM","lat":-14.24,"lng":31.32,"pop":58156},"ndola":{"cc":"ZM","lat":-12.96,"lng":28.64,"pop":627503},"mufulira":{"cc":"ZM","lat":-12.55,"lng":28.24,"pop":169136},"mpika":{"cc":"ZM","lat":-11.83,"lng":31.45,"pop":63740},"monze":{"cc":"ZM","lat":-16.27,"lng":27.48,"pop":60281},"mongu":{"cc":"ZM","lat":-15.25,"lng":23.13,"pop":111450},"mazabuka":{"cc":"ZM","lat":-15.86,"lng":27.75,"pop":104412},"lusaka":{"cc":"ZM","lat":-15.41,"lng":28.29,"pop":2212301},"luanshya":{"cc":"ZM","lat":-13.14,"lng":28.42,"pop":193293},"livingstone":{"cc":"ZM","lat":-17.84,"lng":25.85,"pop":178361},"kitwe":{"cc":"ZM","lat":-12.8,"lng":28.21,"pop":665961},"kapiri mposhi":{"cc":"ZM","lat":-13.97,"lng":28.67,"pop":83211},"kalulushi":{"cc":"ZM","lat":-12.84,"lng":28.09,"pop":104046},"kafue":{"cc":"ZM","lat":-15.77,"lng":28.18,"pop":104174},"kabwe":{"cc":"ZM","lat":-14.45,"lng":28.45,"pop":288598},"chongwe":{"cc":"ZM","lat":-15.33,"lng":28.68,"pop":57443},"choma":{"cc":"ZM","lat":-16.81,"lng":26.99,"pop":98974},"chipata":{"cc":"ZM","lat":-13.63,"lng":32.65,"pop":327059},"chingola":{"cc":"ZM","lat":-12.53,"lng":27.88,"pop":256560},"chililabombwe":{"cc":"ZM","lat":-12.36,"lng":27.82,"pop":113876},"chilanga township":{"cc":"ZM","lat":-15.57,"lng":28.27,"pop":54046},"chunga":{"cc":"ZM","lat":-15.32,"lng":28.27,"pop":115539},"madido":{"cc":"ZM","lat":-15.35,"lng":28.37,"pop":80782},"namalombwe":{"cc":"ZM","lat":-15.39,"lng":28.19,"pop":97758},"zvishavane":{"cc":"ZW","lat":-20.33,"lng":30.07,"pop":59717},"ruwa":{"cc":"ZW","lat":-17.89,"lng":31.24,"pop":94083},"norton":{"cc":"ZW","lat":-17.88,"lng":30.7,"pop":87039},"mutare":{"cc":"ZW","lat":-18.97,"lng":32.67,"pop":224802},"masvingo":{"cc":"ZW","lat":-20.06,"lng":30.83,"pop":90286},"marondera":{"cc":"ZW","lat":-18.19,"lng":31.55,"pop":66204},"kwekwe":{"cc":"ZW","lat":-18.93,"lng":29.81,"pop":119863},"harare":{"cc":"ZW","lat":-17.83,"lng":31.05,"pop":1542813},"gweru":{"cc":"ZW","lat":-19.45,"lng":29.82,"pop":158200},"chinhoyi":{"cc":"ZW","lat":-17.37,"lng":30.2,"pop":90800},"chegutu":{"cc":"ZW","lat":-18.13,"lng":30.14,"pop":65800},"bulawayo":{"cc":"ZW","lat":-20.15,"lng":28.58,"pop":665952},"bindura":{"cc":"ZW","lat":-17.3,"lng":31.33,"pop":50400},"beitbridge":{"cc":"ZW","lat":-22.22,"lng":30.0,"pop":58574},"epworth":{"cc":"ZW","lat":-17.89,"lng":31.15,"pop":206365},"chitungwiza":{"cc":"ZW","lat":-18.01,"lng":31.08,"pop":371246}}; + + // alias → canonical city key + const ALIASES = {"bangalore":"bengaluru","bombay":"mumbai","calcutta":"kolkata","madras":"chennai","saigon":"ho chi minh city","peking":"beijing","canton":"guangzhou","st petersburg":"saint petersburg","st petersburg fl":"saint petersburg","philadelphia pa":"philadelphia","bengaluru":"bengaluru","blr":"bengaluru","pune":"pune","chennai":"chennai","mumbai":"mumbai","delhi":"delhi","new delhi":"delhi","gurgaon":"gurugram","gurugram":"gurugram","noida":"noida","trivandrum":"thiruvananthapuram","thiruvananthapuram":"thiruvananthapuram","bhubaneswar":"bhubaneswar","bhubaneshwar":"bhubaneswar","vizag":"visakhapatnam","visakhapatnam":"visakhapatnam"}; + + function normalizeSegment(segment) { + if (!segment || typeof segment !== 'string') return ''; + let s = segment.toLowerCase().trim(); + s = s.replace(/\s*\(.*?\)\s*/g, ''); + s = s.replace(/[^a-z0-9\s\-]/g, ''); + s = s.replace(/\s+/g, ' ').trim(); + return s; + } + + /** + * Resolve a location string to a city record when the leading segment is an + * unambiguous major city. Requires no country hint for unambiguous names; when + * a trailing country/state segment is present it must match the city country. + * + * @param {string} rawString + * @returns {{ countryCode: string, country: string, lat: number, lng: number } | null} + */ + function resolveCity(rawString) { + if (!rawString || typeof rawString !== 'string') return null; + + const parts = rawString.split(',').map((p) => normalizeSegment(p)).filter(Boolean); + if (parts.length === 0) return null; + + const cityKey = ALIASES[parts[0]] || parts[0]; + const entry = CITIES[cityKey]; + if (!entry) return null; + + const countryData = global.CountryData; + const countryCode = entry.cc; + const country = (countryData && countryData.getCountryName(countryCode)) || countryCode; + + // If trailing segments include a country hint, verify it matches + if (parts.length >= 2 && countryData) { + const hint = countryData.resolveCountry(rawString); + if (hint && hint.countryCode !== countryCode) { + return null; + } + } + + return { + countryCode: countryCode, + country: country, + lat: entry.lat, + lng: entry.lng + }; + } + + global.CityData = { + resolveCity: resolveCity + }; +})(typeof window !== 'undefined' ? window : globalThis); diff --git a/js/country-data.js b/js/country-data.js index b9d37ac..106e5ea 100644 --- a/js/country-data.js +++ b/js/country-data.js @@ -2,10 +2,9 @@ * Country Data - Static lookup tables for country resolution and map centroids. * * Powers the country-only visualization on the authors page and is also used by - * LocationService to short-circuit Nominatim calls whenever a location string ends + * LocationService to short-circuit geocoding API calls whenever a location string ends * with a recognizable country, country alias, or US state. Together these tables - * eliminate the vast majority of geocoding round-trips against Nominatim's strict - * 1 req/sec rate limit. + * eliminate the vast majority of geocoding round-trips. * * Exposes a single global, `window.CountryData`, which provides: * - resolveCountry(rawString) → { countryCode, country } | null diff --git a/js/location-service.js b/js/location-service.js index 0177c3d..3a1266e 100644 --- a/js/location-service.js +++ b/js/location-service.js @@ -1,28 +1,42 @@ /** * Location Service - Geocodes location strings to lat/lng coordinates - * Uses Nominatim (OpenStreetMap) API for geocoding + * Uses a static country/city resolver first, then Open-Meteo and Photon APIs * Caches results in IndexedDB for persistent storage */ class LocationService { constructor() { - this.baseUrl = 'https://nominatim.openstreetmap.org/search'; this.geocodeCache = new Map(); // In-memory cache for geocoded locations this.inFlightRequests = new Map(); // Track in-flight geocoding requests to prevent duplicates this.cacheExpiry = 7 * 24 * 60 * 60 * 1000; // 7 days cache expiry - this.rateLimitDelay = 1000; // 1 second between Nominatim requests (their requirement) // Country-keyed reuse cache: normalized location string → countryCode. - // Populated whenever a static resolver hit or a Nominatim resolution maps a string - // to a country, so subsequent strings that resolve to the same country don't need - // another round-trip. This is ephemeral; the long-term cache lives in the IndexedDB - // `locations` store, which already persists the full geocoded record (with countryCode). this.countryByString = new Map(); + + // Serial network queue — one geocode API call at a time to respect rate limits + this._networkQueue = []; + this._networkProcessing = false; + + // Provider state for multi-API failover (Open-Meteo → Photon) + this.providers = [ + { + id: 'open-meteo', + minIntervalMs: 200, + cooldownMs: 60000, + lastRequestAt: 0, + cooldownUntil: 0 + }, + { + id: 'photon', + minIntervalMs: 400, + cooldownMs: 60000, + lastRequestAt: 0, + cooldownUntil: 0 + } + ]; } /** * Build a synthetic geocoded record for a country resolved via the static - * country/state lookup table. Uses the country centroid from CountryData so the - * authors-page map can render a country-level marker without ever touching - * Nominatim. Returns null if the country code is unknown. + * country/state lookup table. */ buildCountryOnlyGeocoded(countryCode, displayName) { const cd = (typeof window !== 'undefined') ? window.CountryData : null; @@ -39,6 +53,261 @@ class LocationService { }; } + /** + * Build a synthetic geocoded record for a city resolved via the static city table. + */ + buildCityOnlyGeocoded(cityResolved, displayName) { + if (!cityResolved || !cityResolved.countryCode) return null; + const cd = (typeof window !== 'undefined') ? window.CountryData : null; + const countryCode = cityResolved.countryCode; + return { + lat: cityResolved.lat, + lng: cityResolved.lng, + displayName: displayName || cityResolved.country || countryCode, + countryCode: countryCode, + country: cityResolved.country || (cd && cd.getCountryName(countryCode)) || countryCode, + source: 'static-city-table' + }; + } + + /** + * Cache a successful geocoding result in memory and IndexedDB. + */ + async _cacheGeocodedResult(normalizedLocation, geocoded) { + if (geocoded.countryCode) { + this.countryByString.set(normalizedLocation, geocoded.countryCode); + } + this.geocodeCache.set(normalizedLocation, { + data: geocoded, + timestamp: Date.now() + }); + if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { + await window.indexedDBManager.saveLocation(normalizedLocation, geocoded); + console.log(`💾 Saved geocoded location "${normalizedLocation}" to IndexedDB cache`); + } + } + + /** + * Cache a failed geocoding attempt to avoid repeated API calls. + */ + async _cacheFailedGeocode(normalizedLocation) { + const failedMarker = { + failed: true, + timestamp: Date.now() + }; + this.geocodeCache.set(normalizedLocation, { + data: failedMarker, + timestamp: Date.now() + }); + if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { + await window.indexedDBManager.saveLocation(normalizedLocation, failedMarker); + console.log(`💾 Cached failed geocoding attempt for "${normalizedLocation}" to avoid retries`); + } + } + + /** + * Persist a static resolver hit to caches (memory + IndexedDB best-effort). + */ + _cacheStaticResult(normalizedLocation, synthesized, skipIndexedDBCheck) { + if (synthesized.countryCode) { + this.countryByString.set(normalizedLocation, synthesized.countryCode); + } + this.geocodeCache.set(normalizedLocation, { + data: synthesized, + timestamp: Date.now() + }); + if (!skipIndexedDBCheck && window.indexedDBManager && window.indexedDBManager.isInitialized()) { + window.indexedDBManager.saveLocation(normalizedLocation, synthesized).catch(() => {}); + } + } + + /** + * Wait until a provider slot is available (rate limit spacing + cooldown). + */ + async _waitForProviderSlot(provider) { + const now = Date.now(); + if (provider.cooldownUntil > now) { + return false; + } + const elapsed = now - provider.lastRequestAt; + if (elapsed < provider.minIntervalMs) { + await this.sleep(provider.minIntervalMs - elapsed); + } + return true; + } + + /** + * Mark a provider as temporarily unavailable after rate-limit or server errors. + */ + _markProviderCooldown(provider, status) { + if (status === 429 || status === 503 || status === 502) { + provider.cooldownUntil = Date.now() + provider.cooldownMs; + console.warn(`⚠️ Geocoding provider ${provider.id} cooling down for ${provider.cooldownMs / 1000}s after HTTP ${status}`); + } + } + + /** + * Geocode via Open-Meteo Geocoding API. + */ + async _geocodeOpenMeteo(normalizedLocation, provider) { + const params = new URLSearchParams({ + name: normalizedLocation, + count: '1', + language: 'en', + format: 'json' + }); + const url = `https://geocoding-api.open-meteo.com/v1/search?${params.toString()}`; + debugLogUrl(`🌐 [DEBUG] Fetching URL: ${url}`); + debugLogUrl(` Reason: Geocoding "${normalizedLocation}" via Open-Meteo`); + + const response = await fetchWithTimeout(url); + provider.lastRequestAt = Date.now(); + + if (!response.ok) { + this._markProviderCooldown(provider, response.status); + return { ok: false, status: response.status }; + } + + const data = await response.json(); + const result = data?.results?.[0]; + if (!result) { + return { ok: false, status: 200, empty: true }; + } + + return { + ok: true, + geocoded: { + lat: result.latitude, + lng: result.longitude, + displayName: result.name || normalizedLocation, + countryCode: result.country_code ? String(result.country_code).toUpperCase() : null, + country: result.country || null, + source: 'open-meteo' + } + }; + } + + /** + * Geocode via Photon (komoot) API. + */ + async _geocodePhoton(normalizedLocation, provider) { + const params = new URLSearchParams({ + q: normalizedLocation, + limit: '1' + }); + const url = `https://photon.komoot.io/api/?${params.toString()}`; + debugLogUrl(`🌐 [DEBUG] Fetching URL: ${url}`); + debugLogUrl(` Reason: Geocoding "${normalizedLocation}" via Photon`); + + const response = await fetchWithTimeout(url); + provider.lastRequestAt = Date.now(); + + if (!response.ok) { + this._markProviderCooldown(provider, response.status); + return { ok: false, status: response.status }; + } + + const data = await response.json(); + const feature = data?.features?.[0]; + if (!feature) { + return { ok: false, status: 200, empty: true }; + } + + const coords = feature.geometry?.coordinates || []; + const props = feature.properties || {}; + const countryCode = props.countrycode ? String(props.countrycode).toUpperCase() : null; + + return { + ok: true, + geocoded: { + lat: coords[1], + lng: coords[0], + displayName: props.name || props.city || normalizedLocation, + countryCode: countryCode, + country: props.country || null, + source: 'photon' + } + }; + } + + /** + * Try each geocoding provider in order until one succeeds. + */ + async _fetchFromProviders(normalizedLocation) { + for (const provider of this.providers) { + const slotAvailable = await this._waitForProviderSlot(provider); + if (!slotAvailable) { + console.log(`📍 Skipping provider ${provider.id} (cooldown active)`); + continue; + } + + let result; + try { + if (provider.id === 'open-meteo') { + result = await this._geocodeOpenMeteo(normalizedLocation, provider); + } else if (provider.id === 'photon') { + result = await this._geocodePhoton(normalizedLocation, provider); + } else { + continue; + } + } catch (error) { + console.warn(`⚠️ Geocoding provider ${provider.id} failed for "${normalizedLocation}":`, error.message); + continue; + } + + if (result.ok && result.geocoded) { + console.log(` ✅ ${provider.id}: (${result.geocoded.lat}, ${result.geocoded.lng}), Country: ${result.geocoded.countryCode || 'N/A'}`); + return result.geocoded; + } + + if (result.empty) { + console.log(`ℹ️ ${provider.id}: no results for "${normalizedLocation}"`); + continue; + } + } + + return null; + } + + /** + * Enqueue a network geocode request (serial processing). + */ + _enqueueNetworkGeocode(normalizedLocation) { + return new Promise((resolve, reject) => { + this._networkQueue.push({ normalizedLocation, resolve, reject }); + this._processNetworkQueue(); + }); + } + + /** + * Process the serial network geocode queue. + */ + async _processNetworkQueue() { + if (this._networkProcessing) { + return; + } + this._networkProcessing = true; + + while (this._networkQueue.length > 0) { + const task = this._networkQueue.shift(); + try { + const geocoded = await this._fetchFromProviders(task.normalizedLocation); + if (geocoded) { + await this._cacheGeocodedResult(task.normalizedLocation, geocoded); + console.log(`✅ Geocoded "${task.normalizedLocation}" → ${geocoded.lat}, ${geocoded.lng} (${geocoded.source})`); + task.resolve(geocoded); + } else { + await this._cacheFailedGeocode(task.normalizedLocation); + task.resolve(null); + } + } catch (error) { + task.reject(error); + } + } + + this._networkProcessing = false; + } + /** * Validate and normalize a location string * @param {string} locationString - Raw location string @@ -99,17 +368,12 @@ class LocationService { } // Skip company names ending with company suffixes (e.g., "Sideway Inc", "CFWare, LLC") - // Pattern: word(s) followed by comma/space and company suffix - // IMPORTANT: Exclude US state abbreviations (CO, CA, NY, TX, etc.) which are NOT company suffixes const usStateAbbreviations = /\b(AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY)\b/i; const hasStateAbbreviation = usStateAbbreviations.test(normalized); - // Only check for company pattern if it doesn't contain a state abbreviation if (!hasStateAbbreviation) { const companyNamePattern = /^[\w\s&]+(?:,\s*)?(?:Inc|LLC|LLP|Ltd|Corp|Corporation|Company|Co\.|GmbH|AG|SARL|AB|ApS|BV|B\.V|KFT|a\.s|a\.s\.|SAS|S\.A\.S|Intl|International|Engineering|Software|Technologies|Tech|Solutions|Systems|Group|Enterprises|Ventures|Consulting|Consultants)\.?$/i; - // Note: Changed "Co" to "Co\." to require period, avoiding false matches with state abbreviations if (companyNamePattern.test(normalized) && normalized.length < 60 && !normalized.match(/,\s*(USA|US|UK|Canada|Australia|Germany|France|Spain|Italy|Japan|China|India|Brazil|Mexico)/i)) { - // Only skip if it looks like a company name (not too long, contains company suffix, and no country indicator) console.log(`⚠️ Skipping geocoding for company name: "${normalized}"`); return null; } @@ -139,7 +403,6 @@ class LocationService { // Skip single-word entries that are likely company names or non-locations (unless they're common place names) const commonPlaceNames = new Set(['paris', 'london', 'berlin', 'tokyo', 'moscow', 'rome', 'madrid', 'vienna', 'amsterdam', 'brussels', 'copenhagen', 'stockholm', 'oslo', 'helsinki', 'dublin', 'lisbon', 'athens', 'warsaw', 'prague', 'budapest', 'bucharest', 'sofia', 'zagreb', 'belgrade', 'kiev', 'minsk', 'riga', 'tallinn', 'vilnius', 'reykjavik', 'valletta', 'nicosia', 'luxembourg', 'monaco', 'vaduz', 'andorra', 'san marino', 'vatican', 'new york', 'los angeles', 'chicago', 'houston', 'phoenix', 'philadelphia', 'san antonio', 'san diego', 'dallas', 'san jose', 'austin', 'jacksonville', 'san francisco', 'indianapolis', 'columbus', 'fort worth', 'charlotte', 'seattle', 'denver', 'washington', 'boston', 'el paso', 'detroit', 'nashville', 'memphis', 'portland', 'oklahoma city', 'las vegas', 'louisville', 'baltimore', 'milwaukee', 'albuquerque', 'tucson', 'fresno', 'sacramento', 'kansas city', 'mesa', 'atlanta', 'omaha', 'colorado springs', 'raleigh', 'virginia beach', 'miami', 'oakland', 'minneapolis', 'tulsa', 'cleveland', 'wichita', 'arlington', 'tampa', 'new orleans', 'honolulu', 'anaheim', 'santa ana', 'st. louis', 'riverside', 'corpus christi', 'lexington', 'pittsburgh', 'anchorage', 'stockton', 'cincinnati', 'st. paul', 'toledo', 'greensboro', 'newark', 'plano', 'henderson', 'lincoln', 'buffalo', 'jersey city', 'chula vista', 'fort wayne', 'orlando', 'st. petersburg', 'chandler', 'laredo', 'norfolk', 'durham', 'madison', 'lubbock', 'irvine', 'winston-salem', 'glendale', 'garland', 'hialeah', 'reno', 'chesapeake', 'gilbert', 'baton rouge', 'richmond', 'boise', 'san bernardino', 'spokane', 'birmingham', 'grand rapids', 'tacoma', 'fontana', 'fremont', 'rochester', 'oxnard', 'moreno valley', 'fayetteville', 'huntington beach', 'yonkers', 'glendale', 'aurora', 'montgomery', 'grand prairie', 'shreveport', 'akron', 'macon', 'little rock', 'augusta', 'columbus', 'amarillo', 'mobile', 'knoxville', 'shreveport', 'worcester', 'newport news', 'brownsville', 'overland park', 'santa clarita', 'providence', 'fort lauderdale', 'rancho cucamonga', 'ontario', 'vancouver', 'sioux falls', 'peoria', 'oakland', 'visalia', 'tempe', 'ontario', 'norman', 'erie', 'fargo', 'thousand oaks', 'el monte', 'concord', 'evansville', 'sterling heights', 'santa clara', 'topeka', 'savannah', 'simi valley', 'pembroke pines', 'vallejo', 'victoria', 'hartford', 'cedar rapids', 'coral springs', 'fayetteville', 'santa rosa', 'palmdale', 'corona', 'eugene', 'mcallen', 'independence', 'joliet', 'inland empire', 'south bend', 'elgin', 'fullerton', 'springfield', 'beaumont', 'peoria', 'lansing', 'ann arbor', 'carrollton', 'roseville', 'thornton', 'denton', 'surprise', 'mckinney', 'west valley city', 'richardson', 'killeen', 'frisco', 'allentown', 'olathe', 'hayward', 'carol stream', 'clarksville', 'lakewood', 'pomona', 'sunnyvale', 'escondido', 'pasadena', 'naperville', 'bellevue', 'hampton', 'mcallen', 'joliet', 'torrance', 'bridgeport', 'syracuse', 'paterson', 'fort wayne', 'elizabeth', 'charleston', 'mesquite', 'stamford', 'corpus christi', 'savannah', 'rockford', 'joliet', 'pembroke pines', 'moreno valley', 'huntington beach', 'glendale', 'santa clarita', 'grand prairie', 'overland park', 'peoria', 'ontario', 'sioux falls', 'elk grove', 'salem', 'corona', 'eugene', 'palmdale', 'salinas', 'springfield', 'pasadena', 'fort collins', 'hayward', 'pomona', 'cary', 'rockford', 'alexandria', 'escondido', 'mckinney', 'joliet', 'sunnyvale', 'torrance', 'bridgeport', 'lakewood', 'hollywood', 'paterson', 'naperville', 'syracuse', 'hampton', 'lakewood', 'pomona', 'torrance', 'bridgeport', 'syracuse', 'paterson', 'fort wayne', 'elizabeth', 'charleston', 'mesquite', 'stamford', 'corpus christi', 'savannah', 'rockford', 'joliet', 'pembroke pines', 'moreno valley', 'huntington beach', 'glendale', 'santa clarita', 'grand prairie', 'overland park', 'peoria', 'ontario', 'sioux falls', 'elk grove', 'salem', 'corona', 'eugene', 'palmdale', 'salinas', 'springfield', 'pasadena', 'fort collins', 'hayward', 'pomona', 'cary', 'rockford', 'alexandria', 'escondido', 'mckinney', 'joliet', 'sunnyvale', 'torrance', 'bridgeport', 'lakewood', 'hollywood', 'paterson', 'naperville', 'syracuse', 'hampton']); - // Skip single-word entries that don't look like locations if (!normalized.includes(',') && !normalized.includes(' ') && normalized.length > 2 && normalized.length < 20) { const lowerNormalized = normalized.toLowerCase(); if (!commonPlaceNames.has(lowerNormalized) && @@ -150,22 +413,14 @@ class LocationService { } // Clean up the location string first - // Remove special characters that might confuse geocoding (but keep commas, spaces, hyphens) normalized = normalized - // Remove arrows and other special symbols (↜, →, ←, etc.) .replace(/[↜→←⇒⇐↔]/g, ',') - // Remove multiple consecutive commas .replace(/,+/g, ',') - // Remove trailing periods (unless it's an abbreviation) .replace(/\.+$/, '') - // Remove leading/trailing commas .replace(/^,+|,+$/g, '') - // Normalize whitespace .replace(/\s+/g, ' ') .trim(); - // Remove fake/joke location parts (but keep valid parts before them) - // Split by comma and filter out fake parts const fakeLocationPatterns = [ /^milky\s*way$/i, /^earth$/i, @@ -177,7 +432,6 @@ class LocationService { const parts = normalized.split(',').map(p => p.trim()).filter(p => p); const validParts = parts.filter(part => { - // Check if this part matches any fake pattern const isFake = fakeLocationPatterns.some(pattern => pattern.test(part)); if (isFake) { console.log(`⚠️ Removing fake location part: "${part}"`); @@ -193,13 +447,11 @@ class LocationService { normalized = validParts.join(', ').trim(); - // Skip if too short or too long (likely invalid) if (normalized.length < 2 || normalized.length > 200) { console.log(`⚠️ Skipping geocoding for invalid length string: "${normalized}"`); return null; } - // Skip if it's just numbers or special characters if (!/[a-zA-Z]/.test(normalized)) { console.log(`⚠️ Skipping geocoding for non-text string: "${normalized}"`); return null; @@ -210,22 +462,18 @@ class LocationService { /** * Parse multiple locations from a string separated by |, \, or / - * @param {string} locationString - Location string that may contain multiple locations - * @returns {Array} - Array of individual location strings */ parseMultipleLocations(locationString) { if (!locationString || typeof locationString !== 'string') { return []; } - // Split by common separators: |, \, /, or multiple spaces const separators = /[|\/\\]|,\s*and\s+/i; const locations = locationString .split(separators) .map(loc => loc.trim()) .filter(loc => loc.length > 0); - // If no separators found, return single location if (locations.length === 1) { return [locationString.trim()]; } @@ -235,41 +483,34 @@ class LocationService { /** * Geocode a location string to lat/lng coordinates - * @param {string} locationString - Location string (e.g., "San Francisco, CA" or "London, UK") - * @param {boolean} skipCache - If true, skip cache and force fresh geocoding - * @param {boolean} skipIndexedDBCheck - If true, skip IndexedDB check (optimization when already checked) - * @returns {Promise} - {lat: number, lng: number, displayName: string} or null */ async geocode(locationString, skipCache = false, skipIndexedDBCheck = false) { - // Normalize and validate location string const normalizedLocation = this.normalizeLocationString(locationString); if (!normalizedLocation) { return null; } - // Static country fast-path (T1.5a + T1.5d): if the trailing segment of the - // location string is a known country name, alpha-2/3 code, or US state, we can - // resolve it locally — no Nominatim round-trip, no 1 req/sec rate-limit wait. - // The synthesized record uses the country centroid from CountryData, which is - // accurate enough for country-level visualization on the authors map. + // Static country fast-path if (window.CountryData) { const resolved = window.CountryData.resolveCountry(normalizedLocation); if (resolved && resolved.countryCode) { const synthesized = this.buildCountryOnlyGeocoded(resolved.countryCode, normalizedLocation); if (synthesized) { - // Track string → country in the in-memory reuse cache (T1.5b). - this.countryByString.set(normalizedLocation, resolved.countryCode); - // Populate both in-memory + persistent caches so subsequent reads - // (including across sessions) skip even this static lookup. - this.geocodeCache.set(normalizedLocation, { - data: synthesized, - timestamp: Date.now() - }); - if (!skipIndexedDBCheck && window.indexedDBManager && window.indexedDBManager.isInitialized()) { - // Best-effort: don't block the resolution on IndexedDB writes. - window.indexedDBManager.saveLocation(normalizedLocation, synthesized).catch(() => {}); - } - console.log(`📍 Static country resolver: "${normalizedLocation}" → ${resolved.countryCode} (no Nominatim call)`); + this._cacheStaticResult(normalizedLocation, synthesized, skipIndexedDBCheck); + console.log(`📍 Static country resolver: "${normalizedLocation}" → ${resolved.countryCode} (no API call)`); + return synthesized; + } + } + } + + // Static city fast-path (bare city names like "Bengaluru", "Tokyo") + if (window.CityData) { + const cityResolved = window.CityData.resolveCity(normalizedLocation); + if (cityResolved && cityResolved.countryCode) { + const synthesized = this.buildCityOnlyGeocoded(cityResolved, normalizedLocation); + if (synthesized) { + this._cacheStaticResult(normalizedLocation, synthesized, skipIndexedDBCheck); + console.log(`📍 Static city resolver: "${normalizedLocation}" → ${cityResolved.countryCode} (no API call)`); return synthesized; } } @@ -279,7 +520,6 @@ class LocationService { if (!skipCache) { const cached = this.geocodeCache.get(normalizedLocation); if (cached && Date.now() - cached.timestamp < this.cacheExpiry) { - // Check if this is a failed attempt marker if (cached.data && cached.data.failed === true) { console.log(`📍 Memory cache: Found failed geocoding attempt for "${normalizedLocation}" - skipping retry`); return null; @@ -291,14 +531,11 @@ class LocationService { return cached.data; } - // Check IndexedDB cache (unless already checked) if (!skipIndexedDBCheck && window.indexedDBManager && window.indexedDBManager.isInitialized()) { const dbCached = await window.indexedDBManager.getLocation(normalizedLocation); if (dbCached) { - // Check if this is a failed attempt marker if (dbCached.failed === true) { console.log(`📍 IndexedDB cache: Found failed geocoding attempt for "${normalizedLocation}" - skipping retry`); - // Update in-memory cache this.geocodeCache.set(normalizedLocation, { data: dbCached, timestamp: Date.now() @@ -309,7 +546,6 @@ class LocationService { if (dbCached.countryCode) { this.countryByString.set(normalizedLocation, dbCached.countryCode); } - // Update in-memory cache this.geocodeCache.set(normalizedLocation, { data: dbCached, timestamp: Date.now() @@ -319,115 +555,29 @@ class LocationService { } } - // Check if there's already an in-flight request for this location + // Dedupe concurrent requests for the same string if (this.inFlightRequests.has(normalizedLocation)) { console.log(`📍 Waiting for in-flight geocoding request for "${normalizedLocation}"`); return await this.inFlightRequests.get(normalizedLocation); } - // Create promise for this geocoding request and store it const geocodePromise = (async () => { try { - // Use Nominatim API with proper user agent (required by their ToS) - const params = new URLSearchParams({ - q: normalizedLocation, - format: 'json', - limit: 1, - addressdetails: 1 - }); - - const url = `${this.baseUrl}?${params.toString()}`; - debugLogUrl(`🌐 [DEBUG] Fetching URL: ${url}`); - debugLogUrl(` Reason: Geocoding location string "${normalizedLocation}" to lat/lng coordinates using Nominatim API`); - - const response = await fetchWithTimeout(url, { - headers: { - 'User-Agent': 'SBOM Play - Open Source Supply Chain Analysis Tool (https://github.com/cyfinoid/sbomplay)' - } - }); - - if (!response.ok) { - console.warn(`⚠️ Geocoding API returned ${response.status} for "${normalizedLocation}"`); - console.log(` ❌ Response: Status ${response.status} ${response.statusText}`); - return null; - } - - const data = await response.json(); - if (!data || data.length === 0) { - console.log(`ℹ️ No geocoding results for "${normalizedLocation}"`); - console.log(` ✅ Response: Status ${response.status}, Extracted: No geocoding results`); - - // Cache the "no results" response to avoid repeated API calls - const failedMarker = { - failed: true, - timestamp: Date.now() - }; - this.geocodeCache.set(normalizedLocation, { - data: failedMarker, - timestamp: Date.now() - }); - - // Save failed attempt to IndexedDB to persist across sessions - if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { - await window.indexedDBManager.saveLocation(normalizedLocation, failedMarker); - console.log(`💾 Cached failed geocoding attempt for "${normalizedLocation}" to avoid retries`); - } - - return null; - } - - const result = data[0]; - const geocoded = { - lat: parseFloat(result.lat), - lng: parseFloat(result.lon), - displayName: result.display_name || normalizedLocation, - countryCode: result.address?.country_code?.toUpperCase() || null, - country: result.address?.country || null - }; - - console.log(` ✅ Response: Status ${response.status}, Extracted: Coordinates (${geocoded.lat}, ${geocoded.lng}), Display name: "${geocoded.displayName}", Country: ${geocoded.countryCode || 'N/A'}`); - - // Populate the country-keyed reuse cache (T1.5b) so future strings that - // resolve to the same country can short-circuit even before they're - // submitted to Nominatim again. - if (geocoded.countryCode) { - this.countryByString.set(normalizedLocation, geocoded.countryCode); - } - - // Cache the result in memory - this.geocodeCache.set(normalizedLocation, { - data: geocoded, - timestamp: Date.now() - }); - - // Save to IndexedDB for persistent storage - // This ensures the location is cached for future sessions - if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { - await window.indexedDBManager.saveLocation(normalizedLocation, geocoded); - console.log(`💾 Saved geocoded location "${normalizedLocation}" to IndexedDB cache`); - } - - console.log(`✅ Geocoded "${normalizedLocation}" → ${geocoded.lat}, ${geocoded.lng}`); - return geocoded; + return await this._enqueueNetworkGeocode(normalizedLocation); } catch (error) { console.warn(`⚠️ Geocoding failed for "${normalizedLocation}":`, error.message); return null; } finally { - // Remove from in-flight requests when done this.inFlightRequests.delete(normalizedLocation); } })(); - // Store the promise so concurrent requests can wait for it this.inFlightRequests.set(normalizedLocation, geocodePromise); - return await geocodePromise; } /** * Get geocoded location from cache only (no API calls) - * @param {string} locationString - Location string to look up - * @returns {Promise} - Geocoded data if found in cache, null otherwise */ async getFromCache(locationString) { const normalizedLocation = this.normalizeLocationString(locationString); @@ -435,25 +585,20 @@ class LocationService { return null; } - // Check in-memory cache first const cached = this.geocodeCache.get(normalizedLocation); if (cached && Date.now() - cached.timestamp < this.cacheExpiry) { - // Check if this is a failed attempt marker if (cached.data && cached.data.failed === true) { return null; } return cached.data; } - // Check IndexedDB cache if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { const dbCached = await window.indexedDBManager.getLocation(normalizedLocation); if (dbCached) { - // Check if this is a failed attempt marker if (dbCached.failed === true) { return null; } - // Update in-memory cache this.geocodeCache.set(normalizedLocation, { data: dbCached, timestamp: Date.now() @@ -467,14 +612,10 @@ class LocationService { /** * Batch get locations from cache only (no API calls) - * Use this when geocoding was already done during analysis phase - * @param {Array} locations - Array of location strings - * @returns {Promise} - Map of location string -> geocoded data */ async batchGetFromCache(locations) { const results = new Map(); - // Normalize and filter locations first const normalizedLocations = locations .map(loc => this.normalizeLocationString(loc)) .filter(loc => loc !== null); @@ -485,14 +626,12 @@ class LocationService { return results; } - // Load all from IndexedDB cache (no API calls) if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { const cachedResults = await window.indexedDBManager.batchGetLocations(uniqueLocations); cachedResults.forEach((geocoded, location) => { if (geocoded && geocoded.failed !== true) { results.set(location, geocoded); - // Update in-memory cache this.geocodeCache.set(location, { data: geocoded, timestamp: Date.now() @@ -506,21 +645,16 @@ class LocationService { /** * Batch geocode multiple locations (loads from cache first, then fetches missing ones incrementally) - * @param {Array} locations - Array of location strings - * @param {Function} onProgress - Optional progress callback (processed, total) - * @param {Function} onNewLocation - Optional callback when a new location is geocoded (location, geocoded) - * @returns {Promise} - Map of location string -> geocoded data */ async batchGeocode(locations, onProgress = null, onNewLocation = null) { const results = new Map(); - // Normalize and filter locations first const normalizedLocations = locations .map(loc => this.normalizeLocationString(loc)) - .filter(loc => loc !== null); // Remove invalid locations + .filter(loc => loc !== null); const uniqueLocations = [...new Set(normalizedLocations)]; - let cachedCount = 0; // Initialize cachedCount at function scope + let cachedCount = 0; if (uniqueLocations.length === 0) { console.log('ℹ️ No valid locations to geocode after normalization'); @@ -529,16 +663,13 @@ class LocationService { console.log(`📍 Processing ${uniqueLocations.length} unique valid locations (${locations.length - normalizedLocations.length} invalid locations filtered out)`); - // Step 1: Load all from IndexedDB cache first (fast, no API calls) if (window.indexedDBManager && window.indexedDBManager.isInitialized()) { console.log(`📍 Loading ${uniqueLocations.length} locations from IndexedDB cache...`); const cachedResults = await window.indexedDBManager.batchGetLocations(uniqueLocations); cachedResults.forEach((geocoded, location) => { if (geocoded) { - // Skip failed markers (they're cached to avoid retries, but shouldn't be used) if (geocoded.failed === true) { - // Still cache it in memory to avoid retries this.geocodeCache.set(location, { data: geocoded, timestamp: Date.now() @@ -546,14 +677,12 @@ class LocationService { return; } results.set(location, geocoded); - // Update in-memory cache this.geocodeCache.set(location, { data: geocoded, timestamp: Date.now() }); cachedCount++; - // Notify callback for cached locations too (for immediate map display) if (onNewLocation) { onNewLocation(location, geocoded); } @@ -567,32 +696,23 @@ class LocationService { } } - // Step 2: Fetch missing locations incrementally (one at a time to respect rate limits) const missingLocations = uniqueLocations.filter(loc => !results.has(loc)); if (missingLocations.length > 0) { - console.log(`📍 Fetching ${missingLocations.length} missing locations from Nominatim API (incremental, rate-limited)...`); + console.log(`📍 Fetching ${missingLocations.length} missing locations via geocoding API cascade (serial queue)...`); for (let i = 0; i < missingLocations.length; i++) { const location = missingLocations[i]; - // Skip IndexedDB check since we already checked it in Step 1 - // This prevents redundant IndexedDB queries - const geocoded = await this.geocode(location, false, true); // skipIndexedDBCheck = true + const geocoded = await this.geocode(location, false, true); if (geocoded) { results.set(location, geocoded); - // Notify callback if provided (for incremental map updates) if (onNewLocation) { onNewLocation(location, geocoded); } } - // Rate limiting: wait 1 second between requests (Nominatim requirement) - if (i < missingLocations.length - 1) { - await this.sleep(this.rateLimitDelay); - } - if (onProgress) { onProgress(cachedCount + i + 1, uniqueLocations.length); } @@ -629,19 +749,10 @@ class LocationService { /** * Resolve just a country code from a free-form location string, with no API calls. - * Tries (1) the in-memory countryByString cache, (2) the static CountryData lookup, - * (3) any cached geocoded result already in memory. Returns null if none matched. - * - * Used by the authors-page country-only visualization (T1.5c) so it can render - * markers without ever pulling down Nominatim payloads. - * - * @param {string} locationString - * @returns {{countryCode: string, country: string} | null} */ resolveCountryNoApi(locationString) { const normalized = this.normalizeLocationString(locationString); if (!normalized) return null; - // 1) ephemeral in-memory map if (this.countryByString.has(normalized)) { const code = this.countryByString.get(normalized); return { @@ -649,7 +760,6 @@ class LocationService { country: (window.CountryData && window.CountryData.getCountryName(code)) || code }; } - // 2) static resolver — costs <50µs and avoids any cache lookups if (window.CountryData) { const resolved = window.CountryData.resolveCountry(normalized); if (resolved) { @@ -657,7 +767,16 @@ class LocationService { return resolved; } } - // 3) in-memory geocode cache (covers strings already resolved by Nominatim earlier) + if (window.CityData) { + const cityResolved = window.CityData.resolveCity(normalized); + if (cityResolved) { + this.countryByString.set(normalized, cityResolved.countryCode); + return { + countryCode: cityResolved.countryCode, + country: cityResolved.country + }; + } + } const cached = this.geocodeCache.get(normalized); if (cached?.data?.countryCode) { this.countryByString.set(normalized, cached.data.countryCode); @@ -672,4 +791,3 @@ class LocationService { // Export for use in other modules window.LocationService = LocationService; - diff --git a/js/settings.js b/js/settings.js index 20ad56a..1e1ed3c 100644 --- a/js/settings.js +++ b/js/settings.js @@ -2138,13 +2138,16 @@ class SettingsApp { */ async initLocationEnrichmentCard() { const btn = document.getElementById('fetchRemainingLocationsBtn'); + const rescanBtn = document.getElementById('rescanGeocodingBtn'); const statusDiv = document.getElementById('locationEnrichmentStatus'); const alertDiv = document.getElementById('locationEnrichmentAlert'); const progressSpan = document.getElementById('locationFetchProgress'); + const rescanProgressSpan = document.getElementById('geocodingRescanProgress'); if (!btn || !statusDiv || !alertDiv) return; // Count authors that still need location fetching const missing = await this._countMissingLocationAuthors(); + const withLocationStrings = await this._countAuthorsWithLocationStrings(); statusDiv.classList.remove('d-none'); if (missing > 0) { @@ -2157,9 +2160,45 @@ class SettingsApp { btn.disabled = true; } + if (rescanBtn) { + rescanBtn.disabled = !(withLocationStrings > 0 && window.LocationService); + } + btn.addEventListener('click', async () => { - await this._fetchRemainingLocations(btn, progressSpan, alertDiv, statusDiv); + await this._fetchRemainingLocations(btn, progressSpan, alertDiv, statusDiv, rescanBtn); }); + + if (rescanBtn) { + rescanBtn.addEventListener('click', async () => { + await this._rescanGeocoding(rescanBtn, rescanProgressSpan, alertDiv, statusDiv, btn); + }); + } + } + + _locationProgressController() { + const progressContainer = document.getElementById('locationFetchProgressContainer'); + const progressBar = document.getElementById('locationFetchProgressBar'); + const progressText = document.getElementById('locationFetchProgressText'); + + return { + showProgressBar() { + if (progressContainer) progressContainer.classList.remove('d-none'); + }, + hideProgressBar() { + if (progressContainer) progressContainer.classList.add('d-none'); + }, + setBarPercent(percent, label) { + if (!progressBar) return; + const clamped = Math.max(0, Math.min(100, percent)); + const display = Math.round(clamped); + progressBar.style.setProperty('--progress-width', `${clamped}%`); + progressBar.setAttribute('aria-valuenow', String(display)); + progressBar.textContent = `${display}%`; + if (progressText) { + progressText.textContent = label || ''; + } + } + }; } async _countMissingLocationAuthors() { @@ -2188,28 +2227,44 @@ class SettingsApp { } } - async _fetchRemainingLocations(btn, progressSpan, alertDiv, statusDiv) { - const progressContainer = document.getElementById('locationFetchProgressContainer'); - const progressBar = document.getElementById('locationFetchProgressBar'); - const progressText = document.getElementById('locationFetchProgressText'); - - const showProgressBar = () => { - if (progressContainer) progressContainer.classList.remove('d-none'); - }; - const hideProgressBar = () => { - if (progressContainer) progressContainer.classList.add('d-none'); - }; - const setBarPercent = (percent, label) => { - if (!progressBar) return; - const clamped = Math.max(0, Math.min(100, percent)); - const display = Math.round(clamped); - progressBar.style.setProperty('--progress-width', `${clamped}%`); - progressBar.setAttribute('aria-valuenow', String(display)); - progressBar.textContent = `${display}%`; - if (progressText) { - progressText.textContent = label || ''; + async _countAuthorsWithLocationStrings() { + if (!window.indexedDBManager?.db) return 0; + try { + const db = window.indexedDBManager.db; + const tx = db.transaction(['authorEntities'], 'readonly'); + const store = tx.objectStore('authorEntities'); + const all = await new Promise((resolve, reject) => { + const req = store.getAll(); + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); + let count = 0; + for (const entity of all) { + const meta = entity.metadata || entity.data?.metadata; + if (meta?.location && String(meta.location).trim()) { + count++; + } } - }; + return count; + } catch (e) { + console.warn('Failed to count authors with location strings:', e); + return 0; + } + } + + async _getAllAuthorEntities() { + const db = window.indexedDBManager.db; + const tx = db.transaction(['authorEntities'], 'readonly'); + const store = tx.objectStore('authorEntities'); + return new Promise((resolve, reject) => { + const req = store.getAll(); + req.onsuccess = () => resolve(req.result || []); + req.onerror = () => reject(req.error); + }); + } + + async _fetchRemainingLocations(btn, progressSpan, alertDiv, statusDiv, otherBtn = null) { + const { showProgressBar, hideProgressBar, setBarPercent } = this._locationProgressController(); const token = sessionStorage.getItem('github_token'); if (!token) { @@ -2220,20 +2275,14 @@ class SettingsApp { } btn.disabled = true; + if (otherBtn) otherBtn.disabled = true; statusDiv.classList.remove('d-none'); showProgressBar(); setBarPercent(0, 'Loading author entities...'); progressSpan.textContent = 'Loading author entities...'; try { - const db = window.indexedDBManager.db; - const tx = db.transaction(['authorEntities'], 'readonly'); - const store = tx.objectStore('authorEntities'); - const all = await new Promise((resolve, reject) => { - const req = store.getAll(); - req.onsuccess = () => resolve(req.result); - req.onerror = () => reject(req.error); - }); + const all = await this._getAllAuthorEntities(); const needsFetch = []; for (const entity of all) { @@ -2305,6 +2354,10 @@ class SettingsApp { // Re-count to update the button state const stillMissing = await this._countMissingLocationAuthors(); btn.disabled = stillMissing === 0; + if (otherBtn) { + const withLocationStrings = await this._countAuthorsWithLocationStrings(); + otherBtn.disabled = !(withLocationStrings > 0 && window.LocationService); + } } catch (error) { console.error('Failed to fetch remaining locations:', error); alertDiv.className = 'alert alert-danger mb-0'; @@ -2312,6 +2365,153 @@ class SettingsApp { progressSpan.textContent = ''; hideProgressBar(); btn.disabled = false; + if (otherBtn) otherBtn.disabled = false; + } + } + + async _rescanGeocoding(btn, progressSpan, alertDiv, statusDiv, otherBtn = null) { + const { showProgressBar, hideProgressBar, setBarPercent } = this._locationProgressController(); + + if (!window.LocationService) { + alertDiv.className = 'alert alert-danger mb-0'; + alertDiv.textContent = 'LocationService is not available on this page.'; + statusDiv.classList.remove('d-none'); + return; + } + + if (!window.indexedDBManager?.isInitialized?.()) { + alertDiv.className = 'alert alert-danger mb-0'; + alertDiv.textContent = 'IndexedDB is not ready yet. Please reload the page and try again.'; + statusDiv.classList.remove('d-none'); + return; + } + + const authorCount = await this._countAuthorsWithLocationStrings(); + if (authorCount === 0) { + alertDiv.className = 'alert alert-info mb-0'; + alertDiv.textContent = 'No authors with location strings found to re-resolve.'; + statusDiv.classList.remove('d-none'); + btn.disabled = true; + return; + } + + const confirmed = window.confirm( + `Clear the geocoding cache and re-resolve country codes for ${authorCount.toLocaleString()} author(s) with location strings?\n\n` + + 'Strings matched by static country/city tables resolve offline; others may call Open-Meteo or Photon.' + ); + if (!confirmed) { + return; + } + + btn.disabled = true; + if (otherBtn) otherBtn.disabled = true; + statusDiv.classList.remove('d-none'); + showProgressBar(); + setBarPercent(0, 'Clearing geocoding cache...'); + if (progressSpan) progressSpan.textContent = 'Clearing geocoding cache...'; + + try { + const locationService = new window.LocationService(); + await window.indexedDBManager.clearCacheStore('locations'); + locationService.clearCache(); + + setBarPercent(5, 'Loading author entities...'); + const all = await this._getAllAuthorEntities(); + + const authorEntries = []; + const locationsNeedingGeocoding = new Set(); + + for (const entity of all) { + const meta = entity.metadata || entity.data?.metadata; + const authorKey = entity.authorKey || entity.key; + const authorEntity = entity.data || entity; + if (!authorKey || !meta?.location || !String(meta.location).trim()) { + continue; + } + + if (authorEntity.metadata) { + delete authorEntity.metadata.countryCode; + delete authorEntity.metadata.country; + delete authorEntity.metadata.countryCodes; + delete authorEntity.metadata.countries; + } + + const normalized = locationService.normalizeLocationString(meta.location); + if (normalized) { + locationsNeedingGeocoding.add(normalized); + authorEntries.push({ authorKey, authorEntity, normalized }); + } + } + + setBarPercent(10, `Stripping old country codes from ${authorEntries.length.toLocaleString()} author(s)...`); + for (let i = 0; i < authorEntries.length; i++) { + const { authorKey, authorEntity } = authorEntries[i]; + await window.cacheManager.saveAuthorEntity(authorKey, authorEntity); + if (i % 50 === 0 || i === authorEntries.length - 1) { + const pct = 10 + ((i + 1) / authorEntries.length) * 10; + setBarPercent(pct, `Prepared ${i + 1}/${authorEntries.length} author(s)...`); + } + } + + const uniqueLocations = Array.from(locationsNeedingGeocoding); + setBarPercent(20, `Geocoding ${uniqueLocations.length.toLocaleString()} unique location string(s)...`); + + const geocodeResults = await locationService.batchGeocode( + uniqueLocations, + (processed, total) => { + const pct = 20 + (processed / total) * 70; + const label = `Geocoding locations: ${processed}/${total}`; + setBarPercent(pct, label); + if (progressSpan) progressSpan.textContent = label; + } + ); + + setBarPercent(92, 'Updating author records...'); + let updatedAuthors = 0; + for (let i = 0; i < authorEntries.length; i++) { + const { authorKey, authorEntity, normalized } = authorEntries[i]; + const geocoded = geocodeResults.get(normalized); + if (geocoded?.countryCode) { + authorEntity.metadata = { + ...authorEntity.metadata, + countryCode: geocoded.countryCode, + ...(geocoded.country && { country: geocoded.country }) + }; + await window.cacheManager.saveAuthorEntity(authorKey, authorEntity); + updatedAuthors++; + } + if (i % 50 === 0 || i === authorEntries.length - 1) { + const pct = 92 + ((i + 1) / authorEntries.length) * 8; + setBarPercent(pct, `Updated ${updatedAuthors} author(s)...`); + } + } + + const geocodedLocations = Array.from(geocodeResults.values()).filter(r => r && !r.failed && r.countryCode).length; + const failedLocations = uniqueLocations.length - geocodedLocations; + + setBarPercent(100, 'Done'); + alertDiv.className = 'alert alert-success mb-0'; + let msg = `Re-resolved ${updatedAuthors.toLocaleString()} author(s) from ${geocodedLocations.toLocaleString()} location string(s).`; + if (failedLocations > 0) { + msg += ` ${failedLocations.toLocaleString()} string(s) could not be geocoded.`; + alertDiv.className = 'alert alert-warning mb-0'; + } + alertDiv.textContent = msg; + if (progressSpan) progressSpan.textContent = ''; + + setTimeout(() => hideProgressBar(), 1500); + } catch (error) { + console.error('Failed to re-resolve geocoding:', error); + alertDiv.className = 'alert alert-danger mb-0'; + alertDiv.textContent = `Error: ${error.message}`; + if (progressSpan) progressSpan.textContent = ''; + hideProgressBar(); + } finally { + btn.disabled = !((await this._countAuthorsWithLocationStrings()) > 0 && window.LocationService); + if (otherBtn) { + const stillMissing = await this._countMissingLocationAuthors(); + otherBtn.disabled = stillMissing === 0; + } } } } diff --git a/settings.html b/settings.html index 3ffbf97..829de94 100644 --- a/settings.html +++ b/settings.html @@ -195,12 +195,23 @@
    Author Location Enrichment
    -
    +
    +
    +

    + Clears the geocoding cache and re-resolves country codes for authors who already have a location string. + Use this after geocoding provider changes or to retry previously failed lookups. Does not re-fetch GitHub profiles. +

    +
    + + +
    About Cyfinoid Research - - + + + - + \ No newline at end of file From 18d769008076edbcd68a36cea29dc06803e83895 Mon Sep 17 00:00:00 2001 From: Anant Shrivastava Date: Thu, 6 Aug 2026 06:46:37 -0700 Subject: [PATCH 15/19] clearly marking localai --- CHANGELOG.md | 1 + insights-agent.html | 19 +++++++++++++++++-- js/insights-agent.js | 15 ++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa67a61..2d98499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Multi-provider geocoding replaces Nominatim** (`js/location-service.js`, new `js/city-data.js`, `about.html`, `authors.html`, `index.html`, `settings.html`, `demo.html`): author location strings now resolve through a four-step cascade — static country table → static major-city table (GeoNames cities ≥50k, ~14k unambiguous entries) → Open-Meteo Geocoding API → Photon (komoot) failover. A serial network queue with per-provider spacing and 429/503 cooldown prevents burst traffic; IndexedDB cache behaviour is unchanged. Nominatim is removed. Firewall allowlist and Author Enrichment methodology on `about.html` updated accordingly. ### Changed +- **Agent page privacy messaging** (`insights-agent.html`, `js/insights-agent.js`): added a persistent on-device AI banner stating that Gemini Nano runs locally with no cloud LLM or server-side inference; status line, empty state, and unavailable state copy updated to match. - **Geocoding network dependencies**: `nominatim.openstreetmap.org` removed from the firewall allowlist; `geocoding-api.open-meteo.com` (primary API fallback) and `photon.komoot.io` (failover) added instead (`about.html`). ### Fixed diff --git a/insights-agent.html b/insights-agent.html index 8bdac03..e13faa1 100644 --- a/insights-agent.html +++ b/insights-agent.html @@ -92,6 +92,10 @@ .ag-unavailable { text-align: center; padding: var(--space-6); max-width: 500px; margin: var(--space-6) auto; } .ag-unavailable .icon { font-size: 3rem; margin-bottom: var(--space-3); opacity: 0.5; } .ag-cap-badge { display: inline-block; font-size: 0.65rem; background: var(--bg-info); color: var(--color-blue); padding: 0.15rem 0.5rem; border-radius: 0.3rem; margin-left: 0.3rem; } + .ag-privacy-banner { border-left: 4px solid var(--color-green); background: var(--bg-info); color: var(--text-primary); } + .ag-privacy-banner .ag-privacy-title { font-weight: 700; margin-bottom: 0.15rem; } + .ag-privacy-banner p { margin-bottom: 0; font-size: var(--font-size-caption); color: var(--text-secondary); } + .ag-privacy-banner .ag-privacy-icon { color: var(--color-green); font-size: 1.25rem; flex-shrink: 0; margin-top: 0.1rem; } @media (max-width: 576px) { .ag-layout { height: calc(100vh - 200px); min-height: 400px; } .ag-metrics { gap: var(--space-1); } .ag-metric { padding: var(--space-1) var(--space-2); min-width: 50px; } .ag-metric .v { font-size: 0.85rem; } .ag-msg .bubble { max-width: 90%; } } @@ -123,6 +127,17 @@
    +
    + +
    +
    100% on-device AI — no server-side inference
    +

    + This page uses Chrome’s built-in Gemini Nano (Prompt API) on your machine. + Your SBOM analysis, questions, and model answers are not sent to SBOM Play or any cloud LLM. + SBOM data is read from local IndexedDB; only tool-query results in memory are summarized by the on-device model. +

    +
    +