From 5e7f2c36de6f440d21b57023ccfe45b4c4011340 Mon Sep 17 00:00:00 2001 From: CarterPerez-dev Date: Mon, 4 May 2026 18:53:54 -0400 Subject: [PATCH] I'm being gangstalked by the CIA, they put a chip in my brain --- .../.env.example | 14 +- .../.env.example.dev | 39 + .../.env.example.prod | 39 + .../.gitignore | 2 + .../monitor-the-situation-dashboard/Justfile | 46 +- .../monitor-the-situation-dashboard/LICENSE | 661 + .../monitor-the-situation-dashboard/README.md | 126 +- .../backend/.golangci.yml | 73 +- .../backend/cmd/api/main.go | 254 +- .../backend/go.mod | 22 +- .../backend/go.sum | 29 +- .../backend/internal/alerts/dispatcher.go | 45 + .../backend/internal/alerts/engine.go | 377 + .../backend/internal/alerts/entity.go | 107 + .../backend/internal/alerts/handler.go | 196 + .../backend/internal/alerts/repository.go | 239 + .../backend/internal/auth/dto.go | 2 +- .../backend/internal/auth/handler.go | 157 +- .../backend/internal/auth/jwt.go | 54 +- .../backend/internal/auth/service.go | 134 +- .../backend/internal/auth/verifier.go | 81 + .../backend/internal/bus/bus.go | 52 +- .../backend/internal/bus/bus_test.go | 2 +- .../internal/collectors/cfradar/client.go | 15 +- .../collectors/cfradar/client_test.go | 52 +- .../internal/collectors/cfradar/collector.go | 10 +- .../collectors/cfradar/collector_test.go | 86 +- .../internal/collectors/cfradar/repo.go | 93 +- .../collectors/coinbase/aggregator.go | 36 +- .../collectors/coinbase/aggregator_test.go | 93 +- .../internal/collectors/coinbase/client.go | 23 +- .../collectors/coinbase/client_test.go | 4 +- .../internal/collectors/coinbase/collector.go | 191 +- .../collectors/coinbase/collector_test.go | 38 +- .../internal/collectors/coinbase/readloop.go | 7 +- .../collectors/coinbase/readloop_test.go | 126 +- .../internal/collectors/coinbase/reconnect.go | 7 +- .../collectors/coinbase/reconnect_test.go | 41 +- .../internal/collectors/coinbase/repo.go | 39 +- .../internal/collectors/coinbase/repo_test.go | 48 +- .../internal/collectors/cve/collector.go | 26 +- .../internal/collectors/cve/collector_test.go | 46 +- .../internal/collectors/cve/epss_client.go | 5 +- .../collectors/cve/epss_client_test.go | 32 +- .../internal/collectors/cve/nvd_client.go | 50 +- .../collectors/cve/nvd_client_test.go | 96 +- .../backend/internal/collectors/cve/repo.go | 29 +- .../internal/collectors/dshield/client.go | 7 +- .../collectors/dshield/client_test.go | 82 +- .../internal/collectors/dshield/collector.go | 76 +- .../collectors/dshield/collector_test.go | 45 +- .../internal/collectors/dshield/repo.go | 13 +- .../internal/collectors/dshield/repo_test.go | 15 +- .../internal/collectors/dshield/types.go | 21 + .../collectors/gdelt/baseline_test.go | 24 +- .../internal/collectors/gdelt/client.go | 22 +- .../internal/collectors/gdelt/client_test.go | 22 +- .../internal/collectors/gdelt/collector.go | 45 +- .../collectors/gdelt/collector_test.go | 55 +- .../backend/internal/collectors/gdelt/repo.go | 28 +- .../collectors/heartbeat/collector_test.go | 17 +- .../backend/internal/collectors/iss/client.go | 21 +- .../internal/collectors/iss/collector.go | 12 +- .../internal/collectors/iss/collector_test.go | 55 +- .../internal/collectors/iss/propagator.go | 54 +- .../collectors/iss/propagator_test.go | 22 +- .../internal/collectors/kev/client_test.go | 22 +- .../internal/collectors/kev/collector.go | 10 +- .../internal/collectors/kev/collector_test.go | 19 +- .../backend/internal/collectors/kev/repo.go | 39 +- .../internal/collectors/kev/repo_test.go | 5 +- .../internal/collectors/ransomware/client.go | 7 +- .../collectors/ransomware/client_test.go | 14 +- .../collectors/ransomware/collector.go | 10 +- .../collectors/ransomware/collector_test.go | 36 +- .../internal/collectors/ransomware/repo.go | 41 +- .../backend/internal/collectors/state/repo.go | 40 +- .../internal/collectors/state/repo_test.go | 23 +- .../internal/collectors/swpc/client.go | 5 +- .../internal/collectors/swpc/client_test.go | 20 +- .../internal/collectors/swpc/collector.go | 84 +- .../collectors/swpc/collector_test.go | 68 +- .../internal/collectors/usgs/client_test.go | 10 +- .../internal/collectors/usgs/collector.go | 10 +- .../collectors/usgs/collector_test.go | 76 +- .../backend/internal/collectors/usgs/repo.go | 21 +- .../internal/collectors/usgs/repo_test.go | 27 +- .../internal/collectors/wikipedia/client.go | 14 +- .../collectors/wikipedia/client_test.go | 16 +- .../collectors/wikipedia/collector.go | 12 +- .../collectors/wikipedia/collector_test.go | 32 +- .../internal/collectors/wikipedia/parser.go | 19 +- .../collectors/wikipedia/parser_test.go | 20 +- .../internal/collectors/wikipedia/repo.go | 3 +- .../backend/internal/config/config.go | 77 +- .../backend/internal/core/telemetry.go | 7 +- .../internal/enrich/abuseipdb/client_test.go | 52 +- .../internal/enrich/greynoise/cached.go | 66 + .../internal/enrich/greynoise/client_test.go | 34 +- .../backend/internal/httpx/client.go | 31 +- .../backend/internal/httpx/client_test.go | 70 +- .../backend/internal/intel/handler.go | 303 + .../backend/internal/middleware/auth.go | 3 + .../backend/internal/middleware/clientip.go | 43 + .../internal/middleware/clientip_test.go | 61 + .../backend/internal/middleware/ratelimit.go | 45 +- .../backend/internal/notifications/bridge.go | 113 + .../backend/internal/notifications/crypto.go | 72 + .../backend/internal/notifications/dto.go | 56 + .../backend/internal/notifications/entity.go | 39 + .../backend/internal/notifications/handler.go | 226 + .../internal/notifications/repository.go | 259 + .../backend/internal/notifications/sender.go | 223 + .../backend/internal/notifications/service.go | 327 + .../backend/internal/ratelimit/limiter.go | 5 +- .../internal/ratelimit/limiter_test.go | 11 +- .../backend/internal/redisring/ring.go | 19 +- .../backend/internal/redisring/ring_test.go | 30 +- .../backend/internal/snapshot/handler.go | 11 +- .../backend/internal/snapshot/persister.go | 3 + .../internal/snapshot/snapshot_test.go | 18 +- .../backend/internal/snapshot/store.go | 115 +- .../backend/internal/user/dto.go | 19 +- .../backend/internal/user/handler.go | 120 +- .../backend/internal/user/repository.go | 25 + .../backend/internal/user/service.go | 144 +- .../backend/internal/ws/envelope_test.go | 5 +- .../backend/internal/ws/handler.go | 61 +- .../backend/internal/ws/handler_test.go | 101 + .../backend/internal/ws/hub.go | 81 +- .../backend/internal/ws/hub_test.go | 101 +- .../backend/internal/ws/subscriber.go | 6 +- .../0005_minute_bar_volume_rename.sql | 18 + .../compose.yml | 2 +- .../conf/nginx/dev.nginx | 2 +- .../conf/nginx/prod.nginx | 2 +- .../dev.compose.yml | 14 +- .../frontend/biome.json | 9 +- .../frontend/index.html | 9 +- .../frontend/package.json | 3 + .../frontend/pnpm-lock.yaml | 24 + .../public/assets/android-chrome-192x192.png | Bin 25807 -> 60885 bytes .../public/assets/android-chrome-512x512.png | Bin 73395 -> 363335 bytes .../public/assets/apple-touch-icon.png | Bin 22963 -> 54368 bytes .../frontend/public/assets/favicon-16x16.png | Bin 746 -> 819 bytes .../frontend/public/assets/favicon-32x32.png | Bin 2032 -> 2445 bytes .../frontend/public/assets/favicon.ico | Bin 15406 -> 15406 bytes .../frontend/public/chip-in-my-brain.mp3 | Bin 0 -> 169107 bytes .../public/world-countries-110m.geo.json | 26033 +++++++++++++++- .../frontend/src/api/hooks/index.ts | 3 +- .../frontend/src/api/hooks/useAdmin.ts | 4 +- .../frontend/src/api/hooks/useAlerts.ts | 111 + .../frontend/src/api/hooks/useAuth.ts | 72 +- .../src/api/hooks/useBgpHijackData.ts | 31 +- .../src/api/hooks/useCoinbasePrices.ts | 36 + .../frontend/src/api/hooks/useCveData.ts | 45 + .../frontend/src/api/hooks/useDShieldData.ts | 11 + .../src/api/hooks/useEarthquakeData.ts | 31 +- .../frontend/src/api/hooks/useIssPosition.ts | 11 + .../frontend/src/api/hooks/useKevData.ts | 42 + .../src/api/hooks/useNotifications.ts | 222 + .../frontend/src/api/hooks/useOutageData.ts | 31 +- .../src/api/hooks/useRansomwareData.ts | 42 + .../frontend/src/api/hooks/useSpaceWeather.ts | 11 + .../frontend/src/api/hooks/useUsers.ts | 96 +- .../frontend/src/api/types/auth.types.ts | 33 +- .../frontend/src/api/types/coinbase.types.ts | 32 + .../frontend/src/api/types/cve.types.ts | 43 + .../frontend/src/api/types/geo.types.ts | 13 +- .../frontend/src/api/types/index.ts | 6 + .../frontend/src/api/types/intel.types.ts | 53 + .../src/api/types/notification.types.ts | 89 + .../frontend/src/api/types/threat.types.ts | 11 +- .../frontend/src/api/types/user.types.ts | 42 +- .../frontend/src/api/ws.test.ts | 2 +- .../frontend/src/api/ws.ts | 30 +- .../frontend/src/config.ts | 37 +- .../frontend/src/core/api/api.config.ts | 65 +- .../frontend/src/core/api/errors.ts | 6 +- .../frontend/src/core/app/protected-route.tsx | 14 +- .../frontend/src/core/lib/auth.store.ts | 9 + .../frontend/src/lib/countryCentroids.ts | 1 - .../frontend/src/lib/ethos-tokens.ts | 14 +- .../frontend/src/lib/usePriceFlash.ts | 45 + .../frontend/src/lib/useThrottledValue.ts | 43 + .../frontend/src/main.tsx | 3 + .../frontend/src/pages/admin/index.tsx | 41 +- .../frontend/src/pages/dashboard/About.tsx | 16 +- .../pages/dashboard/BottomTicker.module.scss | 29 +- .../src/pages/dashboard/BottomTicker.tsx | 60 +- .../src/pages/dashboard/Dashboard.module.scss | 200 +- .../src/pages/dashboard/Dashboard.tsx | 43 +- .../pages/dashboard/StatusFooter.module.scss | 117 + .../src/pages/dashboard/StatusFooter.tsx | 192 + .../dashboard/TimezoneTickerBar.module.scss | 95 + .../src/pages/dashboard/TimezoneTickerBar.tsx | 90 + .../src/pages/dashboard/TopStrip.module.scss | 128 +- .../frontend/src/pages/dashboard/TopStrip.tsx | 115 +- .../frontend/src/pages/dashboard/lifecycle.ts | 166 +- .../src/pages/globe/Globe.module.scss | 113 + .../frontend/src/pages/globe/Globe.tsx | 109 +- .../frontend/src/pages/globe/globeLayers.ts | 32 +- .../frontend/src/pages/login/index.tsx | 12 +- .../src/pages/login/login.module.scss | 51 +- .../src/pages/panels/BGPHijackPanel.tsx | 15 +- .../src/pages/panels/BTCPanel.module.scss | 25 +- .../frontend/src/pages/panels/BTCPanel.tsx | 83 +- .../src/pages/panels/CVEVelocityPanel.tsx | 44 +- .../src/pages/panels/DShieldPanel.module.scss | 18 + .../src/pages/panels/DShieldPanel.tsx | 31 +- .../src/pages/panels/ETHPanel.module.scss | 25 +- .../frontend/src/pages/panels/ETHPanel.tsx | 83 +- .../src/pages/panels/EarthquakePanel.tsx | 24 +- .../frontend/src/pages/panels/ISSPanel.tsx | 16 +- .../frontend/src/pages/panels/KEVPanel.tsx | 27 +- .../frontend/src/pages/panels/OutagePanel.tsx | 28 +- .../src/pages/panels/Panel.module.scss | 57 +- .../frontend/src/pages/panels/Panel.tsx | 50 +- .../src/pages/panels/RansomwarePanel.tsx | 31 +- .../src/pages/panels/SpaceWeatherPanel.tsx | 23 +- .../src/pages/panels/WikiPanel.module.scss | 61 + .../frontend/src/pages/panels/WikiPanel.tsx | 72 + .../panels/shared/StaleIndicator.module.scss | 6 +- .../pages/panels/shared/StaleIndicator.tsx | 17 +- .../frontend/src/pages/register/index.tsx | 33 +- .../src/pages/register/register.module.scss | 50 +- .../frontend/src/pages/settings/index.tsx | 848 +- .../src/pages/settings/settings.module.scss | 536 +- .../frontend/src/stores/bgpHijack.ts | 2 +- .../frontend/src/stores/cve.ts | 12 +- .../frontend/src/stores/earthquake.ts | 2 +- .../frontend/src/stores/freshness.ts | 29 + .../frontend/src/stores/globeEvents.ts | 3 +- .../frontend/src/stores/heartbeat.ts | 14 + .../frontend/src/stores/kev.ts | 13 +- .../frontend/src/stores/outage.ts | 2 +- .../frontend/src/stores/ransomware.ts | 11 +- .../frontend/src/stores/ticker.test.ts | 2 +- .../frontend/src/stores/ticker.ts | 1 + .../frontend/src/styles.scss | 6 +- .../frontend/src/styles/_ethos.scss | 6 +- .../frontend/src/styles/_fonts.scss | 8 +- .../frontend/src/styles/_reset.scss | 2 +- .../frontend/src/styles/_tokens.scss | 52 +- .../learn/.gitkeep | 0 README.md | 4 +- 246 files changed, 37862 insertions(+), 1890 deletions(-) create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.dev create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.prod create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/LICENSE create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/dispatcher.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/engine.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/entity.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/handler.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/repository.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/verifier.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/types.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/cached.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/intel/handler.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip_test.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/bridge.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/crypto.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/dto.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/entity.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/handler.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/repository.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/sender.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/service.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler_test.go create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/backend/migrations/0005_minute_bar_volume_rename.sql create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/chip-in-my-brain.mp3 create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAlerts.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCoinbasePrices.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCveData.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useDShieldData.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useIssPosition.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useKevData.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useNotifications.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useRansomwareData.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useSpaceWeather.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/coinbase.types.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/cve.types.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/intel.types.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/notification.types.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/usePriceFlash.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/useThrottledValue.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/dashboard/StatusFooter.module.scss create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/dashboard/StatusFooter.tsx create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/dashboard/TimezoneTickerBar.module.scss create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/dashboard/TimezoneTickerBar.tsx create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.module.scss create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.tsx create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/stores/freshness.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/stores/heartbeat.ts create mode 100644 PROJECTS/advanced/monitor-the-situation-dashboard/learn/.gitkeep diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example index d597abf8..8d310b5a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example @@ -1,5 +1,5 @@ # ©AngelaMos | 2026 -# .env.example +# .env.example.dev APP_NAME=monitor PUBLIC_URL=http://localhost:8432 @@ -16,7 +16,9 @@ POSTGRES_DB=monitor REDIS_PASSWORD= -JWT_SECRET= +# AES-256 key for at-rest encryption of webhook URLs / bot tokens. +# Generate with: openssl rand -base64 32 +# Without this set, the entire notifications + alerts pipeline is disabled. NOTIFICATION_ENCRYPTION_KEY= NVD_API_KEY= @@ -24,6 +26,12 @@ CF_RADAR_TOKEN= GREYNOISE_API_KEY= ABUSEIPDB_API_KEY= -CLOUDFLARE_TUNNEL_TOKEN= +# Number of trusted reverse-proxy hops in front of the backend. +# Dev: nginx -> backend = 1. Prod with Cloudflare Tunnel = 2 (CF + nginx). +TRUSTED_PROXY_HOPS=1 + +# Email for the bootstrap admin. The matching account is auto-promoted to +# role=admin on registration / login. Leave blank to disable auto-promotion. +ADMIN_EMAIL= VITE_API_URL=/api diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.dev b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.dev new file mode 100644 index 00000000..94143c70 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.dev @@ -0,0 +1,39 @@ +# ©AngelaMos | 2026 +# .env.example + +APP_NAME=monitor +PUBLIC_URL=http://localhost:8432 + +NGINX_HOST_PORT=8432 +BACKEND_HOST_PORT=5432 +FRONTEND_HOST_PORT=3432 +POSTGRES_HOST_PORT=4432 +REDIS_HOST_PORT=6432 + +POSTGRES_USER=monitor +POSTGRES_PASSWORD=changeme +POSTGRES_DB=monitor + +REDIS_PASSWORD= + +# AES-256 key for at-rest encryption of webhook URLs / bot tokens. +# Generate with: openssl rand -base64 32 +# Without this set, the entire notifications + alerts pipeline is disabled. +NOTIFICATION_ENCRYPTION_KEY= + +NVD_API_KEY= +CF_RADAR_TOKEN= +GREYNOISE_API_KEY= +ABUSEIPDB_API_KEY= + +CLOUDFLARE_TUNNEL_TOKEN= + +# Number of trusted reverse-proxy hops in front of the backend. +# Dev: nginx -> backend = 1. Prod with Cloudflare Tunnel = 2 (CF + nginx). +TRUSTED_PROXY_HOPS=1 + +# Email for the bootstrap admin. The matching account is auto-promoted to +# role=admin on registration / login. Leave blank to disable auto-promotion. +ADMIN_EMAIL= + +VITE_API_URL=/api diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.prod b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.prod new file mode 100644 index 00000000..53950351 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/.env.example.prod @@ -0,0 +1,39 @@ +# ©AngelaMos | 2026 +# .env.example.prod + +APP_NAME=situation-monitor-prod +PUBLIC_URL=https://xxx.xxx + +NGINX_HOST_PORT=7729 +BACKEND_HOST_PORT=9292 +FRONTEND_HOST_PORT=49967 +POSTGRES_HOST_PORT=47844 +REDIS_HOST_PORT=55675 + +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_DB= + +REDIS_PASSWORD= + +# AES-256 key for at-rest encryption of webhook URLs / bot tokens. +# Generate with: openssl rand -base64 32 +# Without this set, the entire notifications + alerts pipeline is disabled. +NOTIFICATION_ENCRYPTION_KEY= + +NVD_API_KEY= +CF_RADAR_TOKEN=c +GREYNOISE_API_KEY= +ABUSEIPDB_API_KEY= + +CLOUDFLARE_TUNNEL_TOKEN= + +VITE_API_URL=/api + +# Number of trusted reverse-proxy hops in front of the backend. +# Dev: nginx -> backend = 1. Prod with Cloudflare Tunnel = 2 (CF + nginx). +TRUSTED_PROXY_HOPS=2 + +# Email for the bootstrap admin. The matching account is auto-promoted to +# role=admin on registration / login. Leave blank to disable auto-promotion. +ADMIN_EMAIL= diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/.gitignore b/PROJECTS/advanced/monitor-the-situation-dashboard/.gitignore index df37de2a..2301f2b3 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/.gitignore +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/.gitignore @@ -4,6 +4,7 @@ .env .env.local .env.*.local +.env.prod backend/tmp/ backend/bin/ @@ -11,6 +12,7 @@ backend/coverage.out backend/coverage.html backend/keys/ + frontend/dist/ frontend/node_modules/ frontend/.vite/ diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/Justfile b/PROJECTS/advanced/monitor-the-situation-dashboard/Justfile index ffc21484..6a21c33b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/Justfile +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/Justfile @@ -29,7 +29,7 @@ lint-fix: [group('lint')] format: - cd backend && gofumpt -w . && goimports -w . + cd backend && golangci-lint fmt [group('lint')] tidy: @@ -106,7 +106,7 @@ install: [group('db')] migrate *ARGS: - docker compose -f compose.yml exec backend sh -c 'goose -dir /migrations postgres "$DATABASE_URL" up' {{ARGS}} + docker compose --env-file .env.prod -f compose.yml exec backend sh -c 'goose -dir /migrations postgres "$DATABASE_URL" up' {{ARGS}} [group('db')] migrate-dev *ARGS: @@ -134,27 +134,27 @@ redis-cli: [group('docker')] up *ARGS: - docker compose -f compose.yml up {{ARGS}} + docker compose --env-file .env.prod -f compose.yml up {{ARGS}} [group('docker')] start *ARGS: - docker compose -f compose.yml up -d --build {{ARGS}} + docker compose --env-file .env.prod -f compose.yml up -d --build {{ARGS}} [group('docker')] down *ARGS: - docker compose -f compose.yml down {{ARGS}} + docker compose --env-file .env.prod -f compose.yml down {{ARGS}} [group('docker')] logs *SERVICE: - docker compose -f compose.yml logs -f {{SERVICE}} + docker compose --env-file .env.prod -f compose.yml logs -f {{SERVICE}} [group('docker')] ps: - docker compose -f compose.yml ps + docker compose --env-file .env.prod -f compose.yml ps [group('docker')] build-prod: - docker compose -f compose.yml build + docker compose --env-file .env.prod -f compose.yml build # ============================================================================= # Docker (development) @@ -184,6 +184,12 @@ dev-ps: dev-shell service='backend': docker compose -f dev.compose.yml exec -it {{service}} /bin/sh +[group('docker')] +dev-restart: + docker compose -f dev.compose.yml down + docker compose -f dev.compose.yml up -d --build + docker compose -f dev.compose.yml logs -f + [group('docker')] dev-clean: docker compose -f dev.compose.yml down -v @@ -194,19 +200,35 @@ dev-clean: [group('tunnel')] tunnel-up *ARGS: - docker compose -f compose.yml -f cloudflared.compose.yml up {{ARGS}} + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml up {{ARGS}} [group('tunnel')] tunnel-start *ARGS: - docker compose -f compose.yml -f cloudflared.compose.yml up -d --build {{ARGS}} + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml up -d --build {{ARGS}} [group('tunnel')] tunnel-down *ARGS: - docker compose -f compose.yml -f cloudflared.compose.yml down {{ARGS}} + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml down {{ARGS}} [group('tunnel')] tunnel-logs: - docker compose -f compose.yml -f cloudflared.compose.yml logs -f cloudflared + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml logs -f cloudflared + +[group('tunnel')] +prod-restart: + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml down + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml up -d + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml logs -f + +[group('tunnel')] +prod-redeploy: + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml down + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml up -d --build + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml logs -f + +[group('tunnel')] +prod-logs *SERVICE: + docker compose --env-file .env.prod -f compose.yml -f cloudflared.compose.yml logs -f {{SERVICE}} # ============================================================================= # Utilities diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/LICENSE b/PROJECTS/advanced/monitor-the-situation-dashboard/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/README.md b/PROJECTS/advanced/monitor-the-situation-dashboard/README.md index 6b62b30c..f1585d53 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/README.md +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/README.md @@ -3,65 +3,82 @@ README.md --> -# Monitor the Situation +```json + ██████╗██╗ █████╗ +██╔════╝██║██╔══██╗ +██║ ██║███████║ +██║ ██║██╔══██║ +╚██████╗██║██║ ██║ + ╚═════╝╚═╝╚═╝ ╚═╝ +``` -Operator-grade real-time situational awareness dashboard. Single-binary Go backend, React 19 frontend, Postgres + Redis, fronted by nginx and (optionally) a Cloudflare Tunnel. +[![Cybersecurity Projects](https://img.shields.io/badge/Cybersecurity--Projects-Project%20%2328-red?style=flat&logo=github)](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/advanced/monitor-the-situation-dashboard) +[![Go](https://img.shields.io/badge/Go-1.25+-00ADD8?style=flat&logo=go&logoColor=white)](https://go.dev) +[![React](https://img.shields.io/badge/React-19-61DAFB?style=flat&logo=react&logoColor=black)](https://react.dev) +[![License: AGPLv3](https://img.shields.io/badge/License-AGPL_v3-purple.svg)](https://www.gnu.org/licenses/agpl-3.0) +[![Live Demo](https://img.shields.io/badge/Live-iminthewalls.com-green?style=flat&logo=googlechrome)](https://iminthewalls.com/) +[![Docker](https://img.shields.io/badge/Docker-ready-2496ED?style=flat&logo=docker)](https://www.docker.com) -> The phrase "Monitoring the situation" is a Twitter/X meme from June 2025. This is the version that actually monitors the situation. +> Operator-grade real-time situational awareness dashboard. Eleven live feeds across cyber, world, and finance — fused into a single 3D-globe SOC view with WebSocket delivery and configurable alerting. + +*This is a quick overview — security theory, architecture, and full walkthroughs are in the [learn modules](#learn).* + +> The phrase "monitoring the situation" is a Twitter/X meme from June 2025. This is the version that actually monitors the situation. + +## What It Does + +- Aggregates 11 high-signal data feeds (DShield, Cloudflare Radar, NVD/EPSS, CISA KEV, ransomware.live, Coinbase WS, USGS, NOAA SWPC, Wikipedia ITN, GDELT, ISS) with per-source cadences from sub-second to daily +- WebSocket fan-out from a single Go binary — collectors run as errgroup goroutines, events flow through an in-process bus to all connected clients +- 3D MapLibre globe centerpiece with country-level outage shading, BGP hijack regions, mass-scan source ASN dots, ransomware victim markers, earthquake epicenters, and live ISS orbital track +- CVE velocity timeline with EPSS-weighted prioritization and CISA KEV diff alerts +- Configurable alerts (toast / banner / chime / Telegram / Discord) with AES-256 encryption of webhook secrets at rest +- BRIN-indexed Postgres time-series storage tuned for append-mostly event streams +- JWT auth with auto-rotating Ed25519 keys, public read-only mode, multi-device session management + +## Quick Start + +```bash +just dev-up +``` + +Visit `http://localhost:8432` or the live demo at [iminthewalls.com](https://iminthewalls.com/) + +> [!TIP] +> This project uses [`just`](https://github.com/casey/just) as a command runner. Type `just` to see all available commands. +> +> Install: `curl -sSf https://just.systems/install.sh | bash -s -- --to ~/.local/bin` ## Stack -| Layer | Tech | -| ----------- | ---------------------------------------------------------- | -| Backend | Go 1.22, chi router, `coder/websocket`, `goose` migrations | -| Frontend | React 19, Vite, TanStack Query, Zustand, MapLibre, D3 | -| Storage | Postgres 16 (BRIN-indexed time-series), Redis 7 | -| Ingress | nginx (dev + prod), Cloudflare Tunnel (prod) | -| Build / run | `just` recipes, multi-stage Docker, air for live reload | +**Backend:** Go 1.25, chi v5, `coder/websocket`, pgx + pgxpool, goose migrations, errgroup-driven collectors, Argon2id, JWT (Ed25519) -## Data sources +**Frontend:** React 19, TypeScript, Vite, TanStack Query v5, Zustand, MapLibre GL, D3, SCSS Modules -| Panel | Source | Cadence | Auth | -| ------------------------------ | ---------------------------- | ---------- | --------------------------------------------- | -| Mass-scan firehose | DShield (SANS ISC) | 1h | none | -| Internet outages + BGP hijacks | Cloudflare Radar | 5m | `CF_RADAR_TOKEN` (Radar:Read scope) | -| CVE velocity + EPSS | NVD CVE 2.0 + FIRST EPSS | 2h | `NVD_API_KEY` (optional, raises rate limit) | -| CISA KEV | CISA KEV catalog | 1h | none | -| Ransomware victims | ransomware.live | 15m | none | -| Live BTC + ETH ticks | Coinbase Advanced Trade WS | persistent | none | -| Earthquakes (M2.5+) | USGS GeoJSON feed | 1m | none | -| Space weather | NOAA SWPC (5 endpoints) | 1m / 3h | none | -| World events | Wikipedia ITN + GDELT v2 API | 5m / 15m | none | -| ISS position | wheretheiss.at + CelesTrak | 10s / 24h | none | -| IP enrichment (BGP hijacks) | AbuseIPDB | on-demand | `ABUSEIPDB_API_KEY` (optional, free tier 1k/day) | +**Data:** PostgreSQL 16 (BRIN time-series indexes), Redis 7 -## Quickstart (development) +**Infrastructure:** Docker Compose, nginx reverse proxy, Cloudflare Tunnel (prod), multi-stage builds, air for live reload -```bash -cp .env.example .env -# fill .env: POSTGRES_PASSWORD, JWT_SECRET, NOTIFICATION_ENCRYPTION_KEY -just dev-start -just migrate-dev -open http://localhost:8432 -``` +## Data Sources -JWT signing keys auto-generate at `backend/keys/private.pem` on first boot. The dev stack binds host ports `8432` (nginx) / `5432` (backend) / `4432` (postgres) / `6432` (redis) / `3432` (vite). - -### Smoke checks - -```bash -curl -s http://localhost:8432/api/v1/healthz -curl -s http://localhost:8432/api/v1/snapshot | jq . -docker run --rm -i --network host ghcr.io/vi/websocat:latest \ - "ws://localhost:8432/api/v1/ws?topics=heartbeat" -``` +| Panel | Source | Cadence | Auth | +|-------|--------|---------|------| +| Mass-scan firehose | DShield (SANS ISC) | 1h | none | +| Internet outages + BGP hijacks | Cloudflare Radar | 5m | `CF_RADAR_TOKEN` | +| CVE velocity + EPSS | NVD CVE 2.0 + FIRST EPSS | 2h | `NVD_API_KEY` (optional) | +| CISA KEV (in-the-wild) | CISA KEV catalog | 1h | none | +| Ransomware victims | ransomware.live | 15m | none | +| BTC + ETH live ticks | Coinbase Advanced Trade WS | persistent | none | +| Earthquakes (M2.5+) | USGS GeoJSON | 1m | none | +| Space weather (Kp / Bz / X-flux) | NOAA SWPC | 1m / 3h | none | +| World events | Wikipedia ITN + GDELT v2 | 5m / 15m | none | +| ISS position + passes | wheretheiss.at + CelesTrak | 10s / 24h | none | +| IP enrichment (BGP) | AbuseIPDB | on-demand | `ABUSEIPDB_API_KEY` (optional) | ## Production (Cloudflare Tunnel) ```bash cp .env.example .env -# fill production secrets including CLOUDFLARE_TUNNEL_TOKEN -just tunnel-start +just prod-redeploy just migrate ``` @@ -71,11 +88,18 @@ just migrate cd backend && go test -race ./... ``` -## Layout +## Learn -``` -backend/ Go services (cmd/api, internal/{events,bus,ws,snapshot,collectors,...}) -frontend/ React 19 dashboard -conf/ nginx and per-environment Docker configs -migrations/ goose SQL migrations (mounted into the backend container) -``` +This project includes step-by-step learning materials covering security theory, architecture, and implementation. + +| Module | Topic | +|--------|-------| +| [00 - Overview](learn/00-OVERVIEW.md) | Prerequisites and quick start | +| [01 - Concepts](learn/01-CONCEPTS.md) | Threat intel feeds, BGP hijacks, EPSS, KEV, situational awareness theory | +| [02 - Architecture](learn/02-ARCHITECTURE.md) | Single-binary collector pipeline, in-process event bus, WebSocket fan-out | +| [03 - Implementation](learn/03-IMPLEMENTATION.md) | Code walkthrough across collectors, snapshot, ws, alerts | +| [04 - Challenges](learn/04-CHALLENGES.md) | Extension ideas (additional feeds, custom alerts, deployment) | + +## License + +AGPL 3.0 diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/.golangci.yml b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/.golangci.yml index 961b2028..b73984e2 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/.golangci.yml +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/.golangci.yml @@ -28,7 +28,12 @@ linters: settings: errcheck: check-type-assertions: true - check-blank: true + check-blank: false + exclude-functions: + - (io.Closer).Close + - (*github.com/coder/websocket.Conn).Close + - (*nhooyr.io/websocket.Conn).Close + - encoding/json.Marshal funlen: lines: 100 @@ -71,25 +76,67 @@ linters: gosec: excludes: - - G104 + - G104 # unhandled errors — covered by errcheck where actionable + - G101 # hardcoded credentials — false on env-var-name maps + HTTP header constants + - G117 # exported field name matches secret pattern — false on every Password/APIKey/Token DTO field + - G115 # int conversions — values are config-bounded, no realistic overflow + - G304 # file inclusion via variable — false on test fixtures + safe internal paths + - G704 # SSRF via taint — webhook senders POST to user-supplied URLs by design + - G706 # log injection — using slog structured fields, not concat + + testifylint: + disable: + - go-require # fires inside httptest handler closures; known false-positive pattern sloglint: no-mixed-args: true kv-only: true context: all -issues: - max-same-issues: 50 - exclude-dirs: - - vendor - - testdata - exclude-rules: - - path: _test\.go - linters: - - funlen - - dupl - - goconst + exclusions: + paths: + - vendor + - testdata + rules: + # test files: don't enforce production-grade hygiene on fixtures + mocks + - path: _test\.go + linters: + - funlen + - dupl + - goconst + - gocritic + - errcheck + - exhaustive + # bodyclose: coder/websocket Dial returns a *http.Response whose body + # is empty by protocol — closing it isn't part of the websocket idiom + - path: internal/ws/ + linters: + - bodyclose + + # bodyclose: ratelimit.New[*http.Response](...) is a generic type param, + # not an actual response body — linter pattern-matches the type symbol + - path: internal/httpx/client\.go + linters: + - bodyclose + + # main.go bootstrap is inherently long + branchy + - path: cmd/api/main\.go + linters: + - gocognit + - funlen + + # auth.Login vs auth.Register: structurally similar, semantically + # different (different DTOs, errors, status codes). Deduping with a + # generic helper would obscure the code more than the duplication does. + - path: internal/auth/handler\.go + linters: + - dupl + + # coinbase websocket state machine: handleConn is inherently branchy + - path: internal/collectors/coinbase/collector\.go + linters: + - gocognit formatters: enable: diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/cmd/api/main.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/cmd/api/main.go index 364dd9a3..15745f93 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/cmd/api/main.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/cmd/api/main.go @@ -8,6 +8,7 @@ import ( "errors" "flag" "log/slog" + "net/http" "os" "os/signal" "path/filepath" @@ -18,6 +19,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/carterperez-dev/monitor-the-situation/backend/internal/admin" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/alerts" "github.com/carterperez-dev/monitor-the-situation/backend/internal/auth" "github.com/carterperez-dev/monitor-the-situation/backend/internal/bus" "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/cfradar" @@ -36,8 +38,11 @@ import ( "github.com/carterperez-dev/monitor-the-situation/backend/internal/config" "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" "github.com/carterperez-dev/monitor-the-situation/backend/internal/enrich/abuseipdb" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/enrich/greynoise" "github.com/carterperez-dev/monitor-the-situation/backend/internal/health" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/intel" "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/notifications" "github.com/carterperez-dev/monitor-the-situation/backend/internal/redisring" "github.com/carterperez-dev/monitor-the-situation/backend/internal/server" "github.com/carterperez-dev/monitor-the-situation/backend/internal/snapshot" @@ -53,7 +58,10 @@ type abuseipdbEnricher struct { client *abuseipdb.Client } -func (a abuseipdbEnricher) Lookup(ctx context.Context, ip string) (cfradar.Enrichment, error) { +func (a abuseipdbEnricher) Lookup( + ctx context.Context, + ip string, +) (cfradar.Enrichment, error) { v, err := a.client.Lookup(ctx, ip) if err != nil { return cfradar.Enrichment{}, err @@ -65,16 +73,62 @@ func (a abuseipdbEnricher) Lookup(ctx context.Context, ip string) (cfradar.Enric }, nil } +type compositeDshieldEnricher struct { + abuse *abuseipdb.Client + gn *greynoise.Cached +} + +func (c compositeDshieldEnricher) Lookup( + ctx context.Context, + ip string, +) (dshield.DShieldEnrichment, error) { + out := dshield.DShieldEnrichment{} + if c.abuse != nil { + if v, err := c.abuse.Lookup(ctx, ip); err == nil { + out.Country = v.CountryCode + } + } + if c.gn != nil { + if v, err := c.gn.Lookup(ctx, ip); err == nil { + out.Classification = v.Classification + out.Actor = v.Name + } + } + return out, nil +} + func main() { configPath := flag.String("config", "config.yaml", "path to config file") + healthcheck := flag.Bool( + "healthcheck", + false, + "probe local /healthz and exit 0 if healthy, 1 otherwise", + ) flag.Parse() + if *healthcheck { + os.Exit(runHealthcheck()) + } + if err := run(*configPath); err != nil { slog.Error("application error", "error", err) os.Exit(1) } } +func runHealthcheck() int { + client := &http.Client{Timeout: 3 * time.Second} + resp, err := client.Get("http://127.0.0.1:8080/healthz") + if err != nil { + return 1 + } + defer func() { _ = resp.Body.Close() }() + if resp.StatusCode != http.StatusOK { + return 1 + } + return 0 +} + //nolint:funlen // bootstrap code is inherently verbose func run(configPath string) error { ctx, stop := signal.NotifyContext( @@ -128,8 +182,8 @@ func run(configPath string) error { "pool_size", cfg.Redis.PoolSize, ) - if err := ensureJWTKeys(cfg.JWT, logger); err != nil { - return err + if keyErr := ensureJWTKeys(cfg.JWT, logger); keyErr != nil { + return keyErr } jwtManager, err := auth.NewJWTManager(cfg.JWT) @@ -146,8 +200,60 @@ func run(configPath string) error { userHandler := user.NewHandler(userSvc) authRepo := auth.NewRepository(db.DB) - authSvc := auth.NewService(authRepo, jwtManager, userSvc, redis.Client) - authHandler := auth.NewHandler(authSvc) + authSvc := auth.NewServiceWithConfig(auth.ServiceConfig{ + Repo: authRepo, + JWT: jwtManager, + UserProvider: userSvc, + Redis: redis.Client, + AdminEmail: cfg.App.AdminEmail, + }) + authVerifier := auth.NewVerifier(jwtManager, authSvc, userSvc) + authHandler := auth.NewHandlerWithConfig(auth.HandlerConfig{ + Service: authSvc, + TrustedProxyHops: cfg.Server.TrustedProxyHops, + SecureCookies: cfg.IsProduction(), + }) + + var notifHandler *notifications.Handler + var notifBridge *notifications.Bridge + if cfg.Notifications.EncryptionKey != "" { + enc, encErr := notifications.NewEncryptor( + cfg.Notifications.EncryptionKey, + ) + if encErr != nil { + logger.Warn( + "notifications disabled: invalid encryption key", + "error", encErr, + ) + } else { + notifRepo := notifications.NewRepository(db.DB) + notifSender := notifications.NewSender() + notifSvc := notifications.NewService( + notifRepo, + enc, + notifSender, + cfg.App.PublicURL, + logger.With("service", "notifications"), + ) + notifHandler = notifications.NewHandler(notifSvc) + notifBridge = notifications.NewBridge( + notifRepo, + enc, + notifSender, + logger.With("service", "alerts"), + ) + } + } else { + logger.Warn( + "notifications disabled: NOTIFICATION_ENCRYPTION_KEY not set", + ) + } + + alertsRepo := alerts.NewRepository(db.DB) + authSvc.SetRuleSeeder(func(ctx context.Context, userID string) error { + return alertsRepo.SeedDefaults(ctx, userID) + }) + alertsHandler := alerts.NewHandler(alertsRepo) healthHandler := health.NewHandler(db, redis) @@ -161,8 +267,28 @@ func run(configPath string) error { snapStore := snapshot.NewStore(redis.Client) snapHandler := snapshot.NewHandler(snapStore) - hub := ws.NewHub(ws.HubConfig{Logger: logger}) - wsHandler := ws.NewHandler(hub) + cveRepo := cve.NewRepo(db.DB) + kevRepo := kev.NewRepo(db.DB) + cfradarRepo := cfradar.NewRepo(db.DB) + ransomwareRepo := ransomware.NewRepo(db.DB) + usgsRepo := usgs.NewRepo(db.DB) + intelHandler := intel.NewHandler(intel.HandlerConfig{ + CVE: cveRepo, + KEV: kevRepo, + CFRadar: cfradarRepo, + Ransomware: ransomwareRepo, + USGS: usgsRepo, + }) + + hub := ws.NewHub(ws.HubConfig{ + Logger: logger, + MaxSubscribers: cfg.Server.WSMaxSubscribers, + }) + wsHandler := ws.NewHandlerWithConfig(ws.HandlerConfig{ + Hub: hub, + MaxConnsPerIP: cfg.Server.WSMaxConnsPerIP, + TrustedProxyHops: cfg.Server.TrustedProxyHops, + }) eventBus := bus.New(bus.Config{ BufferSize: 512, @@ -182,13 +308,66 @@ func run(configPath string) error { collectorGroup.Go(func() error { return eventBus.Run(collectorCtx) }) collectorGroup.Go(func() error { return beat.Run(collectorCtx) }) + if notifBridge != nil { + alertsEngine, err := alerts.NewEngine(alerts.EngineConfig{ + Repo: alertsRepo, + Notifier: notifBridge, + Loader: notifBridge, + Cooldowns: alerts.NewRedisCooldown(redis.Client), + Logger: logger.With("component", "alerts.engine"), + }) + if err != nil { + return err + } + dispatcher := alerts.NewDispatcher( + eventBus.Subscribe(), + alertsEngine, + logger.With("component", "alerts.dispatcher"), + ) + collectorGroup.Go( + func() error { return alertsEngine.RefreshLoop(collectorCtx) }, + ) + collectorGroup.Go(func() error { return dispatcher.Run(collectorCtx) }) + } else { + logger.Info( + "alerts engine disabled (notifications module not configured)", + ) + } + if cfg.Collectors.DShield.Enabled { + var dsEnricher dshield.Enricher + var abuseClient *abuseipdb.Client + var gnCached *greynoise.Cached + if cfg.Collectors.AbuseIPDB.Enabled && + cfg.Collectors.AbuseIPDB.APIKey != "" { + abuseClient = abuseipdb.NewClient( + abuseipdb.ClientConfig{APIKey: cfg.Collectors.AbuseIPDB.APIKey}, + ) + } + if cfg.Collectors.GreyNoise.Enabled && + cfg.Collectors.GreyNoise.APIKey != "" { + gnCached = greynoise.NewCached( + greynoise.NewClient( + greynoise.ClientConfig{ + APIKey: cfg.Collectors.GreyNoise.APIKey, + }, + ), + redis.Client, + ) + } + if abuseClient != nil || gnCached != nil { + dsEnricher = compositeDshieldEnricher{ + abuse: abuseClient, + gn: gnCached, + } + } coll := dshield.NewCollector(dshield.CollectorConfig{ Interval: cfg.Collectors.DShield.Interval, Fetcher: dshield.NewClient(dshield.ClientConfig{}), Persister: dshield.NewRepo(db.DB), Emitter: eventBus, State: collectorState, + Enricher: dsEnricher, Logger: logger.With("collector", "dshield"), }) collectorGroup.Go(func() error { return coll.Run(collectorCtx) }) @@ -196,20 +375,29 @@ func run(configPath string) error { if cfg.Collectors.CFRadar.Enabled { var enricher cfradar.Enricher - if cfg.Collectors.AbuseIPDB.Enabled && cfg.Collectors.AbuseIPDB.APIKey != "" { + if cfg.Collectors.AbuseIPDB.Enabled && + cfg.Collectors.AbuseIPDB.APIKey != "" { enricher = abuseipdbEnricher{ - client: abuseipdb.NewClient(abuseipdb.ClientConfig{APIKey: cfg.Collectors.AbuseIPDB.APIKey}), + client: abuseipdb.NewClient( + abuseipdb.ClientConfig{ + APIKey: cfg.Collectors.AbuseIPDB.APIKey, + }, + ), } } coll := cfradar.NewCollector(cfradar.CollectorConfig{ Interval: cfg.Collectors.CFRadar.Interval, MinConfidence: cfg.Collectors.CFRadar.MinConfidence, - Fetcher: cfradar.NewClient(cfradar.ClientConfig{BearerToken: cfg.Collectors.CFRadar.BearerToken}), - Repo: cfradar.NewRepo(db.DB), - Emitter: eventBus, - State: collectorState, - Enricher: enricher, - Logger: logger.With("collector", "cfradar"), + Fetcher: cfradar.NewClient( + cfradar.ClientConfig{ + BearerToken: cfg.Collectors.CFRadar.BearerToken, + }, + ), + Repo: cfradar.NewRepo(db.DB), + Emitter: eventBus, + State: collectorState, + Enricher: enricher, + Logger: logger.With("collector", "cfradar"), }) collectorGroup.Go(func() error { return coll.Run(collectorCtx) }) } @@ -218,12 +406,14 @@ func run(configPath string) error { coll := cve.NewCollector(cve.CollectorConfig{ Interval: cfg.Collectors.CVE.Interval, Window: cfg.Collectors.CVE.Window, - NVD: cve.NewNVDClient(cve.NVDClientConfig{APIKey: cfg.Collectors.CVE.NVDAPIKey}), - EPSS: cve.NewEPSSClient(cve.EPSSClientConfig{}), - Repo: cve.NewRepo(db.DB), - Emitter: eventBus, - State: collectorState, - Logger: logger.With("collector", "cve"), + NVD: cve.NewNVDClient( + cve.NVDClientConfig{APIKey: cfg.Collectors.CVE.NVDAPIKey}, + ), + EPSS: cve.NewEPSSClient(cve.EPSSClientConfig{}), + Repo: cve.NewRepo(db.DB), + Emitter: eventBus, + State: collectorState, + Logger: logger.With("collector", "cve"), }) collectorGroup.Go(func() error { return coll.Run(collectorCtx) }) } @@ -278,7 +468,10 @@ func run(configPath string) error { } if cfg.Collectors.SWPC.Enabled { - ring := redisring.New(redis.Client, redisring.Config{Retention: 24 * time.Hour}) + ring := redisring.New( + redis.Client, + redisring.Config{Retention: 24 * time.Hour}, + ) coll := swpc.NewCollector(swpc.CollectorConfig{ FastInterval: cfg.Collectors.SWPC.FastInterval, SlowInterval: cfg.Collectors.SWPC.SlowInterval, @@ -355,10 +548,12 @@ func run(configPath string) error { router.Use(middleware.Logger(logger)) router.Use( middleware.NewRateLimiter(redis.Client, middleware.RateLimitConfig{ - Limit: middleware.PerMinute( + Limit: middleware.PerWindow( cfg.RateLimit.Requests, cfg.RateLimit.Burst, + cfg.RateLimit.Window, ), + KeyFunc: middleware.KeyByClientIP(cfg.Server.TrustedProxyHops), FailOpen: true, }).Handler, ) @@ -369,7 +564,7 @@ func run(configPath string) error { router.Get("/.well-known/jwks.json", jwtManager.GetJWKSHandler()) - authenticator := middleware.Authenticator(jwtManager) + authenticator := middleware.Authenticator(authVerifier) adminOnly := middleware.RequireAdmin router.Route("/v1", func(r chi.Router) { @@ -379,13 +574,20 @@ func run(configPath string) error { r.Get("/snapshot", snapHandler.ServeHTTP) r.Get("/ws", wsHandler.ServeHTTP) - authHandler.RegisterRoutes(r, authenticator) + intelHandler.RegisterRoutes(r) - r.Post("/users", authHandler.Register) + authHandler.RegisterRoutes(r, authenticator) userHandler.RegisterRoutes(r, authenticator) userHandler.RegisterAdminRoutes(r, authenticator, adminOnly) adminHandler.RegisterRoutes(r, authenticator, adminOnly) + + if notifHandler != nil { + notifHandler.RegisterRoutes(r, authenticator) + } + if alertsHandler != nil { + alertsHandler.RegisterRoutes(r, authenticator) + } }) errChan := make(chan error, 1) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.mod b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.mod index 906c0999..011b079b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.mod +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.mod @@ -3,38 +3,46 @@ module github.com/carterperez-dev/monitor-the-situation/backend go 1.25.0 require ( + github.com/PuerkitoBio/goquery v1.12.0 + github.com/cenkalti/backoff/v4 v4.3.0 github.com/coder/websocket v1.8.14 github.com/go-chi/chi/v5 v5.2.3 github.com/go-playground/validator/v10 v10.23.0 github.com/go-redis/redis_rate/v10 v10.0.1 + github.com/google/cel-go v0.28.0 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.7.2 github.com/jmoiron/sqlx v1.4.0 + github.com/joshuaferrara/go-satellite v0.0.0-20220611180459-512638c64e5b github.com/knadh/koanf/parsers/yaml v1.1.0 github.com/knadh/koanf/providers/env v1.1.0 github.com/knadh/koanf/providers/file v1.2.1 github.com/knadh/koanf/v2 v2.1.2 github.com/lestrrat-go/jwx/v3 v3.0.12 + github.com/lib/pq v1.12.3 github.com/redis/go-redis/v9 v9.7.3 + github.com/shopspring/decimal v1.4.0 github.com/sony/gobreaker/v2 v2.4.0 github.com/stretchr/testify v1.11.1 + github.com/testcontainers/testcontainers-go/modules/postgres v0.42.0 github.com/testcontainers/testcontainers-go/modules/redis v0.42.0 go.opentelemetry.io/otel v1.41.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 go.opentelemetry.io/otel/sdk v1.35.0 go.opentelemetry.io/otel/trace v1.41.0 golang.org/x/crypto v0.49.0 + golang.org/x/sync v0.20.0 golang.org/x/time v0.14.0 google.golang.org/grpc v1.68.1 ) require ( + cel.dev/expr v0.25.1 // indirect dario.cat/mergo v1.0.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/PuerkitoBio/goquery v1.12.0 // indirect github.com/andybalholm/cascadia v1.3.3 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect @@ -62,7 +70,6 @@ require ( github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect - github.com/joshuaferrara/go-satellite v0.0.0-20220611180459-512638c64e5b // indirect github.com/klauspost/compress v1.18.5 // indirect github.com/knadh/koanf/maps v0.1.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect @@ -73,7 +80,6 @@ require ( github.com/lestrrat-go/httprc/v3 v3.0.1 // indirect github.com/lestrrat-go/option v1.0.1 // indirect github.com/lestrrat-go/option/v2 v2.0.0 // indirect - github.com/lib/pq v1.12.3 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/mdelapenya/tlscert v0.2.0 // indirect @@ -95,10 +101,8 @@ require ( github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/segmentio/asm v1.2.1 // indirect github.com/shirou/gopsutil/v4 v4.26.3 // indirect - github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.4 // indirect github.com/testcontainers/testcontainers-go v0.42.0 // indirect - github.com/testcontainers/testcontainers-go/modules/postgres v0.42.0 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect github.com/valyala/fastjson v1.6.4 // indirect @@ -108,13 +112,13 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect go.opentelemetry.io/otel/metric v1.41.0 // indirect go.opentelemetry.io/proto/otlp v1.4.0 // indirect - go.yaml.in/yaml/v3 v3.0.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect golang.org/x/net v0.52.0 // indirect - golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.42.0 // indirect golang.org/x/text v0.35.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/protobuf v1.36.8 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.sum b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.sum index 376d0ed0..a9850706 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.sum +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/go.sum @@ -1,3 +1,5 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= @@ -12,6 +14,8 @@ github.com/PuerkitoBio/goquery v1.12.0 h1:pAcL4g3WRXekcB9AU/y1mbKez2dbY2AajVhtkO github.com/PuerkitoBio/goquery v1.12.0/go.mod h1:802ej+gV2y7bbIhOIoPY5sT183ZW0YFofScC4q/hIpQ= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= @@ -82,6 +86,8 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/cel-go v0.28.0 h1:KjSWstCpz/MN5t4a8gnGJNIYUsJRpdi/r97xWDphIQc= +github.com/google/cel-go v0.28.0/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -136,7 +142,6 @@ github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNB github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss= github.com/lestrrat-go/option/v2 v2.0.0/go.mod h1:oSySsmzMoR0iRzCDCaUfsCzxQHUEuhOViQObyy7S6Vg= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= @@ -170,7 +175,9 @@ github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= +github.com/onsi/ginkgo v1.2.1-0.20160509182050-5437a97bf824 h1:MbMqwlWoESqhGm4Sslfdyeq7Ww8R9ppeKS5DcO3xDI0= github.com/onsi/ginkgo v1.2.1-0.20160509182050-5437a97bf824/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20160516222431-c73e51675ad2 h1:38zSYUaJJkzreBjLz7tx4AUTVjnFI7EQBnlRoWt4QFA= github.com/onsi/gomega v0.0.0-20160516222431-c73e51675ad2/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -242,18 +249,18 @@ go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1 go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= -go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -268,8 +275,6 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= -golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -306,9 +311,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -318,8 +322,6 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= @@ -338,11 +340,12 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.0.0-20160301204022-a83829b6f129 h1:RBgb9aPUbZ9nu66ecQNIBNsA7j3mB5h8PNDIfhPjaJg= gopkg.in/yaml.v2 v2.0.0-20160301204022-a83829b6f129/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/dispatcher.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/dispatcher.go new file mode 100644 index 00000000..8903bcb5 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/dispatcher.go @@ -0,0 +1,45 @@ +// ©AngelaMos | 2026 +// dispatcher.go + +package alerts + +import ( + "context" + "log/slog" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/events" +) + +// Dispatcher reads from a bus subscriber channel and pushes each event +// into the engine. Separate from the engine itself so the bus->engine +// wiring is testable in isolation. +type Dispatcher struct { + in <-chan events.Event + engine *Engine + logger *slog.Logger +} + +func NewDispatcher( + in <-chan events.Event, + engine *Engine, + logger *slog.Logger, +) *Dispatcher { + if logger == nil { + logger = slog.Default() + } + return &Dispatcher{in: in, engine: engine, logger: logger} +} + +func (d *Dispatcher) Run(ctx context.Context) error { + for { + select { + case <-ctx.Done(): + return ctx.Err() + case ev, ok := <-d.in: + if !ok { + return nil + } + d.engine.Evaluate(ctx, ev) + } + } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/engine.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/engine.go new file mode 100644 index 00000000..3b0c84bb --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/engine.go @@ -0,0 +1,377 @@ +// ©AngelaMos | 2026 +// engine.go + +package alerts + +import ( + "context" + "encoding/json" + "fmt" + "log/slog" + "sync" + "sync/atomic" + "time" + + "github.com/google/cel-go/cel" + "github.com/google/cel-go/common/types" + "github.com/google/cel-go/common/types/ref" + "github.com/redis/go-redis/v9" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/events" +) + +// Channel is the abstract destination an alert is sent to. Slack/Discord +// webhooks and Telegram bots all reduce to "send this text via this +// transport". The engine doesn't care about the specific kind — that's +// the Notifier's job. +type Channel struct { + ID string + Type string + Label string + // Decoded config — for slack/discord this is the webhook URL, + // for telegram it's a (bot_token, chat_id) pair. The Notifier + // implementation handles the type-specific details. + WebhookURL string + BotToken string + ChatID int64 +} + +// Notifier is the transport for sending an alert. The notifications +// package implements one — this seam is here so tests can mock it. +type Notifier interface { + SendAlert(ctx context.Context, ch Channel, message string) error +} + +// ChannelLoader returns the configured destinations for a user. The +// notifications package decrypts channel configs on demand and produces +// these. Engine invokes it once per matching rule. +type ChannelLoader interface { + LoadChannels(ctx context.Context, userID string) ([]Channel, error) +} + +type CooldownStore interface { + TryAcquire(ctx context.Context, key string, ttl time.Duration) (bool, error) +} + +type EngineConfig struct { + Repo Repository + Notifier Notifier + Loader ChannelLoader + Cooldowns CooldownStore + Logger *slog.Logger + ReloadTick time.Duration +} + +type Engine struct { + repo Repository + notifier Notifier + loader ChannelLoader + cooldowns CooldownStore + logger *slog.Logger + reloadTick time.Duration + celEnv *cel.Env + rulesByTopic atomic.Pointer[map[string][]compiledRule] +} + +type compiledRule struct { + rule Rule + program cel.Program +} + +func NewEngine(cfg EngineConfig) (*Engine, error) { + logger := cfg.Logger + if logger == nil { + logger = slog.Default() + } + if cfg.ReloadTick <= 0 { + cfg.ReloadTick = 30 * time.Second + } + env, err := cel.NewEnv( + cel.Variable("event", cel.DynType), + ) + if err != nil { + return nil, fmt.Errorf("cel env: %w", err) + } + e := &Engine{ + repo: cfg.Repo, + notifier: cfg.Notifier, + loader: cfg.Loader, + cooldowns: cfg.Cooldowns, + logger: logger, + reloadTick: cfg.ReloadTick, + celEnv: env, + } + empty := map[string][]compiledRule{} + e.rulesByTopic.Store(&empty) + return e, nil +} + +// RefreshLoop reloads rules from the database periodically. Cheap — the +// table is small (one user × ~6 default rules). Hot path stays in-memory. +func (e *Engine) RefreshLoop(ctx context.Context) error { + if err := e.reload(ctx); err != nil { + e.logger.Warn("alerts: initial reload failed", "err", err) + } + t := time.NewTicker(e.reloadTick) + defer t.Stop() + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-t.C: + if err := e.reload(ctx); err != nil { + e.logger.Warn("alerts: reload failed", "err", err) + } + } + } +} + +func (e *Engine) reload(ctx context.Context) error { + all, err := e.repo.ListAll(ctx) + if err != nil { + return err + } + indexed := make(map[string][]compiledRule, len(all)) + for _, r := range all { + prog, err := e.compile(r.Predicate) + if err != nil { + e.logger.Warn("alerts: skipping rule with bad predicate", + "rule_id", r.ID, "topic", r.Topic, "err", err) + continue + } + indexed[r.Topic] = append( + indexed[r.Topic], + compiledRule{rule: r, program: prog}, + ) + } + e.rulesByTopic.Store(&indexed) + return nil +} + +func (e *Engine) compile(predicate string) (cel.Program, error) { + if predicate == "" { + // Empty predicate = always fire. Use a constant-true program so + // the eval path is uniform. + ast, iss := e.celEnv.Compile("true") + if iss != nil && iss.Err() != nil { + return nil, iss.Err() + } + return e.celEnv.Program(ast) + } + ast, iss := e.celEnv.Compile(predicate) + if iss != nil && iss.Err() != nil { + return nil, iss.Err() + } + return e.celEnv.Program(ast) +} + +// Evaluate is the per-event hot path. Looks up rules indexed by topic, +// evaluates each predicate against the event payload, then for matches +// loads the user's channels and dispatches via the notifier. Cooldowns +// are per (rule, channel) so a critical Telegram alert and a less- +// critical Discord alert for the same rule have independent windows. +func (e *Engine) Evaluate(ctx context.Context, ev events.Event) { + idx := e.rulesByTopic.Load() + if idx == nil { + return + } + rules, ok := (*idx)[string(ev.Topic)] + if !ok || len(rules) == 0 { + return + } + + payload, err := normalizePayload(ev.Payload) + if err != nil { + e.logger.Warn( + "alerts: payload normalize failed", + "topic", + ev.Topic, + "err", + err, + ) + return + } + + for _, cr := range rules { + if !cr.rule.Enabled { + continue + } + match, err := evalPredicate(cr.program, payload) + if err != nil { + e.logger.Warn("alerts: predicate eval failed", + "rule_id", cr.rule.ID, "topic", ev.Topic, "err", err) + continue + } + if !match { + continue + } + e.fire(ctx, cr.rule, ev, payload) + } +} + +func (e *Engine) fire( + ctx context.Context, + rule Rule, + ev events.Event, + payload map[string]any, +) { + channels, err := e.loader.LoadChannels(ctx, rule.UserID) + if err != nil { + e.logger.Warn("alerts: load channels failed", + "rule_id", rule.ID, "user_id", rule.UserID, "err", err) + return + } + if len(channels) == 0 { + return + } + cooldown := time.Duration(rule.CooldownSec) * time.Second + message := formatMessage(rule, ev, payload) + + delivered := []string{} + deliveryErrs := map[string]string{} + + var wg sync.WaitGroup + var mu sync.Mutex + + for _, ch := range channels { + ch := ch + key := fmt.Sprintf("alert_cooldown:%s:%s:%s", rule.ID, ch.Type, ch.ID) + ok, err := e.cooldowns.TryAcquire(ctx, key, cooldown) + if err != nil { + e.logger.Warn("alerts: cooldown lookup failed", + "rule_id", rule.ID, "channel", ch.ID, "err", err) + continue + } + if !ok { + continue + } + wg.Add(1) + go func() { + defer wg.Done() + err := e.notifier.SendAlert(ctx, ch, message) + mu.Lock() + defer mu.Unlock() + if err != nil { + deliveryErrs[ch.ID] = err.Error() + e.logger.Warn("alerts: deliver failed", + "rule_id", rule.ID, "channel_type", ch.Type, "err", err) + return + } + delivered = append(delivered, ch.ID) + }() + } + wg.Wait() + + body, _ := json.Marshal(payload) + errBody, _ := json.Marshal(deliveryErrs) + if err := e.repo.RecordFire(ctx, HistoryRow{ + RuleID: rule.ID, + UserID: rule.UserID, + FiredAt: time.Now().UTC(), + Payload: body, + DeliveredTo: delivered, + DeliveryErrors: errBody, + }); err != nil { + e.logger.Warn( + "alerts: record fire failed", + "rule_id", + rule.ID, + "err", + err, + ) + } +} + +func evalPredicate(program cel.Program, payload map[string]any) (bool, error) { + out, _, err := program.Eval(map[string]any{"event": payload}) + if err != nil { + return false, err + } + v, err := celBool(out) + if err != nil { + return false, err + } + return v, nil +} + +func celBool(v ref.Val) (bool, error) { + if v == nil { + return false, nil + } + switch v.Type() { + case types.BoolType: + b, ok := v.Value().(bool) + if !ok { + return false, fmt.Errorf( + "cel bool: unexpected concrete type %T", + v.Value(), + ) + } + return b, nil + default: + return false, fmt.Errorf("cel result is not bool: %v", v.Type()) + } +} + +// normalizePayload turns whatever the bus carries (map[string]any, +// json.RawMessage, struct, ...) into a map suitable for CEL. CEL needs +// a map for field access syntax like `event.kp` to work. +func normalizePayload(p any) (map[string]any, error) { + if p == nil { + return map[string]any{}, nil + } + if m, ok := p.(map[string]any); ok { + return m, nil + } + if raw, ok := p.(json.RawMessage); ok { + var out map[string]any + if err := json.Unmarshal(raw, &out); err != nil { + return nil, err + } + return out, nil + } + body, err := json.Marshal(p) + if err != nil { + return nil, err + } + var out map[string]any + if err := json.Unmarshal(body, &out); err != nil { + return nil, err + } + return out, nil +} + +func formatMessage(rule Rule, ev events.Event, payload map[string]any) string { + body, err := json.MarshalIndent(payload, "", " ") + if err != nil { + body = []byte(fmt.Sprintf("%v", payload)) + } + return fmt.Sprintf("[%s] %s\n\nTopic: %s\nFired: %s\n\n%s", + rule.Name, ev.Source, ev.Topic, ev.Timestamp.UTC().Format(time.RFC3339), + body, + ) +} + +// RedisCooldown is a default CooldownStore using SET NX EX. +type RedisCooldown struct { + rdb *redis.Client +} + +func NewRedisCooldown(rdb *redis.Client) *RedisCooldown { + return &RedisCooldown{rdb: rdb} +} + +func (c *RedisCooldown) TryAcquire( + ctx context.Context, + key string, + ttl time.Duration, +) (bool, error) { + if ttl <= 0 { + return true, nil + } + ok, err := c.rdb.SetNX(ctx, key, "1", ttl).Result() + if err != nil { + return false, err + } + return ok, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/entity.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/entity.go new file mode 100644 index 00000000..bcf0aa71 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/entity.go @@ -0,0 +1,107 @@ +// ©AngelaMos | 2026 +// entity.go + +package alerts + +import ( + "encoding/json" + "time" +) + +// Rule mirrors the alert_rules table. Predicate is a CEL expression +// evaluated against {event: }. Empty predicate means +// "always fire" — used for default rules like "every KEV add". +type Rule struct { + ID string `db:"id"` + UserID string `db:"user_id"` + Name string `db:"name"` + Topic string `db:"topic"` + Predicate string `db:"predicate"` + CooldownSec int `db:"cooldown_sec"` + Enabled bool `db:"enabled"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` +} + +// HistoryRow mirrors alert_history. Used both for delivery audit and so +// the UI can show "last fired". +type HistoryRow struct { + ID int64 `db:"id"` + RuleID string `db:"rule_id"` + UserID string `db:"user_id"` + FiredAt time.Time `db:"fired_at"` + Payload json.RawMessage `db:"payload"` + DeliveredTo []string `db:"delivered_to"` + DeliveryErrors json.RawMessage `db:"delivery_errors"` +} + +// DefaultRuleSeed is what registers as the bootstrap rule set for a new +// user. The predicates come straight from +// docs/specs/2026-05-01-monitor-the-situation-design.md. +type DefaultRuleSeed struct { + Name string + Topic string + Predicate string + CooldownSec int +} + +// Defaults returns the seed rules. KEV is the highest-priority alarm +// (per spec); CVE filters to severe items only; earthquake / space +// weather use the spec thresholds; ransomware fires on every entry. +// BTC / ETH ride on the `change_pct_1h` field the coinbase collector +// computes from a 1-hour sliding window — `has(...)` guards against +// firing during the warmup period when the window isn't full yet. +// Cooldowns are sized so a sustained crash doesn't spam — 30 min for +// the price drops; you can shorten in the settings UI per-rule. +func Defaults() []DefaultRuleSeed { + return []DefaultRuleSeed{ + { + Name: "KEV: every newly-added entry", + Topic: "kev_added", + Predicate: "", + CooldownSec: 0, + }, + { + Name: "CVE: critical (CVSS≥9 or EPSS≥0.95)", + Topic: "cve_new", + Predicate: "event.CVSS >= 9.0 || (has(event.EPSSPercentile) && event.EPSSPercentile != null && event.EPSSPercentile >= 0.95)", + CooldownSec: 300, + }, + { + Name: "Earthquake: M6.5+", + Topic: "earthquake", + Predicate: "event.properties.mag >= 6.5", + CooldownSec: 60, + }, + { + Name: "Space weather: Kp≥7 or X-class flare", + Topic: "space_weather", + Predicate: "(has(event.kp) && event.kp >= 7.0) || (has(event.xray_class) && event.xray_class.startsWith('X'))", + CooldownSec: 3600, + }, + { + Name: "Ransomware: every new victim", + Topic: "ransomware_victim", + Predicate: "", + CooldownSec: 60, + }, + { + Name: "BGP hijack: confidence≥9", + Topic: "bgp_hijack", + Predicate: "event.confidenceScore >= 9", + CooldownSec: 300, + }, + { + Name: "BTC: 1h drop ≥5%", + Topic: "coinbase_price", + Predicate: "event.symbol == 'BTC-USD' && has(event.change_pct_1h) && event.change_pct_1h <= -5.0", + CooldownSec: 1800, + }, + { + Name: "ETH: 1h drop ≥5%", + Topic: "coinbase_price", + Predicate: "event.symbol == 'ETH-USD' && has(event.change_pct_1h) && event.change_pct_1h <= -5.0", + CooldownSec: 1800, + }, + } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/handler.go new file mode 100644 index 00000000..325f0c9a --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/handler.go @@ -0,0 +1,196 @@ +// ©AngelaMos | 2026 +// handler.go + +package alerts + +import ( + "encoding/json" + "errors" + "net/http" + "strconv" + + "github.com/go-chi/chi/v5" + "github.com/go-playground/validator/v10" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" +) + +type Handler struct { + repo Repository + validator *validator.Validate +} + +func NewHandler(repo Repository) *Handler { + return &Handler{ + repo: repo, + validator: validator.New(validator.WithRequiredStructEnabled()), + } +} + +func (h *Handler) RegisterRoutes( + r chi.Router, + authenticator func(http.Handler) http.Handler, +) { + r.Route("/me/alerts", func(r chi.Router) { + r.Use(authenticator) + + r.Get("/", h.list) + r.Post("/", h.create) + r.Patch("/{id}", h.update) + r.Delete("/{id}", h.delete) + + r.Get("/history", h.history) + }) +} + +type ruleDTO struct { + ID string `json:"id"` + Name string `json:"name"` + Topic string `json:"topic"` + Predicate string `json:"predicate"` + CooldownSec int `json:"cooldown_sec"` + Enabled bool `json:"enabled"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` +} + +func toRuleDTO(r Rule) ruleDTO { + return ruleDTO{ + ID: r.ID, + Name: r.Name, + Topic: r.Topic, + Predicate: r.Predicate, + CooldownSec: r.CooldownSec, + Enabled: r.Enabled, + CreatedAt: r.CreatedAt.UTC().Format("2006-01-02T15:04:05Z"), + UpdatedAt: r.UpdatedAt.UTC().Format("2006-01-02T15:04:05Z"), + } +} + +func (h *Handler) list(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + rules, err := h.repo.ListByUser(r.Context(), userID) + if err != nil { + core.InternalServerError(w, err) + return + } + out := make([]ruleDTO, 0, len(rules)) + for _, ru := range rules { + out = append(out, toRuleDTO(ru)) + } + core.OK(w, out) +} + +type createRuleRequest struct { + Name string `json:"name" validate:"required,min=1,max=200"` + Topic string `json:"topic" validate:"required,min=1,max=64"` + Predicate string `json:"predicate" validate:"omitempty,max=2048"` + CooldownSec int `json:"cooldown_sec" validate:"gte=0,lte=86400"` + Enabled bool `json:"enabled"` +} + +func (h *Handler) create(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + var req createRuleRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + core.BadRequest(w, "invalid request body") + return + } + if err := h.validator.Struct(req); err != nil { + core.BadRequest(w, core.FormatValidationError(err)) + return + } + rule := &Rule{ + UserID: userID, + Name: req.Name, + Topic: req.Topic, + Predicate: req.Predicate, + CooldownSec: req.CooldownSec, + Enabled: req.Enabled, + } + if err := h.repo.Create(r.Context(), rule); err != nil { + core.InternalServerError(w, err) + return + } + core.Created(w, toRuleDTO(*rule)) +} + +type updateRuleRequest struct { + Name *string `json:"name,omitempty" validate:"omitempty,min=1,max=200"` + Predicate *string `json:"predicate,omitempty" validate:"omitempty,max=2048"` + CooldownSec *int `json:"cooldown_sec,omitempty" validate:"omitempty,gte=0,lte=86400"` + Enabled *bool `json:"enabled,omitempty"` +} + +func (h *Handler) update(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + id := chi.URLParam(r, "id") + + var req updateRuleRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + core.BadRequest(w, "invalid request body") + return + } + if err := h.validator.Struct(req); err != nil { + core.BadRequest(w, core.FormatValidationError(err)) + return + } + + rule, err := h.repo.Get(r.Context(), id, userID) + if err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "rule") + return + } + core.InternalServerError(w, err) + return + } + if req.Name != nil { + rule.Name = *req.Name + } + if req.Predicate != nil { + rule.Predicate = *req.Predicate + } + if req.CooldownSec != nil { + rule.CooldownSec = *req.CooldownSec + } + if req.Enabled != nil { + rule.Enabled = *req.Enabled + } + if err := h.repo.Update(r.Context(), rule); err != nil { + core.InternalServerError(w, err) + return + } + core.OK(w, toRuleDTO(*rule)) +} + +func (h *Handler) delete(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + id := chi.URLParam(r, "id") + if err := h.repo.Delete(r.Context(), id, userID); err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "rule") + return + } + core.InternalServerError(w, err) + return + } + core.NoContent(w) +} + +func (h *Handler) history(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + limit := 50 + if v := r.URL.Query().Get("limit"); v != "" { + if n, err := strconv.Atoi(v); err == nil && n > 0 && n <= 500 { + limit = n + } + } + rows, err := h.repo.RecentHistory(r.Context(), userID, limit) + if err != nil { + core.InternalServerError(w, err) + return + } + core.OK(w, rows) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/repository.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/repository.go new file mode 100644 index 00000000..9c54569a --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/alerts/repository.go @@ -0,0 +1,239 @@ +// ©AngelaMos | 2026 +// repository.go + +package alerts + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/google/uuid" + "github.com/lib/pq" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" +) + +type Repository interface { + ListAll(ctx context.Context) ([]Rule, error) + ListByUser(ctx context.Context, userID string) ([]Rule, error) + Get(ctx context.Context, id, userID string) (*Rule, error) + Create(ctx context.Context, r *Rule) error + Update(ctx context.Context, r *Rule) error + Delete(ctx context.Context, id, userID string) error + SeedDefaults(ctx context.Context, userID string) error + RecordFire(ctx context.Context, h HistoryRow) error + RecentHistory( + ctx context.Context, + userID string, + limit int, + ) ([]HistoryRow, error) +} + +type repository struct { + db core.DBTX +} + +func NewRepository(db core.DBTX) Repository { + return &repository{db: db} +} + +func (r *repository) ListAll(ctx context.Context) ([]Rule, error) { + var rules []Rule + err := r.db.SelectContext(ctx, &rules, ` + SELECT id, user_id, name, topic, predicate, cooldown_sec, enabled, created_at, updated_at + FROM alert_rules + WHERE enabled = true`) + if err != nil { + return nil, fmt.Errorf("alerts list all: %w", err) + } + return rules, nil +} + +func (r *repository) ListByUser( + ctx context.Context, + userID string, +) ([]Rule, error) { + var rules []Rule + err := r.db.SelectContext(ctx, &rules, ` + SELECT id, user_id, name, topic, predicate, cooldown_sec, enabled, created_at, updated_at + FROM alert_rules + WHERE user_id = $1 + ORDER BY topic, name`, userID) + if err != nil { + return nil, fmt.Errorf("alerts list user: %w", err) + } + return rules, nil +} + +func (r *repository) Get( + ctx context.Context, + id, userID string, +) (*Rule, error) { + var rule Rule + err := r.db.GetContext(ctx, &rule, ` + SELECT id, user_id, name, topic, predicate, cooldown_sec, enabled, created_at, updated_at + FROM alert_rules + WHERE id = $1 AND user_id = $2`, id, userID) + if errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf("alerts get: %w", core.ErrNotFound) + } + if err != nil { + return nil, fmt.Errorf("alerts get: %w", err) + } + return &rule, nil +} + +func (r *repository) Create(ctx context.Context, rule *Rule) error { + if rule.ID == "" { + rule.ID = uuid.New().String() + } + err := r.db.GetContext( + ctx, + &rule.CreatedAt, + ` + INSERT INTO alert_rules (id, user_id, name, topic, predicate, cooldown_sec, enabled) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING created_at`, + rule.ID, + rule.UserID, + rule.Name, + rule.Topic, + rule.Predicate, + rule.CooldownSec, + rule.Enabled, + ) + if err != nil { + return fmt.Errorf("alerts create: %w", err) + } + rule.UpdatedAt = rule.CreatedAt + return nil +} + +func (r *repository) Update(ctx context.Context, rule *Rule) error { + res, err := r.db.ExecContext( + ctx, + ` + UPDATE alert_rules + SET name = $3, + predicate = $4, + cooldown_sec = $5, + enabled = $6, + updated_at = NOW() + WHERE id = $1 AND user_id = $2`, + rule.ID, + rule.UserID, + rule.Name, + rule.Predicate, + rule.CooldownSec, + rule.Enabled, + ) + if err != nil { + return fmt.Errorf("alerts update: %w", err) + } + rows, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("alerts update: %w", err) + } + if rows == 0 { + return fmt.Errorf("alerts update: %w", core.ErrNotFound) + } + return nil +} + +func (r *repository) Delete(ctx context.Context, id, userID string) error { + res, err := r.db.ExecContext(ctx, + `DELETE FROM alert_rules WHERE id = $1 AND user_id = $2`, id, userID) + if err != nil { + return fmt.Errorf("alerts delete: %w", err) + } + rows, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("alerts delete: %w", err) + } + if rows == 0 { + return fmt.Errorf("alerts delete: %w", core.ErrNotFound) + } + return nil +} + +// SeedDefaults inserts the default rule set for a user, skipping rules +// they already have. Dedup is by (user_id, name) — not (user_id, topic) — +// so multiple defaults can target the same topic. BTC and ETH both fire +// on `coinbase_price`, and the original (user_id, topic) check would +// have inserted only the first one. Idempotent: safe to call on every +// login, which is how existing accounts pick up newly-added defaults. +func (r *repository) SeedDefaults(ctx context.Context, userID string) error { + for _, def := range Defaults() { + _, err := r.db.ExecContext( + ctx, + ` + INSERT INTO alert_rules (id, user_id, name, topic, predicate, cooldown_sec, enabled) + SELECT $1, $2, $3, $4, $5, $6, true + WHERE NOT EXISTS ( + SELECT 1 FROM alert_rules WHERE user_id = $2 AND name = $3 + )`, + uuid.New(). + String(), + userID, + def.Name, + def.Topic, + def.Predicate, + def.CooldownSec, + ) + if err != nil { + return fmt.Errorf("seed default %s: %w", def.Name, err) + } + } + return nil +} + +func (r *repository) RecordFire(ctx context.Context, h HistoryRow) error { + if h.FiredAt.IsZero() { + h.FiredAt = time.Now().UTC() + } + if len(h.Payload) == 0 { + h.Payload = json.RawMessage("{}") + } + delivered := pq.StringArray(h.DeliveredTo) + _, err := r.db.ExecContext( + ctx, + ` + INSERT INTO alert_history (rule_id, user_id, fired_at, payload, delivered_to, delivery_errors) + VALUES ($1, $2, $3, $4, $5, $6)`, + h.RuleID, + h.UserID, + h.FiredAt, + []byte(h.Payload), + delivered, + []byte(h.DeliveryErrors), + ) + if err != nil { + return fmt.Errorf("alerts record fire: %w", err) + } + return nil +} + +func (r *repository) RecentHistory( + ctx context.Context, + userID string, + limit int, +) ([]HistoryRow, error) { + if limit <= 0 { + limit = 50 + } + var rows []HistoryRow + err := r.db.SelectContext(ctx, &rows, ` + SELECT id, rule_id, user_id, fired_at, payload, delivered_to, delivery_errors + FROM alert_history + WHERE user_id = $1 + ORDER BY fired_at DESC + LIMIT $2`, userID, limit) + if err != nil { + return nil, fmt.Errorf("alerts recent history: %w", err) + } + return rows, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/dto.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/dto.go index 9fc1cfa1..4d3c36b2 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/dto.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/dto.go @@ -19,7 +19,7 @@ type RegisterRequest struct { } type RefreshRequest struct { - RefreshToken string `json:"refresh_token" validate:"required"` + RefreshToken string `json:"refresh_token,omitempty"` } type TokenResponse struct { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/handler.go index c8e5e46c..e5c39bec 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/handler.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/handler.go @@ -6,9 +6,8 @@ package auth import ( "encoding/json" "errors" - "net" "net/http" - "strings" + "time" "github.com/go-chi/chi/v5" "github.com/go-playground/validator/v10" @@ -17,18 +16,79 @@ import ( "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" ) +const ( + refreshCookieName = "mts_rt" + refreshCookiePath = "/api/v1/auth" + refreshCookieMaxAge = 7 * 24 * time.Hour +) + type Handler struct { - service *Service - validator *validator.Validate + service *Service + validator *validator.Validate + trustedProxyHops int + secureCookies bool } -func NewHandler(service *Service) *Handler { +type HandlerConfig struct { + Service *Service + TrustedProxyHops int + SecureCookies bool +} + +func NewHandler(service *Service, trustedProxyHops int) *Handler { + return NewHandlerWithConfig(HandlerConfig{ + Service: service, + TrustedProxyHops: trustedProxyHops, + }) +} + +func NewHandlerWithConfig(cfg HandlerConfig) *Handler { return &Handler{ - service: service, - validator: validator.New(validator.WithRequiredStructEnabled()), + service: cfg.Service, + validator: validator.New(validator.WithRequiredStructEnabled()), + trustedProxyHops: cfg.TrustedProxyHops, + secureCookies: cfg.SecureCookies, } } +func (h *Handler) setRefreshCookie( + w http.ResponseWriter, + token string, + expiresAt time.Time, +) { + http.SetCookie(w, &http.Cookie{ + Name: refreshCookieName, + Value: token, + Path: refreshCookiePath, + HttpOnly: true, + Secure: h.secureCookies, + SameSite: http.SameSiteStrictMode, + Expires: expiresAt, + }) +} + +func (h *Handler) clearRefreshCookie(w http.ResponseWriter) { + http.SetCookie(w, &http.Cookie{ + Name: refreshCookieName, + Value: "", + Path: refreshCookiePath, + HttpOnly: true, + Secure: h.secureCookies, + SameSite: http.SameSiteStrictMode, + MaxAge: -1, + }) +} + +func (h *Handler) refreshTokenFromRequest(r *http.Request, body string) string { + if body != "" { + return body + } + if c, err := r.Cookie(refreshCookieName); err == nil { + return c.Value + } + return "" +} + func (h *Handler) RegisterRoutes( r chi.Router, authenticator func(http.Handler) http.Handler, @@ -63,7 +123,7 @@ func (h *Handler) Login(w http.ResponseWriter, r *http.Request) { } userAgent := r.UserAgent() - ipAddress := extractIPAddress(r) + ipAddress := h.extractIPAddress(r) resp, err := h.service.Login(r.Context(), req, userAgent, ipAddress) if err != nil { @@ -78,6 +138,11 @@ func (h *Handler) Login(w http.ResponseWriter, r *http.Request) { return } + h.setRefreshCookie( + w, + resp.Tokens.RefreshToken, + time.Now().Add(refreshCookieMaxAge), + ) core.OK(w, resp) } @@ -94,7 +159,7 @@ func (h *Handler) Register(w http.ResponseWriter, r *http.Request) { } userAgent := r.UserAgent() - ipAddress := extractIPAddress(r) + ipAddress := h.extractIPAddress(r) resp, err := h.service.Register(r.Context(), req, userAgent, ipAddress) if err != nil { @@ -106,27 +171,33 @@ func (h *Handler) Register(w http.ResponseWriter, r *http.Request) { return } + h.setRefreshCookie( + w, + resp.Tokens.RefreshToken, + time.Now().Add(refreshCookieMaxAge), + ) core.Created(w, resp) } func (h *Handler) Refresh(w http.ResponseWriter, r *http.Request) { var req RefreshRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - core.BadRequest(w, "invalid request body") - return + // Body may be empty when frontend uses cookie-only flow. + req = RefreshRequest{} } - if err := h.validator.Struct(req); err != nil { - core.BadRequest(w, core.FormatValidationError(err)) + refreshToken := h.refreshTokenFromRequest(r, req.RefreshToken) + if refreshToken == "" { + core.BadRequest(w, "refresh_token required (cookie or body)") return } userAgent := r.UserAgent() - ipAddress := extractIPAddress(r) + ipAddress := h.extractIPAddress(r) resp, err := h.service.Refresh( r.Context(), - req.RefreshToken, + refreshToken, userAgent, ipAddress, ) @@ -156,6 +227,11 @@ func (h *Handler) Refresh(w http.ResponseWriter, r *http.Request) { return } + h.setRefreshCookie( + w, + resp.Tokens.RefreshToken, + time.Now().Add(refreshCookieMaxAge), + ) core.OK(w, resp) } @@ -168,11 +244,24 @@ func (h *Handler) Logout(w http.ResponseWriter, r *http.Request) { var req RefreshRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - core.BadRequest(w, "invalid request body") - return + req = RefreshRequest{} + } + refreshToken := h.refreshTokenFromRequest(r, req.RefreshToken) + + var jti string + var expiresAt time.Time + if claims := middleware.GetClaims(r.Context()); claims != nil { + jti = claims.JTI + expiresAt = claims.ExpiresAt } - if err := h.service.Logout(r.Context(), req.RefreshToken, userID); err != nil { + if err := h.service.Logout( + r.Context(), + refreshToken, + userID, + jti, + expiresAt, + ); err != nil { if errors.Is(err, core.ErrForbidden) { core.Forbidden(w, "cannot revoke another user's token") return @@ -181,6 +270,7 @@ func (h *Handler) Logout(w http.ResponseWriter, r *http.Request) { return } + h.clearRefreshCookie(w) core.NoContent(w) } @@ -228,7 +318,11 @@ func (h *Handler) RevokeSession(w http.ResponseWriter, r *http.Request) { return } - if err := h.service.RevokeSession(r.Context(), userID, sessionID); err != nil { + if err := h.service.RevokeSession( + r.Context(), + userID, + sessionID, + ); err != nil { if errors.Is(err, core.ErrNotFound) { core.NotFound(w, "session") return @@ -262,7 +356,12 @@ func (h *Handler) ChangePassword(w http.ResponseWriter, r *http.Request) { return } - if err := h.service.ChangePassword(r.Context(), userID, req.CurrentPassword, req.NewPassword); err != nil { + if err := h.service.ChangePassword( + r.Context(), + userID, + req.CurrentPassword, + req.NewPassword, + ); err != nil { if errors.Is(err, ErrInvalidCredentials) { core.JSONError( w, @@ -297,20 +396,6 @@ func (h *Handler) GetMe(w http.ResponseWriter, r *http.Request) { core.OK(w, user) } -func extractIPAddress(r *http.Request) string { - if xff := r.Header.Get("X-Forwarded-For"); xff != "" { - ips := strings.Split(xff, ",") - return strings.TrimSpace(ips[len(ips)-1]) - } - - if xri := r.Header.Get("X-Real-IP"); xri != "" { - return xri - } - - ip, _, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - return r.RemoteAddr - } - - return ip +func (h *Handler) extractIPAddress(r *http.Request) string { + return middleware.ClientIP(r, h.trustedProxyHops) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/jwt.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/jwt.go index d5774835..9ab73cc7 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/jwt.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/jwt.go @@ -5,10 +5,14 @@ package auth import ( "context" + "crypto" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" + _ "crypto/sha256" + "encoding/hex" "encoding/json" + "errors" "fmt" "net/http" "os" @@ -25,6 +29,8 @@ import ( "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" ) +const kidLength = 8 + type JWTManager struct { privateKey jwk.Key publicKey jwk.Key @@ -47,16 +53,22 @@ func NewJWTManager(cfg config.JWTConfig) (*JWTManager, error) { return nil, fmt.Errorf("set algorithm: %w", setErr) } - keyID := uuid.New().String()[:8] - if setErr := privateKey.Set(jwk.KeyIDKey, keyID); setErr != nil { - return nil, fmt.Errorf("set key id: %w", setErr) - } - publicKey, err := privateKey.PublicKey() if err != nil { return nil, fmt.Errorf("derive public key: %w", err) } + keyID, err := deriveKeyID(publicKey) + if err != nil { + return nil, fmt.Errorf("derive key id: %w", err) + } + if setErr := privateKey.Set(jwk.KeyIDKey, keyID); setErr != nil { + return nil, fmt.Errorf("set key id: %w", setErr) + } + if setErr := publicKey.Set(jwk.KeyIDKey, keyID); setErr != nil { + return nil, fmt.Errorf("set public key id: %w", setErr) + } + if setErr := publicKey.Set(jwk.KeyUsageKey, "sig"); setErr != nil { return nil, fmt.Errorf("set key usage: %w", setErr) } @@ -85,10 +97,6 @@ func GenerateKeyPair(privateKeyPath, publicKeyPath string) error { return fmt.Errorf("import private key: %w", err) } - keyID := uuid.New().String()[:8] - if setErr := jwkPrivate.Set(jwk.KeyIDKey, keyID); setErr != nil { - return fmt.Errorf("set key id: %w", setErr) - } if setErr := jwkPrivate.Set(jwk.AlgorithmKey, jwa.ES256()); setErr != nil { return fmt.Errorf("set algorithm: %w", setErr) } @@ -98,7 +106,11 @@ func GenerateKeyPair(privateKeyPath, publicKeyPath string) error { return fmt.Errorf("encode private key: %w", err) } - if writeErr := os.WriteFile(privateKeyPath, privatePEM, 0o600); writeErr != nil { + if writeErr := os.WriteFile( + privateKeyPath, + privatePEM, + 0o600, + ); writeErr != nil { return fmt.Errorf("write private key: %w", writeErr) } @@ -113,7 +125,11 @@ func GenerateKeyPair(privateKeyPath, publicKeyPath string) error { } //nolint:gosec // G306: public key is intentionally world-readable - if writeErr := os.WriteFile(publicKeyPath, publicPEM, 0o644); writeErr != nil { + if writeErr := os.WriteFile( + publicKeyPath, + publicPEM, + 0o644, + ); writeErr != nil { return fmt.Errorf("write public key: %w", writeErr) } @@ -216,11 +232,16 @@ func (m *JWTManager) VerifyAccessToken( ) } + jti, _ := token.JwtID() + expiresAt, _ := token.Expiration() + return &middleware.AccessTokenClaims{ UserID: subject, Role: roleStr, Tier: tierStr, TokenVersion: int(versionFloat), + JTI: jti, + ExpiresAt: expiresAt, }, nil } @@ -228,11 +249,22 @@ func isTokenExpiredError(err error) bool { if err == nil { return false } + if errors.Is(err, jwt.TokenExpiredError()) { + return true + } errStr := err.Error() return strings.Contains(errStr, "exp") && strings.Contains(errStr, "not satisfied") } +func deriveKeyID(publicKey jwk.Key) (string, error) { + thumb, err := publicKey.Thumbprint(crypto.SHA256) + if err != nil { + return "", fmt.Errorf("thumbprint: %w", err) + } + return hex.EncodeToString(thumb)[:kidLength], nil +} + func (m *JWTManager) GetJWKSHandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/service.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/service.go index 3762724e..c9a1418d 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/service.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/service.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "strings" "time" "github.com/google/uuid" @@ -40,14 +41,39 @@ type UserProvider interface { ) (*UserInfo, error) IncrementTokenVersion(ctx context.Context, userID string) error UpdatePassword(ctx context.Context, userID, passwordHash string) error + SetRole(ctx context.Context, userID, role string) error } +// RuleSeeder is called after a fresh user registers, to populate +// default alert rules. Wired by main.go using alerts.Repo.SeedDefaults. +// Optional — auth works without it; user just won't get alerts until +// they create rules manually. +type RuleSeeder func(ctx context.Context, userID string) error + type Service struct { repo Repository jwt *JWTManager userProvider UserProvider redis *redis.Client blacklistTTL time.Duration + adminEmail string + ruleSeeder RuleSeeder +} + +// SetRuleSeeder registers a callback fired after Register succeeds. +// Called from main.go after both auth.Service and alerts.Repo are +// constructed; resolves the cyclic dependency (auth doesn't import +// alerts, alerts doesn't import auth). +func (s *Service) SetRuleSeeder(fn RuleSeeder) { + s.ruleSeeder = fn +} + +type ServiceConfig struct { + Repo Repository + JWT *JWTManager + UserProvider UserProvider + Redis *redis.Client + AdminEmail string } func NewService( @@ -56,15 +82,46 @@ func NewService( userProvider UserProvider, redisClient *redis.Client, ) *Service { + return NewServiceWithConfig(ServiceConfig{ + Repo: repo, + JWT: jwt, + UserProvider: userProvider, + Redis: redisClient, + }) +} + +func NewServiceWithConfig(cfg ServiceConfig) *Service { return &Service{ - repo: repo, - jwt: jwt, - userProvider: userProvider, - redis: redisClient, + repo: cfg.Repo, + jwt: cfg.JWT, + userProvider: cfg.UserProvider, + redis: cfg.Redis, blacklistTTL: 15 * time.Minute, + adminEmail: strings.ToLower(strings.TrimSpace(cfg.AdminEmail)), } } +// promoteIfAdminEmail flips role to admin when the user's email matches +// the configured ADMIN_EMAIL. Idempotent — does nothing if already admin +// or if no admin email is configured. Mutates `user` in place so the +// returned auth response reflects the new role. +func (s *Service) promoteIfAdminEmail(ctx context.Context, user *UserInfo) { + if s.adminEmail == "" || user == nil { + return + } + if !strings.EqualFold(user.Email, s.adminEmail) { + return + } + if user.Role == "admin" { + return + } + if err := s.userProvider.SetRole(ctx, user.ID, "admin"); err != nil { + // Best-effort. Logging is the caller's job. + return + } + user.Role = "admin" +} + func (s *Service) Login( ctx context.Context, req LoginRequest, @@ -97,6 +154,15 @@ func (s *Service) Login( _ = s.userProvider.UpdatePassword(ctx, user.ID, newHash) } + s.promoteIfAdminEmail(ctx, user) + + if s.ruleSeeder != nil { + // Idempotent. Cheap (one INSERT-WHERE-NOT-EXISTS per default + // rule) and gives existing accounts new defaults the moment we + // ship them, without needing a one-off migration. + _ = s.ruleSeeder(ctx, user.ID) + } + return s.createAuthResponse(ctx, user, userAgent, ipAddress, "", nil) } @@ -118,6 +184,14 @@ func (s *Service) Register( return nil, fmt.Errorf("create user: %w", err) } + s.promoteIfAdminEmail(ctx, user) + + if s.ruleSeeder != nil { + // Best-effort. Don't block registration if seeding fails — the + // user can configure rules manually. + _ = s.ruleSeeder(ctx, user.ID) + } + return s.createAuthResponse(ctx, user, userAgent, ipAddress, "", nil) } @@ -165,13 +239,25 @@ func (s *Service) Refresh( func (s *Service) Logout( ctx context.Context, - refreshToken, userID string, + refreshToken, userID, accessJTI string, + accessExpiresAt time.Time, ) error { tokenHash := core.HashToken(refreshToken) storedToken, err := s.repo.FindByHash(ctx, tokenHash) if err != nil { if errors.Is(err, core.ErrNotFound) { + // Refresh token already gone — still blacklist the access JTI + // so the current session can't make authenticated calls. + if accessJTI != "" { + if revErr := s.RevokeAccessToken( + ctx, + accessJTI, + accessExpiresAt, + ); revErr != nil { + return fmt.Errorf("blacklist access token: %w", revErr) + } + } return nil } return fmt.Errorf("find token: %w", err) @@ -186,6 +272,16 @@ func (s *Service) Logout( return fmt.Errorf("revoke token: %w", err) } + if accessJTI != "" { + if err := s.RevokeAccessToken( + ctx, + accessJTI, + accessExpiresAt, + ); err != nil { + return fmt.Errorf("blacklist access token: %w", err) + } + } + return nil } @@ -372,6 +468,29 @@ func (s *Service) createAuthResponse( newTokenID := uuid.New().String() + // Claim the old token BEFORE inserting the new one. Two concurrent + // refresh attempts with the same token race on this UPDATE; only one + // flips is_used=false→true. The loser sees ErrNotFound and returns + // ErrTokenReuse without ever creating a new refresh row, which keeps + // the rotation chain single-use. + if oldTokenID != nil { + if err := s.repo.MarkAsUsed(ctx, *oldTokenID, newTokenID); err != nil { + if errors.Is(err, core.ErrNotFound) { + if revErr := s.repo.RevokeByFamilyID( + ctx, + familyID, + ); revErr != nil { + return nil, fmt.Errorf( + "rotate refresh token: revoke family on race-loss: %w", + revErr, + ) + } + return nil, ErrTokenReuse + } + return nil, fmt.Errorf("rotate refresh token: %w", err) + } + } + refreshTokenEntity := &RefreshToken{ ID: newTokenID, UserID: user.ID, @@ -386,11 +505,6 @@ func (s *Service) createAuthResponse( return nil, fmt.Errorf("store refresh token: %w", err) } - if oldTokenID != nil { - //nolint:errcheck // best-effort token chain tracking - _ = s.repo.MarkAsUsed(ctx, *oldTokenID, newTokenID) - } - return &AuthResponse{ User: UserResponse{ ID: user.ID, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/verifier.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/verifier.go new file mode 100644 index 00000000..8afffff0 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/auth/verifier.go @@ -0,0 +1,81 @@ +// ©AngelaMos | 2026 +// verifier.go + +package auth + +import ( + "context" + "errors" + "fmt" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" +) + +// Verifier composes JWT validation, token-version check, and JTI blacklist +// check into a single TokenVerifier the middleware can use. This is what +// wires the auth-service's revocation infrastructure (LogoutAll's +// IncrementTokenVersion, Logout's RevokeAccessToken) into the request +// path — without it, those calls were dead code. +type Verifier struct { + jwt *JWTManager + service *Service + userProvider UserProvider +} + +func NewVerifier( + jwt *JWTManager, + service *Service, + userProvider UserProvider, +) *Verifier { + return &Verifier{ + jwt: jwt, + service: service, + userProvider: userProvider, + } +} + +// VerifyAccessToken parses the JWT, then enforces: +// - The user's current token_version is <= the version embedded in this +// token. A LogoutAll bump invalidates every previously-issued access +// token by raising the floor. +// - The token's JTI is not in the Redis blacklist (Logout adds it there +// to revoke a single session immediately, not just the refresh token). +func (v *Verifier) VerifyAccessToken( + ctx context.Context, + tokenString string, +) (*middleware.AccessTokenClaims, error) { + claims, err := v.jwt.VerifyAccessToken(ctx, tokenString) + if err != nil { + return nil, err + } + + if claims.JTI != "" { + blacklisted, blErr := v.service.IsAccessTokenBlacklisted( + ctx, + claims.JTI, + ) + if blErr != nil { + return nil, fmt.Errorf("verify token: blacklist lookup: %w", blErr) + } + if blacklisted { + return nil, fmt.Errorf("verify token: %w", core.ErrTokenRevoked) + } + } + + user, err := v.userProvider.GetByID(ctx, claims.UserID) + if err != nil { + if errors.Is(err, core.ErrNotFound) { + return nil, fmt.Errorf("verify token: %w", core.ErrTokenInvalid) + } + return nil, fmt.Errorf("verify token: load user: %w", err) + } + if claims.TokenVersion < user.TokenVersion { + return nil, fmt.Errorf( + "verify token: version superseded: %w", + core.ErrTokenRevoked, + ) + } + + return claims, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus.go index 6ea8445c..e53733d4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus.go @@ -7,12 +7,16 @@ import ( "context" "encoding/json" "log/slog" + "sync" "sync/atomic" "github.com/carterperez-dev/monitor-the-situation/backend/internal/events" ) -const defaultBufferSize = 512 +const ( + defaultBufferSize = 512 + defaultSubscriberSize = 256 +) type Config struct { BufferSize int @@ -27,6 +31,10 @@ type Bus struct { broadcaster Broadcaster logger *slog.Logger dropped atomic.Uint64 + + subsMu sync.RWMutex + subscribers []chan events.Event + subDropped atomic.Uint64 } func New(cfg Config) *Bus { @@ -59,7 +67,26 @@ func (b *Bus) DroppedCount() uint64 { return b.dropped.Load() } +// SubscriberDroppedCount counts events dropped to channel subscribers +// (separate from the main bus drop counter). +func (b *Bus) SubscriberDroppedCount() uint64 { + return b.subDropped.Load() +} + +// Subscribe returns a buffered channel that receives every event the bus +// sees. Slow subscribers drop events rather than block the persist+ +// broadcast hot path; SubscriberDroppedCount reports total drops. Wire +// subscribers at startup before Run() begins. +func (b *Bus) Subscribe() <-chan events.Event { + b.subsMu.Lock() + defer b.subsMu.Unlock() + ch := make(chan events.Event, defaultSubscriberSize) + b.subscribers = append(b.subscribers, ch) + return ch +} + func (b *Bus) Run(ctx context.Context) error { + defer b.closeSubscribers() for { select { case <-ctx.Done(): @@ -80,6 +107,29 @@ func (b *Bus) Run(ctx context.Context) error { } b.broadcaster.Broadcast(string(ev.Topic), payload) } + b.fanout(ev) } } } + +func (b *Bus) fanout(ev events.Event) { + b.subsMu.RLock() + subs := b.subscribers + b.subsMu.RUnlock() + for _, ch := range subs { + select { + case ch <- ev: + default: + b.subDropped.Add(1) + } + } +} + +func (b *Bus) closeSubscribers() { + b.subsMu.Lock() + defer b.subsMu.Unlock() + for _, ch := range b.subscribers { + close(ch) + } + b.subscribers = nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus_test.go index f2115a06..3895255b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/bus/bus_test.go @@ -95,5 +95,5 @@ func TestBus_DropOnFullBuffer(t *testing.T) { for i := 0; i < 50; i++ { b.Emit(events.Event{Topic: events.TopicHeartbeat, Source: "stress"}) } - require.Greater(t, b.DroppedCount(), uint64(0)) + require.Positive(t, b.DroppedCount()) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client.go index 7a13e32f..f3ad491c 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client.go @@ -105,12 +105,18 @@ func (c *Client) FetchOutages(ctx context.Context) (OutageResultBody, error) { return OutageResultBody{}, fmt.Errorf("fetch outages: %w", err) } if !env.Success { - return OutageResultBody{}, fmt.Errorf("radar outages: success=false errors=%v", env.Errors) + return OutageResultBody{}, fmt.Errorf( + "radar outages: success=false errors=%v", + env.Errors, + ) } return env.Result, nil } -func (c *Client) FetchHijacks(ctx context.Context, minConfidence int) (HijackBody, error) { +func (c *Client) FetchHijacks( + ctx context.Context, + minConfidence int, +) (HijackBody, error) { q := url.Values{ "dateRange": []string{defaultDateRange}, "minConfidence": []string{strconv.Itoa(minConfidence)}, @@ -120,7 +126,10 @@ func (c *Client) FetchHijacks(ctx context.Context, minConfidence int) (HijackBod return HijackBody{}, fmt.Errorf("fetch hijacks: %w", err) } if !env.Success { - return HijackBody{}, fmt.Errorf("radar hijacks: success=false errors=%v", env.Errors) + return HijackBody{}, fmt.Errorf( + "radar hijacks: success=false errors=%v", + env.Errors, + ) } return env.Result, nil } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client_test.go index 797520bd..8061d297 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/client_test.go @@ -20,21 +20,27 @@ import ( func newRadarServer(t *testing.T, authHits *atomic.Int32) *httptest.Server { t.Helper() mux := http.NewServeMux() - mux.HandleFunc("/client/v4/radar/annotations/outages", func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") == "Bearer test-token" { - authHits.Add(1) - } - body, err := os.ReadFile("testdata/outages.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - }) - mux.HandleFunc("/client/v4/radar/bgp/hijacks/events", func(w http.ResponseWriter, _ *http.Request) { - body, err := os.ReadFile("testdata/hijacks.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - }) + mux.HandleFunc( + "/client/v4/radar/annotations/outages", + func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") == "Bearer test-token" { + authHits.Add(1) + } + body, err := os.ReadFile("testdata/outages.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }, + ) + mux.HandleFunc( + "/client/v4/radar/bgp/hijacks/events", + func(w http.ResponseWriter, _ *http.Request) { + body, err := os.ReadFile("testdata/hijacks.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }, + ) return httptest.NewServer(mux) } @@ -82,12 +88,20 @@ func TestClient_FetchHijacksDecodes(t *testing.T) { } func TestClient_FetchOutagesFailsOnSuccessFalse(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - _, _ = w.Write([]byte(`{"success":false,"errors":[{"message":"unauthorized"}]}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write( + []byte( + `{"success":false,"errors":[{"message":"unauthorized"}]}`, + ), + ) + }), + ) defer srv.Close() - c := cfradar.NewClient(cfradar.ClientConfig{BaseURL: srv.URL, BearerToken: "x"}) + c := cfradar.NewClient( + cfradar.ClientConfig{BaseURL: srv.URL, BearerToken: "x"}, + ) _, err := c.FetchOutages(context.Background()) require.Error(t, err) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector.go index add1eca8..3ffbf642 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector.go @@ -38,8 +38,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type Enricher interface { @@ -111,7 +111,7 @@ func (c *Collector) tick(ctx context.Context) { if n, err := c.tickOutages(ctx); err != nil { c.logger.Warn("cfradar outages tick failed", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { emitted += n @@ -119,14 +119,14 @@ func (c *Collector) tick(ctx context.Context) { if n, err := c.tickHijacks(ctx); err != nil { c.logger.Warn("cfradar hijacks tick failed", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { emitted += n } if !hadError { - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector_test.go index 9304271e..f4e76b3d 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/collector_test.go @@ -21,11 +21,16 @@ type fakeFetcher struct { hijacks cfradar.HijackBody } -func (f *fakeFetcher) FetchOutages(context.Context) (cfradar.OutageResultBody, error) { +func (f *fakeFetcher) FetchOutages( + context.Context, +) (cfradar.OutageResultBody, error) { return f.outages, nil } -func (f *fakeFetcher) FetchHijacks(context.Context, int) (cfradar.HijackBody, error) { +func (f *fakeFetcher) FetchHijacks( + context.Context, + int, +) (cfradar.HijackBody, error) { return f.hijacks, nil } @@ -51,7 +56,10 @@ func (r *fakeRepo) UpsertHijack(_ context.Context, _ cfradar.HijackRow) error { return nil } -func (r *fakeRepo) KnownOutageIDs(_ context.Context, ids []string) (map[string]bool, error) { +func (r *fakeRepo) KnownOutageIDs( + _ context.Context, + ids []string, +) (map[string]bool, error) { out := make(map[string]bool) for _, id := range ids { if r.knownOutages[id] { @@ -61,7 +69,10 @@ func (r *fakeRepo) KnownOutageIDs(_ context.Context, ids []string) (map[string]b return out, nil } -func (r *fakeRepo) KnownHijackIDs(_ context.Context, ids []int64) (map[int64]bool, error) { +func (r *fakeRepo) KnownHijackIDs( + _ context.Context, + ids []int64, +) (map[int64]bool, error) { out := make(map[int64]bool) for _, id := range ids { if r.knownHijacks[id] { @@ -92,8 +103,8 @@ func (e *fakeEmitter) Events() []events.Event { type noopState struct{} -func (noopState) RecordSuccess(context.Context, string, int64) error { return nil } -func (noopState) RecordError(context.Context, string, string) error { return nil } +func (noopState) RecordSuccess(context.Context, string, int64) {} +func (noopState) RecordError(context.Context, string, string) {} type fakeEnricher struct { calls int @@ -102,7 +113,10 @@ type fakeEnricher struct { returnFn func(ip string) (cfradar.Enrichment, error) } -func (e *fakeEnricher) Lookup(_ context.Context, ip string) (cfradar.Enrichment, error) { +func (e *fakeEnricher) Lookup( + _ context.Context, + ip string, +) (cfradar.Enrichment, error) { e.calls++ e.lastIP = ip if e.returnFn != nil { @@ -114,10 +128,12 @@ func (e *fakeEnricher) Lookup(_ context.Context, ip string) (cfradar.Enrichment, func TestCollector_OnlyEmitsNetNew(t *testing.T) { now := time.Now().UTC() ftch := &fakeFetcher{ - outages: cfradar.OutageResultBody{Annotations: []cfradar.OutageAnnotation{ - {ID: "out-known", StartDate: now}, - {ID: "out-new", StartDate: now}, - }}, + outages: cfradar.OutageResultBody{ + Annotations: []cfradar.OutageAnnotation{ + {ID: "out-known", StartDate: now}, + {ID: "out-new", StartDate: now}, + }, + }, hijacks: cfradar.HijackBody{Events: []cfradar.HijackEvent{ {ID: 100, DetectedAt: now, StartedAt: now, Confidence: 9}, {ID: 200, DetectedAt: now, StartedAt: now, Confidence: 8}, @@ -138,7 +154,10 @@ func TestCollector_OnlyEmitsNetNew(t *testing.T) { State: noopState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -194,7 +213,10 @@ func TestCollector_EnrichesHijackPayloadWhenEnricherProvided(t *testing.T) { Enricher: enr, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -219,7 +241,13 @@ func TestCollector_HijackEmitsRawWhenNoEnricher(t *testing.T) { now := time.Now().UTC() ftch := &fakeFetcher{ hijacks: cfradar.HijackBody{Events: []cfradar.HijackEvent{ - {ID: 777, DetectedAt: now, StartedAt: now, Confidence: 9, Prefixes: []string{"198.51.100.0/24"}}, + { + ID: 777, + DetectedAt: now, + StartedAt: now, + Confidence: 9, + Prefixes: []string{"198.51.100.0/24"}, + }, }}, } repo := &fakeRepo{knownHijacks: map[int64]bool{}} @@ -234,7 +262,10 @@ func TestCollector_HijackEmitsRawWhenNoEnricher(t *testing.T) { State: noopState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -250,9 +281,11 @@ func TestCollector_HijackEmitsRawWhenNoEnricher(t *testing.T) { func TestCollector_RepeatedTickIsIdempotent(t *testing.T) { now := time.Now().UTC() ftch := &fakeFetcher{ - outages: cfradar.OutageResultBody{Annotations: []cfradar.OutageAnnotation{ - {ID: "out-x", StartDate: now}, - }}, + outages: cfradar.OutageResultBody{ + Annotations: []cfradar.OutageAnnotation{ + {ID: "out-x", StartDate: now}, + }, + }, } emit := &fakeEmitter{} @@ -268,7 +301,10 @@ func TestCollector_RepeatedTickIsIdempotent(t *testing.T) { State: noopState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 25*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) known["out-x"] = true @@ -282,11 +318,19 @@ func TestCollector_RepeatedTickIsIdempotent(t *testing.T) { Emitter: emit2, State: noopState{}, }) - ctx2, cancel2 := context.WithTimeout(context.Background(), 25*time.Millisecond) + ctx2, cancel2 := context.WithTimeout( + context.Background(), + 25*time.Millisecond, + ) defer cancel2() _ = c2.Run(ctx2) for _, ev := range emit2.Events() { - require.NotEqual(t, events.TopicInternetOutage, ev.Topic, "should not re-emit known outage") + require.NotEqual( + t, + events.TopicInternetOutage, + ev.Topic, + "should not re-emit known outage", + ) } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/repo.go index 9d1a1600..b2ab73fb 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cfradar/repo.go @@ -49,7 +49,9 @@ func (r *Repo) UpsertOutage(ctx context.Context, o OutageRow) error { if o.ASNs == nil { o.ASNs = pq.Int32Array{} } - _, err := r.db.ExecContext(ctx, ` + _, err := r.db.ExecContext( + ctx, + ` INSERT INTO outage_events (id, started_at, ended_at, locations, asns, cause, outage_type, payload) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT (id) DO UPDATE SET @@ -59,7 +61,14 @@ func (r *Repo) UpsertOutage(ctx context.Context, o OutageRow) error { cause = EXCLUDED.cause, outage_type = EXCLUDED.outage_type, payload = EXCLUDED.payload`, - o.ID, o.StartedAt, o.EndedAt, o.Locations, o.ASNs, o.Cause, o.OutageType, []byte(o.Payload), + o.ID, + o.StartedAt, + o.EndedAt, + o.Locations, + o.ASNs, + o.Cause, + o.OutageType, + []byte(o.Payload), ) if err != nil { return fmt.Errorf("upsert outage %s: %w", o.ID, err) @@ -74,7 +83,9 @@ func (r *Repo) UpsertHijack(ctx context.Context, h HijackRow) error { if h.Prefixes == nil { h.Prefixes = []string{} } - _, err := r.db.ExecContext(ctx, ` + _, err := r.db.ExecContext( + ctx, + ` INSERT INTO bgp_hijack_events (id, detected_at, started_at, duration_sec, confidence, hijacker_asn, victim_asns, prefixes, payload) VALUES ($1, $2, $3, $4, $5, $6, $7, $8::cidr[], $9) @@ -83,8 +94,15 @@ func (r *Repo) UpsertHijack(ctx context.Context, h HijackRow) error { duration_sec = EXCLUDED.duration_sec, confidence = EXCLUDED.confidence, payload = EXCLUDED.payload`, - h.ID, h.DetectedAt, h.StartedAt, h.DurationSec, h.Confidence, h.HijackerASN, - h.VictimASNs, pq.Array(h.Prefixes), []byte(h.Payload), + h.ID, + h.DetectedAt, + h.StartedAt, + h.DurationSec, + h.Confidence, + h.HijackerASN, + h.VictimASNs, + pq.Array(h.Prefixes), + []byte(h.Payload), ) if err != nil { return fmt.Errorf("upsert hijack %d: %w", h.ID, err) @@ -92,13 +110,20 @@ func (r *Repo) UpsertHijack(ctx context.Context, h HijackRow) error { return nil } -func (r *Repo) KnownOutageIDs(ctx context.Context, ids []string) (map[string]bool, error) { +func (r *Repo) KnownOutageIDs( + ctx context.Context, + ids []string, +) (map[string]bool, error) { if len(ids) == 0 { return map[string]bool{}, nil } var found []string - if err := r.db.SelectContext(ctx, &found, - `SELECT id FROM outage_events WHERE id = ANY($1::text[])`, pq.Array(ids)); err != nil { + if err := r.db.SelectContext( + ctx, + &found, + `SELECT id FROM outage_events WHERE id = ANY($1::text[])`, + pq.Array(ids), + ); err != nil { return nil, fmt.Errorf("known outage ids: %w", err) } out := make(map[string]bool, len(found)) @@ -108,13 +133,20 @@ func (r *Repo) KnownOutageIDs(ctx context.Context, ids []string) (map[string]boo return out, nil } -func (r *Repo) KnownHijackIDs(ctx context.Context, ids []int64) (map[int64]bool, error) { +func (r *Repo) KnownHijackIDs( + ctx context.Context, + ids []int64, +) (map[int64]bool, error) { if len(ids) == 0 { return map[int64]bool{}, nil } var found []int64 - if err := r.db.SelectContext(ctx, &found, - `SELECT id FROM bgp_hijack_events WHERE id = ANY($1::bigint[])`, pq.Array(ids)); err != nil { + if err := r.db.SelectContext( + ctx, + &found, + `SELECT id FROM bgp_hijack_events WHERE id = ANY($1::bigint[])`, + pq.Array(ids), + ); err != nil { return nil, fmt.Errorf("known hijack ids: %w", err) } out := make(map[int64]bool, len(found)) @@ -123,3 +155,42 @@ func (r *Repo) KnownHijackIDs(ctx context.Context, ids []int64) (map[int64]bool, } return out, nil } + +func (r *Repo) RecentOutages( + ctx context.Context, + limit int, +) ([]OutageRow, error) { + if limit <= 0 { + limit = 50 + } + var rows []OutageRow + err := r.db.SelectContext(ctx, &rows, ` + SELECT id, started_at, ended_at, locations, asns, cause, outage_type, payload + FROM outage_events + ORDER BY started_at DESC + LIMIT $1`, limit) + if err != nil { + return nil, fmt.Errorf("recent outages: %w", err) + } + return rows, nil +} + +func (r *Repo) RecentHijacks( + ctx context.Context, + limit int, +) ([]HijackRow, error) { + if limit <= 0 { + limit = 50 + } + var rows []HijackRow + err := r.db.SelectContext(ctx, &rows, ` + SELECT id, detected_at, started_at, duration_sec, confidence, hijacker_asn, + victim_asns, payload + FROM bgp_hijack_events + ORDER BY detected_at DESC + LIMIT $1`, limit) + if err != nil { + return nil, fmt.Errorf("recent hijacks: %w", err) + } + return rows, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator.go index 2da928b2..5e2a4958 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator.go @@ -13,19 +13,23 @@ func NewAggregator() *Aggregator { return &Aggregator{open: make(map[string]MinuteBar)} } +// Push folds a tick into the open minute bar for its symbol. Volume24h +// from the latest tick within the minute wins — the column on +// MinuteBar is documented as "24h volume sampled at close of minute", +// not as per-minute volume. Per-trade size isn't on the ticker channel. func (a *Aggregator) Push(t Tick) (*MinuteBar, MinuteBar) { minute := t.TS.UTC().Truncate(time.Minute) cur, exists := a.open[t.Symbol] if !exists { cur = MinuteBar{ - Symbol: t.Symbol, - Minute: minute, - Open: t.Price, - High: t.Price, - Low: t.Price, - Close: t.Price, - Volume: t.Volume24h, + Symbol: t.Symbol, + Minute: minute, + Open: t.Price, + High: t.Price, + Low: t.Price, + Close: t.Price, + Volume24hAtClose: t.Volume24h, } a.open[t.Symbol] = cur return nil, cur @@ -34,13 +38,13 @@ func (a *Aggregator) Push(t Tick) (*MinuteBar, MinuteBar) { if minute.After(cur.Minute) { closed := cur cur = MinuteBar{ - Symbol: t.Symbol, - Minute: minute, - Open: t.Price, - High: t.Price, - Low: t.Price, - Close: t.Price, - Volume: t.Volume24h, + Symbol: t.Symbol, + Minute: minute, + Open: t.Price, + High: t.Price, + Low: t.Price, + Close: t.Price, + Volume24hAtClose: t.Volume24h, } a.open[t.Symbol] = cur return &closed, cur @@ -53,9 +57,7 @@ func (a *Aggregator) Push(t Tick) (*MinuteBar, MinuteBar) { cur.Low = t.Price } cur.Close = t.Price - if t.Volume24h.GreaterThan(cur.Volume) { - cur.Volume = t.Volume24h - } + cur.Volume24hAtClose = t.Volume24h a.open[t.Symbol] = cur return nil, cur } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator_test.go index 60d46741..a5e1b1fd 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/aggregator_test.go @@ -30,18 +30,39 @@ func TestAggregator_FirstTickOpensBar(t *testing.T) { func TestAggregator_FoldUpdatesHighLowClose(t *testing.T) { a := coinbase.NewAggregator() min := time.Date(2026, 5, 1, 12, 0, 0, 0, time.UTC) - a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min.Add(10 * time.Second), Price: decimal.RequireFromString("42000"), Volume24h: decimal.RequireFromString("100")}) - a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min.Add(20 * time.Second), Price: decimal.RequireFromString("42050"), Volume24h: decimal.RequireFromString("110")}) + a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min.Add(10 * time.Second), + Price: decimal.RequireFromString("42000"), + Volume24h: decimal.RequireFromString("100"), + }, + ) + a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min.Add(20 * time.Second), + Price: decimal.RequireFromString("42050"), + Volume24h: decimal.RequireFromString("110"), + }, + ) closed, cur := a.Push(coinbase.Tick{ - Symbol: "BTC-USD", TS: min.Add(30 * time.Second), - Price: decimal.RequireFromString("41950"), Volume24h: decimal.RequireFromString("120"), + Symbol: "BTC-USD", + TS: min.Add(30 * time.Second), + Price: decimal.RequireFromString( + "41950", + ), + Volume24h: decimal.RequireFromString("120"), }) require.Nil(t, closed) require.True(t, cur.Open.Equal(decimal.RequireFromString("42000"))) require.True(t, cur.High.Equal(decimal.RequireFromString("42050"))) require.True(t, cur.Low.Equal(decimal.RequireFromString("41950"))) require.True(t, cur.Close.Equal(decimal.RequireFromString("41950"))) - require.True(t, cur.Volume.Equal(decimal.RequireFromString("120"))) + require.True( + t, + cur.Volume24hAtClose.Equal(decimal.RequireFromString("120")), + ) } func TestAggregator_MinuteRolloverEmitsClosedBar(t *testing.T) { @@ -49,12 +70,30 @@ func TestAggregator_MinuteRolloverEmitsClosedBar(t *testing.T) { min1 := time.Date(2026, 5, 1, 12, 0, 0, 0, time.UTC) min2 := min1.Add(time.Minute) - a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min1.Add(10 * time.Second), Price: decimal.RequireFromString("42000"), Volume24h: decimal.RequireFromString("100")}) - a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min1.Add(50 * time.Second), Price: decimal.RequireFromString("42100"), Volume24h: decimal.RequireFromString("105")}) + a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min1.Add(10 * time.Second), + Price: decimal.RequireFromString("42000"), + Volume24h: decimal.RequireFromString("100"), + }, + ) + a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min1.Add(50 * time.Second), + Price: decimal.RequireFromString("42100"), + Volume24h: decimal.RequireFromString("105"), + }, + ) closed, cur := a.Push(coinbase.Tick{ - Symbol: "BTC-USD", TS: min2.Add(5 * time.Second), - Price: decimal.RequireFromString("42150"), Volume24h: decimal.RequireFromString("110"), + Symbol: "BTC-USD", + TS: min2.Add(5 * time.Second), + Price: decimal.RequireFromString( + "42150", + ), + Volume24h: decimal.RequireFromString("110"), }) require.NotNil(t, closed) @@ -69,8 +108,22 @@ func TestAggregator_BarsArePerProduct(t *testing.T) { a := coinbase.NewAggregator() min := time.Date(2026, 5, 1, 12, 0, 0, 0, time.UTC) - _, btc := a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min.Add(10 * time.Second), Price: decimal.RequireFromString("42000"), Volume24h: decimal.RequireFromString("100")}) - _, eth := a.Push(coinbase.Tick{Symbol: "ETH-USD", TS: min.Add(11 * time.Second), Price: decimal.RequireFromString("2300"), Volume24h: decimal.RequireFromString("80")}) + _, btc := a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min.Add(10 * time.Second), + Price: decimal.RequireFromString("42000"), + Volume24h: decimal.RequireFromString("100"), + }, + ) + _, eth := a.Push( + coinbase.Tick{ + Symbol: "ETH-USD", + TS: min.Add(11 * time.Second), + Price: decimal.RequireFromString("2300"), + Volume24h: decimal.RequireFromString("80"), + }, + ) require.Equal(t, "BTC-USD", btc.Symbol) require.Equal(t, "ETH-USD", eth.Symbol) @@ -81,8 +134,22 @@ func TestAggregator_BarsArePerProduct(t *testing.T) { func TestAggregator_FlushReturnsAllOpenBars(t *testing.T) { a := coinbase.NewAggregator() min := time.Date(2026, 5, 1, 12, 0, 0, 0, time.UTC) - a.Push(coinbase.Tick{Symbol: "BTC-USD", TS: min.Add(10 * time.Second), Price: decimal.RequireFromString("42000"), Volume24h: decimal.RequireFromString("100")}) - a.Push(coinbase.Tick{Symbol: "ETH-USD", TS: min.Add(15 * time.Second), Price: decimal.RequireFromString("2300"), Volume24h: decimal.RequireFromString("80")}) + a.Push( + coinbase.Tick{ + Symbol: "BTC-USD", + TS: min.Add(10 * time.Second), + Price: decimal.RequireFromString("42000"), + Volume24h: decimal.RequireFromString("100"), + }, + ) + a.Push( + coinbase.Tick{ + Symbol: "ETH-USD", + TS: min.Add(15 * time.Second), + Price: decimal.RequireFromString("2300"), + Volume24h: decimal.RequireFromString("80"), + }, + ) bars := a.Flush() require.Len(t, bars, 2) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client.go index 5e5e2009..83094e1a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client.go @@ -88,7 +88,11 @@ func (d *WSDialer) Dial(ctx context.Context) (*Conn, error) { conn := &Conn{c: c} subCtx, cancel := context.WithTimeout(ctx, d.cfg.WriteTimeout) defer cancel() - if err := conn.subscribe(subCtx, channelTicker, d.cfg.ProductIDs); err != nil { + if err := conn.subscribe( + subCtx, + channelTicker, + d.cfg.ProductIDs, + ); err != nil { _ = c.Close(websocket.StatusInternalError, "subscribe ticker") return nil, err } @@ -116,8 +120,16 @@ type subscribeMsg struct { ProductIDs []string `json:"product_ids,omitempty"` } -func (c *Conn) subscribe(ctx context.Context, channel string, productIDs []string) error { - msg := subscribeMsg{Type: "subscribe", Channel: channel, ProductIDs: productIDs} +func (c *Conn) subscribe( + ctx context.Context, + channel string, + productIDs []string, +) error { + msg := subscribeMsg{ + Type: "subscribe", + Channel: channel, + ProductIDs: productIDs, + } body, err := json.Marshal(msg) if err != nil { return fmt.Errorf("marshal subscribe %s: %w", channel, err) @@ -151,7 +163,10 @@ func parseCoinbaseTime(s string) time.Time { if idx := strings.Index(s, " m=+"); idx > 0 { s = s[:idx] } - if t, err := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", s); err == nil { + if t, err := time.Parse( + "2006-01-02 15:04:05.999999999 -0700 MST", + s, + ); err == nil { return t } return time.Time{} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client_test.go index 617df843..872e6961 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/client_test.go @@ -171,7 +171,9 @@ func TestClient_DecodeHeartbeatExposesCurrentTime(t *testing.T) { loadFixture(t, "heartbeats.json"), ) - d := coinbase.NewWSDialer(coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}) + d := coinbase.NewWSDialer( + coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}, + ) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector.go index c47ad3f4..3ee3d274 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector.go @@ -34,8 +34,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -50,12 +50,28 @@ type CollectorConfig struct { Logger *slog.Logger } +type priceObs struct { + ts time.Time + price decimal.Decimal +} + +const ( + priceHistoryWindow = time.Hour + // minHistoryAge guards against false alarms after a backend restart: + // if we only have ~5 minutes of price data and the price moved 5% + // in that window, that's not "1h drop ≥5%" — it's a 5-minute spike + // that happens to round to the threshold. Wait until we have at + // least 30 min of observations before reporting change_pct_1h. + minHistoryAge = 30 * time.Minute +) + type Collector struct { - cfg CollectorConfig - dialer Dialer - logger *slog.Logger - mu sync.Mutex - lastEmit map[string]time.Time + cfg CollectorConfig + dialer Dialer + logger *slog.Logger + mu sync.Mutex + lastEmit map[string]time.Time + priceHistory map[string][]priceObs } func NewCollector(cfg CollectorConfig) *Collector { @@ -78,10 +94,11 @@ func NewCollector(cfg CollectorConfig) *Collector { } return &Collector{ - cfg: cfg, - dialer: d, - logger: cfg.Logger, - lastEmit: make(map[string]time.Time), + cfg: cfg, + dialer: d, + logger: cfg.Logger, + lastEmit: make(map[string]time.Time), + priceHistory: make(map[string][]priceObs), } } @@ -89,8 +106,9 @@ func (c *Collector) Name() string { return Name } func (c *Collector) Run(ctx context.Context) error { err := Reconnect(ctx, c.dialer, c.cfg.Reconnect, c.handleConn) - if err != nil && !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) { - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + if err != nil && !errors.Is(err, context.Canceled) && + !errors.Is(err, context.DeadlineExceeded) { + c.cfg.State.RecordError(ctx, Name, err.Error()) } return err } @@ -100,39 +118,61 @@ func (c *Collector) handleConn(ctx context.Context, conn *Conn) error { agg := NewAggregator() count := int64(0) - loopErr := ReadLoop(ctx, conn, seq, func(hctx context.Context, f Frame) error { - switch f.Kind { - case FrameTypeUnknown, FrameTypeSubscriptions, FrameTypeHeartbeats: - return nil - case FrameTypeTicker, FrameTypeSnapshot: - ts := f.Timestamp.UTC() - if ts.IsZero() { - ts = time.Now().UTC() - } - for _, tk := range f.Tickers { - tick := Tick{ - Symbol: tk.ProductID, - TS: ts, - Price: tk.Price, - Volume24h: tk.Volume24h, + loopErr := ReadLoop( + ctx, + conn, + seq, + func(hctx context.Context, f Frame) error { + switch f.Kind { + case FrameTypeUnknown, FrameTypeSubscriptions, FrameTypeHeartbeats: + return nil + case FrameTypeTicker, FrameTypeSnapshot: + ts := f.Timestamp.UTC() + if ts.IsZero() { + ts = time.Now().UTC() } - if err := c.cfg.Repo.InsertTick(hctx, tick); err != nil { - c.logger.Warn("insert tick", "symbol", tick.Symbol, "err", err) - continue - } - if closed, _ := agg.Push(tick); closed != nil { - if err := c.cfg.Repo.UpsertMinute(hctx, *closed); err != nil { - c.logger.Warn("upsert minute", "symbol", closed.Symbol, "minute", closed.Minute, "err", err) + for _, tk := range f.Tickers { + tick := Tick{ + Symbol: tk.ProductID, + TS: ts, + Price: tk.Price, + Volume24h: tk.Volume24h, + } + if err := c.cfg.Repo.InsertTick(hctx, tick); err != nil { + c.logger.Warn( + "insert tick", + "symbol", + tick.Symbol, + "err", + err, + ) + continue + } + if closed, _ := agg.Push(tick); closed != nil { + if err := c.cfg.Repo.UpsertMinute( + hctx, + *closed, + ); err != nil { + c.logger.Warn( + "upsert minute", + "symbol", + closed.Symbol, + "minute", + closed.Minute, + "err", + err, + ) + } + } + if c.shouldEmit(tick.Symbol) { + c.emitTick(tick) + count++ } } - if c.shouldEmit(tick.Symbol) { - c.emitTick(tick) - count++ - } } - } - return nil - }) + return nil + }, + ) c.logger.Info("coinbase loop exit", "err", loopErrString(loopErr), @@ -140,7 +180,7 @@ func (c *Collector) handleConn(ctx context.Context, conn *Conn) error { "agg_open", aggLen(agg), ) if loopErr == nil || errors.Is(loopErr, ErrSequenceGap) { - _ = c.cfg.State.RecordSuccess(ctx, Name, count) + c.cfg.State.RecordSuccess(ctx, Name, count) } return loopErr } @@ -172,19 +212,25 @@ func (c *Collector) shouldEmit(symbol string) bool { } type tickPayload struct { - Symbol string `json:"symbol"` - TS time.Time `json:"ts"` - Price decimal.Decimal `json:"price"` - Volume24h decimal.Decimal `json:"volume_24h"` + Symbol string `json:"symbol"` + TS time.Time `json:"ts"` + Price decimal.Decimal `json:"price"` + Volume24h decimal.Decimal `json:"volume_24h"` + ChangePct1h *float64 `json:"change_pct_1h,omitempty"` } func (c *Collector) emitTick(t Tick) { - body, _ := json.Marshal(tickPayload{ + c.recordPrice(t.Symbol, t.TS, t.Price) + payload := tickPayload{ Symbol: t.Symbol, TS: t.TS, Price: t.Price, Volume24h: t.Volume24h, - }) + } + if pct, ok := c.changePct1h(t.Symbol, t.TS, t.Price); ok { + payload.ChangePct1h = &pct + } + body, _ := json.Marshal(payload) c.cfg.Emitter.Emit(events.Event{ Topic: events.TopicCoinbasePrice, Timestamp: t.TS, @@ -192,3 +238,50 @@ func (c *Collector) emitTick(t Tick) { Payload: json.RawMessage(body), }) } + +// recordPrice keeps a sliding 1-hour window of (timestamp, price) +// observations per symbol so we can compute trailing percentage change +// without hitting the database on every tick. +func (c *Collector) recordPrice( + symbol string, + ts time.Time, + price decimal.Decimal, +) { + c.mu.Lock() + defer c.mu.Unlock() + cutoff := ts.Add(-priceHistoryWindow) + hist := c.priceHistory[symbol] + drop := 0 + for drop < len(hist) && hist[drop].ts.Before(cutoff) { + drop++ + } + hist = append(hist[drop:], priceObs{ts: ts, price: price}) + c.priceHistory[symbol] = hist +} + +// changePct1h returns the percent change from the oldest observation in +// the sliding window to `current`. Returns false if we haven't yet seen +// minHistoryAge of data — predicates against early-life ticks would +// otherwise fire on noisy short windows. Used by the alerts engine via +// the emitted `change_pct_1h` field. +func (c *Collector) changePct1h( + symbol string, + currentTs time.Time, + current decimal.Decimal, +) (float64, bool) { + c.mu.Lock() + defer c.mu.Unlock() + hist := c.priceHistory[symbol] + if len(hist) == 0 { + return 0, false + } + oldest := hist[0] + if currentTs.Sub(oldest.ts) < minHistoryAge { + return 0, false + } + if oldest.price.IsZero() { + return 0, false + } + pct, _ := current.Sub(oldest.price).Div(oldest.price).Float64() + return pct * 100, true +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector_test.go index f36258a6..a6f71b5c 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/collector_test.go @@ -37,11 +37,17 @@ func (r *fakeRepo) UpsertMinute(_ context.Context, b coinbase.MinuteBar) error { return nil } -func (r *fakeRepo) LatestTick(_ context.Context, _ string) (coinbase.Tick, error) { +func (r *fakeRepo) LatestTick( + _ context.Context, + _ string, +) (coinbase.Tick, error) { return coinbase.Tick{}, nil } -func (r *fakeRepo) History1h(_ context.Context, _ string) ([]coinbase.MinuteBar, error) { +func (r *fakeRepo) History1h( + _ context.Context, + _ string, +) ([]coinbase.MinuteBar, error) { return nil, nil } @@ -74,18 +80,16 @@ type fakeState struct { failures int } -func (s *fakeState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *fakeState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *fakeState) RecordError(_ context.Context, _, _ string) error { +func (s *fakeState) RecordError(_ context.Context, _, _ string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ - return nil } func tickerFrame(seq int64, productID, price string, ts time.Time) []byte { @@ -116,7 +120,10 @@ func TestCollector_RunPersistsAndEmits(t *testing.T) { frames := [][]byte{loadFixture(t, "subscriptions.json")} for i := 0; i < 6; i++ { ts := now.Add(time.Duration(i) * time.Second) - frames = append(frames, tickerFrame(int64(i+1), "BTC-USD", fmt.Sprintf("4200%d.00", i), ts)) + frames = append( + frames, + tickerFrame(int64(i+1), "BTC-USD", fmt.Sprintf("4200%d.00", i), ts), + ) } fs := newFakeServer(t, frames...) @@ -137,12 +144,20 @@ func TestCollector_RunPersistsAndEmits(t *testing.T) { }, }) - ctx, cancel := context.WithTimeout(context.Background(), 800*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 800*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.GreaterOrEqual(t, repo.Tickers(), 3, "should persist most ticks") - require.GreaterOrEqual(t, emt.Count(), 1, "should emit at least one event after throttle") + require.GreaterOrEqual( + t, + emt.Count(), + 1, + "should emit at least one event after throttle", + ) } func TestCollector_GapTriggersReconnect(t *testing.T) { @@ -171,7 +186,10 @@ func TestCollector_GapTriggersReconnect(t *testing.T) { }, }) - ctx, cancel := context.WithTimeout(context.Background(), 600*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 600*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop.go index e8fa7ea2..36596355 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop.go @@ -13,7 +13,12 @@ var ErrSequenceGap = errors.New("coinbase: sequence gap detected") type FrameHandler func(ctx context.Context, f Frame) error -func ReadLoop(ctx context.Context, conn *Conn, seq *Sequencer, handler FrameHandler) error { +func ReadLoop( + ctx context.Context, + conn *Conn, + seq *Sequencer, + handler FrameHandler, +) error { for { if err := ctx.Err(); err != nil { return err diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop_test.go index a294ec01..914f1399 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/readloop_test.go @@ -16,13 +16,20 @@ import ( ) func TestReadLoop_DeliversTickerFrames(t *testing.T) { - fs := newFakeServer(t, + fs := newFakeServer( + t, loadFixture(t, "subscriptions.json"), - []byte(`{"channel":"ticker","sequence_num":1000,"timestamp":"2026-05-01T22:30:00Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42000.00","volume_24_h":"1.0","time":"2026-05-01T22:30:00Z"}]}]}`), - []byte(`{"channel":"ticker","sequence_num":1001,"timestamp":"2026-05-01T22:30:01Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42001.00","volume_24_h":"1.0","time":"2026-05-01T22:30:01Z"}]}]}`), + []byte( + `{"channel":"ticker","sequence_num":1000,"timestamp":"2026-05-01T22:30:00Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42000.00","volume_24_h":"1.0","time":"2026-05-01T22:30:00Z"}]}]}`, + ), + []byte( + `{"channel":"ticker","sequence_num":1001,"timestamp":"2026-05-01T22:30:01Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42001.00","volume_24_h":"1.0","time":"2026-05-01T22:30:01Z"}]}]}`, + ), ) - d := coinbase.NewWSDialer(coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}) + d := coinbase.NewWSDialer( + coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}, + ) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() conn, err := d.Dial(ctx) @@ -36,29 +43,48 @@ func TestReadLoop_DeliversTickerFrames(t *testing.T) { loopCtx, loopCancel := context.WithTimeout(ctx, 500*time.Millisecond) defer loopCancel() - err = coinbase.ReadLoop(loopCtx, conn, seq, func(_ context.Context, f coinbase.Frame) error { - mu.Lock() - defer mu.Unlock() - if f.Kind == coinbase.FrameTypeTicker { - tickerFrames++ - } - return nil - }) - require.True(t, errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) || err == nil) + err = coinbase.ReadLoop( + loopCtx, + conn, + seq, + func(_ context.Context, f coinbase.Frame) error { + mu.Lock() + defer mu.Unlock() + if f.Kind == coinbase.FrameTypeTicker { + tickerFrames++ + } + return nil + }, + ) + require.True( + t, + errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) || + err == nil, + ) mu.Lock() defer mu.Unlock() require.GreaterOrEqual(t, tickerFrames, 2) } func TestReadLoop_GapIsLoggedButLoopContinues(t *testing.T) { - fs := newFakeServer(t, + fs := newFakeServer( + t, loadFixture(t, "subscriptions.json"), - []byte(`{"channel":"ticker","sequence_num":100,"timestamp":"2026-05-01T22:30:00Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42000.00","volume_24_h":"1.0","time":"2026-05-01T22:30:00Z"}]}]}`), - []byte(`{"channel":"ticker","sequence_num":250,"timestamp":"2026-05-01T22:30:01Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42001.00","volume_24_h":"1.0","time":"2026-05-01T22:30:01Z"}]}]}`), + []byte( + `{"channel":"ticker","sequence_num":100,"timestamp":"2026-05-01T22:30:00Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42000.00","volume_24_h":"1.0","time":"2026-05-01T22:30:00Z"}]}]}`, + ), + []byte( + `{"channel":"ticker","sequence_num":250,"timestamp":"2026-05-01T22:30:01Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42001.00","volume_24_h":"1.0","time":"2026-05-01T22:30:01Z"}]}]}`, + ), ) - d := coinbase.NewWSDialer(coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}) - ctx, cancel := context.WithTimeout(context.Background(), 600*time.Millisecond) + d := coinbase.NewWSDialer( + coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}, + ) + ctx, cancel := context.WithTimeout( + context.Background(), + 600*time.Millisecond, + ) defer cancel() conn, err := d.Dial(ctx) require.NoError(t, err) @@ -66,24 +92,43 @@ func TestReadLoop_GapIsLoggedButLoopContinues(t *testing.T) { seq := coinbase.NewSequencer() delivered := 0 - loopErr := coinbase.ReadLoop(ctx, conn, seq, func(_ context.Context, f coinbase.Frame) error { - if f.Kind == coinbase.FrameTypeTicker { - delivered++ - } - return nil - }) - require.True(t, errors.Is(loopErr, context.DeadlineExceeded) || errors.Is(loopErr, context.Canceled) || loopErr == nil) - require.Equal(t, 2, delivered, "both ticker frames must be delivered despite the gap") + loopErr := coinbase.ReadLoop( + ctx, + conn, + seq, + func(_ context.Context, f coinbase.Frame) error { + if f.Kind == coinbase.FrameTypeTicker { + delivered++ + } + return nil + }, + ) + require.True( + t, + errors.Is(loopErr, context.DeadlineExceeded) || errors.Is(loopErr, context.Canceled) || + loopErr == nil, + ) + require.Equal( + t, + 2, + delivered, + "both ticker frames must be delivered despite the gap", + ) } func TestReadLoop_SnapshotResetsSequencer(t *testing.T) { - fs := newFakeServer(t, + fs := newFakeServer( + t, loadFixture(t, "subscriptions.json"), loadFixture(t, "snapshot.json"), - []byte(`{"channel":"ticker","sequence_num":2,"timestamp":"2026-05-01T22:30:02Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42164.00","volume_24_h":"1.0","time":"2026-05-01T22:30:02Z"}]}]}`), + []byte( + `{"channel":"ticker","sequence_num":2,"timestamp":"2026-05-01T22:30:02Z","events":[{"type":"update","tickers":[{"product_id":"BTC-USD","price":"42164.00","volume_24_h":"1.0","time":"2026-05-01T22:30:02Z"}]}]}`, + ), ) - d := coinbase.NewWSDialer(coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}) + d := coinbase.NewWSDialer( + coinbase.DialerConfig{URL: fs.URL(), ProductIDs: []string{"BTC-USD"}}, + ) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() conn, err := d.Dial(ctx) @@ -96,13 +141,22 @@ func TestReadLoop_SnapshotResetsSequencer(t *testing.T) { loopCtx, loopCancel := context.WithTimeout(ctx, 800*time.Millisecond) defer loopCancel() - err = coinbase.ReadLoop(loopCtx, conn, seq, func(_ context.Context, f coinbase.Frame) error { - mu.Lock() - defer mu.Unlock() - kinds = append(kinds, f.Kind) - return nil - }) - require.True(t, errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) || err == nil) + err = coinbase.ReadLoop( + loopCtx, + conn, + seq, + func(_ context.Context, f coinbase.Frame) error { + mu.Lock() + defer mu.Unlock() + kinds = append(kinds, f.Kind) + return nil + }, + ) + require.True( + t, + errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) || + err == nil, + ) mu.Lock() defer mu.Unlock() diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect.go index 30772b0f..4890e69d 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect.go @@ -27,7 +27,12 @@ func PermanentReconnectError(err error) error { return backoff.Permanent(err) } -func Reconnect(ctx context.Context, d Dialer, cfg ReconnectConfig, handler ConnHandler) error { +func Reconnect( + ctx context.Context, + d Dialer, + cfg ReconnectConfig, + handler ConnHandler, +) error { if cfg.InitialInterval <= 0 { cfg.InitialInterval = defaultReconnectInitial } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect_test.go index dfa9738d..d86fff14 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/reconnect_test.go @@ -31,7 +31,10 @@ func (d *stubDialer) Dial(_ context.Context) (*coinbase.Conn, error) { func TestReconnect_StopsOnContextCancel(t *testing.T) { d := &stubDialer{failsBeforeOK: 0} - ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 80*time.Millisecond, + ) defer cancel() calls := atomic.Int32{} @@ -42,13 +45,25 @@ func TestReconnect_StopsOnContextCancel(t *testing.T) { calls.Add(1) return errors.New("upstream closed") }) - require.True(t, errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled)) - require.Greater(t, calls.Load(), int32(1), "callback should fire multiple times before ctx expires") + require.True( + t, + errors.Is(err, context.DeadlineExceeded) || + errors.Is(err, context.Canceled), + ) + require.Greater( + t, + calls.Load(), + int32(1), + "callback should fire multiple times before ctx expires", + ) } func TestReconnect_TransientDialFailureBacksOffThenSucceeds(t *testing.T) { d := &stubDialer{failsBeforeOK: 3} - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 500*time.Millisecond, + ) defer cancel() cbInvocations := atomic.Int32{} @@ -59,8 +74,17 @@ func TestReconnect_TransientDialFailureBacksOffThenSucceeds(t *testing.T) { cbInvocations.Add(1) return errors.New("force loop") }) - require.True(t, errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled)) - require.GreaterOrEqual(t, d.called.Load(), int32(4), "must dial at least 4 times (3 failures + 1 success)") + require.True( + t, + errors.Is(err, context.DeadlineExceeded) || + errors.Is(err, context.Canceled), + ) + require.GreaterOrEqual( + t, + d.called.Load(), + int32(4), + "must dial at least 4 times (3 failures + 1 success)", + ) require.GreaterOrEqual(t, cbInvocations.Load(), int32(1)) } @@ -68,7 +92,10 @@ func TestReconnect_PermanentErrorFromCallbackPropagates(t *testing.T) { d := &stubDialer{failsBeforeOK: 0} sentinel := errors.New("hard stop") - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 200*time.Millisecond, + ) defer cancel() err := coinbase.Reconnect(ctx, d, coinbase.ReconnectConfig{ diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo.go index 6c91fcf3..c664473d 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo.go @@ -23,14 +23,18 @@ type Tick struct { Volume24h decimal.Decimal `db:"volume_24h"` } +// MinuteBar holds a per-minute OHLC for a symbol plus the rolling 24h +// volume sampled at the minute's close. The Coinbase ticker channel only +// publishes 24h volume, not per-trade size, so true per-minute volume +// would require the market_trades channel — out of scope here. type MinuteBar struct { - Symbol string `db:"symbol"` - Minute time.Time `db:"minute"` - Open decimal.Decimal `db:"open"` - High decimal.Decimal `db:"high"` - Low decimal.Decimal `db:"low"` - Close decimal.Decimal `db:"close"` - Volume decimal.Decimal `db:"volume"` + Symbol string `db:"symbol"` + Minute time.Time `db:"minute"` + Open decimal.Decimal `db:"open"` + High decimal.Decimal `db:"high"` + Low decimal.Decimal `db:"low"` + Close decimal.Decimal `db:"close"` + Volume24hAtClose decimal.Decimal `db:"volume_24h_at_close"` } type Repo struct { @@ -54,15 +58,15 @@ func (r *Repo) InsertTick(ctx context.Context, t Tick) error { func (r *Repo) UpsertMinute(ctx context.Context, b MinuteBar) error { _, err := r.db.ExecContext(ctx, ` - INSERT INTO btc_eth_minute (symbol, minute, open, high, low, close, volume) + INSERT INTO btc_eth_minute (symbol, minute, open, high, low, close, volume_24h_at_close) VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT (symbol, minute) DO UPDATE SET - open = EXCLUDED.open, - high = EXCLUDED.high, - low = EXCLUDED.low, - close = EXCLUDED.close, - volume = EXCLUDED.volume`, - b.Symbol, b.Minute, b.Open, b.High, b.Low, b.Close, b.Volume, + open = EXCLUDED.open, + high = EXCLUDED.high, + low = EXCLUDED.low, + close = EXCLUDED.close, + volume_24h_at_close = EXCLUDED.volume_24h_at_close`, + b.Symbol, b.Minute, b.Open, b.High, b.Low, b.Close, b.Volume24hAtClose, ) if err != nil { return fmt.Errorf("upsert minute %s @ %s: %w", b.Symbol, b.Minute, err) @@ -83,10 +87,13 @@ func (r *Repo) LatestTick(ctx context.Context, symbol string) (Tick, error) { return t, nil } -func (r *Repo) History1h(ctx context.Context, symbol string) ([]MinuteBar, error) { +func (r *Repo) History1h( + ctx context.Context, + symbol string, +) ([]MinuteBar, error) { var rows []MinuteBar err := r.db.SelectContext(ctx, &rows, ` - SELECT symbol, minute, open, high, low, close, volume + SELECT symbol, minute, open, high, low, close, volume_24h_at_close FROM btc_eth_minute WHERE symbol = $1 ORDER BY minute DESC LIMIT $2`, symbol, history1hLimit, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo_test.go index b5fa427a..c8294bc1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/coinbase/repo_test.go @@ -49,13 +49,13 @@ func setupDB(t *testing.T) *sqlx.DB { PRIMARY KEY (symbol, ts) ); CREATE TABLE btc_eth_minute ( - symbol text NOT NULL, - minute timestamptz NOT NULL, - open numeric(18,8) NOT NULL, - high numeric(18,8) NOT NULL, - low numeric(18,8) NOT NULL, - close numeric(18,8) NOT NULL, - volume numeric(20,8), + symbol text NOT NULL, + minute timestamptz NOT NULL, + open numeric(18,8) NOT NULL, + high numeric(18,8) NOT NULL, + low numeric(18,8) NOT NULL, + close numeric(18,8) NOT NULL, + volume_24h_at_close numeric(20,8), PRIMARY KEY (symbol, minute) );`) require.NoError(t, err) @@ -91,13 +91,13 @@ func TestRepo_UpsertMinuteUpdatesOHLC(t *testing.T) { minute := time.Now().UTC().Truncate(time.Minute) bar := coinbase.MinuteBar{ - Symbol: "ETH-USD", - Minute: minute, - Open: decimal.RequireFromString("2310.00"), - High: decimal.RequireFromString("2315.50"), - Low: decimal.RequireFromString("2308.10"), - Close: decimal.RequireFromString("2312.75"), - Volume: decimal.RequireFromString("88.12300000"), + Symbol: "ETH-USD", + Minute: minute, + Open: decimal.RequireFromString("2310.00"), + High: decimal.RequireFromString("2315.50"), + Low: decimal.RequireFromString("2308.10"), + Close: decimal.RequireFromString("2312.75"), + Volume24hAtClose: decimal.RequireFromString("88.12300000"), } require.NoError(t, repo.UpsertMinute(ctx, bar)) @@ -120,13 +120,13 @@ func TestRepo_History1hReturnsLast60MinutesOldestFirst(t *testing.T) { now := time.Now().UTC().Truncate(time.Minute) for i := 0; i < 75; i++ { bar := coinbase.MinuteBar{ - Symbol: "BTC-USD", - Minute: now.Add(-time.Duration(i) * time.Minute), - Open: decimal.NewFromInt(int64(40000 + i)), - High: decimal.NewFromInt(int64(40050 + i)), - Low: decimal.NewFromInt(int64(39950 + i)), - Close: decimal.NewFromInt(int64(40010 + i)), - Volume: decimal.NewFromInt(int64(i)), + Symbol: "BTC-USD", + Minute: now.Add(-time.Duration(i) * time.Minute), + Open: decimal.NewFromInt(int64(40000 + i)), + High: decimal.NewFromInt(int64(40050 + i)), + Low: decimal.NewFromInt(int64(39950 + i)), + Close: decimal.NewFromInt(int64(40010 + i)), + Volume24hAtClose: decimal.NewFromInt(int64(i)), } require.NoError(t, repo.UpsertMinute(ctx, bar)) } @@ -134,7 +134,11 @@ func TestRepo_History1hReturnsLast60MinutesOldestFirst(t *testing.T) { hist, err := repo.History1h(ctx, "BTC-USD") require.NoError(t, err) require.Len(t, hist, 60) - require.True(t, hist[0].Minute.Before(hist[len(hist)-1].Minute), "history must be oldest → newest") + require.True( + t, + hist[0].Minute.Before(hist[len(hist)-1].Minute), + "history must be oldest → newest", + ) } func TestRepo_LatestTickMissingReturnsErrNoRows(t *testing.T) { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector.go index 8baceb7f..dd725143 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector.go @@ -23,12 +23,19 @@ type NVDFetcher interface { } type EPSSFetcher interface { - LookupBatch(ctx context.Context, cveIDs []string) (map[string]EPSSScore, error) + LookupBatch( + ctx context.Context, + cveIDs []string, + ) (map[string]EPSSScore, error) } type Repository interface { Upsert(ctx context.Context, row Row) error - UpdateEPSS(ctx context.Context, cveID string, score, percentile float64) error + UpdateEPSS( + ctx context.Context, + cveID string, + score, percentile float64, + ) error } type Emitter interface { @@ -36,8 +43,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -94,7 +101,7 @@ func (c *Collector) tick(ctx context.Context) { resp, err := c.cfg.NVD.Fetch(ctx, start, end) if err != nil { c.logger.Warn("nvd fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -127,7 +134,12 @@ func (c *Collector) tick(ctx context.Context) { continue } if s, ok := scores[row.CveID]; ok { - if err := c.cfg.Repo.UpdateEPSS(ctx, row.CveID, s.Score, s.Percentile); err != nil { + if err := c.cfg.Repo.UpdateEPSS( + ctx, + row.CveID, + s.Score, + s.Percentile, + ); err != nil { c.logger.Warn("update epss", "id", row.CveID, "err", err) } row.EPSSScore = &s.Score @@ -142,5 +154,5 @@ func (c *Collector) tick(ctx context.Context) { }) emitted++ } - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector_test.go index d7eea8e1..78e88042 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/collector_test.go @@ -21,7 +21,11 @@ type stubNVD struct { err error } -func (s *stubNVD) Fetch(context.Context, time.Time, time.Time) (cve.NVDResponse, error) { +func (s *stubNVD) Fetch( + context.Context, + time.Time, + time.Time, +) (cve.NVDResponse, error) { return s.resp, s.err } @@ -30,7 +34,10 @@ type stubEPSS struct { err error } -func (s *stubEPSS) LookupBatch(context.Context, []string) (map[string]cve.EPSSScore, error) { +func (s *stubEPSS) LookupBatch( + context.Context, + []string, +) (map[string]cve.EPSSScore, error) { return s.scores, s.err } @@ -54,7 +61,11 @@ func (r *stubCVERepo) Upsert(_ context.Context, row cve.Row) error { return nil } -func (r *stubCVERepo) UpdateEPSS(_ context.Context, id string, score, pct float64) error { +func (r *stubCVERepo) UpdateEPSS( + _ context.Context, + id string, + score, pct float64, +) error { r.mu.Lock() defer r.mu.Unlock() r.patches[id] = [2]float64{score, pct} @@ -94,22 +105,29 @@ func (e *stubCVEEmitter) Events() []events.Event { type stubCVEState struct{} -func (stubCVEState) RecordSuccess(context.Context, string, int64) error { return nil } -func (stubCVEState) RecordError(context.Context, string, string) error { return nil } +func (stubCVEState) RecordSuccess(context.Context, string, int64) {} +func (stubCVEState) RecordError(context.Context, string, string) {} func TestCVECollector_FetchesEnrichesAndEmits(t *testing.T) { now := time.Now().UTC() nvd := &stubNVD{resp: cve.NVDResponse{ Vulnerabilities: []cve.NVDVulnRoot{ {CVE: cve.NVDCVE{ - ID: "CVE-2026-0001", Published: cve.NVDTime{Time: now.Add(-time.Hour)}, + ID: "CVE-2026-0001", + Published: cve.NVDTime{Time: now.Add(-time.Hour)}, LastModified: cve.NVDTime{Time: now}, Metrics: cve.NVDMetrics{CVSSv31: []cve.NVDMetricEntry{ - {CVSSData: cve.NVDCVSSData{BaseScore: 9.8, BaseSeverity: "CRITICAL"}}, + { + CVSSData: cve.NVDCVSSData{ + BaseScore: 9.8, + BaseSeverity: "CRITICAL", + }, + }, }}, }}, {CVE: cve.NVDCVE{ - ID: "CVE-2026-0002", Published: cve.NVDTime{Time: now.Add(-time.Hour)}, + ID: "CVE-2026-0002", + Published: cve.NVDTime{Time: now.Add(-time.Hour)}, LastModified: cve.NVDTime{Time: now}, }}, }, @@ -130,7 +148,10 @@ func TestCVECollector_FetchesEnrichesAndEmits(t *testing.T) { State: stubCVEState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -162,11 +183,14 @@ func TestCVECollector_NVDFetchErrorRecordsState(t *testing.T) { State: stubCVEState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 30*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Zero(t, repo.Upserts()) require.Zero(t, repo.Patches()) - require.Zero(t, len(emt.Events())) + require.Empty(t, emt.Events()) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client.go index 7dc5cf7f..132e5aec 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client.go @@ -63,7 +63,10 @@ type EPSSResponse struct { Data []EPSSScore `json:"data"` } -func (c *EPSSClient) LookupBatch(ctx context.Context, cveIDs []string) (map[string]EPSSScore, error) { +func (c *EPSSClient) LookupBatch( + ctx context.Context, + cveIDs []string, +) (map[string]EPSSScore, error) { out := map[string]EPSSScore{} for i := 0; i < len(cveIDs); i += epssBatchSize { end := i + epssBatchSize diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client_test.go index 638adf56..a87b60b4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/epss_client_test.go @@ -8,7 +8,6 @@ import ( "net/http" "net/http/httptest" "os" - "strings" "sync/atomic" "testing" @@ -18,17 +17,22 @@ import ( ) func TestEPSSClient_BatchLookupDecodesScores(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ids := r.URL.Query().Get("cve") - require.True(t, strings.Contains(ids, "CVE-2024-3094")) - body, err := os.ReadFile("testdata/epss_batch.json") - require.NoError(t, err) - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ids := r.URL.Query().Get("cve") + require.Contains(t, ids, "CVE-2024-3094") + body, err := os.ReadFile("testdata/epss_batch.json") + require.NoError(t, err) + _, _ = w.Write(body) + }), + ) defer srv.Close() c := cve.NewEPSSClient(cve.EPSSClientConfig{BaseURL: srv.URL}) - scores, err := c.LookupBatch(context.Background(), []string{"CVE-2024-3094", "CVE-2024-21413"}) + scores, err := c.LookupBatch( + context.Background(), + []string{"CVE-2024-3094", "CVE-2024-21413"}, + ) require.NoError(t, err) require.NotEmpty(t, scores) @@ -39,10 +43,12 @@ func TestEPSSClient_BatchLookupDecodesScores(t *testing.T) { func TestEPSSClient_ChunksOver100PerRequest(t *testing.T) { var hits atomic.Int32 - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - hits.Add(1) - _, _ = w.Write([]byte(`{"data":[]}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + hits.Add(1) + _, _ = w.Write([]byte(`{"data":[]}`)) + }), + ) defer srv.Close() c := cve.NewEPSSClient(cve.EPSSClientConfig{BaseURL: srv.URL}) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client.go index 8457d0cc..bb95451a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "net/url" + "strconv" "time" "golang.org/x/time/rate" @@ -23,6 +24,8 @@ const ( defaultNVDBreakerWin = 120 * time.Second nvdTimeFormat = "2006-01-02T15:04:05.000" nvdAPIKeyHeader = "apiKey" + nvdResultsPerPage = 2000 + nvdMaxPages = 50 ) type NVDClientConfig struct { @@ -110,16 +113,45 @@ type NVDCVSSData struct { BaseSeverity string `json:"baseSeverity"` } -func (c *NVDClient) Fetch(ctx context.Context, start, end time.Time) (NVDResponse, error) { - q := url.Values{ - "lastModStartDate": []string{start.UTC().Format(nvdTimeFormat)}, - "lastModEndDate": []string{end.UTC().Format(nvdTimeFormat)}, +// Fetch returns every NVD CVE updated in [start, end], paging through the +// API as needed. NVD caps a single response at 2000 vulns; without +// pagination, big-disclosure days (Patch Tuesday) silently drop everything +// past the first page. This is what the audit's Finding 4 was about. +func (c *NVDClient) Fetch( + ctx context.Context, + start, end time.Time, +) (NVDResponse, error) { + combined := NVDResponse{} + startIdx := 0 + + for page := 0; page < nvdMaxPages; page++ { + q := url.Values{ + "lastModStartDate": []string{start.UTC().Format(nvdTimeFormat)}, + "lastModEndDate": []string{end.UTC().Format(nvdTimeFormat)}, + "resultsPerPage": []string{strconv.Itoa(nvdResultsPerPage)}, + "startIndex": []string{strconv.Itoa(startIdx)}, + } + var pageResp NVDResponse + if err := c.hx.GetJSON(ctx, pathNVDCVE2, q, &pageResp); err != nil { + return NVDResponse{}, fmt.Errorf("nvd fetch page %d: %w", page, err) + } + combined.Vulnerabilities = append( + combined.Vulnerabilities, + pageResp.Vulnerabilities...) + combined.TotalResults = pageResp.TotalResults + + fetched := len(pageResp.Vulnerabilities) + if fetched == 0 { + break + } + startIdx += fetched + if startIdx >= pageResp.TotalResults { + break + } } - var resp NVDResponse - if err := c.hx.GetJSON(ctx, pathNVDCVE2, q, &resp); err != nil { - return NVDResponse{}, fmt.Errorf("nvd fetch: %w", err) - } - return resp, nil + combined.ResultsPerPage = len(combined.Vulnerabilities) + combined.StartIndex = 0 + return combined, nil } func (v NVDVulnRoot) PrimarySeverity() (float64, string) { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client_test.go index 7689e5a5..ff3c3310 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/nvd_client_test.go @@ -5,9 +5,13 @@ package cve_test import ( "context" + "encoding/json" + "fmt" "net/http" "net/http/httptest" "os" + "strconv" + "sync/atomic" "testing" "time" @@ -18,18 +22,22 @@ import ( func TestNVDClient_FetchSendsAPIKeyAndDecodes(t *testing.T) { var sawKey, sawStart, sawEnd string - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - sawKey = r.Header.Get("apiKey") - sawStart = r.URL.Query().Get("lastModStartDate") - sawEnd = r.URL.Query().Get("lastModEndDate") - body, err := os.ReadFile("testdata/nvd_2h_window.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sawKey = r.Header.Get("apiKey") + sawStart = r.URL.Query().Get("lastModStartDate") + sawEnd = r.URL.Query().Get("lastModEndDate") + body, err := os.ReadFile("testdata/nvd_2h_window.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() - c := cve.NewNVDClient(cve.NVDClientConfig{BaseURL: srv.URL, APIKey: "test-key"}) + c := cve.NewNVDClient( + cve.NVDClientConfig{BaseURL: srv.URL, APIKey: "test-key"}, + ) end := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC) start := end.Add(-2 * time.Hour) @@ -47,7 +55,12 @@ func TestNVDClient_PrimarySeverityFromV31(t *testing.T) { ID: "CVE-2026-X", Metrics: cve.NVDMetrics{ CVSSv31: []cve.NVDMetricEntry{ - {CVSSData: cve.NVDCVSSData{BaseScore: 9.8, BaseSeverity: "CRITICAL"}}, + { + CVSSData: cve.NVDCVSSData{ + BaseScore: 9.8, + BaseSeverity: "CRITICAL", + }, + }, }, }, }} @@ -61,7 +74,12 @@ func TestNVDClient_PrimarySeverityFallsBackToV30(t *testing.T) { ID: "CVE-2018-X", Metrics: cve.NVDMetrics{ CVSSv30: []cve.NVDMetricEntry{ - {CVSSData: cve.NVDCVSSData{BaseScore: 7.5, BaseSeverity: "HIGH"}}, + { + CVSSData: cve.NVDCVSSData{ + BaseScore: 7.5, + BaseSeverity: "HIGH", + }, + }, }, }, }} @@ -76,3 +94,57 @@ func TestNVDClient_PrimarySeverityZeroWhenMissing(t *testing.T) { require.Zero(t, score) require.Empty(t, sev) } + +// TestNVDClient_FetchPaginatesAcrossMultiplePages: NVD caps a single +// response at 2000 vulns. With a window like Patch Tuesday that exceeds +// that, we have to walk startIndex until startIndex >= totalResults. +// Pre-fix the collector silently dropped everything past page 1. +func TestNVDClient_FetchPaginatesAcrossMultiplePages(t *testing.T) { + const total = 4500 + var hits atomic.Int32 + + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + hits.Add(1) + startIdx, _ := strconv.Atoi(r.URL.Query().Get("startIndex")) + perPage, _ := strconv.Atoi(r.URL.Query().Get("resultsPerPage")) + if perPage <= 0 { + perPage = 2000 + } + end := startIdx + perPage + if end > total { + end = total + } + vulns := make([]cve.NVDVulnRoot, 0, end-startIdx) + for i := startIdx; i < end; i++ { + vulns = append(vulns, cve.NVDVulnRoot{ + CVE: cve.NVDCVE{ID: fmt.Sprintf("CVE-2026-%05d", i)}, + }) + } + resp := cve.NVDResponse{ + ResultsPerPage: perPage, + StartIndex: startIdx, + TotalResults: total, + Vulnerabilities: vulns, + } + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(resp) + }), + ) + defer srv.Close() + + c := cve.NewNVDClient(cve.NVDClientConfig{BaseURL: srv.URL}) + end := time.Now().UTC() + start := end.Add(-2 * time.Hour) + + resp, err := c.Fetch(context.Background(), start, end) + require.NoError(t, err) + require.Len(t, resp.Vulnerabilities, total, "every page should be combined") + require.Equal(t, total, resp.TotalResults) + require.GreaterOrEqual( + t, + hits.Load(), + int32(3), + "4500/2000 needs >=3 page calls", + ) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/repo.go index 0e546357..4f7a9083 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/cve/repo.go @@ -31,7 +31,9 @@ type Repo struct { func NewRepo(db *sqlx.DB) *Repo { return &Repo{db: db} } func (r *Repo) Upsert(ctx context.Context, row Row) error { - _, err := r.db.ExecContext(ctx, ` + _, err := r.db.ExecContext( + ctx, + ` INSERT INTO cve_events (cve_id, published, last_modified, severity, cvss_score, payload) VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (cve_id) DO UPDATE SET @@ -39,7 +41,12 @@ func (r *Repo) Upsert(ctx context.Context, row Row) error { severity = EXCLUDED.severity, cvss_score = EXCLUDED.cvss_score, payload = EXCLUDED.payload`, - row.CveID, row.Published, row.LastModified, row.Severity, row.CVSS, []byte(row.Payload), + row.CveID, + row.Published, + row.LastModified, + row.Severity, + row.CVSS, + []byte(row.Payload), ) if err != nil { return fmt.Errorf("upsert cve %s: %w", row.CveID, err) @@ -47,10 +54,17 @@ func (r *Repo) Upsert(ctx context.Context, row Row) error { return nil } -func (r *Repo) UpdateEPSS(ctx context.Context, cveID string, score, percentile float64) error { - _, err := r.db.ExecContext(ctx, +func (r *Repo) UpdateEPSS( + ctx context.Context, + cveID string, + score, percentile float64, +) error { + _, err := r.db.ExecContext( + ctx, `UPDATE cve_events SET epss_score = $2, epss_percentile = $3 WHERE cve_id = $1`, - cveID, score, percentile, + cveID, + score, + percentile, ) if err != nil { return fmt.Errorf("update epss %s: %w", cveID, err) @@ -70,7 +84,10 @@ func (r *Repo) Get(ctx context.Context, cveID string) (Row, error) { return row, nil } -func (r *Repo) RecentByLastModified(ctx context.Context, limit int) ([]Row, error) { +func (r *Repo) RecentByLastModified( + ctx context.Context, + limit int, +) ([]Row, error) { var rows []Row err := r.db.SelectContext(ctx, &rows, ` SELECT cve_id, published, last_modified, severity, cvss_score, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client.go index a68c17bc..d2c79d22 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client.go @@ -68,7 +68,12 @@ func (c *Client) FetchAll(ctx context.Context) ([]SnapshotPayload, error) { Kind string Path string }{ - {KindTopPorts, "/api/topports/records/" + strconv.Itoa(c.topN) + "/" + yesterday + "?json"}, + { + KindTopPorts, + "/api/topports/records/" + strconv.Itoa( + c.topN, + ) + "/" + yesterday + "?json", + }, {KindTopIPs, "/api/topips/?json"}, {KindDailySummary, "/api/dailysummary/" + yesterday + "/?json"}, } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client_test.go index 74881918..326f764c 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/client_test.go @@ -21,26 +21,37 @@ import ( func newFixtureServer(t *testing.T) *httptest.Server { t.Helper() mux := http.NewServeMux() - mux.HandleFunc("/api/topports/", func(w http.ResponseWriter, r *http.Request) { - require.Contains(t, r.URL.Path, "/api/topports/records/") - body, err := os.ReadFile(filepath.Join("testdata", "topports.json")) - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - }) - mux.HandleFunc("/api/topips/", func(w http.ResponseWriter, _ *http.Request) { - body, err := os.ReadFile(filepath.Join("testdata", "topips.json")) - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - }) - mux.HandleFunc("/api/dailysummary/", func(w http.ResponseWriter, r *http.Request) { - require.True(t, strings.HasPrefix(r.URL.Path, "/api/dailysummary/")) - body, err := os.ReadFile(filepath.Join("testdata", "dailysummary.json")) - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - }) + mux.HandleFunc( + "/api/topports/", + func(w http.ResponseWriter, r *http.Request) { + require.Contains(t, r.URL.Path, "/api/topports/records/") + body, err := os.ReadFile(filepath.Join("testdata", "topports.json")) + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }, + ) + mux.HandleFunc( + "/api/topips/", + func(w http.ResponseWriter, _ *http.Request) { + body, err := os.ReadFile(filepath.Join("testdata", "topips.json")) + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }, + ) + mux.HandleFunc( + "/api/dailysummary/", + func(w http.ResponseWriter, r *http.Request) { + require.True(t, strings.HasPrefix(r.URL.Path, "/api/dailysummary/")) + body, err := os.ReadFile( + filepath.Join("testdata", "dailysummary.json"), + ) + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }, + ) return httptest.NewServer(mux) } @@ -70,17 +81,26 @@ func TestClient_FetchAllReturnsThreeKinds(t *testing.T) { func TestClient_FetchAllUsesYesterdayDate(t *testing.T) { var topPortsPath, dailyPath string mux := http.NewServeMux() - mux.HandleFunc("/api/topports/", func(w http.ResponseWriter, r *http.Request) { - topPortsPath = r.URL.Path - _, _ = w.Write([]byte(`{}`)) - }) - mux.HandleFunc("/api/topips/", func(w http.ResponseWriter, _ *http.Request) { - _, _ = w.Write([]byte(`[]`)) - }) - mux.HandleFunc("/api/dailysummary/", func(w http.ResponseWriter, r *http.Request) { - dailyPath = r.URL.Path - _, _ = w.Write([]byte(`[]`)) - }) + mux.HandleFunc( + "/api/topports/", + func(w http.ResponseWriter, r *http.Request) { + topPortsPath = r.URL.Path + _, _ = w.Write([]byte(`{}`)) + }, + ) + mux.HandleFunc( + "/api/topips/", + func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(`[]`)) + }, + ) + mux.HandleFunc( + "/api/dailysummary/", + func(w http.ResponseWriter, r *http.Request) { + dailyPath = r.URL.Path + _, _ = w.Write([]byte(`[]`)) + }, + ) srv := httptest.NewServer(mux) defer srv.Close() diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector.go index ff2c4827..8de10ec1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector.go @@ -21,8 +21,23 @@ type Fetcher interface { FetchAll(ctx context.Context) ([]SnapshotPayload, error) } +type DShieldEnrichment struct { + Country string + Classification string + Actor string +} + +type Enricher interface { + Lookup(ctx context.Context, ip string) (DShieldEnrichment, error) +} + type Persister interface { - PutSnapshot(ctx context.Context, ts time.Time, kind string, payload json.RawMessage) error + PutSnapshot( + ctx context.Context, + ts time.Time, + kind string, + payload json.RawMessage, + ) error } type Emitter interface { @@ -30,8 +45,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -40,6 +55,7 @@ type CollectorConfig struct { Persister Persister Emitter Emitter State StateRecorder + Enricher Enricher Logger *slog.Logger } @@ -80,7 +96,7 @@ func (c *Collector) tick(ctx context.Context) { snaps, err := c.cfg.Fetcher.FetchAll(ctx) if err != nil { c.logger.Warn("dshield fetch failed", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -88,22 +104,31 @@ func (c *Collector) tick(ctx context.Context) { tsRaw, err := json.Marshal(now.Format(time.RFC3339Nano)) if err != nil { c.logger.Error("dshield marshal ts", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } merged := map[string]json.RawMessage{"ts": tsRaw} for _, s := range snaps { - if perr := c.cfg.Persister.PutSnapshot(ctx, now, s.Kind, s.Payload); perr != nil { + payload := s.Payload + if s.Kind == KindTopIPs { + payload = c.enrichSources(ctx, payload) + } + if perr := c.cfg.Persister.PutSnapshot( + ctx, + now, + s.Kind, + payload, + ); perr != nil { c.logger.Warn("dshield persist failed", "kind", s.Kind, "err", perr) } - merged[s.Kind] = s.Payload + merged[s.Kind] = payload } body, err := json.Marshal(merged) if err != nil { c.logger.Error("dshield marshal merged", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -113,5 +138,38 @@ func (c *Collector) tick(ctx context.Context) { Source: Name, Payload: json.RawMessage(body), }) - _ = c.cfg.State.RecordSuccess(ctx, Name, 1) + c.cfg.State.RecordSuccess(ctx, Name, 1) +} + +func (c *Collector) enrichSources( + ctx context.Context, + raw json.RawMessage, +) json.RawMessage { + if c.cfg.Enricher == nil { + return raw + } + var srcs []RawSource + if err := json.Unmarshal(raw, &srcs); err != nil { + return raw + } + enriched := make([]EnrichedSource, 0, len(srcs)) + for _, s := range srcs { + e := EnrichedSource{ + Rank: s.Rank, + Source: s.Source, + Reports: s.Reports, + Targets: s.Targets, + } + if info, err := c.cfg.Enricher.Lookup(ctx, s.Source); err == nil { + e.Country = info.Country + e.Classification = info.Classification + e.Actor = info.Actor + } + enriched = append(enriched, e) + } + out, err := json.Marshal(enriched) + if err != nil { + return raw + } + return out } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector_test.go index 4e43288a..ae292e28 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/collector_test.go @@ -23,7 +23,9 @@ type fakeFetcher struct { err error } -func (f *fakeFetcher) FetchAll(_ context.Context) ([]dshield.SnapshotPayload, error) { +func (f *fakeFetcher) FetchAll( + _ context.Context, +) ([]dshield.SnapshotPayload, error) { f.mu.Lock() defer f.mu.Unlock() f.calls++ @@ -32,8 +34,14 @@ func (f *fakeFetcher) FetchAll(_ context.Context) ([]dshield.SnapshotPayload, er } return []dshield.SnapshotPayload{ {Kind: dshield.KindTopPorts, Payload: json.RawMessage(`[{"port":22}]`)}, - {Kind: dshield.KindTopIPs, Payload: json.RawMessage(`[{"ip":"1.2.3.4"}]`)}, - {Kind: dshield.KindDailySummary, Payload: json.RawMessage(`[{"records":42}]`)}, + { + Kind: dshield.KindTopIPs, + Payload: json.RawMessage(`[{"ip":"1.2.3.4"}]`), + }, + { + Kind: dshield.KindDailySummary, + Payload: json.RawMessage(`[{"records":42}]`), + }, }, nil } @@ -53,7 +61,12 @@ type fakePersister struct { rows []persistedRow } -func (p *fakePersister) PutSnapshot(_ context.Context, _ time.Time, kind string, body json.RawMessage) error { +func (p *fakePersister) PutSnapshot( + _ context.Context, + _ time.Time, + kind string, + body json.RawMessage, +) error { p.mu.Lock() defer p.mu.Unlock() p.rows = append(p.rows, persistedRow{Kind: kind, Body: body}) @@ -95,20 +108,18 @@ type recordingState struct { lastErr string } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, n int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, n int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ s.successN += n - return nil } -func (s *recordingState) RecordError(_ context.Context, _, msg string) error { +func (s *recordingState) RecordError(_ context.Context, _, msg string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ s.lastErr = msg - return nil } func TestCollector_TickPersistsAllAndEmitsScanFirehose(t *testing.T) { @@ -125,7 +136,10 @@ func TestCollector_TickPersistsAllAndEmitsScanFirehose(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 70*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 70*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -148,7 +162,7 @@ func TestCollector_TickPersistsAllAndEmitsScanFirehose(t *testing.T) { require.Contains(t, merged, "ts") } - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) require.Equal(t, 0, st.failures) } @@ -166,12 +180,15 @@ func TestCollector_FetchErrorRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.Equal(t, 0, len(prst.Rows())) - require.Equal(t, 0, len(emt.Events())) - require.Greater(t, st.failures, 0) + require.Empty(t, prst.Rows()) + require.Empty(t, emt.Events()) + require.Positive(t, st.failures) require.Contains(t, st.lastErr, "upstream 503") } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo.go index 0137e973..a4f711af 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo.go @@ -24,7 +24,12 @@ type Repo struct { func NewRepo(db *sqlx.DB) *Repo { return &Repo{db: db} } -func (r *Repo) PutSnapshot(ctx context.Context, ts time.Time, kind string, payload json.RawMessage) error { +func (r *Repo) PutSnapshot( + ctx context.Context, + ts time.Time, + kind string, + payload json.RawMessage, +) error { _, err := r.db.ExecContext(ctx, ` INSERT INTO dshield_snapshots (ts, kind, payload) VALUES ($1, $2, $3) @@ -37,7 +42,11 @@ func (r *Repo) PutSnapshot(ctx context.Context, ts time.Time, kind string, paylo return nil } -func (r *Repo) LatestByKind(ctx context.Context, kind string, limit int) ([]Snapshot, error) { +func (r *Repo) LatestByKind( + ctx context.Context, + kind string, + limit int, +) ([]Snapshot, error) { var rows []Snapshot err := r.db.SelectContext(ctx, &rows, ` SELECT ts, kind, payload FROM dshield_snapshots diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo_test.go index 5595a0c3..4e87d9d3 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/repo_test.go @@ -95,9 +95,18 @@ func TestRepo_LatestByKindIsOrderedDesc(t *testing.T) { t2 := time.Now().UTC().Add(-1 * time.Hour).Truncate(time.Second) t3 := time.Now().UTC().Truncate(time.Second) - require.NoError(t, repo.PutSnapshot(ctx, t1, "sources", json.RawMessage(`[{"i":1}]`))) - require.NoError(t, repo.PutSnapshot(ctx, t3, "sources", json.RawMessage(`[{"i":3}]`))) - require.NoError(t, repo.PutSnapshot(ctx, t2, "sources", json.RawMessage(`[{"i":2}]`))) + require.NoError( + t, + repo.PutSnapshot(ctx, t1, "sources", json.RawMessage(`[{"i":1}]`)), + ) + require.NoError( + t, + repo.PutSnapshot(ctx, t3, "sources", json.RawMessage(`[{"i":3}]`)), + ) + require.NoError( + t, + repo.PutSnapshot(ctx, t2, "sources", json.RawMessage(`[{"i":2}]`)), + ) rows, err := repo.LatestByKind(ctx, "sources", 3) require.NoError(t, err) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/types.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/types.go new file mode 100644 index 00000000..5334b7ab --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/dshield/types.go @@ -0,0 +1,21 @@ +// ©AngelaMos | 2026 +// types.go + +package dshield + +type RawSource struct { + Rank int `json:"rank"` + Source string `json:"source"` + Reports int `json:"reports"` + Targets int `json:"targets"` +} + +type EnrichedSource struct { + Rank int `json:"rank"` + Source string `json:"source"` + Reports int `json:"reports"` + Targets int `json:"targets"` + Country string `json:"country,omitempty"` + Classification string `json:"classification,omitempty"` + Actor string `json:"actor,omitempty"` +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/baseline_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/baseline_test.go index cdd383b9..c8c33760 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/baseline_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/baseline_test.go @@ -22,7 +22,13 @@ func TestBaseline_StableThenSpikeReturnsHighZ(t *testing.T) { b := gdelt.NewThemeState(96) now := time.Now().UTC() for i := 0; i < 96; i++ { - b.Push(gdelt.Bucket{Score: now.Add(-time.Duration(i) * 15 * time.Minute).UnixMilli(), Count: 100 + (i % 10)}) + b.Push( + gdelt.Bucket{ + Score: now.Add(-time.Duration(i) * 15 * time.Minute). + UnixMilli(), + Count: 100 + (i % 10), + }, + ) } z := b.ZScore(500) require.Greater(t, z, 3.0) @@ -32,7 +38,13 @@ func TestBaseline_StableThenNormalReturnsLowZ(t *testing.T) { b := gdelt.NewThemeState(96) now := time.Now().UTC() for i := 0; i < 96; i++ { - b.Push(gdelt.Bucket{Score: now.Add(-time.Duration(i) * 15 * time.Minute).UnixMilli(), Count: 100 + (i % 10)}) + b.Push( + gdelt.Bucket{ + Score: now.Add(-time.Duration(i) * 15 * time.Minute). + UnixMilli(), + Count: 100 + (i % 10), + }, + ) } z := b.ZScore(108) require.Less(t, z, 3.0) @@ -50,7 +62,13 @@ func TestBaseline_TinyStdDevDoesNotDivByZero(t *testing.T) { b := gdelt.NewThemeState(96) now := time.Now().UTC() for i := 0; i < 96; i++ { - b.Push(gdelt.Bucket{Score: now.Add(-time.Duration(i) * 15 * time.Minute).UnixMilli(), Count: 100}) + b.Push( + gdelt.Bucket{ + Score: now.Add(-time.Duration(i) * 15 * time.Minute). + UnixMilli(), + Count: 100, + }, + ) } z := b.ZScore(101) require.False(t, math.IsInf(z, 0)) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client.go index 76d6d1e5..496bd12f 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client.go @@ -7,8 +7,8 @@ import ( "context" "encoding/json" "fmt" + "io" "net/url" - "strings" "time" "golang.org/x/time/rate" @@ -74,7 +74,10 @@ type rawTimeline struct { } `json:"timeline"` } -func (c *Client) FetchTheme(ctx context.Context, theme string) ([]ThemeBucket, error) { +func (c *Client) FetchTheme( + ctx context.Context, + theme string, +) ([]ThemeBucket, error) { q := url.Values{} q.Set("query", "theme:"+theme) q.Set("mode", "timelinevol") @@ -88,20 +91,13 @@ func (c *Client) FetchTheme(ctx context.Context, theme string) ([]ThemeBucket, e } defer func() { _ = resp.Body.Close() }() - body := strings.Builder{} - buf := make([]byte, 4096) - for { - n, rerr := resp.Body.Read(buf) - if n > 0 { - body.Write(buf[:n]) - } - if rerr != nil { - break - } + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("read gdelt theme %s body: %w", theme, err) } var raw rawTimeline - if err := json.Unmarshal([]byte(body.String()), &raw); err != nil { + if err := json.Unmarshal(body, &raw); err != nil { return nil, fmt.Errorf("decode gdelt theme %s: %w", theme, err) } if len(raw.Timeline) == 0 { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client_test.go index b3f02d6e..6bcca56a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/client_test.go @@ -20,13 +20,19 @@ func TestClient_FetchThemeDecodesBuckets(t *testing.T) { body, err := os.ReadFile("testdata/timelinevol.json") require.NoError(t, err) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - require.Equal(t, "/api/v2/doc/doc", r.URL.Path) - require.Equal(t, "theme:NATURAL_DISASTER", r.URL.Query().Get("query")) - require.Equal(t, "timelinevol", r.URL.Query().Get("mode")) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/api/v2/doc/doc", r.URL.Path) + require.Equal( + t, + "theme:NATURAL_DISASTER", + r.URL.Query().Get("query"), + ) + require.Equal(t, "timelinevol", r.URL.Query().Get("mode")) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() c := gdelt.NewClient(gdelt.ClientConfig{BaseURL: srv.URL}) @@ -38,7 +44,7 @@ func TestClient_FetchThemeDecodesBuckets(t *testing.T) { require.GreaterOrEqual(t, len(buckets), 1) for _, b := range buckets { require.False(t, b.Time.IsZero()) - require.Greater(t, b.Count, 0) + require.Positive(t, b.Count) require.Equal(t, "NATURAL_DISASTER", b.Theme) } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector.go index cf1d491b..d23c1baa 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector.go @@ -28,7 +28,7 @@ type Fetcher interface { } type Repository interface { - Insert(ctx context.Context, row SpikeRow) error + Insert(ctx context.Context, row SpikeRow) (inserted bool, err error) } type Emitter interface { @@ -36,8 +36,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -55,7 +55,6 @@ type Collector struct { cfg CollectorConfig logger *slog.Logger baselines map[string]*ThemeState - emitted map[string]bool } func NewCollector(cfg CollectorConfig) *Collector { @@ -75,7 +74,6 @@ func NewCollector(cfg CollectorConfig) *Collector { cfg: cfg, logger: cfg.Logger, baselines: make(map[string]*ThemeState, len(cfg.Themes)), - emitted: make(map[string]bool), } for _, t := range cfg.Themes { c.baselines[t] = NewThemeState(cfg.BaselineCap) @@ -107,7 +105,7 @@ func (c *Collector) tick(ctx context.Context) { buckets, err := c.cfg.Fetcher.FetchTheme(ctx, theme) if err != nil { c.logger.Warn("gdelt fetch", "theme", theme, "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true continue } @@ -120,26 +118,41 @@ func (c *Collector) tick(ctx context.Context) { continue } id := spikeID(theme, b.Time) - if c.emitted[id] { - continue - } - c.emitted[id] = true - payload, _ := json.Marshal(map[string]any{ + payload, perr := json.Marshal(map[string]any{ "theme": theme, "time": b.Time, "count": b.Count, "zscore": z, }) + if perr != nil { + c.logger.Warn( + "gdelt marshal payload", + "theme", + theme, + "err", + perr, + ) + continue + } row := SpikeRow{ ID: id, Theme: theme, OccurredAt: b.Time, - Headline: fmt.Sprintf("Theme spike: %s (z=%.2f, count=%d)", theme, z, b.Count), - Payload: payload, + Headline: fmt.Sprintf( + "Theme spike: %s (z=%.2f, count=%d)", + theme, + z, + b.Count, + ), + Payload: payload, } - if err := c.cfg.Repo.Insert(ctx, row); err != nil { - c.logger.Warn("gdelt insert", "id", id, "err", err) + inserted, ierr := c.cfg.Repo.Insert(ctx, row) + if ierr != nil { + c.logger.Warn("gdelt insert", "id", id, "err", ierr) + continue + } + if !inserted { continue } c.cfg.Emitter.Emit(events.Event{ @@ -153,7 +166,7 @@ func (c *Collector) tick(ctx context.Context) { } if !hadError { - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector_test.go index a599adbf..79116887 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/collector_test.go @@ -23,7 +23,10 @@ type fakeFetcher struct { err error } -func (f *fakeFetcher) FetchTheme(_ context.Context, theme string) ([]gdelt.ThemeBucket, error) { +func (f *fakeFetcher) FetchTheme( + _ context.Context, + theme string, +) ([]gdelt.ThemeBucket, error) { f.mu.Lock() defer f.mu.Unlock() f.calls++ @@ -36,13 +39,21 @@ func (f *fakeFetcher) FetchTheme(_ context.Context, theme string) ([]gdelt.Theme type fakeRepo struct { mu sync.Mutex inserts []gdelt.SpikeRow + seen map[string]struct{} } -func (r *fakeRepo) Insert(_ context.Context, row gdelt.SpikeRow) error { +func (r *fakeRepo) Insert(_ context.Context, row gdelt.SpikeRow) (bool, error) { r.mu.Lock() defer r.mu.Unlock() + if r.seen == nil { + r.seen = map[string]struct{}{} + } + if _, ok := r.seen[row.ID]; ok { + return false, nil + } + r.seen[row.ID] = struct{}{} r.inserts = append(r.inserts, row) - return nil + return true, nil } func (r *fakeRepo) Inserts() int { @@ -74,18 +85,16 @@ type recordingState struct { failures int } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *recordingState) RecordError(_ context.Context, _, _ string) error { +func (s *recordingState) RecordError(_ context.Context, _, _ string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ - return nil } func TestCollector_NoBaselineNoSpike(t *testing.T) { @@ -108,13 +117,21 @@ func TestCollector_NoBaselineNoSpike(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.Equal(t, 0, repo.Inserts(), "first observation has no baseline → cannot detect spike") + require.Equal( + t, + 0, + repo.Inserts(), + "first observation has no baseline → cannot detect spike", + ) require.Equal(t, 0, emt.Count()) - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) } func TestCollector_StableBaselinePlusSpikeEmitsOnce(t *testing.T) { @@ -127,7 +144,11 @@ func TestCollector_StableBaselinePlusSpikeEmitsOnce(t *testing.T) { Count: 100 + i, }) } - spikeBucket := gdelt.ThemeBucket{Theme: "X", Time: base.Add(15 * 15 * time.Minute), Count: 5000} + spikeBucket := gdelt.ThemeBucket{ + Theme: "X", + Time: base.Add(15 * 15 * time.Minute), + Count: 5000, + } buckets := append(stable, spikeBucket) ftch := &fakeFetcher{buckets: map[string][]gdelt.ThemeBucket{"X": buckets}} @@ -145,7 +166,10 @@ func TestCollector_StableBaselinePlusSpikeEmitsOnce(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 80*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -172,10 +196,13 @@ func TestCollector_FetchErrorsRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 60*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, repo.Inserts()) - require.Greater(t, st.failures, 0) + require.Positive(t, st.failures) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/repo.go index 93a09c51..b7320184 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/gdelt/repo.go @@ -5,7 +5,9 @@ package gdelt import ( "context" + "database/sql" "encoding/json" + "errors" "fmt" "time" @@ -30,15 +32,27 @@ type Repo struct { func NewRepo(db *sqlx.DB) *Repo { return &Repo{db: db} } -func (r *Repo) Insert(ctx context.Context, row SpikeRow) error { - _, err := r.db.ExecContext(ctx, ` +func (r *Repo) Insert(ctx context.Context, row SpikeRow) (bool, error) { + var id string + err := r.db.GetContext( + ctx, + &id, + ` INSERT INTO world_events (id, source, occurred_at, headline, payload) VALUES ($1, $2, $3, $4, $5) - ON CONFLICT (id) DO NOTHING`, - row.ID, sourceGDELTSpike, row.OccurredAt, row.Headline, []byte(row.Payload), + ON CONFLICT (id) DO NOTHING + RETURNING id`, + row.ID, + sourceGDELTSpike, + row.OccurredAt, + row.Headline, + []byte(row.Payload), ) - if err != nil { - return fmt.Errorf("insert gdelt spike %s: %w", row.ID, err) + if errors.Is(err, sql.ErrNoRows) { + return false, nil } - return nil + if err != nil { + return false, fmt.Errorf("insert gdelt spike %s: %w", row.ID, err) + } + return true, nil } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/heartbeat/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/heartbeat/collector_test.go index 5be60a8b..1ecf6eba 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/heartbeat/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/heartbeat/collector_test.go @@ -45,7 +45,10 @@ func TestCollector_EmitsAtInterval(t *testing.T) { Emitter: emitter, }) - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 200*time.Millisecond, + ) defer cancel() err := c.Run(ctx) @@ -64,9 +67,17 @@ func TestCollector_EmitsImmediatelyOnStart(t *testing.T) { Emitter: emitter, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.Equal(t, 1, emitter.Count(), "should emit one tick immediately on start") + require.Equal( + t, + 1, + emitter.Count(), + "should emit one tick immediately on start", + ) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/client.go index 364ca26e..24a7c998 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/client.go @@ -6,6 +6,7 @@ package iss import ( "context" "fmt" + "io" "strings" "time" @@ -97,21 +98,17 @@ func (c *Client) FetchTLE(ctx context.Context) (TLE, error) { } defer func() { _ = resp.Body.Close() }() - body := strings.Builder{} - buf := make([]byte, 1024) - for { - n, rerr := resp.Body.Read(buf) - if n > 0 { - body.Write(buf[:n]) - } - if rerr != nil { - break - } + body, err := io.ReadAll(resp.Body) + if err != nil { + return TLE{}, fmt.Errorf("read iss tle body: %w", err) } - lines := strings.Split(strings.TrimSpace(body.String()), "\n") + lines := strings.Split(strings.TrimSpace(string(body)), "\n") if len(lines) < 3 { - return TLE{}, fmt.Errorf("iss tle: expected 3 lines, got %d", len(lines)) + return TLE{}, fmt.Errorf( + "iss tle: expected 3 lines, got %d", + len(lines), + ) } return TLE{ Line1: strings.TrimRight(lines[1], " \r"), diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector.go index 36b27b4c..3c52abed 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector.go @@ -33,8 +33,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -92,7 +92,7 @@ func (c *Collector) tickPosition(ctx context.Context) { p, err := c.cfg.Fetcher.FetchPosition(ctx) if err != nil { c.logger.Warn("iss position fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } body, _ := json.Marshal(p) @@ -102,18 +102,18 @@ func (c *Collector) tickPosition(ctx context.Context) { Source: Name, Payload: json.RawMessage(body), }) - _ = c.cfg.State.RecordSuccess(ctx, Name, 1) + c.cfg.State.RecordSuccess(ctx, Name, 1) } func (c *Collector) tickTLE(ctx context.Context) { tle, err := c.cfg.Fetcher.FetchTLE(ctx) if err != nil { c.logger.Warn("iss tle fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } if err := c.cfg.TLEStore.Save(ctx, tle); err != nil { c.logger.Warn("iss tle save", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector_test.go index 07141ca3..c65a81f6 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/collector_test.go @@ -86,23 +86,28 @@ type recordingState struct { failures int } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *recordingState) RecordError(_ context.Context, _, _ string) error { +func (s *recordingState) RecordError(_ context.Context, _, _ string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ - return nil } func TestCollector_PositionLoopEmitsAndRecords(t *testing.T) { ftch := &fakeFetcher{ - pos: iss.Position{Latitude: 10, Longitude: 20, Altitude: 420, Velocity: 27500, Timestamp: 1234, FetchedAt: time.Now().UTC()}, + pos: iss.Position{ + Latitude: 10, + Longitude: 20, + Altitude: 420, + Velocity: 27500, + Timestamp: 1234, + FetchedAt: time.Now().UTC(), + }, tle: iss.TLE{Line1: "1 25544U ...", Line2: "2 25544 ..."}, } store := &fakeStore{} @@ -118,21 +123,34 @@ func TestCollector_PositionLoopEmitsAndRecords(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 70*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 70*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.GreaterOrEqual(t, ftch.posN, 2, "position should fire multiple times") + require.GreaterOrEqual( + t, + ftch.posN, + 2, + "position should fire multiple times", + ) require.GreaterOrEqual(t, emt.Count(), 2) for _, ev := range emt.events { require.Equal(t, events.TopicISSPosition, ev.Topic) } - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) } func TestCollector_TLELoopSavesToStore(t *testing.T) { ftch := &fakeFetcher{ - pos: iss.Position{Latitude: 10, Longitude: 20, Altitude: 420, FetchedAt: time.Now().UTC()}, + pos: iss.Position{ + Latitude: 10, + Longitude: 20, + Altitude: 420, + FetchedAt: time.Now().UTC(), + }, tle: iss.TLE{Line1: "1 25544U test", Line2: "2 25544 test"}, } store := &fakeStore{} @@ -148,11 +166,19 @@ func TestCollector_TLELoopSavesToStore(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 100*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.GreaterOrEqual(t, store.saves, 2, "TLE should refresh multiple times in 100ms with 30ms interval") + require.GreaterOrEqual( + t, + store.saves, + 2, + "TLE should refresh multiple times in 100ms with 30ms interval", + ) require.Equal(t, "1 25544U test", store.saved.Line1) } @@ -174,10 +200,13 @@ func TestCollector_PositionFetchErrorRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, emt.Count()) - require.Greater(t, st.failures, 0) + require.Positive(t, st.failures) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator.go index c446ab6f..55c53976 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator.go @@ -18,28 +18,68 @@ type Sat struct { func LoadTLE(line1, line2 string) (Sat, error) { if !strings.HasPrefix(line1, "1 ") || !strings.HasPrefix(line2, "2 ") { - return Sat{}, fmt.Errorf("invalid TLE: lines must start with '1 ' and '2 '") + return Sat{}, fmt.Errorf( + "invalid TLE: lines must start with '1 ' and '2 '", + ) } s := satellite.TLEToSat(line1, line2, satellite.GravityWGS84) if s.Error != 0 || s.ErrorStr != "" { - return Sat{}, fmt.Errorf("parse TLE: error %d / %s", s.Error, s.ErrorStr) + return Sat{}, fmt.Errorf( + "parse TLE: error %d / %s", + s.Error, + s.ErrorStr, + ) } return Sat{inner: s}, nil } func Propagate(s Sat, t time.Time) (lat, lon, altKm float64) { t = t.UTC() - pos, _ := satellite.Propagate(s.inner, t.Year(), int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second()) - gmst := satellite.GSTimeFromDate(t.Year(), int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second()) + pos, _ := satellite.Propagate( + s.inner, + t.Year(), + int(t.Month()), + t.Day(), + t.Hour(), + t.Minute(), + t.Second(), + ) + gmst := satellite.GSTimeFromDate( + t.Year(), + int(t.Month()), + t.Day(), + t.Hour(), + t.Minute(), + t.Second(), + ) altitude, _, ll := satellite.ECIToLLA(pos, gmst) deg := satellite.LatLongDeg(ll) return deg.Latitude, deg.Longitude, altitude } -func LookAngles(s Sat, t time.Time, observerLatDeg, observerLonDeg, observerAltKm float64) (azimuthDeg, elevationDeg, rangeKm float64) { +func LookAngles( + s Sat, + t time.Time, + observerLatDeg, observerLonDeg, observerAltKm float64, +) (azimuthDeg, elevationDeg, rangeKm float64) { t = t.UTC() - pos, _ := satellite.Propagate(s.inner, t.Year(), int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second()) - jday := satellite.JDay(t.Year(), int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second()) + pos, _ := satellite.Propagate( + s.inner, + t.Year(), + int(t.Month()), + t.Day(), + t.Hour(), + t.Minute(), + t.Second(), + ) + jday := satellite.JDay( + t.Year(), + int(t.Month()), + t.Day(), + t.Hour(), + t.Minute(), + t.Second(), + ) obs := satellite.LatLong{ Latitude: observerLatDeg * math.Pi / 180, Longitude: observerLonDeg * math.Pi / 180, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator_test.go index 3317e467..ed4e981e 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/iss/propagator_test.go @@ -19,8 +19,19 @@ func loadTLE(t *testing.T) (string, string) { body, err := os.ReadFile("testdata/tle.txt") require.NoError(t, err) lines := strings.Split(strings.TrimSpace(string(body)), "\n") - require.GreaterOrEqual(t, len(lines), 3, "TLE file must have name + 2 element lines") - return strings.TrimRight(lines[1], " \r"), strings.TrimRight(lines[2], " \r") + require.GreaterOrEqual( + t, + len(lines), + 3, + "TLE file must have name + 2 element lines", + ) + return strings.TrimRight( + lines[1], + " \r", + ), strings.TrimRight( + lines[2], + " \r", + ) } func TestPropagator_PositionWithinReasonableBounds(t *testing.T) { @@ -33,7 +44,12 @@ func TestPropagator_PositionWithinReasonableBounds(t *testing.T) { require.True(t, lat >= -90 && lat <= 90, "lat=%f", lat) require.True(t, lon >= -180 && lon <= 180, "lon=%f", lon) - require.True(t, alt >= 350 && alt <= 500, "ISS altitude is roughly 380-420 km, got %f", alt) + require.True( + t, + alt >= 350 && alt <= 500, + "ISS altitude is roughly 380-420 km, got %f", + alt, + ) } func TestPropagator_LookAnglesInValidRange(t *testing.T) { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/client_test.go index fc32d4ea..34beac94 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/client_test.go @@ -16,12 +16,14 @@ import ( ) func TestKEVClient_FetchCatalogDecodes(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - body, err := os.ReadFile("testdata/kev_catalog.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + body, err := os.ReadFile("testdata/kev_catalog.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() c := kev.NewClient(kev.ClientConfig{URL: srv.URL}) @@ -32,9 +34,11 @@ func TestKEVClient_FetchCatalogDecodes(t *testing.T) { } func TestKEVClient_RejectsServerError(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusBadRequest) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusBadRequest) + }), + ) defer srv.Close() c := kev.NewClient(kev.ClientConfig{URL: srv.URL}) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector.go index 167e3363..56914eeb 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector.go @@ -32,8 +32,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -82,7 +82,7 @@ func (c *Collector) tick(ctx context.Context) { cat, err := c.cfg.Fetcher.FetchCatalog(ctx) if err != nil { c.logger.Warn("kev fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -94,7 +94,7 @@ func (c *Collector) tick(ctx context.Context) { known, err := c.cfg.Repo.KnownIDs(ctx, ids) if err != nil { c.logger.Warn("kev known ids", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -136,5 +136,5 @@ func (c *Collector) tick(ctx context.Context) { }) emitted++ } - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector_test.go index faafc732..bcbd001a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/collector_test.go @@ -41,7 +41,10 @@ func (r *stubKEVRepo) Insert(_ context.Context, row kev.Row) error { return nil } -func (r *stubKEVRepo) KnownIDs(_ context.Context, ids []string) (map[string]bool, error) { +func (r *stubKEVRepo) KnownIDs( + _ context.Context, + ids []string, +) (map[string]bool, error) { r.mu.Lock() defer r.mu.Unlock() out := make(map[string]bool) @@ -82,8 +85,8 @@ func (e *stubKEVEmitter) Events() []events.Event { type stubKEVState struct{} -func (stubKEVState) RecordSuccess(context.Context, string, int64) error { return nil } -func (stubKEVState) RecordError(context.Context, string, string) error { return nil } +func (stubKEVState) RecordSuccess(context.Context, string, int64) {} +func (stubKEVState) RecordError(context.Context, string, string) {} func TestCollector_OnlyEmitsNewKEVs(t *testing.T) { ftch := &stubFetcher{cat: kev.Catalog{Vulnerabilities: []kev.Vulnerability{ @@ -101,7 +104,10 @@ func TestCollector_OnlyEmitsNewKEVs(t *testing.T) { State: stubKEVState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -137,7 +143,10 @@ func TestCollector_EmptyKnownInsertsAll(t *testing.T) { State: stubKEVState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 30*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo.go index 75edabc3..796ec5f1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo.go @@ -52,13 +52,20 @@ func (r *Repo) Insert(ctx context.Context, row Row) error { return nil } -func (r *Repo) KnownIDs(ctx context.Context, ids []string) (map[string]bool, error) { +func (r *Repo) KnownIDs( + ctx context.Context, + ids []string, +) (map[string]bool, error) { if len(ids) == 0 { return map[string]bool{}, nil } var found []string - if err := r.db.SelectContext(ctx, &found, - `SELECT cve_id FROM kev_entries WHERE cve_id = ANY($1::text[])`, pq.Array(ids)); err != nil { + if err := r.db.SelectContext( + ctx, + &found, + `SELECT cve_id FROM kev_entries WHERE cve_id = ANY($1::text[])`, + pq.Array(ids), + ); err != nil { return nil, fmt.Errorf("kev known ids: %w", err) } out := make(map[string]bool, len(found)) @@ -70,8 +77,32 @@ func (r *Repo) KnownIDs(ctx context.Context, ids []string) (map[string]bool, err func (r *Repo) Count(ctx context.Context) (int64, error) { var n int64 - if err := r.db.GetContext(ctx, &n, `SELECT count(*) FROM kev_entries`); err != nil { + if err := r.db.GetContext( + ctx, + &n, + `SELECT count(*) FROM kev_entries`, + ); err != nil { return 0, fmt.Errorf("kev count: %w", err) } return n, nil } + +func (r *Repo) RecentByDateAdded( + ctx context.Context, + limit int, +) ([]Row, error) { + if limit <= 0 { + limit = 50 + } + var rows []Row + err := r.db.SelectContext(ctx, &rows, ` + SELECT cve_id, vendor, product, vulnerability_name, date_added, due_date, + ransomware_use, payload + FROM kev_entries + ORDER BY date_added DESC, cve_id DESC + LIMIT $1`, limit) + if err != nil { + return nil, fmt.Errorf("recent kev: %w", err) + } + return rows, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo_test.go index 2cda2b07..fe459437 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/kev/repo_test.go @@ -69,7 +69,10 @@ func TestRepo_InsertAndKnownIDs(t *testing.T) { Payload: json.RawMessage(`{"cveID":"CVE-2024-3094"}`), })) - known, err := repo.KnownIDs(ctx, []string{"CVE-2024-3094", "CVE-2024-MISSING"}) + known, err := repo.KnownIDs( + ctx, + []string{"CVE-2024-3094", "CVE-2024-MISSING"}, + ) require.NoError(t, err) require.True(t, known["CVE-2024-3094"]) require.False(t, known["CVE-2024-MISSING"]) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client.go index eec9d944..61205939 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client.go @@ -59,7 +59,12 @@ type Victim struct { } func (v Victim) ID() string { - h := sha256.Sum256([]byte(v.PostTitle + "|" + v.GroupName + "|" + v.Discovered.UTC().Format(time.RFC3339))) + h := sha256.Sum256( + []byte( + v.PostTitle + "|" + v.GroupName + "|" + v.Discovered.UTC(). + Format(time.RFC3339), + ), + ) return hex.EncodeToString(h[:idHashBytes]) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client_test.go index 063ce9bb..47bae130 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/client_test.go @@ -17,12 +17,14 @@ import ( ) func TestClient_FetchRecentVictimsDecodes(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - body, err := os.ReadFile("testdata/recentvictims.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + body, err := os.ReadFile("testdata/recentvictims.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() c := ransomware.NewClient(ransomware.ClientConfig{BaseURL: srv.URL}) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector.go index 684c0483..74e158ae 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector.go @@ -31,8 +31,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -81,7 +81,7 @@ func (c *Collector) tick(ctx context.Context) { vs, err := c.cfg.Fetcher.FetchRecent(ctx) if err != nil { c.logger.Warn("ransomware fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -93,7 +93,7 @@ func (c *Collector) tick(ctx context.Context) { known, err := c.cfg.Repo.KnownIDs(ctx, ids) if err != nil { c.logger.Warn("ransomware known ids", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -129,5 +129,5 @@ func (c *Collector) tick(ctx context.Context) { }) emitted++ } - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector_test.go index 1651161f..6889b234 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/collector_test.go @@ -19,7 +19,9 @@ type stubFetcher struct { victims []ransomware.Victim } -func (s *stubFetcher) FetchRecent(context.Context) ([]ransomware.Victim, error) { +func (s *stubFetcher) FetchRecent( + context.Context, +) ([]ransomware.Victim, error) { return s.victims, nil } @@ -40,7 +42,10 @@ func (r *stubRansomRepo) Insert(_ context.Context, row ransomware.Row) error { return nil } -func (r *stubRansomRepo) KnownIDs(_ context.Context, ids []string) (map[string]bool, error) { +func (r *stubRansomRepo) KnownIDs( + _ context.Context, + ids []string, +) (map[string]bool, error) { r.mu.Lock() defer r.mu.Unlock() out := make(map[string]bool) @@ -81,14 +86,26 @@ func (e *stubRansomEmitter) Events() []events.Event { type stubRansomState struct{} -func (stubRansomState) RecordSuccess(context.Context, string, int64) error { return nil } -func (stubRansomState) RecordError(context.Context, string, string) error { return nil } +func (stubRansomState) RecordSuccess(context.Context, string, int64) {} +func (stubRansomState) RecordError(context.Context, string, string) {} func TestCollector_OnlyEmitsNewVictims(t *testing.T) { now := time.Now().UTC() - known := ransomware.Victim{PostTitle: "Old", GroupName: "lockbit", Discovered: now.Add(-time.Hour)} - new1 := ransomware.Victim{PostTitle: "Acme", GroupName: "blackcat", Discovered: now} - new2 := ransomware.Victim{PostTitle: "Banco", GroupName: "play", Discovered: now} + known := ransomware.Victim{ + PostTitle: "Old", + GroupName: "lockbit", + Discovered: now.Add(-time.Hour), + } + new1 := ransomware.Victim{ + PostTitle: "Acme", + GroupName: "blackcat", + Discovered: now, + } + new2 := ransomware.Victim{ + PostTitle: "Banco", + GroupName: "play", + Discovered: now, + } ftch := &stubFetcher{victims: []ransomware.Victim{known, new1, new2}} repo := &stubRansomRepo{known: map[string]bool{known.ID(): true}} @@ -102,7 +119,10 @@ func TestCollector_OnlyEmitsNewVictims(t *testing.T) { State: stubRansomState{}, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/repo.go index 3c03d231..fd957f57 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/ransomware/repo.go @@ -30,12 +30,20 @@ type Repo struct { func NewRepo(db *sqlx.DB) *Repo { return &Repo{db: db} } func (r *Repo) Insert(ctx context.Context, row Row) error { - _, err := r.db.ExecContext(ctx, ` + _, err := r.db.ExecContext( + ctx, + ` INSERT INTO ransomware_victims (id, post_title, group_name, discovered_at, country, sector, payload) VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT (id) DO NOTHING`, - row.ID, row.PostTitle, row.GroupName, row.DiscoveredAt, row.Country, row.Sector, []byte(row.Payload), + row.ID, + row.PostTitle, + row.GroupName, + row.DiscoveredAt, + row.Country, + row.Sector, + []byte(row.Payload), ) if err != nil { return fmt.Errorf("insert ransom %s: %w", row.ID, err) @@ -43,13 +51,20 @@ func (r *Repo) Insert(ctx context.Context, row Row) error { return nil } -func (r *Repo) KnownIDs(ctx context.Context, ids []string) (map[string]bool, error) { +func (r *Repo) KnownIDs( + ctx context.Context, + ids []string, +) (map[string]bool, error) { if len(ids) == 0 { return map[string]bool{}, nil } var found []string - if err := r.db.SelectContext(ctx, &found, - `SELECT id FROM ransomware_victims WHERE id = ANY($1::text[])`, pq.Array(ids)); err != nil { + if err := r.db.SelectContext( + ctx, + &found, + `SELECT id FROM ransomware_victims WHERE id = ANY($1::text[])`, + pq.Array(ids), + ); err != nil { return nil, fmt.Errorf("ransom known ids: %w", err) } out := make(map[string]bool, len(found)) @@ -58,3 +73,19 @@ func (r *Repo) KnownIDs(ctx context.Context, ids []string) (map[string]bool, err } return out, nil } + +func (r *Repo) Recent(ctx context.Context, limit int) ([]Row, error) { + if limit <= 0 { + limit = 50 + } + var rows []Row + err := r.db.SelectContext(ctx, &rows, ` + SELECT id, post_title, group_name, discovered_at, country, sector, payload + FROM ransomware_victims + ORDER BY discovered_at DESC + LIMIT $1`, limit) + if err != nil { + return nil, fmt.Errorf("recent ransomware: %w", err) + } + return rows, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo.go index f6852132..ef2a9963 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo.go @@ -5,7 +5,7 @@ package state import ( "context" - "fmt" + "log/slog" "time" "github.com/jmoiron/sqlx" @@ -29,12 +29,26 @@ type Row struct { } type Repo struct { - db *sqlx.DB + db *sqlx.DB + logger *slog.Logger } -func NewRepo(db *sqlx.DB) *Repo { return &Repo{db: db} } +func NewRepo(db *sqlx.DB) *Repo { + return &Repo{db: db, logger: slog.Default()} +} -func (r *Repo) RecordSuccess(ctx context.Context, name string, eventCount int64) error { +func NewRepoWithLogger(db *sqlx.DB, logger *slog.Logger) *Repo { + if logger == nil { + logger = slog.Default() + } + return &Repo{db: db, logger: logger} +} + +func (r *Repo) RecordSuccess( + ctx context.Context, + name string, + eventCount int64, +) { _, err := r.db.ExecContext(ctx, ` INSERT INTO collector_state (name, state, last_success_at, last_event_count, updated_at) VALUES ($1, $2, now(), $3, now()) @@ -46,12 +60,12 @@ func (r *Repo) RecordSuccess(ctx context.Context, name string, eventCount int64) name, StateHealthy, eventCount, ) if err != nil { - return fmt.Errorf("upsert healthy %s: %w", name, err) + r.logger.Warn("collector_state record success failed", + "collector", name, "err", err) } - return nil } -func (r *Repo) RecordError(ctx context.Context, name, errMsg string) error { +func (r *Repo) RecordError(ctx context.Context, name, errMsg string) { _, err := r.db.ExecContext(ctx, ` INSERT INTO collector_state (name, state, last_error_at, last_error, updated_at) VALUES ($1, $2, now(), $3, now()) @@ -63,21 +77,21 @@ func (r *Repo) RecordError(ctx context.Context, name, errMsg string) error { name, StateDegraded, errMsg, ) if err != nil { - return fmt.Errorf("upsert degraded %s: %w", name, err) + r.logger.Warn("collector_state record error failed", + "collector", name, "err", err) } - return nil } -func (r *Repo) Get(ctx context.Context, name string) (Row, error) { +func (r *Repo) Get(ctx context.Context, name string) (Row, bool, error) { var row Row err := r.db.GetContext(ctx, &row, ` SELECT name, state, last_success_at, last_error_at, last_error, last_event_count, updated_at FROM collector_state WHERE name = $1`, name) if err != nil { - return Row{}, fmt.Errorf("get state %s: %w", name, err) + return Row{}, false, err } - return row, nil + return row, true, nil } func (r *Repo) All(ctx context.Context) ([]Row, error) { @@ -87,7 +101,7 @@ func (r *Repo) All(ctx context.Context) ([]Row, error) { last_event_count, updated_at FROM collector_state ORDER BY name`) if err != nil { - return nil, fmt.Errorf("select all collector_state: %w", err) + return nil, err } return rows, nil } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo_test.go index 0b186c40..96a68d89 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/state/repo_test.go @@ -59,20 +59,22 @@ func TestRepo_RecordSuccessThenError(t *testing.T) { repo := state.NewRepo(db) ctx := context.Background() - require.NoError(t, repo.RecordSuccess(ctx, "dshield", 12)) + repo.RecordSuccess(ctx, "dshield", 12) - got, err := repo.Get(ctx, "dshield") + got, found, err := repo.Get(ctx, "dshield") require.NoError(t, err) + require.True(t, found) require.Equal(t, "dshield", got.Name) require.Equal(t, state.StateHealthy, got.State) require.EqualValues(t, 12, got.LastEventCount) require.NotNil(t, got.LastSuccessAt) require.WithinDuration(t, time.Now(), *got.LastSuccessAt, 5*time.Second) - require.NoError(t, repo.RecordError(ctx, "dshield", "upstream 503")) + repo.RecordError(ctx, "dshield", "upstream 503") - got, err = repo.Get(ctx, "dshield") + got, found, err = repo.Get(ctx, "dshield") require.NoError(t, err) + require.True(t, found) require.Equal(t, state.StateDegraded, got.State) require.Equal(t, "upstream 503", got.LastError) require.NotNil(t, got.LastErrorAt) @@ -84,11 +86,12 @@ func TestRepo_SuccessAccumulatesCount(t *testing.T) { repo := state.NewRepo(db) ctx := context.Background() - require.NoError(t, repo.RecordSuccess(ctx, "kev", 3)) - require.NoError(t, repo.RecordSuccess(ctx, "kev", 5)) + repo.RecordSuccess(ctx, "kev", 3) + repo.RecordSuccess(ctx, "kev", 5) - got, err := repo.Get(ctx, "kev") + got, found, err := repo.Get(ctx, "kev") require.NoError(t, err) + require.True(t, found) require.EqualValues(t, 8, got.LastEventCount) } @@ -97,9 +100,9 @@ func TestRepo_AllReturnsRowsSorted(t *testing.T) { repo := state.NewRepo(db) ctx := context.Background() - require.NoError(t, repo.RecordSuccess(ctx, "ransomware", 1)) - require.NoError(t, repo.RecordSuccess(ctx, "cve", 1)) - require.NoError(t, repo.RecordSuccess(ctx, "kev", 1)) + repo.RecordSuccess(ctx, "ransomware", 1) + repo.RecordSuccess(ctx, "cve", 1) + repo.RecordSuccess(ctx, "kev", 1) rows, err := repo.All(ctx) require.NoError(t, err) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client.go index 5a9104b1..4a293f94 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client.go @@ -204,7 +204,10 @@ func (c *Client) FetchAlerts(ctx context.Context) ([]AlertItem, error) { return out, nil } -func (c *Client) fetchRowArray(ctx context.Context, path string) ([]map[string]string, error) { +func (c *Client) fetchRowArray( + ctx context.Context, + path string, +) ([]map[string]string, error) { var raw [][]any if err := c.hx.GetJSON(ctx, path, nil, &raw); err != nil { return nil, fmt.Errorf("fetch row-array %s: %w", path, err) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client_test.go index ccf699e8..3bb76f70 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/client_test.go @@ -17,18 +17,20 @@ import ( "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/swpc" ) -func newFakeServer(t *testing.T, route string, fixture string) *httptest.Server { +func newFakeServer(t *testing.T, route, fixture string) *httptest.Server { t.Helper() body, err := os.ReadFile("testdata/" + fixture) require.NoError(t, err) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if !strings.Contains(r.URL.Path, route) { - http.Error(w, "not found", http.StatusNotFound) - return - } - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.URL.Path, route) { + http.Error(w, "not found", http.StatusNotFound) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) t.Cleanup(srv.Close) return srv } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector.go index b92177ac..f1062baf 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector.go @@ -49,8 +49,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -115,28 +115,28 @@ func (c *Collector) tickFast(ctx context.Context) { if n, err := c.pushPlasma(ctx); err != nil { c.logger.Warn("swpc plasma", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { pushed += n } if n, err := c.pushMag(ctx); err != nil { c.logger.Warn("swpc mag", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { pushed += n } if n, err := c.pushXray(ctx); err != nil { c.logger.Warn("swpc xray", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { pushed += n } if n, err := c.pushAlerts(ctx); err != nil { c.logger.Warn("swpc alerts", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) hadError = true } else { pushed += n @@ -147,7 +147,7 @@ func (c *Collector) tickFast(ctx context.Context) { } if !hadError { - _ = c.cfg.State.RecordSuccess(ctx, Name, pushed) + c.cfg.State.RecordSuccess(ctx, Name, pushed) } } @@ -155,7 +155,7 @@ func (c *Collector) tickSlow(ctx context.Context) { n, err := c.pushKp(ctx) if err != nil { c.logger.Warn("swpc kp", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } if n > 0 { @@ -208,10 +208,19 @@ func (c *Collector) pushPlasma(ctx context.Context) (int64, error) { if err != nil { return 0, err } - if latest := lastNonZero(rows, func(r PlasmaTick) bool { return !r.TimeTag.IsZero() }); latest != nil { + if latest := lastNonZero( + rows, + func(r PlasmaTick) bool { return !r.TimeTag.IsZero() }, + ); latest != nil { c.latestPlasma = latest } - return pushAll(ctx, c.cfg.Ring, keyPlasma, rows, func(r PlasmaTick) int64 { return r.TimeTag.UnixMilli() }) + return pushAll( + ctx, + c.cfg.Ring, + keyPlasma, + rows, + func(r PlasmaTick) int64 { return r.TimeTag.UnixMilli() }, + ) } func (c *Collector) pushMag(ctx context.Context) (int64, error) { @@ -219,10 +228,19 @@ func (c *Collector) pushMag(ctx context.Context) (int64, error) { if err != nil { return 0, err } - if latest := lastNonZero(rows, func(r MagTick) bool { return !r.TimeTag.IsZero() }); latest != nil { + if latest := lastNonZero( + rows, + func(r MagTick) bool { return !r.TimeTag.IsZero() }, + ); latest != nil { c.latestMag = latest } - return pushAll(ctx, c.cfg.Ring, keyMag, rows, func(r MagTick) int64 { return r.TimeTag.UnixMilli() }) + return pushAll( + ctx, + c.cfg.Ring, + keyMag, + rows, + func(r MagTick) int64 { return r.TimeTag.UnixMilli() }, + ) } func (c *Collector) pushKp(ctx context.Context) (int64, error) { @@ -230,10 +248,19 @@ func (c *Collector) pushKp(ctx context.Context) (int64, error) { if err != nil { return 0, err } - if latest := lastNonZero(rows, func(r KpTick) bool { return !r.TimeTag.IsZero() }); latest != nil { + if latest := lastNonZero( + rows, + func(r KpTick) bool { return !r.TimeTag.IsZero() }, + ); latest != nil { c.latestKp = latest } - return pushAll(ctx, c.cfg.Ring, keyKp, rows, func(r KpTick) int64 { return r.TimeTag.UnixMilli() }) + return pushAll( + ctx, + c.cfg.Ring, + keyKp, + rows, + func(r KpTick) int64 { return r.TimeTag.UnixMilli() }, + ) } func (c *Collector) pushXray(ctx context.Context) (int64, error) { @@ -241,10 +268,19 @@ func (c *Collector) pushXray(ctx context.Context) (int64, error) { if err != nil { return 0, err } - if latest := lastNonZero(rows, func(r XrayTick) bool { return !r.TimeTag.IsZero() }); latest != nil { + if latest := lastNonZero( + rows, + func(r XrayTick) bool { return !r.TimeTag.IsZero() }, + ); latest != nil { c.latestXray = latest } - return pushAll(ctx, c.cfg.Ring, keyXray, rows, func(r XrayTick) int64 { return r.TimeTag.UnixMilli() }) + return pushAll( + ctx, + c.cfg.Ring, + keyXray, + rows, + func(r XrayTick) int64 { return r.TimeTag.UnixMilli() }, + ) } func (c *Collector) pushAlerts(ctx context.Context) (int64, error) { @@ -252,10 +288,22 @@ func (c *Collector) pushAlerts(ctx context.Context) (int64, error) { if err != nil { return 0, err } - return pushAll(ctx, c.cfg.Ring, keyAlerts, rows, func(r AlertItem) int64 { return r.IssueDatetime.UnixMilli() }) + return pushAll( + ctx, + c.cfg.Ring, + keyAlerts, + rows, + func(r AlertItem) int64 { return r.IssueDatetime.UnixMilli() }, + ) } -func pushAll[T any](ctx context.Context, ring Ring, key string, rows []T, score func(T) int64) (int64, error) { +func pushAll[T any]( + ctx context.Context, + ring Ring, + key string, + rows []T, + score func(T) int64, +) (int64, error) { pushed := int64(0) for _, r := range rows { s := score(r) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector_test.go index 1a950a13..dbfbec1b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/swpc/collector_test.go @@ -26,14 +26,28 @@ type fakeFetcher struct { err error } -func (f *fakeFetcher) FetchPlasma(_ context.Context) ([]swpc.PlasmaTick, error) { +func (f *fakeFetcher) FetchPlasma( + _ context.Context, +) ([]swpc.PlasmaTick, error) { return f.plasma, f.err } -func (f *fakeFetcher) FetchMag(_ context.Context) ([]swpc.MagTick, error) { return f.mag, f.err } -func (f *fakeFetcher) FetchKp(_ context.Context) ([]swpc.KpTick, error) { return f.kp, f.err } + +func (f *fakeFetcher) FetchMag( + _ context.Context, +) ([]swpc.MagTick, error) { + return f.mag, f.err +} + +func (f *fakeFetcher) FetchKp( + _ context.Context, +) ([]swpc.KpTick, error) { + return f.kp, f.err +} + func (f *fakeFetcher) FetchXray(_ context.Context) ([]swpc.XrayTick, error) { return f.xray, f.err } + func (f *fakeFetcher) FetchAlerts(_ context.Context) ([]swpc.AlertItem, error) { return f.alerts, f.err } @@ -43,7 +57,12 @@ type fakeRing struct { pushes map[string]int } -func (r *fakeRing) Push(_ context.Context, key string, _ int64, _ []byte) error { +func (r *fakeRing) Push( + _ context.Context, + key string, + _ int64, + _ []byte, +) error { r.mu.Lock() defer r.mu.Unlock() if r.pushes == nil { @@ -82,28 +101,32 @@ type recordingState struct { failures int } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *recordingState) RecordError(_ context.Context, _, _ string) error { +func (s *recordingState) RecordError(_ context.Context, _, _ string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ - return nil } func TestCollector_FastTickPushesToRingsAndEmits(t *testing.T) { now := time.Now().UTC() ftch := &fakeFetcher{ - plasma: []swpc.PlasmaTick{{TimeTag: now, Density: "2.94", Speed: "450", Temperature: "93030"}}, - mag: []swpc.MagTick{{TimeTag: now, Bt: "5.6"}}, - xray: []swpc.XrayTick{{TimeTag: now, Flux: 1e-7, Energy: "0.1-0.8nm"}}, - alerts: []swpc.AlertItem{{ProductID: "TIIA", IssueDatetime: now, Message: "test alert"}}, - kp: []swpc.KpTick{{TimeTag: now, Kp: 3.0}}, + plasma: []swpc.PlasmaTick{ + {TimeTag: now, Density: "2.94", Speed: "450", Temperature: "93030"}, + }, + mag: []swpc.MagTick{{TimeTag: now, Bt: "5.6"}}, + xray: []swpc.XrayTick{ + {TimeTag: now, Flux: 1e-7, Energy: "0.1-0.8nm"}, + }, + alerts: []swpc.AlertItem{ + {ProductID: "TIIA", IssueDatetime: now, Message: "test alert"}, + }, + kp: []swpc.KpTick{{TimeTag: now, Kp: 3.0}}, } ring := &fakeRing{} emt := &fakeEmitter{} @@ -118,7 +141,10 @@ func TestCollector_FastTickPushesToRingsAndEmits(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 80*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -132,7 +158,7 @@ func TestCollector_FastTickPushesToRingsAndEmits(t *testing.T) { for _, ev := range emt.events { require.Equal(t, events.TopicSpaceWeather, ev.Topic) } - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) require.Equal(t, 0, st.failures) } @@ -167,7 +193,10 @@ func TestCollector_EmitsRichPayloadWithLatestReadings(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 60*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -205,10 +234,13 @@ func TestCollector_FetchErrorsRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 60*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, ring.PushCount("swpc:plasma")) - require.Greater(t, st.failures, 0) + require.Positive(t, st.failures) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/client_test.go index 40d9d621..796bb6b1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/client_test.go @@ -20,10 +20,12 @@ func TestClient_FetchDecodesFeatures(t *testing.T) { body, err := os.ReadFile("testdata/2_5_day.geojson") require.NoError(t, err) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/geo+json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/geo+json") + _, _ = w.Write(body) + }), + ) defer srv.Close() c := usgs.NewClient(usgs.ClientConfig{BaseURL: srv.URL}) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector.go index 68cdb5a5..7ce3734f 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector.go @@ -32,8 +32,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -80,7 +80,7 @@ func (c *Collector) tick(ctx context.Context) { feed, err := c.cfg.Fetcher.Fetch(ctx) if err != nil { c.logger.Warn("usgs fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -91,7 +91,7 @@ func (c *Collector) tick(ctx context.Context) { known, err := c.cfg.Repo.KnownIDs(ctx, ids) if err != nil { c.logger.Warn("usgs known ids", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } @@ -124,7 +124,7 @@ func (c *Collector) tick(ctx context.Context) { }) emitted++ } - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } func coord(c []float64, i int) float64 { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector_test.go index d1711de0..9d9ee1c3 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/collector_test.go @@ -50,7 +50,10 @@ func (r *fakeRepo) Upsert(_ context.Context, row usgs.Row) error { return nil } -func (r *fakeRepo) KnownIDs(_ context.Context, ids []string) (map[string]bool, error) { +func (r *fakeRepo) KnownIDs( + _ context.Context, + ids []string, +) (map[string]bool, error) { r.mu.Lock() defer r.mu.Unlock() out := make(map[string]bool, len(ids)) @@ -92,28 +95,50 @@ type recordingState struct { lastErr string } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *recordingState) RecordError(_ context.Context, _, msg string) error { +func (s *recordingState) RecordError(_ context.Context, _, msg string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ s.lastErr = msg - return nil } func TestCollector_TickPersistsAndEmitsNewQuakes(t *testing.T) { feed := usgs.Feed{ Type: "FeatureCollection", Features: []usgs.Feature{ - {ID: "q1", Properties: usgs.Properties{Mag: 4.5, Place: "test 1", Time: time.Now().UnixMilli()}, Geometry: usgs.Geometry{Coordinates: []float64{-120, 49, 5}}}, - {ID: "q2", Properties: usgs.Properties{Mag: 6.5, Place: "test 2", Time: time.Now().UnixMilli()}, Geometry: usgs.Geometry{Coordinates: []float64{140, -30, 10}}}, - {ID: "q3", Properties: usgs.Properties{Mag: 3.0, Place: "test 3", Time: time.Now().UnixMilli()}, Geometry: usgs.Geometry{Coordinates: []float64{0, 0, 1}}}, + { + ID: "q1", + Properties: usgs.Properties{ + Mag: 4.5, + Place: "test 1", + Time: time.Now().UnixMilli(), + }, + Geometry: usgs.Geometry{Coordinates: []float64{-120, 49, 5}}, + }, + { + ID: "q2", + Properties: usgs.Properties{ + Mag: 6.5, + Place: "test 2", + Time: time.Now().UnixMilli(), + }, + Geometry: usgs.Geometry{Coordinates: []float64{140, -30, 10}}, + }, + { + ID: "q3", + Properties: usgs.Properties{ + Mag: 3.0, + Place: "test 3", + Time: time.Now().UnixMilli(), + }, + Geometry: usgs.Geometry{Coordinates: []float64{0, 0, 1}}, + }, }, } ftch := &fakeFetcher{feed: feed} @@ -129,17 +154,25 @@ func TestCollector_TickPersistsAndEmitsNewQuakes(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 70*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 70*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) - require.GreaterOrEqual(t, repo.Upserts(), 3, "should upsert all 3 features at least once") + require.GreaterOrEqual( + t, + repo.Upserts(), + 3, + "should upsert all 3 features at least once", + ) require.GreaterOrEqual(t, emt.Count(), 3, "should emit 3 new-event events") for _, ev := range emt.events { require.Equal(t, events.TopicEarthquake, ev.Topic) require.Equal(t, usgs.Name, ev.Source) } - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) require.Equal(t, 0, st.failures) } @@ -157,20 +190,30 @@ func TestCollector_FetchErrorRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, repo.Upserts()) require.Equal(t, 0, emt.Count()) - require.Greater(t, st.failures, 0) + require.Positive(t, st.failures) require.Contains(t, st.lastErr, "upstream 503") } func TestCollector_KnownQuakesNotReEmitted(t *testing.T) { feed := usgs.Feed{ Features: []usgs.Feature{ - {ID: "qx", Properties: usgs.Properties{Mag: 4.5, Time: time.Now().UnixMilli()}, Geometry: usgs.Geometry{Coordinates: []float64{0, 0, 1}}}, + { + ID: "qx", + Properties: usgs.Properties{ + Mag: 4.5, + Time: time.Now().UnixMilli(), + }, + Geometry: usgs.Geometry{Coordinates: []float64{0, 0, 1}}, + }, }, } ftch := &fakeFetcher{feed: feed} @@ -186,7 +229,10 @@ func TestCollector_KnownQuakesNotReEmitted(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo.go index a1d585e7..ce53a573 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo.go @@ -51,7 +51,10 @@ func (r *Repo) Upsert(ctx context.Context, row Row) error { return nil } -func (r *Repo) KnownIDs(ctx context.Context, ids []string) (map[string]bool, error) { +func (r *Repo) KnownIDs( + ctx context.Context, + ids []string, +) (map[string]bool, error) { out := make(map[string]bool, len(ids)) if len(ids) == 0 { return out, nil @@ -82,3 +85,19 @@ func (r *Repo) RecentByMag(ctx context.Context, limit int) ([]Row, error) { } return rows, nil } + +func (r *Repo) RecentByTime(ctx context.Context, limit int) ([]Row, error) { + if limit <= 0 { + limit = 50 + } + var rows []Row + err := r.db.SelectContext(ctx, &rows, ` + SELECT id, occurred_at, mag, place, geom_lon, geom_lat, depth_km, payload + FROM earthquakes + ORDER BY occurred_at DESC + LIMIT $1`, limit) + if err != nil { + return nil, fmt.Errorf("recent earthquakes by time: %w", err) + } + return rows, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo_test.go index 84c115e4..e17aa447 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/usgs/repo_test.go @@ -107,9 +107,30 @@ func TestRepo_RecentByMagOrdered(t *testing.T) { now := time.Now().UTC() rows := []usgs.Row{ - {ID: "small", OccurredAt: now, Mag: 4.5, GeomLon: 0, GeomLat: 0, Payload: json.RawMessage(`{}`)}, - {ID: "huge", OccurredAt: now, Mag: 7.8, GeomLon: 0, GeomLat: 0, Payload: json.RawMessage(`{}`)}, - {ID: "mid", OccurredAt: now, Mag: 6.0, GeomLon: 0, GeomLat: 0, Payload: json.RawMessage(`{}`)}, + { + ID: "small", + OccurredAt: now, + Mag: 4.5, + GeomLon: 0, + GeomLat: 0, + Payload: json.RawMessage(`{}`), + }, + { + ID: "huge", + OccurredAt: now, + Mag: 7.8, + GeomLon: 0, + GeomLat: 0, + Payload: json.RawMessage(`{}`), + }, + { + ID: "mid", + OccurredAt: now, + Mag: 6.0, + GeomLon: 0, + GeomLat: 0, + Payload: json.RawMessage(`{}`), + }, } for _, r := range rows { require.NoError(t, repo.Upsert(ctx, r)) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client.go index 5ba0c445..955194e1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client.go @@ -6,6 +6,7 @@ package wikipedia import ( "context" "fmt" + "io" "net/url" "time" @@ -60,16 +61,9 @@ func (c *Client) Fetch(ctx context.Context) (Response, error) { } defer func() { _ = resp.Body.Close() }() - body := make([]byte, 0, 32*1024) - buf := make([]byte, 4*1024) - for { - n, rerr := resp.Body.Read(buf) - if n > 0 { - body = append(body, buf[:n]...) - } - if rerr != nil { - break - } + body, err := io.ReadAll(resp.Body) + if err != nil { + return Response{}, fmt.Errorf("read wikipedia ITN body: %w", err) } return DecodeResponse(body) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client_test.go index 6732c28f..b6524f23 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/client_test.go @@ -20,13 +20,15 @@ func TestClient_FetchDecodesITNResponse(t *testing.T) { body, err := os.ReadFile("testdata/itn_response.json") require.NoError(t, err) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - require.Equal(t, "/w/api.php", r.URL.Path) - require.Equal(t, "parse", r.URL.Query().Get("action")) - require.Equal(t, "Template:In_the_news", r.URL.Query().Get("page")) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/w/api.php", r.URL.Path) + require.Equal(t, "parse", r.URL.Query().Get("action")) + require.Equal(t, "Template:In_the_news", r.URL.Query().Get("page")) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() c := wikipedia.NewClient(wikipedia.ClientConfig{BaseURL: srv.URL}) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector.go index 2262ed88..a6c4cc85 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector.go @@ -35,8 +35,8 @@ type Emitter interface { } type StateRecorder interface { - RecordSuccess(ctx context.Context, name string, eventCount int64) error - RecordError(ctx context.Context, name, errMsg string) error + RecordSuccess(ctx context.Context, name string, eventCount int64) + RecordError(ctx context.Context, name, errMsg string) } type CollectorConfig struct { @@ -83,18 +83,18 @@ func (c *Collector) tick(ctx context.Context) { resp, err := c.cfg.Fetcher.Fetch(ctx) if err != nil { c.logger.Warn("wikipedia fetch", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } last, found, err := c.cfg.Repo.LastRevID(ctx) if err != nil { c.logger.Warn("wikipedia revid lookup", "err", err) - _ = c.cfg.State.RecordError(ctx, Name, err.Error()) + c.cfg.State.RecordError(ctx, Name, err.Error()) return } if found && last == resp.RevID { - _ = c.cfg.State.RecordSuccess(ctx, Name, 0) + c.cfg.State.RecordSuccess(ctx, Name, 0) return } @@ -129,7 +129,7 @@ func (c *Collector) tick(ctx context.Context) { if err := c.cfg.Repo.RememberRevID(ctx, resp.RevID); err != nil { c.logger.Warn("wikipedia remember revid", "err", err) } - _ = c.cfg.State.RecordSuccess(ctx, Name, emitted) + c.cfg.State.RecordSuccess(ctx, Name, emitted) } func entryID(e ITNEntry) string { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector_test.go index 628fd9a8..15451c66 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/collector_test.go @@ -84,24 +84,25 @@ type recordingState struct { failures int } -func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) error { +func (s *recordingState) RecordSuccess(_ context.Context, _ string, _ int64) { s.mu.Lock() defer s.mu.Unlock() s.successes++ - return nil } -func (s *recordingState) RecordError(_ context.Context, _, _ string) error { +func (s *recordingState) RecordError(_ context.Context, _, _ string) { s.mu.Lock() defer s.mu.Unlock() s.failures++ - return nil } func TestCollector_NewRevidInsertsAndEmits(t *testing.T) { resp := wikipedia.Response{ RevID: 999, - HTML: ``, + HTML: `
    ` + + `
  • A long enough ITN headline mentioning subject A for context.
  • ` + + `
  • Another long enough ITN headline referencing subject B in the news.
  • ` + + `
`, } ftch := &fakeFetcher{resp: resp} repo := &fakeRepo{} @@ -116,7 +117,10 @@ func TestCollector_NewRevidInsertsAndEmits(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) @@ -125,7 +129,7 @@ func TestCollector_NewRevidInsertsAndEmits(t *testing.T) { for _, ev := range emt.events { require.Equal(t, events.TopicWikipediaITN, ev.Topic) } - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) } func TestCollector_RevIDUnchangedSkipsInsert(t *testing.T) { @@ -146,13 +150,16 @@ func TestCollector_RevIDUnchangedSkipsInsert(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, repo.Inserts()) require.Equal(t, 0, emt.Count()) - require.Greater(t, st.successes, 0) + require.Positive(t, st.successes) } func TestCollector_FetchErrorRecordsState(t *testing.T) { @@ -169,10 +176,13 @@ func TestCollector_FetchErrorRecordsState(t *testing.T) { State: st, }) - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + ctx, cancel := context.WithTimeout( + context.Background(), + 50*time.Millisecond, + ) defer cancel() _ = c.Run(ctx) require.Equal(t, 0, repo.Inserts()) - require.Greater(t, st.failures, 0) + require.Positive(t, st.failures) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser.go index 8c65ffce..6cde9e6a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser.go @@ -39,6 +39,8 @@ func DecodeResponse(body []byte) (Response, error) { return Response{RevID: r.Parse.RevID, HTML: r.Parse.Text.Star}, nil } +const minEntryLen = 50 + func ParseEntries(html string) []ITNEntry { if strings.TrimSpace(html) == "" { return nil @@ -50,16 +52,19 @@ func ParseEntries(html string) []ITNEntry { var out []ITNEntry doc.Find("ul li").Each(func(_ int, s *goquery.Selection) { text := strings.TrimSpace(s.Text()) - if text == "" { + if text == "" || len(text) < minEntryLen || + !strings.Contains(text, " ") { return } - entry := ITNEntry{Text: text} - if href, ok := s.Find("a").First().Attr("href"); ok { - if slug := slugFromHref(href); slug != "" { - entry.ArticleSlug = slug - } + href, ok := s.Find("a").First().Attr("href") + if !ok { + return } - out = append(out, entry) + slug := slugFromHref(href) + if slug == "" { + return + } + out = append(out, ITNEntry{Text: text, ArticleSlug: slug}) }) return out } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser_test.go index ea0d46d7..901ec9bd 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/parser_test.go @@ -41,18 +41,24 @@ func TestParser_HandlesEmptyHTML(t *testing.T) { } func TestParser_StripsHTMLTagsFromText(t *testing.T) { - entries := wikipedia.ParseEntries(`
  • Plain bold headline with link.
`) + entries := wikipedia.ParseEntries( + `
  • A reasonably long ITN-style sentence with bold and an inline linked phrase for context.
`, + ) require.Len(t, entries, 1) - require.Contains(t, entries[0].Text, "Plain") - require.Contains(t, entries[0].Text, "bold") - require.Contains(t, entries[0].Text, "link") + require.Contains(t, entries[0].Text, "linked phrase") require.NotContains(t, entries[0].Text, "") require.Equal(t, "Topic", entries[0].ArticleSlug) } func TestParser_SkipsListItemsWithoutLinks(t *testing.T) { - entries := wikipedia.ParseEntries(`
  • Has link
  • No link here
`) - require.Len(t, entries, 2) + entries := wikipedia.ParseEntries( + `
  • A long enough sentence with an actual linked article reference embedded.
  • Another long sentence that contains no link element at all in the body text.
`, + ) + require.Len( + t, + entries, + 1, + "items without an article slug should be filtered out", + ) require.Equal(t, "Foo", entries[0].ArticleSlug) - require.Empty(t, entries[1].ArticleSlug) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/repo.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/repo.go index 7a710728..913ad301 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/repo.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/collectors/wikipedia/repo.go @@ -37,7 +37,8 @@ func NewRepo(db *sqlx.DB, rdb *redis.Client) *Repo { } func (r *Repo) RememberRevID(ctx context.Context, revID int64) error { - if err := r.rdb.Set(ctx, keyRevID, strconv.FormatInt(revID, 10), 0).Err(); err != nil { + if err := r.rdb.Set(ctx, keyRevID, strconv.FormatInt(revID, 10), 0). + Err(); err != nil { return fmt.Errorf("save wiki revid: %w", err) } return nil diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/config/config.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/config/config.go index 5e69a76d..2d0d114a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/config/config.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/config/config.go @@ -15,16 +15,17 @@ import ( ) type Config struct { - App AppConfig `koanf:"app"` - Server ServerConfig `koanf:"server"` - Database DatabaseConfig `koanf:"database"` - Redis RedisConfig `koanf:"redis"` - JWT JWTConfig `koanf:"jwt"` - RateLimit RateLimitConfig `koanf:"rate_limit"` - CORS CORSConfig `koanf:"cors"` - Log LogConfig `koanf:"log"` - Otel OtelConfig `koanf:"otel"` - Collectors CollectorsConfig `koanf:"collectors"` + App AppConfig `koanf:"app"` + Server ServerConfig `koanf:"server"` + Database DatabaseConfig `koanf:"database"` + Redis RedisConfig `koanf:"redis"` + JWT JWTConfig `koanf:"jwt"` + RateLimit RateLimitConfig `koanf:"rate_limit"` + CORS CORSConfig `koanf:"cors"` + Log LogConfig `koanf:"log"` + Otel OtelConfig `koanf:"otel"` + Collectors CollectorsConfig `koanf:"collectors"` + Notifications NotificationsConfig `koanf:"notifications"` } type CollectorsConfig struct { @@ -95,15 +96,24 @@ type AppConfig struct { Name string `koanf:"name"` Version string `koanf:"version"` Environment string `koanf:"environment"` + PublicURL string `koanf:"public_url"` + AdminEmail string `koanf:"admin_email"` +} + +type NotificationsConfig struct { + EncryptionKey string `koanf:"encryption_key"` } type ServerConfig struct { - Host string `koanf:"host"` - Port int `koanf:"port"` - ReadTimeout time.Duration `koanf:"read_timeout"` - WriteTimeout time.Duration `koanf:"write_timeout"` - IdleTimeout time.Duration `koanf:"idle_timeout"` - ShutdownTimeout time.Duration `koanf:"shutdown_timeout"` + Host string `koanf:"host"` + Port int `koanf:"port"` + ReadTimeout time.Duration `koanf:"read_timeout"` + WriteTimeout time.Duration `koanf:"write_timeout"` + IdleTimeout time.Duration `koanf:"idle_timeout"` + ShutdownTimeout time.Duration `koanf:"shutdown_timeout"` + TrustedProxyHops int `koanf:"trusted_proxy_hops"` + WSMaxConnsPerIP int `koanf:"ws_max_conns_per_ip"` + WSMaxSubscribers int `koanf:"ws_max_subscribers"` } type DatabaseConfig struct { @@ -173,13 +183,19 @@ func Load(configPath string) (*Config, error) { } if configPath != "" { - if err := k.Load(file.Provider(configPath), yaml.Parser()); err != nil { + if err := k.Load( + file.Provider(configPath), + yaml.Parser(), + ); err != nil { loadErr = fmt.Errorf("load config file: %w", err) return } } - if err := k.Load(env.Provider("", ".", envKeyReplacer), nil); err != nil { + if err := k.Load( + env.Provider("", ".", envKeyReplacer), + nil, + ); err != nil { loadErr = fmt.Errorf("load env vars: %w", err) return } @@ -216,12 +232,15 @@ func loadDefaults(k *koanf.Koanf) error { "app.version": "1.0.0", "app.environment": "development", - "server.host": "0.0.0.0", - "server.port": 8080, - "server.read_timeout": "30s", - "server.write_timeout": "30s", - "server.idle_timeout": "120s", - "server.shutdown_timeout": "15s", + "server.host": "0.0.0.0", + "server.port": 8080, + "server.read_timeout": "30s", + "server.write_timeout": "30s", + "server.idle_timeout": "120s", + "server.shutdown_timeout": "15s", + "server.trusted_proxy_hops": 0, + "server.ws_max_conns_per_ip": 25, + "server.ws_max_subscribers": 5000, "database.max_open_conns": 25, "database.max_idle_conns": 5, @@ -274,8 +293,8 @@ func loadDefaults(k *koanf.Koanf) error { "collectors.cfradar.interval": "5m", "collectors.cfradar.min_confidence": 7, "collectors.cve.enabled": true, - "collectors.cve.interval": "2h", - "collectors.cve.window": "2h", + "collectors.cve.interval": "5m", + "collectors.cve.window": "6m", "collectors.kev.enabled": true, "collectors.kev.interval": "1h", "collectors.ransomware.enabled": true, @@ -315,6 +334,9 @@ var envKeyMap = map[string]string{ "ENVIRONMENT": "app.environment", "HOST": "server.host", "PORT": "server.port", + "TRUSTED_PROXY_HOPS": "server.trusted_proxy_hops", + "WS_MAX_CONNS_PER_IP": "server.ws_max_conns_per_ip", + "WS_MAX_SUBSCRIBERS": "server.ws_max_subscribers", "LOG_LEVEL": "log.level", "LOG_FORMAT": "log.format", "JWT_PRIVATE_KEY_PATH": "jwt.private_key_path", @@ -336,6 +358,9 @@ var envKeyMap = map[string]string{ "CF_RADAR_TOKEN": "collectors.cfradar.bearer_token", "GREYNOISE_API_KEY": "collectors.greynoise.api_key", "ABUSEIPDB_API_KEY": "collectors.abuseipdb.api_key", + "NOTIFICATION_ENCRYPTION_KEY": "notifications.encryption_key", + "PUBLIC_URL": "app.public_url", + "ADMIN_EMAIL": "app.admin_email", } func envKeyReplacer(s string) string { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/core/telemetry.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/core/telemetry.go index a03220b1..737ca1d5 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/core/telemetry.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/core/telemetry.go @@ -51,7 +51,12 @@ func NewTelemetry( otlptracegrpc.WithTLSCredentials(insecure.NewCredentials()), ) } else { - opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))) + opts = append( + opts, + otlptracegrpc.WithTLSCredentials( + credentials.NewClientTLSFromCert(nil, ""), + ), + ) } exporter, err := otlptracegrpc.New(ctx, opts...) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/abuseipdb/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/abuseipdb/client_test.go index c3b7332d..8128b0d1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/abuseipdb/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/abuseipdb/client_test.go @@ -16,19 +16,23 @@ import ( ) func TestClient_LookupDecodesVerdict(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - require.Equal(t, "/api/v2/check", r.URL.Path) - require.Equal(t, "118.25.6.39", r.URL.Query().Get("ipAddress")) - require.Equal(t, "90", r.URL.Query().Get("maxAgeInDays")) - require.Equal(t, "test-key", r.Header.Get("Key")) - body, err := os.ReadFile("testdata/check_lookup.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/api/v2/check", r.URL.Path) + require.Equal(t, "118.25.6.39", r.URL.Query().Get("ipAddress")) + require.Equal(t, "90", r.URL.Query().Get("maxAgeInDays")) + require.Equal(t, "test-key", r.Header.Get("Key")) + body, err := os.ReadFile("testdata/check_lookup.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() - c := abuseipdb.NewClient(abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "test-key"}) + c := abuseipdb.NewClient( + abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "test-key"}, + ) v, err := c.Lookup(context.Background(), "118.25.6.39") require.NoError(t, err) require.Equal(t, "118.25.6.39", v.IPAddress) @@ -38,24 +42,32 @@ func TestClient_LookupDecodesVerdict(t *testing.T) { } func TestClient_LookupReturnsErrUnknownIPOn404(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusNotFound) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusNotFound) + }), + ) defer srv.Close() - c := abuseipdb.NewClient(abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "k"}) + c := abuseipdb.NewClient( + abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "k"}, + ) _, err := c.Lookup(context.Background(), "10.0.0.1") require.ErrorIs(t, err, abuseipdb.ErrUnknownIP) } func TestClient_LookupReturnsErrUnknownIPOnEmptyData(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write([]byte(`{"data":{}}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"data":{}}`)) + }), + ) defer srv.Close() - c := abuseipdb.NewClient(abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "k"}) + c := abuseipdb.NewClient( + abuseipdb.ClientConfig{BaseURL: srv.URL, APIKey: "k"}, + ) _, err := c.Lookup(context.Background(), "10.0.0.1") require.ErrorIs(t, err, abuseipdb.ErrUnknownIP) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/cached.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/cached.go new file mode 100644 index 00000000..92b3a93f --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/cached.go @@ -0,0 +1,66 @@ +// ©AngelaMos | 2026 +// cached.go + +package greynoise + +import ( + "context" + "encoding/json" + "errors" + "time" + + "github.com/redis/go-redis/v9" +) + +const ( + cacheKeyPrefix = "gn:lookup:" + cacheHitTTL = 6 * time.Hour + cacheMissTTL = 30 * time.Minute + cacheMissValue = "__miss__" +) + +type Cached struct { + inner *Client + rdb *redis.Client +} + +func NewCached(inner *Client, rdb *redis.Client) *Cached { + return &Cached{inner: inner, rdb: rdb} +} + +func (c *Cached) Lookup(ctx context.Context, ip string) (Verdict, error) { + key := cacheKeyPrefix + ip + + if c.rdb != nil { + raw, err := c.rdb.Get(ctx, key).Result() + if err == nil { + if raw == cacheMissValue { + return Verdict{}, ErrUnknownIP + } + var v Verdict + if jerr := json.Unmarshal([]byte(raw), &v); jerr == nil { + return v, nil + } + } else if !errors.Is(err, redis.Nil) { + // Redis is degraded — fall through to live lookup. Don't cache + // the result either since the cache layer is itself unhealthy. + v, lerr := c.inner.Lookup(ctx, ip) + return v, lerr + } + } + + v, err := c.inner.Lookup(ctx, ip) + if err != nil { + if errors.Is(err, ErrUnknownIP) && c.rdb != nil { + _ = c.rdb.Set(ctx, key, cacheMissValue, cacheMissTTL).Err() + } + return Verdict{}, err + } + + if c.rdb != nil { + if payload, merr := json.Marshal(v); merr == nil { + _ = c.rdb.Set(ctx, key, string(payload), cacheHitTTL).Err() + } + } + return v, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/client_test.go index 289fb446..59238534 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/enrich/greynoise/client_test.go @@ -16,17 +16,21 @@ import ( ) func TestClient_LookupDecodesVerdict(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - require.Equal(t, "/v3/community/8.8.8.8", r.URL.Path) - require.Equal(t, "test-key", r.Header.Get("key")) - body, err := os.ReadFile("testdata/ip_lookup.json") - require.NoError(t, err) - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write(body) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/v3/community/8.8.8.8", r.URL.Path) + require.Equal(t, "test-key", r.Header.Get("key")) + body, err := os.ReadFile("testdata/ip_lookup.json") + require.NoError(t, err) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(body) + }), + ) defer srv.Close() - c := greynoise.NewClient(greynoise.ClientConfig{BaseURL: srv.URL, APIKey: "test-key"}) + c := greynoise.NewClient( + greynoise.ClientConfig{BaseURL: srv.URL, APIKey: "test-key"}, + ) v, err := c.Lookup(context.Background(), "8.8.8.8") require.NoError(t, err) require.Equal(t, "8.8.8.8", v.IP) @@ -35,12 +39,16 @@ func TestClient_LookupDecodesVerdict(t *testing.T) { } func TestClient_LookupReturnsErrUnknownIPOn404(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusNotFound) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusNotFound) + }), + ) defer srv.Close() - c := greynoise.NewClient(greynoise.ClientConfig{BaseURL: srv.URL, APIKey: "k"}) + c := greynoise.NewClient( + greynoise.ClientConfig{BaseURL: srv.URL, APIKey: "k"}, + ) _, err := c.Lookup(context.Background(), "10.0.0.1") require.ErrorIs(t, err, greynoise.ErrUnknownIP) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client.go index ba1bf59a..0a176755 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client.go @@ -85,7 +85,12 @@ func New(cfg Config) *Client { } } -func (c *Client) GetJSON(ctx context.Context, path string, query url.Values, out any) error { +func (c *Client) GetJSON( + ctx context.Context, + path string, + query url.Values, + out any, +) error { resp, err := c.Get(ctx, path, query) if err != nil { return err @@ -94,7 +99,11 @@ func (c *Client) GetJSON(ctx context.Context, path string, query url.Values, out return json.NewDecoder(resp.Body).Decode(out) } -func (c *Client) Get(ctx context.Context, path string, query url.Values) (*http.Response, error) { +func (c *Client) Get( + ctx context.Context, + path string, + query url.Values, +) (*http.Response, error) { target, err := c.resolveURL(path, query) if err != nil { return nil, err @@ -107,9 +116,12 @@ func (c *Client) Get(ctx context.Context, path string, query url.Values) (*http. var resp *http.Response op := func() error { - r, opErr := c.limiter.Do(ctx, func(rctx context.Context) (*http.Response, error) { - return c.do(rctx, target) - }) + r, opErr := c.limiter.Do( + ctx, + func(rctx context.Context) (*http.Response, error) { + return c.do(rctx, target) + }, + ) if opErr != nil { return opErr } @@ -131,7 +143,9 @@ func (c *Client) Get(ctx context.Context, path string, query url.Values) (*http. case r.StatusCode >= 400: body, _ := io.ReadAll(io.LimitReader(r.Body, clientErrorBodyLimit)) drainAndClose(r) - return backoff.Permanent(&StatusError{Code: r.StatusCode, Body: string(body)}) + return backoff.Permanent( + &StatusError{Code: r.StatusCode, Body: string(body)}, + ) } resp = r return nil @@ -142,7 +156,10 @@ func (c *Client) Get(ctx context.Context, path string, query url.Values) (*http. return resp, nil } -func (c *Client) do(ctx context.Context, target string) (*http.Response, error) { +func (c *Client) do( + ctx context.Context, + target string, +) (*http.Response, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, target, nil) if err != nil { return nil, err diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client_test.go index 837ba359..ce592283 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/httpx/client_test.go @@ -19,10 +19,12 @@ import ( func TestClient_GetJSONHonorsRateLimit(t *testing.T) { var hits atomic.Int32 - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - hits.Add(1) - _, _ = w.Write([]byte(`{"ok":true}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + hits.Add(1) + _, _ = w.Write([]byte(`{"ok":true}`)) + }), + ) defer srv.Close() c := httpx.New(httpx.Config{ @@ -51,14 +53,16 @@ func TestClient_GetJSONHonorsRateLimit(t *testing.T) { func TestClient_RetriesOn429WithRetryAfter(t *testing.T) { var hits atomic.Int32 - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - if hits.Add(1) == 1 { - w.Header().Set("Retry-After", "1") - w.WriteHeader(http.StatusTooManyRequests) - return - } - _, _ = w.Write([]byte(`{"ok":true}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + if hits.Add(1) == 1 { + w.Header().Set("Retry-After", "1") + w.WriteHeader(http.StatusTooManyRequests) + return + } + _, _ = w.Write([]byte(`{"ok":true}`)) + }), + ) defer srv.Close() c := httpx.New(httpx.Config{ @@ -84,13 +88,15 @@ func TestClient_RetriesOn429WithRetryAfter(t *testing.T) { func TestClient_RetriesOn5xx(t *testing.T) { var hits atomic.Int32 - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - if hits.Add(1) < 3 { - w.WriteHeader(http.StatusBadGateway) - return - } - _, _ = w.Write([]byte(`{"ok":true}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + if hits.Add(1) < 3 { + w.WriteHeader(http.StatusBadGateway) + return + } + _, _ = w.Write([]byte(`{"ok":true}`)) + }), + ) defer srv.Close() c := httpx.New(httpx.Config{ @@ -115,11 +121,13 @@ func TestClient_RetriesOn5xx(t *testing.T) { func TestClient_PermanentErrorOn4xx(t *testing.T) { var hits atomic.Int32 - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - hits.Add(1) - w.WriteHeader(http.StatusBadRequest) - _, _ = w.Write([]byte(`bad`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + hits.Add(1) + w.WriteHeader(http.StatusBadRequest) + _, _ = w.Write([]byte(`bad`)) + }), + ) defer srv.Close() c := httpx.New(httpx.Config{ @@ -143,12 +151,14 @@ func TestClient_PermanentErrorOn4xx(t *testing.T) { func TestClient_AddsBearerAndAPIKeyHeaders(t *testing.T) { var bearer, apiKey, ua string - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - bearer = r.Header.Get("Authorization") - apiKey = r.Header.Get("X-Custom-Key") - ua = r.Header.Get("User-Agent") - _, _ = w.Write([]byte(`{}`)) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + bearer = r.Header.Get("Authorization") + apiKey = r.Header.Get("X-Custom-Key") + ua = r.Header.Get("User-Agent") + _, _ = w.Write([]byte(`{}`)) + }), + ) defer srv.Close() c := httpx.New(httpx.Config{ diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/intel/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/intel/handler.go new file mode 100644 index 00000000..9f9dc8af --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/intel/handler.go @@ -0,0 +1,303 @@ +// ©AngelaMos | 2026 +// handler.go + +package intel + +import ( + "context" + "encoding/json" + "net/http" + "strconv" + "time" + + "github.com/go-chi/chi/v5" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/cfradar" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/cve" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/kev" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/ransomware" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/collectors/usgs" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" +) + +// Backfill endpoints. The dashboard's snapshot store keeps only the latest +// SINGLE event per topic, so on cold load the panels are nearly empty until +// the next collector tick fires (up to 2h for CVE). These endpoints read +// directly from the persistent stores so the panels populate immediately, +// and the WS path layers deltas on top. +// +// All routes are GET, public (same posture as /snapshot), with a small +// public cache to absorb the cold-load thundering herd if the dashboard +// happens to be popular. + +const ( + defaultLimit = 50 + maxLimit = 500 + cacheMaxAgeS = 30 + cacheControl = "public, max-age=30" + contentType = "Content-Type" + contentJSON = "application/json" +) + +type CVERepo interface { + RecentByLastModified(ctx context.Context, limit int) ([]cve.Row, error) +} + +type KEVRepo interface { + RecentByDateAdded(ctx context.Context, limit int) ([]kev.Row, error) +} + +type CFRadarRepo interface { + RecentHijacks(ctx context.Context, limit int) ([]cfradar.HijackRow, error) + RecentOutages(ctx context.Context, limit int) ([]cfradar.OutageRow, error) +} + +type RansomwareRepo interface { + Recent(ctx context.Context, limit int) ([]ransomware.Row, error) +} + +type USGSRepo interface { + RecentByTime(ctx context.Context, limit int) ([]usgs.Row, error) +} + +type Handler struct { + cveRepo CVERepo + kevRepo KEVRepo + cfradarRepo CFRadarRepo + ransomwareRepo RansomwareRepo + usgsRepo USGSRepo +} + +type HandlerConfig struct { + CVE CVERepo + KEV KEVRepo + CFRadar CFRadarRepo + Ransomware RansomwareRepo + USGS USGSRepo +} + +func NewHandler(cfg HandlerConfig) *Handler { + return &Handler{ + cveRepo: cfg.CVE, + kevRepo: cfg.KEV, + cfradarRepo: cfg.CFRadar, + ransomwareRepo: cfg.Ransomware, + usgsRepo: cfg.USGS, + } +} + +func (h *Handler) RegisterRoutes(r chi.Router) { + r.Route("/intel", func(r chi.Router) { + r.Get("/cves", h.recentCVEs) + r.Get("/kev", h.recentKEV) + r.Get("/hijacks", h.recentHijacks) + r.Get("/outages", h.recentOutages) + r.Get("/ransomware", h.recentRansomware) + r.Get("/quakes", h.recentQuakes) + }) +} + +func parseLimit(r *http.Request) int { + raw := r.URL.Query().Get("limit") + if raw == "" { + return defaultLimit + } + n, err := strconv.Atoi(raw) + if err != nil || n <= 0 { + return defaultLimit + } + if n > maxLimit { + return maxLimit + } + return n +} + +func (h *Handler) recentCVEs(w http.ResponseWriter, r *http.Request) { + if h.cveRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.cveRepo.RecentByLastModified(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, intelCVERows(rows)) +} + +func (h *Handler) recentKEV(w http.ResponseWriter, r *http.Request) { + if h.kevRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.kevRepo.RecentByDateAdded(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, intelKEVRows(rows)) +} + +// recentHijacks returns the raw payload column (the same EnrichedHijack +// JSON the WS path emits at collector time) so the dashboard panel sees +// `prefixes` and `enrichment` alongside the row metadata. Building a +// flat DTO loses fields the panel renders → empty rows. +func (h *Handler) recentHijacks(w http.ResponseWriter, r *http.Request) { + if h.cfradarRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.cfradarRepo.RecentHijacks(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + out := make([]json.RawMessage, 0, len(rows)) + for _, r := range rows { + if len(r.Payload) > 0 { + out = append(out, r.Payload) + } + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, out) +} + +// recentOutages returns the raw OutageAnnotation payload the WS path +// emits, for the same reason as recentHijacks. +func (h *Handler) recentOutages(w http.ResponseWriter, r *http.Request) { + if h.cfradarRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.cfradarRepo.RecentOutages(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + out := make([]json.RawMessage, 0, len(rows)) + for _, r := range rows { + if len(r.Payload) > 0 { + out = append(out, r.Payload) + } + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, out) +} + +// recentRansomware returns the raw Victim payload the WS path emits, so +// dedupe by victimKey() works identically across cold-load and live. +func (h *Handler) recentRansomware(w http.ResponseWriter, r *http.Request) { + if h.ransomwareRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.ransomwareRepo.Recent(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + out := make([]json.RawMessage, 0, len(rows)) + for _, r := range rows { + if len(r.Payload) > 0 { + out = append(out, r.Payload) + } + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, out) +} + +func (h *Handler) recentQuakes(w http.ResponseWriter, r *http.Request) { + if h.usgsRepo == nil { + core.OK(w, []any{}) + return + } + rows, err := h.usgsRepo.RecentByTime(r.Context(), parseLimit(r)) + if err != nil { + core.InternalServerError(w, err) + return + } + // Return the raw GeoJSON Feature shape the frontend (and the live WS + // path) already speak. Row.Payload IS the upstream feature. + out := make([]json.RawMessage, 0, len(rows)) + for _, r := range rows { + if len(r.Payload) > 0 { + out = append(out, r.Payload) + } + } + w.Header().Set("Cache-Control", cacheControl) + core.OK(w, out) +} + +// The collectors' Row types embed the raw upstream payload as +// json.RawMessage. The dashboard panels consume the upstream shape (CveID, +// Severity, etc.), so we forward the payloads — they're already the right +// shape for the existing zod schemas on the frontend. For panels that +// derive fields server-side (severity/cvss numeric vs the NVD nested +// structure) we expand back to the same flat shape the live WS event +// emits, so the frontend stores can dedupe by ID across cold-load and live +// streams without remembering two formats. + +type cveDTO struct { + CveID string `json:"CveID"` + Published time.Time `json:"Published"` + LastModified time.Time `json:"LastModified"` + Severity string `json:"Severity"` + CVSS float64 `json:"CVSS"` + EPSSScore *float64 `json:"EPSSScore"` + EPSSPercentile *float64 `json:"EPSSPercentile"` + InKEV bool `json:"InKEV"` + Payload json.RawMessage `json:"-"` +} + +func intelCVERows(rows []cve.Row) []cveDTO { + out := make([]cveDTO, 0, len(rows)) + for _, r := range rows { + out = append(out, cveDTO{ + CveID: r.CveID, + Published: r.Published, + LastModified: r.LastModified, + Severity: r.Severity, + CVSS: r.CVSS, + EPSSScore: r.EPSSScore, + EPSSPercentile: r.EPSSPercentile, + InKEV: r.InKEV, + }) + } + return out +} + +type kevDTO struct { + CveID string `json:"cveID"` + VendorProject string `json:"vendorProject"` + Product string `json:"product"` + VulnerabilityName string `json:"vulnerabilityName"` + DateAdded string `json:"dateAdded"` + DueDate string `json:"dueDate,omitempty"` + KnownRansomwareCampaignUse string `json:"knownRansomwareCampaignUse,omitempty"` +} + +func intelKEVRows(rows []kev.Row) []kevDTO { + out := make([]kevDTO, 0, len(rows)) + for _, r := range rows { + dto := kevDTO{ + CveID: r.CveID, + VendorProject: r.Vendor, + Product: r.Product, + VulnerabilityName: r.VulnerabilityName, + DateAdded: r.DateAdded.Format(time.DateOnly), + KnownRansomwareCampaignUse: r.RansomwareUse, + } + if r.DueDate != nil { + dto.DueDate = r.DueDate.Format(time.DateOnly) + } + out = append(out, dto) + } + return out +} + +// Hijack/outage/ransomware endpoints all return the raw collector +// payload (the JSON the WS path emits), so the dashboard's panel-render +// fields like prefixes/enrichment survive the cold-load → live-stream +// transition without shape divergence. diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/auth.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/auth.go index 1ca066c3..0c4455b4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/auth.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/auth.go @@ -8,6 +8,7 @@ import ( "errors" "net/http" "strings" + "time" "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" ) @@ -31,6 +32,8 @@ type AccessTokenClaims struct { Role string Tier string TokenVersion int + JTI string + ExpiresAt time.Time } func Authenticator(verifier TokenVerifier) func(http.Handler) http.Handler { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip.go new file mode 100644 index 00000000..e0170846 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip.go @@ -0,0 +1,43 @@ +// ©AngelaMos | 2026 +// clientip.go + +package middleware + +import ( + "net" + "net/http" + "strings" +) + +// ClientIP returns the request's source IP. If trustedHops > 0, it walks back +// that many hops from the right side of X-Forwarded-For (the closest hops are +// the most trusted, since each proxy appends to the right). With trustedHops +// == 0, X-Forwarded-For is ignored entirely and only RemoteAddr is honored — +// the safe default when the binary is reachable directly without a known +// proxy chain. Set trusted_proxy_hops in config to match your deployment +// (e.g., 1 behind nginx, 2 behind nginx+Cloudflare). +func ClientIP(r *http.Request, trustedHops int) string { + if trustedHops > 0 { + if xff := r.Header.Get("X-Forwarded-For"); xff != "" { + ips := strings.Split(xff, ",") + for i := range ips { + ips[i] = strings.TrimSpace(ips[i]) + } + idx := len(ips) - trustedHops + if idx < 0 { + idx = 0 + } + if idx < len(ips) && ips[idx] != "" { + return ips[idx] + } + } + if xri := strings.TrimSpace(r.Header.Get("X-Real-IP")); xri != "" { + return xri + } + } + host, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return host +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip_test.go new file mode 100644 index 00000000..4f46f834 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/clientip_test.go @@ -0,0 +1,61 @@ +// ©AngelaMos | 2026 +// clientip_test.go + +package middleware_test + +import ( + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" +) + +func TestClientIP_TrustedHopsZero_IgnoresXFF(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + r.Header.Set("X-Forwarded-For", "1.2.3.4") + r.Header.Set("X-Real-IP", "1.2.3.4") + + require.Equal(t, "10.0.0.5", middleware.ClientIP(r, 0)) +} + +func TestClientIP_TrustedHopsOne_PeelsRightmost(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + r.Header.Set("X-Forwarded-For", "203.0.113.1, 10.0.0.5") + + require.Equal(t, "10.0.0.5", middleware.ClientIP(r, 1)) +} + +func TestClientIP_TrustedHopsTwo_PeelsTwoFromRight(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + r.Header.Set("X-Forwarded-For", "203.0.113.1, 198.51.100.7, 10.0.0.5") + + require.Equal(t, "198.51.100.7", middleware.ClientIP(r, 2)) +} + +func TestClientIP_TrustedHopsExceedsList_ReturnsLeftmost(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + r.Header.Set("X-Forwarded-For", "203.0.113.1, 10.0.0.5") + + require.Equal(t, "203.0.113.1", middleware.ClientIP(r, 5)) +} + +func TestClientIP_TrustedHopsOne_NoXFF_FallsBackToRemoteAddr(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + + require.Equal(t, "10.0.0.5", middleware.ClientIP(r, 1)) +} + +func TestClientIP_TrustedHopsOne_HonorsXRealIP(t *testing.T) { + r := httptest.NewRequest("GET", "/", nil) + r.RemoteAddr = "10.0.0.5:54321" + r.Header.Set("X-Real-IP", "203.0.113.42") + + require.Equal(t, "203.0.113.42", middleware.ClientIP(r, 1)) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/ratelimit.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/ratelimit.go index c85519a1..12afa67b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/ratelimit.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/middleware/ratelimit.go @@ -8,7 +8,6 @@ import ( "encoding/json" "fmt" "log/slog" - "net" "net/http" "strconv" "strings" @@ -94,23 +93,18 @@ func (rl *RateLimiter) allow( return res, nil } +// KeyByIP keys requests by their RemoteAddr only — does NOT trust +// X-Forwarded-For. Use KeyByClientIP(trustedHops) when you have a known +// proxy chain to peel back. func KeyByIP(r *http.Request) string { - if xff := r.Header.Get("X-Forwarded-For"); xff != "" { - ips := strings.Split(xff, ",") - ip := strings.TrimSpace(ips[len(ips)-1]) - return "ratelimit:ip:" + ip - } + return "ratelimit:ip:" + ClientIP(r, 0) +} - if xri := r.Header.Get("X-Real-IP"); xri != "" { - return "ratelimit:ip:" + xri +// KeyByClientIP returns a KeyFunc that honors trustedHops of X-Forwarded-For. +func KeyByClientIP(trustedHops int) func(*http.Request) string { + return func(r *http.Request) string { + return "ratelimit:ip:" + ClientIP(r, trustedHops) } - - ip, _, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - ip = r.RemoteAddr - } - - return "ratelimit:ip:" + ip } func KeyByUser(r *http.Request) string { @@ -351,25 +345,24 @@ func TieredRateLimiter( } func PerMinute(rate, burst int) redis_rate.Limit { - return redis_rate.Limit{ - Rate: rate, - Burst: burst, - Period: time.Minute, - } + return PerWindow(rate, burst, time.Minute) } func PerSecond(rate, burst int) redis_rate.Limit { - return redis_rate.Limit{ - Rate: rate, - Burst: burst, - Period: time.Second, - } + return PerWindow(rate, burst, time.Second) } func PerHour(rate, burst int) redis_rate.Limit { + return PerWindow(rate, burst, time.Hour) +} + +func PerWindow(rate, burst int, window time.Duration) redis_rate.Limit { + if window <= 0 { + window = time.Minute + } return redis_rate.Limit{ Rate: rate, Burst: burst, - Period: time.Hour, + Period: window, } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/bridge.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/bridge.go new file mode 100644 index 00000000..147bfafb --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/bridge.go @@ -0,0 +1,113 @@ +// ©AngelaMos | 2026 +// bridge.go + +package notifications + +import ( + "context" + "encoding/json" + "fmt" + "log/slog" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/alerts" +) + +// Bridge wires the notifications module into the alerts engine. It loads +// a user's configured channels (decrypting webhook URLs / Telegram bot +// tokens on demand) and routes outbound alerts to the right transport. +// +// Without this seam, the alerts engine would have to know about +// encryption/repo specifics; with it, alerts.Engine treats every +// destination as the same interface (alerts.Channel + Notifier). +type Bridge struct { + repo Repository + enc *Encryptor + sender *Sender + logger *slog.Logger +} + +func NewBridge( + repo Repository, + enc *Encryptor, + sender *Sender, + logger *slog.Logger, +) *Bridge { + if logger == nil { + logger = slog.Default() + } + return &Bridge{repo: repo, enc: enc, sender: sender, logger: logger} +} + +// LoadChannels implements alerts.ChannelLoader. Returns every linked +// destination for the user — Slack/Discord webhook channels plus the +// Telegram bot if it's been linked. Decryption errors mark the channel +// invalid and skip it. +func (b *Bridge) LoadChannels( + ctx context.Context, + userID string, +) ([]alerts.Channel, error) { + out := []alerts.Channel{} + + channels, err := b.repo.ListChannels(ctx, userID) + if err != nil { + return nil, fmt.Errorf("load webhook channels: %w", err) + } + for _, ch := range channels { + if ch.Invalid { + continue + } + raw, decErr := b.enc.Decrypt(ch.ConfigEnc, ch.Nonce) + if decErr != nil { + b.logger.Warn("alerts: channel decrypt failed", + "channel_id", ch.ID, "type", ch.Type, "err", decErr) + continue + } + var cfg webhookChannelConfig + if jErr := json.Unmarshal(raw, &cfg); jErr != nil { + b.logger.Warn("alerts: channel config unmarshal failed", + "channel_id", ch.ID, "type", ch.Type, "err", jErr) + continue + } + out = append(out, alerts.Channel{ + ID: ch.ID, + Type: ch.Type, + Label: ch.Label, + WebhookURL: cfg.WebhookURL, + }) + } + + tw, err := b.repo.GetTelegramWebhook(ctx, userID) + if err == nil && tw != nil && tw.IsLinked() { + botToken, derr := b.enc.Decrypt(tw.BotTokenEnc, tw.BotTokenNonce) + if derr == nil && tw.ChatID != nil { + out = append(out, alerts.Channel{ + ID: "telegram:" + userID, + Type: ChannelTypeTelegram, + Label: "Telegram", + BotToken: string(botToken), + ChatID: *tw.ChatID, + }) + } + } + + return out, nil +} + +// SendAlert implements alerts.Notifier. Routes by channel type to the +// matching transport on the Sender. +func (b *Bridge) SendAlert( + ctx context.Context, + ch alerts.Channel, + message string, +) error { + switch ch.Type { + case ChannelTypeSlack: + return b.sender.SendSlack(ctx, ch.WebhookURL, message) + case ChannelTypeDiscord: + return b.sender.SendDiscord(ctx, ch.WebhookURL, message) + case ChannelTypeTelegram: + return b.sender.SendTelegram(ctx, ch.BotToken, ch.ChatID, message) + default: + return fmt.Errorf("unsupported channel type: %s", ch.Type) + } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/crypto.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/crypto.go new file mode 100644 index 00000000..b9d31340 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/crypto.go @@ -0,0 +1,72 @@ +// ©AngelaMos | 2026 +// crypto.go + +package notifications + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "fmt" + "io" +) + +type Encryptor struct { + key []byte +} + +func NewEncryptor(b64Key string) (*Encryptor, error) { + key, err := base64.StdEncoding.DecodeString(b64Key) + if err != nil { + return nil, fmt.Errorf("decode encryption key: %w", err) + } + if len(key) != 32 { + return nil, fmt.Errorf( + "encryption key must be 32 bytes, got %d", + len(key), + ) + } + return &Encryptor{key: key}, nil +} + +func (e *Encryptor) Encrypt( + plaintext []byte, +) (ciphertext, nonce []byte, err error) { + block, err := aes.NewCipher(e.key) + if err != nil { + return nil, nil, fmt.Errorf("create cipher: %w", err) + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, nil, fmt.Errorf("create GCM: %w", err) + } + + nonce = make([]byte, gcm.NonceSize()) + if _, err := io.ReadFull(rand.Reader, nonce); err != nil { + return nil, nil, fmt.Errorf("generate nonce: %w", err) + } + + ciphertext = gcm.Seal(nil, nonce, plaintext, nil) + return ciphertext, nonce, nil +} + +func (e *Encryptor) Decrypt(ciphertext, nonce []byte) ([]byte, error) { + block, err := aes.NewCipher(e.key) + if err != nil { + return nil, fmt.Errorf("create cipher: %w", err) + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, fmt.Errorf("create GCM: %w", err) + } + + plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) + if err != nil { + return nil, fmt.Errorf("decrypt: %w", err) + } + + return plaintext, nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/dto.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/dto.go new file mode 100644 index 00000000..0dac3340 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/dto.go @@ -0,0 +1,56 @@ +// ©AngelaMos | 2026 +// dto.go + +package notifications + +import "time" + +type ChannelResponse struct { + ID string `json:"id"` + Type string `json:"type"` + Label string `json:"label"` + Invalid bool `json:"invalid"` + CreatedAt time.Time `json:"created_at"` +} + +type TelegramStatusResponse struct { + Configured bool `json:"configured"` + Linked bool `json:"linked"` + PendingLink bool `json:"pending_link"` + WebhookURL string `json:"webhook_url,omitempty"` + WebhookRegistered bool `json:"webhook_registered"` + CreatedAt time.Time `json:"created_at,omitempty"` +} + +type RegisterTelegramResponse struct { + WebhookURL string `json:"webhook_url"` + WebhookRegistered bool `json:"webhook_registered"` +} + +type ChannelListResponse struct { + Channels []ChannelResponse `json:"channels"` + Telegram TelegramStatusResponse `json:"telegram"` +} + +type CreateChannelRequest struct { + Type string `json:"type" validate:"required,oneof=slack discord"` + Label string `json:"label" validate:"required,min=1,max=100"` + WebhookURL string `json:"webhook_url" validate:"required,url,max=2048"` +} + +type RegisterTelegramRequest struct { + BotToken string `json:"bot_token" validate:"required,min=10,max=200"` +} + +type webhookChannelConfig struct { + WebhookURL string `json:"webhook_url"` +} + +type telegramUpdate struct { + UpdateID int64 `json:"update_id"` + Message *struct { + Chat struct { + ID int64 `json:"id"` + } `json:"chat"` + } `json:"message"` +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/entity.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/entity.go new file mode 100644 index 00000000..b6dc6678 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/entity.go @@ -0,0 +1,39 @@ +// ©AngelaMos | 2026 +// entity.go + +package notifications + +import "time" + +const ( + ChannelTypeSlack = "slack" + ChannelTypeDiscord = "discord" + ChannelTypeTelegram = "telegram" +) + +type Channel struct { + ID string `db:"id"` + UserID string `db:"user_id"` + Type string `db:"type"` + Label string `db:"label"` + ConfigEnc []byte `db:"config_enc"` + Nonce []byte `db:"nonce"` + Invalid bool `db:"invalid"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` +} + +type TelegramWebhook struct { + UserID string `db:"user_id"` + WebhookUUID string `db:"webhook_uuid"` + SecretToken string `db:"secret_token"` + BotTokenEnc []byte `db:"bot_token_enc"` + BotTokenNonce []byte `db:"bot_token_nonce"` + ChatID *int64 `db:"chat_id"` + PendingLink bool `db:"pending_link"` + CreatedAt time.Time `db:"created_at"` +} + +func (t *TelegramWebhook) IsLinked() bool { + return !t.PendingLink && t.ChatID != nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/handler.go new file mode 100644 index 00000000..2880a9a8 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/handler.go @@ -0,0 +1,226 @@ +// ©AngelaMos | 2026 +// handler.go + +package notifications + +import ( + "encoding/json" + "errors" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-playground/validator/v10" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" +) + +const headerTelegramSecret = "X-Telegram-Bot-Api-Secret-Token" + +type Handler struct { + service *Service + validator *validator.Validate +} + +func NewHandler(service *Service) *Handler { + return &Handler{ + service: service, + validator: validator.New(validator.WithRequiredStructEnabled()), + } +} + +func (h *Handler) RegisterRoutes( + r chi.Router, + authenticator func(http.Handler) http.Handler, +) { + r.Route("/notifications", func(r chi.Router) { + r.Post( + "/telegram/webhook/{uuid}", + h.HandleTelegramUpdate, + ) + + r.Group(func(r chi.Router) { + r.Use(authenticator) + + r.Get("/channels", h.ListChannels) + r.Post("/channels", h.CreateChannel) + r.Delete("/channels/{id}", h.DeleteChannel) + r.Post("/channels/{id}/test", h.TestChannel) + + r.Post("/telegram", h.RegisterTelegram) + r.Delete("/telegram", h.UnlinkTelegram) + r.Post("/telegram/test", h.TestTelegram) + r.Get("/telegram/status", h.GetTelegramStatus) + }) + }) +} + +func (h *Handler) ListChannels(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + resp, err := h.service.ListChannels(r.Context(), userID) + if err != nil { + core.InternalServerError(w, err) + return + } + + core.OK(w, resp) +} + +func (h *Handler) CreateChannel(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + var req CreateChannelRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + core.BadRequest(w, "invalid request body") + return + } + + if err := h.validator.Struct(req); err != nil { + core.BadRequest(w, core.FormatValidationError(err)) + return + } + + ch, err := h.service.CreateChannel(r.Context(), userID, req) + if err != nil { + core.InternalServerError(w, err) + return + } + + core.Created(w, ch) +} + +func (h *Handler) DeleteChannel(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + id := chi.URLParam(r, "id") + + if err := h.service.DeleteChannel(r.Context(), id, userID); err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "channel") + return + } + core.InternalServerError(w, err) + return + } + + core.NoContent(w) +} + +func (h *Handler) TestChannel(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + id := chi.URLParam(r, "id") + + if err := h.service.TestChannel(r.Context(), id, userID); err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "channel") + return + } + core.JSONError(w, core.NewAppError( + err, + "test notification failed: "+err.Error(), + http.StatusBadGateway, + "NOTIFICATION_FAILED", + )) + return + } + + core.NoContent(w) +} + +func (h *Handler) RegisterTelegram(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + var req RegisterTelegramRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + core.BadRequest(w, "invalid request body") + return + } + + if err := h.validator.Struct(req); err != nil { + core.BadRequest(w, core.FormatValidationError(err)) + return + } + + resp, err := h.service.RegisterTelegram(r.Context(), userID, req) + if err != nil { + core.InternalServerError(w, err) + return + } + + core.Created(w, resp) +} + +func (h *Handler) UnlinkTelegram(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + if err := h.service.UnlinkTelegram(r.Context(), userID); err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "telegram channel") + return + } + core.InternalServerError(w, err) + return + } + + core.NoContent(w) +} + +func (h *Handler) TestTelegram(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + if err := h.service.TestTelegram(r.Context(), userID); err != nil { + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "telegram channel") + return + } + core.JSONError(w, core.NewAppError( + err, + err.Error(), + http.StatusBadGateway, + "NOTIFICATION_FAILED", + )) + return + } + + core.NoContent(w) +} + +func (h *Handler) GetTelegramStatus(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + status, err := h.service.GetTelegramStatus(r.Context(), userID) + if err != nil { + core.InternalServerError(w, err) + return + } + + core.OK(w, status) +} + +func (h *Handler) HandleTelegramUpdate( + w http.ResponseWriter, + r *http.Request, +) { + webhookUUID := chi.URLParam(r, "uuid") + secretToken := r.Header.Get(headerTelegramSecret) + + var update telegramUpdate + if err := json.NewDecoder(r.Body).Decode(&update); err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + + if err := h.service.HandleTelegramUpdate( + r.Context(), webhookUUID, secretToken, update, + ); err != nil { + if errors.Is(err, core.ErrNotFound) || + errors.Is(err, core.ErrForbidden) { + w.WriteHeader(http.StatusUnauthorized) + return + } + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/repository.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/repository.go new file mode 100644 index 00000000..c3215e14 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/repository.go @@ -0,0 +1,259 @@ +// ©AngelaMos | 2026 +// repository.go + +package notifications + +import ( + "context" + "database/sql" + "errors" + "fmt" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" +) + +type Repository interface { + ListChannels(ctx context.Context, userID string) ([]Channel, error) + GetChannel(ctx context.Context, id, userID string) (*Channel, error) + CreateChannel(ctx context.Context, ch *Channel) error + DeleteChannel(ctx context.Context, id, userID string) error + MarkChannelInvalid(ctx context.Context, id string) error + + GetTelegramWebhook( + ctx context.Context, + userID string, + ) (*TelegramWebhook, error) + GetTelegramWebhookByUUID( + ctx context.Context, + uuid string, + ) (*TelegramWebhook, error) + UpsertTelegramWebhook(ctx context.Context, tw *TelegramWebhook) error + UpdateTelegramChatID(ctx context.Context, uuid string, chatID int64) error + DeleteTelegramWebhook(ctx context.Context, userID string) error +} + +type repository struct { + db core.DBTX +} + +func NewRepository(db core.DBTX) Repository { + return &repository{db: db} +} + +func (r *repository) ListChannels( + ctx context.Context, + userID string, +) ([]Channel, error) { + query := ` + SELECT id, user_id, type, label, config_enc, nonce, + invalid, created_at, updated_at + FROM alert_channels + WHERE user_id = $1 + ORDER BY created_at DESC` + + var channels []Channel + if err := r.db.SelectContext(ctx, &channels, query, userID); err != nil { + return nil, fmt.Errorf("list channels: %w", err) + } + return channels, nil +} + +func (r *repository) GetChannel( + ctx context.Context, + id, userID string, +) (*Channel, error) { + query := ` + SELECT id, user_id, type, label, config_enc, nonce, + invalid, created_at, updated_at + FROM alert_channels + WHERE id = $1 AND user_id = $2` + + var ch Channel + err := r.db.GetContext(ctx, &ch, query, id, userID) + if errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf("get channel: %w", core.ErrNotFound) + } + if err != nil { + return nil, fmt.Errorf("get channel: %w", err) + } + return &ch, nil +} + +func (r *repository) CreateChannel(ctx context.Context, ch *Channel) error { + query := ` + INSERT INTO alert_channels + (id, user_id, type, label, config_enc, nonce) + VALUES ($1, $2, $3, $4, $5, $6) + RETURNING created_at, updated_at` + + err := r.db.GetContext(ctx, ch, query, + ch.ID, + ch.UserID, + ch.Type, + ch.Label, + ch.ConfigEnc, + ch.Nonce, + ) + if err != nil { + return fmt.Errorf("create channel: %w", err) + } + return nil +} + +func (r *repository) DeleteChannel( + ctx context.Context, + id, userID string, +) error { + query := `DELETE FROM alert_channels WHERE id = $1 AND user_id = $2` + + result, err := r.db.ExecContext(ctx, query, id, userID) + if err != nil { + return fmt.Errorf("delete channel: %w", err) + } + + rows, err := result.RowsAffected() + if err != nil { + return fmt.Errorf("delete channel: %w", err) + } + if rows == 0 { + return fmt.Errorf("delete channel: %w", core.ErrNotFound) + } + return nil +} + +func (r *repository) MarkChannelInvalid(ctx context.Context, id string) error { + query := ` + UPDATE alert_channels + SET invalid = true, updated_at = NOW() + WHERE id = $1` + + _, err := r.db.ExecContext(ctx, query, id) + if err != nil { + return fmt.Errorf("mark channel invalid: %w", err) + } + return nil +} + +func (r *repository) GetTelegramWebhook( + ctx context.Context, + userID string, +) (*TelegramWebhook, error) { + query := ` + SELECT user_id, webhook_uuid, secret_token, bot_token_enc, + bot_token_nonce, chat_id, pending_link, created_at + FROM telegram_webhooks + WHERE user_id = $1` + + var tw TelegramWebhook + err := r.db.GetContext(ctx, &tw, query, userID) + if errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf("get telegram webhook: %w", core.ErrNotFound) + } + if err != nil { + return nil, fmt.Errorf("get telegram webhook: %w", err) + } + return &tw, nil +} + +func (r *repository) GetTelegramWebhookByUUID( + ctx context.Context, + uuid string, +) (*TelegramWebhook, error) { + query := ` + SELECT user_id, webhook_uuid, secret_token, bot_token_enc, + bot_token_nonce, chat_id, pending_link, created_at + FROM telegram_webhooks + WHERE webhook_uuid = $1` + + var tw TelegramWebhook + err := r.db.GetContext(ctx, &tw, query, uuid) + if errors.Is(err, sql.ErrNoRows) { + return nil, fmt.Errorf( + "get telegram webhook by uuid: %w", + core.ErrNotFound, + ) + } + if err != nil { + return nil, fmt.Errorf("get telegram webhook by uuid: %w", err) + } + return &tw, nil +} + +func (r *repository) UpsertTelegramWebhook( + ctx context.Context, + tw *TelegramWebhook, +) error { + query := ` + INSERT INTO telegram_webhooks + (user_id, webhook_uuid, secret_token, + bot_token_enc, bot_token_nonce, pending_link) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (user_id) DO UPDATE + SET webhook_uuid = EXCLUDED.webhook_uuid, + secret_token = EXCLUDED.secret_token, + bot_token_enc = EXCLUDED.bot_token_enc, + bot_token_nonce = EXCLUDED.bot_token_nonce, + chat_id = NULL, + pending_link = true, + created_at = now() + RETURNING created_at` + + err := r.db.GetContext(ctx, &tw.CreatedAt, query, + tw.UserID, + tw.WebhookUUID, + tw.SecretToken, + tw.BotTokenEnc, + tw.BotTokenNonce, + tw.PendingLink, + ) + if err != nil { + return fmt.Errorf("upsert telegram webhook: %w", err) + } + return nil +} + +func (r *repository) UpdateTelegramChatID( + ctx context.Context, + uuid string, + chatID int64, +) error { + query := ` + UPDATE telegram_webhooks + SET chat_id = $2, pending_link = false + WHERE webhook_uuid = $1` + + result, err := r.db.ExecContext(ctx, query, uuid, chatID) + if err != nil { + return fmt.Errorf("update telegram chat_id: %w", err) + } + + rows, err := result.RowsAffected() + if err != nil { + return fmt.Errorf("update telegram chat_id: %w", err) + } + if rows == 0 { + return fmt.Errorf("update telegram chat_id: %w", core.ErrNotFound) + } + return nil +} + +func (r *repository) DeleteTelegramWebhook( + ctx context.Context, + userID string, +) error { + query := `DELETE FROM telegram_webhooks WHERE user_id = $1` + + result, err := r.db.ExecContext(ctx, query, userID) + if err != nil { + return fmt.Errorf("delete telegram webhook: %w", err) + } + + rows, err := result.RowsAffected() + if err != nil { + return fmt.Errorf("delete telegram webhook: %w", err) + } + if rows == 0 { + return fmt.Errorf("delete telegram webhook: %w", core.ErrNotFound) + } + return nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/sender.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/sender.go new file mode 100644 index 00000000..70a8f617 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/sender.go @@ -0,0 +1,223 @@ +// ©AngelaMos | 2026 +// sender.go + +package notifications + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "time" +) + +const ( + telegramAPIBase = "https://api.telegram.org" + senderTimeout = 10 * time.Second + testMessage = "Monitor the Situation — test notification. Channel configured successfully." +) + +type Sender struct { + client *http.Client +} + +func NewSender() *Sender { + return &Sender{ + client: &http.Client{Timeout: senderTimeout}, + } +} + +func (s *Sender) TestTelegram( + ctx context.Context, + botToken string, + chatID int64, +) error { + return s.sendTelegram(ctx, botToken, chatID, testMessage) +} + +// SendTelegram is the exported version used by the alerts engine. +func (s *Sender) SendTelegram( + ctx context.Context, + botToken string, + chatID int64, + text string, +) error { + return s.sendTelegram(ctx, botToken, chatID, text) +} + +// SendSlack posts a plain-text message to a Slack incoming-webhook URL. +func (s *Sender) SendSlack(ctx context.Context, webhookURL, text string) error { + payload, err := json.Marshal(map[string]string{"text": text}) + if err != nil { + return fmt.Errorf("marshal slack payload: %w", err) + } + return s.postWebhook(ctx, webhookURL, payload) +} + +// SendDiscord posts a plain-text message to a Discord webhook URL. +func (s *Sender) SendDiscord( + ctx context.Context, + webhookURL, text string, +) error { + payload, err := json.Marshal(map[string]string{"content": text}) + if err != nil { + return fmt.Errorf("marshal discord payload: %w", err) + } + return s.postWebhook(ctx, webhookURL, payload) +} + +func (s *Sender) sendTelegram( + ctx context.Context, + botToken string, + chatID int64, + text string, +) error { + url := fmt.Sprintf("%s/bot%s/sendMessage", telegramAPIBase, botToken) + + payload, err := json.Marshal(map[string]any{ + "chat_id": chatID, + "text": text, + }) + if err != nil { + return fmt.Errorf("marshal telegram payload: %w", err) + } + + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, url, bytes.NewReader(payload), + ) + if err != nil { + return fmt.Errorf("create telegram request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := s.client.Do(req) + if err != nil { + return fmt.Errorf("send telegram: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf( + "telegram sendMessage: unexpected status %d", + resp.StatusCode, + ) + } + return nil +} + +func (s *Sender) SetTelegramWebhook( + ctx context.Context, + botToken, webhookURL, secretToken string, +) error { + url := fmt.Sprintf("%s/bot%s/setWebhook", telegramAPIBase, botToken) + + payload, err := json.Marshal(map[string]any{ + "url": webhookURL, + "secret_token": secretToken, + "allowed_updates": []string{"message"}, + "drop_pending_updates": true, + }) + if err != nil { + return fmt.Errorf("marshal setWebhook payload: %w", err) + } + + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, url, bytes.NewReader(payload), + ) + if err != nil { + return fmt.Errorf("create setWebhook request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := s.client.Do(req) + if err != nil { + return fmt.Errorf("setWebhook: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf( + "setWebhook: unexpected status %d", + resp.StatusCode, + ) + } + return nil +} + +func (s *Sender) DeleteTelegramWebhook( + ctx context.Context, + botToken string, +) error { + url := fmt.Sprintf( + "%s/bot%s/deleteWebhook", + telegramAPIBase, + botToken, + ) + + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, url, http.NoBody, + ) + if err != nil { + return fmt.Errorf("create deleteWebhook request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := s.client.Do(req) + if err != nil { + return fmt.Errorf("deleteWebhook: %w", err) + } + defer resp.Body.Close() + + return nil +} + +func (s *Sender) TestSlack(ctx context.Context, webhookURL string) error { + payload, err := json.Marshal(map[string]string{ + "text": testMessage, + }) + if err != nil { + return fmt.Errorf("marshal slack payload: %w", err) + } + + return s.postWebhook(ctx, webhookURL, payload) +} + +func (s *Sender) TestDiscord(ctx context.Context, webhookURL string) error { + payload, err := json.Marshal(map[string]string{ + "content": testMessage, + }) + if err != nil { + return fmt.Errorf("marshal discord payload: %w", err) + } + + return s.postWebhook(ctx, webhookURL, payload) +} + +func (s *Sender) postWebhook( + ctx context.Context, + webhookURL string, + payload []byte, +) error { + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, webhookURL, bytes.NewReader(payload), + ) + if err != nil { + return fmt.Errorf("create webhook request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := s.client.Do(req) + if err != nil { + return fmt.Errorf("send webhook: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return fmt.Errorf( + "webhook: unexpected status %d", + resp.StatusCode, + ) + } + return nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/service.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/service.go new file mode 100644 index 00000000..29a8d066 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/notifications/service.go @@ -0,0 +1,327 @@ +// ©AngelaMos | 2026 +// service.go + +package notifications + +import ( + "context" + "crypto/rand" + "crypto/subtle" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "log/slog" + + "github.com/google/uuid" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" +) + +type Service struct { + repo Repository + enc *Encryptor + sender *Sender + publicURL string + logger *slog.Logger +} + +func NewService( + repo Repository, + enc *Encryptor, + sender *Sender, + publicURL string, + logger *slog.Logger, +) *Service { + return &Service{ + repo: repo, + enc: enc, + sender: sender, + publicURL: publicURL, + logger: logger, + } +} + +func (s *Service) ListChannels( + ctx context.Context, + userID string, +) (*ChannelListResponse, error) { + channels, err := s.repo.ListChannels(ctx, userID) + if err != nil { + return nil, err + } + + resp := &ChannelListResponse{ + Channels: make([]ChannelResponse, 0, len(channels)), + } + + for _, ch := range channels { + resp.Channels = append(resp.Channels, ChannelResponse{ + ID: ch.ID, + Type: ch.Type, + Label: ch.Label, + Invalid: ch.Invalid, + CreatedAt: ch.CreatedAt, + }) + } + + tw, err := s.repo.GetTelegramWebhook(ctx, userID) + if err != nil && !errors.Is(err, core.ErrNotFound) { + return nil, err + } + + if tw != nil { + resp.Telegram = TelegramStatusResponse{ + Configured: true, + Linked: tw.IsLinked(), + PendingLink: tw.PendingLink, + WebhookURL: s.webhookURL(tw.WebhookUUID), + CreatedAt: tw.CreatedAt, + } + } + + return resp, nil +} + +func (s *Service) CreateChannel( + ctx context.Context, + userID string, + req CreateChannelRequest, +) (*ChannelResponse, error) { + cfg := webhookChannelConfig{WebhookURL: req.WebhookURL} + + raw, err := json.Marshal(cfg) + if err != nil { + return nil, fmt.Errorf("marshal channel config: %w", err) + } + + enc, nonce, err := s.enc.Encrypt(raw) + if err != nil { + return nil, fmt.Errorf("encrypt channel config: %w", err) + } + + ch := &Channel{ + ID: uuid.New().String(), + UserID: userID, + Type: req.Type, + Label: req.Label, + ConfigEnc: enc, + Nonce: nonce, + } + + if err := s.repo.CreateChannel(ctx, ch); err != nil { + return nil, err + } + + return &ChannelResponse{ + ID: ch.ID, + Type: ch.Type, + Label: ch.Label, + Invalid: ch.Invalid, + CreatedAt: ch.CreatedAt, + }, nil +} + +func (s *Service) DeleteChannel( + ctx context.Context, + id, userID string, +) error { + return s.repo.DeleteChannel(ctx, id, userID) +} + +func (s *Service) TestChannel( + ctx context.Context, + id, userID string, +) error { + ch, err := s.repo.GetChannel(ctx, id, userID) + if err != nil { + return err + } + + raw, err := s.enc.Decrypt(ch.ConfigEnc, ch.Nonce) + if err != nil { + return fmt.Errorf("decrypt channel config: %w", err) + } + + var cfg webhookChannelConfig + if err := json.Unmarshal(raw, &cfg); err != nil { + return fmt.Errorf("unmarshal channel config: %w", err) + } + + switch ch.Type { + case ChannelTypeSlack: + return s.sender.TestSlack(ctx, cfg.WebhookURL) + case ChannelTypeDiscord: + return s.sender.TestDiscord(ctx, cfg.WebhookURL) + default: + return fmt.Errorf("unsupported channel type: %s", ch.Type) + } +} + +func (s *Service) RegisterTelegram( + ctx context.Context, + userID string, + req RegisterTelegramRequest, +) (*RegisterTelegramResponse, error) { + encToken, nonce, err := s.enc.Encrypt([]byte(req.BotToken)) + if err != nil { + return nil, fmt.Errorf("encrypt bot token: %w", err) + } + + webhookUUID := uuid.New().String() + secretToken, err := randomHex(32) + if err != nil { + return nil, fmt.Errorf("generate secret token: %w", err) + } + + tw := &TelegramWebhook{ + UserID: userID, + WebhookUUID: webhookUUID, + SecretToken: secretToken, + BotTokenEnc: encToken, + BotTokenNonce: nonce, + PendingLink: true, + } + + if err := s.repo.UpsertTelegramWebhook(ctx, tw); err != nil { + return nil, err + } + + wURL := s.webhookURL(webhookUUID) + + webhookRegistered := true + if err := s.sender.SetTelegramWebhook( + ctx, req.BotToken, wURL, secretToken, + ); err != nil { + webhookRegistered = false + s.logger.Warn( + "failed to auto-register telegram webhook", + "error", err, + "webhook_url", wURL, + ) + } + + return &RegisterTelegramResponse{ + WebhookURL: wURL, + WebhookRegistered: webhookRegistered, + }, nil +} + +func (s *Service) GetTelegramStatus( + ctx context.Context, + userID string, +) (*TelegramStatusResponse, error) { + tw, err := s.repo.GetTelegramWebhook(ctx, userID) + if errors.Is(err, core.ErrNotFound) { + return &TelegramStatusResponse{Configured: false}, nil + } + if err != nil { + return nil, err + } + + return &TelegramStatusResponse{ + Configured: true, + Linked: tw.IsLinked(), + PendingLink: tw.PendingLink, + WebhookURL: s.webhookURL(tw.WebhookUUID), + CreatedAt: tw.CreatedAt, + }, nil +} + +func (s *Service) UnlinkTelegram(ctx context.Context, userID string) error { + tw, err := s.repo.GetTelegramWebhook(ctx, userID) + if errors.Is(err, core.ErrNotFound) { + return core.ErrNotFound + } + if err != nil { + return err + } + + botToken, err := s.enc.Decrypt(tw.BotTokenEnc, tw.BotTokenNonce) + if err == nil { + if delErr := s.sender.DeleteTelegramWebhook( + ctx, string(botToken), + ); delErr != nil { + s.logger.Warn( + "failed to delete telegram webhook on unlink", + "error", delErr, + ) + } + } + + return s.repo.DeleteTelegramWebhook(ctx, userID) +} + +func (s *Service) TestTelegram(ctx context.Context, userID string) error { + tw, err := s.repo.GetTelegramWebhook(ctx, userID) + if errors.Is(err, core.ErrNotFound) { + return fmt.Errorf( + "no telegram channel configured: %w", + core.ErrNotFound, + ) + } + if err != nil { + return err + } + + if !tw.IsLinked() { + return fmt.Errorf( + "telegram not linked yet: send any message to your bot first", + ) + } + + botToken, err := s.enc.Decrypt(tw.BotTokenEnc, tw.BotTokenNonce) + if err != nil { + return fmt.Errorf("decrypt bot token: %w", err) + } + + return s.sender.TestTelegram(ctx, string(botToken), *tw.ChatID) +} + +func (s *Service) HandleTelegramUpdate( + ctx context.Context, + webhookUUID, secretToken string, + update telegramUpdate, +) error { + tw, err := s.repo.GetTelegramWebhookByUUID(ctx, webhookUUID) + if errors.Is(err, core.ErrNotFound) { + return core.ErrNotFound + } + if err != nil { + return err + } + + if subtle.ConstantTimeCompare( + []byte(tw.SecretToken), + []byte(secretToken), + ) != 1 { + return core.ErrForbidden + } + + if update.Message == nil { + return nil + } + + chatID := update.Message.Chat.ID + if chatID == 0 { + return nil + } + + return s.repo.UpdateTelegramChatID(ctx, webhookUUID, chatID) +} + +func (s *Service) webhookURL(webhookUUID string) string { + return fmt.Sprintf( + "%s/api/v1/notifications/telegram/webhook/%s", + s.publicURL, + webhookUUID, + ) +} + +func randomHex(n int) (string, error) { + b := make([]byte, n) + if _, err := rand.Read(b); err != nil { + return "", err + } + return hex.EncodeToString(b), nil +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter.go index 5e842475..4e969bbb 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter.go @@ -55,7 +55,10 @@ func New[T any](cfg Config) *Limiter[T] { } } -func (l *Limiter[T]) Do(ctx context.Context, fn func(context.Context) (T, error)) (T, error) { +func (l *Limiter[T]) Do( + ctx context.Context, + fn func(context.Context) (T, error), +) (T, error) { var zero T if err := l.rl.Wait(ctx); err != nil { return zero, err diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter_test.go index 8299b139..6002e1f4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ratelimit/limiter_test.go @@ -52,7 +52,10 @@ func TestLimiter_OpensBreakerOnRepeatedFailures(t *testing.T) { failure := errors.New("upstream broken") for i := 0; i < 3; i++ { - _, _ = lim.Do(ctx, func(_ context.Context) (string, error) { return "", failure }) + _, _ = lim.Do( + ctx, + func(_ context.Context) (string, error) { return "", failure }, + ) } called := false @@ -60,6 +63,10 @@ func TestLimiter_OpensBreakerOnRepeatedFailures(t *testing.T) { called = true return "", nil }) - require.False(t, called, "should not have called function — breaker should be open") + require.False( + t, + called, + "should not have called function — breaker should be open", + ) require.ErrorIs(t, err, gobreaker.ErrOpenState) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring.go index cf6be854..9d6ed444 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring.go @@ -32,7 +32,12 @@ func New(rc *redis.Client, cfg Config) *Client { return &Client{rc: rc, retention: cfg.Retention} } -func (c *Client) Push(ctx context.Context, key string, score int64, payload []byte) error { +func (c *Client) Push( + ctx context.Context, + key string, + score int64, + payload []byte, +) error { cutoff := time.UnixMilli(score).Add(-c.retention).UnixMilli() pipe := c.rc.Pipeline() pipe.ZAdd(ctx, key, redis.Z{Score: float64(score), Member: payload}) @@ -43,7 +48,11 @@ func (c *Client) Push(ctx context.Context, key string, score int64, payload []by return nil } -func (c *Client) Recent(ctx context.Context, key string, n int) ([][]byte, error) { +func (c *Client) Recent( + ctx context.Context, + key string, + n int, +) ([][]byte, error) { if n <= 0 { return nil, nil } @@ -63,7 +72,11 @@ func (c *Client) Recent(ctx context.Context, key string, n int) ([][]byte, error return out, nil } -func (c *Client) Range(ctx context.Context, key string, fromScore, toScore int64) ([][]byte, error) { +func (c *Client) Range( + ctx context.Context, + key string, + fromScore, toScore int64, +) ([][]byte, error) { res, err := c.rc.ZRangeByScore(ctx, key, &redis.ZRangeBy{ Min: strconv.FormatInt(fromScore, 10), Max: strconv.FormatInt(toScore, 10), diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring_test.go index 6ec06567..7955222e 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/redisring/ring_test.go @@ -42,7 +42,15 @@ func TestRing_PushAndRecentRoundtrips(t *testing.T) { now := time.Now().UTC() for i := 0; i < 5; i++ { ts := now.Add(-time.Duration(i) * time.Minute) - require.NoError(t, r.Push(ctx, "test:key", ts.UnixMilli(), []byte(fmt.Sprintf(`{"i":%d}`, i)))) + require.NoError( + t, + r.Push( + ctx, + "test:key", + ts.UnixMilli(), + []byte(fmt.Sprintf(`{"i":%d}`, i)), + ), + ) } got, err := r.Recent(ctx, "test:key", 3) @@ -58,7 +66,15 @@ func TestRing_RetentionPrunesOldEntries(t *testing.T) { now := time.Now().UTC() for i := 0; i < 5; i++ { old := now.Add(-2 * time.Hour).Add(-time.Duration(i) * time.Minute) - require.NoError(t, r.Push(ctx, "test:key", old.UnixMilli(), []byte(fmt.Sprintf(`old-%d`, i)))) + require.NoError( + t, + r.Push( + ctx, + "test:key", + old.UnixMilli(), + []byte(fmt.Sprintf(`old-%d`, i)), + ), + ) } require.NoError(t, r.Push(ctx, "test:key", now.UnixMilli(), []byte("now"))) @@ -76,7 +92,15 @@ func TestRing_RangeReturnsItemsWithinScoreWindow(t *testing.T) { now := time.Now().UTC() for i := 0; i < 10; i++ { ts := now.Add(-time.Duration(i) * time.Minute) - require.NoError(t, r.Push(ctx, "test:key", ts.UnixMilli(), []byte(fmt.Sprintf("i=%d", i)))) + require.NoError( + t, + r.Push( + ctx, + "test:key", + ts.UnixMilli(), + []byte(fmt.Sprintf("i=%d", i)), + ), + ) } from := now.Add(-3 * time.Minute).UnixMilli() diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/handler.go index 9e43a403..1393f2d5 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/handler.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/handler.go @@ -4,8 +4,9 @@ package snapshot import ( - "encoding/json" "net/http" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/core" ) type Handler struct { @@ -17,13 +18,9 @@ func NewHandler(store *Store) *Handler { return &Handler{store: store} } func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { all, err := h.store.GetAll(r.Context()) if err != nil { - http.Error(w, "snapshot read failed", http.StatusInternalServerError) + core.InternalServerError(w, err) return } - w.Header().Set("Content-Type", "application/json") w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") - if err := json.NewEncoder(w).Encode(all); err != nil { - http.Error(w, "encode failed", http.StatusInternalServerError) - return - } + core.OK(w, all) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/persister.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/persister.go index bd694aef..5c899c42 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/persister.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/persister.go @@ -20,5 +20,8 @@ func (s StorePersister) Save(ctx context.Context, ev events.Event) error { if err != nil { return fmt.Errorf("marshal payload: %w", err) } + if ev.Topic == events.TopicCoinbasePrice { + return s.Store.MergeSymbolMap(ctx, ev.Topic, raw) + } return s.Store.PutLatest(ctx, ev.Topic, raw) } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/snapshot_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/snapshot_test.go index c70e9f74..25fc629f 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/snapshot_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/snapshot_test.go @@ -42,8 +42,22 @@ func TestStore_PutLatestAndGetAll(t *testing.T) { store := snapshot.NewStore(rdb) ctx := context.Background() - require.NoError(t, store.PutLatest(ctx, events.TopicHeartbeat, json.RawMessage(`{"ts":"2026-05-01T00:00:00Z"}`))) - require.NoError(t, store.PutLatest(ctx, events.TopicCVENew, json.RawMessage(`{"id":"CVE-2026-9999"}`))) + require.NoError( + t, + store.PutLatest( + ctx, + events.TopicHeartbeat, + json.RawMessage(`{"ts":"2026-05-01T00:00:00Z"}`), + ), + ) + require.NoError( + t, + store.PutLatest( + ctx, + events.TopicCVENew, + json.RawMessage(`{"id":"CVE-2026-9999"}`), + ), + ) all, err := store.GetAll(ctx) require.NoError(t, err) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/store.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/store.go index b4968f3c..541c95aa 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/store.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/snapshot/store.go @@ -7,13 +7,19 @@ import ( "context" "encoding/json" "fmt" + "strings" "github.com/redis/go-redis/v9" "github.com/carterperez-dev/monitor-the-situation/backend/internal/events" ) -const keyPrefix = "state:" +const ( + keyPrefix = "state:" + keyHashPrice = "state:coinbase_price" + scanCount = 100 + wrongTypeMarker = "WRONGTYPE" +) type Store struct { rdb *redis.Client @@ -21,26 +27,109 @@ type Store struct { func NewStore(rdb *redis.Client) *Store { return &Store{rdb: rdb} } -func (s *Store) PutLatest(ctx context.Context, topic events.Topic, payload json.RawMessage) error { - if err := s.rdb.Set(ctx, keyPrefix+string(topic), []byte(payload), 0).Err(); err != nil { +func (s *Store) PutLatest( + ctx context.Context, + topic events.Topic, + payload json.RawMessage, +) error { + if err := s.rdb.Set(ctx, keyPrefix+string(topic), []byte(payload), 0). + Err(); err != nil { return fmt.Errorf("redis set %s: %w", topic, err) } return nil } -func (s *Store) GetAll(ctx context.Context) (map[string]json.RawMessage, error) { - keys, err := s.rdb.Keys(ctx, keyPrefix+"*").Result() - if err != nil { - return nil, err +func (s *Store) MergeSymbolMap( + ctx context.Context, + topic events.Topic, + payload json.RawMessage, +) error { + var tick struct { + Symbol string `json:"symbol"` } - out := make(map[string]json.RawMessage, len(keys)) - for _, k := range keys { - v, err := s.rdb.Get(ctx, k).Bytes() + if err := json.Unmarshal(payload, &tick); err != nil || tick.Symbol == "" { + return fmt.Errorf("coinbase merge: no symbol in payload") + } + + key := keyPrefix + string(topic) + err := s.rdb.HSet(ctx, key, tick.Symbol, []byte(payload)).Err() + if err == nil { + return nil + } + if !isWrongType(err) { + return fmt.Errorf("redis hset %s/%s: %w", topic, tick.Symbol, err) + } + if delErr := s.rdb.Del(ctx, key).Err(); delErr != nil { + return fmt.Errorf("redis del legacy %s: %w", key, delErr) + } + if err := s.rdb.HSet(ctx, key, tick.Symbol, []byte(payload)). + Err(); err != nil { + return fmt.Errorf( + "redis hset %s/%s after migration: %w", + topic, + tick.Symbol, + err, + ) + } + return nil +} + +func isWrongType(err error) bool { + return err != nil && strings.Contains(err.Error(), wrongTypeMarker) +} + +func (s *Store) GetAll( + ctx context.Context, +) (map[string]json.RawMessage, error) { + out := map[string]json.RawMessage{} + var cursor uint64 + for { + keys, next, err := s.rdb.Scan(ctx, cursor, keyPrefix+"*", scanCount). + Result() if err != nil { - continue + return nil, fmt.Errorf("scan state: %w", err) } - topic := k[len(keyPrefix):] - out[topic] = json.RawMessage(v) + for _, k := range keys { + topic := k[len(keyPrefix):] + val, err := s.readKey(ctx, k) + if err != nil { + continue + } + out[topic] = val + } + if next == 0 { + break + } + cursor = next } return out, nil } + +func (s *Store) readKey( + ctx context.Context, + key string, +) (json.RawMessage, error) { + t, err := s.rdb.Type(ctx, key).Result() + if err != nil { + return nil, err + } + switch t { + case "string": + v, err := s.rdb.Get(ctx, key).Bytes() + if err != nil { + return nil, err + } + return json.RawMessage(v), nil + case "hash": + fields, err := s.rdb.HGetAll(ctx, key).Result() + if err != nil { + return nil, err + } + m := make(map[string]json.RawMessage, len(fields)) + for k, v := range fields { + m[k] = json.RawMessage(v) + } + return json.Marshal(m) + } + return nil, fmt.Errorf("unsupported redis type %q for key %s", t, key) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/dto.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/dto.go index ba2b0686..011142ca 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/dto.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/dto.go @@ -17,12 +17,23 @@ type UpdateUserRequest struct { Name *string `json:"name,omitempty" validate:"omitempty,min=1,max=100"` } -type UpdateUserRoleRequest struct { - Role string `json:"role" validate:"required,oneof=user admin"` +type UpdateEmailRequest struct { + CurrentPassword string `json:"current_password" validate:"required"` + NewEmail string `json:"new_email" validate:"required,email,max=255"` } -type UpdateUserTierRequest struct { - Tier string `json:"tier" validate:"required,oneof=free pro enterprise"` +type AdminUpdateUserRequest struct { + Name *string `json:"name,omitempty" validate:"omitempty,min=1,max=100"` + Role *string `json:"role,omitempty" validate:"omitempty,oneof=user admin"` + Tier *string `json:"tier,omitempty" validate:"omitempty,oneof=free pro enterprise"` +} + +type AdminCreateUserRequest struct { + Email string `json:"email" validate:"required,email,max=255"` + Password string `json:"password" validate:"required,min=8,max=128"` + Name string `json:"name" validate:"required,min=1,max=100"` + Role *string `json:"role,omitempty" validate:"omitempty,oneof=user admin"` + Tier *string `json:"tier,omitempty" validate:"omitempty,oneof=free pro enterprise"` } type UserResponse struct { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/handler.go index c4b5f73c..76915993 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/handler.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/handler.go @@ -37,6 +37,7 @@ func (h *Handler) RegisterRoutes( r.Get("/me", h.GetMe) r.Put("/me", h.UpdateMe) + r.Put("/me/email", h.UpdateMyEmail) r.Delete("/me", h.DeleteMe) }) } @@ -84,6 +85,54 @@ func (h *Handler) UpdateMe(w http.ResponseWriter, r *http.Request) { core.OK(w, ToUserResponse(user)) } +// UpdateMyEmail changes the authenticated user's email after re-verifying +// their password. +func (h *Handler) UpdateMyEmail(w http.ResponseWriter, r *http.Request) { + userID := middleware.GetUserID(r.Context()) + + var req UpdateEmailRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + core.BadRequest(w, "invalid request body") + return + } + if err := h.validator.Struct(req); err != nil { + core.BadRequest(w, core.FormatValidationError(err)) + return + } + + user, err := h.service.UpdateEmail( + r.Context(), + userID, + req.CurrentPassword, + req.NewEmail, + ) + if err != nil { + if errors.Is(err, core.ErrUnauthorized) { + core.JSONError( + w, + core.UnauthorizedError("current password is incorrect"), + ) + return + } + if errors.Is(err, core.ErrDuplicateKey) { + core.JSONError(w, core.DuplicateError("email")) + return + } + if errors.Is(err, core.ErrNotFound) { + core.NotFound(w, "user") + return + } + if errors.Is(err, core.ErrInvalidInput) { + core.BadRequest(w, err.Error()) + return + } + core.InternalServerError(w, err) + return + } + + core.OK(w, ToUserResponse(user)) +} + func (h *Handler) DeleteMe(w http.ResponseWriter, r *http.Request) { userID := middleware.GetUserID(r.Context()) @@ -109,10 +158,9 @@ func (h *Handler) RegisterAdminRoutes( r.Use(adminOnly) r.Get("/", h.ListUsers) + r.Post("/", h.AdminCreateUser) r.Get("/{userID}", h.GetUser) - r.Put("/{userID}", h.UpdateUser) - r.Put("/{userID}/role", h.UpdateUserRole) - r.Put("/{userID}/tier", h.UpdateUserTier) + r.Put("/{userID}", h.AdminUpdateUser) r.Delete("/{userID}", h.DeleteUser) }) } @@ -159,11 +207,11 @@ func (h *Handler) GetUser(w http.ResponseWriter, r *http.Request) { core.OK(w, ToUserResponse(user)) } -// UpdateUser updates a specific user's profile (admin only). -func (h *Handler) UpdateUser(w http.ResponseWriter, r *http.Request) { +// AdminUpdateUser updates a specific user — name, role, tier (admin only). +func (h *Handler) AdminUpdateUser(w http.ResponseWriter, r *http.Request) { userID := chi.URLParam(r, "userID") - var req UpdateUserRequest + var req AdminUpdateUserRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { core.BadRequest(w, "invalid request body") return @@ -174,12 +222,16 @@ func (h *Handler) UpdateUser(w http.ResponseWriter, r *http.Request) { return } - user, err := h.service.UpdateUser(r.Context(), userID, req) + user, err := h.service.AdminUpdateUser(r.Context(), userID, req) if err != nil { if errors.Is(err, core.ErrNotFound) { core.NotFound(w, "user") return } + if errors.Is(err, core.ErrInvalidInput) { + core.BadRequest(w, err.Error()) + return + } core.InternalServerError(w, err) return } @@ -187,11 +239,9 @@ func (h *Handler) UpdateUser(w http.ResponseWriter, r *http.Request) { core.OK(w, ToUserResponse(user)) } -// UpdateUserRole changes a user's role (admin only). -func (h *Handler) UpdateUserRole(w http.ResponseWriter, r *http.Request) { - userID := chi.URLParam(r, "userID") - - var req UpdateUserRoleRequest +// AdminCreateUser creates a new user (admin only). +func (h *Handler) AdminCreateUser(w http.ResponseWriter, r *http.Request) { + var req AdminCreateUserRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { core.BadRequest(w, "invalid request body") return @@ -202,45 +252,21 @@ func (h *Handler) UpdateUserRole(w http.ResponseWriter, r *http.Request) { return } - user, err := h.service.UpdateUserRole(r.Context(), userID, req.Role) + user, err := h.service.AdminCreateUser(r.Context(), req) if err != nil { - if errors.Is(err, core.ErrNotFound) { - core.NotFound(w, "user") + if errors.Is(err, core.ErrDuplicateKey) { + core.JSONError(w, core.DuplicateError("email")) + return + } + if errors.Is(err, core.ErrInvalidInput) { + core.BadRequest(w, err.Error()) return } core.InternalServerError(w, err) return } - core.OK(w, ToUserResponse(user)) -} - -// UpdateUserTier changes a user's subscription tier (admin only). -func (h *Handler) UpdateUserTier(w http.ResponseWriter, r *http.Request) { - userID := chi.URLParam(r, "userID") - - var req UpdateUserTierRequest - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - core.BadRequest(w, "invalid request body") - return - } - - if err := h.validator.Struct(req); err != nil { - core.BadRequest(w, core.FormatValidationError(err)) - return - } - - user, err := h.service.UpdateUserTier(r.Context(), userID, req.Tier) - if err != nil { - if errors.Is(err, core.ErrNotFound) { - core.NotFound(w, "user") - return - } - core.InternalServerError(w, err) - return - } - - core.OK(w, ToUserResponse(user)) + core.Created(w, ToUserResponse(user)) } // DeleteUser soft deletes a user account (admin only). @@ -248,7 +274,11 @@ func (h *Handler) DeleteUser(w http.ResponseWriter, r *http.Request) { requesterID := middleware.GetUserID(r.Context()) targetID := chi.URLParam(r, "userID") - if err := h.service.CanDeleteUser(r.Context(), requesterID, targetID); err != nil { + if err := h.service.CanDeleteUser( + r.Context(), + requesterID, + targetID, + ); err != nil { if errors.Is(err, core.ErrForbidden) { core.Forbidden(w, "insufficient permissions") return diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/repository.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/repository.go index 39c00012..22b4cd94 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/repository.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/repository.go @@ -21,6 +21,7 @@ type Repository interface { GetByEmail(ctx context.Context, email string) (*User, error) Update(ctx context.Context, user *User) error UpdatePassword(ctx context.Context, id, passwordHash string) error + UpdateEmail(ctx context.Context, id, email string) error IncrementTokenVersion(ctx context.Context, id string) error SoftDelete(ctx context.Context, id string) error List(ctx context.Context, params ListUsersParams) ([]User, int, error) @@ -149,6 +150,30 @@ func (r *repository) UpdatePassword( return nil } +func (r *repository) UpdateEmail(ctx context.Context, id, email string) error { + query := ` + UPDATE users + SET email = $2, updated_at = NOW() + WHERE id = $1 AND deleted_at IS NULL` + + result, err := r.db.ExecContext(ctx, query, id, email) + if err != nil { + if isDuplicateKeyError(err) { + return fmt.Errorf("update email: %w", core.ErrDuplicateKey) + } + return fmt.Errorf("update email: %w", err) + } + + rows, err := result.RowsAffected() + if err != nil { + return fmt.Errorf("update email: %w", err) + } + if rows == 0 { + return fmt.Errorf("update email: %w", core.ErrNotFound) + } + return nil +} + func (r *repository) IncrementTokenVersion( ctx context.Context, id string, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/service.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/service.go index f772e6fd..5bb1d20a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/service.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/user/service.go @@ -80,6 +80,64 @@ func (s *Service) UpdatePassword( return s.repo.UpdatePassword(ctx, userID, passwordHash) } +// SetRole flips a user's role. Used by ADMIN_EMAIL bootstrapping in +// auth.Service: the configured email gets promoted to admin on every +// login/register so a fresh DB after env changes still has an admin. +func (s *Service) SetRole(ctx context.Context, userID, role string) error { + if role != RoleUser && role != RoleAdmin { + return fmt.Errorf( + "set role: invalid role %q: %w", + role, + core.ErrInvalidInput, + ) + } + user, err := s.repo.GetByID(ctx, userID) + if err != nil { + return err + } + user.Role = role + return s.repo.Update(ctx, user) +} + +// UpdateEmail changes a user's email after re-verifying their password. +// Email is normalized to lowercase. Returns ErrDuplicateKey if the new +// email is already taken by another account. +func (s *Service) UpdateEmail( + ctx context.Context, + userID, currentPassword, newEmail string, +) (*User, error) { + newEmail = strings.ToLower(strings.TrimSpace(newEmail)) + if newEmail == "" { + return nil, fmt.Errorf("update email: empty: %w", core.ErrInvalidInput) + } + + user, err := s.repo.GetByID(ctx, userID) + if err != nil { + return nil, err + } + + valid, _, err := core.VerifyPasswordWithRehash( + currentPassword, + user.PasswordHash, + ) + if err != nil { + return nil, fmt.Errorf("verify password: %w", err) + } + if !valid { + return nil, fmt.Errorf("update email: %w", core.ErrUnauthorized) + } + + if user.Email == newEmail { + return user, nil + } + + if err := s.repo.UpdateEmail(ctx, userID, newEmail); err != nil { + return nil, err + } + user.Email = newEmail + return user, nil +} + func (s *Service) GetUser(ctx context.Context, id string) (*User, error) { return s.repo.GetByID(ctx, id) } @@ -105,24 +163,40 @@ func (s *Service) UpdateUser( return user, nil } -func (s *Service) UpdateUserRole( +func (s *Service) AdminUpdateUser( ctx context.Context, - id, role string, + id string, + req AdminUpdateUserRequest, ) (*User, error) { - if role != RoleUser && role != RoleAdmin { - return nil, fmt.Errorf( - "update role: invalid role %q: %w", - role, - core.ErrInvalidInput, - ) - } - user, err := s.repo.GetByID(ctx, id) if err != nil { return nil, err } - user.Role = role + if req.Name != nil { + user.Name = *req.Name + } + if req.Role != nil { + if *req.Role != RoleUser && *req.Role != RoleAdmin { + return nil, fmt.Errorf( + "update role: invalid role %q: %w", + *req.Role, + core.ErrInvalidInput, + ) + } + user.Role = *req.Role + } + if req.Tier != nil { + if *req.Tier != TierFree && *req.Tier != TierPro && + *req.Tier != TierEnterprise { + return nil, fmt.Errorf( + "update tier: invalid tier %q: %w", + *req.Tier, + core.ErrInvalidInput, + ) + } + user.Tier = *req.Tier + } if err := s.repo.Update(ctx, user); err != nil { return nil, err @@ -131,26 +205,46 @@ func (s *Service) UpdateUserRole( return user, nil } -func (s *Service) UpdateUserTier( +func (s *Service) AdminCreateUser( ctx context.Context, - id, tier string, + req AdminCreateUserRequest, ) (*User, error) { - if tier != TierFree && tier != TierPro && tier != TierEnterprise { - return nil, fmt.Errorf( - "update tier: invalid tier %q: %w", - tier, - core.ErrInvalidInput, - ) - } - - user, err := s.repo.GetByID(ctx, id) + hash, err := core.HashPassword(req.Password) if err != nil { - return nil, err + return nil, fmt.Errorf("hash password: %w", err) } - user.Tier = tier + user := &User{ + ID: uuid.New().String(), + Email: strings.ToLower(req.Email), + PasswordHash: hash, + Name: req.Name, + Role: RoleUser, + Tier: TierFree, + } + if req.Role != nil { + if *req.Role != RoleUser && *req.Role != RoleAdmin { + return nil, fmt.Errorf( + "create user: invalid role %q: %w", + *req.Role, + core.ErrInvalidInput, + ) + } + user.Role = *req.Role + } + if req.Tier != nil { + if *req.Tier != TierFree && *req.Tier != TierPro && + *req.Tier != TierEnterprise { + return nil, fmt.Errorf( + "create user: invalid tier %q: %w", + *req.Tier, + core.ErrInvalidInput, + ) + } + user.Tier = *req.Tier + } - if err := s.repo.Update(ctx, user); err != nil { + if err := s.repo.Create(ctx, user); err != nil { return nil, err } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/envelope_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/envelope_test.go index 675acb49..474c29af 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/envelope_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/envelope_test.go @@ -13,7 +13,10 @@ import ( ) func TestEncodeEnvelope(t *testing.T) { - out, err := ws.EncodeEnvelope("heartbeat", []byte(`{"ts":"2026-05-01T00:00:00Z"}`)) + out, err := ws.EncodeEnvelope( + "heartbeat", + []byte(`{"ts":"2026-05-01T00:00:00Z"}`), + ) require.NoError(t, err) var got map[string]any diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler.go index 257a870a..21ffcf16 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler.go @@ -6,19 +6,60 @@ package ws import ( "net/http" "strings" + "sync" + "sync/atomic" cdrws "github.com/coder/websocket" "github.com/carterperez-dev/monitor-the-situation/backend/internal/events" + "github.com/carterperez-dev/monitor-the-situation/backend/internal/middleware" ) -type Handler struct { - hub *Hub +// defaultMaxConnsPerIP is permissive — a single user with React +// StrictMode in dev (effect runs twice), two tabs, and a brief reconnect +// race already burns ~6 simultaneous connections from one IP. The hub- +// level MaxSubscribers (default 5000) is the real DoS guard; this just +// blocks a single host from running thousands of sockets. +const defaultMaxConnsPerIP = 25 + +type HandlerConfig struct { + Hub *Hub + MaxConnsPerIP int + TrustedProxyHops int } -func NewHandler(hub *Hub) *Handler { return &Handler{hub: hub} } +type Handler struct { + hub *Hub + maxConnsPerIP int + trustedProxyHops int + perIP sync.Map +} + +func NewHandler(hub *Hub) *Handler { + return NewHandlerWithConfig(HandlerConfig{Hub: hub}) +} + +func NewHandlerWithConfig(cfg HandlerConfig) *Handler { + if cfg.MaxConnsPerIP <= 0 { + cfg.MaxConnsPerIP = defaultMaxConnsPerIP + } + return &Handler{ + hub: cfg.Hub, + maxConnsPerIP: cfg.MaxConnsPerIP, + trustedProxyHops: cfg.TrustedProxyHops, + } +} func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ip := middleware.ClientIP(r, h.trustedProxyHops) + counter := h.counterFor(ip) + if counter.Add(1) > int32(h.maxConnsPerIP) { + counter.Add(-1) + http.Error(w, "too many connections", http.StatusTooManyRequests) + return + } + defer counter.Add(-1) + c, err := cdrws.Accept(w, r, &cdrws.AcceptOptions{ InsecureSkipVerify: false, }) @@ -30,6 +71,20 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { _ = h.hub.Serve(r.Context(), c, topics) } +func (h *Handler) counterFor(ip string) *atomic.Int32 { + if existing, ok := h.perIP.Load(ip); ok { + if c, ok := existing.(*atomic.Int32); ok { + return c + } + } + fresh := &atomic.Int32{} + actual, _ := h.perIP.LoadOrStore(ip, fresh) + if c, ok := actual.(*atomic.Int32); ok { + return c + } + return fresh +} + func parseTopics(raw string) []events.Topic { if raw == "" { return events.AllTopics() diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler_test.go new file mode 100644 index 00000000..0bddc13a --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/handler_test.go @@ -0,0 +1,101 @@ +// ©AngelaMos | 2026 +// handler_test.go + +package ws_test + +import ( + "context" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + "time" + + cdrws "github.com/coder/websocket" + "github.com/stretchr/testify/require" + + "github.com/carterperez-dev/monitor-the-situation/backend/internal/ws" +) + +func TestHandler_PerIPCap_RejectsBeyondLimit(t *testing.T) { + hub := ws.NewHub(ws.HubConfig{}) + h := ws.NewHandlerWithConfig(ws.HandlerConfig{ + Hub: hub, + MaxConnsPerIP: 2, + }) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.RemoteAddr = "203.0.113.7:1111" + h.ServeHTTP(w, r) + }), + ) + defer srv.Close() + + wsURL := "ws" + strings.TrimPrefix(srv.URL, "http") + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + conns := make([]*cdrws.Conn, 0, 2) + for i := 0; i < 2; i++ { + c, _, err := cdrws.Dial(ctx, wsURL, nil) + require.NoError(t, err) + conns = append(conns, c) + } + require.Eventually(t, func() bool { + return hub.SubscriberCount() == 2 + }, time.Second, 10*time.Millisecond) + + _, resp, err := cdrws.Dial(ctx, wsURL, nil) + require.Error(t, err, "third connection from same IP must be rejected") + if resp != nil { + require.Equal(t, http.StatusTooManyRequests, resp.StatusCode) + } + + for _, c := range conns { + _ = c.CloseNow() + } +} + +func TestHandler_HubCapacity_RefusesNewConn(t *testing.T) { + hub := ws.NewHub(ws.HubConfig{MaxSubscribers: 1}) + h := ws.NewHandlerWithConfig(ws.HandlerConfig{ + Hub: hub, + MaxConnsPerIP: 100, + }) + var ipMu sync.Mutex + ipCounter := 0 + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ipMu.Lock() + ipCounter++ + r.RemoteAddr = "10.0.0." + string(rune('0'+ipCounter)) + ":1111" + ipMu.Unlock() + h.ServeHTTP(w, r) + }), + ) + defer srv.Close() + + wsURL := "ws" + strings.TrimPrefix(srv.URL, "http") + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + c1, _, err := cdrws.Dial(ctx, wsURL, nil) + require.NoError(t, err) + defer func() { _ = c1.CloseNow() }() + + require.Eventually(t, func() bool { + return hub.SubscriberCount() == 1 + }, time.Second, 10*time.Millisecond) + + c2, _, err := cdrws.Dial(ctx, wsURL, nil) + if err == nil { + _, _, readErr := c2.Read(ctx) + require.Error( + t, + readErr, + "second connection should be closed by hub at capacity", + ) + _ = c2.CloseNow() + } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub.go index 4c7c9440..62f8581a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub.go @@ -5,6 +5,7 @@ package ws import ( "context" + "errors" "log/slog" "sync" "time" @@ -15,28 +16,40 @@ import ( ) const ( - defaultSubscriberBuf = 16 + // Per-connection outbound buffer. Must absorb peak event rate × + // browser stutter window: heartbeat (5s) + coinbase (~8/s peak) + + // ISS (10s) + occasional bursts of CVE/KEV/ransomware. 16 is too + // small — a single browser GC pause fills it and triggers slow- + // consumer close, which the user sees as "NO SIGNAL". + defaultSubscriberBuf = 256 defaultPingInterval = 30 * time.Second defaultPingTimeout = 10 * time.Second defaultWriteTimeout = 5 * time.Second + defaultMaxSubs = 5000 ) +// ErrAtCapacity signals the hub has reached MaxSubscribers and refuses +// to accept new connections. +var ErrAtCapacity = errors.New("ws hub at capacity") + type HubConfig struct { SubscriberBufferSize int PingInterval time.Duration PingTimeout time.Duration WriteTimeout time.Duration + MaxSubscribers int Logger *slog.Logger } type Hub struct { - mu sync.Mutex - subs map[*subscriber]struct{} - bufSize int - pingInterval time.Duration - pingTimeout time.Duration - writeTimeout time.Duration - logger *slog.Logger + mu sync.Mutex + subs map[*subscriber]struct{} + bufSize int + pingInterval time.Duration + pingTimeout time.Duration + writeTimeout time.Duration + maxSubscribers int + logger *slog.Logger } func NewHub(cfg HubConfig) *Hub { @@ -52,17 +65,21 @@ func NewHub(cfg HubConfig) *Hub { if cfg.WriteTimeout <= 0 { cfg.WriteTimeout = defaultWriteTimeout } + if cfg.MaxSubscribers <= 0 { + cfg.MaxSubscribers = defaultMaxSubs + } logger := cfg.Logger if logger == nil { logger = slog.Default() } return &Hub{ - subs: make(map[*subscriber]struct{}), - bufSize: cfg.SubscriberBufferSize, - pingInterval: cfg.PingInterval, - pingTimeout: cfg.PingTimeout, - writeTimeout: cfg.WriteTimeout, - logger: logger, + subs: make(map[*subscriber]struct{}), + bufSize: cfg.SubscriberBufferSize, + pingInterval: cfg.PingInterval, + pingTimeout: cfg.PingTimeout, + writeTimeout: cfg.WriteTimeout, + maxSubscribers: cfg.MaxSubscribers, + logger: logger, } } @@ -86,14 +103,38 @@ func (h *Hub) Broadcast(topic events.Topic, payload []byte) { } } -func (h *Hub) Serve(ctx context.Context, c *cdrws.Conn, topics []events.Topic) error { +func (h *Hub) Serve( + ctx context.Context, + c *cdrws.Conn, + topics []events.Topic, +) error { sub := newSubscriber(topics, h.bufSize, func() { _ = c.Close(cdrws.StatusPolicyViolation, "slow consumer") }) - h.add(sub) + if !h.add(sub) { + _ = c.Close(cdrws.StatusTryAgainLater, "server at capacity") + return ErrAtCapacity + } defer h.remove(sub) - connCtx := c.CloseRead(ctx) + // Drain client→server messages without closing on receive. The + // dashboard's WS protocol is currently server-push only (server + // broadcasts, client listens), but the frontend's setReady() handshake + // sends a `{"op":"init"}` line. The previous c.CloseRead(ctx) call + // killed the connection with StatusPolicyViolation on receiving any + // data message — turning every client init into a forced disconnect + // and reconnect-loop. This loop reads and discards instead, leaving + // ping/pong + close frames intact. + connCtx, cancelRead := context.WithCancel(ctx) + defer cancelRead() + go func() { + for { + if _, _, err := c.Read(connCtx); err != nil { + cancelRead() + return + } + } + }() pingT := time.NewTicker(h.pingInterval) defer pingT.Stop() @@ -120,10 +161,14 @@ func (h *Hub) Serve(ctx context.Context, c *cdrws.Conn, topics []events.Topic) e } } -func (h *Hub) add(sub *subscriber) { +func (h *Hub) add(sub *subscriber) bool { h.mu.Lock() defer h.mu.Unlock() + if len(h.subs) >= h.maxSubscribers { + return false + } h.subs[sub] = struct{}{} + return true } func (h *Hub) remove(sub *subscriber) { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub_test.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub_test.go index b773824d..d2ed8274 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub_test.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/hub_test.go @@ -22,11 +22,17 @@ import ( func TestHub_SubscribeAndReceive(t *testing.T) { hub := ws.NewHub(ws.HubConfig{}) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - c, err := cdrws.Accept(w, r, &cdrws.AcceptOptions{InsecureSkipVerify: true}) - require.NoError(t, err) - _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c, err := cdrws.Accept( + w, + r, + &cdrws.AcceptOptions{InsecureSkipVerify: true}, + ) + require.NoError(t, err) + _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) + }), + ) defer srv.Close() ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) @@ -51,11 +57,17 @@ func TestHub_SubscribeAndReceive(t *testing.T) { func TestHub_TopicFiltering(t *testing.T) { hub := ws.NewHub(ws.HubConfig{}) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - c, err := cdrws.Accept(w, r, &cdrws.AcceptOptions{InsecureSkipVerify: true}) - require.NoError(t, err) - _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c, err := cdrws.Accept( + w, + r, + &cdrws.AcceptOptions{InsecureSkipVerify: true}, + ) + require.NoError(t, err) + _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) + }), + ) defer srv.Close() ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) @@ -82,14 +94,73 @@ func TestHub_TopicFiltering(t *testing.T) { require.NotContains(t, string(msg), "CVE-2026-0001") } +// TestHub_ClientMessageDoesNotKillConnection: regression for the bug +// where Hub.Serve used c.CloseRead(ctx), which silently closes the +// connection with StatusPolicyViolation on receiving any client→server +// message. The frontend's setReady() handshake sends a `{"op":"init"}` +// line, which would trigger this and put the dashboard into a 10-second +// flap loop. Hub now drains client messages instead. +func TestHub_ClientMessageDoesNotKillConnection(t *testing.T) { + hub := ws.NewHub(ws.HubConfig{}) + + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c, err := cdrws.Accept( + w, + r, + &cdrws.AcceptOptions{InsecureSkipVerify: true}, + ) + require.NoError(t, err) + _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) + }), + ) + defer srv.Close() + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + wsURL := "ws" + strings.TrimPrefix(srv.URL, "http") + conn, _, err := cdrws.Dial(ctx, wsURL, nil) + require.NoError(t, err) + defer func() { _ = conn.CloseNow() }() + + require.Eventually(t, func() bool { + return hub.SubscriberCount() == 1 + }, time.Second, 10*time.Millisecond) + + require.NoError( + t, + conn.Write(ctx, cdrws.MessageText, []byte(`{"op":"init"}`)), + ) + + // Server must keep delivering events — pre-fix this Broadcast would + // race with the Policy-Violation close from CloseRead and frequently + // fail to reach the client. + time.Sleep(100 * time.Millisecond) + hub.Broadcast(events.TopicHeartbeat, []byte(`{"ts":"after-init"}`)) + + readCtx, readCancel := context.WithTimeout(ctx, time.Second) + defer readCancel() + _, msg, err := conn.Read(readCtx) + require.NoError(t, err, "connection must survive client init message") + require.Contains(t, string(msg), "after-init") + require.Equal(t, 1, hub.SubscriberCount()) +} + func TestHub_SlowConsumerClosed(t *testing.T) { hub := ws.NewHub(ws.HubConfig{SubscriberBufferSize: 2}) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - c, err := cdrws.Accept(w, r, &cdrws.AcceptOptions{InsecureSkipVerify: true}) - require.NoError(t, err) - _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) - })) + srv := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c, err := cdrws.Accept( + w, + r, + &cdrws.AcceptOptions{InsecureSkipVerify: true}, + ) + require.NoError(t, err) + _ = hub.Serve(r.Context(), c, []events.Topic{events.TopicHeartbeat}) + }), + ) defer srv.Close() ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/subscriber.go b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/subscriber.go index 851b2a31..ed4a6388 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/subscriber.go +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/internal/ws/subscriber.go @@ -11,7 +11,11 @@ type subscriber struct { closeSlow func() } -func newSubscriber(topics []events.Topic, bufSize int, closeSlow func()) *subscriber { +func newSubscriber( + topics []events.Topic, + bufSize int, + closeSlow func(), +) *subscriber { t := make(map[events.Topic]struct{}, len(topics)) for _, top := range topics { t[top] = struct{}{} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/backend/migrations/0005_minute_bar_volume_rename.sql b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/migrations/0005_minute_bar_volume_rename.sql new file mode 100644 index 00000000..a643d4c8 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/backend/migrations/0005_minute_bar_volume_rename.sql @@ -0,0 +1,18 @@ +-- ©AngelaMos | 2026 +-- 0005_minute_bar_volume_rename.sql + +-- The Coinbase ticker channel publishes a rolling 24-hour volume, not per-trade +-- size, so the `volume` column on btc_eth_minute was always a snapshot of the +-- 24h figure at the close of that minute — never per-minute volume. Renaming +-- to `volume_24h_at_close` so the column name stops lying. Per-minute volume +-- requires the level2 / market_trades channel; that's a separate change. + +-- +goose Up +-- +goose StatementBegin +ALTER TABLE btc_eth_minute RENAME COLUMN volume TO volume_24h_at_close; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE btc_eth_minute RENAME COLUMN volume_24h_at_close TO volume; +-- +goose StatementEnd diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/compose.yml b/PROJECTS/advanced/monitor-the-situation-dashboard/compose.yml index cde7224f..5c6db56a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/compose.yml +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/compose.yml @@ -35,7 +35,7 @@ services: expose: - "8080" env_file: - - .env + - .env.prod environment: - APP_ENVIRONMENT=production - DATABASE_URL=postgres://${POSTGRES_USER:-monitor}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-monitor}?sslmode=disable diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/dev.nginx b/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/dev.nginx index 9eaa0e54..776d701e 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/dev.nginx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/dev.nginx @@ -19,7 +19,7 @@ server { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/prod.nginx b/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/prod.nginx index 17ead27a..5364b191 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/prod.nginx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/conf/nginx/prod.nginx @@ -26,7 +26,7 @@ server { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/dev.compose.yml b/PROJECTS/advanced/monitor-the-situation-dashboard/dev.compose.yml index e4bce9a0..88cec2b0 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/dev.compose.yml +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/dev.compose.yml @@ -35,9 +35,13 @@ services: env_file: - .env environment: - - APP_ENVIRONMENT=development + - APP_ENVIRONMENT=${APP_ENVIRONMENT:-development} - DATABASE_URL=postgres://${POSTGRES_USER:-monitor}:${POSTGRES_PASSWORD:-monitor}@postgres:5432/${POSTGRES_DB:-monitor}?sslmode=disable - - REDIS_URL=redis://redis:6379/0 + - REDIS_URL=redis://:${REDIS_PASSWORD:-monitor}@redis:6379/0 + # nginx adds one XFF hop in dev. Without this the WS per-IP cap + # buckets every connection under nginx's container IP and runs out + # at 5 → "CONNECTING" stuck on the dashboard. + - TRUSTED_PROXY_HOPS=1 depends_on: postgres: condition: service_healthy @@ -95,13 +99,15 @@ services: container_name: ${APP_NAME:-monitor}-redis-dev ports: - "${REDIS_HOST_PORT:-6432}:6379" - command: redis-server --appendonly yes + command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-monitor} volumes: - redisdata-dev:/data networks: - backend + environment: + REDIS_PASSWORD: ${REDIS_PASSWORD:-monitor} healthcheck: - test: ["CMD", "redis-cli", "ping"] + test: ["CMD-SHELL", "redis-cli -a $$REDIS_PASSWORD ping || exit 1"] interval: 10s timeout: 5s retries: 5 diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/biome.json b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/biome.json index 7f29029a..b830269a 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/biome.json +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/biome.json @@ -6,7 +6,14 @@ "useIgnoreFile": true }, "files": { - "includes": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "**/*.json"] + "includes": [ + "**/*.ts", + "**/*.tsx", + "**/*.js", + "**/*.jsx", + "**/*.json", + "!.pnpm-store" + ] }, "formatter": { "enabled": true, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/index.html b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/index.html index 1c9c7a4d..8f5c2dc0 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/index.html +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/index.html @@ -22,13 +22,16 @@ /> - Monitor The Situation Dashboard + + + + I glow in the dark 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
    wI| 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%0Aq;P^m<|We$(VC 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 gF)%Qokv0KRi0n{r~^~ diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/assets/apple-touch-icon.png b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/assets/apple-touch-icon.png index ec126db919dc679289e9ef69e842e82d8c5bbf5d..de02be2fc8a122566f759770558a474d0530622a 100644 GIT binary patch literal 54368 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ΠR< zdwp5M`apI}WS`@b52u+ZS~DDV8OV-3O_Z}?k3u6sqCN{hHb_g;-k_GS!Q%ECzn$sk|Uk&8bjro zDDsfYF0q$U5sO>Kvac0ut}z&_%h@(bCb^dh58I+*G%nAr1b+i_9YkZ2pT&0aQ_|koW8~|g)sy=nar>(AsL4YUY>b7)mptx#9 zp`{Iank6r5!gBij1{U$56vhkA^3w9>dGMK-zu?S>{weHnS6 zAukmppJtr7XwuXBxvo2)7sRCy1in~O%~QLl4kEyZ zfsf|)%EPKp)vt1BCv9>$L7>ql);wY?Mo0ZUQ?IFCV4xAL6#7imcd14PH@|AsW=J)M zN)p3F3u5c5>#S(iw%c1{L!=c86PI0f1=jaTrKKku=Xt(1>#Nfinl*)stm;sZiBVFq zOR9<&8agIo(8(xeZFQ4QcO>S?aBMY{G;v|Bt|mq5Cp9>sC+1Dn;S90&1b&jABb<6EY2_j>&wRO#zx|_}mmzPc*@_n%D$dWpr$kYC^c7WnEA227#vz zDyAUJ6^<%2>(1mLi8?$Lh}{rfXo-8Gb0Z^{6%spq_ypCUm3q`)000mGNkl- zCf0yRFvGR3w@-S+9nYxD8ImMifv~)=!s>shsGy=G=mlY~9FQIDh&m&|%XNlub&rfi+ z3&b!+BU7O=jNB&l^^6tdrPou1;zl9@=io-!_O-M>)10GHuHtKcVhHfW%9)&CEGDL~ z()=mb4=@_Z{4f^yyOMgRC`BPlOWPDI*pNKhAXk4W%jad64Gf{@F_~C#h_8uDLSZf( z#{#yoFdfQde4{Ug*e6SMQ4MzbD->`?0x+hSHu&86Wv20Jv8r1Tap0023B+W+(yS(z zxd4~T$aD2FkwBWJsXEJJIMtnFtfCa2QmGtK*QCh!zMiufYvoWwG1G`b9pc!mEUj0q zlr-}$5ol85sqVfyG1q-f-04W0`f`>y48`&>Gm1HHXz1=qnq=zOAn?iLyiEbg=shEi znkpPN5aYWMA~2S+G-{xB{_tP^5p~>F&M6ePYiSmn4sZ@^fm}fIjHfxpCN}Fcl(Z0@ z$TXpLAoF~|MibPbBv7HY%jBAG_>yk2uj=MxRVW*FHIeT1N9u=E8n{ruj4@)}JRMEH zTM@=cT3W?nq=WSpDGl5YxO~|s2t)8f3jOEHsnM3`Ay?0_>XN8Wo&1pjDKyH3dOnmq z4AsV5X+a$s1U~h81=qO35114P%mHbZ39N-0kVxN+G=raL20zeyhA0XIva#-` zM4_dj_sb=*U^!NvR-KzNTMIQ@8VUg@kw)ujGFPocQ)Vdy?n3d;L}9{4qax6G%4>qE zC4%b9`vc}`Ww3@+#R+ZLptrTe8+!wFT%ryt ztGiM>y?;tE+vY+8PjydS=jqvzA`UCkr|YY0*gVHmn+rv6j2J4ALmk|IfY;ylO3t1+ zE5_CR(FTF)ROs1(7|aVIF|bd$5>Ttg)FcA})iV=l+(b?Inu5R3NhT?jtNul?$TX5&acFTPl9jv&t%o0!@vM*gfmKz^U6nnWGc^|HtJL*fH?U&UAg~xc?+Kv3 z9|>eB?e0XZW&13pI6gfC* zOHUKZKYEA)4ltEU znIKeIfloevl>29X1YYMA2c|?9lIA!t)z5};s38GNs(Wlm2V5=f9<79xb zzQ9wLtx^V(e&tF{$1z|oIIh~5NhgmbDSX)@QlFG1aXjB=q+x5KxlyVKuBBigS>>df zI)RBCcp?VR)Q?@op~tdoN1@ntg;Yb?))Sypk;tZWvYW3syC#x*##pM-*$M zaPWL>76VoQkd?^gwa(DFI-|gnPRBJpV!(B{r-?>kEF-a5sxX+RM%L?f!XUuP^MlY= zI|_aG@pWyi6~4h_`ZBR^sfq~;<8gkiC00)b;1a&)gWi=5wcygHuNi7b;WcZ0rW{~p zqXlBYP;51)l}Td|@Wz^7$f*UeCFNI=v(#!esseQs1;k;1vzad@b;q(KQc3mBRemb4 zs3=O6kWdcc@{3Cq;%Wu=Ydz1)7`O?XvG}rck`*LQLdeEr_w!x7(AUIuG)gq`soo-* zs^$v9Gh^AK)oRfZyG{h!T=xR?xdSX3iH3?%kNYh=)x!aNAUS3=^5yPVmr+4g3qobh zLvk^<(Y(bY!H87KO|f!)h9oy4w?4!b)ByQL&hxcdK~+XJ0xWnzAY+9XFCdP5%B4Vn z(RUl+dtwpYcK|a2ivw{}Gh;UablPexw)F!KD+_v_KW*ehD0Tm4hPyV_L@$@gdcBmu z4{#3PQm&4Pq7XlbS?>&Sc`Y@ocw*nK3_F%YS(>f0d)pi?pS~t9nG9%*M<}M34`Rfs z)_Qciea@a;BR5tHBP~!^%%~2Y@l|HT!u)O$m*0E^M}%aCT0K@i9*|)SY!whkV!g3I zV!Q|)5JnhiHSORf2idZ;g+Pq&CZ#ia*CQnnBaU@H&}3<#7up(4*4urY#&>pc;KO=& zDnL7)+VA-xo><#OK^oOqwl1p=eDF$CYE6QmLN0{6dN^Y71@ctRS}8ZsprPbEeu zR}OP38qJL69;q0(Fcu?r_oE0WXUeLB7thcgT3Y>rVd@d7&Q?y6E-#~M^L%aAV6dJi z0IRYBNxzp6sbgxDSd3bsCv6)=XE&jG3t;6B!-78xp8B5 zO$~jWLB{4F6&;+ohSaDnIU06$hm~s5b5kj$Epf**?Aq(!0a&u3t z44y@;4h5V#o^RBSk$_z#67xBYxhYNF6DTKo-imcbV!~}(m$>xO1E56|FCS8``qY%K zoknR!80*Q77VGJ=FEPe@rZ!um0#>MTKdhR(2HwLRwK z@&?DwtBcrmSVk|0&J^0W-!VwqmNL zqE7WO$`2y)Zi_$~xK=8u>M3Qh%HgM;CXkjM^oIIAqZCV~WXvh-cKY;5Le=k-7IFrP zZzlq7u3>dy%M#nR%u_E}ty(^{d9E{fxknkqNM60k$bNE{TwE_148K=qgosk;f6JsWsPp;v=tWJnRA7d;|ZeY}Io8sh$r+ZGn8!r^_ zi~#0imA~-<=A_rQFV3=KX^DD$mQCrwvdWDDJ!9Ro9`#0*`R1%NaGScA#uI=d4ZrvS z){kjxk!DuE8SJ zy-)o<_dW6`rxl8IWmV;vP4z=v@%l=wMyXuU^RbAbf}31V1n^XZCbh`(wF%G#iP$pH z@Y+>Fv)q!)m@|zUrkLQ2xS&bUY_oxp@iGadTqgF_an=}tJ;S}X*&R+hx2ZVuwylda z)!&pt%kb9X`{5MGl6~O$SY0#LbN!}zxJy2<^t6kdBpRwGNsiHEv@6CL zXwq{=8f{e*JKql|bU%^9xO&tzd8$RefaPnouq{&RQu39r9TQioS^!ujE_*7#;`wC? z;}L`ro)%Jkt5PDGZAv7sQ;Z67FR92x(v_u{FIix++ zbwEjdGPivvv)lGFyW=2!JkQD1Az%2)L;TK1KE~(n_zDj`@)Rp_$lA;tOPVum+qO-1 z*uuPI)U2*GY7J_dKUIa1x>i?9jV6;yjkH`Psy7KmglgLJvQGhR)EAjz#DUm(qE5}z zoOY`vz~q#~T8RK&qzQF_(-}4JeLR7z9LF-K2R4$iQmT~_#u!?iA=PRF_oMly8tnj8 zmI3Os4WcN(U8~p1luEHWw_v2s%8ez~(CUV-1>~}NpEhhotys4P8(W~aSI6Uw;{$rSJGv5qr=esT2U924b~Kt zW1qG_cjEYQ27@-uYFU6v7;7%!>N6CeT{NOE2OX$>nb3pm_t@_9FeZdj!000mGNkl%*<-UoTWTBkC|O$sAH<@;Y^d7&VBU<&(mf_En-YDjEt8n zC1Pv$k2UrN69&VSkpy*;8*;IMuTBo*2rL4l3?)x2bkCO&wk*ywQFzGd#Co+vUStA! zBCuw(HF-$XF(a{0p!X})h;likQjQ2UqTX~TT`7gyZ}NCsX<)Td_N^nN8C|CtnQW3}M&%oU)li8&VrvMv~hRt_sK{-%!(cUveUr<4!cXIEj;c0fmheW{e3cvkd)tR+B2{$0hE2@+2Sn)b0Gr zum2YR{a4@1r#}5Do;v&l9mSxl^(tGoY!QHWvSa%$cI@24_8q%$VBWTM8;g>74$QL) z^UN+TFr)8f%_~^kMl!dJiQ@C&{1%#vTdB`4$-ZUCdEPd4i9w{sNFr|_tvePQIzuO7 zh_OOZ?kF-Nk=|-cx2Ae{BCXvLJ8iaG>fi}(7VU`<>TaSa{TNt}LZEc<;7Gu0lp=LX znJA2@RH}|^NRt%AYSnrbB;*T~SB?Trq^kOw<9TKZ+Ccfns(=Gdrs2J(;kcu)n&)|x z;#kjls((UHi#9zC+e3Adr(roS44Is;rUi*aj8(4&%**hFjftuyywE3#s$$on!g({K z;JcH3B)-6^DuhX!luXcO7r#oa>hO(PVyvcY>qEXYy zL>p8wevSUbN;(X<^cXQ&zapjTHoUO5A#}4-F z+Q;5K``M$kYxh2OU$mEXCT+GN#2ESFNqn8@ITSi>m1lPkG8B?_Gl6j2x`>d+UEN|BE& zqeoLhF>^^X+f)V?Ldo>3V~avBy8JxP6WbU|mmT=~LAZ^BSzkCif+t17m%)`FhR2^kCU18LICdL&}4Sd8xJuB&gV`)MB1 z>vwVQbQGVhG@1-G@)Tl8cP-VN!Tlh}{TRtPkt&2QDH7J3WWyF^p>L)fGb8XfO95`Q z2z9LzhLQyacOL89IqQt5byhNCMv}_u=E$=+P}eIlCD}KM1HwpoC@!p~fLMB{5SMFz zTTzI?IHfl#=qY5n-h*xuacp(Ok>vr89^c^Z$4>H@yC32spSeR5xKH!h&wrUG4ATx$@>MrPU%YQ}fbZarhD zX!!L7gfR4`#>q5fPXrD(F)50I*+zx3ys+jv#1BBs85oPNRF%e!rBesvTtFF%wT+y? zXCw{oSl;&pIsvZlK&v>Z`!_!ZI+n^6F?WFP94d^^oQTdaVIo#dG`0poNTpIEjw3RG zdE{0iRbJ#7FV&Tgdvej0=n^_ zq&65o#40~kNzOIF*-l?coh=2{j+XCFpIKvLWs}u&>#S}L6#mONx7z3A+JGlctZ?rW zNBQJkkMcX8zKi#M__MtK_ddtRfBy@7@ymDf;`GNns7aLFZHq*tl?nX_&-z>dav`5A_-@-Yz!$2hr|vZB;G966 zWz~sw4Ogy1Op#O5*tpP)1R@P%>fB~2q^49Cz#Xgm>6n>H$d-DEEwzxvYAgq^lr(WF z#zQ<34XI!SkY*_&(t?Gr6{<+3=EEK(O>nAmsAgzs1_g5!pOR`;^)nVK0b6HkY@eTF zu2Iv(DZ)9{tj_1;Xmj;4u>d=eR4A)FBN^jBS*gz`PTF93b%k23LKwyPVM$C`V`+Y# zxrGIMIqBlUEF-tVC`r^C4sc*B)oNHxxB|6(D6K!xWVbI_l^ermt4mMOfUe5x4iZ{g zZg+oUwPzY3_LF zFrU5qaXx>~BYgJG2l&$65A*n;V{B}!Q;1Y5WuNU^n(W@Wg#-I`ap{4Jxa`t{0_kO3 zcKPL8dF54HbJaCmdG$41b@la1*K+kW*Kx&FSL=8UOWU{86l?Ff@(Q+JbrlPjUq$1x ztEgOZ1<`@a@Wt2_G4rgLcy{MS%rEX>erAcPlRLhLC;Jq}g4$guep$_g$)q!sRS2?VExj2x962Od>$~s{N`W5RhrYl8GI2F_cFn@RtQd z=Mu3Pz9Mjy#9CF&%A0bExtj8D*Ofsf3G@hk&s56-oJT0l6YJSf z`IbVTU~11Cd4u3zFd<|p7Vi!xBsOLsO}*Y8NdG4Ing?WJcVAJ4T4Rouq7zL;F?{9a zhY=+){!DXLV9C@q1tkstZe(&=e5hsWi6*?U*j|0f>bWzVIC+|5C(d#9{5tEczNFNK z78zP{k{)MQI-ES$;)K$X>+|Tbb?!U7#@$aYbI;**Zh!a`pS=4BpMCHIcRYEH zd!IVTlgG|+NB}9E)xjwf!I33Ahm)C z%QWkAWVXU6m}R14>Q%_Yy6!dUjXb)&LS_reO*mZ+Zwtsyldr6-;*0%_B!@M@v@X>d zg{`zWFhAFzEC=&7!Scgc?4pjyl#OVnR*7hBoL6+CKLxp)SehVaMcV%9QyuO<-r?ah zL+(DZ$sLcM=gUv6>wJ|jJbsQl9zDw)kDcbrkDcYNM^AG9)2Dg-_<0VWJjdzfH8wS0 z$O}WI6l!ECvu&}?o^4Go+Pj7Qm+a=UEB15cHJ5VD^;dEI4cBs`Kzhr~FXNV5Uct*= z_6lyj^){WqlIvdbQZBnvfWGl2UiI2HD!qZ*Ui}(wdHHSJbj!=R;ig--MnJ#%+8a1} z;xxbhzTf0m{`;@;_kZ#qvPxa(&YN>=_ng=Yhv~@QGtQ@YrGQeeg*!-WsWNah?TK z_s_1|*8OC}P>c9dA<^nGW@qLeKIV5$GNOEU17-E9}BL_SweY?E2$)-Yq zeNB8*g)ECa6%aDYk)=^9F*93c$JQnn?U?7{i?(p-#XGqAioIMbkiO)GD|qRR*Kq4g zU&3uKzlB%7>NZ~Y+Sl=hH@=y-y!mas#zPApZnsMx$4^Mxcb`bx$2thx%|qjB|Wa-;)9p6N1E6D?=1d5 z|JTp(Gyn9T^5(a^nf1+0ZvWipC^QnP>Ev?YTCd(>OCDKs$RO&_@iys-`Nv^G9vBh{h=~k3lBI^mr>i*hhIHx>!$_gS ziRY0Cc!egMh2%n@RY*^a?!_gnq)S+ih^2KWs=Hql^u?+J#bOcrN7V+KtpQOKs^_w4 zr-o51NfSvgk1+ysRPuD*Wn=9eXp-eZl98A^wI0`8e=V-_ASV^*y}tjc?a`ujh?#ekVWpmw%ME zzUzCr^r~yA3aIOfVjMnkh7=#IRq@Hs+|IB6=KJ|C@A;qnlaK(lKuW*N-~a#+07*na zRLB4F9)9tce}(_}pZ^=D&#m%(Kkyg%D}U{;^P_*`ud}eY#Ia*1`1}{Xq^8xGn_tqh zb3-eebz+77BH1RCTySZd;>SPsV}Fxh`IZ01_19d@`Lk!Ij$&nB3K{wj?0>|iKk&q# zy|4CLt+F#hH)*pxI!!xWp=(z-n>@*(@m(Ct@8eYP7{|>0+&B6#xA)(}m$F~yKL2-k zto$*KH$KnW(*5*y9b>t&%6-Rr)h^{MN@m!pA@JMK0QZ6)$<|EBMeyKf%xa!Y}gQ{`;@- z;g5WRPkj2b{D=Se%lx}v_$BUt@KH{mS>~+L=0=O5V*F{E@viTAC%3-rWi%R%DPWt; zCWRcD@vsi9%~GSuJ=NlYln_JH%+n*DGXRMz`4H^!PAO_a34jAJ_LYJownd{N``HpNAfP zoIAhrfMTn63J9O#w?Fs^KKAL)^9rXMU-uTtj3@ZW$G^bue*AVmG) zWJRv3*a$zWE6UJSXlpE;sQMWz9bY0Ul?ep&9lLhWoT-r~L$Ue>MiCYb6nKG0CT+fT z*Tr1-(wA}l%`fNf`yc01cYTT{dY|Y1_D8vY_%Tk5@8F&XAK>l>9_HNm3C<55=Jdv+ zeEE+1Ir79w-u8sg-DGo=IF z#ryZ;HtTs9>)}A@z8hoQ;g3y5ed3;X6V8(-PvLn!8=D)-T4lL{{@Ax)7&q;=+6*J` zYOaGI1kT1ntHA>?fKIt^O$PxiNPXh8j8}wYnGeQ_ZE}n^B8ktj_ojfYSH>j42rb6x zRbTf#J*!f*m}82J@B7|&@V!cvN`>43Kq(g+=W?Lq$DXFQehwFV4m^Q5tWmGc(Qfr< zC~}hP{ZNvn-e{5tRE`NZH(SalQ%WfmZbZOx%-GYCdQh3+%4=UjU6N(zj;*}oZEt1c zqyV`YV^u*QpEhJ>>xSY$|lW&~3CCXG^scU2tvIC7nKV(|!4B(ltejTzxxmu}cU`^ax(lPp-`U3v z*k^J6NenTWxd6tua@)Xr5S|-rfh{$A%KR`ytA`&L{Wsk>e*-a;@J}lz3aa8Ro9azPs$$F zef+H!~XJr{m*0?C1;i*@@$OTtT7m4-02HC{ZW?s4mH@2r*$5^ zYr<1s9#T!`2r>c8^GP$S?)4Di;gu%ry0qY$S2hS|3?^1bxmp=t%mRP^@BSnH-jDwS zR?e;A3uy8OJb@_?D=yAdiFNdChz$cO^*Wkc;`;_8iQ|X9uDg37Teodz%l0hoOgujL{@>;PNAF|z)e)7&5ru4~kFR_Fh5W^S=NsqD z>v9!)cw@Hio?-38n8$7(Fj<|2N#z3LXn0J;BB>oS_FDM!>se}##zRVq z3$M9<7q7Le98#dW}WkIzTbM&!IPCijEX;r010|6$Vrrf5a-iX{Ev$Q|w zlAA-WdetnAorcDa0(`SO6Lc;2B1MS(q>5{zAo53oggYKh3$bXQy|a^k^vRQ4|8NyxK)FGEFSqydcw3 zf0|DCssHmI@k9UHU*z=4G4@k$4~qYX=#J4m*(8^jsV&L!xp?%pGZRIHI+& zCUzb%(o*+Gz!-^nmv-z{NN+br|GC}$jbow7+tw{hT)O`towE~6tAXh?1lWSac5u!Z z$r;v84yI1}gFpBqG-qaXKNE_w3-~E;+41al^ypFE`|I!Hl$O;mJn-zDuQ}?SAPA?+ z-44WI81kb(`lB?PO^i_ul?n$?y&{a$ZnyaOCqGV7>T&VSWwu`w;AbUGm;-WLJ@V;$ zdi({y+vl={g@)~kP4JgixboE%mUc$;&l;YVuJ(u9Fq23fuig`=Gh2{&35h>q9JEQR zEt1+QrJb8>xpKsHZ=T_0@7l_(Z{Nky|QmE6Qy0J(;GV+I6)T)H~V#u$wr4n(iM z?bR%w>~h!do#)uS1?eylKoA}Sip(+|hzZl22Ohk43arsk;5R;=wR+CzIc57byS1KV zLLuNAW%7qpA(Ny@iUYrU?ZANpyyG43kfZwUtCD;7LOOBkB!Bg<|4mxGH7>t(D;M2h z@#8kpWDDyjJ#K!*%ct)dqoR1>Z}z!vqBCS_yF_zs4&EqW&A|DiBc8gihaK1P3SSU{ z%;xHNJ3TL~7|xr3KOyr*WTmd8M~i4t$GAf+EQs}dV8QbPN+m@t#wq2%XI{Fx90i0? zq)=L>`<5_{$OMpNGA5DK7!EWNBqM>%wcZNsv+O@`5bJr2b^W1-AL5sP`9Je>Klk(e z{LlY9oo;73;cKsrIQmG3Gf$*=c_ct0mQGmM4V9&gU;WMhq}9D26okr_R zfB$d%-~aMo^5=ix2l&)yKTUm`C7A7!n+fAq#FsyDgn%YL@Iyb09|m05Y`!F*zFEADiMgwxK z2(GW3$2ixqmXYGKL0n^Yal4`$7m)}=U%u;Ze&~n(5xl|KgwX&;QLo<$wJ4 zdnnIa_FuO|tyW>>$Ovx|D4$fIPT6%GT=(`Fu6e@(wcTSr_J#NIJ0Ja3M(L2k%Ta?6 zo~H>@U_3w$S-8e|1@8W{Nv6VG&rOaEjHFbP&wTdx`9J>APx3>5=?8iD_kE9+#=oDR z`k8;kfBv;!(Ct7(XT#=%ctwU@DpbTI!Vs4at(t)n$6! z4f;bp7sl%Bh^;&JQpkCJ<-hz7{>jh$GfplaVfR&au6gw$SKLZa$>z`&^U185n5jVVfmRsJw$i+7X z*xCSJ5tq%=1?P?@T48+?KlnHQCcc|Y8pDfav(IHi3&afK$y{JgZAR)RWZ{s-0~uGp zYMxRx=IMvpoPEfrceoCHpCI?JqBFSwSSJgVi#p0=5lPFZF{x1rG9pDQa^+u^?rnER zOteDg0Iq|yvrndF@GvYXmYuRVzsO>J79=}bt#x|CjwXkR7~2zzdfcHQ{D=SgkMNKG z#ZPhX6JKKA^%eHM1QsqEvgL{i^9Ki{jpNGmJk7b1q)A92=W~Eo6$EZMkZ3nCebS)I zFj^(t*5T^c*SY?!GhFx9d2V>?g3^-G0@n+O7t)+S`A4L;%yNTE)90F8_a^1@mKj}} z;d))a_6>EmTsESe#P&f$e@#O=GvR?Rp5`mRx6Y}1J)+(g%A*-Ec9S@X@sof| z?3v&*S`C=-O4xjiREaePxr+XSIYi*t-MER4rFxtzmk;xrjiihVuzG+nWC z=vy(jk)EF5Nnf9s9O6X!6&jcI1;9CWUmrqsok^hNb(jdKst6t>v0s~s^3F_z!-qk@ zBEbO)V@P#1)5tN21{C#mvf8TB3T}d%G?vNg%M^{(X`-C!T}-py3EH0m+(1|*U$hLEgRWMa^^g`e5bJ;*6OG*l2a*Gk`PRp`|m~JAltTBI}!>!VuSKYcqsaE3Y`!~7glWm^5 z%j58!aQ49(tZl;+sNO%T1X#Qgjcxyb)>)T=RPP9Gu9`gpFR^GvL7#a?B4!m)P>gi<$Pj)aAsOfr# zX>#Y!Ci(e=YoMq8S3)*3LZVfER_8AHvS*-t{Yi!KN}UHjxx)EJ$MT_wAO4$vi{{Q9 zOo9xf76p38m7#2(%l*41Z~I)=#2NEKGBU6$&VV`u(O02fG*M1kS|{3mo&&eR&F^e* z%i9*X>XnOZIS^w?hLU2cc0C{z5YYs2Fft62f?8vafnvU8MK&_6*m*&KCotzlPL?H< zN-=@&Qz=K130(q*sv^bx?jaKp+ex2Ese>nJ;;E9p0Z-S1tVB4jldM;H{7Y>f`uqyr z)r7g7C9b%&LStKBO&EyzJPJvnd|2kmdo#ZBi5@2(4j7+nV%u{R?OEu}5F|=zNsApG zCinGDa3Pt1+$Dkw-<21IFJSw4l36YpU9%b`{IslmYDyJ?Nld8kxis_f2S=Sai*@#QL}Wsuoo8&FX&IT{JCvkVRH&^43Y|tp*+N}0$kukut~`D zUttOgqi3Q%xd4_`R++z~&1J7GxcZF|FMahcS}P}Up*p=zAr_7+6$*hmQ|Qh2Adrkm z)ni^MVqsyPx!E}u78merfi_wb-DCgt@ za9Ziq1BH$mhritC)WdzeG{F6fNI(3y|2n1F8C*2T(-OISpH$_k7~E#u#|u2!Kb`hH zYtjp)O%40?moD6J;5X_}*Qs_yAxUDikdlu(Og2`r*;sv*VHB1tmuqx817;d^Q0EmG zv2%$iF4L&jr_W6rmnU@En%s?gq+`hmh5o`oOjoLNPOSTdkDcQSA3D#&pUyb(m59eb zGvwZntnuXCU54Xa;k%L|G9_F{j#8K08&P2ubO z7pxzH)gu$``OImayst~|Y@Nw!9n+qnG@2zEmx(7Kr6j=@8O!GqE!S_8#Im${Ek6J0-`9L2SG_F81+-N~Q|RMGwA=5d zwmRE?H5CG`$*K7bx~Io9${w1}QFtMtCVsVAlUA!swN@pNelCoMRpg;;V@BN}jhPwB z-C@Pay}cqFgwns%H|mC~a+V*~_b3_nI9vxBD1P9Iw3MQs!%0Ir+$l z`#&Yt{>VtoKjQJ*;n3|qPkt`s38m#DKA}R5WEyUSWS4!eQUm2NvoPdkZ?1CdJ7>7% zdz#$*t{GnXwk2KLPkn1h8p=Kkb$eB^G+}7w%>eV!>YbXSo zOq%wX;vbA)KUt8%a^XTimnu%*jK=vw!zt9dUD~zXjr#}(HARb^+?r*Nz`HM zbt6q`t6X$lmG#XI_kQU-C!Xw+Pdxk}$HoJwwkc{Yj63%djOGzm?|UlUrdA6kmb4v` zZ`N3Q!gA^!r1gCsme$`mm9lkD#O$64NoAFVg9Y0!2{`ody*zo(-EPp(r~$e1QsrJ0 zyZxqGS?DP@$x!l&06!1$iwKkZx}n`DeTR34o&0==(PBxYVhRB-HzAp0LOjaV3WL#r ziNKbLmg902=WIb#Vk{=F*Q(T{yNA6sVK&E8?7FMyMzvn0JX@h_&#V49zMRDC&v5?9 zU>ce`a7~HrSLEbz4a7SVZcKI?pHpt$sNCYN)eRvTH0Pw z&D-{7d#!Nf(>t6r1zZl0(D+RN$#by)I%&0C#A-Qd| zJ3Z?4y1)ZYYPdg44HbXJ7#ht5Dv};aGG^RwG3c~N(=o$I7x&Ky7(LexHrUKJDD+}9 zEOGq4J`dk}bqzH7ret*8lF43rSI10~$gv%h zl-gW;Q-$kaJHzgMGn{>Tpr}WOWEkSPca*m$hw<>RsfW>o)yRQum~zpjRrX&~Xa5Zi zF1@wR4R4s?#<$nF;aw%Jev2hq=utRU7jO%e<<)vD?DBc?$;UYQkQ-!Auq*jnwJp z8)fzX-*xvxrFKE=XJq3EF(qas70N-Na9xKeE`hPcaYg54r4n1VZf9;`X&()PCu044;#|=dPq_Sz2~HyBNL2K zI4);#U%{4xu=R2|^QDC*g+2U*F3j{XjS;Dr0OmqPv*tSn21VcXfo4d5byePs1~IiO^HO@xM6F;}1!zp6lb_RL`xmTE+0U%-g*wA>wrB}M}MB+YSue`gi) zo2^Go2AjC(NGbA|^i$GYf0eCNnv?%_wY&On?J- z<_#&d;FP&{!ybeaasl5`$Sy`uc2DN2maY~CDJaVGIlC^aa`zpdM^m)=lUOnky4Us`3bT&2*&v@n)JNONgg2LaUC zKNWjVvLTt5k_qs+Enr&AGe<6LxooACb13!Me{F?c?;KCu_Yg*ol`CJDEc#)iB)b1+5M6XQ*BWMLvk58cUH|y>WmUd1M2l}b2sWx zOL9ISN@6jzveTrm5M?@Pk*d7H285Csh1k14bi-|cAB8M#-OA4G+Zp%eWW|`3Q-{@& zLwbWYgYigOyM!NutnZfWBFFJljXVMMYvC#J4~7FLYw1Pc8pfV+$|8MgwvyY7;1 z$Py?Sp55G;QLp4GBh}=zJTqj=t`eX8=*K8}15JJttosK!T?WeExJ;gX`2}?RIzT(4 zxC<_sXUvr=WS07UM!`CRc$rDqCG}DqgS&}EZZZm!en(7V-0-aU+vu33Dky~Nps_%k zq&b1~b5{|MQl+NJoz?d;)kcH5mcB!2<3%l|40|0SlT!{Y{XvgVArGZO8~^|i07*na zRJ~H@nk=xg`kdbofjdSe0Dp%O7Blb*jo2Ske4&CXum6Q$6J}wg@ zrgdqWujEHzGsbb3`ODqNS7GzaQ1WAhKb#ftA_33!Kq0%zA@r_bEo(e`ZgdV9mGB3W zCwsYP3ti8>5lFkQoxisvsg4BHP~DSGBr{@yFeECM=?uow>mjKa zJ0rmQ(exe#1fEByy@99B9QM2P6rwYDiXKS#F=l*B*dR9( zaDX94#p@g}eA}B*{akW+$)w0rFeaB>a;zyZMXK`xuby(r%V+SkqWAchmua7gMXai; zflL)DRFh(QG)#}~T=#VO>vug^xIW7bo{mM3Q)~JvHsOhT?&X*M)&G}CdlR=nm1*TQ zSDSeOZWathp@WXN?HOa`(rl?Syg$asNcrYGgOhVS^+kBEiUnFo_uqgV-UL*Pzwx^WP=}+)TueS_1J9pDOKvzRIb*Qv!Nsz5{T*M z=jJGvv<^GSiIQe9k_48d;&bAdvXtTQ9Wo>0Zn#h1+QhA4JUnpsR z=Ag4bad(dnTM+fCgwlR_I#yQ2G^*kGB{o_k;>rw}38u^3^=1<<@F~?Q)Eadx|`MEY1CW8X?oS_!_y!7HlX8nSX{q~1glRbRv$xeE}J;V!Zv#vSD zFYV4=I(*Z+sxUllsT3iRUb5K*aF*kmB#}p|W%h-o?O=VZIwaBk!m})H z+eW!sQT(~b!u%|o>#I0G*A?2!@(fdpUVLY ze?nGWW6R~a7E)9nKS7;=DW=_{3*X9KP?%irTPbNJEg)S~AF+Qn;65?*$)}GZW8x-= z-%753R-P4nVcM@ohCmk1VvWQ#{LT#L?+c7~h9i1i%TV$TV zto&Ua@?0IypZ4}_nMMT{O!YJwc`zXhT(qT4CP1pC_~Z!H{PCMCsQrSyeLZR@)S*Uj z){K`x{aT^Nl{>0^e|l-19JbO$!>9Oz))>xY@Lu&1a5jbXAw#&Ntj#Kf3hH18yQ(Xs8^n z8cKsIRRPoevt40OA_!F$0fTYE?81WbH8iB7!=Nmp4nYi^im6*IP5uOGHxWE{>KLJ} zkB1X{>FdJDjjB(}E@Ny)re4eq1eTuM9w3?7qWrN{lXjW?9YA@5m*^e zo~@2Xt{PI|(J!<)dvwIoMJ29((;U?;aO&}ldq3P|<KBYkLuWQEJJ$A zr@#T!nZ;#?>$w75ePF|t z7ry-Ie>xKst`07##R8yFee_MOmn~JJsdUiso8LXzLpdm)Jd4N`doN2nr{wsu>(v*{ zapJLu>9sTpsC@0yto6q9_(J%w$b86K9RP)Homo2T1zRqvaOrJT!ubOCJK^K^u3?vR zj(u*Ghd#8zQ@=mv@lUuk5y-1-o`~@WGX�f%~zNjEc6R@W_imNsOuv6z?F?n5L;g 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 literal 22963 zcmXt9Q*Rqd)s z1vzm9I2^byU%ntnN{A?dUz`7Xz(9eYd8eS5zI;LcA}J!M;_>w&2ew;v0dv&$D`0PPa3J(vjqJ z2GNBU3lM7d~zX}rLC2w8RfQAHVxCaQyyqoOj+d z!#DAjcMPPG9xeARhQx9NGD zQ`-gpN32FeFtnPDB5zNZ(o`8OTXlUOXKWt3p_rW?k$Ho-f&01npC51bOEuc+=+tV- zlnE?e4;H+@4d+^1R;%Qzj$?wQaz$a&@#ML5M&so8cn1$s0;RV_WqDWS_Ap$ITW1YY zhmD^sA)MCBG#P9v&PS7y?#Q3d`$(==8>_URXH|8j+I&6V*4yj>jiK-?mkoNIj3aYE zX^b-ULlHkHF(Lr!!w2Y1w^pk_2$I!mQ9|DzhnPgNA+BgR=<~LN*o;qVzEx2-*%&2u|zt} zZ8)mO8))_Va4IzU-%{xW@jL7U@V%dqKAtX!r%*Mf9{h+Fs3o&# zzfVO{t1=&ur7HEIs`}aKZ_HZr=A@e0_A$+UeKLr|uX4LL{J3Ua2OE3NA*M>)Qdn5% zVwytbb?f-jP^Y`aDwpUWd;5}=WxLcEk%)alBiY8t#?r(>2^QT#SJxrVqj&PG+Z76h ztFT(C%w+KE-txJZ1s8`*p5JRlRP^859;e*TVN89C{vb%YU*Qp7cb#c#Kkw`MC_euB z)s>(7p8_jvRvYb}hh_@m1YYIuX4m=lSc%8qmuBYwoeaN<;yx68%txdHSzb3KUyt+r zm2?RU!CjR$^sNrO-JPeUSxPBm65rBq-(T)^zxnJ0LN~jd&Z8}PIMZmi%6x*Z{T~

    mOjlyHSZvU92Q` zDg3Q0HG>Z1a&T(XvoSHfq`e_I(a3%ZnVRLrySKj3SUSEDTO_{xIEBX+djI@3KmUP< z&R(MkzE3E85q!flz0B)HVL=GiAqp3HmUC4!QUyKC{4NS~k{o;LwIG#GAxOC3obnGlIj&LPUQCk%!~TK~ZkEXH9RJD zG@54AhE%ahcwd9OHm@^ zU7vrIE$()3hv&4hSnb}kKD`vhB#C3CA`bJgUY~7<|7`+51Olf!16d%X&=AGOh>{gS z1unZ7B!k{O-gdbaP%@q$XG_Mz-76NuthFdrlmn|NFE=?EnNALRk9=G@6Pls{dgon^3WD zU96;U;ub9|J%o-usw$e%)V#7N+_|P^l2OZNLy8o3vqUOq=h7Z~gU+bSP#EKT+mRLt z4y}sYFjQ&|g2Op6{rXmzK%tt+LDf|PS!a<05=#KP$;u)M3M#R5_J8P0CCq)4fs0u)QVe}DdQn}p74 z^5PSVPA`i$1hwy)bbjULj;iGvl&7!1hne)qo&UrMN#v|?4qWJ_XkJ%b``g|Bwq4C~((VdZ1(uFY=lPO5l)d5TwfwCqMtFM{<8+|%ppb!PlK`Ln&5{01#vQaT;OPn+uO<}2$@iR~y zr&4>+Y+hdWYIl8&?#=pHX0ega0BCBCi(55BnGkk@6A3$6E?es}Fibhb$dF-17Hk*? z*UFQkzv38$wGc?ycc2vF`ql_?9Sm=<;N(8qZ@yIXGDA9j{$}AG!_$O_rQoB|$i?D+lb5 zl9rq%k7&Z1yUJGGklZkZo_9G9a6m{NxsI3rJ%$ES8Bk!}!xVhbN~rw7<$JU1l^mFl zCla^FS8CLfjCh^M{LR7C4SChv3_JU+l!`#9xg3*`78-2mcp0I26RpW^8fVxp<`nT> z90!B6#yWuOVoDCr9&&?BMi@Z^z`2JF9(5^39g|EYQKOM#g(AfTOBR_dyIWgh8HzS3 z1z@3u9%HJ+xh~LRUCz^YBbM3epy1&2YQH32l!~qBTb^@NUQdNG5xk`|g$?~+JXxZd z!IfH!CpQ<8fB;Ut1qNKAWCehPE2T|dboP+2Cc%HAm!bxAN&~n7F0QzwJ z8y{f9olt=}W3_|;DheSi{;-e*dnmrG`L!<Jm9_bc=Q*vL=(D&=4%vkefgN5`Tl>P}6z>CImL+pr}Et43idx z+JQo>2;foI_^5D%3`o$QIu8mGFyvPw8AH_IT*|DU~xu<^j&?|Q~e@hP&}4HB$q;AxK#0c6}fOGJCg)Eijmc84us>a8?|z~Z@4DZ z<(R}dEK8MRFaQ*UKOc+Nn||Nw30%b8JxukfeC0}$Z``s`EU{9?O5rZw$YnTTObt9A zw^5WwVRmd zntXv39lU4u0%krGsL@!SVCDo2fJ8#asbQFaI5e%E86}FMgKVbLl#txywm%_K_kEgE z!IaGDy^TRp<%fcwhpoqgqtC<17}i^<^=Y>*wO@~vzM6)5Ng3z!_5WhkkIP(aZv0}3 z|MmZW|M*ZrHeHAE^xXxTe%>M;ky?}w z?Dm!1yl5C%8HqD1@sAWz`6;4}D z5NE4{cHg|ZXEa7Z)IQdZ&5Y`v~?yZ=h}&v4F~&9biR zX<}o^+TyxK?bj8)*WGtIJI#rwEy$}~sqP1kxZ4D!OZsL)pZD~9RjwJcR?m7i71yel#Z{Rm@1B1 zB$BWxFH)wIP$F$Axh(%nRiORja=v9dQ`2Y}05H(Sgw-3_%dEdzLen%F3+Pnf6&Ugm zP4~?_JN;<^EuB)_h0`#b4S*Erh9d}YbU^2yN7h;jJ*X<`f&)*B7q)hGPhMH$v`U>= z|J}EqQo{iTt~8=e$mp}gFF(nyQRWIY+h>)DNpPkt>ZeIUQa;cAL@FwINKiTouL&k* zh@=1u9*WP+xy7}U z@`9}(gqC?j(Q)~%X8f32ZgEvBw1xv!k10;qeMbuYj|eF>XNxBd3?wz zrmIOHs#}!e;e`Ov1x<)ZmJIlNvFxYCPr zA(3Uab%#m@3Yhgo02UP?M1#?q_;}sxOA?vto%LFvT1&=()hdb7BLDleWZeJ+Wl>uD zSTSN_MEiebgLx7KWo7InbLor`tUZT~pzXsJbY+yv7qPgM1m3|!5R^Mxq|o*xQR1j> z-7NZBa+~!NVf7@IF(?RGrc*^WTLdYE)+Rg-@|4BFPAo9#CXp$MAq6`8PzIKnH|J}^ zj}Q(gBLIfYDzr+8u>|XC>LncSkKRzO$m%&#${1_jWL*an0-Q5>S0oIe#}fgoCO0zbI5AN19ee zAw@DAn-x}6!~`UX8eq^=J%AQ)WCnj^fFv$S>0|dTcj4ww7*$r_LHNAG6WZx*;pE%3 z*}D~EE_|`i=TVB6rt^q%>3-Tg{ovZv5_MKb)^u|t?Xb`GBzu-;;{B^S4LOql?=EU0 zBme*c@vcN)Ab9Z-P!ba>9Lx+Fz)XQ)3vo+E1qhupZT6|2C-4U>X2rG&$8AP>%K18G zGuy&;xr2Yrg{C7rzt505Z(2RB;u+iLR%GC;bjslAl(^|E>nqWlS=(br76A-9eH2IL z>`um&cS#g+KKj+O;~(ZRjdX59cXd`3IP3SlwVx~+z1VB^-!Z8+AC~z|QmYCm2$BkW z15z3g!5Wh!nJLJ~VnU$XCBDue7KRNhEVWwK>;O=HI3gNClXz&OrDKY+8WwI=_Z>`i{V{q5d38e}ApiTMWch#u zOikH)DKvU#=t}=&!i*B}Z(r>&(dmw%EB&Mi@JRqU$1g3hk*GLRF|rYW3y4Z%jJ2;EewksLyjF7*{2Iw>VVCYD&K3IR1FBbp|w&eSm&?vU#HSws63=0bH%knE4E z(;UJu&f!!wP3Yo+hY%oSb_}H_7`;O)fJ10nqDKmnF?%svGj`z<7J79&@Ol7A1rY<{ z5rd*G6>v&}BQy{J04dC&Kzs(=UeI4Stf#R!tHhx5PzM%KXC~C# z>N~bT-IIAl-WJrYxM@O}zUL~DQCBA=ZWiV#iY^^dA1?OLe=0PLJ+qopE{$`_3w5$7 z)Pvmmjq*g&eqHw=r=?O3S?61z>l}z?V##2ac$v%K1?U7MI>Bl#tXdTUfFQ&O z2#Bb$0*0fQ&l4m=9(o-qZnH^W7CE4E5qqWA z6^=f>f3jV=&~!aiS*1@)H*}KGZ)`yJ#<`a&OYsIl4~USYg3@R=efgjx4YojN$AAtj zUGKXD=I+yv5o4e=oBJe@ltxQ2=Xcv47We%uUZ4GG71qV?ci8d_UUlCw)`2XF#epEA z)+No4|AuhYL?S51=NRShBreY{{Q@S^LV$51-lJ-)G{VoYtS%VR4AAC?f*=qGQ=Mpw z8a}8Qu)2q0=;95$XjJG)wwT>lTG~vt(8Qx}`_Lym=%ARPX+}uaytHh>WCk_J(VUV< z9*y1$;XhuYazAFactLYXAwmiT(4%cJ0u!vGM@Uq}AhmGLNH{tKm8X3PP=z{smQYao z7&64TqXers=TUeXWN~NQB(R+B8_R_v$Y|gu*F-cB1ONh_QFNHG&{py2xxG1@kVFN= z5s6{-r0UsdFyuiH0wPV8@rmBVvlC|5c-u{c@U3GyGop zR&ZK7uQeVM+0(1KlsM(ixBF(%9u`XGlcCbd0r1|c1!j|UF*FGQJIo4zFw+VNg$$Sj zgC10hq(Xrp(=oh%%K%psL4vPXgD=Iix1u9O585yl##3GkB%@w9@dYXwhRvHwzFqn4 zL#TpkL6*;wJ7OAvIgN!9pYoE4_)W3)b)v*Dy~WR7PQLLb9h!rPrR7An-7E}&Z-yf} z?jz&)s8K6|7JK!Hdj4yh@Ex!QIb>oJA^-p>>D&->VT7zP6h|5n!raEfgQ>yQkx4(w zr}kT2u%T+s;7?M|kf1(t2oPrqTftOy7%a-GS4cR@i$%#bmtzZerfV4?6|^Ps9Msi7 z$|7cYxu5<0OfBl~s>v85Pj2w{#+}2Zan|R0_s)WLyT@v?GFR0MNJiQOsFY(gG!O*6 z&0uz*VnmmS5oAR$z=9Ga927|qX_zC@iVNZK1nO2cA11Qp>pPtD-L0sqgA$C>Ajp0Y zJ4G$5^ehh8?B>oF2mjJTTkDG+Rgo@KCDFRLrPUtdWkudzdg!73>+h(zY(;PVeVxX7 zoahg$W40HKIUW#nS)tJ8^PfMI1?Sk(W)-E3*<-~)&b)~B{ z8?@XtMuE#wvBz=W9B)?@uQPG~>YdyD^=ebDwFgBCrwR0EVTy zCX5IUF*DRqwtyhp^}5M%WN;kK9CB9`ZS-Uwy-I47EKGz|0*Xy4s=ez*=_%_Mq>Ef; z;%ROsfvxi*+2uMnZu^@aQan^T6b+ULmqEli z91b{p8N(u{YWw=Xm_pQ~A(5nzDqn>Gm?Jk_fzd611xcFR)CwDGN-R1xXKQmaCkm6P zCnXefI!VWqbtcMMWt)?uiM4Rp-0&U?H+UI{AXNET^p@l23WKbl?G(=F~p>aXSnXwIaEeUEaNeR*0p#skif}p-b z^(6|=IDH$KR{w<)XetK8hm89FaV$jn+3%K|Akr?Uaj{Zcs-~W`$A5{s)=xJED{O5id{ozy4X%y({`I1Wc+1YybPCWc~mIT~1khDIEH6i5o9rBYhDuS!3*=bE(cPEPa%Y zB$bpkGFt_`z>T6%c?Oul(;FonZ5tv31%Hq=+(~f>Ov$WWc_q}a$1g)OXH2n(ri6u- zsTt)2tYDwONERYQtThZ`q*YZWAjDXHdHKq1N>rhi5u!rvR%&KVMHpN`t(R<%x+of_ zFOplrB`Fc*DPO2Ll+$oz3BX(c#YiDC_OT9#@@3{xkGJkgfTJkk5eWoP_!SYWpn;P@)&po>fn>GFn4XCqp{Z0M{a?J&^YTquD#AL>G&4e2 zCov`76)!30^VMIFx$ujh`ebyz5%&}>b1Gt4CriJt7f0JxGs+hoeW}c6Ez-&`?E5LlJZdsorgB7Jy2W6P1~Al~=k}!oicJH;a%J-RepqK>tK~P# z%<)9RxX0yrtV~bkYKQ~y-gdeD-cn#wh)FXuWsn2DW(gKx8BO6b3yKa9^C8j!scCOP z7zNa1%^~{1sn-hW=}J2b#gfwYRegEygP^O?Isf~#WZwV;YDw99DIEH83u`ZBBYO~u zJ!R~qap~u;EPaLz?45d5L(jYM+^h#8JDC3n)Qj6aKlN5J;aThV{1m3!N-+=6f(4Xq z;Hc~R1Uf>A5Wtw5Dcxl%aU_az?H51+brJrnDFBKE&OW0dEr7`_C?M5J0!=-}=8^`_vWW7ig{EkdQ1Q(oaJZv*8qXkvWMiCa96p-v zhaf`VnK2JEr=!WX>^m|r-_?6<-pBp7*WS9;pZ!_Sj~=tVd}i@Y{meTkv7aF}NessA zzY56aWCsw;sz_-v3U`x;&Ot%N!oj9Mh_Fyyof8_MOsB+>F)kJK0~+La}?hw`E5DXd^$QnsDk2R2^EP9Lzn)Qd5G$^~dBZ0yjiGu*69&G2q+i$-qj z*~?3I!6SwgIoZX}sd5~K)t4(T#8R13Bntdx5Mp`1a71xtwP-2)ZDr3|>qAKfsAE!y zCaktMD3IQE9474=mBSJS)dd+*au=hq5r@;FNhx-p$NTAN;WMy>FROCu7M6E%LLKM9p_ZEJ6tT%TGGiufsEHEVFcjW3_F*w%j;L4iC zB_Hqi{K@*Fq=aER9iDz6=Vt6;?5-ToKg0L`M>9Og>Ejo^XaD=;Wa)qikY85*b0mQA zOA9Z~=^!B;cV+p!fC@&H?Eg2ANR*T<#>=f<=iQj+IsgCv?Q)Vk48PRQFn_Tdqtp~_|6eq+z2c-n{Aidu(hz8SYD z?4ma=iB46iN$}LvKNXbHMq{<(R>ueiv|OyM!zz<&F` z=WFO3KHERgMgA;37>lNtrb}xr{%rllirpKQ^7-dvx(_nzO5RbN1Kg&s_UG z@`iZ%jW#}EI^ScfG2XQ1e{H#GW$5QCS&p5JDTM-B`F(~SYdWpWrA!z zX{}~wZOv3!X_?X3+iU`s!l+Fb*c8VQnj(gcVd)_#ILw)gB}z7|=z&Ok4M(NN2iJ4I z8HUM@T6GE~{Tpv>;f}P&P_r@Mm~<`@Qif2(0_Yg)?#qv#43qczjzj|;|KtdHLxOUM ztT$9cX`&Oj%2*-{a8PPYA=tc>`HwWYF}&#AWeRBL3IF@FWaxkdwq4r)Wq<%*!<#ScFaZ*|ZDZ|aA<2u9?0uw-=mHVuq)Xiy zy@kXIy-YtJHjy1-aD~55Pf!2sl)Y6d6_%AmWF}ArOU-G+i!el0GRQ7+K;#Gib|~^v~t@2Ru)KR2$!p?XR#bPf(GnjaX5~()(JCUrxa|6s?$UzIQ^51 zNdqEjVa$((L_Q}CB%RhI&d^NQTxtn)b_r{djlDtP_7X_3MT!e3+8AmCVzi}L*(X?! zBtO+CYwGbOMOWj;j8uUd{uEkQTWJ;!jVx9%gcNLUM;@1%RZAmM68}_}M@wN?!!77% zS9&r5FoNQawR@8LFaP_bME-yT4_H`xDI9WliMst{!<B_*tX^^UV)GQ*qITg^m{ZIU1jHhw7Ks^xqeoT+ z;B*9S%y_QjY6eMLGqn{UxNDq zh2n$Ev^I3p?ctL*yQo~t)8YDK7%3geU}v{Y+@j#CbR=kMNdOf-r6}T902th@72MN#v$GjCKT4*$64#I~3X_7x;%_N=9ml=tcv$XJ+EWanF z{!H-E;%`cpegFQK<D*_esByzyI@*Xk0i5OKibHpen*5DUqUp1>RxOh6h-T@!c{+ z5&;JzZPDUc&$9?fcY$Nb-Xs!NpThfLTaYbl*=bWojJplfF<@wLpl3YCTAD4ndRg@q zpLt0^gnSSdMPvlVIu)0c)J?O^#@Y1QyO~$&qSMW{=RERS&Hn3tig=&Q&8~LN?{@y< z?osRJ3#zI1TfusQh+K(tD3Mdx6hls^yuj)EMj+&fCl?)2Q z46eHKU$To(V(GzzBi&^)P^?UfQdMOXWB>cKWZnP-OIcWZDIEH0NLwFaBX>~IRblL~ z&nfDotNoOX?JRRMqd;hgK|q29WFbk=RBOaG#)?{Y7s+{Eb4G^jr(Ck)h3Uh-D3G*M z5sruJaonBuh2xI!k68pch(csSNFckwYA-@L1%jqT!AIi(5XvwRLiI$UwJsrn27$ZF zVKr9J_)>7jieQX@fkzxqWm;64l&21acZ6N0WmMapH0}-ym z!6M6G?E{D$bsjD%qAi+fSdy_=Df{frcIpkdSboFIFi5!BoQj1l5j-xj6{yBlDwN!; z=NVHy)w`MJRoZtCFa=mcge*1)Lm3IJF$X1B{N}{9$iXSm|JW)WoT5DitJwd8P(|z! zy!Sfxp{}#5Ln0pcs5dlf=86D^cuXQdDUmV-vPg7(h@k^$tnf@-;$rUOwL1G(f<%ip zxx(T$34~#*4gyO#d9zY}DHJ0^dpFB7?5bFwo<>&)>|>XoR<}iip7rv5*I%5Y|51qtnv}(H{UA(aS27u7sGTUep@1GrklJ>l#n7(h%7J& z)*Ri$Ktl?FNa{?_27%bN(szo@k9j=3+B(5JNk~ap>9X#$5Uomk0X=D4!Er~m%-66t zA)HHulGAfDSf)i0q$2L+p0ZrXCnS$Zm$T7sl>hs*MDc(G5mZ=v3^O`_t7{KoBaIKm zVPUMKQR*EmEOnL{wNE;|zA4_jYiHU+=dY+Al{*fqdi{!2|NAyJZ-(u^6;@TTe(fp* zD1%c%Btits$KzX|W?8##B=8_bE15%5*);cw9~^X+Wp{-|LzM+?VGyKGHBxx|NU>Ta zNdyq8Yg`wJ1awmoM`4+ss^Y{$rQ^JZH^hbHx|) zmeTom>nkud+dVN&8CuKx-ah2iKEJT=mrQTM#6np%xl?E1rF;7J`W2Nex zI25RjGethRmOHZ~aeEYh;Ah~bCXNKDh$c-YDWR(#jW*kNQAV@QtDM4)b}I3!kx*lp zhvass#&=SUS28;tk(Ij?j>j5LWf%`TD`q{4gryT8!3yxLbObH3F{&XXqNU@MG*g%} z8d4O&0}~i1xp5N=07{BG3S?d<4Vb@g!!wntC)5aohZHf#GwM=>$|U|1cW+nA@{Uz@ zD1xdGG?I0ias>vtF`WAV_9qs%)7w52N@X$`bfs@C|7AtLEtZU0Zl2A2mZA#r-lFCA z#MM@zTm6@s{*huAhi+DRFiE6f8p;`x82|tP&m@CR0WDkX3+b64!Vv;kk;Mf(FN8*6 zJ;;DuCM~Xo#SN5jxQtm+9156tlyup$Hj5G63sN_;2h63R0*1+E5UkW%D~SY+MykNi zAp1_@Z`D=xei>`~X8u08oF0 z#hDRNZDZ`D&|(fRD}9C`TuDzVnI!JX=O0lp?~t|C5$>635Re7Ve3~buFd?o$(M!Bv zq%nL@sgl8x(!I#`$v_@s3^il!uGEpBhMT|YLDMae$lOO@kU)2 zE%B@S)g?YV#2}@Nb)?VX7)To(P zB{^t4BPT^gcRY!WGI6lr=@w7as$-E^Kjak$DJRv%$@|%xvU!^3WqhOOU;IZWWvsTGITOy3o+6)$0z{EjArJrn8P3HO(D6)=1cFg7##Wgvvb%wp zD|KXTF_KuOmr9UHJv`{qw#itX^307GK)%wZ&&nv&%(!_{lU^iO8OvwAMVHKr7%ShX z977b>cVc^Q2ZufNU+m>pK_M*|ITr`_D$9Iz1)5+;N<D5?hg@ zQ35gnYiTkgZm{FgJqFq>B+`BIG`*QcI9mV^Mqu9V_4iz)wfkIF_fGBN{Ctl6_xr;U zw*9XK?f!$|cfRejTH9jdezxV;e)#%?hR$W|z!S@|vl$YR1>QqdGDFmfEDeDZIC#wE zTEszAHJ{bw>$M050{9$Og~kn7W6-S!m{M9%!h<5tk0wN*oBN95lNOrf_+p@p(Xty8CnX*vf3n#qW}A} zMBIP`3SL)xDI9u-YfA5BCVNhyXJhOjQR+9YD>bB!J;gq#h@ujSbB@NKla$5Yk>q5> z<&-N2%QQl2G89^PtBfW@iv}1_tSo}Vh4GXv^EdQ%&5DvL{(dALE2+ixL-Wqs4t^S? z1f`%<2n?;n6oTLy3h$$h5C8#Q8qt3YfZEXUXbo1x0WxBs0x==CDU7MT=5-Z|H2P<% zs43N0M2UrFd7PYPi2CWMwf~WnlWuFKL97T5uRPdz&k^XEi!4nh0YVAo4Q4GwwHITM zjms&^RDb*UGw!@PK0khW2><^qfy7d6e}y;_+Am{%8Lfjfxf!XE z1OOf3Ehr!hp(2oyQvex2EmUWDO*PZ^1FIK zEz&rwqh2OrkTD`9+;fBw+F}sl5iGkHVv&zhS+U=lIV5FhUo5xbJQ4oCx$g z|KsF8Z8rWS(z7k|V-^3uSKrJjn4JYd?CW9cwN4~~0XxEJNr9sPA^?qA>EO7AfM%+w zOdC&ROg=o{!~y`IG=TIULzq{g2o?b$5QD?&H?O79GA52EbszAP>TY zO#l0|MC5=3QCe4PDKuJ$OA7C0hFwu5Jzuqy04gahEB>;81r%`Tlo3V}O(={u0l|h1 zgPeKBt0{tnv4)cnVzn(_$fH5H!>I8Hd8a{YL`|TH7L@fybVX9s^$%omdDl}_6f}E} z|1_>%8m@W1D!7}gf2g6bvi`F-L*Tx`b}|440YpR_d}@Wz7xNM=SlVMYcXI9|aKd6f($$f!w#AW*>+89}UYEE9aQK+z>lQ;daF z(J9eZT=OO<;L^82u{;e4IA~;1sW_1<(FhTtrK4jcXevC`A*dP&y#qTk2+J;OnY$W+ zUN^16f~CyGip)UpbB}d8o@FB?jl^IDa?+i-L_Z8P7oI~8zp)u>#?;-otN|O6?z>Wz z*OkE0dsU}lZ|1LdeyvQ}b7r4~!f0tJcQ*docj)iNXnERL<;Uu*^yRrl&1zLzmRWM$ z1twD2RFdavSDBd31a>Dcc2g9s)BrqP3muRs2>^fzQcGzHV2q?1SQHB?0*(+EQo)Kt z8OYg@lY)lG1%OEgs1mTi;|9JME}uw%FWI z%UH^}7?l(Q9G`$&JCM<(Z>no5oDCRmPb2%+o)KFZO_;NZ8gU}cb?d1;Zk6?S<+PEQ z1|=nmQsLSMc1w5a-bVL%~90u-vl zAto>oj}Zc4abPx_y4V8IW=%B{+q%NPYLW7E*!{G2jV{Jm*W$9=nc9c86@_E%G4*{S zknU<~v8Ve2IB|wZ{kdRa1|f#shC-9-2AwK&Og1C|Re;7NYz_dWlQks7brD^4xaHVD z=AfXgwRc0X3r>tdEk)vzPfSxLBnc>gDKF(?^Iz>%c}Jnk4(8=Fk(#dyvgufi(^6Mh zh)CnetcsMpY|%L=q->Hf*J1b};F+RJNgTFZ{KoG^u1Y0w2noN3VNbjHa_|y7v)sJH z%fhbhf&d3W<_>Bm0YZR6rXD6@!XbhIb2CU4F+!sU1TfJP1r1$+QNxHMF(D&=9bKso z0mKqe5@85PLXS&e06IY;YX(t4U>fi^;_5Uy^AE#La1^E%%$IEfP>mZOMfUny#G5QV z4^7vX#&6P5cFsEQGr!OM&3*hc);$02yZ`#bf6o7Z|M{%9uix+am;e6v$o1jJv%K#v z=Rcl_YAI`|mv(z>K|9U?S17FJ3(PzOm;kcj0*X&kCDYY~rAmar@h8M~BpkwYhC?Pk z0!-E_YENHW)ty+rBhFT})ja9!8%&$Lbjinu{g}Fu2LO&V|}Pm<8roR z%iAd5-}=9sIL`0Wx1p@E?&RLHS5~cV)!*tvNanTq?8xT3_vy3rT&nDUe7hB^m2M!W zSy?6}A}D}tp^1=+V=@#d158=ZR^bt-RJk=g%+xjOf$AX&&vz|aI~DsNwP4qaB*xiP zeu|k@`s_``_UA@~BB5XEsSmVE|3CiRpgG(-vl=-X6Y&s$<`o-p2myy}n0QH80^&g~ z_g#ud*$cIlH8Vfi>J&{Vh@?!~wz5OzDBZ8}3JORXRSOk6N)p1BvMBh%on0cajCM-1 zCOoqyO6YINwz%T2ubUEh+#g$;lEo6VV^{W}jHkzzvWFBEQC>*l<>~N6u%oY@seA7w z65)eDhrlaPI4jq)vZ5AhsrWZVG+v|L+%Wq<-rBbxv0umKT) zS7+=b)5$E5EPafalK$GLICgq{KThR#%x-+AkSoPkPm< z6ENQVUkqyyNrjd`md0vI3QZVfd&Y)_Qi?k)Z)=!KC9$(en|L7a;Q#9W>-#_T20u6r zHt34Rkdy##g%XJZGXX?mjOjy$O)CYsmlZVED*bg_)}rF8rIybu6WWYto_ob4k(yrO_vKNk zk{GS_S2|9=Nj&`idh0Vj`B7It5&iymN7Ku}S30G0VUBnB2_I_6iis4TbKS_fN@!4g zfWacuxG(@TwgrIH&|5A?Hj@0%YFz=&XG<4YnAGNuAI8$`sjA*>>i_$+WZZxRxLw%$ zI7o0?ZcVTuuiW@oPj`bicn-m%T!fDQ!)58>QG1!rPt=&3eYK~sZXXrDP zz%luqU{?=pn-nfOVXQbg(~$w=Fj=yiw!(OcW>ZCTi>@87G;1h{zR}-t&j0(gWaIz@ zTUOY6EHip;XiGm}#hVbpFJtVn4XMYi>wScY{c#te&W&?2h;Ri_DPojzlJ-jMv{&`u z$A8)H^nTCv@(&Em^h(`WE9a63N@Hb1a*-uH%%w^K--uAx3yf+I!N>&lIBL}XsB2Gb z5bcNpUC4!*U7k!@rij+TO4uZIS(Hd2r?FUoBr6MQ$bk zb)rC)tZO#_EQ2m#~@6qX1MfSt7&nPx7)2w8jv%ps8+7bJstjwi^5P}|C~A(4y^@ho^i)s{@b|IL=O z;U7UAoq<7X1L<;>Ef=M_J`!T~Zu{?=|C&5jAWUM~v0cm3(@iqMeJ|0_N&z5og|c9V z=2B*&ZSZAcfPlat^N|pcYZgfWD#Ie#(y2O9o7LoUYF^#CZ%J`e7*0j*U`H&*N=lGK z5oJTs7=*q!#Do#O&)nxMq>MV|?U#)q59R?6ojIq{4fFr^kFv=LX@Q#rZ%Mu*fV zRfntspmC0|j@u~88&hP>N7H6fW6BC4W_ctHz?BT;c)McJjBSB4RoKXD>GsyH#7TGT zQW)i&M_ z+nf}trRuFf%M{Scgp3B{nZhFqgd^Y(GXVsn9<&Td0K^Y!mQ*Q`u?PIJ;K=l-TZ;8f zS7oP{8oH51B*n@D4@xAR4o6J0M-CuK9%)uiCbar$lgcg$LDIH?0}(YgK@+mHpGw_` z@6X-$4}TYty$|Pd-N!t`9&M zSka^>R>chETmSpCWYhr!fLB-hNgVomYP%m`!<`V>DPhd8>?k>-~ccB?1VIbz~~L zyvUvk7U2?iaS_3U5JHJT5n>EJ*qvRQ2D;qYWC)99<<0}DjTKdLuQM3sf@2YD`7)5W z0;J9}QLY?GQzT*X>c~4V!^k5w(Uw!#P&#b(#tucs^IIrV;W}#|BEdZfd1qxqL=XU} z%&Za!)DYaL3n9AMq|u3>lZX#A&tOVcu+5FQtTaZ$g~?`8*(o3{1cC>rK=74lVrI>( zrfV!Ns_r6NBZ~Uoty>nGy?K{~>`-!3@_Zh{a78_>Q4I>4UBiplRXJrOr;MWpNgRWr zr@lmcE-Uu$%{XqSMelZC_}vIr=$n$?p%b$fs;bK%7k*PhftnE-=$jP@UTLH_GfEga zZ{V1sfFLLVNC?321em(jJj z5yNUM(Gn+l*JWCfw@wQZfu`jtK8w!d5$KnZ(=jt}LW)f7`@OLv9jz0kP`Xq^|24_c zM8IcA$0jdW_|-Og>#m*uQjb&(9$HP+5C{bC#~>2cGdP}S4>^i0iIy^?P)D`Q*dUn$ z5PeuXAr{fIm>7B#VE_BHWZM7)OGa3GDHQr}Y0DpFC2di`HDBzcbLssltNnzc9kE!a z36?>tw+4>jw^8VL+hIhZc=aN-?z@${lDT%C+|}x$D8jEb&3QdX&5ON0&V0LBmwa0V zQg8lglyJKi+)_6%TTuJ%xE^GWyGLzC5DNz>SY&fBNM`6u{Ltr@U|5ymu!u?s zvn8>44~&&!QHKswMEr^W7kHhbQ*CG>Nb|kpaa3=4Xw2QcZ`;IG8=rCiGXL}YmcbI+ zZ1YhbVhkzNUAo&}?fp9OfX$?sl#l=b25_Aj=vV{^Enxr%AQTL|<|ylFS{rqOekBe( zx-9O)GKeZ>(pD(cCX5hSj4-x5BjIS8bJs&ohd0j4pSESZoAemQVoU>aNC{ye2~iVq zZrG3xO!!Z8|2TL1n!w7PQ6C(sYdp=v@`wk6ms42TdCvUX&H|p3Xt~8u2#qMnq(veC zcZZ<#h9<2LIEYjzVX&}hXiHd&ne1=B|do2e*+BRySyZs z-yTwo_qPc$ZbmORZ_$~q$N&4ZMCE`3`dZlg1|0Z%3F`f2hGkH7SzYXybK(!GtUZ<) zt=V55)x$ZzX(puIysrJf_}_N_zPxxVV?NI(S*_krAjFW=60KquM@!csFY@)?wb$T8 zr=R-G1u11?Lo!JKIn0>Lpks_A^lUgZ{TjHeBr`$<1MQ|{(Wh%127%>OU}qe%1>2TA zG%KhI3F+!Q(hMzk2%c;8lDp}VhiEn!$b^xMEylU$xU$^(FOV%GMXR$qjMn;|=00Zl zMAIe{mDDa#+l~G5;n#T7-J8F3=lys8=Qm@wPi@zEqn-=`{f!RhghT+B;c?J-1ECN~ zHRuI{(A0Za$ddsuWno|t;|CH6fs`bQuGr~yNOMv{23^ZPK3XVj4dOYO9uFf`79oTR z9Mp@YV!3myinQ#6dzts0Ezis5Y9+{m8PZ25rjF-i=^Q3f<1c@{6F&yYk+}zC0otV@ z5Qu8*uyZJDm4oJ1mCEn zzZgM_SBh=qh7q=!=(s_+k%-Q5V&!iovZXMG<@xG>hCJQ_wkV(>0000A^zG2}!x%oz zgsKE`FoQ;cxekkb)Z;CBYDw`|(tjp{JzETYPf|H%$>ff;6bO-h;rh$#M7qPvO>X4M z!P&|z@a)!Y>yy$X@Y6W++qwo0z5n~PWb%LnH&j@ADKpA-YI`4LBYP3uabN7DbLtQ; zD?OtYea1iE*IRR$-%BSuykYo2T(fG~Mcw;PUfhX7oRt+g!E>D|6ni0#AS|=012%(J zLm&VE7tZidaKjJ)3^gl^2o%gPAi@X(h?m8kFs8zpm=vij_vnqx3TTPdMpGhw*Ng8ew%? zaaX~cDdOfHt-8MU^(K3NCiUE%oXNK}YfF{h>Qb{aY5AY*%Jtx7$-B<{^v!a%?%AvN zs1)K!nUFvr0B5E1sKJSW!OAG40A^qmZ`3s6viF79ODKR&1rG&)m>?*W*#;PS&`Jj) z)5V_Xx0g2@kGaPzliyno`ALtI;oNID`jfl$BB8z8{=bXw+B*5V`WyWJFOR~3Gz+NQ zd)J+r1Dbz_5iyY_WR^@cggFy>>kNSds%gP0;=sq^EMg#mG-f79WuoSiVyfnJHY6Bg z=0U=S955_aAO|vH6FDPgVa5=ZNtWac)m)Kf{D$3Oz$p_0ODmJ;@TA+_05GWPS0;)% zqwBcc&}d1d*$ z5(65h>c2ID06jFKmn*h1{&(KSxeQ2Qm8P}n-HFIWOA7UpNL4K&9*GJKf7hHL`vU`p zM{q?FU=vY-0|A1>aKPg^u|pmp9T^&7y*6$toE#<&5uGFeCTWqE5$!M`1_=y_bkZ|6 ze=lv@2sovzhaM(mA_(}2LSPtoQLaq*T1l1e>lS@OQ@ko=DVtKnN{1KINPSuDhiSZF z%C5^ZeeTtYTb{F4ns&vmsp%AAMI(hjk8`5f-L_q7C5|<2Zyr>Jqi)P+?siiXmPqmK z%Rl@7?>N)w@@(uls}8tYgQAsuPY2j5iIUIMkV%mMzl* zn8ROL!AV->@c^SlL|lv7*-;QyWLtT8^cliAwYltsOTU3p>$01%KRsv}B|A-~su=eG zbj}5Oz#RK9V_c5igjIv{J8P_}yZzcMd@{SvVZbJ`wNtxdl*|_1Uwm2mPSC9)a`=ux z?^CZ?A;0Q@kQwofp0?wpK|~i&qc2rRl#T=&3rwT#8BR(ca}*!Sa#d&n>?%QrXfvgI zaZ_;8@GD_UEzpP-6JfPjed#N>*>$M#@VNKr9#xh2C4CV(q~^=gbw7P6WXq)Wla@CP z+taK`NUIAKfi`wA9mxn%IiuCF$bt{7$lE94QoZ6YQ)&a_#1|X~zA25C4>K7O0rF*x zCuo`JM@lqiH0x6qh^fJzd8w2vzAQ8M%jk`vz7|?=!u_Z;yQ=JOAQS%WDAB&U-=$Q| zR;QbATBuOt!a++r&uYKEZs)Q-Vcb1xK4{gaFtkfKOJ5JOgG(T-%kadWzgl>7Mi@?= zPnp8~i8i=j$K2>1|Ie4eYwtDW&=1Q>rx|Qw@*F7`4o@>n_@b#gge&X5u7Pl^r?N;z z5(1rH!k_e9;$0xmm}$@3;*fX1?qn%aSZ~$@R;&ekL}nUziqN)L}eVNQ-|cCRIPy z2n2S^8L*|13{uKs1^m*OmLXl!&qJ_dQP1X1(97U+-8I#Ajm(dBgSmY5H*vKjy>}w@b4{zyNI{cU@E*iFOsC-##&dorJ=YHJbYFM*(WJ^*G7H zD*%-Y*f#b4A1GwABysKQw`t~5-8>^w%Xnl9EV{}^c(XM(wqqq4t-SzYwerLYRA1ps z#QcM7nibjE_G_Uucd6~a@$?8h;Dz@Ms-H7}BHqIsrujrD-ykKWLV+tcG$c*jJB3#H zSl(&Q9kFr31lpY0q7oh?VMq;?rTXE;-pL5fa4npSJg{(SFN?`LJ$ilm7`J6#3e6^C zRrfURFWkqr2&813`fP9qg^mFR_iJHH-=v6~!9p~)D`(TLNAS~=_N0dP9e4}0${UAw zcjp#IW@P-fbSBa%!EpBxOmcoNMu4#l)6S}J^?WVVqTPtw4el?)+f2KjQJFr z84M4t!Bgu`tI3xtyprS@JFC==b;wKJ>>0!`+3{+SPVh|=8oLs{pMq@Qwe@(~5QdG4 z7KA39Dtu%|73SDeES5IMOSn6rmM7j?X60>|o)`r(EoK$IO{{~P)Lb8AFq)MgewFCZ ztt2Fu#nP14Z3QI{$G9pLrIlz;X){$#vESfT~GV|_ZZz;|uwS))(&UWjSK(A!a2md6c zbMb>e`5z2E_7R4ki;(_#2vH>lKlu_a?qaNF#2l==uiC-6p|{#2T#xhtjOX`~2z zjueuucWSh@zsaH~*NkW0@otiWR6LkhCbTRK8OqiSEytxy6#L5LTPQ?Zp~Pr389 zAY6rcjF;ZMa@f<9UAeE*(&+_xbf3Z|9UMnX6*NM1TVe$S06s|j@DtOMD;0y}3kGGi zxjR(8GLTh$%;~p%h~(Y|-N`ynje&4QPkvIx^06&e6^G7{$qnUuIWlvxsKzH-(m&B6 zD3D)@trHo@nh_L?M5JViAzs}^Yvvkt*j8=V69-H%bOlE72Kzhi-+e8;yP+&;S5p1j z^qVdE{OK?5Umcue(vUtz2Onc+4LB5&&&?B?poZ$#>J~x6NU;b=X;HX}Mb66Wp|zR( zMAI(}HK{pV)SOqGjaj-TZHZOj__SqdL@#3fV#&DDvM%39TUYq=!A{$;qPTnafujP$ zvv@rN`CN;3I|7-%0;^y$ONjdd4^G?<<}d1t9xj$j#cU;y#>91+-YKj#NK?|21tbCA zebcGMpBcb@v575=mSng(EB=onpN`U4~m@2ogMUTTZeTJF`3fT_8-F#JkEJI_8r z4Irr>L!UGMI(YxgCQpI8GCh@GIif=3T${m$fGkfKZ0A~{hcat6m_9RRw$43~6VZuq zv7ekq{Lu6`uqD#sNEsCjRjPi2P*|rgh2{)1YLyr_oRp+Gzehrx) zEnl4}(zBQBFP%?}&Fmh&zIXOzdt~CeH!!z^-!#O&}yhk}=8p`Y@%5Tsb0GuIE{1_C5`%jJ%76zU1bS z>{mGgX*r^XZDLls@CB_GO5pnhc}?bH(5K0d32mMzFUKkWyrNMbo2N5sFf@||0`R=Q z@`vIoQaiG9?x?LZs}VkN`eQ#B{2LgPKjaoNir%?8#P|p8Nn`81%%@=HDy}9}Hk;15 z+{+Q5V`F=mEvbKmVzoG~!IUY)BO)>f`t2I0LRcZ)AlG?_IACiZSnja`F>9V}-13+UpF-6T>YLy}+&!xhqE8Ouw|c=0}Qkt&PI z*S($FzrWJ%KO#r=J%y-BP2g+dGetsTRBp)V9UotxvjPCv&(ubOWTRyb09FcxnD(D5 zX-oU1eLDOPG zHfsllaKeFIBPmt3$ti&*M9km`F-KyZ%glM)`!}cH?W-t~C#6`H{est^y)~~6kTB)< z=pPJ3383YI3paSGpHK82Gea*zd!`m>&=i5dQySIunHQ{Z9oK%RExnf1k; zK|j^GJoOZyUdyx(d;c5Z#BW`##SnoF{}-OG71K(2<#s4!X}Xm*)7$lyoLkf$bt;!Qdh$Q*2k%dR5{BmyJHwdzi%L)v#(r4Gcj$Sz&QOU#=zH;t zsoPabF{PVr91`WIhk$%DN^_Pwt1aJTKk6`!6?0gyFRF*Aa;<5Qthu zKzV{ncXv7+?^Ri(q58D8M+9tidYYf97{V9IOHT-`vl7yDYjP@Pcjbwh3XiOAt)(Pb zaI=8f`{z6+deEQE7`!!G#jDEj{gcb!3s){8?(moLQzt13yv#8S!k!1=Sg5y9#U?VI z!1oXg_}^P#ROidbyS3Kue&(YCj+#NQKkfd$d0~}oC>(D;DT^QEuOpM+aqO^D!x>Mq zO+-Y_V45Tr7=2G1~VIp1d+_PoATG5ZecX8U%o#o@*qNjW&k9?bXwltH4 zd5uQjrHtG8eI7;qo_$wBQZ=p|h#TE*9-4UlIxl`p_uI)(?4Y*1*<;75Ou?C|oGefh z^SI6>#doA&9s5@U$e;yJc{m}n%cR6An6-eUJ}tXVRpxQq5|^sSU!m{ zm9!ioReF{o|9jRHhY#w1*EjoVJR~n<_M-CO)olP)*WaqKt`-Hq)B1fnEIwVq*RcCu z=IyaXs$XluQ?uP`$(AE@XC4>G@S@K?fS~HbAyR^QIbqI`6W=a{;@GMh1#l}o_f;EtVEw|KtRMt~uby0M%g6AC z-l^;SaH6I=chJ%}&+d2oe$Kd(DatKgz28^&R%Vm;KJ+!4%=|K!1=pjsA8t=L5{_RH zL*tZ}-`-7P|L|ea_2mxG>?XMN^$o63S%xi`5YREvm5O8_V8x@oZ{~9hSO8mVlsr$B ze;8)VH*XJW|8k*zXmty+vT7yARi%lHptGUg^rfi3zR|kj=1q4OZ;?@E`RQXv?4u?? zOax8bU|oh`6RBp-z&Xv{%Mr5bB~yHr%+aLPcKI1~>h6%JbBf8Ut(GLtMUMB{&zbO&T(V#2p z?U>FzUXNIEbJk1OU^~4ApSSSN>q!dg-#IiWpfjj!_69A@*S#TctmL3&HyuY-4v2>+ zaWg_p$Yw%Su=uDF^y8_zXNs9vdvVi5AOIp78hPg2h;5Cz`qo`V(;p_FA!Z!clms(X z6SW})A~^~DQXaa#BbA$_etK`#kwz_C+tl6h25^g()&2f+Mzxfgmv(YEz#7@`a%6^v z&H6_yfP_(^{=y>eB(L+=2@*unD_Vc|y>0dEMe$@N2$r?DfBwTNQ-4K5uz9CRfJGVr zhcGgqzuC6h=&87ZLA`bFZuTJO9Uz`{IW2E&?{OW#mcB2E|Nis<${Z1aS5P~esQ{8W1$6y2s?`NSxGGY@sr9Y`d^I}ITtO-`}*!n zs$>}CrnshQeou>Ql$7qUtqJmbAPh4&M7=Zev^B@|Ad7a=NI^S?C(%0>zFND^;A(845KpcPH1USeDGnT&%9yZ7k$ z{n-}|n{@$dqhLT^id5|rwXuYnSSo47xXRSnZz=j(baU%s)glJ^+3OpvuOR9LgFaQ5 z!n9q6=RaG>&R?IQyIzopt}*|b^mTcfUbdO{4OJSJu*C=`VFGY^Se6R{FhQ({ns5P+ zheFSAex@VT)ZOBIc-a(NN7to9(B80i=2B+0$D^6DotA65JNR?Lm#u6{T7m3=BO!X< z&cpXdM#fbt=_b{7S*jJgZxyS9a?96kL|P!8L{cl8s1GhC3NvaJqK|UBuEvF)+}=F5 z1v$MMSasKMF}R*>NLaEQNIzuiS+4yu?bX@%To%mE!1%{M%!J~&nJ)aP{|byt6~_z5{#Y#7 ze=6o<3&&7)iy!;xTOaSpuAjZFT{t*VsA}7HuJw{U)CCT;89NS1Acjb|0t8C{doNiRiRl-<>H1fRlfni=2ZSVw{l zL(rU*2{Ti9jpqgO%d^oEW-t|}sIzq7J}G%C#~w=6E-)>OVoB=VMq5G7Pys96R_f|X zDymh9sa2biHWw%rinq5QeV3swUd$njxQB?HJ-J9HU$$W8KF7UG6E>qM*`X-~SPx#d z+laAC>tVb9qdg{uV$f*HhB#-36-YCucqp9x6G^qAgOl};>7{^9D#^~+?X|?#^#y#& zvR6`EZ{QM*Y{c_tDQL=Pm6FT8bOa6uxde4LH zPTA~?=b1=T%u6gOlCC)Hlw2aF?p)mR2clBcX>Q1R=Yp-{*>Mn^g2mWamKjnaAj55f zH~2i3JH*KUZQ*5UASZ`K*o*IE)h#d=Uj>80U&di^h;JrnHHWQjX;0t!WP?!) z0+FNNi|Ey-iLkj1l}LO5Z)%`4xQYY?kMhjx&7J%f-xTGz)weiqv-^ade^B{Qa@#rQ z{q$A_RsQASa)QXifR+|}48O%#ms^Py6Vu2Pw9kXwi#5Wk&xF{9M~9LMU}cc6;^#Xh zi{mLl5dKYtG9SQw=Pe~3h=LK0d|Z)t7{1y2>P}sKRqiv1(MKY=&v?^b((}fYwR~9t znDtkQc;o*bKRx}REb;l*1I}N;Mpdud7WCeW8|d?#h-civ?340_4C_!!vw(*Lr@p(u zWO4k+QON{>daVVahITGGGihp6$I-aoW4R@FlD)sHN#4DSY4FG^j|XJqSMT-HaZyVp z&29bCRDccO4Xu9 z@M=3zt@-Av)Pg*iJM$x+S$m{`{1oS(@8cn6f8WsLnnPH}jAe<>8tF%->glwH!G~mk zxZk6)GR?bVvS~b1S;cXX!pU)@{Lj#-0Lo&;9|7EIZ`xv1%I^>9R!nosqzv`nkp$|q z@FuDd466-()Kc?wY5-Xlmfqiu)VqgtVKjGfQn)p6CD4ZZX-OhZryF_@g_>Guu0=HCqq<)%#Ic;$nUpqlOu`JciDZ10(}1x zeGC%|;9deyXL2CEhdlHRS$R6xHuR+-UM3kZp7+-eucqSJ=f)>(eA-PHvl|)=@5!R7 z8LB*%95EBX)T>n28B*<32dPGC~Z?)Sw+`!GOr&2@?RsUi1Aj*^;)E%&5TsiHQ9-HJ!rD&ouw&0;#G z6djlPD5SktTTyg6!!QTTB#X;Tag6&dt>B=^^D+Zh?A*17l+a7AsG5fxp1^&~( zns9|ESd-w!+5W`Tl*}Env(L9a+9p(K0996CDg8orWA%L^BPl`YYRa$ba!Cx-p*v8s zEtyq84#{mTpG`|2Ro%7desW*ADd7g2jIMOuX9Flc{`X@=s?R^dw{jU8X0Y1&eMAbi z9?-&2oHg_VqXFL>u^(d8bRmk@x2L{2e;*olcrT|`95~30 zw9RxZS9L+~K3<2W`+gxNGCECAfHWETNg+u6W#poLISHcZ#M%qmSAG=idl@tixG%X7 zHyA$knkV(|DKT$S_^mRAR4`;gPSx!b%(#sz1?7da$_sIjaR6RzV+n844kd*Tn)IDeOTd}1tdJa;r$jzOayU!UI@41M0@a2@+GTOYXkASKs{*;4_B7<@L=EO zR7xSw(X8I^g41^{{wu~5K^i&@;1S{`*I!021|mR<;tF9U?AhXsJ*-+!fe3Md$#h?n zB7Q|XdkrnfBn-U}8nzvqDS?7I zHBU22e7A%`HmZ5LFllaA%>DXi+0K*mx!|EVo^A6sSJ&TfhJ+gRYCUujS>e_zTs`guoF zzHV_U!2Qwuk1U~A!gE)T?XxIS4UTqxk8!A-L;HIf;A-EK?gUB&@iI-KevT%PhrW6* zJy;;GO(4er5ii{-f|aOzk4-*<+e0q~e<+>k*v4=sp=7flZ9RYd&mI6L$J8jmiQy`k zxblG$%Nz1;bL+Eo0LO1g)$jURoFv5aM@-CYM9kI3LiIyYy~C3-oO!&GW!pj*i9gc6 zlr@a)?MvtHPqerCpnskHo-OOkpM?mj@;nMyi+7lz6AX4(FG6h%tZs+X8Wb4l0{E5K zlc@N$aj`eKb6X;p=)us4Kn!$i z(8fz(AO!AYrfEv5?)JP|*qs*dXYt#|7RApQ@{r)9n?Cq;r^@ZfX(biIw3lg$1J;ehY7kuLyUNgjP&R()Fn z9{JtHRKgmFISpMw1f#Y{I5D`ui3Ar5yL&Dxn&wA1op3B9kpHU{siPk$v9O}wF22MN zoD@9bX@R#DFlhF>WIm_l~$0~tn zg=%JT#=-TA;`qh5Uj2>JI#Vh;{j!Ifel?%>W6c60`=E|$+9k33^@4r6rSFn41nF0Y zzUa4qqWyn5R{v>?{+*Y%vKSEf_6ZGGjvXwwOxR=nm5B*NfK8hC6)#yGJyFCM3Xq)& z$((W3!J3Y`!5zVB@wj(k_!Fp3El8b@1c4{+#vt@s5$Z>@1e^AFj>KI&1`L-Ajd($))%kIc1oh+L`JhVj6P;nPgOj!&w99v zjuReS=o@@zA&5qUKmJIjhOSWyxTDd60wVAjpLQE_h=Dn{6P>26E~lX=#4Ethum694 z{Jr--=nQ>Li737M6990+$6!YQfICcI0ayS4Rxt)`hrzK4W40V|{=*Ib`Q(42&p-0} z{!Knc;J?Yo2>*X9f9>U;=l?7JKfjtk=YRD7S3m!?ulTE<|FtjutDnF6`B#4BAJ_g5 z{QqD7^Vk3U!(RUL;IIAsx8tk7^Xu>Y`p?tqALoDP*WdZ|cYX9<<_iACw}0c?fB4FO rHTdg4|Nr{WfAvoO>DqsL{{EA!e>MCo|6gh4->?1E&%f*9Uyc3;wXgn$ literal 0 HcmV?d00001 diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/world-countries-110m.geo.json b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/world-countries-110m.geo.json index 9e46ec38..8b08c621 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/world-countries-110m.geo.json +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/world-countries-110m.geo.json @@ -1 +1,26032 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Afghanistan","SOV_A3":"AFG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Afghanistan","ADM0_A3":"AFG","GEOU_DIF":0,"GEOUNIT":"Afghanistan","GU_A3":"AFG","SU_DIF":0,"SUBUNIT":"Afghanistan","SU_A3":"AFG","BRK_DIFF":0,"NAME":"Afghanistan","NAME_LONG":"Afghanistan","BRK_A3":"AFG","BRK_NAME":"Afghanistan","BRK_GROUP":null,"ABBREV":"Afg.","POSTAL":"AF","FORMAL_EN":"Islamic State of Afghanistan","FORMAL_FR":null,"NAME_CIAWF":"Afghanistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Afghanistan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":8,"MAPCOLOR13":7,"POP_EST":34124811,"POP_RANK":15,"GDP_MD_EST":64080,"POP_YEAR":2017,"LASTCENSUS":1979,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"AF","ISO_A2":"AF","ISO_A3":"AFG","ISO_A3_EH":"AFG","ISO_N3":"004","UN_A3":"004","WB_A2":"AF","WB_A3":"AFG","WOE_ID":23424739,"WOE_ID_EH":23424739,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"AFG","ADM0_A3_US":"AFG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[60.52843,29.318572,75.158028,38.486282],"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Angola","SOV_A3":"AGO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Angola","ADM0_A3":"AGO","GEOU_DIF":0,"GEOUNIT":"Angola","GU_A3":"AGO","SU_DIF":0,"SUBUNIT":"Angola","SU_A3":"AGO","BRK_DIFF":0,"NAME":"Angola","NAME_LONG":"Angola","BRK_A3":"AGO","BRK_NAME":"Angola","BRK_GROUP":null,"ABBREV":"Ang.","POSTAL":"AO","FORMAL_EN":"People's Republic of Angola","FORMAL_FR":null,"NAME_CIAWF":"Angola","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Angola","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":6,"MAPCOLOR13":1,"POP_EST":29310273,"POP_RANK":15,"GDP_MD_EST":189000,"POP_YEAR":2017,"LASTCENSUS":1970,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"AO","ISO_A2":"AO","ISO_A3":"AGO","ISO_A3_EH":"AGO","ISO_N3":"024","UN_A3":"024","WB_A2":"AO","WB_A3":"AGO","WOE_ID":23424745,"WOE_ID_EH":23424745,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"AGO","ADM0_A3_US":"AGO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[11.640096,-17.930636,24.079905,-4.438023],"geometry":{"type":"MultiPolygon","coordinates":[[[[23.904154,-11.722282],[24.079905,-12.191297],[23.930922,-12.565848],[24.016137,-12.911046],[21.933886,-12.898437],[21.887843,-16.08031],[22.562478,-16.898451],[23.215048,-17.523116],[21.377176,-17.930636],[18.956187,-17.789095],[18.263309,-17.309951],[14.209707,-17.353101],[14.058501,-17.423381],[13.462362,-16.971212],[12.814081,-16.941343],[12.215461,-17.111668],[11.734199,-17.301889],[11.640096,-16.673142],[11.778537,-15.793816],[12.123581,-14.878316],[12.175619,-14.449144],[12.500095,-13.5477],[12.738479,-13.137906],[13.312914,-12.48363],[13.633721,-12.038645],[13.738728,-11.297863],[13.686379,-10.731076],[13.387328,-10.373578],[13.120988,-9.766897],[12.87537,-9.166934],[12.929061,-8.959091],[13.236433,-8.562629],[12.93304,-7.596539],[12.728298,-6.927122],[12.227347,-6.294448],[12.322432,-6.100092],[12.735171,-5.965682],[13.024869,-5.984389],[13.375597,-5.864241],[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801,-8.908707],[21.875182,-9.523708],[22.208753,-9.894796],[22.155268,-11.084801],[22.402798,-10.993075],[22.837345,-11.017622],[23.456791,-10.867863],[23.912215,-10.926826],[24.017894,-11.237298],[23.904154,-11.722282]]],[[[12.182337,-5.789931],[11.914963,-5.037987],[12.318608,-4.60623],[12.62076,-4.438023],[12.995517,-4.781103],[12.631612,-4.991271],[12.468004,-5.248362],[12.436688,-5.684304],[12.182337,-5.789931]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Albania","SOV_A3":"ALB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Albania","ADM0_A3":"ALB","GEOU_DIF":0,"GEOUNIT":"Albania","GU_A3":"ALB","SU_DIF":0,"SUBUNIT":"Albania","SU_A3":"ALB","BRK_DIFF":0,"NAME":"Albania","NAME_LONG":"Albania","BRK_A3":"ALB","BRK_NAME":"Albania","BRK_GROUP":null,"ABBREV":"Alb.","POSTAL":"AL","FORMAL_EN":"Republic of Albania","FORMAL_FR":null,"NAME_CIAWF":"Albania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Albania","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":3047987,"POP_RANK":12,"GDP_MD_EST":33900,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"AL","ISO_A2":"AL","ISO_A3":"ALB","ISO_A3_EH":"ALB","ISO_N3":"008","UN_A3":"008","WB_A2":"AL","WB_A3":"ALB","WOE_ID":23424742,"WOE_ID_EH":23424742,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ALB","ADM0_A3_US":"ALB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[19.304486,39.624998,21.02004,42.688247],"geometry":{"type":"Polygon","coordinates":[[[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.371768,41.877551],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20.0707,42.58863],[20.283755,42.32026],[20.52295,42.21787],[20.590247,41.855409],[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"United Arab Emirates","SOV_A3":"ARE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"United Arab Emirates","ADM0_A3":"ARE","GEOU_DIF":0,"GEOUNIT":"United Arab Emirates","GU_A3":"ARE","SU_DIF":0,"SUBUNIT":"United Arab Emirates","SU_A3":"ARE","BRK_DIFF":0,"NAME":"United Arab Emirates","NAME_LONG":"United Arab Emirates","BRK_A3":"ARE","BRK_NAME":"United Arab Emirates","BRK_GROUP":null,"ABBREV":"U.A.E.","POSTAL":"AE","FORMAL_EN":"United Arab Emirates","FORMAL_FR":null,"NAME_CIAWF":"United Arab Emirates","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United Arab Emirates","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":3,"POP_EST":6072475,"POP_RANK":13,"GDP_MD_EST":667200,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"AE","ISO_A2":"AE","ISO_A3":"ARE","ISO_A3_EH":"ARE","ISO_N3":"784","UN_A3":"784","WB_A2":"AE","WB_A3":"ARE","WOE_ID":23424738,"WOE_ID_EH":23424738,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ARE","ADM0_A3_US":"ARE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":20,"LONG_LEN":20,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[51.579519,22.496948,56.396847,26.055464],"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993],[55.208341,22.70833],[55.006803,22.496948],[52.000733,23.001154],[51.617708,24.014219],[51.579519,24.245497]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Argentina","SOV_A3":"ARG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Argentina","ADM0_A3":"ARG","GEOU_DIF":0,"GEOUNIT":"Argentina","GU_A3":"ARG","SU_DIF":0,"SUBUNIT":"Argentina","SU_A3":"ARG","BRK_DIFF":0,"NAME":"Argentina","NAME_LONG":"Argentina","BRK_A3":"ARG","BRK_NAME":"Argentina","BRK_GROUP":null,"ABBREV":"Arg.","POSTAL":"AR","FORMAL_EN":"Argentine Republic","FORMAL_FR":null,"NAME_CIAWF":"Argentina","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Argentina","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":44293293,"POP_RANK":15,"GDP_MD_EST":879400,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"AR","ISO_A2":"AR","ISO_A3":"ARG","ISO_A3_EH":"ARG","ISO_N3":"032","UN_A3":"032","WB_A2":"AR","WB_A3":"ARG","WOE_ID":23424747,"WOE_ID_EH":23424747,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ARG","ADM0_A3_US":"ARG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[-73.415436,-55.25,-53.628349,-21.83231],"geometry":{"type":"MultiPolygon","coordinates":[[[[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681]]],[[[-68.571545,-52.299444],[-69.498362,-52.142761],[-71.914804,-52.009022],[-72.329404,-51.425956],[-72.309974,-50.67701],[-72.975747,-50.74145],[-73.328051,-50.378785],[-73.415436,-49.318436],[-72.648247,-48.878618],[-72.331161,-48.244238],[-72.447355,-47.738533],[-71.917258,-46.884838],[-71.552009,-45.560733],[-71.659316,-44.973689],[-71.222779,-44.784243],[-71.329801,-44.407522],[-71.793623,-44.207172],[-71.464056,-43.787611],[-71.915424,-43.408565],[-72.148898,-42.254888],[-71.746804,-42.051386],[-71.915734,-40.832339],[-71.680761,-39.808164],[-71.413517,-38.916022],[-70.814664,-38.552995],[-71.118625,-37.576827],[-71.121881,-36.658124],[-70.364769,-36.005089],[-70.388049,-35.169688],[-69.817309,-34.193571],[-69.814777,-33.273886],[-70.074399,-33.09121],[-70.535069,-31.36501],[-69.919008,-30.336339],[-70.01355,-29.367923],[-69.65613,-28.459141],[-69.001235,-27.521214],[-68.295542,-26.89934],[-68.5948,-26.506909],[-68.386001,-26.185016],[-68.417653,-24.518555],[-67.328443,-24.025303],[-66.985234,-22.986349],[-67.106674,-22.735925],[-66.273339,-21.83231],[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,-24.771459],[-57.777217,-25.16234],[-57.63366,-25.603657],[-58.618174,-27.123719],[-57.60976,-27.395899],[-56.486702,-27.548499],[-55.695846,-27.387837],[-54.788795,-26.621786],[-54.625291,-25.739255],[-54.13005,-25.547639],[-53.628349,-26.124865],[-53.648735,-26.923473],[-54.490725,-27.474757],[-55.162286,-27.881915],[-56.2909,-28.852761],[-57.625133,-30.216295],[-57.874937,-31.016556],[-58.14244,-32.044504],[-58.132648,-33.040567],[-58.349611,-33.263189],[-58.427074,-33.909454],[-58.495442,-34.43149],[-57.22583,-35.288027],[-57.362359,-35.97739],[-56.737487,-36.413126],[-56.788285,-36.901572],[-57.749157,-38.183871],[-59.231857,-38.72022],[-61.237445,-38.928425],[-62.335957,-38.827707],[-62.125763,-39.424105],[-62.330531,-40.172586],[-62.145994,-40.676897],[-62.745803,-41.028761],[-63.770495,-41.166789],[-64.73209,-40.802677],[-65.118035,-41.064315],[-64.978561,-42.058001],[-64.303408,-42.359016],[-63.755948,-42.043687],[-63.458059,-42.563138],[-64.378804,-42.873558],[-65.181804,-43.495381],[-65.328823,-44.501366],[-65.565269,-45.036786],[-66.509966,-45.039628],[-67.293794,-45.551896],[-67.580546,-46.301773],[-66.597066,-47.033925],[-65.641027,-47.236135],[-65.985088,-48.133289],[-67.166179,-48.697337],[-67.816088,-49.869669],[-68.728745,-50.264218],[-69.138539,-50.73251],[-68.815561,-51.771104],[-68.149995,-52.349983],[-68.571545,-52.299444]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Armenia","SOV_A3":"ARM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Armenia","ADM0_A3":"ARM","GEOU_DIF":0,"GEOUNIT":"Armenia","GU_A3":"ARM","SU_DIF":0,"SUBUNIT":"Armenia","SU_A3":"ARM","BRK_DIFF":0,"NAME":"Armenia","NAME_LONG":"Armenia","BRK_A3":"ARM","BRK_NAME":"Armenia","BRK_GROUP":null,"ABBREV":"Arm.","POSTAL":"ARM","FORMAL_EN":"Republic of Armenia","FORMAL_FR":null,"NAME_CIAWF":"Armenia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Armenia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":3045191,"POP_RANK":12,"GDP_MD_EST":26300,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"AM","ISO_A2":"AM","ISO_A3":"ARM","ISO_A3_EH":"ARM","ISO_N3":"051","UN_A3":"051","WB_A2":"AM","WB_A3":"ARM","WOE_ID":23424743,"WOE_ID_EH":23424743,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ARM","ADM0_A3_US":"ARM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[43.582746,38.741201,46.50572,41.248129],"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.253564],[43.752658,40.740201],[43.582746,41.092143]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Antarctica","SOV_A3":"ATA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Indeterminate","ADMIN":"Antarctica","ADM0_A3":"ATA","GEOU_DIF":0,"GEOUNIT":"Antarctica","GU_A3":"ATA","SU_DIF":0,"SUBUNIT":"Antarctica","SU_A3":"ATA","BRK_DIFF":0,"NAME":"Antarctica","NAME_LONG":"Antarctica","BRK_A3":"ATA","BRK_NAME":"Antarctica","BRK_GROUP":null,"ABBREV":"Ant.","POSTAL":"AQ","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":null,"NOTE_BRK":"Multiple claims held in abeyance","NAME_SORT":"Antarctica","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":-99,"POP_EST":4050,"POP_RANK":4,"GDP_MD_EST":810,"POP_YEAR":2013,"LASTCENSUS":-99,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"AY","ISO_A2":"AQ","ISO_A3":"ATA","ISO_A3_EH":"ATA","ISO_N3":"010","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":28289409,"WOE_ID_EH":28289409,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ATA","ADM0_A3_US":"ATA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Antarctica","REGION_UN":"Antarctica","SUBREGION":"Antarctica","REGION_WB":"Antarctica","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-180,-90,180,-63.27066],"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847,-79.281465],[-163.027408,-78.928774],[-163.066604,-78.869966],[-163.712896,-78.595667],[-163.712896,-78.595667],[-163.105801,-78.223338],[-161.245113,-78.380176],[-160.246208,-78.693645],[-159.482405,-79.046338],[-159.208184,-79.497059]]],[[[-45.154758,-78.04707],[-43.920828,-78.478103],[-43.48995,-79.08556],[-43.372438,-79.516645],[-43.333267,-80.026123],[-44.880537,-80.339644],[-46.506174,-80.594357],[-48.386421,-80.829485],[-50.482107,-81.025442],[-52.851988,-80.966685],[-54.164259,-80.633528],[-53.987991,-80.222028],[-51.853134,-79.94773],[-50.991326,-79.614623],[-50.364595,-79.183487],[-49.914131,-78.811209],[-49.306959,-78.458569],[-48.660616,-78.047018],[-48.660616,-78.047019],[-48.151396,-78.04707],[-46.662857,-77.831476],[-45.154758,-78.04707]]],[[[-121.211511,-73.50099],[-119.918851,-73.657725],[-118.724143,-73.481353],[-119.292119,-73.834097],[-120.232217,-74.08881],[-121.62283,-74.010468],[-122.621735,-73.657778],[-122.621735,-73.657777],[-122.406245,-73.324619],[-121.211511,-73.50099]]],[[[-125.559566,-73.481353],[-124.031882,-73.873268],[-124.619469,-73.834097],[-125.912181,-73.736118],[-127.28313,-73.461769],[-127.28313,-73.461768],[-126.558472,-73.246226],[-125.559566,-73.481353]]],[[[-98.98155,-71.933334],[-97.884743,-72.070535],[-96.787937,-71.952971],[-96.20035,-72.521205],[-96.983765,-72.442864],[-98.198083,-72.482035],[-99.432013,-72.442864],[-100.783455,-72.50162],[-101.801868,-72.305663],[-102.330725,-71.894164],[-102.330725,-71.894164],[-101.703967,-71.717792],[-100.430919,-71.854993],[-98.98155,-71.933334]]],[[[-68.451346,-70.955823],[-68.333834,-71.406493],[-68.510128,-71.798407],[-68.784297,-72.170736],[-69.959471,-72.307885],[-71.075889,-72.503842],[-72.388134,-72.484257],[-71.8985,-72.092343],[-73.073622,-72.229492],[-74.19004,-72.366693],[-74.953895,-72.072757],[-75.012625,-71.661258],[-73.915819,-71.269345],[-73.915819,-71.269344],[-73.230331,-71.15178],[-72.074717,-71.190951],[-71.780962,-70.681473],[-71.72218,-70.309196],[-71.741791,-69.505782],[-71.173815,-69.035475],[-70.253252,-68.87874],[-69.724447,-69.251017],[-69.489422,-69.623346],[-69.058518,-70.074016],[-68.725541,-70.505153],[-68.451346,-70.955823]]],[[[-58.614143,-64.152467],[-59.045073,-64.36801],[-59.789342,-64.211223],[-60.611928,-64.309202],[-61.297416,-64.54433],[-62.0221,-64.799094],[-62.51176,-65.09303],[-62.648858,-65.484942],[-62.590128,-65.857219],[-62.120079,-66.190326],[-62.805567,-66.425505],[-63.74569,-66.503847],[-64.294106,-66.837004],[-64.881693,-67.150474],[-65.508425,-67.58161],[-65.665082,-67.953887],[-65.312545,-68.365335],[-64.783715,-68.678908],[-63.961103,-68.913984],[-63.1973,-69.227556],[-62.785955,-69.619419],[-62.570516,-69.991747],[-62.276736,-70.383661],[-61.806661,-70.716768],[-61.512906,-71.089045],[-61.375809,-72.010074],[-61.081977,-72.382351],[-61.003661,-72.774265],[-60.690269,-73.166179],[-60.827367,-73.695242],[-61.375809,-74.106742],[-61.96337,-74.439848],[-63.295201,-74.576997],[-63.74569,-74.92974],[-64.352836,-75.262847],[-65.860987,-75.635124],[-67.192818,-75.79191],[-68.446282,-76.007452],[-69.797724,-76.222995],[-70.600724,-76.634494],[-72.206776,-76.673665],[-73.969536,-76.634494],[-75.555977,-76.712887],[-77.24037,-76.712887],[-76.926979,-77.104802],[-75.399294,-77.28107],[-74.282876,-77.55542],[-73.656119,-77.908112],[-74.772536,-78.221633],[-76.4961,-78.123654],[-77.925858,-78.378419],[-77.984666,-78.789918],[-78.023785,-79.181833],[-76.848637,-79.514939],[-76.633224,-79.887216],[-75.360097,-80.259545],[-73.244852,-80.416331],[-71.442946,-80.69063],[-70.013163,-81.004151],[-68.191646,-81.317672],[-65.704279,-81.474458],[-63.25603,-81.748757],[-61.552026,-82.042692],[-59.691416,-82.37585],[-58.712121,-82.846106],[-58.222487,-83.218434],[-57.008117,-82.865691],[-55.362894,-82.571755],[-53.619771,-82.258235],[-51.543644,-82.003521],[-49.76135,-81.729171],[-47.273931,-81.709586],[-44.825708,-81.846735],[-42.808363,-82.081915],[-42.16202,-81.65083],[-40.771433,-81.356894],[-38.244818,-81.337309],[-36.26667,-81.121715],[-34.386397,-80.906172],[-32.310296,-80.769023],[-30.097098,-80.592651],[-28.549802,-80.337938],[-29.254901,-79.985195],[-29.685805,-79.632503],[-29.685805,-79.260226],[-31.624808,-79.299397],[-33.681324,-79.456132],[-35.639912,-79.456132],[-35.914107,-79.083855],[-35.77701,-78.339248],[-35.326546,-78.123654],[-33.896763,-77.888526],[-32.212369,-77.65345],[-30.998051,-77.359515],[-29.783732,-77.065579],[-28.882779,-76.673665],[-27.511752,-76.497345],[-26.160336,-76.360144],[-25.474822,-76.281803],[-23.927552,-76.24258],[-22.458598,-76.105431],[-21.224694,-75.909474],[-20.010375,-75.674346],[-18.913543,-75.439218],[-17.522982,-75.125698],[-16.641589,-74.79254],[-15.701491,-74.498604],[-15.40771,-74.106742],[-16.46532,-73.871614],[-16.112784,-73.460114],[-15.446855,-73.146542],[-14.408805,-72.950585],[-13.311973,-72.715457],[-12.293508,-72.401936],[-11.510067,-72.010074],[-11.020433,-71.539767],[-10.295774,-71.265416],[-9.101015,-71.324224],[-8.611381,-71.65733],[-7.416622,-71.696501],[-7.377451,-71.324224],[-6.868232,-70.93231],[-5.790985,-71.030289],[-5.536375,-71.402617],[-4.341667,-71.461373],[-3.048981,-71.285053],[-1.795492,-71.167438],[-0.659489,-71.226246],[-0.228637,-71.637745],[0.868195,-71.304639],[1.886686,-71.128267],[3.022638,-70.991118],[4.139055,-70.853917],[5.157546,-70.618789],[6.273912,-70.462055],[7.13572,-70.246512],[7.742866,-69.893769],[8.48711,-70.148534],[9.525135,-70.011333],[10.249845,-70.48164],[10.817821,-70.834332],[11.953824,-70.638375],[12.404287,-70.246512],[13.422778,-69.972162],[14.734998,-70.030918],[15.126757,-70.403247],[15.949342,-70.030918],[17.026589,-69.913354],[18.201711,-69.874183],[19.259373,-69.893769],[20.375739,-70.011333],[21.452985,-70.07014],[21.923034,-70.403247],[22.569403,-70.697182],[23.666184,-70.520811],[24.841357,-70.48164],[25.977309,-70.48164],[27.093726,-70.462055],[28.09258,-70.324854],[29.150242,-70.20729],[30.031583,-69.93294],[30.971733,-69.75662],[31.990172,-69.658641],[32.754053,-69.384291],[33.302443,-68.835642],[33.870419,-68.502588],[34.908495,-68.659271],[35.300202,-69.012014],[36.16201,-69.247142],[37.200035,-69.168748],[37.905108,-69.52144],[38.649404,-69.776205],[39.667894,-69.541077],[40.020431,-69.109941],[40.921358,-68.933621],[41.959434,-68.600514],[42.938702,-68.463313],[44.113876,-68.267408],[44.897291,-68.051866],[45.719928,-67.816738],[46.503343,-67.601196],[47.44344,-67.718759],[48.344419,-67.366068],[48.990736,-67.091718],[49.930885,-67.111303],[50.753471,-66.876175],[50.949325,-66.523484],[51.791547,-66.249133],[52.614133,-66.053176],[53.613038,-65.89639],[54.53355,-65.818049],[55.414943,-65.876805],[56.355041,-65.974783],[57.158093,-66.249133],[57.255968,-66.680218],[58.137361,-67.013324],[58.744508,-67.287675],[59.939318,-67.405239],[60.605221,-67.679589],[61.427806,-67.953887],[62.387489,-68.012695],[63.19049,-67.816738],[64.052349,-67.405239],[64.992447,-67.620729],[65.971715,-67.738345],[66.911864,-67.855909],[67.891133,-67.934302],[68.890038,-67.934302],[69.712624,-68.972791],[69.673453,-69.227556],[69.555941,-69.678226],[68.596258,-69.93294],[67.81274,-70.305268],[67.949889,-70.697182],[69.066307,-70.677545],[68.929157,-71.069459],[68.419989,-71.441788],[67.949889,-71.853287],[68.71377,-72.166808],[69.869307,-72.264787],[71.024895,-72.088415],[71.573285,-71.696501],[71.906288,-71.324224],[72.454627,-71.010703],[73.08141,-70.716768],[73.33602,-70.364024],[73.864877,-69.874183],[74.491557,-69.776205],[75.62756,-69.737034],[76.626465,-69.619419],[77.644904,-69.462684],[78.134539,-69.07077],[78.428371,-68.698441],[79.113859,-68.326216],[80.093127,-68.071503],[80.93535,-67.875546],[81.483792,-67.542388],[82.051767,-67.366068],[82.776426,-67.209282],[83.775331,-67.30726],[84.676206,-67.209282],[85.655527,-67.091718],[86.752359,-67.150474],[87.477017,-66.876175],[87.986289,-66.209911],[88.358411,-66.484261],[88.828408,-66.954568],[89.67063,-67.150474],[90.630365,-67.228867],[91.5901,-67.111303],[92.608539,-67.189696],[93.548637,-67.209282],[94.17542,-67.111303],[95.017591,-67.170111],[95.781472,-67.385653],[96.682399,-67.248504],[97.759646,-67.248504],[98.68021,-67.111303],[99.718182,-67.248504],[100.384188,-66.915346],[100.893356,-66.58224],[101.578896,-66.30789],[102.832411,-65.563284],[103.478676,-65.700485],[104.242557,-65.974783],[104.90846,-66.327527],[106.181561,-66.934931],[107.160881,-66.954568],[108.081393,-66.954568],[109.15864,-66.837004],[110.235835,-66.699804],[111.058472,-66.425505],[111.74396,-66.13157],[112.860378,-66.092347],[113.604673,-65.876805],[114.388088,-66.072762],[114.897308,-66.386283],[115.602381,-66.699804],[116.699161,-66.660633],[117.384701,-66.915346],[118.57946,-67.170111],[119.832924,-67.268089],[120.871,-67.189696],[121.654415,-66.876175],[122.320369,-66.562654],[123.221296,-66.484261],[124.122274,-66.621462],[125.160247,-66.719389],[126.100396,-66.562654],[127.001427,-66.562654],[127.882768,-66.660633],[128.80328,-66.758611],[129.704259,-66.58224],[130.781454,-66.425505],[131.799945,-66.386283],[132.935896,-66.386283],[133.85646,-66.288304],[134.757387,-66.209963],[135.031582,-65.72007],[135.070753,-65.308571],[135.697485,-65.582869],[135.873805,-66.033591],[136.206705,-66.44509],[136.618049,-66.778197],[137.460271,-66.954568],[138.596223,-66.895761],[139.908442,-66.876175],[140.809421,-66.817367],[142.121692,-66.817367],[143.061842,-66.797782],[144.374061,-66.837004],[145.490427,-66.915346],[146.195552,-67.228867],[145.999699,-67.601196],[146.646067,-67.895131],[147.723263,-68.130259],[148.839629,-68.385024],[150.132314,-68.561292],[151.483705,-68.71813],[152.502247,-68.874813],[153.638199,-68.894502],[154.284567,-68.561292],[155.165857,-68.835642],[155.92979,-69.149215],[156.811132,-69.384291],[158.025528,-69.482269],[159.181013,-69.599833],[159.670699,-69.991747],[160.80665,-70.226875],[161.570479,-70.579618],[162.686897,-70.736353],[163.842434,-70.716768],[164.919681,-70.775524],[166.11444,-70.755938],[167.309095,-70.834332],[168.425616,-70.971481],[169.463589,-71.20666],[170.501665,-71.402617],[171.20679,-71.696501],[171.089227,-72.088415],[170.560422,-72.441159],[170.109958,-72.891829],[169.75737,-73.24452],[169.287321,-73.65602],[167.975101,-73.812806],[167.387489,-74.165498],[166.094803,-74.38104],[165.644391,-74.772954],[164.958851,-75.145283],[164.234193,-75.458804],[163.822797,-75.870303],[163.568239,-76.24258],[163.47026,-76.693302],[163.489897,-77.065579],[164.057873,-77.457442],[164.273363,-77.82977],[164.743464,-78.182514],[166.604126,-78.319611],[166.995781,-78.750748],[165.193876,-78.907483],[163.666217,-79.123025],[161.766385,-79.162248],[160.924162,-79.730482],[160.747894,-80.200737],[160.316964,-80.573066],[159.788211,-80.945395],[161.120016,-81.278501],[161.629287,-81.690001],[162.490992,-82.062278],[163.705336,-82.395435],[165.095949,-82.708956],[166.604126,-83.022477],[168.895665,-83.335998],[169.404782,-83.825891],[172.283934,-84.041433],[172.477049,-84.117914],[173.224083,-84.41371],[175.985672,-84.158997],[178.277212,-84.472518],[180,-84.71338],[180,-90],[-180,-90],[-180,-84.71338],[-179.942499,-84.721443],[-179.058677,-84.139412],[-177.256772,-84.452933],[-177.140807,-84.417941],[-176.084673,-84.099259],[-175.947235,-84.110449],[-175.829882,-84.117914],[-174.382503,-84.534323],[-173.116559,-84.117914],[-172.889106,-84.061019],[-169.951223,-83.884647],[-168.999989,-84.117914],[-168.530199,-84.23739],[-167.022099,-84.570497],[-164.182144,-84.82521],[-161.929775,-85.138731],[-158.07138,-85.37391],[-155.192253,-85.09956],[-150.942099,-85.295517],[-148.533073,-85.609038],[-145.888918,-85.315102],[-143.107718,-85.040752],[-142.892279,-84.570497],[-146.829068,-84.531274],[-150.060732,-84.296146],[-150.902928,-83.904232],[-153.586201,-83.68869],[-153.409907,-83.23802],[-153.037759,-82.82652],[-152.665637,-82.454192],[-152.861517,-82.042692],[-154.526299,-81.768394],[-155.29018,-81.41565],[-156.83745,-81.102129],[-154.408787,-81.160937],[-152.097662,-81.004151],[-150.648293,-81.337309],[-148.865998,-81.043373],[-147.22075,-80.671045],[-146.417749,-80.337938],[-146.770286,-79.926439],[-148.062947,-79.652089],[-149.531901,-79.358205],[-151.588416,-79.299397],[-153.390322,-79.162248],[-155.329376,-79.064269],[-155.975668,-78.69194],[-157.268302,-78.378419],[-158.051768,-78.025676],[-158.365134,-76.889207],[-157.875474,-76.987238],[-156.974573,-77.300759],[-155.329376,-77.202728],[-153.742832,-77.065579],[-152.920247,-77.496664],[-151.33378,-77.398737],[-150.00195,-77.183143],[-148.748486,-76.908845],[-147.612483,-76.575738],[-146.104409,-76.47776],[-146.143528,-76.105431],[-146.496091,-75.733154],[-146.20231,-75.380411],[-144.909624,-75.204039],[-144.322037,-75.537197],[-142.794353,-75.34124],[-141.638764,-75.086475],[-140.209007,-75.06689],[-138.85759,-74.968911],[-137.5062,-74.733783],[-136.428901,-74.518241],[-135.214583,-74.302699],[-134.431194,-74.361455],[-133.745654,-74.439848],[-132.257168,-74.302699],[-130.925311,-74.479019],[-129.554284,-74.459433],[-128.242038,-74.322284],[-126.890622,-74.420263],[-125.402082,-74.518241],[-124.011496,-74.479019],[-122.562152,-74.498604],[-121.073613,-74.518241],[-119.70256,-74.479019],[-118.684145,-74.185083],[-117.469801,-74.028348],[-116.216312,-74.243891],[-115.021552,-74.067519],[-113.944331,-73.714828],[-113.297988,-74.028348],[-112.945452,-74.38104],[-112.299083,-74.714198],[-111.261059,-74.420263],[-110.066325,-74.79254],[-108.714909,-74.910103],[-107.559346,-75.184454],[-106.149148,-75.125698],[-104.876074,-74.949326],[-103.367949,-74.988497],[-102.016507,-75.125698],[-100.645531,-75.302018],[-100.1167,-74.870933],[-100.763043,-74.537826],[-101.252703,-74.185083],[-102.545337,-74.106742],[-103.113313,-73.734413],[-103.328752,-73.362084],[-103.681289,-72.61753],[-102.917485,-72.754679],[-101.60524,-72.813436],[-100.312528,-72.754679],[-99.13738,-72.911414],[-98.118889,-73.20535],[-97.688037,-73.558041],[-96.336595,-73.616849],[-95.043961,-73.4797],[-93.672907,-73.283743],[-92.439003,-73.166179],[-91.420564,-73.401307],[-90.088733,-73.322914],[-89.226951,-72.558722],[-88.423951,-73.009393],[-87.268337,-73.185764],[-86.014822,-73.087786],[-85.192236,-73.4797],[-83.879991,-73.518871],[-82.665646,-73.636434],[-81.470913,-73.851977],[-80.687447,-73.4797],[-80.295791,-73.126956],[-79.296886,-73.518871],[-77.925858,-73.420892],[-76.907367,-73.636434],[-76.221879,-73.969541],[-74.890049,-73.871614],[-73.852024,-73.65602],[-72.833533,-73.401307],[-71.619215,-73.264157],[-70.209042,-73.146542],[-68.935916,-73.009393],[-67.956622,-72.79385],[-67.369061,-72.480329],[-67.134036,-72.049244],[-67.251548,-71.637745],[-67.56494,-71.245831],[-67.917477,-70.853917],[-68.230843,-70.462055],[-68.485452,-70.109311],[-68.544209,-69.717397],[-68.446282,-69.325535],[-67.976233,-68.953206],[-67.5845,-68.541707],[-67.427843,-68.149844],[-67.62367,-67.718759],[-67.741183,-67.326845],[-67.251548,-66.876175],[-66.703184,-66.58224],[-66.056815,-66.209963],[-65.371327,-65.89639],[-64.568276,-65.602506],[-64.176542,-65.171423],[-63.628152,-64.897073],[-63.001394,-64.642308],[-62.041686,-64.583552],[-61.414928,-64.270031],[-60.709855,-64.074074],[-59.887269,-63.95651],[-59.162585,-63.701745],[-58.594557,-63.388224],[-57.811143,-63.27066],[-57.223582,-63.525425],[-57.59573,-63.858532],[-58.614143,-64.152467]]]]}},{"type":"Feature","properties":{"scalerank":3,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","ADMIN":"French Southern and Antarctic Lands","ADM0_A3":"ATF","GEOU_DIF":0,"GEOUNIT":"French Southern and Antarctic Lands","GU_A3":"ATF","SU_DIF":0,"SUBUNIT":"French Southern and Antarctic Lands","SU_A3":"ATF","BRK_DIFF":0,"NAME":"Fr. S. Antarctic Lands","NAME_LONG":"French Southern and Antarctic Lands","BRK_A3":"ATF","BRK_NAME":"Fr. S. and Antarctic Lands","BRK_GROUP":null,"ABBREV":"Fr. S.A.L.","POSTAL":"TF","FORMAL_EN":"Territory of the French Southern and Antarctic Lands","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Fr.","NOTE_BRK":null,"NAME_SORT":"French Southern and Antarctic Lands","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":140,"POP_RANK":1,"GDP_MD_EST":16,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"FS","ISO_A2":"TF","ISO_A3":"ATF","ISO_A3_EH":"ATF","ISO_N3":"260","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":28289406,"WOE_ID_EH":28289406,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ATF","ADM0_A3_US":"ATF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Seven seas (open ocean)","REGION_UN":"Seven seas (open ocean)","SUBREGION":"Seven seas (open ocean)","REGION_WB":"Sub-Saharan Africa","NAME_LEN":22,"LONG_LEN":35,"ABBREV_LEN":10,"TINY":2,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[68.72,-49.775,70.56,-48.625],"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Australia","SOV_A3":"AU1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Australia","ADM0_A3":"AUS","GEOU_DIF":0,"GEOUNIT":"Australia","GU_A3":"AUS","SU_DIF":0,"SUBUNIT":"Australia","SU_A3":"AUS","BRK_DIFF":0,"NAME":"Australia","NAME_LONG":"Australia","BRK_A3":"AUS","BRK_NAME":"Australia","BRK_GROUP":null,"ABBREV":"Auz.","POSTAL":"AU","FORMAL_EN":"Commonwealth of Australia","FORMAL_FR":null,"NAME_CIAWF":"Australia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Australia","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":7,"POP_EST":23232413,"POP_RANK":15,"GDP_MD_EST":1189000,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"AS","ISO_A2":"AU","ISO_A3":"AUS","ISO_A3_EH":"AUS","ISO_N3":"036","UN_A3":"036","WB_A2":"AU","WB_A3":"AUS","WOE_ID":-90,"WOE_ID_EH":23424748,"WOE_NOTE":"Includes Ashmore and Cartier Islands (23424749) and Coral Sea Islands (23424790).","ADM0_A3_IS":"AUS","ADM0_A3_US":"AUS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Australia and New Zealand","REGION_WB":"East Asia & Pacific","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7},"bbox":[113.338953,-43.634597,153.569469,-10.668186],"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.703975],[145.397978,-40.792549]]],[[[143.561811,-13.763656],[143.922099,-14.548311],[144.563714,-14.171176],[144.894908,-14.594458],[145.374724,-14.984976],[145.271991,-15.428205],[145.48526,-16.285672],[145.637033,-16.784918],[145.888904,-16.906926],[146.160309,-17.761655],[146.063674,-18.280073],[146.387478,-18.958274],[147.471082,-19.480723],[148.177602,-19.955939],[148.848414,-20.39121],[148.717465,-20.633469],[149.28942,-21.260511],[149.678337,-22.342512],[150.077382,-22.122784],[150.482939,-22.556142],[150.727265,-22.402405],[150.899554,-23.462237],[151.609175,-24.076256],[152.07354,-24.457887],[152.855197,-25.267501],[153.136162,-26.071173],[153.161949,-26.641319],[153.092909,-27.2603],[153.569469,-28.110067],[153.512108,-28.995077],[153.339095,-29.458202],[153.069241,-30.35024],[153.089602,-30.923642],[152.891578,-31.640446],[152.450002,-32.550003],[151.709117,-33.041342],[151.343972,-33.816023],[151.010555,-34.31036],[150.714139,-35.17346],[150.32822,-35.671879],[150.075212,-36.420206],[149.946124,-37.109052],[149.997284,-37.425261],[149.423882,-37.772681],[148.304622,-37.809061],[147.381733,-38.219217],[146.922123,-38.606532],[146.317922,-39.035757],[145.489652,-38.593768],[144.876976,-38.417448],[145.032212,-37.896188],[144.485682,-38.085324],[143.609974,-38.809465],[142.745427,-38.538268],[142.17833,-38.380034],[141.606582,-38.308514],[140.638579,-38.019333],[139.992158,-37.402936],[139.806588,-36.643603],[139.574148,-36.138362],[139.082808,-35.732754],[138.120748,-35.612296],[138.449462,-35.127261],[138.207564,-34.384723],[137.71917,-35.076825],[136.829406,-35.260535],[137.352371,-34.707339],[137.503886,-34.130268],[137.890116,-33.640479],[137.810328,-32.900007],[136.996837,-33.752771],[136.372069,-34.094766],[135.989043,-34.890118],[135.208213,-34.47867],[135.239218,-33.947953],[134.613417,-33.222778],[134.085904,-32.848072],[134.273903,-32.617234],[132.990777,-32.011224],[132.288081,-31.982647],[131.326331,-31.495803],[129.535794,-31.590423],[128.240938,-31.948489],[127.102867,-32.282267],[126.148714,-32.215966],[125.088623,-32.728751],[124.221648,-32.959487],[124.028947,-33.483847],[123.659667,-33.890179],[122.811036,-33.914467],[122.183064,-34.003402],[121.299191,-33.821036],[120.580268,-33.930177],[119.893695,-33.976065],[119.298899,-34.509366],[119.007341,-34.464149],[118.505718,-34.746819],[118.024972,-35.064733],[117.295507,-35.025459],[116.625109,-35.025097],[115.564347,-34.386428],[115.026809,-34.196517],[115.048616,-33.623425],[115.545123,-33.487258],[115.714674,-33.259572],[115.679379,-32.900369],[115.801645,-32.205062],[115.689611,-31.612437],[115.160909,-30.601594],[114.997043,-30.030725],[115.040038,-29.461095],[114.641974,-28.810231],[114.616498,-28.516399],[114.173579,-28.118077],[114.048884,-27.334765],[113.477498,-26.543134],[113.338953,-26.116545],[113.778358,-26.549025],[113.440962,-25.621278],[113.936901,-25.911235],[114.232852,-26.298446],[114.216161,-25.786281],[113.721255,-24.998939],[113.625344,-24.683971],[113.393523,-24.384764],[113.502044,-23.80635],[113.706993,-23.560215],[113.843418,-23.059987],[113.736552,-22.475475],[114.149756,-21.755881],[114.225307,-22.517488],[114.647762,-21.82952],[115.460167,-21.495173],[115.947373,-21.068688],[116.711615,-20.701682],[117.166316,-20.623599],[117.441545,-20.746899],[118.229559,-20.374208],[118.836085,-20.263311],[118.987807,-20.044203],[119.252494,-19.952942],[119.805225,-19.976506],[120.85622,-19.683708],[121.399856,-19.239756],[121.655138,-18.705318],[122.241665,-18.197649],[122.286624,-17.798603],[122.312772,-17.254967],[123.012574,-16.4052],[123.433789,-17.268558],[123.859345,-17.069035],[123.503242,-16.596506],[123.817073,-16.111316],[124.258287,-16.327944],[124.379726,-15.56706],[124.926153,-15.0751],[125.167275,-14.680396],[125.670087,-14.51007],[125.685796,-14.230656],[126.125149,-14.347341],[126.142823,-14.095987],[126.582589,-13.952791],[127.065867,-13.817968],[127.804633,-14.276906],[128.35969,-14.86917],[128.985543,-14.875991],[129.621473,-14.969784],[129.4096,-14.42067],[129.888641,-13.618703],[130.339466,-13.357376],[130.183506,-13.10752],[130.617795,-12.536392],[131.223495,-12.183649],[131.735091,-12.302453],[132.575298,-12.114041],[132.557212,-11.603012],[131.824698,-11.273782],[132.357224,-11.128519],[133.019561,-11.376411],[133.550846,-11.786515],[134.393068,-12.042365],[134.678632,-11.941183],[135.298491,-12.248606],[135.882693,-11.962267],[136.258381,-12.049342],[136.492475,-11.857209],[136.95162,-12.351959],[136.685125,-12.887223],[136.305407,-13.29123],[135.961758,-13.324509],[136.077617,-13.724278],[135.783836,-14.223989],[135.428664,-14.715432],[135.500184,-14.997741],[136.295175,-15.550265],[137.06536,-15.870762],[137.580471,-16.215082],[138.303217,-16.807604],[138.585164,-16.806622],[139.108543,-17.062679],[139.260575,-17.371601],[140.215245,-17.710805],[140.875463,-17.369069],[141.07111,-16.832047],[141.274095,-16.38887],[141.398222,-15.840532],[141.702183,-15.044921],[141.56338,-14.561333],[141.63552,-14.270395],[141.519869,-13.698078],[141.65092,-12.944688],[141.842691,-12.741548],[141.68699,-12.407614],[141.928629,-11.877466],[142.118488,-11.328042],[142.143706,-11.042737],[142.51526,-10.668186],[142.79731,-11.157355],[142.866763,-11.784707],[143.115947,-11.90563],[143.158632,-12.325656],[143.522124,-12.834358],[143.597158,-13.400422],[143.561811,-13.763656]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Austria","SOV_A3":"AUT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Austria","ADM0_A3":"AUT","GEOU_DIF":0,"GEOUNIT":"Austria","GU_A3":"AUT","SU_DIF":0,"SUBUNIT":"Austria","SU_A3":"AUT","BRK_DIFF":0,"NAME":"Austria","NAME_LONG":"Austria","BRK_A3":"AUT","BRK_NAME":"Austria","BRK_GROUP":null,"ABBREV":"Aust.","POSTAL":"A","FORMAL_EN":"Republic of Austria","FORMAL_FR":null,"NAME_CIAWF":"Austria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Austria","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":8754413,"POP_RANK":13,"GDP_MD_EST":416600,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"AU","ISO_A2":"AT","ISO_A3":"AUT","ISO_A3_EH":"AUT","ISO_N3":"040","UN_A3":"040","WB_A2":"AT","WB_A3":"AUT","WOE_ID":23424750,"WOE_ID_EH":23424750,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"AUT","ADM0_A3_US":"AUT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[9.47997,46.431817,16.979667,49.039074],"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.525058],[9.896068,47.580197],[10.402084,47.302488],[10.544504,47.566399],[11.426414,47.523766],[12.141357,47.703083],[12.62076,47.672388],[12.932627,47.467646],[13.025851,47.637584],[12.884103,48.289146],[13.243357,48.416115],[13.595946,48.877172],[14.338898,48.555305],[14.901447,48.964402],[15.253416,49.039074],[16.029647,48.733899],[16.499283,48.785808],[16.960288,48.596982],[16.879983,48.470013],[16.979667,48.123497]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Azerbaijan","SOV_A3":"AZE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Azerbaijan","ADM0_A3":"AZE","GEOU_DIF":0,"GEOUNIT":"Azerbaijan","GU_A3":"AZE","SU_DIF":0,"SUBUNIT":"Azerbaijan","SU_A3":"AZE","BRK_DIFF":0,"NAME":"Azerbaijan","NAME_LONG":"Azerbaijan","BRK_A3":"AZE","BRK_NAME":"Azerbaijan","BRK_GROUP":null,"ABBREV":"Aze.","POSTAL":"AZ","FORMAL_EN":"Republic of Azerbaijan","FORMAL_FR":null,"NAME_CIAWF":"Azerbaijan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Azerbaijan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":9961396,"POP_RANK":13,"GDP_MD_EST":167900,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"AJ","ISO_A2":"AZ","ISO_A3":"AZE","ISO_A3_EH":"AZE","ISO_N3":"031","UN_A3":"031","WB_A2":"AZ","WB_A3":"AZE","WOE_ID":23424741,"WOE_ID_EH":23424741,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"AZE","ADM0_A3_US":"AZE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[44.79399,38.270378,50.392821,41.860675],"geometry":{"type":"MultiPolygon","coordinates":[[[[46.50572,38.770605],[46.483499,39.464155],[46.034534,39.628021],[45.610012,39.899994],[45.891907,40.218476],[45.359175,40.561504],[45.560351,40.81229],[45.179496,40.985354],[44.97248,41.248129],[45.217426,41.411452],[45.962601,41.123873],[46.501637,41.064445],[46.637908,41.181673],[46.145432,41.722802],[46.404951,41.860675],[46.686071,41.827137],[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.808869],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[49.569202,40.176101],[49.395259,39.399482],[49.223228,39.049219],[48.856532,38.815486],[48.883249,38.320245],[48.634375,38.270378],[48.010744,38.794015],[48.355529,39.288765],[48.060095,39.582235],[47.685079,39.508364],[46.50572,38.770605]]],[[[44.79399,39.713003],[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Burundi","SOV_A3":"BDI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Burundi","ADM0_A3":"BDI","GEOU_DIF":0,"GEOUNIT":"Burundi","GU_A3":"BDI","SU_DIF":0,"SUBUNIT":"Burundi","SU_A3":"BDI","BRK_DIFF":0,"NAME":"Burundi","NAME_LONG":"Burundi","BRK_A3":"BDI","BRK_NAME":"Burundi","BRK_GROUP":null,"ABBREV":"Bur.","POSTAL":"BI","FORMAL_EN":"Republic of Burundi","FORMAL_FR":null,"NAME_CIAWF":"Burundi","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Burundi","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":11466756,"POP_RANK":14,"GDP_MD_EST":7892,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"BY","ISO_A2":"BI","ISO_A3":"BDI","ISO_A3_EH":"BDI","ISO_N3":"108","UN_A3":"108","WB_A2":"BI","WB_A3":"BDI","WOE_ID":23424774,"WOE_ID_EH":23424774,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BDI","ADM0_A3_US":"BDI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[29.024926,-4.499983,30.75224,-2.348487],"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469674,-2.413855],[30.52766,-2.80762],[30.74301,-3.03431],[30.75224,-3.35931],[30.50554,-3.56858],[30.11632,-4.09012],[29.753512,-4.452389],[29.339998,-4.499983]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Belgium","SOV_A3":"BEL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Belgium","ADM0_A3":"BEL","GEOU_DIF":0,"GEOUNIT":"Belgium","GU_A3":"BEL","SU_DIF":0,"SUBUNIT":"Belgium","SU_A3":"BEL","BRK_DIFF":0,"NAME":"Belgium","NAME_LONG":"Belgium","BRK_A3":"BEL","BRK_NAME":"Belgium","BRK_GROUP":null,"ABBREV":"Belg.","POSTAL":"B","FORMAL_EN":"Kingdom of Belgium","FORMAL_FR":null,"NAME_CIAWF":"Belgium","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belgium","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":11491346,"POP_RANK":14,"GDP_MD_EST":508600,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"BE","ISO_A2":"BE","ISO_A3":"BEL","ISO_A3_EH":"BEL","ISO_N3":"056","UN_A3":"056","WB_A2":"BE","WB_A3":"BEL","WOE_ID":23424757,"WOE_ID_EH":23424757,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BEL","ADM0_A3_US":"BEL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[2.513573,49.529484,6.156658,51.475024],"geometry":{"type":"Polygon","coordinates":[[[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781],[3.315011,51.345777],[3.314971,51.345755],[4.047071,51.267259]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Benin","SOV_A3":"BEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Benin","ADM0_A3":"BEN","GEOU_DIF":0,"GEOUNIT":"Benin","GU_A3":"BEN","SU_DIF":0,"SUBUNIT":"Benin","SU_A3":"BEN","BRK_DIFF":0,"NAME":"Benin","NAME_LONG":"Benin","BRK_A3":"BEN","BRK_NAME":"Benin","BRK_GROUP":null,"ABBREV":"Benin","POSTAL":"BJ","FORMAL_EN":"Republic of Benin","FORMAL_FR":null,"NAME_CIAWF":"Benin","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Benin","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":11038805,"POP_RANK":14,"GDP_MD_EST":24310,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"BN","ISO_A2":"BJ","ISO_A3":"BEN","ISO_A3_EH":"BEN","ISO_N3":"204","UN_A3":"204","WB_A2":"BJ","WB_A3":"BEN","WOE_ID":23424764,"WOE_ID_EH":23424764,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BEN","ADM0_A3_US":"BEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[0.772336,6.142158,3.797112,12.235636],"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[3.705438,10.06321],[3.220352,9.444153],[2.912308,9.137608],[2.723793,8.506845],[2.749063,7.870734],[2.691702,6.258817]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Burkina Faso","SOV_A3":"BFA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Burkina Faso","ADM0_A3":"BFA","GEOU_DIF":0,"GEOUNIT":"Burkina Faso","GU_A3":"BFA","SU_DIF":0,"SUBUNIT":"Burkina Faso","SU_A3":"BFA","BRK_DIFF":0,"NAME":"Burkina Faso","NAME_LONG":"Burkina Faso","BRK_A3":"BFA","BRK_NAME":"Burkina Faso","BRK_GROUP":null,"ABBREV":"B.F.","POSTAL":"BF","FORMAL_EN":"Burkina Faso","FORMAL_FR":null,"NAME_CIAWF":"Burkina Faso","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Burkina Faso","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":11,"POP_EST":20107509,"POP_RANK":15,"GDP_MD_EST":32990,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"UV","ISO_A2":"BF","ISO_A3":"BFA","ISO_A3_EH":"BFA","ISO_N3":"854","UN_A3":"854","WB_A2":"BF","WB_A3":"BFA","WOE_ID":23424978,"WOE_ID_EH":23424978,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BFA","ADM0_A3_US":"BFA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-5.470565,9.610835,2.177108,15.116158],"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[1.935986,11.64115],[1.447178,11.547719],[1.24347,11.110511],[0.899563,10.997339],[0.023803,11.018682],[-0.438702,11.098341],[-0.761576,10.93693],[-1.203358,11.009819],[-2.940409,10.96269],[-2.963896,10.395335],[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14.559008],[-1.066363,14.973815],[-0.515854,15.116158],[-0.266257,14.924309],[0.374892,14.928908],[0.295646,14.444235],[0.429928,13.988733],[0.993046,13.33575],[1.024103,12.851826],[2.177108,12.625018],[2.154474,11.94015]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Bangladesh","SOV_A3":"BGD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Bangladesh","ADM0_A3":"BGD","GEOU_DIF":0,"GEOUNIT":"Bangladesh","GU_A3":"BGD","SU_DIF":0,"SUBUNIT":"Bangladesh","SU_A3":"BGD","BRK_DIFF":0,"NAME":"Bangladesh","NAME_LONG":"Bangladesh","BRK_A3":"BGD","BRK_NAME":"Bangladesh","BRK_GROUP":null,"ABBREV":"Bang.","POSTAL":"BD","FORMAL_EN":"People's Republic of Bangladesh","FORMAL_FR":null,"NAME_CIAWF":"Bangladesh","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bangladesh","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":4,"MAPCOLOR9":7,"MAPCOLOR13":7,"POP_EST":157826578,"POP_RANK":17,"GDP_MD_EST":628400,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"BG","ISO_A2":"BD","ISO_A3":"BGD","ISO_A3_EH":"BGD","ISO_N3":"050","UN_A3":"050","WB_A2":"BD","WB_A3":"BGD","WOE_ID":23424759,"WOE_ID_EH":23424759,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BGD","ADM0_A3_US":"BGD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[88.084422,20.670883,92.672721,26.446526],"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24.233715],[88.084422,24.501657],[88.306373,24.866079],[88.931554,25.238692],[88.209789,25.768066],[88.563049,26.446526],[89.355094,26.014407],[89.832481,25.965082],[89.920693,25.26975],[90.872211,25.132601],[91.799596,25.147432],[92.376202,24.976693],[91.915093,24.130414],[91.46773,24.072639],[91.158963,23.503527],[91.706475,22.985264],[91.869928,23.624346],[92.146035,23.627499],[92.672721,22.041239]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Bulgaria","SOV_A3":"BGR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Bulgaria","ADM0_A3":"BGR","GEOU_DIF":0,"GEOUNIT":"Bulgaria","GU_A3":"BGR","SU_DIF":0,"SUBUNIT":"Bulgaria","SU_A3":"BGR","BRK_DIFF":0,"NAME":"Bulgaria","NAME_LONG":"Bulgaria","BRK_A3":"BGR","BRK_NAME":"Bulgaria","BRK_GROUP":null,"ABBREV":"Bulg.","POSTAL":"BG","FORMAL_EN":"Republic of Bulgaria","FORMAL_FR":null,"NAME_CIAWF":"Bulgaria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bulgaria","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":7101510,"POP_RANK":13,"GDP_MD_EST":143100,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"BU","ISO_A2":"BG","ISO_A3":"BGR","ISO_A3_EH":"BGR","ISO_N3":"100","UN_A3":"100","WB_A2":"BG","WB_A3":"BGR","WOE_ID":23424771,"WOE_ID_EH":23424771,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BGR","ADM0_A3_US":"BGR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[22.380526,41.234486,28.558081,44.234923],"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.309081],[22.952377,41.337994],[22.881374,41.999297],[22.380526,42.32026],[22.545012,42.461362],[22.436595,42.580321],[22.604801,42.898519],[22.986019,43.211161],[22.500157,43.642814],[22.410446,44.008063],[22.65715,44.234923]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"The Bahamas","SOV_A3":"BHS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"The Bahamas","ADM0_A3":"BHS","GEOU_DIF":0,"GEOUNIT":"The Bahamas","GU_A3":"BHS","SU_DIF":0,"SUBUNIT":"The Bahamas","SU_A3":"BHS","BRK_DIFF":0,"NAME":"Bahamas","NAME_LONG":"Bahamas","BRK_A3":"BHS","BRK_NAME":"Bahamas","BRK_GROUP":null,"ABBREV":"Bhs.","POSTAL":"BS","FORMAL_EN":"Commonwealth of the Bahamas","FORMAL_FR":null,"NAME_CIAWF":"Bahamas, The","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bahamas, The","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":329988,"POP_RANK":10,"GDP_MD_EST":9066,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"BF","ISO_A2":"BS","ISO_A3":"BHS","ISO_A3_EH":"BHS","ISO_N3":"044","UN_A3":"044","WB_A2":"BS","WB_A3":"BHS","WOE_ID":23424758,"WOE_ID_EH":23424758,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BHS","ADM0_A3_US":"BHS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-78.98,23.71,-77,27.04],"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Bosnia and Herzegovina","SOV_A3":"BIH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Bosnia and Herzegovina","ADM0_A3":"BIH","GEOU_DIF":0,"GEOUNIT":"Bosnia and Herzegovina","GU_A3":"BIH","SU_DIF":0,"SUBUNIT":"Bosnia and Herzegovina","SU_A3":"BIH","BRK_DIFF":0,"NAME":"Bosnia and Herz.","NAME_LONG":"Bosnia and Herzegovina","BRK_A3":"BIH","BRK_NAME":"Bosnia and Herz.","BRK_GROUP":null,"ABBREV":"B.H.","POSTAL":"BiH","FORMAL_EN":"Bosnia and Herzegovina","FORMAL_FR":null,"NAME_CIAWF":"Bosnia and Herzegovina","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bosnia and Herzegovina","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":2,"POP_EST":3856181,"POP_RANK":12,"GDP_MD_EST":42530,"POP_YEAR":2017,"LASTCENSUS":1991,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"BK","ISO_A2":"BA","ISO_A3":"BIH","ISO_A3_EH":"BIH","ISO_N3":"070","UN_A3":"070","WB_A2":"BA","WB_A3":"BIH","WOE_ID":23424761,"WOE_ID_EH":23424761,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BIH","ADM0_A3_US":"BIH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":16,"LONG_LEN":22,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[15.750026,42.65,19.59976,45.233777],"geometry":{"type":"Polygon","coordinates":[[[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17.002146,45.233777],[17.861783,45.06774],[18.553214,45.08159],[19.005485,44.860234],[19.00548,44.86023],[19.36803,44.863]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Belarus","SOV_A3":"BLR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Belarus","ADM0_A3":"BLR","GEOU_DIF":0,"GEOUNIT":"Belarus","GU_A3":"BLR","SU_DIF":0,"SUBUNIT":"Belarus","SU_A3":"BLR","BRK_DIFF":0,"NAME":"Belarus","NAME_LONG":"Belarus","BRK_A3":"BLR","BRK_NAME":"Belarus","BRK_GROUP":null,"ABBREV":"Bela.","POSTAL":"BY","FORMAL_EN":"Republic of Belarus","FORMAL_FR":null,"NAME_CIAWF":"Belarus","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belarus","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":11,"POP_EST":9549747,"POP_RANK":13,"GDP_MD_EST":165400,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"BO","ISO_A2":"BY","ISO_A3":"BLR","ISO_A3_EH":"BLR","ISO_N3":"112","UN_A3":"112","WB_A2":"BY","WB_A3":"BLR","WOE_ID":23424765,"WOE_ID_EH":23424765,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BLR","ADM0_A3_US":"BLR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[23.199494,51.319503,32.693643,56.16913],"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53.618045],[32.693643,53.351421],[32.304519,53.132726],[31.49764,53.16743],[31.305201,53.073996],[31.540018,52.742052],[31.78597,52.10168],[31.785992,52.101678],[30.927549,52.042353],[30.619454,51.822806],[30.555117,51.319503],[30.157364,51.416138],[29.254938,51.368234],[28.992835,51.602044],[28.617613,51.427714],[28.241615,51.572227],[27.454066,51.592303],[26.337959,51.832289],[25.327788,51.910656],[24.553106,51.888461],[24.005078,51.617444],[23.527071,51.578454],[23.508002,52.023647],[23.199494,52.486977],[23.799199,52.691099],[23.804935,53.089731],[23.527536,53.470122],[23.484128,53.912498]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Belize","SOV_A3":"BLZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Belize","ADM0_A3":"BLZ","GEOU_DIF":0,"GEOUNIT":"Belize","GU_A3":"BLZ","SU_DIF":0,"SUBUNIT":"Belize","SU_A3":"BLZ","BRK_DIFF":0,"NAME":"Belize","NAME_LONG":"Belize","BRK_A3":"BLZ","BRK_NAME":"Belize","BRK_GROUP":null,"ABBREV":"Belize","POSTAL":"BZ","FORMAL_EN":"Belize","FORMAL_FR":null,"NAME_CIAWF":"Belize","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Belize","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":360346,"POP_RANK":10,"GDP_MD_EST":3088,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"BH","ISO_A2":"BZ","ISO_A3":"BLZ","ISO_A3_EH":"BLZ","ISO_N3":"084","UN_A3":"084","WB_A2":"BZ","WB_A3":"BLZ","WOE_ID":23424760,"WOE_ID_EH":23424760,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BLZ","ADM0_A3_US":"BLZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[-89.229122,15.886938,-88.106813,18.499982],"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.887273],[-89.229122,15.886938],[-89.150806,17.015577],[-89.14308,17.808319]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Bolivia","SOV_A3":"BOL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Bolivia","ADM0_A3":"BOL","GEOU_DIF":0,"GEOUNIT":"Bolivia","GU_A3":"BOL","SU_DIF":0,"SUBUNIT":"Bolivia","SU_A3":"BOL","BRK_DIFF":0,"NAME":"Bolivia","NAME_LONG":"Bolivia","BRK_A3":"BOL","BRK_NAME":"Bolivia","BRK_GROUP":null,"ABBREV":"Bolivia","POSTAL":"BO","FORMAL_EN":"Plurinational State of Bolivia","FORMAL_FR":null,"NAME_CIAWF":"Bolivia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bolivia","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":3,"POP_EST":11138234,"POP_RANK":14,"GDP_MD_EST":78350,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"BL","ISO_A2":"BO","ISO_A3":"BOL","ISO_A3_EH":"BOL","ISO_N3":"068","UN_A3":"068","WB_A2":"BO","WB_A3":"BOL","WOE_ID":23424762,"WOE_ID_EH":23424762,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BOL","ADM0_A3_US":"BOL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5},"bbox":[-69.590424,-22.872919,-57.498371,-9.761988],"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69.339535,-14.953195],[-68.948887,-14.453639],[-68.929224,-13.602684],[-68.88008,-12.899729],[-68.66508,-12.5613],[-69.529678,-10.951734],[-68.786158,-11.03638],[-68.271254,-11.014521],[-68.048192,-10.712059],[-67.173801,-10.306812],[-66.646908,-9.931331],[-65.338435,-9.761988],[-65.444837,-10.511451],[-65.321899,-10.895872],[-65.402281,-11.56627],[-64.316353,-12.461978],[-63.196499,-12.627033],[-62.80306,-13.000653],[-62.127081,-13.198781],[-61.713204,-13.489202],[-61.084121,-13.479384],[-60.503304,-13.775955],[-60.459198,-14.354007],[-60.264326,-14.645979],[-60.251149,-15.077219],[-60.542966,-15.09391],[-60.15839,-16.258284],[-58.24122,-16.299573],[-58.388058,-16.877109],[-58.280804,-17.27171],[-57.734558,-17.552468],[-57.498371,-18.174188],[-57.676009,-18.96184],[-57.949997,-19.400004],[-57.853802,-19.969995],[-58.166392,-20.176701],[-58.183471,-19.868399],[-59.115042,-19.356906],[-60.043565,-19.342747],[-61.786326,-19.633737],[-62.265961,-20.513735],[-62.291179,-21.051635],[-62.685057,-22.249029]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Brazil","SOV_A3":"BRA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Brazil","ADM0_A3":"BRA","GEOU_DIF":0,"GEOUNIT":"Brazil","GU_A3":"BRA","SU_DIF":0,"SUBUNIT":"Brazil","SU_A3":"BRA","BRK_DIFF":0,"NAME":"Brazil","NAME_LONG":"Brazil","BRK_A3":"BRA","BRK_NAME":"Brazil","BRK_GROUP":null,"ABBREV":"Brazil","POSTAL":"BR","FORMAL_EN":"Federative Republic of Brazil","FORMAL_FR":null,"NAME_CIAWF":"Brazil","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Brazil","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":207353391,"POP_RANK":17,"GDP_MD_EST":3081000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"BR","ISO_A2":"BR","ISO_A3":"BRA","ISO_A3_EH":"BRA","ISO_N3":"076","UN_A3":"076","WB_A2":"BR","WB_A3":"BRA","WOE_ID":23424768,"WOE_ID_EH":23424768,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BRA","ADM0_A3_US":"BRA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7},"bbox":[-73.987235,-33.768378,-34.729993,5.244486],"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.797958,-22.35693],[-56.473317,-22.0863],[-56.88151,-22.282154],[-57.937156,-22.090176],[-57.870674,-20.732688],[-58.166392,-20.176701],[-57.853802,-19.969995],[-57.949997,-19.400004],[-57.676009,-18.96184],[-57.498371,-18.174188],[-57.734558,-17.552468],[-58.280804,-17.27171],[-58.388058,-16.877109],[-58.24122,-16.299573],[-60.15839,-16.258284],[-60.542966,-15.09391],[-60.251149,-15.077219],[-60.264326,-14.645979],[-60.459198,-14.354007],[-60.503304,-13.775955],[-61.084121,-13.479384],[-61.713204,-13.489202],[-62.127081,-13.198781],[-62.80306,-13.000653],[-63.196499,-12.627033],[-64.316353,-12.461978],[-65.402281,-11.56627],[-65.321899,-10.895872],[-65.444837,-10.511451],[-65.338435,-9.761988],[-66.646908,-9.931331],[-67.173801,-10.306812],[-68.048192,-10.712059],[-68.271254,-11.014521],[-68.786158,-11.03638],[-69.529678,-10.951734],[-70.093752,-11.123972],[-70.548686,-11.009147],[-70.481894,-9.490118],[-71.302412,-10.079436],[-72.184891,-10.053598],[-72.563033,-9.520194],[-73.226713,-9.462213],[-73.015383,-9.032833],[-73.571059,-8.424447],[-73.987235,-7.52383],[-73.723401,-7.340999],[-73.724487,-6.918595],[-73.120027,-6.629931],[-73.219711,-6.089189],[-72.964507,-5.741251],[-72.891928,-5.274561],[-71.748406,-4.593983],[-70.928843,-4.401591],[-70.794769,-4.251265],[-69.893635,-4.298187],[-69.444102,-1.556287],[-69.420486,-1.122619],[-69.577065,-0.549992],[-70.020656,-0.185156],[-70.015566,0.541414],[-69.452396,0.706159],[-69.252434,0.602651],[-69.218638,0.985677],[-69.804597,1.089081],[-69.816973,1.714805],[-67.868565,1.692455],[-67.53781,2.037163],[-67.259998,1.719999],[-67.065048,1.130112],[-66.876326,1.253361],[-66.325765,0.724452],[-65.548267,0.789254],[-65.354713,1.095282],[-64.611012,1.328731],[-64.199306,1.492855],[-64.083085,1.916369],[-63.368788,2.2009],[-63.422867,2.411068],[-64.269999,2.497006],[-64.408828,3.126786],[-64.368494,3.79721],[-64.816064,4.056445],[-64.628659,4.148481],[-63.888343,4.02053],[-63.093198,3.770571],[-62.804533,4.006965],[-62.08543,4.162124],[-60.966893,4.536468],[-60.601179,4.918098],[-60.733574,5.200277],[-60.213683,5.244486],[-59.980959,5.014061],[-60.111002,4.574967],[-59.767406,4.423503],[-59.53804,3.958803],[-59.815413,3.606499],[-59.974525,2.755233],[-59.718546,2.24963],[-59.646044,1.786894],[-59.030862,1.317698],[-58.540013,1.268088],[-58.429477,1.463942],[-58.11345,1.507195],[-57.660971,1.682585],[-57.335823,1.948538],[-56.782704,1.863711],[-56.539386,1.899523],[-55.995698,1.817667],[-55.9056,2.021996],[-56.073342,2.220795],[-55.973322,2.510364],[-55.569755,2.421506],[-55.097587,2.523748],[-54.524754,2.311849],[-54.088063,2.105557],[-53.778521,2.376703],[-53.554839,2.334897],[-53.418465,2.053389],[-52.939657,2.124858],[-52.556425,2.504705],[-52.249338,3.241094],[-51.657797,4.156232],[-51.317146,4.203491],[-51.069771,3.650398],[-50.508875,1.901564],[-49.974076,1.736483],[-49.947101,1.04619],[-50.699251,0.222984],[-50.388211,-0.078445],[-48.620567,-0.235489],[-48.584497,-1.237805],[-47.824956,-0.581618],[-46.566584,-0.941028],[-44.905703,-1.55174],[-44.417619,-2.13775],[-44.581589,-2.691308],[-43.418791,-2.38311],[-41.472657,-2.912018],[-39.978665,-2.873054],[-38.500383,-3.700652],[-37.223252,-4.820946],[-36.452937,-5.109404],[-35.597796,-5.149504],[-35.235389,-5.464937],[-34.89603,-6.738193],[-34.729993,-7.343221],[-35.128212,-8.996401],[-35.636967,-9.649282],[-37.046519,-11.040721],[-37.683612,-12.171195],[-38.423877,-13.038119],[-38.673887,-13.057652],[-38.953276,-13.79337],[-38.882298,-15.667054],[-39.161092,-17.208407],[-39.267339,-17.867746],[-39.583521,-18.262296],[-39.760823,-19.599113],[-40.774741,-20.904512],[-40.944756,-21.937317],[-41.754164,-22.370676],[-41.988284,-22.97007],[-43.074704,-22.967693],[-44.647812,-23.351959],[-45.352136,-23.796842],[-46.472093,-24.088969],[-47.648972,-24.885199],[-48.495458,-25.877025],[-48.641005,-26.623698],[-48.474736,-27.175912],[-48.66152,-28.186135],[-48.888457,-28.674115],[-49.587329,-29.224469],[-50.696874,-30.984465],[-51.576226,-31.777698],[-52.256081,-32.24537],[-52.7121,-33.196578],[-53.373662,-33.768378],[-53.650544,-33.202004],[-53.209589,-32.727666],[-53.787952,-32.047243],[-54.572452,-31.494511],[-55.60151,-30.853879],[-55.973245,-30.883076],[-56.976026,-30.109686],[-57.625133,-30.216295]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Brunei","SOV_A3":"BRN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Brunei","ADM0_A3":"BRN","GEOU_DIF":0,"GEOUNIT":"Brunei","GU_A3":"BRN","SU_DIF":0,"SUBUNIT":"Brunei","SU_A3":"BRN","BRK_DIFF":0,"NAME":"Brunei","NAME_LONG":"Brunei Darussalam","BRK_A3":"BRN","BRK_NAME":"Brunei","BRK_GROUP":null,"ABBREV":"Brunei","POSTAL":"BN","FORMAL_EN":"Negara Brunei Darussalam","FORMAL_FR":null,"NAME_CIAWF":"Brunei","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Brunei","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":12,"POP_EST":443593,"POP_RANK":10,"GDP_MD_EST":33730,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"BX","ISO_A2":"BN","ISO_A3":"BRN","ISO_A3_EH":"BRN","ISO_N3":"096","UN_A3":"096","WB_A2":"BN","WB_A3":"BRN","WOE_ID":23424773,"WOE_ID_EH":23424773,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BRN","ADM0_A3_US":"BRN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":6,"LONG_LEN":17,"ABBREV_LEN":6,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[114.204017,4.007637,115.45071,5.44773],"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Bhutan","SOV_A3":"BTN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Bhutan","ADM0_A3":"BTN","GEOU_DIF":0,"GEOUNIT":"Bhutan","GU_A3":"BTN","SU_DIF":0,"SUBUNIT":"Bhutan","SU_A3":"BTN","BRK_DIFF":0,"NAME":"Bhutan","NAME_LONG":"Bhutan","BRK_A3":"BTN","BRK_NAME":"Bhutan","BRK_GROUP":null,"ABBREV":"Bhutan","POSTAL":"BT","FORMAL_EN":"Kingdom of Bhutan","FORMAL_FR":null,"NAME_CIAWF":"Bhutan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Bhutan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":758288,"POP_RANK":11,"GDP_MD_EST":6432,"POP_YEAR":2017,"LASTCENSUS":2005,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"BT","ISO_A2":"BT","ISO_A3":"BTN","ISO_A3_EH":"BTN","ISO_N3":"064","UN_A3":"064","WB_A2":"BT","WB_A3":"BTN","WOE_ID":23424770,"WOE_ID_EH":23424770,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BTN","ADM0_A3_US":"BTN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[88.814248,26.719403,92.103712,28.296439],"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Botswana","SOV_A3":"BWA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Botswana","ADM0_A3":"BWA","GEOU_DIF":0,"GEOUNIT":"Botswana","GU_A3":"BWA","SU_DIF":0,"SUBUNIT":"Botswana","SU_A3":"BWA","BRK_DIFF":0,"NAME":"Botswana","NAME_LONG":"Botswana","BRK_A3":"BWA","BRK_NAME":"Botswana","BRK_GROUP":null,"ABBREV":"Bwa.","POSTAL":"BW","FORMAL_EN":"Republic of Botswana","FORMAL_FR":null,"NAME_CIAWF":"Botswana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Botswana","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":2214858,"POP_RANK":12,"GDP_MD_EST":35900,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"BC","ISO_A2":"BW","ISO_A3":"BWA","ISO_A3_EH":"BWA","ISO_N3":"072","UN_A3":"072","WB_A2":"BW","WB_A3":"BWA","WOE_ID":23424755,"WOE_ID_EH":23424755,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"BWA","ADM0_A3_US":"BWA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[19.895458,-26.828543,29.432188,-17.661816],"geometry":{"type":"Polygon","coordinates":[[[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967],[24.211267,-25.670216],[23.73357,-25.390129],[23.312097,-25.26869],[22.824271,-25.500459],[22.579532,-25.979448],[22.105969,-26.280256],[21.605896,-26.726534],[20.889609,-26.828543],[20.66647,-26.477453],[20.758609,-25.868136],[20.165726,-24.917962],[19.895768,-24.76779],[19.895458,-21.849157],[20.881134,-21.814327],[20.910641,-18.252219],[21.65504,-18.219146],[23.196858,-17.869038],[23.579006,-18.281261],[24.217365,-17.889347],[24.520705,-17.887125],[25.084443,-17.661816],[25.264226,-17.73654],[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Central African Republic","SOV_A3":"CAF","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Central African Republic","ADM0_A3":"CAF","GEOU_DIF":0,"GEOUNIT":"Central African Republic","GU_A3":"CAF","SU_DIF":0,"SUBUNIT":"Central African Republic","SU_A3":"CAF","BRK_DIFF":0,"NAME":"Central African Rep.","NAME_LONG":"Central African Republic","BRK_A3":"CAF","BRK_NAME":"Central African Rep.","BRK_GROUP":null,"ABBREV":"C.A.R.","POSTAL":"CF","FORMAL_EN":"Central African Republic","FORMAL_FR":null,"NAME_CIAWF":"Central African Republic","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Central African Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":9,"POP_EST":5625118,"POP_RANK":13,"GDP_MD_EST":3206,"POP_YEAR":2017,"LASTCENSUS":2003,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"CT","ISO_A2":"CF","ISO_A3":"CAF","ISO_A3_EH":"CAF","ISO_N3":"140","UN_A3":"140","WB_A2":"CF","WB_A3":"CAF","WOE_ID":23424792,"WOE_ID_EH":23424792,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CAF","ADM0_A3_US":"CAF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":20,"LONG_LEN":24,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[14.459407,2.26764,27.374226,11.142395],"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725,9.681218],[23.394779,9.265068],[23.459013,8.954286],[23.805813,8.666319],[24.567369,8.229188],[25.114932,7.825104],[25.124131,7.500085],[25.796648,6.979316],[26.213418,6.546603],[26.465909,5.946717],[27.213409,5.550953],[27.374226,5.233944],[27.044065,5.127853],[26.402761,5.150875],[25.650455,5.256088],[25.278798,5.170408],[25.128833,4.927245],[24.805029,4.897247],[24.410531,5.108784],[23.297214,4.609693],[22.84148,4.710126],[22.704124,4.633051],[22.405124,4.02916],[21.659123,4.224342],[20.927591,4.322786],[20.290679,4.691678],[19.467784,5.031528],[18.932312,4.709506],[18.542982,4.201785],[18.453065,3.504386],[17.8099,3.560196],[17.133042,3.728197],[16.537058,3.198255],[16.012852,2.26764],[15.907381,2.557389],[15.862732,3.013537],[15.405396,3.335301],[15.03622,3.851367],[14.950953,4.210389],[14.478372,4.732605],[14.558936,5.030598],[14.459407,5.451761],[14.53656,6.226959],[14.776545,6.408498],[15.27946,7.421925]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Canada","SOV_A3":"CAN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Canada","ADM0_A3":"CAN","GEOU_DIF":0,"GEOUNIT":"Canada","GU_A3":"CAN","SU_DIF":0,"SUBUNIT":"Canada","SU_A3":"CAN","BRK_DIFF":0,"NAME":"Canada","NAME_LONG":"Canada","BRK_A3":"CAN","BRK_NAME":"Canada","BRK_GROUP":null,"ABBREV":"Can.","POSTAL":"CA","FORMAL_EN":"Canada","FORMAL_FR":null,"NAME_CIAWF":"Canada","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Canada","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":35623680,"POP_RANK":15,"GDP_MD_EST":1674000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"CA","ISO_A2":"CA","ISO_A3":"CAN","ISO_A3_EH":"CAN","ISO_N3":"124","UN_A3":"124","WB_A2":"CA","WB_A3":"CAN","WOE_ID":23424775,"WOE_ID_EH":23424775,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CAN","ADM0_A3_US":"CAN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"North America","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7},"bbox":[-140.99778,41.675105,-52.648099,83.23324],"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.510011],[-124.012891,48.370846],[-125.655013,48.825005],[-125.954994,49.179996],[-126.850004,49.53],[-127.029993,49.814996],[-128.059336,49.994959],[-128.444584,50.539138],[-128.358414,50.770648],[-127.308581,50.552574],[-126.695001,50.400903],[-125.755007,50.295018],[-125.415002,49.950001],[-124.920768,49.475275],[-123.922509,49.062484],[-123.510002,48.510011]]],[[[-56.134036,50.68701],[-56.795882,49.812309],[-56.143105,50.150117],[-55.471492,49.935815],[-55.822401,49.587129],[-54.935143,49.313011],[-54.473775,49.556691],[-53.476549,49.249139],[-53.786014,48.516781],[-53.086134,48.687804],[-52.958648,48.157164],[-52.648099,47.535548],[-53.069158,46.655499],[-53.521456,46.618292],[-54.178936,46.807066],[-53.961869,47.625207],[-54.240482,47.752279],[-55.400773,46.884994],[-55.997481,46.91972],[-55.291219,47.389562],[-56.250799,47.632545],[-57.325229,47.572807],[-59.266015,47.603348],[-59.419494,47.899454],[-58.796586,48.251525],[-59.231625,48.523188],[-58.391805,49.125581],[-57.35869,50.718274],[-56.73865,51.287438],[-55.870977,51.632094],[-55.406974,51.588273],[-55.600218,51.317075],[-56.134036,50.68701]]],[[[-133.180004,54.169975],[-132.710008,54.040009],[-131.74999,54.120004],[-132.04948,52.984621],[-131.179043,52.180433],[-131.57783,52.182371],[-132.180428,52.639707],[-132.549992,53.100015],[-133.054611,53.411469],[-133.239664,53.85108],[-133.180004,54.169975]]],[[[-79.26582,62.158675],[-79.65752,61.63308],[-80.09956,61.7181],[-80.36215,62.01649],[-80.315395,62.085565],[-79.92939,62.3856],[-79.52002,62.36371],[-79.26582,62.158675]]],[[[-81.89825,62.7108],[-83.06857,62.15922],[-83.77462,62.18231],[-83.99367,62.4528],[-83.25048,62.91409],[-81.87699,62.90458],[-81.89825,62.7108]]],[[[-85.161308,65.657285],[-84.975764,65.217518],[-84.464012,65.371772],[-83.882626,65.109618],[-82.787577,64.766693],[-81.642014,64.455136],[-81.55344,63.979609],[-80.817361,64.057486],[-80.103451,63.725981],[-80.99102,63.411246],[-82.547178,63.651722],[-83.108798,64.101876],[-84.100417,63.569712],[-85.523405,63.052379],[-85.866769,63.637253],[-87.221983,63.541238],[-86.35276,64.035833],[-86.224886,64.822917],[-85.883848,65.738778],[-85.161308,65.657285]]],[[[-75.86588,67.14886],[-76.98687,67.09873],[-77.2364,67.58809],[-76.81166,68.14856],[-75.89521,68.28721],[-75.1145,68.01036],[-75.10333,67.58202],[-75.21597,67.44425],[-75.86588,67.14886]]],[[[-95.647681,69.10769],[-96.269521,68.75704],[-97.617401,69.06003],[-98.431801,68.9507],[-99.797401,69.40003],[-98.917401,69.71003],[-98.218261,70.14354],[-97.157401,69.86003],[-96.557401,69.68003],[-96.257401,69.49003],[-95.647681,69.10769]]],[[[-68.23444,47.35486],[-68.905,47.185],[-69.237216,47.447781],[-69.99997,46.69307],[-70.305,45.915],[-70.66,45.46],[-71.08482,45.30524],[-71.405,45.255],[-71.50506,45.0082],[-73.34783,45.00738],[-74.867,45.00048],[-75.31821,44.81645],[-76.375,44.09631],[-76.5,44.018459],[-76.820034,43.628784],[-77.737885,43.629056],[-78.72028,43.625089],[-79.171674,43.466339],[-79.01,43.27],[-78.92,42.965],[-78.939362,42.863611],[-80.247448,42.3662],[-81.277747,42.209026],[-82.439278,41.675105],[-82.690089,41.675105],[-83.02981,41.832796],[-83.142,41.975681],[-83.12,42.08],[-82.9,42.43],[-82.43,42.98],[-82.137642,43.571088],[-82.337763,44.44],[-82.550925,45.347517],[-83.592851,45.816894],[-83.469551,45.994686],[-83.616131,46.116927],[-83.890765,46.116927],[-84.091851,46.275419],[-84.14212,46.512226],[-84.3367,46.40877],[-84.6049,46.4396],[-84.543749,46.538684],[-84.779238,46.637102],[-84.87608,46.900083],[-85.652363,47.220219],[-86.461991,47.553338],[-87.439793,47.94],[-88.378114,48.302918],[-89.272917,48.019808],[-89.6,48.01],[-90.83,48.27],[-91.64,48.14],[-92.61,48.45],[-93.63087,48.60926],[-94.32914,48.67074],[-94.64,48.84],[-94.81758,49.38905],[-95.15609,49.38425],[-95.15907,49],[-97.22872,49.0007],[-100.65,49],[-104.04826,48.99986],[-107.05,49],[-110.05,49],[-113,49],[-116.04818,49],[-117.03121,49],[-120,49],[-122.84,49],[-122.97421,49.002538],[-124.91024,49.98456],[-125.62461,50.41656],[-127.43561,50.83061],[-127.99276,51.71583],[-127.85032,52.32961],[-129.12979,52.75538],[-129.30523,53.56159],[-130.51497,54.28757],[-130.536109,54.802754],[-130.53611,54.80278],[-129.98,55.285],[-130.00778,55.91583],[-131.70781,56.55212],[-132.73042,57.69289],[-133.35556,58.41028],[-134.27111,58.86111],[-134.945,59.27056],[-135.47583,59.78778],[-136.47972,59.46389],[-137.4525,58.905],[-138.34089,59.56211],[-139.039,60],[-140.013,60.27682],[-140.99778,60.30639],[-140.9925,66.00003],[-140.986,69.712],[-140.985988,69.711998],[-139.12052,69.47102],[-137.54636,68.99002],[-136.50358,68.89804],[-135.62576,69.31512],[-134.41464,69.62743],[-132.92925,69.50534],[-131.43136,69.94451],[-129.79471,70.19369],[-129.10773,69.77927],[-128.36156,70.01286],[-128.13817,70.48384],[-127.44712,70.37721],[-125.75632,69.48058],[-124.42483,70.1584],[-124.28968,69.39969],[-123.06108,69.56372],[-122.6835,69.85553],[-121.47226,69.79778],[-119.94288,69.37786],[-117.60268,69.01128],[-116.22643,68.84151],[-115.2469,68.90591],[-113.89794,68.3989],[-115.30489,67.90261],[-113.49727,67.68815],[-110.798,67.80612],[-109.94619,67.98104],[-108.8802,67.38144],[-107.79239,67.88736],[-108.81299,68.31164],[-108.16721,68.65392],[-106.95,68.7],[-106.15,68.8],[-105.34282,68.56122],[-104.33791,68.018],[-103.22115,68.09775],[-101.45433,67.64689],[-99.90195,67.80566],[-98.4432,67.78165],[-98.5586,68.40394],[-97.66948,68.57864],[-96.11991,68.23939],[-96.12588,67.29338],[-95.48943,68.0907],[-94.685,68.06383],[-94.23282,69.06903],[-95.30408,69.68571],[-96.47131,70.08976],[-96.39115,71.19482],[-95.2088,71.92053],[-93.88997,71.76015],[-92.87818,71.31869],[-91.51964,70.19129],[-92.40692,69.69997],[-90.5471,69.49766],[-90.55151,68.47499],[-89.21515,69.25873],[-88.01966,68.61508],[-88.31749,67.87338],[-87.35017,67.19872],[-86.30607,67.92146],[-85.57664,68.78456],[-85.52197,69.88211],[-84.10081,69.80539],[-82.62258,69.65826],[-81.28043,69.16202],[-81.2202,68.66567],[-81.96436,68.13253],[-81.25928,67.59716],[-81.38653,67.11078],[-83.34456,66.41154],[-84.73542,66.2573],[-85.76943,66.55833],[-86.0676,66.05625],[-87.03143,65.21297],[-87.32324,64.77563],[-88.48296,64.09897],[-89.91444,64.03273],[-90.70398,63.61017],[-90.77004,62.96021],[-91.93342,62.83508],[-93.15698,62.02469],[-94.24153,60.89865],[-94.62931,60.11021],[-94.6846,58.94882],[-93.21502,58.78212],[-92.76462,57.84571],[-92.29703,57.08709],[-90.89769,57.28468],[-89.03953,56.85172],[-88.03978,56.47162],[-87.32421,55.99914],[-86.07121,55.72383],[-85.01181,55.3026],[-83.36055,55.24489],[-82.27285,55.14832],[-82.4362,54.28227],[-82.12502,53.27703],[-81.40075,52.15788],[-79.91289,51.20842],[-79.14301,51.53393],[-78.60191,52.56208],[-79.12421,54.14145],[-79.82958,54.66772],[-78.22874,55.13645],[-77.0956,55.83741],[-76.54137,56.53423],[-76.62319,57.20263],[-77.30226,58.05209],[-78.51688,58.80458],[-77.33676,59.85261],[-77.77272,60.75788],[-78.10687,62.31964],[-77.41067,62.55053],[-75.69621,62.2784],[-74.6682,62.18111],[-73.83988,62.4438],[-72.90853,62.10507],[-71.67708,61.52535],[-71.37369,61.13717],[-69.59042,61.06141],[-69.62033,60.22125],[-69.2879,58.95736],[-68.37455,58.80106],[-67.64976,58.21206],[-66.20178,58.76731],[-65.24517,59.87071],[-64.58352,60.33558],[-63.80475,59.4426],[-62.50236,58.16708],[-61.39655,56.96745],[-61.79866,56.33945],[-60.46853,55.77548],[-59.56962,55.20407],[-57.97508,54.94549],[-57.3332,54.6265],[-56.93689,53.78032],[-56.15811,53.64749],[-55.75632,53.27036],[-55.68338,52.14664],[-56.40916,51.7707],[-57.12691,51.41972],[-58.77482,51.0643],[-60.03309,50.24277],[-61.72366,50.08046],[-63.86251,50.29099],[-65.36331,50.2982],[-66.39905,50.22897],[-67.23631,49.51156],[-68.51114,49.06836],[-69.95362,47.74488],[-71.10458,46.82171],[-70.25522,46.98606],[-68.65,48.3],[-66.55243,49.1331],[-65.05626,49.23278],[-64.17099,48.74248],[-65.11545,48.07085],[-64.79854,46.99297],[-64.47219,46.23849],[-63.17329,45.73902],[-61.52072,45.88377],[-60.51815,47.00793],[-60.4486,46.28264],[-59.80287,45.9204],[-61.03988,45.26525],[-63.25471,44.67014],[-64.24656,44.26553],[-65.36406,43.54523],[-66.1234,43.61867],[-66.16173,44.46512],[-64.42549,45.29204],[-66.02605,45.25931],[-67.13741,45.13753],[-67.79134,45.70281],[-67.79046,47.06636],[-68.23444,47.35486]]],[[[-114.16717,73.12145],[-114.66634,72.65277],[-112.44102,72.9554],[-111.05039,72.4504],[-109.92035,72.96113],[-109.00654,72.63335],[-108.18835,71.65089],[-107.68599,72.06548],[-108.39639,73.08953],[-107.51645,73.23598],[-106.52259,73.07601],[-105.40246,72.67259],[-104.77484,71.6984],[-104.46476,70.99297],[-102.78537,70.49776],[-100.98078,70.02432],[-101.08929,69.58447],[-102.73116,69.50402],[-102.09329,69.11962],[-102.43024,68.75282],[-104.24,68.91],[-105.96,69.18],[-107.12254,69.11922],[-109,68.78],[-111.534149,68.630059],[-113.3132,68.53554],[-113.85496,69.00744],[-115.22,69.28],[-116.10794,69.16821],[-117.34,69.96],[-116.67473,70.06655],[-115.13112,70.2373],[-113.72141,70.19237],[-112.4161,70.36638],[-114.35,70.6],[-116.48684,70.52045],[-117.9048,70.54056],[-118.43238,70.9092],[-116.11311,71.30918],[-117.65568,71.2952],[-119.40199,71.55859],[-118.56267,72.30785],[-117.86642,72.70594],[-115.18909,73.31459],[-114.16717,73.12145]]],[[[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6],[-105.26,73.64],[-104.5,73.42]]],[[[-76.34,73.102685],[-76.251404,72.826385],[-77.314438,72.855545],[-78.39167,72.876656],[-79.486252,72.742203],[-79.775833,72.802902],[-80.876099,73.333183],[-80.833885,73.693184],[-80.353058,73.75972],[-78.064438,73.651932],[-76.34,73.102685]]],[[[-86.562179,73.157447],[-85.774371,72.534126],[-84.850112,73.340278],[-82.31559,73.750951],[-80.600088,72.716544],[-80.748942,72.061907],[-78.770639,72.352173],[-77.824624,72.749617],[-75.605845,72.243678],[-74.228616,71.767144],[-74.099141,71.33084],[-72.242226,71.556925],[-71.200015,70.920013],[-68.786054,70.525024],[-67.91497,70.121948],[-66.969033,69.186087],[-68.805123,68.720198],[-66.449866,68.067163],[-64.862314,67.847539],[-63.424934,66.928473],[-61.851981,66.862121],[-62.163177,66.160251],[-63.918444,64.998669],[-65.14886,65.426033],[-66.721219,66.388041],[-68.015016,66.262726],[-68.141287,65.689789],[-67.089646,65.108455],[-65.73208,64.648406],[-65.320168,64.382737],[-64.669406,63.392927],[-65.013804,62.674185],[-66.275045,62.945099],[-68.783186,63.74567],[-67.369681,62.883966],[-66.328297,62.280075],[-66.165568,61.930897],[-68.877367,62.330149],[-71.023437,62.910708],[-72.235379,63.397836],[-71.886278,63.679989],[-73.378306,64.193963],[-74.834419,64.679076],[-74.818503,64.389093],[-77.70998,64.229542],[-78.555949,64.572906],[-77.897281,65.309192],[-76.018274,65.326969],[-73.959795,65.454765],[-74.293883,65.811771],[-73.944912,66.310578],[-72.651167,67.284576],[-72.92606,67.726926],[-73.311618,68.069437],[-74.843307,68.554627],[-76.869101,68.894736],[-76.228649,69.147769],[-77.28737,69.76954],[-78.168634,69.826488],[-78.957242,70.16688],[-79.492455,69.871808],[-81.305471,69.743185],[-84.944706,69.966634],[-87.060003,70.260001],[-88.681713,70.410741],[-89.51342,70.762038],[-88.467721,71.218186],[-89.888151,71.222552],[-90.20516,72.235074],[-89.436577,73.129464],[-88.408242,73.537889],[-85.826151,73.803816],[-86.562179,73.157447]]],[[[-100.35642,73.84389],[-99.16387,73.63339],[-97.38,73.76],[-97.12,73.47],[-98.05359,72.99052],[-96.54,72.56],[-96.72,71.66],[-98.35966,71.27285],[-99.32286,71.35639],[-100.01482,71.73827],[-102.5,72.51],[-102.48,72.83],[-100.43836,72.70588],[-101.54,73.36],[-100.35642,73.84389]]],[[[-93.196296,72.771992],[-94.269047,72.024596],[-95.409856,72.061881],[-96.033745,72.940277],[-96.018268,73.43743],[-95.495793,73.862417],[-94.503658,74.134907],[-92.420012,74.100025],[-90.509793,73.856732],[-92.003965,72.966244],[-93.196296,72.771992]]],[[[-120.46,71.383602],[-123.09219,70.90164],[-123.62,71.34],[-125.928949,71.868688],[-125.5,72.292261],[-124.80729,73.02256],[-123.94,73.68],[-124.91775,74.29275],[-121.53788,74.44893],[-120.10978,74.24135],[-117.55564,74.18577],[-116.58442,73.89607],[-115.51081,73.47519],[-116.76794,73.22292],[-119.22,72.52],[-120.46,71.82],[-120.46,71.383602]]],[[[-93.612756,74.979997],[-94.156909,74.592347],[-95.608681,74.666864],[-96.820932,74.927623],[-96.288587,75.377828],[-94.85082,75.647218],[-93.977747,75.29649],[-93.612756,74.979997]]],[[[-98.5,76.72],[-97.735585,76.25656],[-97.704415,75.74344],[-98.16,75],[-99.80874,74.89744],[-100.88366,75.05736],[-100.86292,75.64075],[-102.50209,75.5638],[-102.56552,76.3366],[-101.48973,76.30537],[-99.98349,76.64634],[-98.57699,76.58859],[-98.5,76.72]]],[[[-108.21141,76.20168],[-107.81943,75.84552],[-106.92893,76.01282],[-105.881,75.9694],[-105.70498,75.47951],[-106.31347,75.00527],[-109.7,74.85],[-112.22307,74.41696],[-113.74381,74.39427],[-113.87135,74.72029],[-111.79421,75.1625],[-116.31221,75.04343],[-117.7104,75.2222],[-116.34602,76.19903],[-115.40487,76.47887],[-112.59056,76.14134],[-110.81422,75.54919],[-109.0671,75.47321],[-110.49726,76.42982],[-109.5811,76.79417],[-108.54859,76.67832],[-108.21141,76.20168]]],[[[-94.684086,77.097878],[-93.573921,76.776296],[-91.605023,76.778518],[-90.741846,76.449597],[-90.969661,76.074013],[-89.822238,75.847774],[-89.187083,75.610166],[-87.838276,75.566189],[-86.379192,75.482421],[-84.789625,75.699204],[-82.753445,75.784315],[-81.128531,75.713983],[-80.057511,75.336849],[-79.833933,74.923127],[-80.457771,74.657304],[-81.948843,74.442459],[-83.228894,74.564028],[-86.097452,74.410032],[-88.15035,74.392307],[-89.764722,74.515555],[-92.422441,74.837758],[-92.768285,75.38682],[-92.889906,75.882655],[-93.893824,76.319244],[-95.962457,76.441381],[-97.121379,76.751078],[-96.745123,77.161389],[-94.684086,77.097878]]],[[[-116.198587,77.645287],[-116.335813,76.876962],[-117.106051,76.530032],[-118.040412,76.481172],[-119.899318,76.053213],[-121.499995,75.900019],[-122.854924,76.116543],[-122.854925,76.116543],[-121.157535,76.864508],[-119.103939,77.51222],[-117.570131,77.498319],[-116.198587,77.645287]]],[[[-93.840003,77.519997],[-94.295608,77.491343],[-96.169654,77.555111],[-96.436304,77.834629],[-94.422577,77.820005],[-93.720656,77.634331],[-93.840003,77.519997]]],[[[-110.186938,77.697015],[-112.051191,77.409229],[-113.534279,77.732207],[-112.724587,78.05105],[-111.264443,78.152956],[-109.854452,77.996325],[-110.186938,77.697015]]],[[[-109.663146,78.601973],[-110.881314,78.40692],[-112.542091,78.407902],[-112.525891,78.550555],[-111.50001,78.849994],[-110.963661,78.804441],[-109.663146,78.601973]]],[[[-95.830295,78.056941],[-97.309843,77.850597],[-98.124289,78.082857],[-98.552868,78.458105],[-98.631984,78.87193],[-97.337231,78.831984],[-96.754399,78.765813],[-95.559278,78.418315],[-95.830295,78.056941]]],[[[-100.060192,78.324754],[-99.670939,77.907545],[-101.30394,78.018985],[-102.949809,78.343229],[-105.176133,78.380332],[-104.210429,78.67742],[-105.41958,78.918336],[-105.492289,79.301594],[-103.529282,79.165349],[-100.825158,78.800462],[-100.060192,78.324754]]],[[[-87.02,79.66],[-85.81435,79.3369],[-87.18756,79.0393],[-89.03535,78.28723],[-90.80436,78.21533],[-92.87669,78.34333],[-93.95116,78.75099],[-93.93574,79.11373],[-93.14524,79.3801],[-94.974,79.37248],[-96.07614,79.70502],[-96.70972,80.15777],[-96.01644,80.60233],[-95.32345,80.90729],[-94.29843,80.97727],[-94.73542,81.20646],[-92.40984,81.25739],[-91.13289,80.72345],[-89.45,80.509322],[-87.81,80.32],[-87.02,79.66]]],[[[-68.5,83.106322],[-65.82735,83.02801],[-63.68,82.9],[-61.85,82.6286],[-61.89388,82.36165],[-64.334,81.92775],[-66.75342,81.72527],[-67.65755,81.50141],[-65.48031,81.50657],[-67.84,80.9],[-69.4697,80.61683],[-71.18,79.8],[-73.2428,79.63415],[-73.88,79.430162],[-76.90773,79.32309],[-75.52924,79.19766],[-76.22046,79.01907],[-75.39345,78.52581],[-76.34354,78.18296],[-77.88851,77.89991],[-78.36269,77.50859],[-79.75951,77.20968],[-79.61965,76.98336],[-77.91089,77.022045],[-77.88911,76.777955],[-80.56125,76.17812],[-83.17439,76.45403],[-86.11184,76.29901],[-87.6,76.42],[-89.49068,76.47239],[-89.6161,76.95213],[-87.76739,77.17833],[-88.26,77.9],[-87.65,77.970222],[-84.97634,77.53873],[-86.34,78.18],[-87.96192,78.37181],[-87.15198,78.75867],[-85.37868,78.9969],[-85.09495,79.34543],[-86.50734,79.73624],[-86.93179,80.25145],[-84.19844,80.20836],[-83.408696,80.1],[-81.84823,80.46442],[-84.1,80.58],[-87.59895,80.51627],[-89.36663,80.85569],[-90.2,81.26],[-91.36786,81.5531],[-91.58702,81.89429],[-90.1,82.085],[-88.93227,82.11751],[-86.97024,82.27961],[-85.5,82.652273],[-84.260005,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.30664,83.13056],[-76.25,83.172059],[-75.71878,83.06404],[-72.83153,83.23324],[-70.665765,83.169781],[-68.5,83.106322]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Switzerland","SOV_A3":"CHE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Switzerland","ADM0_A3":"CHE","GEOU_DIF":0,"GEOUNIT":"Switzerland","GU_A3":"CHE","SU_DIF":0,"SUBUNIT":"Switzerland","SU_A3":"CHE","BRK_DIFF":0,"NAME":"Switzerland","NAME_LONG":"Switzerland","BRK_A3":"CHE","BRK_NAME":"Switzerland","BRK_GROUP":null,"ABBREV":"Switz.","POSTAL":"CH","FORMAL_EN":"Swiss Confederation","FORMAL_FR":null,"NAME_CIAWF":"Switzerland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Switzerland","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":8236303,"POP_RANK":13,"GDP_MD_EST":496300,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"SZ","ISO_A2":"CH","ISO_A3":"CHE","ISO_A3_EH":"CHE","ISO_N3":"756","UN_A3":"756","WB_A2":"CH","WB_A3":"CHE","WOE_ID":23424957,"WOE_ID_EH":23424957,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CHE","ADM0_A3_US":"CHE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[6.022609,45.776948,10.442701,47.830828],"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571,47.541801],[7.192202,47.449766],[7.466759,47.620582],[8.317301,47.61358],[8.522612,47.830828],[9.594226,47.525058]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Chile","SOV_A3":"CHL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Chile","ADM0_A3":"CHL","GEOU_DIF":0,"GEOUNIT":"Chile","GU_A3":"CHL","SU_DIF":0,"SUBUNIT":"Chile","SU_A3":"CHL","BRK_DIFF":0,"NAME":"Chile","NAME_LONG":"Chile","BRK_A3":"CHL","BRK_NAME":"Chile","BRK_GROUP":null,"ABBREV":"Chile","POSTAL":"CL","FORMAL_EN":"Republic of Chile","FORMAL_FR":null,"NAME_CIAWF":"Chile","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Chile","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":5,"MAPCOLOR13":9,"POP_EST":17789267,"POP_RANK":14,"GDP_MD_EST":436100,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"CI","ISO_A2":"CL","ISO_A3":"CHL","ISO_A3_EH":"CHL","ISO_N3":"152","UN_A3":"152","WB_A2":"CL","WB_A3":"CHL","WOE_ID":23424782,"WOE_ID_EH":23424782,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CHL","ADM0_A3_US":"CHL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[-75.644395,-55.61183,-66.95992,-17.580012],"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,-52.93123],[-69.34565,-52.5183],[-68.63401,-52.63637]]],[[[-67.106674,-22.735925],[-66.985234,-22.986349],[-67.328443,-24.025303],[-68.417653,-24.518555],[-68.386001,-26.185016],[-68.5948,-26.506909],[-68.295542,-26.89934],[-69.001235,-27.521214],[-69.65613,-28.459141],[-70.01355,-29.367923],[-69.919008,-30.336339],[-70.535069,-31.36501],[-70.074399,-33.09121],[-69.814777,-33.273886],[-69.817309,-34.193571],[-70.388049,-35.169688],[-70.364769,-36.005089],[-71.121881,-36.658124],[-71.118625,-37.576827],[-70.814664,-38.552995],[-71.413517,-38.916022],[-71.680761,-39.808164],[-71.915734,-40.832339],[-71.746804,-42.051386],[-72.148898,-42.254888],[-71.915424,-43.408565],[-71.464056,-43.787611],[-71.793623,-44.207172],[-71.329801,-44.407522],[-71.222779,-44.784243],[-71.659316,-44.973689],[-71.552009,-45.560733],[-71.917258,-46.884838],[-72.447355,-47.738533],[-72.331161,-48.244238],[-72.648247,-48.878618],[-73.415436,-49.318436],[-73.328051,-50.378785],[-72.975747,-50.74145],[-72.309974,-50.67701],[-72.329404,-51.425956],[-71.914804,-52.009022],[-69.498362,-52.142761],[-68.571545,-52.299444],[-69.461284,-52.291951],[-69.94278,-52.537931],[-70.845102,-52.899201],[-71.006332,-53.833252],[-71.429795,-53.856455],[-72.557943,-53.53141],[-73.702757,-52.835069],[-73.702757,-52.83507],[-74.946763,-52.262754],[-75.260026,-51.629355],[-74.976632,-51.043396],[-75.479754,-50.378372],[-75.608015,-48.673773],[-75.18277,-47.711919],[-74.126581,-46.939253],[-75.644395,-46.647643],[-74.692154,-45.763976],[-74.351709,-44.103044],[-73.240356,-44.454961],[-72.717804,-42.383356],[-73.3889,-42.117532],[-73.701336,-43.365776],[-74.331943,-43.224958],[-74.017957,-41.794813],[-73.677099,-39.942213],[-73.217593,-39.258689],[-73.505559,-38.282883],[-73.588061,-37.156285],[-73.166717,-37.12378],[-72.553137,-35.50884],[-71.861732,-33.909093],[-71.43845,-32.418899],[-71.668721,-30.920645],[-71.370083,-30.095682],[-71.489894,-28.861442],[-70.905124,-27.64038],[-70.724954,-25.705924],[-70.403966,-23.628997],[-70.091246,-21.393319],[-70.16442,-19.756468],[-70.372572,-18.347975],[-69.858444,-18.092694],[-69.590424,-17.580012],[-69.100247,-18.260125],[-68.966818,-18.981683],[-68.442225,-19.405068],[-68.757167,-20.372658],[-68.219913,-21.494347],[-67.82818,-22.872919],[-67.106674,-22.735925]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"China","SOV_A3":"CH1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"China","ADM0_A3":"CHN","GEOU_DIF":0,"GEOUNIT":"China","GU_A3":"CHN","SU_DIF":0,"SUBUNIT":"China","SU_A3":"CHN","BRK_DIFF":0,"NAME":"China","NAME_LONG":"China","BRK_A3":"CHN","BRK_NAME":"China","BRK_GROUP":null,"ABBREV":"China","POSTAL":"CN","FORMAL_EN":"People's Republic of China","FORMAL_FR":null,"NAME_CIAWF":"China","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"China","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":3,"POP_EST":1379302771,"POP_RANK":18,"GDP_MD_EST":21140000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"CH","ISO_A2":"CN","ISO_A3":"CHN","ISO_A3_EH":"CHN","ISO_N3":"156","UN_A3":"156","WB_A2":"CN","WB_A3":"CHN","WOE_ID":23424781,"WOE_ID_EH":23424781,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CHN","ADM0_A3_US":"CHN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7},"bbox":[73.675379,18.197701,135.026311,53.4588],"geometry":{"type":"MultiPolygon","coordinates":[[[[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.27939,50.58292],[120.18208,51.64355],[120.7382,51.96411],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.57147,53.4588],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.6574,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.98726,47.79013],[132.50669,47.78896],[133.373596,48.183442],[135.026311,48.47823],[134.50081,47.57845],[134.11235,47.21248],[133.769644,46.116927],[133.09712,45.14409],[131.883454,45.321162],[131.02519,44.96796],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.64,42.395024],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031]]],[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Ivory Coast","SOV_A3":"CIV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ivory Coast","ADM0_A3":"CIV","GEOU_DIF":0,"GEOUNIT":"Ivory Coast","GU_A3":"CIV","SU_DIF":0,"SUBUNIT":"Ivory Coast","SU_A3":"CIV","BRK_DIFF":0,"NAME":"Côte d'Ivoire","NAME_LONG":"Côte d'Ivoire","BRK_A3":"CIV","BRK_NAME":"Côte d'Ivoire","BRK_GROUP":null,"ABBREV":"I.C.","POSTAL":"CI","FORMAL_EN":"Republic of Ivory Coast","FORMAL_FR":"Republic of Cote D'Ivoire","NAME_CIAWF":"Cote D'ivoire","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Côte d'Ivoire","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":3,"MAPCOLOR13":3,"POP_EST":24184810,"POP_RANK":15,"GDP_MD_EST":87120,"POP_YEAR":2017,"LASTCENSUS":1998,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"IV","ISO_A2":"CI","ISO_A3":"CIV","ISO_A3_EH":"CIV","ISO_N3":"384","UN_A3":"384","WB_A2":"CI","WB_A3":"CIV","WOE_ID":23424854,"WOE_ID_EH":23424854,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CIV","ADM0_A3_US":"CIV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-8.60288,4.338288,-2.56219,10.524061],"geometry":{"type":"Polygon","coordinates":[[[-5.404342,10.370737],[-4.954653,10.152714],[-4.779884,9.821985],[-4.330247,9.610835],[-3.980449,9.862344],[-3.511899,9.900326],[-2.827496,9.642461],[-2.56219,8.219628],[-2.983585,7.379705],[-3.24437,6.250472],[-2.810701,5.389051],[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.221792,8.123329],[-8.299049,8.316444],[-8.203499,8.455453],[-7.8321,8.575704],[-8.079114,9.376224],[-8.309616,9.789532],[-8.229337,10.12902],[-8.029944,10.206535],[-7.89959,10.297382],[-7.622759,10.147236],[-6.850507,10.138994],[-6.666461,10.430811],[-6.493965,10.411303],[-6.205223,10.524061],[-6.050452,10.096361],[-5.816926,10.222555],[-5.404342,10.370737]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Cameroon","SOV_A3":"CMR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Cameroon","ADM0_A3":"CMR","GEOU_DIF":0,"GEOUNIT":"Cameroon","GU_A3":"CMR","SU_DIF":0,"SUBUNIT":"Cameroon","SU_A3":"CMR","BRK_DIFF":0,"NAME":"Cameroon","NAME_LONG":"Cameroon","BRK_A3":"CMR","BRK_NAME":"Cameroon","BRK_GROUP":null,"ABBREV":"Cam.","POSTAL":"CM","FORMAL_EN":"Republic of Cameroon","FORMAL_FR":null,"NAME_CIAWF":"Cameroon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cameroon","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":3,"POP_EST":24994885,"POP_RANK":15,"GDP_MD_EST":77240,"POP_YEAR":2017,"LASTCENSUS":2005,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"CM","ISO_A2":"CM","ISO_A3":"CMR","ISO_A3_EH":"CMR","ISO_N3":"120","UN_A3":"120","WB_A2":"CM","WB_A3":"CMR","WOE_ID":23424785,"WOE_ID_EH":23424785,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CMR","ADM0_A3_US":"CMR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[8.488816,1.727673,16.012852,12.859396],"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[14.776545,6.408498],[14.53656,6.226959],[14.459407,5.451761],[14.558936,5.030598],[14.478372,4.732605],[14.950953,4.210389],[15.03622,3.851367],[15.405396,3.335301],[15.862732,3.013537],[15.907381,2.557389],[16.012852,2.26764],[15.940919,1.727673],[15.146342,1.964015],[14.337813,2.227875],[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383],[11.839309,7.397042],[12.063946,7.799808],[12.218872,8.305824],[12.753672,8.717763],[12.955468,9.417772],[13.1676,9.640626],[13.308676,10.160362],[13.57295,10.798566],[14.415379,11.572369],[14.468192,11.904752],[14.577178,12.085361],[14.181336,12.483657],[14.213531,12.802035],[14.495787,12.859396],[14.89336,12.21905],[14.960152,11.555574],[14.923565,10.891325],[15.467873,9.982337],[14.909354,9.992129],[14.627201,9.920919],[14.171466,10.021378],[13.954218,9.549495],[14.544467,8.965861],[14.979996,8.796104],[15.120866,8.38215],[15.436092,7.692812],[15.27946,7.421925]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Democratic Republic of the Congo","SOV_A3":"COD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Democratic Republic of the Congo","ADM0_A3":"COD","GEOU_DIF":0,"GEOUNIT":"Democratic Republic of the Congo","GU_A3":"COD","SU_DIF":0,"SUBUNIT":"Democratic Republic of the Congo","SU_A3":"COD","BRK_DIFF":0,"NAME":"Dem. Rep. Congo","NAME_LONG":"Democratic Republic of the Congo","BRK_A3":"COD","BRK_NAME":"Democratic Republic of the Congo","BRK_GROUP":null,"ABBREV":"D.R.C.","POSTAL":"DRC","FORMAL_EN":"Democratic Republic of the Congo","FORMAL_FR":null,"NAME_CIAWF":"Congo, Democratic Republic of the","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Congo, Dem. Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":7,"POP_EST":83301151,"POP_RANK":16,"GDP_MD_EST":66010,"POP_YEAR":2017,"LASTCENSUS":1984,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"CG","ISO_A2":"CD","ISO_A3":"COD","ISO_A3_EH":"COD","ISO_N3":"180","UN_A3":"180","WB_A2":"ZR","WB_A3":"ZAR","WOE_ID":23424780,"WOE_ID_EH":23424780,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"COD","ADM0_A3_US":"COD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":15,"LONG_LEN":32,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[12.182337,-13.257227,31.174149,5.256088],"geometry":{"type":"Polygon","coordinates":[[[23.912215,-10.926826],[23.456791,-10.867863],[22.837345,-11.017622],[22.402798,-10.993075],[22.155268,-11.084801],[22.208753,-9.894796],[21.875182,-9.523708],[21.801801,-8.908707],[21.949131,-8.305901],[21.746456,-7.920085],[21.728111,-7.290872],[20.514748,-7.299606],[20.601823,-6.939318],[20.091622,-6.94309],[20.037723,-7.116361],[19.417502,-7.155429],[19.166613,-7.738184],[19.016752,-7.988246],[18.464176,-7.847014],[18.134222,-7.987678],[17.47297,-8.068551],[17.089996,-7.545689],[16.860191,-7.222298],[16.57318,-6.622645],[16.326528,-5.87747],[13.375597,-5.864241],[13.024869,-5.984389],[12.735171,-5.965682],[12.322432,-6.100092],[12.182337,-5.789931],[12.436688,-5.684304],[12.468004,-5.248362],[12.631612,-4.991271],[12.995517,-4.781103],[13.25824,-4.882957],[13.600235,-4.500138],[14.144956,-4.510009],[14.209035,-4.793092],[14.582604,-4.970239],[15.170992,-4.343507],[15.75354,-3.855165],[16.00629,-3.535133],[15.972803,-2.712392],[16.407092,-1.740927],[16.865307,-1.225816],[17.523716,-0.74383],[17.638645,-0.424832],[17.663553,-0.058084],[17.82654,0.288923],[17.774192,0.855659],[17.898835,1.741832],[18.094276,2.365722],[18.393792,2.900443],[18.453065,3.504386],[18.542982,4.201785],[18.932312,4.709506],[19.467784,5.031528],[20.290679,4.691678],[20.927591,4.322786],[21.659123,4.224342],[22.405124,4.02916],[22.704124,4.633051],[22.84148,4.710126],[23.297214,4.609693],[24.410531,5.108784],[24.805029,4.897247],[25.128833,4.927245],[25.278798,5.170408],[25.650455,5.256088],[26.402761,5.150875],[27.044065,5.127853],[27.374226,5.233944],[27.979977,4.408413],[28.428994,4.287155],[28.696678,4.455077],[29.159078,4.389267],[29.715995,4.600805],[29.9535,4.173699],[30.833852,3.509172],[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979],[29.419993,-5.939999],[29.620032,-6.520015],[30.199997,-7.079981],[30.740015,-8.340007],[30.74001,-8.340006],[30.346086,-8.238257],[29.002912,-8.407032],[28.734867,-8.526559],[28.449871,-9.164918],[28.673682,-9.605925],[28.49607,-10.789884],[28.372253,-11.793647],[28.642417,-11.971569],[29.341548,-12.360744],[29.616001,-12.178895],[29.699614,-13.257227],[28.934286,-13.248958],[28.523562,-12.698604],[28.155109,-12.272481],[27.388799,-12.132747],[27.16442,-11.608748],[26.553088,-11.92444],[25.75231,-11.784965],[25.418118,-11.330936],[24.78317,-11.238694],[24.314516,-11.262826],[24.257155,-10.951993],[23.912215,-10.926826]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Republic of the Congo","SOV_A3":"COG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Republic of the Congo","ADM0_A3":"COG","GEOU_DIF":0,"GEOUNIT":"Republic of the Congo","GU_A3":"COG","SU_DIF":0,"SUBUNIT":"Republic of the Congo","SU_A3":"COG","BRK_DIFF":0,"NAME":"Congo","NAME_LONG":"Republic of the Congo","BRK_A3":"COG","BRK_NAME":"Republic of the Congo","BRK_GROUP":null,"ABBREV":"Rep. Congo","POSTAL":"CG","FORMAL_EN":"Republic of the Congo","FORMAL_FR":null,"NAME_CIAWF":"Congo, Republic of the","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Congo, Rep.","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":10,"POP_EST":4954674,"POP_RANK":12,"GDP_MD_EST":30270,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"CF","ISO_A2":"CG","ISO_A3":"COG","ISO_A3_EH":"COG","ISO_N3":"178","UN_A3":"178","WB_A2":"CG","WB_A3":"COG","WOE_ID":23424779,"WOE_ID_EH":23424779,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"COG","ADM0_A3_US":"COG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":21,"ABBREV_LEN":10,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[11.093773,-5.037987,18.453065,3.728197],"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.026669,1.395677],[13.282631,1.314184],[13.003114,1.830896],[13.075822,2.267097],[14.337813,2.227875],[15.146342,1.964015],[15.940919,1.727673],[16.012852,2.26764],[16.537058,3.198255],[17.133042,3.728197],[17.8099,3.560196],[18.453065,3.504386],[18.393792,2.900443],[18.094276,2.365722],[17.898835,1.741832],[17.774192,0.855659],[17.82654,0.288923],[17.663553,-0.058084],[17.638645,-0.424832],[17.523716,-0.74383],[16.865307,-1.225816],[16.407092,-1.740927],[15.972803,-2.712392],[16.00629,-3.535133],[15.75354,-3.855165],[15.170992,-4.343507],[14.582604,-4.970239],[14.209035,-4.793092],[14.144956,-4.510009],[13.600235,-4.500138],[13.25824,-4.882957],[12.995517,-4.781103]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Colombia","SOV_A3":"COL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Colombia","ADM0_A3":"COL","GEOU_DIF":0,"GEOUNIT":"Colombia","GU_A3":"COL","SU_DIF":0,"SUBUNIT":"Colombia","SU_A3":"COL","BRK_DIFF":0,"NAME":"Colombia","NAME_LONG":"Colombia","BRK_A3":"COL","BRK_NAME":"Colombia","BRK_GROUP":null,"ABBREV":"Col.","POSTAL":"CO","FORMAL_EN":"Republic of Colombia","FORMAL_FR":null,"NAME_CIAWF":"Colombia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Colombia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":47698524,"POP_RANK":15,"GDP_MD_EST":688000,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"CO","ISO_A2":"CO","ISO_A3":"COL","ISO_A3_EH":"COL","ISO_N3":"170","UN_A3":"170","WB_A2":"CO","WB_A3":"COL","WOE_ID":23424787,"WOE_ID_EH":23424787,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"COL","ADM0_A3_US":"COL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[-78.990935,-4.298187,-66.876326,12.437303],"geometry":{"type":"Polygon","coordinates":[[[-66.876326,1.253361],[-67.065048,1.130112],[-67.259998,1.719999],[-67.53781,2.037163],[-67.868565,1.692455],[-69.816973,1.714805],[-69.804597,1.089081],[-69.218638,0.985677],[-69.252434,0.602651],[-69.452396,0.706159],[-70.015566,0.541414],[-70.020656,-0.185156],[-69.577065,-0.549992],[-69.420486,-1.122619],[-69.444102,-1.556287],[-69.893635,-4.298187],[-70.394044,-3.766591],[-70.692682,-3.742872],[-70.047709,-2.725156],[-70.813476,-2.256865],[-71.413646,-2.342802],[-71.774761,-2.16979],[-72.325787,-2.434218],[-73.070392,-2.308954],[-73.659504,-1.260491],[-74.122395,-1.002833],[-74.441601,-0.53082],[-75.106625,-0.057205],[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5.582812],[-77.318815,5.845354],[-77.476661,6.691116],[-77.881571,7.223771],[-77.753414,7.70984],[-77.431108,7.638061],[-77.242566,7.935278],[-77.474723,8.524286],[-77.353361,8.670505],[-76.836674,8.638749],[-76.086384,9.336821],[-75.6746,9.443248],[-75.664704,9.774003],[-75.480426,10.61899],[-74.906895,11.083045],[-74.276753,11.102036],[-74.197223,11.310473],[-73.414764,11.227015],[-72.627835,11.731972],[-72.238195,11.95555],[-71.75409,12.437303],[-71.399822,12.376041],[-71.137461,12.112982],[-71.331584,11.776284],[-71.973922,11.608672],[-72.227575,11.108702],[-72.614658,10.821975],[-72.905286,10.450344],[-73.027604,9.73677],[-73.304952,9.152],[-72.78873,9.085027],[-72.660495,8.625288],[-72.439862,8.405275],[-72.360901,8.002638],[-72.479679,7.632506],[-72.444487,7.423785],[-72.198352,7.340431],[-71.960176,6.991615],[-70.674234,7.087785],[-70.093313,6.960376],[-69.38948,6.099861],[-68.985319,6.206805],[-68.265052,6.153268],[-67.695087,6.267318],[-67.34144,6.095468],[-67.521532,5.55687],[-67.744697,5.221129],[-67.823012,4.503937],[-67.621836,3.839482],[-67.337564,3.542342],[-67.303173,3.318454],[-67.809938,2.820655],[-67.447092,2.600281],[-67.181294,2.250638],[-66.876326,1.253361]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Costa Rica","SOV_A3":"CRI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Costa Rica","ADM0_A3":"CRI","GEOU_DIF":0,"GEOUNIT":"Costa Rica","GU_A3":"CRI","SU_DIF":0,"SUBUNIT":"Costa Rica","SU_A3":"CRI","BRK_DIFF":0,"NAME":"Costa Rica","NAME_LONG":"Costa Rica","BRK_A3":"CRI","BRK_NAME":"Costa Rica","BRK_GROUP":null,"ABBREV":"C.R.","POSTAL":"CR","FORMAL_EN":"Republic of Costa Rica","FORMAL_FR":null,"NAME_CIAWF":"Costa Rica","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Costa Rica","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":2,"POP_EST":4930258,"POP_RANK":12,"GDP_MD_EST":79260,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"CS","ISO_A2":"CR","ISO_A3":"CRI","ISO_A3_EH":"CRI","ISO_N3":"188","UN_A3":"188","WB_A2":"CR","WB_A3":"CRI","WOE_ID":23424791,"WOE_ID_EH":23424791,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CRI","ADM0_A3_US":"CRI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-85.941725,8.225028,-82.546196,11.217119],"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.941725,10.895278],[-85.71254,11.088445],[-85.561852,11.217119],[-84.903003,10.952303],[-84.673069,11.082657],[-84.355931,10.999226],[-84.190179,10.79345],[-83.895054,10.726839],[-83.655612,10.938764],[-83.40232,10.395438],[-83.015677,9.992982],[-82.546196,9.566135],[-82.932891,9.476812],[-82.927155,9.07433],[-82.719183,8.925709],[-82.868657,8.807266],[-82.829771,8.626295],[-82.913176,8.423517],[-82.965783,8.225028]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Cuba","SOV_A3":"CUB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Cuba","ADM0_A3":"CUB","GEOU_DIF":0,"GEOUNIT":"Cuba","GU_A3":"CUB","SU_DIF":0,"SUBUNIT":"Cuba","SU_A3":"CUB","BRK_DIFF":0,"NAME":"Cuba","NAME_LONG":"Cuba","BRK_A3":"CUB","BRK_NAME":"Cuba","BRK_GROUP":null,"ABBREV":"Cuba","POSTAL":"CU","FORMAL_EN":"Republic of Cuba","FORMAL_FR":null,"NAME_CIAWF":"Cuba","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cuba","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":11147407,"POP_RANK":14,"GDP_MD_EST":132900,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"CU","ISO_A2":"CU","ISO_A3":"CUB","ISO_A3_EH":"CUB","ISO_N3":"192","UN_A3":"192","WB_A2":"CU","WB_A3":"CUB","WOE_ID":23424793,"WOE_ID_EH":23424793,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CUB","ADM0_A3_US":"CUB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-84.974911,19.855481,-74.178025,23.188611],"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-76.323656,19.952891],[-77.755481,19.855481],[-77.085108,20.413354],[-77.492655,20.673105],[-78.137292,20.739949],[-78.482827,21.028613],[-78.719867,21.598114],[-79.285,21.559175],[-80.217475,21.827324],[-80.517535,22.037079],[-81.820943,22.192057],[-82.169992,22.387109],[-81.795002,22.636965],[-82.775898,22.68815],[-83.494459,22.168518],[-83.9088,22.154565],[-84.052151,21.910575],[-84.54703,21.801228],[-84.974911,21.896028],[-84.447062,22.20495],[-84.230357,22.565755],[-83.77824,22.788118],[-83.267548,22.983042],[-82.510436,23.078747],[-82.268151,23.188611]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Northern Cyprus","SOV_A3":"CYN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Northern Cyprus","ADM0_A3":"CYN","GEOU_DIF":0,"GEOUNIT":"Northern Cyprus","GU_A3":"CYN","SU_DIF":0,"SUBUNIT":"Northern Cyprus","SU_A3":"CYN","BRK_DIFF":1,"NAME":"N. Cyprus","NAME_LONG":"Northern Cyprus","BRK_A3":"B20","BRK_NAME":"N. Cyprus","BRK_GROUP":null,"ABBREV":"N. Cy.","POSTAL":"CN","FORMAL_EN":"Turkish Republic of Northern Cyprus","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Self admin.","NOTE_BRK":"Self admin.; Claimed by Cyprus","NAME_SORT":"Cyprus, Northern","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":265100,"POP_RANK":10,"GDP_MD_EST":3600,"POP_YEAR":2013,"LASTCENSUS":-99,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":-90,"WOE_ID_EH":23424995,"WOE_NOTE":"WOE lists as subunit of united Cyprus","ADM0_A3_IS":"CYP","ADM0_A3_US":"CYP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":15,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":6,"MAX_LABEL":10},"bbox":[32.73178,35.000345,34.576474,35.671596],"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Cyprus","SOV_A3":"CYP","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Cyprus","ADM0_A3":"CYP","GEOU_DIF":0,"GEOUNIT":"Cyprus","GU_A3":"CYP","SU_DIF":0,"SUBUNIT":"Cyprus","SU_A3":"CYP","BRK_DIFF":0,"NAME":"Cyprus","NAME_LONG":"Cyprus","BRK_A3":"CYP","BRK_NAME":"Cyprus","BRK_GROUP":null,"ABBREV":"Cyp.","POSTAL":"CY","FORMAL_EN":"Republic of Cyprus","FORMAL_FR":null,"NAME_CIAWF":"Cyprus","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cyprus","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":7,"POP_EST":1221549,"POP_RANK":12,"GDP_MD_EST":29260,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"CY","ISO_A2":"CY","ISO_A3":"CYP","ISO_A3_EH":"CYP","ISO_N3":"196","UN_A3":"196","WB_A2":"CY","WB_A3":"CYP","WOE_ID":-90,"WOE_ID_EH":23424994,"WOE_NOTE":"WOE lists as subunit of united Cyprus","ADM0_A3_IS":"CYP","ADM0_A3_US":"CYP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[32.256667,34.571869,34.004881,35.173125],"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Czechia","SOV_A3":"CZE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Czechia","ADM0_A3":"CZE","GEOU_DIF":0,"GEOUNIT":"Czechia","GU_A3":"CZE","SU_DIF":0,"SUBUNIT":"Czechia","SU_A3":"CZE","BRK_DIFF":0,"NAME":"Czechia","NAME_LONG":"Czech Republic","BRK_A3":"CZE","BRK_NAME":"Czechia","BRK_GROUP":null,"ABBREV":"Cz.","POSTAL":"CZ","FORMAL_EN":"Czech Republic","FORMAL_FR":"la République tchèque","NAME_CIAWF":"Czechia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Czechia","NAME_ALT":"Česko","MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":6,"POP_EST":10674723,"POP_RANK":14,"GDP_MD_EST":350900,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"EZ","ISO_A2":"CZ","ISO_A3":"CZE","ISO_A3_EH":"CZE","ISO_N3":"203","UN_A3":"203","WB_A2":"CZ","WB_A3":"CZE","WOE_ID":23424810,"WOE_ID_EH":23424810,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"CZE","ADM0_A3_US":"CZE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":14,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[12.240111,48.555305,18.853144,51.117268],"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.490972,50.78473],[16.238627,50.697733],[16.176253,50.422607],[16.719476,50.215747],[16.868769,50.473974],[17.554567,50.362146],[17.649445,50.049038],[18.392914,49.988629],[18.853144,49.49623],[18.554971,49.495015],[18.399994,49.315001],[18.170498,49.271515],[18.104973,49.043983],[17.913512,48.996493],[17.886485,48.903475],[17.545007,48.800019],[17.101985,48.816969],[16.960288,48.596982]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Germany","SOV_A3":"DEU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Germany","ADM0_A3":"DEU","GEOU_DIF":0,"GEOUNIT":"Germany","GU_A3":"DEU","SU_DIF":0,"SUBUNIT":"Germany","SU_A3":"DEU","BRK_DIFF":0,"NAME":"Germany","NAME_LONG":"Germany","BRK_A3":"DEU","BRK_NAME":"Germany","BRK_GROUP":null,"ABBREV":"Ger.","POSTAL":"D","FORMAL_EN":"Federal Republic of Germany","FORMAL_FR":null,"NAME_CIAWF":"Germany","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Germany","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":1,"POP_EST":80594017,"POP_RANK":16,"GDP_MD_EST":3979000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"GM","ISO_A2":"DE","ISO_A3":"DEU","ISO_A3_EH":"DEU","ISO_N3":"276","UN_A3":"276","WB_A2":"DE","WB_A3":"DEU","WOE_ID":23424829,"WOE_ID_EH":23424829,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"DEU","ADM0_A3_US":"DEU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[5.988658,47.302488,15.016996,54.983104],"geometry":{"type":"Polygon","coordinates":[[[13.595946,48.877172],[13.243357,48.416115],[12.884103,48.289146],[13.025851,47.637584],[12.932627,47.467646],[12.62076,47.672388],[12.141357,47.703083],[11.426414,47.523766],[10.544504,47.566399],[10.402084,47.302488],[9.896068,47.580197],[9.594226,47.525058],[8.522612,47.830828],[8.317301,47.61358],[7.466759,47.620582],[7.593676,48.333019],[8.099279,49.017784],[6.65823,49.201958],[6.18632,49.463803],[6.242751,49.902226],[6.043073,50.128052],[6.156658,50.803721],[5.988658,51.851616],[6.589397,51.852029],[6.84287,52.22844],[7.092053,53.144043],[6.90514,53.482162],[7.100425,53.693932],[7.936239,53.748296],[8.121706,53.527792],[8.800734,54.020786],[8.572118,54.395646],[8.526229,54.962744],[9.282049,54.830865],[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.733234],[12.966837,50.484076],[12.240111,50.266338],[12.415191,49.969121],[12.521024,49.547415],[13.031329,49.307068],[13.595946,48.877172]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Djibouti","SOV_A3":"DJI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Djibouti","ADM0_A3":"DJI","GEOU_DIF":0,"GEOUNIT":"Djibouti","GU_A3":"DJI","SU_DIF":0,"SUBUNIT":"Djibouti","SU_A3":"DJI","BRK_DIFF":0,"NAME":"Djibouti","NAME_LONG":"Djibouti","BRK_A3":"DJI","BRK_NAME":"Djibouti","BRK_GROUP":null,"ABBREV":"Dji.","POSTAL":"DJ","FORMAL_EN":"Republic of Djibouti","FORMAL_FR":null,"NAME_CIAWF":"Djibouti","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Djibouti","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":865267,"POP_RANK":11,"GDP_MD_EST":3345,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"DJ","ISO_A2":"DJ","ISO_A3":"DJI","ISO_A3_EH":"DJI","ISO_N3":"262","UN_A3":"262","WB_A2":"DJ","WB_A3":"DJI","WOE_ID":23424797,"WOE_ID_EH":23424797,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"DJI","ADM0_A3_US":"DJI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[41.66176,10.926879,43.317852,12.699639],"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Denmark","SOV_A3":"DN1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Denmark","ADM0_A3":"DNK","GEOU_DIF":0,"GEOUNIT":"Denmark","GU_A3":"DNK","SU_DIF":0,"SUBUNIT":"Denmark","SU_A3":"DNK","BRK_DIFF":0,"NAME":"Denmark","NAME_LONG":"Denmark","BRK_A3":"DNK","BRK_NAME":"Denmark","BRK_GROUP":null,"ABBREV":"Den.","POSTAL":"DK","FORMAL_EN":"Kingdom of Denmark","FORMAL_FR":null,"NAME_CIAWF":"Denmark","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Denmark","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":5605948,"POP_RANK":13,"GDP_MD_EST":264800,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"DA","ISO_A2":"DK","ISO_A3":"DNK","ISO_A3_EH":"DNK","ISO_N3":"208","UN_A3":"208","WB_A2":"DK","WB_A3":"DNK","WOE_ID":23424796,"WOE_ID_EH":23424796,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"DNK","ADM0_A3_US":"DNK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[8.089977,54.800015,12.690006,57.730017],"geometry":{"type":"MultiPolygon","coordinates":[[[[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469,57.172066],[9.775559,57.447941],[10.580006,57.730017],[10.546106,57.215733],[10.25,56.890016],[10.369993,56.609982],[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104]]],[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Dominican Republic","SOV_A3":"DOM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Dominican Republic","ADM0_A3":"DOM","GEOU_DIF":0,"GEOUNIT":"Dominican Republic","GU_A3":"DOM","SU_DIF":0,"SUBUNIT":"Dominican Republic","SU_A3":"DOM","BRK_DIFF":0,"NAME":"Dominican Rep.","NAME_LONG":"Dominican Republic","BRK_A3":"DOM","BRK_NAME":"Dominican Rep.","BRK_GROUP":null,"ABBREV":"Dom. Rep.","POSTAL":"DO","FORMAL_EN":"Dominican Republic","FORMAL_FR":null,"NAME_CIAWF":"Dominican Republic","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Dominican Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":7,"POP_EST":10734247,"POP_RANK":14,"GDP_MD_EST":161900,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"DR","ISO_A2":"DO","ISO_A3":"DOM","ISO_A3_EH":"DOM","ISO_N3":"214","UN_A3":"214","WB_A2":"DO","WB_A3":"DOM","WOE_ID":23424800,"WOE_ID_EH":23424800,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"DOM","ADM0_A3_US":"DOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":14,"LONG_LEN":18,"ABBREV_LEN":9,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[-71.945112,17.598564,-68.317943,19.884911],"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298,18.426886],[-70.99995,18.283329],[-71.40021,17.598564],[-71.657662,17.757573],[-71.708305,18.044997],[-71.687738,18.31666],[-71.945112,18.6169],[-71.701303,18.785417],[-71.624873,19.169838],[-71.712361,19.714456]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Algeria","SOV_A3":"DZA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Algeria","ADM0_A3":"DZA","GEOU_DIF":0,"GEOUNIT":"Algeria","GU_A3":"DZA","SU_DIF":0,"SUBUNIT":"Algeria","SU_A3":"DZA","BRK_DIFF":0,"NAME":"Algeria","NAME_LONG":"Algeria","BRK_A3":"DZA","BRK_NAME":"Algeria","BRK_GROUP":null,"ABBREV":"Alg.","POSTAL":"DZ","FORMAL_EN":"People's Democratic Republic of Algeria","FORMAL_FR":null,"NAME_CIAWF":"Algeria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Algeria","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":40969443,"POP_RANK":15,"GDP_MD_EST":609400,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"AG","ISO_A2":"DZ","ISO_A3":"DZA","ISO_A3_EH":"DZA","ISO_N3":"012","UN_A3":"012","WB_A2":"DZ","WB_A3":"DZA","WOE_ID":23424740,"WOE_ID_EH":23424740,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"DZA","ADM0_A3_US":"DZA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[-8.6844,19.057364,11.999506,37.118381],"geometry":{"type":"Polygon","coordinates":[[[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4.859646,30.501188],[-3.690441,30.896952],[-3.647498,31.637294],[-3.06898,31.724498],[-2.616605,32.094346],[-1.307899,32.262889],[-1.124551,32.651522],[-1.388049,32.864015],[-1.733455,33.919713],[-1.792986,34.527919],[-2.169914,35.168396],[-1.208603,35.714849],[-0.127454,35.888662],[0.503877,36.301273],[1.466919,36.605647],[3.161699,36.783905],[4.815758,36.865037],[5.32012,36.716519],[6.26182,37.110655],[7.330385,37.118381],[7.737078,36.885708],[8.420964,36.946427],[8.217824,36.433177],[8.376368,35.479876],[8.140981,34.655146],[7.524482,34.097376],[7.612642,33.344115],[8.430473,32.748337],[8.439103,32.506285],[9.055603,32.102692],[9.48214,30.307556],[9.805634,29.424638],[9.859998,28.95999],[9.683885,28.144174],[9.756128,27.688259],[9.629056,27.140953],[9.716286,26.512206],[9.319411,26.094325],[9.910693,25.365455],[9.948261,24.936954],[10.303847,24.379313],[10.771364,24.562532],[11.560669,24.097909],[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Ecuador","SOV_A3":"ECU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ecuador","ADM0_A3":"ECU","GEOU_DIF":0,"GEOUNIT":"Ecuador","GU_A3":"ECU","SU_DIF":0,"SUBUNIT":"Ecuador","SU_A3":"ECU","BRK_DIFF":0,"NAME":"Ecuador","NAME_LONG":"Ecuador","BRK_A3":"ECU","BRK_NAME":"Ecuador","BRK_GROUP":null,"ABBREV":"Ecu.","POSTAL":"EC","FORMAL_EN":"Republic of Ecuador","FORMAL_FR":null,"NAME_CIAWF":"Ecuador","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ecuador","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":16290913,"POP_RANK":14,"GDP_MD_EST":182400,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"EC","ISO_A2":"EC","ISO_A3":"ECU","ISO_A3_EH":"ECU","ISO_N3":"218","UN_A3":"218","WB_A2":"EC","WB_A3":"ECU","WOE_ID":23424801,"WOE_ID_EH":23424801,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ECU","ADM0_A3_US":"ECU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-80.967765,-4.959129,-75.233723,1.380924],"geometry":{"type":"Polygon","coordinates":[[[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.292314,0.416047],[-75.801466,0.084801],[-75.373223,-0.152032],[-75.233723,-0.911417],[-75.544996,-1.56161],[-76.635394,-2.608678],[-77.837905,-3.003021],[-78.450684,-3.873097],[-78.639897,-4.547784],[-79.205289,-4.959129],[-79.624979,-4.454198],[-80.028908,-4.346091],[-80.442242,-4.425724],[-80.469295,-4.059287],[-80.184015,-3.821162],[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Egypt","SOV_A3":"EGY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Egypt","ADM0_A3":"EGY","GEOU_DIF":0,"GEOUNIT":"Egypt","GU_A3":"EGY","SU_DIF":0,"SUBUNIT":"Egypt","SU_A3":"EGY","BRK_DIFF":0,"NAME":"Egypt","NAME_LONG":"Egypt","BRK_A3":"EGY","BRK_NAME":"Egypt","BRK_GROUP":null,"ABBREV":"Egypt","POSTAL":"EG","FORMAL_EN":"Arab Republic of Egypt","FORMAL_FR":null,"NAME_CIAWF":"Egypt","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Egypt, Arab Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":97041072,"POP_RANK":16,"GDP_MD_EST":1105000,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"EG","ISO_A2":"EG","ISO_A3":"EGY","ISO_A3_EH":"EGY","ISO_N3":"818","UN_A3":"818","WB_A2":"EG","WB_A3":"EGY","WOE_ID":23424802,"WOE_ID_EH":23424802,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"EGY","ADM0_A3_US":"EGY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[24.70007,22,36.86623,31.58568],"geometry":{"type":"Polygon","coordinates":[[[36.86623,22],[32.9,22],[29.02,22],[25,22],[25,25.6825],[25,29.238655],[24.70007,30.04419],[24.95762,30.6616],[24.80287,31.08929],[25.16482,31.56915],[26.49533,31.58568],[27.45762,31.32126],[28.45048,31.02577],[28.91353,30.87005],[29.68342,31.18686],[30.09503,31.4734],[30.97693,31.55586],[31.68796,31.4296],[31.96041,30.9336],[32.19247,31.26034],[32.99392,31.02407],[33.7734,30.96746],[34.265435,31.219357],[34.26544,31.21936],[34.823243,29.761081],[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Eritrea","SOV_A3":"ERI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Eritrea","ADM0_A3":"ERI","GEOU_DIF":0,"GEOUNIT":"Eritrea","GU_A3":"ERI","SU_DIF":0,"SUBUNIT":"Eritrea","SU_A3":"ERI","BRK_DIFF":0,"NAME":"Eritrea","NAME_LONG":"Eritrea","BRK_A3":"ERI","BRK_NAME":"Eritrea","BRK_GROUP":null,"ABBREV":"Erit.","POSTAL":"ER","FORMAL_EN":"State of Eritrea","FORMAL_FR":null,"NAME_CIAWF":"Eritrea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Eritrea","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":5918919,"POP_RANK":13,"GDP_MD_EST":9169,"POP_YEAR":2017,"LASTCENSUS":1984,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"ER","ISO_A2":"ER","ISO_A3":"ERI","ISO_A3_EH":"ERI","ISO_N3":"232","UN_A3":"232","WB_A2":"ER","WB_A3":"ERI","WOE_ID":23424806,"WOE_ID_EH":23424806,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ERI","ADM0_A3_US":"ERI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[36.32322,12.455416,43.081226,17.998307],"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[42.779642,12.455416],[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.1552,13.77333],[40.8966,14.11864],[40.02625,14.51959],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.32322,14.82249],[36.75389,16.29186],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[39.26611,15.922723],[39.814294,15.435647],[41.179275,14.49108],[41.734952,13.921037],[42.276831,13.343992],[42.589576,13.000421],[43.081226,12.699639]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Spain","SOV_A3":"ESP","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Spain","ADM0_A3":"ESP","GEOU_DIF":0,"GEOUNIT":"Spain","GU_A3":"ESP","SU_DIF":0,"SUBUNIT":"Spain","SU_A3":"ESP","BRK_DIFF":0,"NAME":"Spain","NAME_LONG":"Spain","BRK_A3":"ESP","BRK_NAME":"Spain","BRK_GROUP":null,"ABBREV":"Sp.","POSTAL":"E","FORMAL_EN":"Kingdom of Spain","FORMAL_FR":null,"NAME_CIAWF":"Spain","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Spain","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":48958159,"POP_RANK":15,"GDP_MD_EST":1690000,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"SP","ISO_A2":"ES","ISO_A3":"ESP","ISO_A3_EH":"ESP","ISO_N3":"724","UN_A3":"724","WB_A2":"ES","WB_A3":"ESP","WOE_ID":23424950,"WOE_ID_EH":23424950,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ESP","ADM0_A3_US":"ESP","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[-9.392884,35.94685,3.039484,43.748338],"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0.106692,40.123934],[-0.278711,39.309978],[0.111291,38.738514],[-0.467124,38.292366],[-0.683389,37.642354],[-1.438382,37.443064],[-2.146453,36.674144],[-3.415781,36.6589],[-4.368901,36.677839],[-4.995219,36.324708],[-5.37716,35.94685],[-5.866432,36.029817],[-6.236694,36.367677],[-6.520191,36.942913],[-7.453726,37.097788],[-7.537105,37.428904],[-7.166508,37.803894],[-7.029281,38.075764],[-7.374092,38.373059],[-7.098037,39.030073],[-7.498632,39.629571],[-7.066592,39.711892],[-7.026413,40.184524],[-6.86402,40.330872],[-6.851127,41.111083],[-6.389088,41.381815],[-6.668606,41.883387],[-7.251309,41.918346],[-7.422513,41.792075],[-8.013175,41.790886],[-8.263857,42.280469],[-8.671946,42.134689],[-9.034818,41.880571]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Estonia","SOV_A3":"EST","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Estonia","ADM0_A3":"EST","GEOU_DIF":0,"GEOUNIT":"Estonia","GU_A3":"EST","SU_DIF":0,"SUBUNIT":"Estonia","SU_A3":"EST","BRK_DIFF":0,"NAME":"Estonia","NAME_LONG":"Estonia","BRK_A3":"EST","BRK_NAME":"Estonia","BRK_GROUP":null,"ABBREV":"Est.","POSTAL":"EST","FORMAL_EN":"Republic of Estonia","FORMAL_FR":null,"NAME_CIAWF":"Estonia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Estonia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":10,"POP_EST":1251581,"POP_RANK":12,"GDP_MD_EST":38700,"POP_YEAR":2017,"LASTCENSUS":2000,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"EN","ISO_A2":"EE","ISO_A3":"EST","ISO_A3_EH":"EST","ISO_N3":"233","UN_A3":"233","WB_A2":"EE","WB_A3":"EST","WOE_ID":23424805,"WOE_ID_EH":23424805,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"EST","ADM0_A3_US":"EST","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[23.339795,57.474528,28.131699,59.61109],"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[27.981127,59.475373],[27.98112,59.47537],[28.131699,59.300825],[27.42015,58.72457],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Ethiopia","SOV_A3":"ETH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ethiopia","ADM0_A3":"ETH","GEOU_DIF":0,"GEOUNIT":"Ethiopia","GU_A3":"ETH","SU_DIF":0,"SUBUNIT":"Ethiopia","SU_A3":"ETH","BRK_DIFF":0,"NAME":"Ethiopia","NAME_LONG":"Ethiopia","BRK_A3":"ETH","BRK_NAME":"Ethiopia","BRK_GROUP":null,"ABBREV":"Eth.","POSTAL":"ET","FORMAL_EN":"Federal Democratic Republic of Ethiopia","FORMAL_FR":null,"NAME_CIAWF":"Ethiopia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ethiopia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":13,"POP_EST":105350020,"POP_RANK":17,"GDP_MD_EST":174700,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"ET","ISO_A2":"ET","ISO_A3":"ETH","ISO_A3_EH":"ETH","ISO_N3":"231","UN_A3":"231","WB_A2":"ET","WB_A3":"ETH","WOE_ID":23424808,"WOE_ID_EH":23424808,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ETH","ADM0_A3_US":"ETH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[32.95418,3.42206,47.78942,14.95943],"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048],[43.67875,9.18358],[46.94834,7.99688],[47.78942,8.003],[44.9636,5.00162],[43.66087,4.95755],[42.76967,4.25259],[42.12861,4.23413],[41.855083,3.918912],[41.1718,3.91909],[40.76848,4.25702],[39.85494,3.83879],[39.559384,3.42206],[38.89251,3.50074],[38.67114,3.61607],[38.43697,3.58851],[38.120915,3.598605],[36.855093,4.447864],[36.159079,4.447864],[35.817448,4.776966],[35.817448,5.338232],[35.298007,5.506],[34.70702,6.59422],[34.25032,6.82607],[34.0751,7.22595],[33.56829,7.71334],[32.95418,7.78497],[33.2948,8.35458],[33.8255,8.37916],[33.97498,8.68456],[33.96162,9.58358],[34.25745,10.63009],[34.73115,10.91017],[34.83163,11.31896],[35.26049,12.08286],[35.86363,12.57828],[36.27022,13.56333],[36.42951,14.42211],[37.59377,14.2131],[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Finland","SOV_A3":"FI1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Finland","ADM0_A3":"FIN","GEOU_DIF":0,"GEOUNIT":"Finland","GU_A3":"FIN","SU_DIF":0,"SUBUNIT":"Finland","SU_A3":"FIN","BRK_DIFF":0,"NAME":"Finland","NAME_LONG":"Finland","BRK_A3":"FIN","BRK_NAME":"Finland","BRK_GROUP":null,"ABBREV":"Fin.","POSTAL":"FIN","FORMAL_EN":"Republic of Finland","FORMAL_FR":null,"NAME_CIAWF":"Finland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Finland","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":6,"POP_EST":5491218,"POP_RANK":13,"GDP_MD_EST":224137,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"FI","ISO_A2":"FI","ISO_A3":"FIN","ISO_A3_EH":"FIN","ISO_N3":"246","UN_A3":"246","WB_A2":"FI","WB_A3":"FIN","WOE_ID":23424812,"WOE_ID_EH":23424812,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"FIN","ADM0_A3_US":"FIN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[20.645593,59.846373,31.516092,70.164193],"geometry":{"type":"Polygon","coordinates":[[[23.903379,66.006927],[23.56588,66.396051],[23.539473,67.936009],[21.978535,68.616846],[20.645593,69.106247],[21.244936,69.370443],[22.356238,68.841741],[23.66205,68.891247],[24.735679,68.649557],[25.689213,69.092114],[26.179622,69.825299],[27.732292,70.164193],[29.015573,69.766491],[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.07,60.50352],[28.070002,60.503519],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705329],[21.059211,62.607393],[21.536029,63.189735],[22.442744,63.81781],[24.730512,64.902344],[25.398068,65.111427],[25.294043,65.534346],[23.903379,66.006927]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Fiji","SOV_A3":"FJI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Fiji","ADM0_A3":"FJI","GEOU_DIF":0,"GEOUNIT":"Fiji","GU_A3":"FJI","SU_DIF":0,"SUBUNIT":"Fiji","SU_A3":"FJI","BRK_DIFF":0,"NAME":"Fiji","NAME_LONG":"Fiji","BRK_A3":"FJI","BRK_NAME":"Fiji","BRK_GROUP":null,"ABBREV":"Fiji","POSTAL":"FJ","FORMAL_EN":"Republic of Fiji","FORMAL_FR":null,"NAME_CIAWF":"Fiji","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Fiji","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":920938,"POP_RANK":11,"GDP_MD_EST":8374,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"FJ","ISO_A2":"FJ","ISO_A3":"FJI","ISO_A3_EH":"FJI","ISO_N3":"242","UN_A3":"242","WB_A2":"FJ","WB_A3":"FJI","WOE_ID":23424813,"WOE_ID_EH":23424813,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"FJI","ADM0_A3_US":"FJI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-180,-18.28799,180,-16.020882],"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[-179.917369,-16.501783],[-180,-16.555217],[-180,-16.067133],[-179.79332,-16.020882],[-179.917369,-16.501783]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"United Kingdom","SOV_A3":"GB1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","ADMIN":"Falkland Islands","ADM0_A3":"FLK","GEOU_DIF":0,"GEOUNIT":"Falkland Islands","GU_A3":"FLK","SU_DIF":0,"SUBUNIT":"Falkland Islands","SU_A3":"FLK","BRK_DIFF":1,"NAME":"Falkland Is.","NAME_LONG":"Falkland Islands","BRK_A3":"B12","BRK_NAME":"Falkland Is.","BRK_GROUP":null,"ABBREV":"Flk. Is.","POSTAL":"FK","FORMAL_EN":"Falkland Islands","FORMAL_FR":null,"NAME_CIAWF":"Falkland Islands (Islas Malvinas)","NOTE_ADM0":"U.K.","NOTE_BRK":"Admin. by U.K.; Claimed by Argentina","NAME_SORT":"Falkland Islands","NAME_ALT":"Islas Malvinas","MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":2931,"POP_RANK":4,"GDP_MD_EST":281.8,"POP_YEAR":2014,"LASTCENSUS":-99,"GDP_YEAR":2012,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"FK","ISO_A2":"FK","ISO_A3":"FLK","ISO_A3_EH":"FLK","ISO_N3":"238","UN_A3":"238","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424814,"WOE_ID_EH":23424814,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"FLK","ADM0_A3_US":"FLK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":12,"LONG_LEN":16,"ABBREV_LEN":8,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9},"bbox":[-61.2,-52.3,-57.75,-51.1],"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"France","ADM0_A3":"FRA","GEOU_DIF":0,"GEOUNIT":"France","GU_A3":"FRA","SU_DIF":0,"SUBUNIT":"France","SU_A3":"FRA","BRK_DIFF":0,"NAME":"France","NAME_LONG":"France","BRK_A3":"FRA","BRK_NAME":"France","BRK_GROUP":null,"ABBREV":"Fr.","POSTAL":"F","FORMAL_EN":"French Republic","FORMAL_FR":null,"NAME_CIAWF":"France","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"France","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":67106161,"POP_RANK":16,"GDP_MD_EST":2699000,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"FR","ISO_A2":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"250","UN_A3":"250","WB_A2":"FR","WB_A3":"FRA","WOE_ID":-90,"WOE_ID_EH":23424819,"WOE_NOTE":"Includes only Metropolitan France (including Corsica)","ADM0_A3_IS":"FRA","ADM0_A3_US":"FRA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":3,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[-54.524754,2.053389,9.560016,51.148506],"geometry":{"type":"MultiPolygon","coordinates":[[[[2.513573,51.148506],[2.658422,50.796848],[3.123252,50.780363],[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[6.736571,47.541801],[6.768714,47.287708],[6.037389,46.725779],[6.022609,46.27299],[6.5001,46.429673],[6.843593,45.991147],[6.802355,45.70858],[7.096652,45.333099],[6.749955,45.028518],[7.007562,44.254767],[7.549596,44.127901],[7.435185,43.693845],[6.529245,43.128892],[4.556963,43.399651],[3.100411,43.075201],[2.985999,42.473015],[1.826793,42.343385],[0.701591,42.795734],[0.338047,42.579546],[-1.502771,43.034014],[-1.901351,43.422802],[-1.384225,44.02261],[-1.193798,46.014918],[-2.225724,47.064363],[-2.963276,47.570327],[-4.491555,47.954954],[-4.59235,48.68416],[-3.295814,48.901692],[-1.616511,48.644421],[-1.933494,49.776342],[-0.989469,49.347376],[1.338761,50.127173],[1.639001,50.946606],[2.513573,51.148506]]],[[[-51.657797,4.156232],[-52.249338,3.241094],[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232]]],[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Gabon","SOV_A3":"GAB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Gabon","ADM0_A3":"GAB","GEOU_DIF":0,"GEOUNIT":"Gabon","GU_A3":"GAB","SU_DIF":0,"SUBUNIT":"Gabon","SU_A3":"GAB","BRK_DIFF":0,"NAME":"Gabon","NAME_LONG":"Gabon","BRK_A3":"GAB","BRK_NAME":"Gabon","BRK_GROUP":null,"ABBREV":"Gabon","POSTAL":"GA","FORMAL_EN":"Gabonese Republic","FORMAL_FR":null,"NAME_CIAWF":"Gabon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Gabon","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":1772255,"POP_RANK":12,"GDP_MD_EST":35980,"POP_YEAR":2017,"LASTCENSUS":2003,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"GB","ISO_A2":"GA","ISO_A3":"GAB","ISO_A3_EH":"GAB","ISO_N3":"266","UN_A3":"266","WB_A2":"GA","WB_A3":"GAB","WOE_ID":23424822,"WOE_ID_EH":23424822,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GAB","ADM0_A3_US":"GAB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":3,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[8.797996,-3.978827,14.425456,2.326758],"geometry":{"type":"Polygon","coordinates":[[[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.19693],[13.843321,0.038758],[14.316418,-0.552627],[14.425456,-1.333407],[14.29921,-1.998276],[13.992407,-2.470805],[13.109619,-2.42874],[12.575284,-1.948511],[12.495703,-2.391688],[11.820964,-2.514161],[11.478039,-2.765619],[11.855122,-3.426871],[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"United Kingdom","SOV_A3":"GB1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"United Kingdom","ADM0_A3":"GBR","GEOU_DIF":0,"GEOUNIT":"United Kingdom","GU_A3":"GBR","SU_DIF":0,"SUBUNIT":"United Kingdom","SU_A3":"GBR","BRK_DIFF":0,"NAME":"United Kingdom","NAME_LONG":"United Kingdom","BRK_A3":"GBR","BRK_NAME":"United Kingdom","BRK_GROUP":null,"ABBREV":"U.K.","POSTAL":"GB","FORMAL_EN":"United Kingdom of Great Britain and Northern Ireland","FORMAL_FR":null,"NAME_CIAWF":"United Kingdom","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United Kingdom","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":64769452,"POP_RANK":16,"GDP_MD_EST":2788000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"UK","ISO_A2":"GB","ISO_A3":"GBR","ISO_A3_EH":"GBR","ISO_N3":"826","UN_A3":"826","WB_A2":"GB","WB_A3":"GBR","WOE_ID":-90,"WOE_ID_EH":23424975,"WOE_NOTE":"Eh ID includes Channel Islands and Isle of Man. UK constituent countries of England (24554868), Wales (12578049), Scotland (12578048), and Northern Ireland (20070563).","ADM0_A3_IS":"GBR","ADM0_A3_US":"GBR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":14,"LONG_LEN":14,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[-7.572168,49.96,1.681531,58.635],"geometry":{"type":"MultiPolygon","coordinates":[[[[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603],[-6.197885,53.867565]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[-0.430485,54.464376],[0.184981,53.325014],[0.469977,52.929999],[1.681531,52.73952],[1.559988,52.099998],[1.050562,51.806761],[1.449865,51.289428],[0.550334,50.765739],[-0.787517,50.774989],[-2.489998,50.500019],[-2.956274,50.69688],[-3.617448,50.228356],[-4.542508,50.341837],[-5.245023,49.96],[-5.776567,50.159678],[-4.30999,51.210001],[-3.414851,51.426009],[-3.422719,51.426848],[-4.984367,51.593466],[-5.267296,51.9914],[-4.222347,52.301356],[-4.770013,52.840005],[-4.579999,53.495004],[-3.093831,53.404547],[-3.09208,53.404441],[-2.945009,53.985],[-3.614701,54.600937],[-3.630005,54.615013],[-4.844169,54.790971],[-5.082527,55.061601],[-4.719112,55.508473],[-5.047981,55.783986],[-5.586398,55.311146],[-5.644999,56.275015],[-6.149981,56.78501],[-5.786825,57.818848],[-5.009999,58.630013],[-4.211495,58.550845],[-3.005005,58.635]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Georgia","SOV_A3":"GEO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Georgia","ADM0_A3":"GEO","GEOU_DIF":0,"GEOUNIT":"Georgia","GU_A3":"GEO","SU_DIF":0,"SUBUNIT":"Georgia","SU_A3":"GEO","BRK_DIFF":0,"NAME":"Georgia","NAME_LONG":"Georgia","BRK_A3":"GEO","BRK_NAME":"Georgia","BRK_GROUP":null,"ABBREV":"Geo.","POSTAL":"GE","FORMAL_EN":"Georgia","FORMAL_FR":null,"NAME_CIAWF":"Georgia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Georgia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":2,"POP_EST":4926330,"POP_RANK":12,"GDP_MD_EST":37270,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"GG","ISO_A2":"GE","ISO_A3":"GEO","ISO_A3_EH":"GEO","ISO_N3":"268","UN_A3":"268","WB_A2":"GE","WB_A3":"GEO","WOE_ID":23424823,"WOE_ID_EH":23424823,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GEO","ADM0_A3_US":"GEO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[39.955009,41.064445,46.637908,43.553104],"geometry":{"type":"Polygon","coordinates":[[[44.97248,41.248129],[43.582746,41.092143],[42.619549,41.583173],[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.92219,43.38215],[42.3944,43.2203],[43.75599,42.74083],[43.93121,42.55496],[44.537623,42.711993],[45.470279,42.502781],[45.7764,42.09244],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.064445],[45.962601,41.123873],[45.217426,41.411452],[44.97248,41.248129]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Ghana","SOV_A3":"GHA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ghana","ADM0_A3":"GHA","GEOU_DIF":0,"GEOUNIT":"Ghana","GU_A3":"GHA","SU_DIF":0,"SUBUNIT":"Ghana","SU_A3":"GHA","BRK_DIFF":0,"NAME":"Ghana","NAME_LONG":"Ghana","BRK_A3":"GHA","BRK_NAME":"Ghana","BRK_GROUP":null,"ABBREV":"Ghana","POSTAL":"GH","FORMAL_EN":"Republic of Ghana","FORMAL_FR":null,"NAME_CIAWF":"Ghana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ghana","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":27499924,"POP_RANK":15,"GDP_MD_EST":120800,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"GH","ISO_A2":"GH","ISO_A3":"GHA","ISO_A3_EH":"GHA","ISO_N3":"288","UN_A3":"288","WB_A2":"GH","WB_A3":"GHA","WOE_ID":23424824,"WOE_ID_EH":23424824,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GHA","ADM0_A3_US":"GHA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-3.24437,4.710462,1.060122,11.098341],"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901,9.465004],[0.461192,8.677223],[0.712029,8.312465],[0.490957,7.411744],[0.570384,6.914359],[0.836931,6.279979],[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Guinea","SOV_A3":"GIN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Guinea","ADM0_A3":"GIN","GEOU_DIF":0,"GEOUNIT":"Guinea","GU_A3":"GIN","SU_DIF":0,"SUBUNIT":"Guinea","SU_A3":"GIN","BRK_DIFF":0,"NAME":"Guinea","NAME_LONG":"Guinea","BRK_A3":"GIN","BRK_NAME":"Guinea","BRK_GROUP":null,"ABBREV":"Gin.","POSTAL":"GN","FORMAL_EN":"Republic of Guinea","FORMAL_FR":null,"NAME_CIAWF":"Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guinea","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":12413867,"POP_RANK":14,"GDP_MD_EST":16080,"POP_YEAR":2017,"LASTCENSUS":1996,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"GV","ISO_A2":"GN","ISO_A3":"GIN","ISO_A3_EH":"GIN","ISO_N3":"324","UN_A3":"324","WB_A2":"GN","WB_A3":"GIN","WOE_ID":23424835,"WOE_ID_EH":23424835,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GIN","ADM0_A3_US":"GIN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-15.130311,7.309037,-7.8321,12.586183],"geometry":{"type":"Polygon","coordinates":[[[-8.029944,10.206535],[-8.229337,10.12902],[-8.309616,9.789532],[-8.079114,9.376224],[-7.8321,8.575704],[-8.203499,8.455453],[-8.299049,8.316444],[-8.221792,8.123329],[-8.280703,7.68718],[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834],[-12.596719,9.620188],[-12.711958,9.342712],[-13.24655,8.903049],[-13.685154,9.494744],[-14.074045,9.886167],[-14.330076,10.01572],[-14.579699,10.214467],[-14.693232,10.656301],[-14.839554,10.876572],[-15.130311,11.040412],[-14.685687,11.527824],[-14.382192,11.509272],[-14.121406,11.677117],[-13.9008,11.678719],[-13.743161,11.811269],[-13.828272,12.142644],[-13.718744,12.247186],[-13.700476,12.586183],[-13.217818,12.575874],[-12.499051,12.33209],[-12.278599,12.35444],[-12.203565,12.465648],[-11.658301,12.386583],[-11.513943,12.442988],[-11.456169,12.076834],[-11.297574,12.077971],[-11.036556,12.211245],[-10.87083,12.177887],[-10.593224,11.923975],[-10.165214,11.844084],[-9.890993,12.060479],[-9.567912,12.194243],[-9.327616,12.334286],[-9.127474,12.30806],[-8.905265,12.088358],[-8.786099,11.812561],[-8.376305,11.393646],[-8.581305,11.136246],[-8.620321,10.810891],[-8.407311,10.909257],[-8.282357,10.792597],[-8.335377,10.494812],[-8.029944,10.206535]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Gambia","SOV_A3":"GMB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Gambia","ADM0_A3":"GMB","GEOU_DIF":0,"GEOUNIT":"Gambia","GU_A3":"GMB","SU_DIF":0,"SUBUNIT":"Gambia","SU_A3":"GMB","BRK_DIFF":0,"NAME":"Gambia","NAME_LONG":"The Gambia","BRK_A3":"GMB","BRK_NAME":"Gambia","BRK_GROUP":null,"ABBREV":"Gambia","POSTAL":"GM","FORMAL_EN":"Republic of the Gambia","FORMAL_FR":null,"NAME_CIAWF":"Gambia, The","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Gambia, The","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":8,"POP_EST":2051363,"POP_RANK":12,"GDP_MD_EST":3387,"POP_YEAR":2017,"LASTCENSUS":2003,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"GA","ISO_A2":"GM","ISO_A3":"GMB","ISO_A3_EH":"GMB","ISO_N3":"270","UN_A3":"270","WB_A2":"GM","WB_A3":"GMB","WOE_ID":23424821,"WOE_ID_EH":23424821,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GMB","ADM0_A3_US":"GMB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":10,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[-16.841525,13.130284,-13.844963,13.876492],"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Guinea-Bissau","SOV_A3":"GNB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Guinea-Bissau","ADM0_A3":"GNB","GEOU_DIF":0,"GEOUNIT":"Guinea-Bissau","GU_A3":"GNB","SU_DIF":0,"SUBUNIT":"Guinea-Bissau","SU_A3":"GNB","BRK_DIFF":0,"NAME":"Guinea-Bissau","NAME_LONG":"Guinea-Bissau","BRK_A3":"GNB","BRK_NAME":"Guinea-Bissau","BRK_GROUP":null,"ABBREV":"GnB.","POSTAL":"GW","FORMAL_EN":"Republic of Guinea-Bissau","FORMAL_FR":null,"NAME_CIAWF":"Guinea-Bissau","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guinea-Bissau","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":4,"POP_EST":1792338,"POP_RANK":12,"GDP_MD_EST":2851,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"PU","ISO_A2":"GW","ISO_A3":"GNB","ISO_A3_EH":"GNB","ISO_N3":"624","UN_A3":"624","WB_A2":"GW","WB_A3":"GNB","WOE_ID":23424929,"WOE_ID_EH":23424929,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GNB","ADM0_A3_US":"GNB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[-16.677452,11.040412,-13.700476,12.62817],"geometry":{"type":"Polygon","coordinates":[[[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.509272],[-14.685687,11.527824],[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Equatorial Guinea","SOV_A3":"GNQ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Equatorial Guinea","ADM0_A3":"GNQ","GEOU_DIF":0,"GEOUNIT":"Equatorial Guinea","GU_A3":"GNQ","SU_DIF":0,"SUBUNIT":"Equatorial Guinea","SU_A3":"GNQ","BRK_DIFF":0,"NAME":"Eq. Guinea","NAME_LONG":"Equatorial Guinea","BRK_A3":"GNQ","BRK_NAME":"Eq. Guinea","BRK_GROUP":null,"ABBREV":"Eq. G.","POSTAL":"GQ","FORMAL_EN":"Republic of Equatorial Guinea","FORMAL_FR":null,"NAME_CIAWF":"Equatorial Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Equatorial Guinea","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":778358,"POP_RANK":11,"GDP_MD_EST":31770,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"EK","ISO_A2":"GQ","ISO_A3":"GNQ","ISO_A3_EH":"GNQ","ISO_N3":"226","UN_A3":"226","WB_A2":"GQ","WB_A3":"GNQ","WOE_ID":23424804,"WOE_ID_EH":23424804,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GNQ","ADM0_A3_US":"GNQ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":17,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[9.305613,1.01012,11.285079,2.283866],"geometry":{"type":"Polygon","coordinates":[[[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Greece","SOV_A3":"GRC","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Greece","ADM0_A3":"GRC","GEOU_DIF":0,"GEOUNIT":"Greece","GU_A3":"GRC","SU_DIF":0,"SUBUNIT":"Greece","SU_A3":"GRC","BRK_DIFF":0,"NAME":"Greece","NAME_LONG":"Greece","BRK_A3":"GRC","BRK_NAME":"Greece","BRK_GROUP":null,"ABBREV":"Greece","POSTAL":"GR","FORMAL_EN":"Hellenic Republic","FORMAL_FR":null,"NAME_CIAWF":"Greece","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Greece","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":9,"POP_EST":10768477,"POP_RANK":14,"GDP_MD_EST":290500,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"GR","ISO_A2":"GR","ISO_A3":"GRC","ISO_A3_EH":"GRC","ISO_N3":"300","UN_A3":"300","WB_A2":"GR","WB_A3":"GRC","WOE_ID":23424833,"WOE_ID_EH":23424833,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GRC","ADM0_A3_US":"GRC","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[20.150016,34.919988,26.604196,41.826905],"geometry":{"type":"MultiPolygon","coordinates":[[[[20.150016,39.624998],[20.615,40.110007],[20.674997,40.435],[20.99999,40.580004],[21.02004,40.842727],[21.674161,40.931275],[22.055378,41.149866],[22.597308,41.130487],[22.76177,41.3048],[22.952377,41.337994],[23.692074,41.309081],[24.492645,41.583896],[25.197201,41.234486],[26.106138,41.328899],[26.117042,41.826905],[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.407999,40.124993],[23.899968,39.962006],[23.342999,39.960998],[22.813988,40.476005],[22.626299,40.256561],[22.849748,39.659311],[23.350027,39.190011],[22.973099,38.970903],[23.530016,38.510001],[24.025025,38.219993],[24.040011,37.655015],[23.115003,37.920011],[23.409972,37.409991],[22.774972,37.30501],[23.154225,36.422506],[22.490028,36.41],[21.670026,36.844986],[21.295011,37.644989],[21.120034,38.310323],[20.730032,38.769985],[20.217712,39.340235],[20.150016,39.624998]]],[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Denmark","SOV_A3":"DN1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Greenland","ADM0_A3":"GRL","GEOU_DIF":0,"GEOUNIT":"Greenland","GU_A3":"GRL","SU_DIF":0,"SUBUNIT":"Greenland","SU_A3":"GRL","BRK_DIFF":0,"NAME":"Greenland","NAME_LONG":"Greenland","BRK_A3":"GRL","BRK_NAME":"Greenland","BRK_GROUP":null,"ABBREV":"Grlnd.","POSTAL":"GL","FORMAL_EN":"Greenland","FORMAL_FR":null,"NAME_CIAWF":"Greenland","NOTE_ADM0":"Den.","NOTE_BRK":null,"NAME_SORT":"Greenland","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":57713,"POP_RANK":8,"GDP_MD_EST":2173,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2015,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"GL","ISO_A2":"GL","ISO_A3":"GRL","ISO_A3_EH":"GRL","ISO_N3":"304","UN_A3":"304","WB_A2":"GL","WB_A3":"GRL","WOE_ID":23424828,"WOE_ID_EH":23424828,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GRL","ADM0_A3_US":"GRL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[-73.297,60.03676,-12.20855,83.64513],"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81.71885],[-12.20855,81.29154],[-16.28533,80.58004],[-16.85,80.35],[-20.04624,80.17708],[-17.73035,80.12912],[-18.9,79.4],[-19.70499,78.75128],[-19.67353,77.63859],[-18.47285,76.98565],[-20.03503,76.94434],[-21.67944,76.62795],[-19.83407,76.09808],[-19.59896,75.24838],[-20.66818,75.15585],[-19.37281,74.29561],[-21.59422,74.22382],[-20.43454,73.81713],[-20.76234,73.46436],[-22.17221,73.30955],[-23.56593,73.30663],[-22.31311,72.62928],[-22.29954,72.18409],[-24.27834,72.59788],[-24.79296,72.3302],[-23.44296,72.08016],[-22.13281,71.46898],[-21.75356,70.66369],[-23.53603,70.471],[-24.30702,70.85649],[-25.54341,71.43094],[-25.20135,70.75226],[-26.36276,70.22646],[-23.72742,70.18401],[-22.34902,70.12946],[-25.02927,69.2588],[-27.74737,68.47046],[-30.67371,68.12503],[-31.77665,68.12078],[-32.81105,67.73547],[-34.20196,66.67974],[-36.35284,65.9789],[-37.04378,65.93768],[-38.37505,65.69213],[-39.81222,65.45848],[-40.66899,64.83997],[-40.68281,64.13902],[-41.1887,63.48246],[-42.81938,62.68233],[-42.41666,61.90093],[-42.86619,61.07404],[-43.3784,60.09772],[-44.7875,60.03676],[-46.26364,60.85328],[-48.26294,60.85843],[-49.23308,61.40681],[-49.90039,62.38336],[-51.63325,63.62691],[-52.14014,64.27842],[-52.27659,65.1767],[-53.66166,66.09957],[-53.30161,66.8365],[-53.96911,67.18899],[-52.9804,68.35759],[-51.47536,68.72958],[-51.08041,69.14781],[-50.87122,69.9291],[-52.013585,69.574925],[-52.55792,69.42616],[-53.45629,69.283625],[-54.68336,69.61003],[-54.75001,70.28932],[-54.35884,70.821315],[-53.431315,70.835755],[-51.39014,70.56978],[-53.10937,71.20485],[-54.00422,71.54719],[-55,71.406537],[-55.83468,71.65444],[-54.71819,72.58625],[-55.32634,72.95861],[-56.12003,73.64977],[-57.32363,74.71026],[-58.59679,75.09861],[-58.58516,75.51727],[-61.26861,76.10238],[-63.39165,76.1752],[-66.06427,76.13486],[-68.50438,76.06141],[-69.66485,76.37975],[-71.40257,77.00857],[-68.77671,77.32312],[-66.76397,77.37595],[-71.04293,77.63595],[-73.297,78.04419],[-73.15938,78.43271],[-69.37345,78.91388],[-65.7107,79.39436],[-65.3239,79.75814],[-68.02298,80.11721],[-67.15129,80.51582],[-63.68925,81.21396],[-62.23444,81.3211],[-62.65116,81.77042],[-60.28249,82.03363],[-57.20744,82.19074],[-54.13442,82.19962],[-53.04328,81.88833],[-50.39061,82.43883],[-48.00386,82.06481],[-46.59984,81.985945],[-44.523,81.6607],[-46.9007,82.19979],[-46.76379,82.62796]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Guatemala","SOV_A3":"GTM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Guatemala","ADM0_A3":"GTM","GEOU_DIF":0,"GEOUNIT":"Guatemala","GU_A3":"GTM","SU_DIF":0,"SUBUNIT":"Guatemala","SU_A3":"GTM","BRK_DIFF":0,"NAME":"Guatemala","NAME_LONG":"Guatemala","BRK_A3":"GTM","BRK_NAME":"Guatemala","BRK_GROUP":null,"ABBREV":"Guat.","POSTAL":"GT","FORMAL_EN":"Republic of Guatemala","FORMAL_FR":null,"NAME_CIAWF":"Guatemala","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guatemala","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":6,"POP_EST":15460732,"POP_RANK":14,"GDP_MD_EST":131800,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"GT","ISO_A2":"GT","ISO_A3":"GTM","ISO_A3_EH":"GTM","ISO_N3":"320","UN_A3":"320","WB_A2":"GT","WB_A3":"GTM","WOE_ID":23424834,"WOE_ID_EH":23424834,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GTM","ADM0_A3_US":"GTM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":4,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-92.229249,13.735338,-88.225023,17.819326],"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150806,17.015577],[-89.229122,15.886938],[-88.930613,15.887273],[-88.604586,15.70638],[-88.518364,15.855389],[-88.225023,15.727722],[-88.68068,15.346247],[-89.154811,15.066419],[-89.22522,14.874286],[-89.145535,14.678019],[-89.353326,14.424133],[-89.587343,14.362586],[-89.534219,14.244816],[-89.721934,14.134228],[-90.064678,13.88197],[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595],[-90.067934,17.819326],[-89.14308,17.808319]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Guyana","SOV_A3":"GUY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Guyana","ADM0_A3":"GUY","GEOU_DIF":0,"GEOUNIT":"Guyana","GU_A3":"GUY","SU_DIF":0,"SUBUNIT":"Guyana","SU_A3":"GUY","BRK_DIFF":0,"NAME":"Guyana","NAME_LONG":"Guyana","BRK_A3":"GUY","BRK_NAME":"Guyana","BRK_GROUP":null,"ABBREV":"Guy.","POSTAL":"GY","FORMAL_EN":"Co-operative Republic of Guyana","FORMAL_FR":null,"NAME_CIAWF":"Guyana","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Guyana","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":8,"POP_EST":737718,"POP_RANK":11,"GDP_MD_EST":6093,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"GY","ISO_A2":"GY","ISO_A3":"GUY","ISO_A3_EH":"GUY","ISO_N3":"328","UN_A3":"328","WB_A2":"GY","WB_A3":"GUY","WOE_ID":23424836,"WOE_ID_EH":23424836,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"GUY","ADM0_A3_US":"GUY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-61.410303,1.268088,-56.539386,8.367035],"geometry":{"type":"Polygon","coordinates":[[[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.682585],[-58.11345,1.507195],[-58.429477,1.463942],[-58.540013,1.268088],[-59.030862,1.317698],[-59.646044,1.786894],[-59.718546,2.24963],[-59.974525,2.755233],[-59.815413,3.606499],[-59.53804,3.958803],[-59.767406,4.423503],[-60.111002,4.574967],[-59.980959,5.014061],[-60.213683,5.244486],[-60.733574,5.200277],[-61.410303,5.959068],[-61.139415,6.234297],[-61.159336,6.696077],[-60.543999,6.856584],[-60.295668,7.043911],[-60.637973,7.415],[-60.550588,7.779603],[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Honduras","SOV_A3":"HND","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Honduras","ADM0_A3":"HND","GEOU_DIF":0,"GEOUNIT":"Honduras","GU_A3":"HND","SU_DIF":0,"SUBUNIT":"Honduras","SU_A3":"HND","BRK_DIFF":0,"NAME":"Honduras","NAME_LONG":"Honduras","BRK_A3":"HND","BRK_NAME":"Honduras","BRK_GROUP":null,"ABBREV":"Hond.","POSTAL":"HN","FORMAL_EN":"Republic of Honduras","FORMAL_FR":null,"NAME_CIAWF":"Honduras","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Honduras","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":9038741,"POP_RANK":13,"GDP_MD_EST":43190,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"HO","ISO_A2":"HN","ISO_A3":"HND","ISO_A3_EH":"HND","ISO_N3":"340","UN_A3":"340","WB_A2":"HN","WB_A3":"HND","WOE_ID":23424841,"WOE_ID_EH":23424841,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"HND","ADM0_A3_US":"HND","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[-89.353326,12.984686,-83.147219,16.005406],"geometry":{"type":"Polygon","coordinates":[[[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655],[-87.901813,15.864458],[-87.61568,15.878799],[-87.522921,15.797279],[-87.367762,15.84694],[-86.903191,15.756713],[-86.440946,15.782835],[-86.119234,15.893449],[-86.001954,16.005406],[-85.683317,15.953652],[-85.444004,15.885749],[-85.182444,15.909158],[-84.983722,15.995923],[-84.52698,15.857224],[-84.368256,15.835158],[-84.063055,15.648244],[-83.773977,15.424072],[-83.410381,15.270903],[-83.147219,14.995829],[-83.489989,15.016267],[-83.628585,14.880074],[-83.975721,14.749436],[-84.228342,14.748764],[-84.449336,14.621614],[-84.649582,14.666805],[-84.820037,14.819587],[-84.924501,14.790493],[-85.052787,14.551541],[-85.148751,14.560197],[-85.165365,14.35437],[-85.514413,14.079012],[-85.698665,13.960078],[-85.801295,13.836055],[-86.096264,14.038187],[-86.312142,13.771356],[-86.520708,13.778487],[-86.755087,13.754845],[-86.733822,13.263093],[-86.880557,13.254204],[-87.005769,13.025794],[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Croatia","SOV_A3":"HRV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Croatia","ADM0_A3":"HRV","GEOU_DIF":0,"GEOUNIT":"Croatia","GU_A3":"HRV","SU_DIF":0,"SUBUNIT":"Croatia","SU_A3":"HRV","BRK_DIFF":0,"NAME":"Croatia","NAME_LONG":"Croatia","BRK_A3":"HRV","BRK_NAME":"Croatia","BRK_GROUP":null,"ABBREV":"Cro.","POSTAL":"HR","FORMAL_EN":"Republic of Croatia","FORMAL_FR":null,"NAME_CIAWF":"Croatia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Croatia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":4,"MAPCOLOR9":5,"MAPCOLOR13":1,"POP_EST":4292095,"POP_RANK":12,"GDP_MD_EST":94240,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"HR","ISO_A2":"HR","ISO_A3":"HRV","ISO_A3_EH":"HRV","ISO_N3":"191","UN_A3":"191","WB_A2":"HR","WB_A3":"HRV","WOE_ID":23424843,"WOE_ID_EH":23424843,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"HRV","ADM0_A3_US":"HRV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[13.656976,42.479991,19.390476,46.503751],"geometry":{"type":"Polygon","coordinates":[[[19.005485,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450017,42.479992],[18.450016,42.479991],[17.50997,42.849995],[16.930006,43.209998],[16.015385,43.507215],[15.174454,44.243191],[15.37625,44.317915],[14.920309,44.738484],[14.901602,45.07606],[14.258748,45.233777],[13.952255,44.802124],[13.656976,45.136935],[13.679403,45.484149],[13.71506,45.500324],[14.411968,45.466166],[14.595109,45.634941],[14.935244,45.471695],[15.327675,45.452316],[15.323954,45.731783],[15.67153,45.834154],[15.768733,46.238108],[16.564808,46.503751],[16.882515,46.380632],[17.630066,45.951769],[18.456062,45.759481],[18.829825,45.908872],[19.072769,45.521511],[19.390476,45.236516],[19.005485,44.860234]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Haiti","SOV_A3":"HTI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Haiti","ADM0_A3":"HTI","GEOU_DIF":0,"GEOUNIT":"Haiti","GU_A3":"HTI","SU_DIF":0,"SUBUNIT":"Haiti","SU_A3":"HTI","BRK_DIFF":0,"NAME":"Haiti","NAME_LONG":"Haiti","BRK_A3":"HTI","BRK_NAME":"Haiti","BRK_GROUP":null,"ABBREV":"Haiti","POSTAL":"HT","FORMAL_EN":"Republic of Haiti","FORMAL_FR":null,"NAME_CIAWF":"Haiti","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Haiti","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":1,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":10646714,"POP_RANK":14,"GDP_MD_EST":19340,"POP_YEAR":2017,"LASTCENSUS":2003,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"HA","ISO_A2":"HT","ISO_A3":"HTI","ISO_A3_EH":"HTI","ISO_N3":"332","UN_A3":"332","WB_A2":"HT","WB_A3":"HTI","WOE_ID":23424839,"WOE_ID_EH":23424839,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"HTI","ADM0_A3_US":"HTI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-74.458034,18.030993,-71.624873,19.915684],"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[-72.79165,19.101625],[-72.784105,19.483591],[-73.415022,19.639551],[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Hungary","SOV_A3":"HUN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Hungary","ADM0_A3":"HUN","GEOU_DIF":0,"GEOUNIT":"Hungary","GU_A3":"HUN","SU_DIF":0,"SUBUNIT":"Hungary","SU_A3":"HUN","BRK_DIFF":0,"NAME":"Hungary","NAME_LONG":"Hungary","BRK_A3":"HUN","BRK_NAME":"Hungary","BRK_GROUP":null,"ABBREV":"Hun.","POSTAL":"HU","FORMAL_EN":"Republic of Hungary","FORMAL_FR":null,"NAME_CIAWF":"Hungary","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Hungary","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":6,"MAPCOLOR9":1,"MAPCOLOR13":5,"POP_EST":9850845,"POP_RANK":13,"GDP_MD_EST":267600,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"HU","ISO_A2":"HU","ISO_A3":"HUN","ISO_A3_EH":"HUN","ISO_N3":"348","UN_A3":"348","WB_A2":"HU","WB_A3":"HUN","WOE_ID":23424844,"WOE_ID_EH":23424844,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"HUN","ADM0_A3_US":"HUN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[16.202298,45.759481,22.710531,48.623854],"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48.15024],[22.710531,47.882194],[22.099768,47.672439],[21.626515,46.994238],[21.021952,46.316088],[20.220192,46.127469],[19.596045,46.17173],[18.829838,45.908878],[18.829825,45.908872],[18.456062,45.759481],[17.630066,45.951769],[16.882515,46.380632],[16.564808,46.503751],[16.370505,46.841327],[16.202298,46.852386]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Indonesia","SOV_A3":"IDN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Indonesia","ADM0_A3":"IDN","GEOU_DIF":0,"GEOUNIT":"Indonesia","GU_A3":"IDN","SU_DIF":0,"SUBUNIT":"Indonesia","SU_A3":"IDN","BRK_DIFF":0,"NAME":"Indonesia","NAME_LONG":"Indonesia","BRK_A3":"IDN","BRK_NAME":"Indonesia","BRK_GROUP":null,"ABBREV":"Indo.","POSTAL":"INDO","FORMAL_EN":"Republic of Indonesia","FORMAL_FR":null,"NAME_CIAWF":"Indonesia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Indonesia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":6,"MAPCOLOR9":6,"MAPCOLOR13":11,"POP_EST":260580739,"POP_RANK":17,"GDP_MD_EST":3028000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"ID","ISO_A2":"ID","ISO_A3":"IDN","ISO_A3_EH":"IDN","ISO_N3":"360","UN_A3":"360","WB_A2":"ID","WB_A3":"IDN","WOE_ID":23424846,"WOE_ID_EH":23424846,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"IDN","ADM0_A3_US":"IDN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[95.293026,-10.359987,141.033852,5.479821],"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279]]],[[[117.900018,-8.095681],[118.260616,-8.362383],[118.87846,-8.280683],[119.126507,-8.705825],[117.970402,-8.906639],[117.277731,-9.040895],[116.740141,-9.032937],[117.083737,-8.457158],[117.632024,-8.449303],[117.900018,-8.095681]]],[[[122.903537,-8.094234],[122.756983,-8.649808],[121.254491,-8.933666],[119.924391,-8.810418],[119.920929,-8.444859],[120.715092,-8.236965],[121.341669,-8.53674],[122.007365,-8.46062],[122.903537,-8.094234]]],[[[108.623479,-6.777674],[110.539227,-6.877358],[110.759576,-6.465186],[112.614811,-6.946036],[112.978768,-7.594213],[114.478935,-7.776528],[115.705527,-8.370807],[114.564511,-8.751817],[113.464734,-8.348947],[112.559672,-8.376181],[111.522061,-8.302129],[110.58615,-8.122605],[109.427667,-7.740664],[108.693655,-7.6416],[108.277763,-7.766657],[106.454102,-7.3549],[106.280624,-6.9249],[105.365486,-6.851416],[106.051646,-5.895919],[107.265009,-5.954985],[108.072091,-6.345762],[108.486846,-6.421985],[108.623479,-6.777674]]],[[[134.724624,-6.214401],[134.210134,-6.895238],[134.112776,-6.142467],[134.290336,-5.783058],[134.499625,-5.445042],[134.727002,-5.737582],[134.724624,-6.214401]]],[[[127.249215,-3.459065],[126.874923,-3.790983],[126.183802,-3.607376],[125.989034,-3.177273],[127.000651,-3.129318],[127.249215,-3.459065]]],[[[130.471344,-3.093764],[130.834836,-3.858472],[129.990547,-3.446301],[129.155249,-3.362637],[128.590684,-3.428679],[127.898891,-3.393436],[128.135879,-2.84365],[129.370998,-2.802154],[130.471344,-3.093764]]],[[[141.00021,-2.600151],[141.017057,-5.859022],[141.033852,-9.117893],[140.143415,-8.297168],[139.127767,-8.096043],[138.881477,-8.380935],[137.614474,-8.411683],[138.039099,-7.597882],[138.668621,-7.320225],[138.407914,-6.232849],[137.92784,-5.393366],[135.98925,-4.546544],[135.164598,-4.462931],[133.66288,-3.538853],[133.367705,-4.024819],[132.983956,-4.112979],[132.756941,-3.746283],[132.753789,-3.311787],[131.989804,-2.820551],[133.066845,-2.460418],[133.780031,-2.479848],[133.696212,-2.214542],[132.232373,-2.212526],[131.836222,-1.617162],[130.94284,-1.432522],[130.519558,-0.93772],[131.867538,-0.695461],[132.380116,-0.369538],[133.985548,-0.78021],[134.143368,-1.151867],[134.422627,-2.769185],[135.457603,-3.367753],[136.293314,-2.307042],[137.440738,-1.703513],[138.329727,-1.702686],[139.184921,-2.051296],[139.926684,-2.409052],[141.00021,-2.600151]]],[[[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836]]],[[[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386]]],[[[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467]]],[[[105.817655,-5.852356],[104.710384,-5.873285],[103.868213,-5.037315],[102.584261,-4.220259],[102.156173,-3.614146],[101.399113,-2.799777],[100.902503,-2.050262],[100.141981,-0.650348],[99.26374,0.183142],[98.970011,1.042882],[98.601351,1.823507],[97.699598,2.453184],[97.176942,3.308791],[96.424017,3.86886],[95.380876,4.970782],[95.293026,5.479821],[95.936863,5.439513],[97.484882,5.246321],[98.369169,4.26837],[99.142559,3.59035],[99.693998,3.174329],[100.641434,2.099381],[101.658012,2.083697],[102.498271,1.3987],[103.07684,0.561361],[103.838396,0.104542],[103.437645,-0.711946],[104.010789,-1.059212],[104.369991,-1.084843],[104.53949,-1.782372],[104.887893,-2.340425],[105.622111,-2.428844],[106.108593,-3.061777],[105.857446,-4.305525],[105.817655,-5.852356]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"India","SOV_A3":"IND","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"India","ADM0_A3":"IND","GEOU_DIF":0,"GEOUNIT":"India","GU_A3":"IND","SU_DIF":0,"SUBUNIT":"India","SU_A3":"IND","BRK_DIFF":0,"NAME":"India","NAME_LONG":"India","BRK_A3":"IND","BRK_NAME":"India","BRK_GROUP":null,"ABBREV":"India","POSTAL":"IND","FORMAL_EN":"Republic of India","FORMAL_FR":null,"NAME_CIAWF":"India","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"India","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":1281935911,"POP_RANK":18,"GDP_MD_EST":8721000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"IN","ISO_A2":"IN","ISO_A3":"IND","ISO_A3_EH":"IND","ISO_N3":"356","UN_A3":"356","WB_A2":"IN","WB_A3":"IND","WOE_ID":23424848,"WOE_ID_EH":23424848,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"IND","ADM0_A3_US":"IND","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[68.176645,7.965535,97.402561,35.49401],"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.146035,23.627499],[91.869928,23.624346],[91.706475,22.985264],[91.158963,23.503527],[91.46773,24.072639],[91.915093,24.130414],[92.376202,24.976693],[91.799596,25.147432],[90.872211,25.132601],[89.920693,25.26975],[89.832481,25.965082],[89.355094,26.014407],[88.563049,26.446526],[88.209789,25.768066],[88.931554,25.238692],[88.306373,24.866079],[88.084422,24.501657],[88.69994,24.233715],[88.52977,23.631142],[88.876312,22.879146],[89.031961,22.055708],[88.888766,21.690588],[88.208497,21.703172],[86.975704,21.495562],[87.033169,20.743308],[86.499351,20.151638],[85.060266,19.478579],[83.941006,18.30201],[83.189217,17.671221],[82.192792,17.016636],[82.191242,16.556664],[81.692719,16.310219],[80.791999,15.951972],[80.324896,15.899185],[80.025069,15.136415],[80.233274,13.835771],[80.286294,13.006261],[79.862547,12.056215],[79.857999,10.357275],[79.340512,10.308854],[78.885345,9.546136],[79.18972,9.216544],[78.277941,8.933047],[77.941165,8.252959],[77.539898,7.965535],[76.592979,8.899276],[76.130061,10.29963],[75.746467,11.308251],[75.396101,11.781245],[74.864816,12.741936],[74.616717,13.992583],[74.443859,14.617222],[73.534199,15.990652],[73.119909,17.92857],[72.820909,19.208234],[72.824475,20.419503],[72.630533,21.356009],[71.175273,20.757441],[70.470459,20.877331],[69.16413,22.089298],[69.644928,22.450775],[69.349597,22.84318],[68.176645,23.691965],[68.842599,24.359134],[71.04324,24.356524],[70.844699,25.215102],[70.282873,25.722229],[70.168927,26.491872],[69.514393,26.940966],[70.616496,27.989196],[71.777666,27.91318],[72.823752,28.961592],[73.450638,29.976413],[74.42138,30.979815],[74.405929,31.692639],[75.258642,32.271105],[74.451559,32.7649],[74.104294,33.441473],[73.749948,34.317699],[74.240203,34.748887],[75.757061,34.504923],[76.871722,34.653544],[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397898],[88.060238,26.414615],[88.174804,26.810405],[88.043133,27.445819],[88.120441,27.876542],[88.730326,28.086865],[88.814248,27.299316],[88.835643,27.098966],[89.744528,26.719403],[90.373275,26.875724],[91.217513,26.808648],[92.033484,26.83831],[92.103712,27.452614],[91.696657,27.771742],[92.503119,27.896876],[93.413348,28.640629],[94.56599,29.277438],[95.404802,29.031717],[96.117679,29.452802],[96.586591,28.83098],[96.248833,28.411031],[97.327114,28.261583],[97.402561,27.882536],[97.051989,27.699059],[97.133999,27.083774],[96.419366,27.264589],[95.124768,26.573572],[95.155153,26.001307],[94.603249,25.162495],[94.552658,24.675238],[94.106742,23.850741],[93.325188,24.078556],[93.286327,23.043658],[93.060294,22.703111],[93.166128,22.27846],[92.672721,22.041239]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Ireland","SOV_A3":"IRL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ireland","ADM0_A3":"IRL","GEOU_DIF":0,"GEOUNIT":"Ireland","GU_A3":"IRL","SU_DIF":0,"SUBUNIT":"Ireland","SU_A3":"IRL","BRK_DIFF":0,"NAME":"Ireland","NAME_LONG":"Ireland","BRK_A3":"IRL","BRK_NAME":"Ireland","BRK_GROUP":null,"ABBREV":"Ire.","POSTAL":"IRL","FORMAL_EN":"Ireland","FORMAL_FR":null,"NAME_CIAWF":"Ireland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ireland","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":5011102,"POP_RANK":13,"GDP_MD_EST":322000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"EI","ISO_A2":"IE","ISO_A3":"IRL","ISO_A3_EH":"IRL","ISO_N3":"372","UN_A3":"372","WB_A2":"IE","WB_A3":"IRL","WOE_ID":23424803,"WOE_ID_EH":23424803,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"IRL","ADM0_A3_US":"IRL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-9.977086,51.669301,-6.032985,55.131622],"geometry":{"type":"Polygon","coordinates":[[[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Iran","SOV_A3":"IRN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Iran","ADM0_A3":"IRN","GEOU_DIF":0,"GEOUNIT":"Iran","GU_A3":"IRN","SU_DIF":0,"SUBUNIT":"Iran","SU_A3":"IRN","BRK_DIFF":0,"NAME":"Iran","NAME_LONG":"Iran","BRK_A3":"IRN","BRK_NAME":"Iran","BRK_GROUP":null,"ABBREV":"Iran","POSTAL":"IRN","FORMAL_EN":"Islamic Republic of Iran","FORMAL_FR":null,"NAME_CIAWF":"Iran","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iran, Islamic Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":13,"POP_EST":82021564,"POP_RANK":16,"GDP_MD_EST":1459000,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"IR","ISO_A2":"IR","ISO_A3":"IRN","ISO_A3_EH":"IRN","ISO_N3":"364","UN_A3":"364","WB_A2":"IR","WB_A3":"IRN","WOE_ID":23424851,"WOE_ID_EH":23424851,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"IRN","ADM0_A3_US":"IRN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":6.7},"bbox":[44.109225,25.078237,63.316632,39.713003],"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.379506],[61.781222,30.73585],[60.874248,29.829239],[61.369309,29.303276],[61.771868,28.699334],[62.72783,28.259645],[62.755426,27.378923],[63.233898,27.217047],[63.316632,26.756532],[61.874187,26.239975],[61.497363,25.078237],[59.616134,25.380157],[58.525761,25.609962],[57.397251,25.739902],[56.970766,26.966106],[56.492139,27.143305],[55.72371,26.964633],[54.71509,26.480658],[53.493097,26.812369],[52.483598,27.580849],[51.520763,27.86569],[50.852948,28.814521],[50.115009,30.147773],[49.57685,29.985715],[48.941333,30.31709],[48.567971,29.926778],[48.014568,30.452457],[48.004698,30.985137],[47.685286,30.984853],[47.849204,31.709176],[47.334661,32.469155],[46.109362,33.017287],[45.416691,33.967798],[45.64846,34.748138],[46.151788,35.093259],[46.07634,35.677383],[45.420618,35.977546],[44.772677,37.170437],[44.77267,37.17045],[44.225756,37.971584],[44.421403,38.281281],[44.109225,39.428136],[44.79399,39.713003],[44.952688,39.335765],[45.457722,38.874139],[46.143623,38.741201],[46.50572,38.770605],[47.685079,39.508364],[48.060095,39.582235],[48.355529,39.288765],[48.010744,38.794015],[48.634375,38.270378],[48.883249,38.320245],[49.199612,37.582874],[50.147771,37.374567],[50.842354,36.872814],[52.264025,36.700422],[53.82579,36.965031],[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Iraq","SOV_A3":"IRQ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Iraq","ADM0_A3":"IRQ","GEOU_DIF":0,"GEOUNIT":"Iraq","GU_A3":"IRQ","SU_DIF":0,"SUBUNIT":"Iraq","SU_A3":"IRQ","BRK_DIFF":0,"NAME":"Iraq","NAME_LONG":"Iraq","BRK_A3":"IRQ","BRK_NAME":"Iraq","BRK_GROUP":null,"ABBREV":"Iraq","POSTAL":"IRQ","FORMAL_EN":"Republic of Iraq","FORMAL_FR":null,"NAME_CIAWF":"Iraq","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iraq","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":39192111,"POP_RANK":15,"GDP_MD_EST":596700,"POP_YEAR":2017,"LASTCENSUS":1997,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"IZ","ISO_A2":"IQ","ISO_A3":"IRQ","ISO_A3_EH":"IRQ","ISO_N3":"368","UN_A3":"368","WB_A2":"IQ","WB_A3":"IRQ","WOE_ID":23424855,"WOE_ID_EH":23424855,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"IRQ","ADM0_A3_US":"IRQ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5},"bbox":[38.792341,29.099025,48.567971,37.385264],"geometry":{"type":"Polygon","coordinates":[[[44.772677,37.170437],[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.889992],[39.195468,32.161009],[38.792341,33.378686],[41.006159,34.419372],[41.383965,35.628317],[41.289707,36.358815],[41.837064,36.605854],[42.349591,37.229873],[42.779126,37.385264],[43.942259,37.256228],[44.293452,37.001514],[44.772677,37.170437]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Iceland","SOV_A3":"ISL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Iceland","ADM0_A3":"ISL","GEOU_DIF":0,"GEOUNIT":"Iceland","GU_A3":"ISL","SU_DIF":0,"SUBUNIT":"Iceland","SU_A3":"ISL","BRK_DIFF":0,"NAME":"Iceland","NAME_LONG":"Iceland","BRK_A3":"ISL","BRK_NAME":"Iceland","BRK_GROUP":null,"ABBREV":"Iceland","POSTAL":"IS","FORMAL_EN":"Republic of Iceland","FORMAL_FR":null,"NAME_CIAWF":"Iceland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Iceland","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":339747,"POP_RANK":10,"GDP_MD_EST":16150,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"IC","ISO_A2":"IS","ISO_A3":"ISL","ISO_A3_EH":"ISL","ISO_N3":"352","UN_A3":"352","WB_A2":"IS","WB_A3":"ISL","WOE_ID":23424845,"WOE_ID_EH":23424845,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ISL","ADM0_A3_US":"ISL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[-24.326184,63.496383,-13.609732,66.526792],"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.276601],[-17.798624,65.993853],[-16.167819,66.526792],[-14.508695,66.455892]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Israel","SOV_A3":"IS1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Israel","ADM0_A3":"ISR","GEOU_DIF":0,"GEOUNIT":"Israel","GU_A3":"ISR","SU_DIF":0,"SUBUNIT":"Israel","SU_A3":"ISR","BRK_DIFF":0,"NAME":"Israel","NAME_LONG":"Israel","BRK_A3":"ISR","BRK_NAME":"Israel","BRK_GROUP":null,"ABBREV":"Isr.","POSTAL":"IS","FORMAL_EN":"State of Israel","FORMAL_FR":null,"NAME_CIAWF":"Israel","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Israel","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":9,"POP_EST":8299706,"POP_RANK":13,"GDP_MD_EST":297000,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"IL","ISO_A3":"ISR","ISO_A3_EH":"ISR","ISO_N3":"376","UN_A3":"376","WB_A2":"IL","WB_A3":"ISR","WOE_ID":23424852,"WOE_ID_EH":23424852,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ISR","ADM0_A3_US":"ISR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[34.265433,29.501326,35.836397,33.277426],"geometry":{"type":"Polygon","coordinates":[[[34.823243,29.761081],[34.26544,31.21936],[34.265435,31.219357],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08904],[35.552797,33.264275],[35.821101,33.277426],[35.836397,32.868123],[35.700798,32.716014],[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.823243,29.761081]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Italy","SOV_A3":"ITA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Italy","ADM0_A3":"ITA","GEOU_DIF":0,"GEOUNIT":"Italy","GU_A3":"ITA","SU_DIF":0,"SUBUNIT":"Italy","SU_A3":"ITA","BRK_DIFF":0,"NAME":"Italy","NAME_LONG":"Italy","BRK_A3":"ITA","BRK_NAME":"Italy","BRK_GROUP":null,"ABBREV":"Italy","POSTAL":"I","FORMAL_EN":"Italian Republic","FORMAL_FR":null,"NAME_CIAWF":"Italy","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Italy","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":7,"MAPCOLOR9":8,"MAPCOLOR13":7,"POP_EST":62137802,"POP_RANK":16,"GDP_MD_EST":2221000,"POP_YEAR":2017,"LASTCENSUS":2012,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"IT","ISO_A2":"IT","ISO_A3":"ITA","ISO_A3_EH":"ITA","ISO_N3":"380","UN_A3":"380","WB_A2":"IT","WB_A3":"ITA","WOE_ID":23424853,"WOE_ID_EH":23424853,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ITA","ADM0_A3_US":"ITA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[6.749955,36.619987,18.480247,47.115393],"geometry":{"type":"MultiPolygon","coordinates":[[[[10.442701,46.893546],[11.048556,46.751359],[11.164828,46.941579],[12.153088,47.115393],[12.376485,46.767559],[13.806475,46.509306],[13.69811,46.016778],[13.93763,45.591016],[13.141606,45.736692],[12.328581,45.381778],[12.383875,44.885374],[12.261453,44.600482],[12.589237,44.091366],[13.526906,43.587727],[14.029821,42.761008],[15.14257,41.95514],[15.926191,41.961315],[16.169897,41.740295],[15.889346,41.541082],[16.785002,41.179606],[17.519169,40.877143],[18.376687,40.355625],[18.480247,40.168866],[18.293385,39.810774],[17.73838,40.277671],[16.869596,40.442235],[16.448743,39.795401],[17.17149,39.4247],[17.052841,38.902871],[16.635088,38.843572],[16.100961,37.985899],[15.684087,37.908849],[15.687963,38.214593],[15.891981,38.750942],[16.109332,38.964547],[15.718814,39.544072],[15.413613,40.048357],[14.998496,40.172949],[14.703268,40.60455],[14.060672,40.786348],[13.627985,41.188287],[12.888082,41.25309],[12.106683,41.704535],[11.191906,42.355425],[10.511948,42.931463],[10.200029,43.920007],[9.702488,44.036279],[8.888946,44.366336],[8.428561,44.231228],[7.850767,43.767148],[7.435185,43.693845],[7.549596,44.127901],[7.007562,44.254767],[6.749955,45.028518],[7.096652,45.333099],[6.802355,45.70858],[6.843593,45.991147],[7.273851,45.776948],[7.755992,45.82449],[8.31663,46.163642],[8.489952,46.005151],[8.966306,46.036932],[9.182882,46.440215],[9.922837,46.314899],[10.363378,46.483571],[10.442701,46.893546]]],[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,40.378311],[8.159998,40.950007],[8.709991,40.899984],[9.210012,41.209991]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Jamaica","SOV_A3":"JAM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Jamaica","ADM0_A3":"JAM","GEOU_DIF":0,"GEOUNIT":"Jamaica","GU_A3":"JAM","SU_DIF":0,"SUBUNIT":"Jamaica","SU_A3":"JAM","BRK_DIFF":0,"NAME":"Jamaica","NAME_LONG":"Jamaica","BRK_A3":"JAM","BRK_NAME":"Jamaica","BRK_GROUP":null,"ABBREV":"Jam.","POSTAL":"J","FORMAL_EN":"Jamaica","FORMAL_FR":null,"NAME_CIAWF":"Jamaica","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Jamaica","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":10,"POP_EST":2990561,"POP_RANK":12,"GDP_MD_EST":25390,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"JM","ISO_A2":"JM","ISO_A3":"JAM","ISO_A3_EH":"JAM","ISO_N3":"388","UN_A3":"388","WB_A2":"JM","WB_A3":"JAM","WOE_ID":23424858,"WOE_ID_EH":23424858,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"JAM","ADM0_A3_US":"JAM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-78.337719,17.701116,-76.199659,18.524218],"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Jordan","SOV_A3":"JOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Jordan","ADM0_A3":"JOR","GEOU_DIF":0,"GEOUNIT":"Jordan","GU_A3":"JOR","SU_DIF":0,"SUBUNIT":"Jordan","SU_A3":"JOR","BRK_DIFF":0,"NAME":"Jordan","NAME_LONG":"Jordan","BRK_A3":"JOR","BRK_NAME":"Jordan","BRK_GROUP":null,"ABBREV":"Jord.","POSTAL":"J","FORMAL_EN":"Hashemite Kingdom of Jordan","FORMAL_FR":null,"NAME_CIAWF":"Jordan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Jordan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":10248069,"POP_RANK":14,"GDP_MD_EST":86190,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"JO","ISO_A2":"JO","ISO_A3":"JOR","ISO_A3_EH":"JOR","ISO_N3":"400","UN_A3":"400","WB_A2":"JO","WB_A3":"JOR","WOE_ID":23424860,"WOE_ID_EH":23424860,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"JOR","ADM0_A3_US":"JOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[34.922603,29.197495,39.195468,33.378686],"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.782505],[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Japan","SOV_A3":"JPN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Japan","ADM0_A3":"JPN","GEOU_DIF":0,"GEOUNIT":"Japan","GU_A3":"JPN","SU_DIF":0,"SUBUNIT":"Japan","SU_A3":"JPN","BRK_DIFF":0,"NAME":"Japan","NAME_LONG":"Japan","BRK_A3":"JPN","BRK_NAME":"Japan","BRK_GROUP":null,"ABBREV":"Japan","POSTAL":"J","FORMAL_EN":"Japan","FORMAL_FR":null,"NAME_CIAWF":"Japan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Japan","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":126451398,"POP_RANK":17,"GDP_MD_EST":4932000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"JA","ISO_A2":"JP","ISO_A3":"JPN","ISO_A3_EH":"JPN","ISO_N3":"392","UN_A3":"392","WB_A2":"JP","WB_A3":"JPN","WOE_ID":23424856,"WOE_ID_EH":23424856,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"JPN","ADM0_A3_US":"JPN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":7},"bbox":[129.408463,31.029579,145.543137,45.551483],"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074]]],[[[143.910162,44.1741],[144.613427,43.960883],[145.320825,44.384733],[145.543137,43.262088],[144.059662,42.988358],[143.18385,41.995215],[141.611491,42.678791],[141.067286,41.584594],[139.955106,41.569556],[139.817544,42.563759],[140.312087,43.333273],[141.380549,43.388825],[141.671952,44.772125],[141.967645,45.551483],[143.14287,44.510358],[143.910162,44.1741]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Kazakhstan","SOV_A3":"KAZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Kazakhstan","ADM0_A3":"KAZ","GEOU_DIF":0,"GEOUNIT":"Kazakhstan","GU_A3":"KAZ","SU_DIF":0,"SUBUNIT":"Kazakhstan","SU_A3":"KAZ","BRK_DIFF":0,"NAME":"Kazakhstan","NAME_LONG":"Kazakhstan","BRK_A3":"KAZ","BRK_NAME":"Kazakhstan","BRK_GROUP":null,"ABBREV":"Kaz.","POSTAL":"KZ","FORMAL_EN":"Republic of Kazakhstan","FORMAL_FR":null,"NAME_CIAWF":"Kazakhstan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kazakhstan","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":1,"POP_EST":18556698,"POP_RANK":14,"GDP_MD_EST":460700,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"KZ","ISO_A2":"KZ","ISO_A3":"KAZ","ISO_A3_EH":"KAZ","ISO_N3":"398","UN_A3":"398","WB_A2":"KZ","WB_A3":"KAZ","WOE_ID":-90,"WOE_ID_EH":23424871,"WOE_NOTE":"Includes Baykonur Cosmodrome as an admin-1","ADM0_A3_IS":"KAZ","ADM0_A3_US":"KAZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[46.466446,40.662325,87.35997,55.38525],"geometry":{"type":"Polygon","coordinates":[[[87.35997,49.214981],[86.598776,48.549182],[85.768233,48.455751],[85.720484,47.452969],[85.16429,47.000956],[83.180484,47.330031],[82.458926,45.53965],[81.947071,45.317027],[79.966106,44.917517],[80.866206,43.180362],[80.18015,42.920068],[80.25999,42.349999],[79.643645,42.496683],[79.142177,42.856092],[77.658392,42.960686],[76.000354,42.988022],[75.636965,42.8779],[74.212866,43.298339],[73.645304,43.091272],[73.489758,42.500894],[71.844638,42.845395],[71.186281,42.704293],[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44.995858],[55.968191,41.308642],[55.455251,41.259859],[54.755345,42.043971],[54.079418,42.324109],[52.944293,42.116034],[52.50246,41.783316],[52.446339,42.027151],[52.692112,42.443895],[52.501426,42.792298],[51.342427,43.132975],[50.891292,44.031034],[50.339129,44.284016],[50.305643,44.609836],[51.278503,44.514854],[51.316899,45.245998],[52.16739,45.408391],[53.040876,45.259047],[53.220866,46.234646],[53.042737,46.853006],[52.042023,46.804637],[51.191945,47.048705],[50.034083,46.60899],[49.10116,46.39933],[48.59325,46.56104],[48.694734,47.075628],[48.05725,47.74377],[47.31524,47.71585],[46.466446,48.394152],[47.043672,49.152039],[46.751596,49.356006],[47.54948,50.454698],[48.577841,49.87476],[48.702382,50.605128],[50.766648,51.692762],[52.328724,51.718652],[54.532878,51.02624],[55.71694,50.62171],[56.77798,51.04355],[58.36332,51.06364],[59.642282,50.545442],[59.932807,50.842194],[61.337424,50.79907],[61.588003,51.272659],[59.967534,51.96042],[60.927269,52.447548],[60.739993,52.719986],[61.699986,52.979996],[60.978066,53.664993],[61.4366,54.00625],[65.178534,54.354228],[65.66687,54.60125],[68.1691,54.970392],[69.068167,55.38525],[70.865267,55.169734],[71.180131,54.133285],[72.22415,54.376655],[73.508516,54.035617],[73.425679,53.48981],[74.38482,53.54685],[76.8911,54.490524],[76.525179,54.177003],[77.800916,53.404415],[80.03556,50.864751],[80.568447,51.388336],[81.945986,50.812196],[83.383004,51.069183],[83.935115,50.889246],[84.416377,50.3114],[85.11556,50.117303],[85.54127,49.692859],[86.829357,49.826675],[87.35997,49.214981]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Kenya","SOV_A3":"KEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Kenya","ADM0_A3":"KEN","GEOU_DIF":0,"GEOUNIT":"Kenya","GU_A3":"KEN","SU_DIF":0,"SUBUNIT":"Kenya","SU_A3":"KEN","BRK_DIFF":0,"NAME":"Kenya","NAME_LONG":"Kenya","BRK_A3":"KEN","BRK_NAME":"Kenya","BRK_GROUP":null,"ABBREV":"Ken.","POSTAL":"KE","FORMAL_EN":"Republic of Kenya","FORMAL_FR":null,"NAME_CIAWF":"Kenya","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kenya","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":47615739,"POP_RANK":15,"GDP_MD_EST":152700,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"KE","ISO_A2":"KE","ISO_A3":"KEN","ISO_A3_EH":"KEN","ISO_N3":"404","UN_A3":"404","WB_A2":"KE","WB_A3":"KEN","WOE_ID":23424863,"WOE_ID_EH":23424863,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"KEN","ADM0_A3_US":"KEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[33.893569,-4.67677,41.855083,5.506],"geometry":{"type":"Polygon","coordinates":[[[35.298007,5.506],[35.817448,5.338232],[35.817448,4.776966],[36.159079,4.447864],[36.855093,4.447864],[38.120915,3.598605],[38.43697,3.58851],[38.67114,3.61607],[38.89251,3.50074],[39.559384,3.42206],[39.85494,3.83879],[40.76848,4.25702],[41.1718,3.91909],[41.855083,3.918912],[40.98105,2.78452],[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.620196,4.847123],[35.298007,5.506]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Kyrgyzstan","SOV_A3":"KGZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Kyrgyzstan","ADM0_A3":"KGZ","GEOU_DIF":0,"GEOUNIT":"Kyrgyzstan","GU_A3":"KGZ","SU_DIF":0,"SUBUNIT":"Kyrgyzstan","SU_A3":"KGZ","BRK_DIFF":0,"NAME":"Kyrgyzstan","NAME_LONG":"Kyrgyzstan","BRK_A3":"KGZ","BRK_NAME":"Kyrgyzstan","BRK_GROUP":null,"ABBREV":"Kgz.","POSTAL":"KG","FORMAL_EN":"Kyrgyz Republic","FORMAL_FR":null,"NAME_CIAWF":"Kyrgyzstan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kyrgyz Republic","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":7,"MAPCOLOR9":7,"MAPCOLOR13":6,"POP_EST":5789122,"POP_RANK":13,"GDP_MD_EST":21010,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"KG","ISO_A2":"KG","ISO_A3":"KGZ","ISO_A3_EH":"KGZ","ISO_N3":"417","UN_A3":"417","WB_A2":"KG","WB_A3":"KGZ","WOE_ID":23424864,"WOE_ID_EH":23424864,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"KGZ","ADM0_A3_US":"KGZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[69.464887,39.279463,80.25999,43.298339],"geometry":{"type":"Polygon","coordinates":[[[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40.562072],[74.776862,40.366425],[73.822244,39.893973],[73.960013,39.660008],[73.675379,39.431237],[71.784694,39.279463],[70.549162,39.604198],[69.464887,39.526683],[69.55961,40.103211],[70.648019,39.935754],[71.014198,40.244366],[71.774875,40.145844],[73.055417,40.866033],[71.870115,41.3929],[71.157859,41.143587],[70.420022,41.519998],[71.259248,42.167711],[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Cambodia","SOV_A3":"KHM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Cambodia","ADM0_A3":"KHM","GEOU_DIF":0,"GEOUNIT":"Cambodia","GU_A3":"KHM","SU_DIF":0,"SUBUNIT":"Cambodia","SU_A3":"KHM","BRK_DIFF":0,"NAME":"Cambodia","NAME_LONG":"Cambodia","BRK_A3":"KHM","BRK_NAME":"Cambodia","BRK_GROUP":null,"ABBREV":"Camb.","POSTAL":"KH","FORMAL_EN":"Kingdom of Cambodia","FORMAL_FR":null,"NAME_CIAWF":"Cambodia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Cambodia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":5,"POP_EST":16204486,"POP_RANK":14,"GDP_MD_EST":58940,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"CB","ISO_A2":"KH","ISO_A3":"KHM","ISO_A3_EH":"KHM","ISO_N3":"116","UN_A3":"116","WB_A2":"KH","WB_A3":"KHM","WOE_ID":23424776,"WOE_ID_EH":23424776,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"KHM","ADM0_A3_US":"KHM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[102.348099,10.486544,107.614548,14.570584],"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"South Korea","SOV_A3":"KOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"South Korea","ADM0_A3":"KOR","GEOU_DIF":0,"GEOUNIT":"South Korea","GU_A3":"KOR","SU_DIF":0,"SUBUNIT":"South Korea","SU_A3":"KOR","BRK_DIFF":0,"NAME":"South Korea","NAME_LONG":"Republic of Korea","BRK_A3":"KOR","BRK_NAME":"Republic of Korea","BRK_GROUP":null,"ABBREV":"S.K.","POSTAL":"KR","FORMAL_EN":"Republic of Korea","FORMAL_FR":null,"NAME_CIAWF":"Korea, South","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Korea, Rep.","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":5,"POP_EST":51181299,"POP_RANK":16,"GDP_MD_EST":1929000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"KS","ISO_A2":"KR","ISO_A3":"KOR","ISO_A3_EH":"KOR","ISO_N3":"410","UN_A3":"410","WB_A2":"KR","WB_A3":"KOR","WOE_ID":23424868,"WOE_ID_EH":23424868,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"KOR","ADM0_A3_US":"KOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":17,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[126.117398,34.390046,129.468304,38.612243],"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Kosovo","SOV_A3":"KOS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Kosovo","ADM0_A3":"KOS","GEOU_DIF":0,"GEOUNIT":"Kosovo","GU_A3":"KOS","SU_DIF":0,"SUBUNIT":"Kosovo","SU_A3":"KOS","BRK_DIFF":0,"NAME":"Kosovo","NAME_LONG":"Kosovo","BRK_A3":"KOS","BRK_NAME":"Kosovo","BRK_GROUP":null,"ABBREV":"Kos.","POSTAL":"KO","FORMAL_EN":"Republic of Kosovo","FORMAL_FR":null,"NAME_CIAWF":"Kosovo","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kosovo","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":1895250,"POP_RANK":12,"GDP_MD_EST":18490,"POP_YEAR":2017,"LASTCENSUS":1981,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"KV","ISO_A2":"XK","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","UN_A3":"-099","WB_A2":"KV","WB_A3":"KSV","WOE_ID":-90,"WOE_ID_EH":29389201,"WOE_NOTE":"Subunit of Serbia in WOE still; should include 29389201, 29389207, 29389218, 29389209 and 29389214.","ADM0_A3_IS":"KOS","ADM0_A3_US":"KOS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[20.0707,41.84711,21.77505,43.27205],"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855409],[20.52295,42.21787],[20.283755,42.32026],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21.3527,42.2068],[20.76216,42.05186],[20.71731,41.84711],[20.590247,41.855409]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Kuwait","SOV_A3":"KWT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Kuwait","ADM0_A3":"KWT","GEOU_DIF":0,"GEOUNIT":"Kuwait","GU_A3":"KWT","SU_DIF":0,"SUBUNIT":"Kuwait","SU_A3":"KWT","BRK_DIFF":0,"NAME":"Kuwait","NAME_LONG":"Kuwait","BRK_A3":"KWT","BRK_NAME":"Kuwait","BRK_GROUP":null,"ABBREV":"Kwt.","POSTAL":"KW","FORMAL_EN":"State of Kuwait","FORMAL_FR":null,"NAME_CIAWF":"Kuwait","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Kuwait","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":2875422,"POP_RANK":12,"GDP_MD_EST":301100,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"KU","ISO_A2":"KW","ISO_A3":"KWT","ISO_A3_EH":"KWT","ISO_N3":"414","UN_A3":"414","WB_A2":"KW","WB_A3":"KWT","WOE_ID":23424870,"WOE_ID_EH":23424870,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"KWT","ADM0_A3_US":"KWT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[46.568713,28.526063,48.416094,30.05907],"geometry":{"type":"Polygon","coordinates":[[[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Laos","SOV_A3":"LAO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Laos","ADM0_A3":"LAO","GEOU_DIF":0,"GEOUNIT":"Laos","GU_A3":"LAO","SU_DIF":0,"SUBUNIT":"Laos","SU_A3":"LAO","BRK_DIFF":0,"NAME":"Laos","NAME_LONG":"Lao PDR","BRK_A3":"LAO","BRK_NAME":"Laos","BRK_GROUP":null,"ABBREV":"Laos","POSTAL":"LA","FORMAL_EN":"Lao People's Democratic Republic","FORMAL_FR":null,"NAME_CIAWF":"Laos","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lao PDR","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":7126706,"POP_RANK":13,"GDP_MD_EST":40960,"POP_YEAR":2017,"LASTCENSUS":2005,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"LA","ISO_A2":"LA","ISO_A3":"LAO","ISO_A3_EH":"LAO","ISO_N3":"418","UN_A3":"418","WB_A2":"LA","WB_A3":"LAO","WOE_ID":23424872,"WOE_ID_EH":23424872,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LAO","ADM0_A3_US":"LAO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":4,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[100.115988,13.881091,107.564525,22.464753],"geometry":{"type":"Polygon","coordinates":[[[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Lebanon","SOV_A3":"LBN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Lebanon","ADM0_A3":"LBN","GEOU_DIF":0,"GEOUNIT":"Lebanon","GU_A3":"LBN","SU_DIF":0,"SUBUNIT":"Lebanon","SU_A3":"LBN","BRK_DIFF":0,"NAME":"Lebanon","NAME_LONG":"Lebanon","BRK_A3":"LBN","BRK_NAME":"Lebanon","BRK_GROUP":null,"ABBREV":"Leb.","POSTAL":"LB","FORMAL_EN":"Lebanese Republic","FORMAL_FR":null,"NAME_CIAWF":"Lebanon","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lebanon","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":12,"POP_EST":6229794,"POP_RANK":13,"GDP_MD_EST":85160,"POP_YEAR":2017,"LASTCENSUS":1970,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"LE","ISO_A2":"LB","ISO_A3":"LBN","ISO_A3_EH":"LBN","ISO_N3":"422","UN_A3":"422","WB_A2":"LB","WB_A3":"LBN","WOE_ID":23424873,"WOE_ID_EH":23424873,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LBN","ADM0_A3_US":"LBN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":4,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[35.126053,33.08904,36.61175,34.644914],"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Liberia","SOV_A3":"LBR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Liberia","ADM0_A3":"LBR","GEOU_DIF":0,"GEOUNIT":"Liberia","GU_A3":"LBR","SU_DIF":0,"SUBUNIT":"Liberia","SU_A3":"LBR","BRK_DIFF":0,"NAME":"Liberia","NAME_LONG":"Liberia","BRK_A3":"LBR","BRK_NAME":"Liberia","BRK_GROUP":null,"ABBREV":"Liberia","POSTAL":"LR","FORMAL_EN":"Republic of Liberia","FORMAL_FR":null,"NAME_CIAWF":"Liberia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Liberia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":4689021,"POP_RANK":12,"GDP_MD_EST":3881,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"LI","ISO_A2":"LR","ISO_A3":"LBR","ISO_A3_EH":"LBR","ISO_N3":"430","UN_A3":"430","WB_A2":"LR","WB_A3":"LBR","WOE_ID":23424876,"WOE_ID_EH":23424876,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LBR","ADM0_A3_US":"LBR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-11.438779,4.355755,-7.539715,8.541055],"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.485446,7.395208],[-8.385452,6.911801],[-8.60288,6.467564],[-8.311348,6.193033],[-7.993693,6.12619],[-7.570153,5.707352],[-7.539715,5.313345],[-7.635368,5.188159],[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Libya","SOV_A3":"LBY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Libya","ADM0_A3":"LBY","GEOU_DIF":0,"GEOUNIT":"Libya","GU_A3":"LBY","SU_DIF":0,"SUBUNIT":"Libya","SU_A3":"LBY","BRK_DIFF":0,"NAME":"Libya","NAME_LONG":"Libya","BRK_A3":"LBY","BRK_NAME":"Libya","BRK_GROUP":null,"ABBREV":"Libya","POSTAL":"LY","FORMAL_EN":"Libya","FORMAL_FR":null,"NAME_CIAWF":"Libya","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Libya","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":11,"POP_EST":6653210,"POP_RANK":13,"GDP_MD_EST":90890,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"LY","ISO_A2":"LY","ISO_A3":"LBY","ISO_A3_EH":"LBY","ISO_N3":"434","UN_A3":"434","WB_A2":"LY","WB_A3":"LBY","WOE_ID":23424882,"WOE_ID_EH":23424882,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LBY","ADM0_A3_US":"LBY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[9.319411,19.58047,25.16482,33.136996],"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.056575,30.961831],[9.950225,31.37607],[10.636901,31.761421],[10.94479,32.081815],[11.432253,32.368903],[11.488787,33.136996],[12.66331,32.79278],[13.08326,32.87882],[13.91868,32.71196],[15.24563,32.26508],[15.71394,31.37626],[16.61162,31.18218],[18.02109,30.76357],[19.08641,30.26639],[19.57404,30.52582],[20.05335,30.98576],[19.82033,31.75179],[20.13397,32.2382],[20.85452,32.7068],[21.54298,32.8432],[22.89576,32.63858],[23.2368,32.19149],[23.60913,32.18726],[23.9275,32.01667],[24.92114,31.89936],[25.16482,31.56915],[24.80287,31.08929],[24.95762,30.6616],[24.70007,30.04419],[25,29.238655],[25,25.6825],[25,22],[25,20.00304],[23.85,20],[23.83766,19.58047],[19.84926,21.49509],[15.86085,23.40972],[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Sri Lanka","SOV_A3":"LKA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Sri Lanka","ADM0_A3":"LKA","GEOU_DIF":0,"GEOUNIT":"Sri Lanka","GU_A3":"LKA","SU_DIF":0,"SUBUNIT":"Sri Lanka","SU_A3":"LKA","BRK_DIFF":0,"NAME":"Sri Lanka","NAME_LONG":"Sri Lanka","BRK_A3":"LKA","BRK_NAME":"Sri Lanka","BRK_GROUP":null,"ABBREV":"Sri L.","POSTAL":"LK","FORMAL_EN":"Democratic Socialist Republic of Sri Lanka","FORMAL_FR":null,"NAME_CIAWF":"Sri Lanka","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sri Lanka","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":22409381,"POP_RANK":15,"GDP_MD_EST":236700,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"CE","ISO_A2":"LK","ISO_A3":"LKA","ISO_A3_EH":"LKA","ISO_N3":"144","UN_A3":"144","WB_A2":"LK","WB_A3":"LKA","WOE_ID":23424778,"WOE_ID_EH":23424778,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LKA","ADM0_A3_US":"LKA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[79.695167,5.96837,81.787959,9.824078],"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Lesotho","SOV_A3":"LSO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Lesotho","ADM0_A3":"LSO","GEOU_DIF":0,"GEOUNIT":"Lesotho","GU_A3":"LSO","SU_DIF":0,"SUBUNIT":"Lesotho","SU_A3":"LSO","BRK_DIFF":0,"NAME":"Lesotho","NAME_LONG":"Lesotho","BRK_A3":"LSO","BRK_NAME":"Lesotho","BRK_GROUP":null,"ABBREV":"Les.","POSTAL":"LS","FORMAL_EN":"Kingdom of Lesotho","FORMAL_FR":null,"NAME_CIAWF":"Lesotho","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lesotho","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":8,"POP_EST":1958042,"POP_RANK":12,"GDP_MD_EST":6019,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"LT","ISO_A2":"LS","ISO_A3":"LSO","ISO_A3_EH":"LSO","ISO_N3":"426","UN_A3":"426","WB_A2":"LS","WB_A3":"LSO","WOE_ID":23424880,"WOE_ID_EH":23424880,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LSO","ADM0_A3_US":"LSO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[26.999262,-30.645106,29.325166,-28.647502],"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Lithuania","SOV_A3":"LTU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Lithuania","ADM0_A3":"LTU","GEOU_DIF":0,"GEOUNIT":"Lithuania","GU_A3":"LTU","SU_DIF":0,"SUBUNIT":"Lithuania","SU_A3":"LTU","BRK_DIFF":0,"NAME":"Lithuania","NAME_LONG":"Lithuania","BRK_A3":"LTU","BRK_NAME":"Lithuania","BRK_GROUP":null,"ABBREV":"Lith.","POSTAL":"LT","FORMAL_EN":"Republic of Lithuania","FORMAL_FR":null,"NAME_CIAWF":"Lithuania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Lithuania","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":2823859,"POP_RANK":12,"GDP_MD_EST":85620,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"LH","ISO_A2":"LT","ISO_A3":"LTU","ISO_A3_EH":"LTU","ISO_N3":"440","UN_A3":"440","WB_A2":"LT","WB_A3":"LTU","WOE_ID":23424875,"WOE_ID_EH":23424875,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LTU","ADM0_A3_US":"LTU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[21.0558,53.905702,26.588279,56.372528],"geometry":{"type":"Polygon","coordinates":[[[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,54.220567],[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Luxembourg","SOV_A3":"LUX","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Luxembourg","ADM0_A3":"LUX","GEOU_DIF":0,"GEOUNIT":"Luxembourg","GU_A3":"LUX","SU_DIF":0,"SUBUNIT":"Luxembourg","SU_A3":"LUX","BRK_DIFF":0,"NAME":"Luxembourg","NAME_LONG":"Luxembourg","BRK_A3":"LUX","BRK_NAME":"Luxembourg","BRK_GROUP":null,"ABBREV":"Lux.","POSTAL":"L","FORMAL_EN":"Grand Duchy of Luxembourg","FORMAL_FR":null,"NAME_CIAWF":"Luxembourg","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Luxembourg","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":7,"MAPCOLOR9":3,"MAPCOLOR13":7,"POP_EST":594130,"POP_RANK":11,"GDP_MD_EST":58740,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"LU","ISO_A2":"LU","ISO_A3":"LUX","ISO_A3_EH":"LUX","ISO_N3":"442","UN_A3":"442","WB_A2":"LU","WB_A3":"LUX","WOE_ID":23424881,"WOE_ID_EH":23424881,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LUX","ADM0_A3_US":"LUX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":5,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5.7,"MAX_LABEL":10},"bbox":[5.674052,49.442667,6.242751,50.128052],"geometry":{"type":"Polygon","coordinates":[[[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Latvia","SOV_A3":"LVA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Latvia","ADM0_A3":"LVA","GEOU_DIF":0,"GEOUNIT":"Latvia","GU_A3":"LVA","SU_DIF":0,"SUBUNIT":"Latvia","SU_A3":"LVA","BRK_DIFF":0,"NAME":"Latvia","NAME_LONG":"Latvia","BRK_A3":"LVA","BRK_NAME":"Latvia","BRK_GROUP":null,"ABBREV":"Lat.","POSTAL":"LV","FORMAL_EN":"Republic of Latvia","FORMAL_FR":null,"NAME_CIAWF":"Latvia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Latvia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":7,"MAPCOLOR9":6,"MAPCOLOR13":13,"POP_EST":1944643,"POP_RANK":12,"GDP_MD_EST":50650,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"LG","ISO_A2":"LV","ISO_A3":"LVA","ISO_A3_EH":"LVA","ISO_N3":"428","UN_A3":"428","WB_A2":"LV","WB_A3":"LVA","WOE_ID":23424874,"WOE_ID_EH":23424874,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"LVA","ADM0_A3_US":"LVA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[21.0558,55.615107,28.176709,57.970157],"geometry":{"type":"Polygon","coordinates":[[[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.164531],[24.860684,56.372528],[23.878264,56.273671],[22.201157,56.337802],[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Morocco","SOV_A3":"MAR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Morocco","ADM0_A3":"MAR","GEOU_DIF":0,"GEOUNIT":"Morocco","GU_A3":"MAR","SU_DIF":0,"SUBUNIT":"Morocco","SU_A3":"MAR","BRK_DIFF":0,"NAME":"Morocco","NAME_LONG":"Morocco","BRK_A3":"MAR","BRK_NAME":"Morocco","BRK_GROUP":null,"ABBREV":"Mor.","POSTAL":"MA","FORMAL_EN":"Kingdom of Morocco","FORMAL_FR":null,"NAME_CIAWF":"Morocco","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Morocco","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":33986655,"POP_RANK":15,"GDP_MD_EST":282800,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"MO","ISO_A2":"MA","ISO_A3":"MAR","ISO_A3_EH":"MAR","ISO_N3":"504","UN_A3":"504","WB_A2":"MA","WB_A3":"MAR","WOE_ID":23424893,"WOE_ID_EH":23424893,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MAR","ADM0_A3_US":"MAR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-17.020428,21.420734,-1.124551,35.759988],"geometry":{"type":"Polygon","coordinates":[[[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.579228],[-8.674116,28.841289],[-8.66559,27.656426],[-8.817828,27.656426],[-8.794884,27.120696],[-9.413037,27.088476],[-9.735343,26.860945],[-10.189424,26.860945],[-10.551263,26.990808],[-11.392555,26.883424],[-11.71822,26.104092],[-12.030759,26.030866],[-12.500963,24.770116],[-13.89111,23.691009],[-14.221168,22.310163],[-14.630833,21.86094],[-14.750955,21.5006],[-17.002962,21.420734],[-17.020428,21.42231],[-16.973248,21.885745],[-16.589137,22.158234],[-16.261922,22.67934],[-16.326414,23.017768],[-15.982611,23.723358],[-15.426004,24.359134],[-15.089332,24.520261],[-14.824645,25.103533],[-14.800926,25.636265],[-14.43994,26.254418],[-13.773805,26.618892],[-13.139942,27.640148],[-13.121613,27.654148],[-12.618837,28.038186],[-11.688919,28.148644],[-10.900957,28.832142],[-10.399592,29.098586],[-9.564811,29.933574],[-9.814718,31.177736],[-9.434793,32.038096],[-9.300693,32.564679],[-8.657476,33.240245],[-7.654178,33.697065],[-6.912544,34.110476],[-6.244342,35.145865],[-5.929994,35.759988],[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Moldova","SOV_A3":"MDA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Moldova","ADM0_A3":"MDA","GEOU_DIF":0,"GEOUNIT":"Moldova","GU_A3":"MDA","SU_DIF":0,"SUBUNIT":"Moldova","SU_A3":"MDA","BRK_DIFF":0,"NAME":"Moldova","NAME_LONG":"Moldova","BRK_A3":"MDA","BRK_NAME":"Moldova","BRK_GROUP":null,"ABBREV":"Mda.","POSTAL":"MD","FORMAL_EN":"Republic of Moldova","FORMAL_FR":null,"NAME_CIAWF":"Moldova","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Moldova","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":4,"MAPCOLOR13":12,"POP_EST":3474121,"POP_RANK":12,"GDP_MD_EST":18540,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"MD","ISO_A2":"MD","ISO_A3":"MDA","ISO_A3_EH":"MDA","ISO_N3":"498","UN_A3":"498","WB_A2":"MD","WB_A3":"MDA","WOE_ID":23424885,"WOE_ID_EH":23424885,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MDA","ADM0_A3_US":"MDA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[26.619337,45.488283,30.024659,48.467119],"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45.939987],[28.485269,45.596907],[28.233554,45.488283],[28.054443,45.944586],[28.160018,46.371563],[28.12803,46.810476],[27.551166,47.405117],[27.233873,47.826771],[26.924176,48.123264],[26.619337,48.220726]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Madagascar","SOV_A3":"MDG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Madagascar","ADM0_A3":"MDG","GEOU_DIF":0,"GEOUNIT":"Madagascar","GU_A3":"MDG","SU_DIF":0,"SUBUNIT":"Madagascar","SU_A3":"MDG","BRK_DIFF":0,"NAME":"Madagascar","NAME_LONG":"Madagascar","BRK_A3":"MDG","BRK_NAME":"Madagascar","BRK_GROUP":null,"ABBREV":"Mad.","POSTAL":"MG","FORMAL_EN":"Republic of Madagascar","FORMAL_FR":null,"NAME_CIAWF":"Madagascar","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Madagascar","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":5,"MAPCOLOR9":2,"MAPCOLOR13":3,"POP_EST":25054161,"POP_RANK":15,"GDP_MD_EST":36860,"POP_YEAR":2017,"LASTCENSUS":1993,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"MA","ISO_A2":"MG","ISO_A3":"MDG","ISO_A3_EH":"MDG","ISO_N3":"450","UN_A3":"450","WB_A2":"MG","WB_A3":"MDG","WOE_ID":23424883,"WOE_ID_EH":23424883,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MDG","ADM0_A3_US":"MDG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[43.254187,-25.601434,50.476537,-12.040557],"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23.781959],[47.095761,-24.94163],[46.282478,-25.178463],[45.409508,-25.601434],[44.833574,-25.346101],[44.03972,-24.988345],[43.763768,-24.460677],[43.697778,-23.574116],[43.345654,-22.776904],[43.254187,-22.057413],[43.433298,-21.336475],[43.893683,-21.163307],[43.89637,-20.830459],[44.374325,-20.072366],[44.464397,-19.435454],[44.232422,-18.961995],[44.042976,-18.331387],[43.963084,-17.409945],[44.312469,-16.850496],[44.446517,-16.216219],[44.944937,-16.179374],[45.502732,-15.974373],[45.872994,-15.793454],[46.312243,-15.780018],[46.882183,-15.210182],[47.70513,-14.594303],[48.005215,-14.091233],[47.869047,-13.663869],[48.293828,-13.784068],[48.84506,-13.089175],[48.863509,-12.487868],[49.194651,-12.040557],[49.543519,-12.469833]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Mexico","SOV_A3":"MEX","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Mexico","ADM0_A3":"MEX","GEOU_DIF":0,"GEOUNIT":"Mexico","GU_A3":"MEX","SU_DIF":0,"SUBUNIT":"Mexico","SU_A3":"MEX","BRK_DIFF":0,"NAME":"Mexico","NAME_LONG":"Mexico","BRK_A3":"MEX","BRK_NAME":"Mexico","BRK_GROUP":null,"ABBREV":"Mex.","POSTAL":"MX","FORMAL_EN":"United Mexican States","FORMAL_FR":null,"NAME_CIAWF":"Mexico","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mexico","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":124574795,"POP_RANK":17,"GDP_MD_EST":2307000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"MX","ISO_A2":"MX","ISO_A3":"MEX","ISO_A3_EH":"MEX","ISO_N3":"484","UN_A3":"484","WB_A2":"MX","WB_A3":"MEX","WOE_ID":23424900,"WOE_ID_EH":23424900,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MEX","ADM0_A3_US":"MEX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":6.7},"bbox":[-117.12776,14.538829,-86.811982,32.72083],"geometry":{"type":"Polygon","coordinates":[[[-88.300031,18.499982],[-88.490123,18.486831],[-88.848344,17.883198],[-89.029857,18.001511],[-89.150909,17.955468],[-89.14308,17.808319],[-90.067934,17.819326],[-91.00152,17.817595],[-91.002269,17.254658],[-91.453921,17.252177],[-91.08167,16.918477],[-90.711822,16.687483],[-90.600847,16.470778],[-90.438867,16.41011],[-90.464473,16.069562],[-91.74796,16.066565],[-92.229249,15.251447],[-92.087216,15.064585],[-92.20323,14.830103],[-92.22775,14.538829],[-93.359464,15.61543],[-93.875169,15.940164],[-94.691656,16.200975],[-95.250227,16.128318],[-96.053382,15.752088],[-96.557434,15.653515],[-97.263592,15.917065],[-98.01303,16.107312],[-98.947676,16.566043],[-99.697397,16.706164],[-100.829499,17.171071],[-101.666089,17.649026],[-101.918528,17.91609],[-102.478132,17.975751],[-103.50099,18.292295],[-103.917527,18.748572],[-104.99201,19.316134],[-105.493038,19.946767],[-105.731396,20.434102],[-105.397773,20.531719],[-105.500661,20.816895],[-105.270752,21.076285],[-105.265817,21.422104],[-105.603161,21.871146],[-105.693414,22.26908],[-106.028716,22.773752],[-106.90998,23.767774],[-107.915449,24.548915],[-108.401905,25.172314],[-109.260199,25.580609],[-109.444089,25.824884],[-109.291644,26.442934],[-109.801458,26.676176],[-110.391732,27.162115],[-110.641019,27.859876],[-111.178919,27.941241],[-111.759607,28.467953],[-112.228235,28.954409],[-112.271824,29.266844],[-112.809594,30.021114],[-113.163811,30.786881],[-113.148669,31.170966],[-113.871881,31.567608],[-114.205737,31.524045],[-114.776451,31.799532],[-114.9367,31.393485],[-114.771232,30.913617],[-114.673899,30.162681],[-114.330974,29.750432],[-113.588875,29.061611],[-113.424053,28.826174],[-113.271969,28.754783],[-113.140039,28.411289],[-112.962298,28.42519],[-112.761587,27.780217],[-112.457911,27.525814],[-112.244952,27.171727],[-111.616489,26.662817],[-111.284675,25.73259],[-110.987819,25.294606],[-110.710007,24.826004],[-110.655049,24.298595],[-110.172856,24.265548],[-109.771847,23.811183],[-109.409104,23.364672],[-109.433392,23.185588],[-109.854219,22.818272],[-110.031392,22.823078],[-110.295071,23.430973],[-110.949501,24.000964],[-111.670568,24.484423],[-112.182036,24.738413],[-112.148989,25.470125],[-112.300711,26.012004],[-112.777297,26.32196],[-113.464671,26.768186],[-113.59673,26.63946],[-113.848937,26.900064],[-114.465747,27.14209],[-115.055142,27.722727],[-114.982253,27.7982],[-114.570366,27.741485],[-114.199329,28.115003],[-114.162018,28.566112],[-114.931842,29.279479],[-115.518654,29.556362],[-115.887365,30.180794],[-116.25835,30.836464],[-116.721526,31.635744],[-117.12776,32.53534],[-115.99135,32.61239],[-114.72139,32.72083],[-114.815,32.52528],[-113.30498,32.03914],[-111.02361,31.33472],[-109.035,31.34194],[-108.24194,31.34222],[-108.24,31.754854],[-106.50759,31.75452],[-106.1429,31.39995],[-105.63159,31.08383],[-105.03737,30.64402],[-104.70575,30.12173],[-104.45697,29.57196],[-103.94,29.27],[-103.11,28.97],[-102.48,29.76],[-101.6624,29.7793],[-100.9576,29.38071],[-100.45584,28.69612],[-100.11,28.11],[-99.52,27.54],[-99.3,26.84],[-99.02,26.37],[-98.24,26.06],[-97.53,25.84],[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083],[-90.77187,19.28412],[-90.53359,19.867418],[-90.451476,20.707522],[-90.278618,20.999855],[-89.601321,21.261726],[-88.543866,21.493675],[-87.658417,21.458846],[-87.05189,21.543543],[-86.811982,21.331515],[-86.845908,20.849865],[-87.383291,20.255405],[-87.621054,19.646553],[-87.43675,19.472403],[-87.58656,19.04013],[-87.837191,18.259816],[-88.090664,18.516648],[-88.300031,18.499982]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Macedonia","SOV_A3":"MKD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Macedonia","ADM0_A3":"MKD","GEOU_DIF":0,"GEOUNIT":"Macedonia","GU_A3":"MKD","SU_DIF":0,"SUBUNIT":"Macedonia","SU_A3":"MKD","BRK_DIFF":0,"NAME":"Macedonia","NAME_LONG":"Macedonia","BRK_A3":"MKD","BRK_NAME":"Macedonia","BRK_GROUP":null,"ABBREV":"Mkd.","POSTAL":"MK","FORMAL_EN":"Former Yugoslav Republic of Macedonia","FORMAL_FR":null,"NAME_CIAWF":"Macedonia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Macedonia, FYR","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":2103721,"POP_RANK":12,"GDP_MD_EST":29520,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"MK","ISO_A2":"MK","ISO_A3":"MKD","ISO_A3_EH":"MKD","ISO_N3":"807","UN_A3":"807","WB_A2":"MK","WB_A3":"MKD","WOE_ID":23424890,"WOE_ID_EH":23424890,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MKD","ADM0_A3_US":"MKD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[20.463175,40.842727,22.952377,42.32026],"geometry":{"type":"Polygon","coordinates":[[[21.02004,40.842727],[20.605182,41.086226],[20.463175,41.515089],[20.590247,41.855404],[20.590247,41.855409],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Mali","SOV_A3":"MLI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Mali","ADM0_A3":"MLI","GEOU_DIF":0,"GEOUNIT":"Mali","GU_A3":"MLI","SU_DIF":0,"SUBUNIT":"Mali","SU_A3":"MLI","BRK_DIFF":0,"NAME":"Mali","NAME_LONG":"Mali","BRK_A3":"MLI","BRK_NAME":"Mali","BRK_GROUP":null,"ABBREV":"Mali","POSTAL":"ML","FORMAL_EN":"Republic of Mali","FORMAL_FR":null,"NAME_CIAWF":"Mali","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mali","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":17885245,"POP_RANK":14,"GDP_MD_EST":38090,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"ML","ISO_A2":"ML","ISO_A3":"MLI","ISO_A3_EH":"MLI","ISO_N3":"466","UN_A3":"466","WB_A2":"ML","WB_A3":"MLI","WOE_ID":23424891,"WOE_ID_EH":23424891,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MLI","ADM0_A3_US":"MLI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[-12.17075,10.096361,4.27021,24.974574],"geometry":{"type":"Polygon","coordinates":[[[0.374892,14.928908],[-0.266257,14.924309],[-0.515854,15.116158],[-1.066363,14.973815],[-2.001035,14.559008],[-2.191825,14.246418],[-2.967694,13.79815],[-3.103707,13.541267],[-3.522803,13.337662],[-4.006391,13.472485],[-4.280405,13.228444],[-4.427166,12.542646],[-5.220942,11.713859],[-5.197843,11.375146],[-5.470565,10.95127],[-5.404342,10.370737],[-5.816926,10.222555],[-6.050452,10.096361],[-6.205223,10.524061],[-6.493965,10.411303],[-6.666461,10.430811],[-6.850507,10.138994],[-7.622759,10.147236],[-7.89959,10.297382],[-8.029944,10.206535],[-8.335377,10.494812],[-8.282357,10.792597],[-8.407311,10.909257],[-8.620321,10.810891],[-8.581305,11.136246],[-8.376305,11.393646],[-8.786099,11.812561],[-8.905265,12.088358],[-9.127474,12.30806],[-9.327616,12.334286],[-9.567912,12.194243],[-9.890993,12.060479],[-10.165214,11.844084],[-10.593224,11.923975],[-10.87083,12.177887],[-11.036556,12.211245],[-11.297574,12.077971],[-11.456169,12.076834],[-11.513943,12.442988],[-11.467899,12.754519],[-11.553398,13.141214],[-11.927716,13.422075],[-12.124887,13.994727],[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19.85623],[3.146661,19.693579],[3.158133,19.057364],[4.267419,19.155265],[4.27021,16.852227],[3.723422,16.184284],[3.638259,15.56812],[2.749993,15.409525],[1.385528,15.323561],[1.015783,14.968182],[0.374892,14.928908]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Myanmar","SOV_A3":"MMR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Myanmar","ADM0_A3":"MMR","GEOU_DIF":0,"GEOUNIT":"Myanmar","GU_A3":"MMR","SU_DIF":0,"SUBUNIT":"Myanmar","SU_A3":"MMR","BRK_DIFF":0,"NAME":"Myanmar","NAME_LONG":"Myanmar","BRK_A3":"MMR","BRK_NAME":"Myanmar","BRK_GROUP":null,"ABBREV":"Myan.","POSTAL":"MM","FORMAL_EN":"Republic of the Union of Myanmar","FORMAL_FR":null,"NAME_CIAWF":"Burma","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Myanmar","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":13,"POP_EST":55123814,"POP_RANK":16,"GDP_MD_EST":311100,"POP_YEAR":2017,"LASTCENSUS":1983,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"BM","ISO_A2":"MM","ISO_A3":"MMR","ISO_A3_EH":"MMR","ISO_N3":"104","UN_A3":"104","WB_A2":"MM","WB_A3":"MMR","WOE_ID":23424763,"WOE_ID_EH":23424763,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MMR","ADM0_A3_US":"MMR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[92.303234,9.93296,101.180005,28.335945],"geometry":{"type":"Polygon","coordinates":[[[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785],[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Montenegro","SOV_A3":"MNE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Montenegro","ADM0_A3":"MNE","GEOU_DIF":0,"GEOUNIT":"Montenegro","GU_A3":"MNE","SU_DIF":0,"SUBUNIT":"Montenegro","SU_A3":"MNE","BRK_DIFF":0,"NAME":"Montenegro","NAME_LONG":"Montenegro","BRK_A3":"MNE","BRK_NAME":"Montenegro","BRK_GROUP":null,"ABBREV":"Mont.","POSTAL":"ME","FORMAL_EN":"Montenegro","FORMAL_FR":null,"NAME_CIAWF":"Montenegro","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Montenegro","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":4,"MAPCOLOR13":5,"POP_EST":642550,"POP_RANK":11,"GDP_MD_EST":10610,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"MJ","ISO_A2":"ME","ISO_A3":"MNE","ISO_A3_EH":"MNE","ISO_N3":"499","UN_A3":"499","WB_A2":"ME","WB_A3":"MNE","WOE_ID":20069817,"WOE_ID_EH":20069817,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MNE","ADM0_A3_US":"MNE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[18.450017,41.877551,20.3398,43.52384],"geometry":{"type":"Polygon","coordinates":[[[20.0707,42.58863],[19.801613,42.500093],[19.738051,42.688247],[19.304486,42.195745],[19.371768,41.877551],[19.16246,41.95502],[18.88214,42.28151],[18.450017,42.479992],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Mongolia","SOV_A3":"MNG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Mongolia","ADM0_A3":"MNG","GEOU_DIF":0,"GEOUNIT":"Mongolia","GU_A3":"MNG","SU_DIF":0,"SUBUNIT":"Mongolia","SU_A3":"MNG","BRK_DIFF":0,"NAME":"Mongolia","NAME_LONG":"Mongolia","BRK_A3":"MNG","BRK_NAME":"Mongolia","BRK_GROUP":null,"ABBREV":"Mong.","POSTAL":"MN","FORMAL_EN":"Mongolia","FORMAL_FR":null,"NAME_CIAWF":"Mongolia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mongolia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":5,"MAPCOLOR13":6,"POP_EST":3068243,"POP_RANK":12,"GDP_MD_EST":37000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"MG","ISO_A2":"MN","ISO_A3":"MNG","ISO_A3_EH":"MNG","ISO_N3":"496","UN_A3":"496","WB_A2":"MN","WB_A3":"MNG","WOE_ID":23424887,"WOE_ID_EH":23424887,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MNG","ADM0_A3_US":"MNG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[87.751264,41.59741,119.772824,52.047366],"geometry":{"type":"Polygon","coordinates":[[[116.678801,49.888531],[116.191802,49.134598],[115.485282,48.135383],[115.742837,47.726545],[116.308953,47.85341],[117.295507,47.697709],[118.064143,48.06673],[118.866574,47.74706],[119.772824,47.048059],[119.66327,46.69268],[118.874326,46.805412],[117.421701,46.672733],[116.717868,46.388202],[115.985096,45.727235],[114.460332,45.339817],[113.463907,44.808893],[112.436062,45.011646],[111.873306,45.102079],[111.348377,44.457442],[111.667737,44.073176],[111.829588,43.743118],[111.129682,43.406834],[110.412103,42.871234],[109.243596,42.519446],[107.744773,42.481516],[106.129316,42.134328],[104.964994,41.59741],[104.522282,41.908347],[103.312278,41.907468],[101.83304,42.514873],[100.845866,42.663804],[99.515817,42.524691],[97.451757,42.74889],[96.349396,42.725635],[95.762455,43.319449],[95.306875,44.241331],[94.688929,44.352332],[93.480734,44.975472],[92.133891,45.115076],[90.94554,45.286073],[90.585768,45.719716],[90.970809,46.888146],[90.280826,47.693549],[88.854298,48.069082],[88.013832,48.599463],[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.10421,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.81402,49.97746],[97.25976,49.72605],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.06521,51.25991],[102.25589,50.51056],[103.676545,50.089966],[104.62158,50.27532],[105.886591,50.406019],[106.888804,50.274296],[107.868176,49.793705],[108.475167,49.282548],[109.402449,49.292961],[110.662011,49.130128],[111.581231,49.377968],[112.89774,49.543565],[114.362456,50.248303],[114.96211,50.140247],[115.485695,49.805177],[116.678801,49.888531]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Mozambique","SOV_A3":"MOZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Mozambique","ADM0_A3":"MOZ","GEOU_DIF":0,"GEOUNIT":"Mozambique","GU_A3":"MOZ","SU_DIF":0,"SUBUNIT":"Mozambique","SU_A3":"MOZ","BRK_DIFF":0,"NAME":"Mozambique","NAME_LONG":"Mozambique","BRK_A3":"MOZ","BRK_NAME":"Mozambique","BRK_GROUP":null,"ABBREV":"Moz.","POSTAL":"MZ","FORMAL_EN":"Republic of Mozambique","FORMAL_FR":null,"NAME_CIAWF":"Mozambique","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mozambique","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":26573706,"POP_RANK":15,"GDP_MD_EST":35010,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"MZ","ISO_A2":"MZ","ISO_A3":"MOZ","ISO_A3_EH":"MOZ","ISO_N3":"508","UN_A3":"508","WB_A2":"MZ","WB_A3":"MOZ","WOE_ID":23424902,"WOE_ID_EH":23424902,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MOZ","ADM0_A3_US":"MOZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[30.179481,-26.742192,40.775475,-10.317096],"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.47129,-11.56876],[37.82764,-11.26879],[38.427557,-11.285202],[39.521,-10.89688],[40.31659,-10.3171],[40.316586,-10.317098],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720891],[38.538351,-17.101023],[37.411133,-17.586368],[36.281279,-18.659688],[35.896497,-18.84226],[35.1984,-19.552811],[34.786383,-19.784012],[34.701893,-20.497043],[35.176127,-21.254361],[35.373428,-21.840837],[35.385848,-22.14],[35.562546,-22.09],[35.533935,-23.070788],[35.371774,-23.535359],[35.60747,-23.706563],[35.458746,-24.12261],[35.040735,-24.478351],[34.215824,-24.816314],[33.01321,-25.357573],[32.574632,-25.727318],[32.660363,-26.148584],[32.915955,-26.215867],[32.83012,-26.742192],[32.071665,-26.73382],[31.985779,-26.29178],[31.837778,-25.843332],[31.752408,-25.484284],[31.930589,-24.369417],[31.670398,-23.658969],[31.191409,-22.25151],[32.244988,-21.116489],[32.508693,-20.395292],[32.659743,-20.30429],[32.772708,-19.715592],[32.611994,-19.419383],[32.654886,-18.67209],[32.849861,-17.979057],[32.847639,-16.713398],[32.328239,-16.392074],[31.852041,-16.319417],[31.636498,-16.07199],[31.173064,-15.860944],[30.338955,-15.880839],[30.274256,-15.507787],[30.179481,-14.796099],[33.214025,-13.97186],[33.7897,-14.451831],[34.064825,-14.35995],[34.459633,-14.61301],[34.517666,-15.013709],[34.307291,-15.478641],[34.381292,-16.18356],[35.03381,-16.8013],[35.339063,-16.10744],[35.771905,-15.896859],[35.686845,-14.611046],[35.267956,-13.887834],[34.907151,-13.565425],[34.559989,-13.579998],[34.280006,-12.280025],[34.559989,-11.52002]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Mauritania","SOV_A3":"MRT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Mauritania","ADM0_A3":"MRT","GEOU_DIF":0,"GEOUNIT":"Mauritania","GU_A3":"MRT","SU_DIF":0,"SUBUNIT":"Mauritania","SU_A3":"MRT","BRK_DIFF":0,"NAME":"Mauritania","NAME_LONG":"Mauritania","BRK_A3":"MRT","BRK_NAME":"Mauritania","BRK_GROUP":null,"ABBREV":"Mrt.","POSTAL":"MR","FORMAL_EN":"Islamic Republic of Mauritania","FORMAL_FR":null,"NAME_CIAWF":"Mauritania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Mauritania","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":1,"POP_EST":3758571,"POP_RANK":12,"GDP_MD_EST":16710,"POP_YEAR":2017,"LASTCENSUS":2000,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"MR","ISO_A2":"MR","ISO_A3":"MRT","ISO_A3_EH":"MRT","ISO_N3":"478","UN_A3":"478","WB_A2":"MR","WB_A3":"MRT","WOE_ID":23424896,"WOE_ID_EH":23424896,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MRT","ADM0_A3_US":"MRT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-17.063423,14.616834,-4.923337,27.395744],"geometry":{"type":"Polygon","coordinates":[[[-8.6844,27.395744],[-4.923337,24.974574],[-6.453787,24.956591],[-5.971129,20.640833],[-5.488523,16.325102],[-5.315277,16.201854],[-5.537744,15.50169],[-9.550238,15.486497],[-9.700255,15.264107],[-10.086846,15.330486],[-10.650791,15.132746],[-11.349095,15.411256],[-11.666078,15.388208],[-11.834208,14.799097],[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.999752],[-16.845194,21.333323],[-12.929102,21.327071],[-13.118754,22.77122],[-12.874222,23.284832],[-11.937224,23.374594],[-11.969419,25.933353],[-8.687294,25.881056],[-8.6844,27.395744]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Malawi","SOV_A3":"MWI","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Malawi","ADM0_A3":"MWI","GEOU_DIF":0,"GEOUNIT":"Malawi","GU_A3":"MWI","SU_DIF":0,"SUBUNIT":"Malawi","SU_A3":"MWI","BRK_DIFF":0,"NAME":"Malawi","NAME_LONG":"Malawi","BRK_A3":"MWI","BRK_NAME":"Malawi","BRK_GROUP":null,"ABBREV":"Mal.","POSTAL":"MW","FORMAL_EN":"Republic of Malawi","FORMAL_FR":null,"NAME_CIAWF":"Malawi","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Malawi","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":5,"POP_EST":19196246,"POP_RANK":14,"GDP_MD_EST":21200,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"MI","ISO_A2":"MW","ISO_A3":"MWI","ISO_A3_EH":"MWI","ISO_N3":"454","UN_A3":"454","WB_A2":"MW","WB_A3":"MWI","WOE_ID":23424889,"WOE_ID_EH":23424889,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MWI","ADM0_A3_US":"MWI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[32.688165,-16.8013,35.771905,-9.230599],"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991764,-12.783871],[33.306422,-12.435778],[33.114289,-11.607198],[33.31531,-10.79655],[33.485688,-10.525559],[33.231388,-9.676722],[32.759375,-9.230599],[33.73972,-9.41715],[33.940838,-9.693674],[34.28,-10.16],[34.559989,-11.52002]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Malaysia","SOV_A3":"MYS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Malaysia","ADM0_A3":"MYS","GEOU_DIF":0,"GEOUNIT":"Malaysia","GU_A3":"MYS","SU_DIF":0,"SUBUNIT":"Malaysia","SU_A3":"MYS","BRK_DIFF":0,"NAME":"Malaysia","NAME_LONG":"Malaysia","BRK_A3":"MYS","BRK_NAME":"Malaysia","BRK_GROUP":null,"ABBREV":"Malay.","POSTAL":"MY","FORMAL_EN":"Malaysia","FORMAL_FR":null,"NAME_CIAWF":"Malaysia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Malaysia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":6,"POP_EST":31381992,"POP_RANK":15,"GDP_MD_EST":863000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"MY","ISO_A2":"MY","ISO_A3":"MYS","ISO_A3_EH":"MYS","ISO_N3":"458","UN_A3":"458","WB_A2":"MY","WB_A3":"MYS","WOE_ID":23424901,"WOE_ID_EH":23424901,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MYS","ADM0_A3_US":"MYS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[100.085757,0.773131,119.181904,6.928053],"geometry":{"type":"MultiPolygon","coordinates":[[[[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202],[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874]]],[[[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Namibia","SOV_A3":"NAM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Namibia","ADM0_A3":"NAM","GEOU_DIF":0,"GEOUNIT":"Namibia","GU_A3":"NAM","SU_DIF":0,"SUBUNIT":"Namibia","SU_A3":"NAM","BRK_DIFF":0,"NAME":"Namibia","NAME_LONG":"Namibia","BRK_A3":"NAM","BRK_NAME":"Namibia","BRK_GROUP":null,"ABBREV":"Nam.","POSTAL":"NA","FORMAL_EN":"Republic of Namibia","FORMAL_FR":null,"NAME_CIAWF":"Namibia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Namibia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":1,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":2484780,"POP_RANK":12,"GDP_MD_EST":25990,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"WA","ISO_A2":"NA","ISO_A3":"NAM","ISO_A3_EH":"NAM","ISO_N3":"516","UN_A3":"516","WB_A2":"NA","WB_A3":"NAM","WOE_ID":23424987,"WOE_ID_EH":23424987,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NAM","ADM0_A3_US":"NAM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5},"bbox":[11.734199,-29.045462,25.084443,-16.941343],"geometry":{"type":"Polygon","coordinates":[[[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.971212],[14.058501,-17.423381],[14.209707,-17.353101],[18.263309,-17.309951],[18.956187,-17.789095],[21.377176,-17.930636],[23.215048,-17.523116],[24.033862,-17.295843],[24.682349,-17.353411],[25.07695,-17.578823],[25.084443,-17.661816],[24.520705,-17.887125],[24.217365,-17.889347],[23.579006,-18.281261],[23.196858,-17.869038],[21.65504,-18.219146],[20.910641,-18.252219],[20.881134,-21.814327],[19.895458,-21.849157],[19.895768,-24.76779],[19.894734,-28.461105],[19.002127,-28.972443],[18.464899,-29.045462],[17.836152,-28.856378],[17.387497,-28.783514],[17.218929,-28.355943],[16.824017,-28.082162],[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"France","SOV_A3":"FR1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","ADMIN":"New Caledonia","ADM0_A3":"NCL","GEOU_DIF":0,"GEOUNIT":"New Caledonia","GU_A3":"NCL","SU_DIF":0,"SUBUNIT":"New Caledonia","SU_A3":"NCL","BRK_DIFF":0,"NAME":"New Caledonia","NAME_LONG":"New Caledonia","BRK_A3":"NCL","BRK_NAME":"New Caledonia","BRK_GROUP":null,"ABBREV":"New C.","POSTAL":"NC","FORMAL_EN":"New Caledonia","FORMAL_FR":"Nouvelle-Calédonie","NAME_CIAWF":"New Caledonia","NOTE_ADM0":"Fr.","NOTE_BRK":null,"NAME_SORT":"New Caledonia","NAME_ALT":null,"MAPCOLOR7":7,"MAPCOLOR8":5,"MAPCOLOR9":9,"MAPCOLOR13":11,"POP_EST":279070,"POP_RANK":10,"GDP_MD_EST":10770,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"NC","ISO_A2":"NC","ISO_A3":"NCL","ISO_A3_EH":"NCL","ISO_N3":"540","UN_A3":"540","WB_A2":"NC","WB_A3":"NCL","WOE_ID":23424903,"WOE_ID_EH":23424903,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NCL","ADM0_A3_US":"NCL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":13,"LONG_LEN":13,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":4.6,"MAX_LABEL":8},"bbox":[164.029606,-22.399976,167.120011,-20.105646],"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Niger","SOV_A3":"NER","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Niger","ADM0_A3":"NER","GEOU_DIF":0,"GEOUNIT":"Niger","GU_A3":"NER","SU_DIF":0,"SUBUNIT":"Niger","SU_A3":"NER","BRK_DIFF":0,"NAME":"Niger","NAME_LONG":"Niger","BRK_A3":"NER","BRK_NAME":"Niger","BRK_GROUP":null,"ABBREV":"Niger","POSTAL":"NE","FORMAL_EN":"Republic of Niger","FORMAL_FR":null,"NAME_CIAWF":"Niger","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Niger","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":19245344,"POP_RANK":14,"GDP_MD_EST":20150,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"NG","ISO_A2":"NE","ISO_A3":"NER","ISO_A3_EH":"NER","ISO_N3":"562","UN_A3":"562","WB_A2":"NE","WB_A3":"NER","WOE_ID":23424906,"WOE_ID_EH":23424906,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NER","ADM0_A3_US":"NER","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[0.295646,11.660167,15.903247,23.471668],"geometry":{"type":"Polygon","coordinates":[[[3.61118,11.660167],[2.848643,12.235636],[2.490164,12.233052],[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,22.491289],[14.8513,22.86295],[15.096888,21.308519],[15.47106,21.04845],[15.487148,20.730415],[15.903247,20.387619],[15.685741,19.95718],[15.300441,17.92795],[15.247731,16.627306],[13.97217,15.68437],[13.540394,14.367134],[13.956699,13.996691],[13.954477,13.353449],[14.595781,13.330427],[14.495787,12.859396],[14.213531,12.802035],[14.181336,12.483657],[13.995353,12.461565],[13.318702,13.556356],[13.083987,13.596147],[12.302071,13.037189],[11.527803,13.32898],[10.989593,13.387323],[10.701032,13.246918],[10.114814,13.277252],[9.524928,12.851102],[9.014933,12.826659],[7.804671,13.343527],[7.330747,13.098038],[6.820442,13.115091],[6.445426,13.492768],[5.443058,13.865924],[4.368344,13.747482],[4.107946,13.531216],[3.967283,12.956109],[3.680634,12.552903],[3.61118,11.660167]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Nigeria","SOV_A3":"NGA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Nigeria","ADM0_A3":"NGA","GEOU_DIF":0,"GEOUNIT":"Nigeria","GU_A3":"NGA","SU_DIF":0,"SUBUNIT":"Nigeria","SU_A3":"NGA","BRK_DIFF":0,"NAME":"Nigeria","NAME_LONG":"Nigeria","BRK_A3":"NGA","BRK_NAME":"Nigeria","BRK_GROUP":null,"ABBREV":"Nigeria","POSTAL":"NG","FORMAL_EN":"Federal Republic of Nigeria","FORMAL_FR":null,"NAME_CIAWF":"Nigeria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nigeria","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":2,"POP_EST":190632261,"POP_RANK":17,"GDP_MD_EST":1089000,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"NI","ISO_A2":"NG","ISO_A3":"NGA","ISO_A3_EH":"NGA","ISO_N3":"566","UN_A3":"566","WB_A2":"NG","WB_A3":"NGA","WOE_ID":23424908,"WOE_ID_EH":23424908,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NGA","ADM0_A3_US":"NGA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[2.691702,4.240594,14.577178,13.865924],"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.680634,12.552903],[3.967283,12.956109],[4.107946,13.531216],[4.368344,13.747482],[5.443058,13.865924],[6.445426,13.492768],[6.820442,13.115091],[7.330747,13.098038],[7.804671,13.343527],[9.014933,12.826659],[9.524928,12.851102],[10.114814,13.277252],[10.701032,13.246918],[10.989593,13.387323],[11.527803,13.32898],[12.302071,13.037189],[13.083987,13.596147],[13.318702,13.556356],[13.995353,12.461565],[14.181336,12.483657],[14.577178,12.085361],[14.468192,11.904752],[14.415379,11.572369],[13.57295,10.798566],[13.308676,10.160362],[13.1676,9.640626],[12.955468,9.417772],[12.753672,8.717763],[12.218872,8.305824],[12.063946,7.799808],[11.839309,7.397042],[11.745774,6.981383],[11.058788,6.644427],[10.497375,7.055358],[10.118277,7.03877],[9.522706,6.453482],[9.233163,6.444491],[8.757533,5.479666],[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Nicaragua","SOV_A3":"NIC","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Nicaragua","ADM0_A3":"NIC","GEOU_DIF":0,"GEOUNIT":"Nicaragua","GU_A3":"NIC","SU_DIF":0,"SUBUNIT":"Nicaragua","SU_A3":"NIC","BRK_DIFF":0,"NAME":"Nicaragua","NAME_LONG":"Nicaragua","BRK_A3":"NIC","BRK_NAME":"Nicaragua","BRK_GROUP":null,"ABBREV":"Nic.","POSTAL":"NI","FORMAL_EN":"Republic of Nicaragua","FORMAL_FR":null,"NAME_CIAWF":"Nicaragua","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nicaragua","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":6025951,"POP_RANK":13,"GDP_MD_EST":33550,"POP_YEAR":2017,"LASTCENSUS":2005,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"NU","ISO_A2":"NI","ISO_A3":"NIC","ISO_A3_EH":"NIC","ISO_N3":"558","UN_A3":"558","WB_A2":"NI","WB_A3":"NIC","WOE_ID":23424915,"WOE_ID_EH":23424915,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NIC","ADM0_A3_US":"NIC","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-87.668493,10.726839,-83.147219,15.016267],"geometry":{"type":"Polygon","coordinates":[[[-83.655612,10.938764],[-83.895054,10.726839],[-84.190179,10.79345],[-84.355931,10.999226],[-84.673069,11.082657],[-84.903003,10.952303],[-85.561852,11.217119],[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.836055],[-85.698665,13.960078],[-85.514413,14.079012],[-85.165365,14.35437],[-85.148751,14.560197],[-85.052787,14.551541],[-84.924501,14.790493],[-84.820037,14.819587],[-84.649582,14.666805],[-84.449336,14.621614],[-84.228342,14.748764],[-83.975721,14.749436],[-83.628585,14.880074],[-83.489989,15.016267],[-83.147219,14.995829],[-83.233234,14.899866],[-83.284162,14.676624],[-83.182126,14.310703],[-83.4125,13.970078],[-83.519832,13.567699],[-83.552207,13.127054],[-83.498515,12.869292],[-83.473323,12.419087],[-83.626104,12.32085],[-83.719613,11.893124],[-83.650858,11.629032],[-83.85547,11.373311],[-83.808936,11.103044],[-83.655612,10.938764]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Netherlands","SOV_A3":"NL1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"Netherlands","ADM0_A3":"NLD","GEOU_DIF":0,"GEOUNIT":"Netherlands","GU_A3":"NLD","SU_DIF":0,"SUBUNIT":"Netherlands","SU_A3":"NLD","BRK_DIFF":0,"NAME":"Netherlands","NAME_LONG":"Netherlands","BRK_A3":"NLD","BRK_NAME":"Netherlands","BRK_GROUP":null,"ABBREV":"Neth.","POSTAL":"NL","FORMAL_EN":"Kingdom of the Netherlands","FORMAL_FR":null,"NAME_CIAWF":"Netherlands","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Netherlands","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":9,"POP_EST":17084719,"POP_RANK":14,"GDP_MD_EST":870800,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"NL","ISO_A2":"NL","ISO_A3":"NLD","ISO_A3_EH":"NLD","ISO_N3":"528","UN_A3":"528","WB_A2":"NL","WB_A3":"NLD","WOE_ID":-90,"WOE_ID_EH":23424909,"WOE_NOTE":"Doesn't include new former units of Netherlands Antilles (24549811, 24549808, and 24549809)","ADM0_A3_IS":"NLD","ADM0_A3_US":"NLD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Western Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[3.314971,50.803721,7.092053,53.510403],"geometry":{"type":"Polygon","coordinates":[[[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.315011,51.345777],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Norway","SOV_A3":"NOR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Norway","ADM0_A3":"NOR","GEOU_DIF":0,"GEOUNIT":"Norway","GU_A3":"NOR","SU_DIF":0,"SUBUNIT":"Norway","SU_A3":"NOR","BRK_DIFF":0,"NAME":"Norway","NAME_LONG":"Norway","BRK_A3":"NOR","BRK_NAME":"Norway","BRK_GROUP":null,"ABBREV":"Nor.","POSTAL":"N","FORMAL_EN":"Kingdom of Norway","FORMAL_FR":null,"NAME_CIAWF":"Norway","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Norway","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":8,"MAPCOLOR13":12,"POP_EST":5320045,"POP_RANK":13,"GDP_MD_EST":364700,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","UN_A3":"-99","WB_A2":"-99","WB_A3":"-99","WOE_ID":-90,"WOE_ID_EH":23424910,"WOE_NOTE":"Does not include Svalbard, Jan Mayen, or Bouvet Islands (28289410).","ADM0_A3_IS":"NOR","ADM0_A3_US":"NOR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[4.992078,58.078884,31.293418,80.657144],"geometry":{"type":"MultiPolygon","coordinates":[[[[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868,68.567391],[17.729182,68.010552],[16.768879,68.013937],[16.108712,67.302456],[15.108411,66.193867],[13.55569,64.787028],[13.919905,64.445421],[13.571916,64.049114],[12.579935,64.066219],[11.930569,63.128318],[11.992064,61.800362],[12.631147,61.293572],[12.300366,60.117933],[11.468272,59.432393],[11.027369,58.856149],[10.356557,59.469807],[8.382,58.313288],[7.048748,58.078884],[5.665835,58.588155],[5.308234,59.663232],[4.992078,61.970998],[5.9129,62.614473],[8.553411,63.454008],[10.527709,64.486038],[12.358347,65.879726],[14.761146,67.810642],[16.435927,68.563205],[19.184028,69.817444],[21.378416,70.255169],[23.023742,70.202072],[24.546543,71.030497],[26.37005,70.986262],[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101042,69.558101],[29.39955,69.15692],[28.59193,69.064777]]],[[[24.72412,77.85385],[22.49032,77.44493],[20.72601,77.67704],[21.41611,77.93504],[20.8119,78.25463],[22.88426,78.45494],[23.28134,78.07954],[24.72412,77.85385]]],[[[18.25183,79.70175],[21.54383,78.95611],[19.02737,78.5626],[18.47172,77.82669],[17.59441,77.63796],[17.1182,76.80941],[15.91315,76.77045],[13.76259,77.38035],[14.66956,77.73565],[13.1706,78.02493],[11.22231,78.8693],[10.44453,79.65239],[13.17077,80.01046],[13.71852,79.66039],[15.14282,79.67431],[15.52255,80.01608],[16.99085,80.05086],[18.25183,79.70175]]],[[[25.447625,80.40734],[27.407506,80.056406],[25.924651,79.517834],[23.024466,79.400012],[20.075188,79.566823],[19.897266,79.842362],[18.462264,79.85988],[17.368015,80.318896],[20.455992,80.598156],[21.907945,80.357679],[22.919253,80.657144],[25.447625,80.40734]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Nepal","SOV_A3":"NPL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Nepal","ADM0_A3":"NPL","GEOU_DIF":0,"GEOUNIT":"Nepal","GU_A3":"NPL","SU_DIF":0,"SUBUNIT":"Nepal","SU_A3":"NPL","BRK_DIFF":0,"NAME":"Nepal","NAME_LONG":"Nepal","BRK_A3":"NPL","BRK_NAME":"Nepal","BRK_GROUP":null,"ABBREV":"Nepal","POSTAL":"NP","FORMAL_EN":"Nepal","FORMAL_FR":null,"NAME_CIAWF":"Nepal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Nepal","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":12,"POP_EST":29384297,"POP_RANK":15,"GDP_MD_EST":71520,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"NP","ISO_A2":"NP","ISO_A3":"NPL","ISO_A3_EH":"NPL","ISO_N3":"524","UN_A3":"524","WB_A2":"NP","WB_A3":"NPL","WOE_ID":23424911,"WOE_ID_EH":23424911,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NPL","ADM0_A3_US":"NPL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[80.088425,26.397898,88.174804,30.422717],"geometry":{"type":"Polygon","coordinates":[[[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.320226],[84.23458,28.839894],[85.011638,28.642774],[85.82332,28.203576],[86.954517,27.974262],[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"New Zealand","SOV_A3":"NZ1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"New Zealand","ADM0_A3":"NZL","GEOU_DIF":0,"GEOUNIT":"New Zealand","GU_A3":"NZL","SU_DIF":0,"SUBUNIT":"New Zealand","SU_A3":"NZL","BRK_DIFF":0,"NAME":"New Zealand","NAME_LONG":"New Zealand","BRK_A3":"NZL","BRK_NAME":"New Zealand","BRK_GROUP":null,"ABBREV":"N.Z.","POSTAL":"NZ","FORMAL_EN":"New Zealand","FORMAL_FR":null,"NAME_CIAWF":"New Zealand","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"New Zealand","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":4510327,"POP_RANK":12,"GDP_MD_EST":174800,"POP_YEAR":2017,"LASTCENSUS":2006,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"NZ","ISO_A2":"NZ","ISO_A3":"NZL","ISO_A3_EH":"NZL","ISO_N3":"554","UN_A3":"554","WB_A2":"NZ","WB_A3":"NZL","WOE_ID":23424916,"WOE_ID_EH":23424916,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"NZL","ADM0_A3_US":"NZL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Australia and New Zealand","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":6.7},"bbox":[166.509144,-46.641235,178.517094,-34.450662],"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.619945],[167.763745,-46.290197],[166.676886,-46.219917],[166.509144,-45.852705],[167.046424,-45.110941],[168.303763,-44.123973],[168.949409,-43.935819],[169.667815,-43.555326],[170.52492,-43.031688],[171.12509,-42.512754],[171.569714,-41.767424],[171.948709,-41.514417],[172.097227,-40.956104],[172.79858,-40.493962],[173.020375,-40.919052]]],[[[174.612009,-36.156397],[175.336616,-37.209098],[175.357596,-36.526194],[175.808887,-36.798942],[175.95849,-37.555382],[176.763195,-37.881253],[177.438813,-37.961248],[178.010354,-37.579825],[178.517094,-37.695373],[178.274731,-38.582813],[177.97046,-39.166343],[177.206993,-39.145776],[176.939981,-39.449736],[177.032946,-39.879943],[176.885824,-40.065978],[176.508017,-40.604808],[176.01244,-41.289624],[175.239567,-41.688308],[175.067898,-41.425895],[174.650973,-41.281821],[175.22763,-40.459236],[174.900157,-39.908933],[173.824047,-39.508854],[173.852262,-39.146602],[174.574802,-38.797683],[174.743474,-38.027808],[174.697017,-37.381129],[174.292028,-36.711092],[174.319004,-36.534824],[173.840997,-36.121981],[173.054171,-35.237125],[172.636005,-34.529107],[173.007042,-34.450662],[173.551298,-35.006183],[174.32939,-35.265496],[174.612009,-36.156397]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Oman","SOV_A3":"OMN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Oman","ADM0_A3":"OMN","GEOU_DIF":0,"GEOUNIT":"Oman","GU_A3":"OMN","SU_DIF":0,"SUBUNIT":"Oman","SU_A3":"OMN","BRK_DIFF":0,"NAME":"Oman","NAME_LONG":"Oman","BRK_A3":"OMN","BRK_NAME":"Oman","BRK_GROUP":null,"ABBREV":"Oman","POSTAL":"OM","FORMAL_EN":"Sultanate of Oman","FORMAL_FR":null,"NAME_CIAWF":"Oman","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Oman","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":3424386,"POP_RANK":12,"GDP_MD_EST":173100,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"MU","ISO_A2":"OM","ISO_A3":"OMN","ISO_A3_EH":"OMN","ISO_N3":"512","UN_A3":"512","WB_A2":"OM","WB_A3":"OMN","WOE_ID":23424898,"WOE_ID_EH":23424898,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"OMN","ADM0_A3_US":"OMN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[52.00001,16.651051,59.80806,26.395934],"geometry":{"type":"MultiPolygon","coordinates":[[[[56.261042,25.714606],[56.070821,26.055464],[56.362017,26.395934],[56.485679,26.309118],[56.391421,25.895991],[56.261042,25.714606]]],[[[55.208341,22.70833],[55.234489,23.110993],[55.525841,23.524869],[55.528632,23.933604],[55.981214,24.130543],[55.804119,24.269604],[55.886233,24.920831],[56.396847,24.924732],[56.84514,24.241673],[57.403453,23.878594],[58.136948,23.747931],[58.729211,23.565668],[59.180502,22.992395],[59.450098,22.660271],[59.80806,22.533612],[59.806148,22.310525],[59.442191,21.714541],[59.282408,21.433886],[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.651051],[52.782184,17.349742],[52.00001,19.000003],[54.999982,19.999994],[55.666659,22.000001],[55.208341,22.70833]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Pakistan","SOV_A3":"PAK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Pakistan","ADM0_A3":"PAK","GEOU_DIF":0,"GEOUNIT":"Pakistan","GU_A3":"PAK","SU_DIF":0,"SUBUNIT":"Pakistan","SU_A3":"PAK","BRK_DIFF":0,"NAME":"Pakistan","NAME_LONG":"Pakistan","BRK_A3":"PAK","BRK_NAME":"Pakistan","BRK_GROUP":null,"ABBREV":"Pak.","POSTAL":"PK","FORMAL_EN":"Islamic Republic of Pakistan","FORMAL_FR":null,"NAME_CIAWF":"Pakistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Pakistan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":204924861,"POP_RANK":17,"GDP_MD_EST":988200,"POP_YEAR":2017,"LASTCENSUS":1998,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"PK","ISO_A2":"PK","ISO_A3":"PAK","ISO_A3_EH":"PAK","ISO_N3":"586","UN_A3":"586","WB_A2":"PK","WB_A3":"PAK","WOE_ID":23424922,"WOE_ID_EH":23424922,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PAK","ADM0_A3_US":"PAK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Southern Asia","REGION_WB":"South Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[60.874248,23.691965,77.837451,37.133031],"geometry":{"type":"Polygon","coordinates":[[[60.874248,29.829239],[62.549857,29.318572],[63.550261,29.468331],[64.148002,29.340819],[64.350419,29.560031],[65.046862,29.472181],[66.346473,29.887943],[66.381458,30.738899],[66.938891,31.304911],[67.683394,31.303154],[67.792689,31.58293],[68.556932,31.71331],[68.926677,31.620189],[69.317764,31.901412],[69.262522,32.501944],[69.687147,33.105499],[70.323594,33.358533],[69.930543,34.02012],[70.881803,33.988856],[71.156773,34.348911],[71.115019,34.733126],[71.613076,35.153203],[71.498768,35.650563],[71.262348,36.074388],[71.846292,36.509942],[72.920025,36.720007],[74.067552,36.836176],[74.575893,37.020841],[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.940966],[70.168927,26.491872],[70.282873,25.722229],[70.844699,25.215102],[71.04324,24.356524],[68.842599,24.359134],[68.176645,23.691965],[67.443667,23.944844],[67.145442,24.663611],[66.372828,25.425141],[64.530408,25.237039],[62.905701,25.218409],[61.497363,25.078237],[61.874187,26.239975],[63.316632,26.756532],[63.233898,27.217047],[62.755426,27.378923],[62.72783,28.259645],[61.771868,28.699334],[61.369309,29.303276],[60.874248,29.829239]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Panama","SOV_A3":"PAN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Panama","ADM0_A3":"PAN","GEOU_DIF":0,"GEOUNIT":"Panama","GU_A3":"PAN","SU_DIF":0,"SUBUNIT":"Panama","SU_A3":"PAN","BRK_DIFF":0,"NAME":"Panama","NAME_LONG":"Panama","BRK_A3":"PAN","BRK_NAME":"Panama","BRK_GROUP":null,"ABBREV":"Pan.","POSTAL":"PA","FORMAL_EN":"Republic of Panama","FORMAL_FR":null,"NAME_CIAWF":"Panama","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Panama","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":3753142,"POP_RANK":12,"GDP_MD_EST":93120,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"PM","ISO_A2":"PA","ISO_A3":"PAN","ISO_A3_EH":"PAN","ISO_N3":"591","UN_A3":"591","WB_A2":"PA","WB_A3":"PAN","WOE_ID":23424924,"WOE_ID_EH":23424924,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PAN","ADM0_A3_US":"PAN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-82.965783,7.220541,-77.242566,9.61161],"geometry":{"type":"Polygon","coordinates":[[[-77.353361,8.670505],[-77.474723,8.524286],[-77.242566,7.935278],[-77.431108,7.638061],[-77.753414,7.70984],[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7.647906],[-81.519515,7.70661],[-81.721311,8.108963],[-82.131441,8.175393],[-82.390934,8.292362],[-82.820081,8.290864],[-82.850958,8.073823],[-82.965783,8.225028],[-82.913176,8.423517],[-82.829771,8.626295],[-82.868657,8.807266],[-82.719183,8.925709],[-82.927155,9.07433],[-82.932891,9.476812],[-82.546196,9.566135],[-82.187123,9.207449],[-82.207586,8.995575],[-81.808567,8.950617],[-81.714154,9.031955],[-81.439287,8.786234],[-80.947302,8.858504],[-80.521901,9.111072],[-79.9146,9.312765],[-79.573303,9.61161],[-79.021192,9.552931],[-79.05845,9.454565],[-78.500888,9.420459],[-78.055928,9.24773],[-77.729514,8.946844],[-77.353361,8.670505]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Peru","SOV_A3":"PER","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Peru","ADM0_A3":"PER","GEOU_DIF":0,"GEOUNIT":"Peru","GU_A3":"PER","SU_DIF":0,"SUBUNIT":"Peru","SU_A3":"PER","BRK_DIFF":0,"NAME":"Peru","NAME_LONG":"Peru","BRK_A3":"PER","BRK_NAME":"Peru","BRK_GROUP":null,"ABBREV":"Peru","POSTAL":"PE","FORMAL_EN":"Republic of Peru","FORMAL_FR":null,"NAME_CIAWF":"Peru","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Peru","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":11,"POP_EST":31036656,"POP_RANK":15,"GDP_MD_EST":410400,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"PE","ISO_A2":"PE","ISO_A3":"PER","ISO_A3_EH":"PER","ISO_N3":"604","UN_A3":"604","WB_A2":"PE","WB_A3":"PER","WOE_ID":23424919,"WOE_ID_EH":23424919,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PER","ADM0_A3_US":"PER","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[-81.410943,-18.347975,-68.66508,-0.057205],"geometry":{"type":"Polygon","coordinates":[[[-69.529678,-10.951734],[-68.66508,-12.5613],[-68.88008,-12.899729],[-68.929224,-13.602684],[-68.948887,-14.453639],[-69.339535,-14.953195],[-69.160347,-15.323974],[-69.389764,-15.660129],[-68.959635,-16.500698],[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996,-6.136834],[-80.926347,-5.690557],[-81.410943,-4.736765],[-81.09967,-4.036394],[-80.302561,-3.404856],[-80.184015,-3.821162],[-80.469295,-4.059287],[-80.442242,-4.425724],[-80.028908,-4.346091],[-79.624979,-4.454198],[-79.205289,-4.959129],[-78.639897,-4.547784],[-78.450684,-3.873097],[-77.837905,-3.003021],[-76.635394,-2.608678],[-75.544996,-1.56161],[-75.233723,-0.911417],[-75.373223,-0.152032],[-75.106625,-0.057205],[-74.441601,-0.53082],[-74.122395,-1.002833],[-73.659504,-1.260491],[-73.070392,-2.308954],[-72.325787,-2.434218],[-71.774761,-2.16979],[-71.413646,-2.342802],[-70.813476,-2.256865],[-70.047709,-2.725156],[-70.692682,-3.742872],[-70.394044,-3.766591],[-69.893635,-4.298187],[-70.794769,-4.251265],[-70.928843,-4.401591],[-71.748406,-4.593983],[-72.891928,-5.274561],[-72.964507,-5.741251],[-73.219711,-6.089189],[-73.120027,-6.629931],[-73.724487,-6.918595],[-73.723401,-7.340999],[-73.987235,-7.52383],[-73.571059,-8.424447],[-73.015383,-9.032833],[-73.226713,-9.462213],[-72.563033,-9.520194],[-72.184891,-10.053598],[-71.302412,-10.079436],[-70.481894,-9.490118],[-70.548686,-11.009147],[-70.093752,-11.123972],[-69.529678,-10.951734]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Philippines","SOV_A3":"PHL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Philippines","ADM0_A3":"PHL","GEOU_DIF":0,"GEOUNIT":"Philippines","GU_A3":"PHL","SU_DIF":0,"SUBUNIT":"Philippines","SU_A3":"PHL","BRK_DIFF":0,"NAME":"Philippines","NAME_LONG":"Philippines","BRK_A3":"PHL","BRK_NAME":"Philippines","BRK_GROUP":null,"ABBREV":"Phil.","POSTAL":"PH","FORMAL_EN":"Republic of the Philippines","FORMAL_FR":null,"NAME_CIAWF":"Philippines","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Philippines","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":8,"POP_EST":104256076,"POP_RANK":17,"GDP_MD_EST":801900,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"RP","ISO_A2":"PH","ISO_A3":"PHL","ISO_A3_EH":"PHL","ISO_N3":"608","UN_A3":"608","WB_A2":"PH","WB_A3":"PHL","WOE_ID":23424934,"WOE_ID_EH":23424934,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PHL","ADM0_A3_US":"PHL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[117.174275,5.581003,126.537424,18.505227],"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]]],[[[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779]]],[[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]]],[[[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841],[121.883548,11.891755]]],[[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]],[[[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959]]],[[[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Papua New Guinea","SOV_A3":"PNG","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Papua New Guinea","ADM0_A3":"PNG","GEOU_DIF":0,"GEOUNIT":"Papua New Guinea","GU_A3":"PNG","SU_DIF":1,"SUBUNIT":"Papua New Guinea","SU_A3":"PN1","BRK_DIFF":0,"NAME":"Papua New Guinea","NAME_LONG":"Papua New Guinea","BRK_A3":"PN1","BRK_NAME":"Papua New Guinea","BRK_GROUP":null,"ABBREV":"P.N.G.","POSTAL":"PG","FORMAL_EN":"Independent State of Papua New Guinea","FORMAL_FR":null,"NAME_CIAWF":"Papua New Guinea","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Papua New Guinea","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":1,"POP_EST":6909701,"POP_RANK":13,"GDP_MD_EST":28020,"POP_YEAR":2017,"LASTCENSUS":2000,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"PP","ISO_A2":"PG","ISO_A3":"PNG","ISO_A3_EH":"PNG","ISO_N3":"598","UN_A3":"598","WB_A2":"PG","WB_A3":"PNG","WOE_ID":23424926,"WOE_ID_EH":23424926,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PNG","ADM0_A3_US":"PNG","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":16,"LONG_LEN":16,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.5,"MAX_LABEL":7.5},"bbox":[141.00021,-10.652476,156.019965,-2.500002],"geometry":{"type":"MultiPolygon","coordinates":[[[[141.033852,-9.117893],[141.017057,-5.859022],[141.00021,-2.600151],[142.735247,-3.289153],[144.583971,-3.861418],[145.27318,-4.373738],[145.829786,-4.876498],[145.981922,-5.465609],[147.648073,-6.083659],[147.891108,-6.614015],[146.970905,-6.721657],[147.191874,-7.388024],[148.084636,-8.044108],[148.734105,-9.104664],[149.306835,-9.071436],[149.266631,-9.514406],[150.038728,-9.684318],[149.738798,-9.872937],[150.801628,-10.293687],[150.690575,-10.582713],[150.028393,-10.652476],[149.78231,-10.393267],[148.923138,-10.280923],[147.913018,-10.130441],[147.135443,-9.492444],[146.567881,-8.942555],[146.048481,-8.067414],[144.744168,-7.630128],[143.897088,-7.91533],[143.286376,-8.245491],[143.413913,-8.983069],[142.628431,-9.326821],[142.068259,-9.159596],[141.033852,-9.117893]]],[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[149.709963,-6.316513],[148.890065,-6.02604],[148.318937,-5.747142],[148.401826,-5.437756],[149.298412,-5.583742],[149.845562,-5.505503],[149.99625,-5.026101],[150.139756,-5.001348],[150.236908,-5.53222],[150.807467,-5.455842],[151.089672,-5.113693],[151.647881,-4.757074],[151.537862,-4.167807],[152.136792,-4.14879],[152.338743,-4.312966],[152.318693,-4.867661],[151.982796,-5.478063]]],[[[153.140038,-4.499983],[152.827292,-4.766427],[152.638673,-4.176127],[152.406026,-3.789743],[151.953237,-3.462062],[151.384279,-3.035422],[150.66205,-2.741486],[150.939965,-2.500002],[151.479984,-2.779985],[151.820015,-2.999972],[152.239989,-3.240009],[152.640017,-3.659983],[153.019994,-3.980015],[153.140038,-4.499983]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Poland","SOV_A3":"POL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Poland","ADM0_A3":"POL","GEOU_DIF":0,"GEOUNIT":"Poland","GU_A3":"POL","SU_DIF":0,"SUBUNIT":"Poland","SU_A3":"POL","BRK_DIFF":0,"NAME":"Poland","NAME_LONG":"Poland","BRK_A3":"POL","BRK_NAME":"Poland","BRK_GROUP":null,"ABBREV":"Pol.","POSTAL":"PL","FORMAL_EN":"Republic of Poland","FORMAL_FR":null,"NAME_CIAWF":"Poland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Poland","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":7,"MAPCOLOR9":1,"MAPCOLOR13":2,"POP_EST":38476269,"POP_RANK":15,"GDP_MD_EST":1052000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"PL","ISO_A2":"PL","ISO_A3":"POL","ISO_A3_EH":"POL","ISO_N3":"616","UN_A3":"616","WB_A2":"PL","WB_A3":"POL","WOE_ID":23424923,"WOE_ID_EH":23424923,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"POL","ADM0_A3_US":"POL","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[14.074521,49.027395,24.029986,54.851536],"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[23.527536,53.470122],[23.804935,53.089731],[23.799199,52.691099],[23.199494,52.486977],[23.508002,52.023647],[23.527071,51.578454],[24.029986,50.705407],[23.922757,50.424881],[23.426508,50.308506],[22.51845,49.476774],[22.776419,49.027395],[22.558138,49.085738],[21.607808,49.470107],[20.887955,49.328772],[20.415839,49.431453],[19.825023,49.217125],[19.320713,49.571574],[18.909575,49.435846],[18.853144,49.49623],[18.392914,49.988629],[17.649445,50.049038],[17.554567,50.362146],[16.868769,50.473974],[16.719476,50.215747],[16.176253,50.422607],[16.238627,50.697733],[15.490972,50.78473],[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"United States of America","SOV_A3":"US1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Dependency","ADMIN":"Puerto Rico","ADM0_A3":"PRI","GEOU_DIF":0,"GEOUNIT":"Puerto Rico","GU_A3":"PRI","SU_DIF":0,"SUBUNIT":"Puerto Rico","SU_A3":"PRI","BRK_DIFF":0,"NAME":"Puerto Rico","NAME_LONG":"Puerto Rico","BRK_A3":"PRI","BRK_NAME":"Puerto Rico","BRK_GROUP":null,"ABBREV":"P.R.","POSTAL":"PR","FORMAL_EN":"Commonwealth of Puerto Rico","FORMAL_FR":null,"NAME_CIAWF":"Puerto Rico","NOTE_ADM0":"Commonwealth of U.S.A.","NOTE_BRK":null,"NAME_SORT":"Puerto Rico","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":1,"POP_EST":3351827,"POP_RANK":12,"GDP_MD_EST":131000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"RQ","ISO_A2":"PR","ISO_A3":"PRI","ISO_A3_EH":"PRI","ISO_N3":"630","UN_A3":"630","WB_A2":"PR","WB_A3":"PRI","WOE_ID":23424935,"WOE_ID_EH":23424935,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PRI","ADM0_A3_US":"PRI","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-67.242428,17.946553,-65.591004,18.520601],"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"North Korea","SOV_A3":"PRK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"North Korea","ADM0_A3":"PRK","GEOU_DIF":0,"GEOUNIT":"North Korea","GU_A3":"PRK","SU_DIF":0,"SUBUNIT":"North Korea","SU_A3":"PRK","BRK_DIFF":0,"NAME":"North Korea","NAME_LONG":"Dem. Rep. Korea","BRK_A3":"PRK","BRK_NAME":"Dem. Rep. Korea","BRK_GROUP":null,"ABBREV":"N.K.","POSTAL":"KP","FORMAL_EN":"Democratic People's Republic of Korea","FORMAL_FR":null,"NAME_CIAWF":"Korea, North","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Korea, Dem. Rep.","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":25248140,"POP_RANK":15,"GDP_MD_EST":40000,"POP_YEAR":2013,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"KN","ISO_A2":"KP","ISO_A3":"PRK","ISO_A3_EH":"PRK","ISO_N3":"408","UN_A3":"408","WB_A2":"KP","WB_A3":"PRK","WOE_ID":23424865,"WOE_ID_EH":23424865,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PRK","ADM0_A3_US":"PRK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":15,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[124.265625,37.669071,130.780007,42.985387],"geometry":{"type":"MultiPolygon","coordinates":[[[[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.64,42.395024],[130.64,42.395],[130.779992,42.22001],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493]]],[[[130.780005,42.22001],[130.780007,42.220007],[130.780004,42.220008],[130.780005,42.22001]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Portugal","SOV_A3":"PRT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Portugal","ADM0_A3":"PRT","GEOU_DIF":0,"GEOUNIT":"Portugal","GU_A3":"PRT","SU_DIF":1,"SUBUNIT":"Portugal","SU_A3":"PR1","BRK_DIFF":0,"NAME":"Portugal","NAME_LONG":"Portugal","BRK_A3":"PR1","BRK_NAME":"Portugal","BRK_GROUP":null,"ABBREV":"Port.","POSTAL":"P","FORMAL_EN":"Portuguese Republic","FORMAL_FR":null,"NAME_CIAWF":"Portugal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Portugal","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":7,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":10839514,"POP_RANK":14,"GDP_MD_EST":297100,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"PO","ISO_A2":"PT","ISO_A3":"PRT","ISO_A3_EH":"PRT","ISO_N3":"620","UN_A3":"620","WB_A2":"PT","WB_A3":"PRT","WOE_ID":23424925,"WOE_ID_EH":23424925,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PRT","ADM0_A3_US":"PRT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-9.526571,36.838269,-6.389088,42.280469],"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,37.428904],[-7.453726,37.097788],[-7.855613,36.838269],[-8.382816,36.97888],[-8.898857,36.868809],[-8.746101,37.651346],[-8.839998,38.266243],[-9.287464,38.358486],[-9.526571,38.737429],[-9.446989,39.392066],[-9.048305,39.755093],[-8.977353,40.159306],[-8.768684,40.760639],[-8.790853,41.184334],[-8.990789,41.543459],[-9.034818,41.880571]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Paraguay","SOV_A3":"PRY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Paraguay","ADM0_A3":"PRY","GEOU_DIF":0,"GEOUNIT":"Paraguay","GU_A3":"PRY","SU_DIF":0,"SUBUNIT":"Paraguay","SU_A3":"PRY","BRK_DIFF":0,"NAME":"Paraguay","NAME_LONG":"Paraguay","BRK_A3":"PRY","BRK_NAME":"Paraguay","BRK_GROUP":null,"ABBREV":"Para.","POSTAL":"PY","FORMAL_EN":"Republic of Paraguay","FORMAL_FR":null,"NAME_CIAWF":"Paraguay","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Paraguay","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":2,"POP_EST":6943739,"POP_RANK":13,"GDP_MD_EST":64670,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"PA","ISO_A2":"PY","ISO_A3":"PRY","ISO_A3_EH":"PRY","ISO_N3":"600","UN_A3":"600","WB_A2":"PY","WB_A3":"PRY","WOE_ID":23424917,"WOE_ID_EH":23424917,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PRY","ADM0_A3_US":"PRY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-62.685057,-27.548499,-54.29296,-19.342747],"geometry":{"type":"Polygon","coordinates":[[[-54.625291,-25.739255],[-54.788795,-26.621786],[-55.695846,-27.387837],[-56.486702,-27.548499],[-57.60976,-27.395899],[-58.618174,-27.123719],[-57.63366,-25.603657],[-57.777217,-25.16234],[-58.807128,-24.771459],[-60.028966,-24.032796],[-60.846565,-23.880713],[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55.027902,-24.001274],[-54.652834,-23.839578],[-54.29296,-24.021014],[-54.293476,-24.5708],[-54.428946,-25.162185],[-54.625291,-25.739255]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Israel","SOV_A3":"IS1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Disputed","ADMIN":"Palestine","ADM0_A3":"PSX","GEOU_DIF":0,"GEOUNIT":"Palestine","GU_A3":"PSX","SU_DIF":0,"SUBUNIT":"Palestine","SU_A3":"PSX","BRK_DIFF":0,"NAME":"Palestine","NAME_LONG":"Palestine","BRK_A3":"PSX","BRK_NAME":"Palestine","BRK_GROUP":null,"ABBREV":"Pal.","POSTAL":"PAL","FORMAL_EN":"West Bank and Gaza","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Partial self-admin.","NOTE_BRK":"Partial self-admin.","NAME_SORT":"Palestine (West Bank and Gaza)","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":5,"MAPCOLOR13":8,"POP_EST":4543126,"POP_RANK":12,"GDP_MD_EST":21220.77,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"PS","ISO_A3":"PSE","ISO_A3_EH":"PSE","ISO_N3":"275","UN_A3":"275","WB_A2":"GZ","WB_A3":"WBG","WOE_ID":28289408,"WOE_ID_EH":28289408,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"PSE","ADM0_A3_US":"PSX","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":-99,"MIN_ZOOM":7,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[34.927408,31.353435,35.545665,32.532511],"geometry":{"type":"Polygon","coordinates":[[[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Qatar","SOV_A3":"QAT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Qatar","ADM0_A3":"QAT","GEOU_DIF":0,"GEOUNIT":"Qatar","GU_A3":"QAT","SU_DIF":0,"SUBUNIT":"Qatar","SU_A3":"QAT","BRK_DIFF":0,"NAME":"Qatar","NAME_LONG":"Qatar","BRK_A3":"QAT","BRK_NAME":"Qatar","BRK_GROUP":null,"ABBREV":"Qatar","POSTAL":"QA","FORMAL_EN":"State of Qatar","FORMAL_FR":null,"NAME_CIAWF":"Qatar","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Qatar","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":4,"POP_EST":2314307,"POP_RANK":12,"GDP_MD_EST":334500,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"QA","ISO_A2":"QA","ISO_A3":"QAT","ISO_A3_EH":"QAT","ISO_N3":"634","UN_A3":"634","WB_A2":"QA","WB_A3":"QAT","WOE_ID":23424930,"WOE_ID_EH":23424930,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"QAT","ADM0_A3_US":"QAT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[50.743911,24.556331,51.6067,26.114582],"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Romania","SOV_A3":"ROU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Romania","ADM0_A3":"ROU","GEOU_DIF":0,"GEOUNIT":"Romania","GU_A3":"ROU","SU_DIF":0,"SUBUNIT":"Romania","SU_A3":"ROU","BRK_DIFF":0,"NAME":"Romania","NAME_LONG":"Romania","BRK_A3":"ROU","BRK_NAME":"Romania","BRK_GROUP":null,"ABBREV":"Rom.","POSTAL":"RO","FORMAL_EN":"Romania","FORMAL_FR":null,"NAME_CIAWF":"Romania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Romania","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":3,"MAPCOLOR13":13,"POP_EST":21529967,"POP_RANK":15,"GDP_MD_EST":441000,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"RO","ISO_A2":"RO","ISO_A3":"ROU","ISO_A3_EH":"ROU","ISO_N3":"642","UN_A3":"642","WB_A2":"RO","WB_A3":"ROM","WOE_ID":23424933,"WOE_ID_EH":23424933,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ROU","ADM0_A3_US":"ROU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[20.220192,43.688445,29.626543,48.220881],"geometry":{"type":"Polygon","coordinates":[[[28.558081,43.707462],[27.970107,43.812468],[27.2424,44.175986],[26.065159,43.943494],[25.569272,43.688445],[24.100679,43.741051],[23.332302,43.897011],[22.944832,43.823785],[22.65715,44.234923],[22.474008,44.409228],[22.705726,44.578003],[22.459022,44.702517],[22.145088,44.478422],[21.562023,44.768947],[21.483526,45.18117],[20.874313,45.416375],[20.762175,45.734573],[20.220192,46.127469],[21.021952,46.316088],[21.626515,46.994238],[22.099768,47.672439],[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45.464925],[29.603289,45.293308],[29.626543,45.035391],[29.141612,44.82021],[28.837858,44.913874],[28.558081,43.707462]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Russia","SOV_A3":"RUS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Russia","ADM0_A3":"RUS","GEOU_DIF":0,"GEOUNIT":"Russia","GU_A3":"RUS","SU_DIF":0,"SUBUNIT":"Russia","SU_A3":"RUS","BRK_DIFF":0,"NAME":"Russia","NAME_LONG":"Russian Federation","BRK_A3":"RUS","BRK_NAME":"Russia","BRK_GROUP":null,"ABBREV":"Rus.","POSTAL":"RUS","FORMAL_EN":"Russian Federation","FORMAL_FR":null,"NAME_CIAWF":"Russia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Russian Federation","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":7,"POP_EST":142257519,"POP_RANK":17,"GDP_MD_EST":3745000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"3. Emerging region: BRIC","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"RS","ISO_A2":"RU","ISO_A3":"RUS","ISO_A3_EH":"RUS","ISO_N3":"643","UN_A3":"643","WB_A2":"RU","WB_A3":"RUS","WOE_ID":23424936,"WOE_ID_EH":23424936,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"RUS","ADM0_A3_US":"RUS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":18,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.2},"bbox":[-180,41.151416,180,81.2504],"geometry":{"type":"MultiPolygon","coordinates":[[[[48.584353,41.808869],[47.987283,41.405819],[47.815666,41.151416],[47.373315,41.219732],[46.686071,41.827137],[46.404951,41.860675],[45.7764,42.09244],[45.470279,42.502781],[44.537623,42.711993],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.076965,43.553104],[39.955009,43.434998],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.223538,47.10219],[38.255112,47.5464],[38.77057,47.82562],[39.738278,47.898937],[39.89562,48.23241],[39.67465,48.78382],[40.080789,49.30743],[40.06904,49.60105],[38.594988,49.926462],[38.010631,49.915662],[37.39346,50.383953],[36.626168,50.225591],[35.356116,50.577197],[35.37791,50.77394],[35.022183,51.207572],[34.224816,51.255993],[34.141978,51.566413],[34.391731,51.768882],[33.7527,52.335075],[32.715761,52.238465],[32.412058,52.288695],[32.15944,52.06125],[31.785992,52.101678],[31.78597,52.10168],[31.540018,52.742052],[31.305201,53.073996],[31.49764,53.16743],[32.304519,53.132726],[32.693643,53.351421],[32.405599,53.618045],[31.731273,53.794029],[31.791424,53.974639],[31.384472,54.157056],[30.757534,54.811771],[30.971836,55.081548],[30.873909,55.550976],[29.896294,55.789463],[29.371572,55.670091],[29.229513,55.918344],[28.176709,56.16913],[27.855282,56.759326],[27.770016,57.244258],[27.288185,57.474528],[27.716686,57.791899],[27.42015,58.72457],[28.131699,59.300825],[27.98112,59.47537],[27.981127,59.475373],[29.1177,60.02805],[28.070002,60.503519],[28.07,60.50352],[30.211107,61.780028],[31.139991,62.357693],[31.516092,62.867687],[30.035872,63.552814],[30.444685,64.204453],[29.54443,64.948672],[30.21765,65.80598],[29.054589,66.944286],[29.977426,67.698297],[28.445944,68.364613],[28.59193,69.064777],[29.39955,69.15692],[31.101042,69.558101],[31.10108,69.55811],[32.13272,69.90595],[33.77547,69.30142],[36.51396,69.06342],[40.29234,67.9324],[41.05987,67.45713],[41.12595,66.79158],[40.01583,66.26618],[38.38295,65.99953],[33.91871,66.75961],[33.18444,66.63253],[34.81477,65.90015],[34.878574,65.436213],[34.94391,64.41437],[36.23129,64.10945],[37.01273,63.84983],[37.14197,64.33471],[36.539579,64.76446],[37.17604,65.14322],[39.59345,64.52079],[40.4356,64.76446],[39.7626,65.49682],[42.09309,66.47623],[43.01604,66.41858],[43.94975,66.06908],[44.53226,66.75634],[43.69839,67.35245],[44.18795,67.95051],[43.45282,68.57079],[46.25,68.25],[46.82134,67.68997],[45.55517,67.56652],[45.56202,67.01005],[46.34915,66.66767],[47.89416,66.88455],[48.13876,67.52238],[50.22766,67.99867],[53.71743,68.85738],[54.47171,68.80815],[53.48582,68.20131],[54.72628,68.09702],[55.44268,68.43866],[57.31702,68.46628],[58.802,68.88082],[59.94142,68.27844],[61.07784,68.94069],[60.03,69.52],[60.55,69.85],[63.504,69.54739],[64.888115,69.234835],[68.51216,68.09233],[69.18068,68.61563],[68.16444,69.14436],[68.13522,69.35649],[66.93008,69.45461],[67.25976,69.92873],[66.72492,70.70889],[66.69466,71.02897],[68.54006,71.9345],[69.19636,72.84336],[69.94,73.04],[72.58754,72.77629],[72.79603,72.22006],[71.84811,71.40898],[72.47011,71.09019],[72.79188,70.39114],[72.5647,69.02085],[73.66787,68.4079],[73.2387,67.7404],[71.28,66.32],[72.42301,66.17267],[72.82077,66.53267],[73.92099,66.78946],[74.18651,67.28429],[75.052,67.76047],[74.46926,68.32899],[74.93584,68.98918],[73.84236,69.07146],[73.60187,69.62763],[74.3998,70.63175],[73.1011,71.44717],[74.89082,72.12119],[74.65926,72.83227],[75.15801,72.85497],[75.68351,72.30056],[75.28898,71.33556],[76.35911,71.15287],[75.90313,71.87401],[77.57665,72.26717],[79.65202,72.32011],[81.5,71.75],[80.61071,72.58285],[80.51109,73.6482],[82.25,73.85],[84.65526,73.80591],[86.8223,73.93688],[86.00956,74.45967],[87.16682,75.11643],[88.31571,75.14393],[90.26,75.64],[92.90058,75.77333],[93.23421,76.0472],[95.86,76.14],[96.67821,75.91548],[98.92254,76.44689],[100.75967,76.43028],[101.03532,76.86189],[101.99084,77.28754],[104.3516,77.69792],[106.06664,77.37389],[104.705,77.1274],[106.97013,76.97419],[107.24,76.48],[108.1538,76.72335],[111.07726,76.71],[113.33151,76.22224],[114.13417,75.84764],[113.88539,75.32779],[112.77918,75.03186],[110.15125,74.47673],[109.4,74.18],[110.64,74.04],[112.11919,73.78774],[113.01954,73.97693],[113.52958,73.33505],[113.96881,73.59488],[115.56782,73.75285],[118.77633,73.58772],[119.02,73.12],[123.20066,72.97122],[123.25777,73.73503],[125.38,73.56],[126.97644,73.56549],[128.59126,73.03871],[129.05157,72.39872],[128.46,71.98],[129.71599,71.19304],[131.28858,70.78699],[132.2535,71.8363],[133.85766,71.38642],[135.56193,71.65525],[137.49755,71.34763],[138.23409,71.62803],[139.86983,71.48783],[139.14791,72.41619],[140.46817,72.84941],[149.5,72.2],[150.35118,71.60643],[152.9689,70.84222],[157.00688,71.03141],[158.99779,70.86672],[159.83031,70.45324],[159.70866,69.72198],[160.94053,69.43728],[162.27907,69.64204],[164.05248,69.66823],[165.94037,69.47199],[167.83567,69.58269],[169.57763,68.6938],[170.81688,69.01363],[170.0082,69.65276],[170.45345,70.09703],[173.64391,69.81743],[175.72403,69.87725],[178.6,69.4],[180,68.963636],[180,64.979709],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.780005,42.22001],[130.780004,42.220008],[130.78,42.22],[130.779992,42.22001],[130.64,42.395],[130.64,42.395024],[130.633866,42.903015],[131.144688,42.92999],[131.288555,44.11152],[131.02519,44.96796],[131.883454,45.321162],[133.09712,45.14409],[133.769644,46.116927],[134.11235,47.21248],[134.50081,47.57845],[135.026311,48.47823],[133.373596,48.183442],[132.50669,47.78896],[130.98726,47.79013],[130.582293,48.729687],[129.397818,49.4406],[127.6574,49.76027],[127.287456,50.739797],[126.939157,51.353894],[126.564399,51.784255],[125.946349,52.792799],[125.068211,53.161045],[123.57147,53.4588],[122.245748,53.431726],[121.003085,53.251401],[120.177089,52.753886],[120.725789,52.516226],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.288461,50.142883],[117.879244,49.510983],[116.678801,49.888531],[115.485695,49.805177],[114.96211,50.140247],[114.362456,50.248303],[112.89774,49.543565],[111.581231,49.377968],[110.662011,49.130128],[109.402449,49.292961],[108.475167,49.282548],[107.868176,49.793705],[106.888804,50.274296],[105.886591,50.406019],[104.62158,50.27532],[103.676545,50.089966],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.516856],[99.981732,51.634006],[98.861491,52.047366],[97.82574,51.010995],[98.231762,50.422401],[97.25976,49.72605],[95.81402,49.97746],[94.815949,50.013433],[94.147566,50.480537],[93.10421,50.49529],[92.234712,50.802171],[90.713667,50.331812],[88.805567,49.470521],[87.751264,49.297198],[87.35997,49.214981],[86.829357,49.826675],[85.54127,49.692859],[85.11556,50.117303],[84.416377,50.3114],[83.935115,50.889246],[83.383004,51.069183],[81.945986,50.812196],[80.568447,51.388336],[80.03556,50.864751],[77.800916,53.404415],[76.525179,54.177003],[76.8911,54.490524],[74.38482,53.54685],[73.425679,53.48981],[73.508516,54.035617],[72.22415,54.376655],[71.180131,54.133285],[70.865267,55.169734],[69.068167,55.38525],[68.1691,54.970392],[65.66687,54.60125],[65.178534,54.354228],[61.4366,54.00625],[60.978066,53.664993],[61.699986,52.979996],[60.739993,52.719986],[60.927269,52.447548],[59.967534,51.96042],[61.588003,51.272659],[61.337424,50.79907],[59.932807,50.842194],[59.642282,50.545442],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.532878,51.02624],[52.328724,51.718652],[50.766648,51.692762],[48.702382,50.605128],[48.577841,49.87476],[47.54948,50.454698],[46.751596,49.356006],[47.043672,49.152039],[46.466446,48.394152],[47.31524,47.71585],[48.05725,47.74377],[48.694734,47.075628],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[48.584353,41.808869]]],[[[21.268449,55.190482],[22.315724,55.015299],[22.757764,54.856574],[22.651052,54.582741],[22.731099,54.327537],[20.892245,54.312525],[19.66064,54.426084],[19.888481,54.86616],[21.268449,55.190482]]],[[[33.435988,45.971917],[33.699462,46.219573],[34.410402,46.005162],[34.732017,45.965666],[34.861792,45.768182],[35.012659,45.737725],[35.020788,45.651219],[35.510009,45.409993],[36.529998,45.46999],[36.334713,45.113216],[35.239999,44.939996],[33.882511,44.361479],[33.326421,44.564877],[33.546924,45.034771],[32.454174,45.327466],[32.630804,45.519186],[33.588162,45.851569],[33.435988,45.971917]]],[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225476],[142.654786,54.365881],[142.914616,53.704578],[143.260848,52.74076],[143.235268,51.75666],[143.648007,50.7476]]],[[[-175.01425,66.58435],[-174.33983,66.33556],[-174.57182,67.06219],[-171.85731,66.91308],[-169.89958,65.97724],[-170.89107,65.54139],[-172.53025,65.43791],[-172.555,64.46079],[-172.95533,64.25269],[-173.89184,64.2826],[-174.65392,64.63125],[-175.98353,64.92288],[-176.20716,65.35667],[-177.22266,65.52024],[-178.35993,65.39052],[-178.90332,65.74044],[-178.68611,66.11211],[-179.88377,65.87456],[-179.43268,65.40411],[-180,64.979709],[-180,68.963636],[-177.55,68.2],[-174.92825,67.20589],[-175.01425,66.58435]]],[[[180,70.832199],[178.903425,70.78114],[178.7253,71.0988],[180,71.515714],[180,70.832199]]],[[[-178.69378,70.89302],[-180,70.832199],[-180,71.515714],[-179.871875,71.55762],[-179.02433,71.55553],[-177.577945,71.26948],[-177.663575,71.13277],[-178.69378,70.89302]]],[[[143.60385,73.21244],[142.08763,73.20544],[140.038155,73.31692],[139.86312,73.36983],[140.81171,73.76506],[142.06207,73.85758],[143.48283,73.47525],[143.60385,73.21244]]],[[[150.73167,75.08406],[149.575925,74.68892],[147.977465,74.778355],[146.11919,75.17298],[146.358485,75.49682],[148.22223,75.345845],[150.73167,75.08406]]],[[[145.086285,75.562625],[144.3,74.82],[140.61381,74.84768],[138.95544,74.61148],[136.97439,75.26167],[137.51176,75.94917],[138.831075,76.13676],[141.471615,76.09289],[145.086285,75.562625]]],[[[57.535693,70.720464],[56.944979,70.632743],[53.677375,70.762658],[53.412017,71.206662],[51.601895,71.474759],[51.455754,72.014881],[52.478275,72.229442],[52.444169,72.774731],[54.427614,73.627548],[53.50829,73.749814],[55.902459,74.627486],[55.631933,75.081412],[57.868644,75.60939],[61.170044,76.251883],[64.498368,76.439055],[66.210977,76.809782],[68.15706,76.939697],[68.852211,76.544811],[68.180573,76.233642],[64.637326,75.737755],[61.583508,75.260885],[58.477082,74.309056],[56.986786,73.333044],[55.419336,72.371268],[55.622838,71.540595],[57.535693,70.720464]]],[[[105.07547,78.30689],[99.43814,77.921],[101.2649,79.23399],[102.08635,79.34641],[102.837815,79.28129],[105.37243,78.71334],[105.07547,78.30689]]],[[[51.136187,80.54728],[49.793685,80.415428],[48.894411,80.339567],[48.754937,80.175468],[47.586119,80.010181],[46.502826,80.247247],[47.072455,80.559424],[44.846958,80.58981],[46.799139,80.771918],[48.318477,80.78401],[48.522806,80.514569],[49.09719,80.753986],[50.039768,80.918885],[51.522933,80.699726],[51.136187,80.54728]]],[[[99.93976,78.88094],[97.75794,78.7562],[94.97259,79.044745],[93.31288,79.4265],[92.5454,80.14379],[91.18107,80.34146],[93.77766,81.0246],[95.940895,81.2504],[97.88385,80.746975],[100.186655,79.780135],[99.93976,78.88094]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Rwanda","SOV_A3":"RWA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Rwanda","ADM0_A3":"RWA","GEOU_DIF":0,"GEOUNIT":"Rwanda","GU_A3":"RWA","SU_DIF":0,"SUBUNIT":"Rwanda","SU_A3":"RWA","BRK_DIFF":0,"NAME":"Rwanda","NAME_LONG":"Rwanda","BRK_A3":"RWA","BRK_NAME":"Rwanda","BRK_GROUP":null,"ABBREV":"Rwa.","POSTAL":"RW","FORMAL_EN":"Republic of Rwanda","FORMAL_FR":null,"NAME_CIAWF":"Rwanda","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Rwanda","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":2,"MAPCOLOR9":3,"MAPCOLOR13":10,"POP_EST":11901484,"POP_RANK":14,"GDP_MD_EST":21970,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"RW","ISO_A2":"RW","ISO_A3":"RWA","ISO_A3_EH":"RWA","ISO_N3":"646","UN_A3":"646","WB_A2":"RW","WB_A3":"RWA","WOE_ID":23424937,"WOE_ID_EH":23424937,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"RWA","ADM0_A3_US":"RWA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[29.024926,-2.917858,30.816135,-1.134659],"geometry":{"type":"Polygon","coordinates":[[[30.469674,-2.413855],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.46967,-2.41383],[30.469674,-2.413855]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":7,"SOVEREIGNT":"Western Sahara","SOV_A3":"SAH","ADM0_DIF":0,"LEVEL":2,"TYPE":"Indeterminate","ADMIN":"Western Sahara","ADM0_A3":"SAH","GEOU_DIF":0,"GEOUNIT":"Western Sahara","GU_A3":"SAH","SU_DIF":0,"SUBUNIT":"Western Sahara","SU_A3":"SAH","BRK_DIFF":1,"NAME":"W. Sahara","NAME_LONG":"Western Sahara","BRK_A3":"B28","BRK_NAME":"W. Sahara","BRK_GROUP":null,"ABBREV":"W. Sah.","POSTAL":"WS","FORMAL_EN":"Sahrawi Arab Democratic Republic","FORMAL_FR":null,"NAME_CIAWF":"Western Sahara","NOTE_ADM0":"Self admin.","NOTE_BRK":"Self admin.; Claimed by Morocco","NAME_SORT":"Western Sahara","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":7,"MAPCOLOR9":4,"MAPCOLOR13":4,"POP_EST":603253,"POP_RANK":11,"GDP_MD_EST":906.5,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2007,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"WI","ISO_A2":"EH","ISO_A3":"ESH","ISO_A3_EH":"ESH","ISO_N3":"732","UN_A3":"732","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424990,"WOE_ID_EH":23424990,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"MAR","ADM0_A3_US":"SAH","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":9,"LONG_LEN":14,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":4.7,"MIN_LABEL":6,"MAX_LABEL":11},"bbox":[-17.063423,20.999752,-8.665124,27.656426],"geometry":{"type":"Polygon","coordinates":[[[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[-14.221168,22.310163],[-13.89111,23.691009],[-12.500963,24.770116],[-12.030759,26.030866],[-11.71822,26.104092],[-11.392555,26.883424],[-10.551263,26.990808],[-10.189424,26.860945],[-9.735343,26.860945],[-9.413037,27.088476],[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Saudi Arabia","SOV_A3":"SAU","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Saudi Arabia","ADM0_A3":"SAU","GEOU_DIF":0,"GEOUNIT":"Saudi Arabia","GU_A3":"SAU","SU_DIF":0,"SUBUNIT":"Saudi Arabia","SU_A3":"SAU","BRK_DIFF":0,"NAME":"Saudi Arabia","NAME_LONG":"Saudi Arabia","BRK_A3":"SAU","BRK_NAME":"Saudi Arabia","BRK_GROUP":null,"ABBREV":"Saud.","POSTAL":"SA","FORMAL_EN":"Kingdom of Saudi Arabia","FORMAL_FR":null,"NAME_CIAWF":"Saudi Arabia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Saudi Arabia","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":7,"POP_EST":28571770,"POP_RANK":15,"GDP_MD_EST":1731000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"SA","ISO_A2":"SA","ISO_A3":"SAU","ISO_A3_EH":"SAU","ISO_N3":"682","UN_A3":"682","WB_A2":"SA","WB_A3":"SAU","WOE_ID":23424938,"WOE_ID_EH":23424938,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SAU","ADM0_A3_US":"SAU","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2.7,"MAX_LABEL":7},"bbox":[34.632336,16.347891,55.666659,32.161009],"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.617708,24.014219],[52.000733,23.001154],[55.006803,22.496948],[55.208341,22.70833],[55.666659,22.000001],[54.999982,19.999994],[52.00001,19.000003],[49.116672,18.616668],[48.183344,18.166669],[47.466695,17.116682],[47.000005,16.949999],[46.749994,17.283338],[46.366659,17.233315],[45.399999,17.333335],[45.216651,17.433329],[44.062613,17.410359],[43.791519,17.319977],[43.380794,17.579987],[43.115798,17.08844],[43.218375,16.66689],[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627,25.602959],[36.639604,25.826228],[36.249137,26.570136],[35.640182,27.37652],[35.130187,28.063352],[34.632336,28.058546],[34.787779,28.607427],[34.83222,28.957483],[34.956037,29.356555],[36.068941,29.197495],[36.501214,29.505254],[36.740528,29.865283],[37.503582,30.003776],[37.66812,30.338665],[37.998849,30.5085],[37.002166,31.508413],[39.004886,32.010217],[39.195468,32.161009],[40.399994,31.889992],[41.889981,31.190009],[44.709499,29.178891],[46.568713,29.099025],[47.459822,29.002519],[47.708851,28.526063],[48.416094,28.552004],[48.807595,27.689628],[49.299554,27.461218],[49.470914,27.109999],[50.152422,26.689663],[50.212935,26.277027],[50.113303,25.943972],[50.239859,25.60805],[50.527387,25.327808],[50.660557,24.999896],[50.810108,24.754743],[51.112415,24.556331],[51.389608,24.627386],[51.579519,24.245497]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Sudan","SOV_A3":"SDN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Sudan","ADM0_A3":"SDN","GEOU_DIF":0,"GEOUNIT":"Sudan","GU_A3":"SDN","SU_DIF":0,"SUBUNIT":"Sudan","SU_A3":"SDN","BRK_DIFF":0,"NAME":"Sudan","NAME_LONG":"Sudan","BRK_A3":"SDN","BRK_NAME":"Sudan","BRK_GROUP":null,"ABBREV":"Sudan","POSTAL":"SD","FORMAL_EN":"Republic of the Sudan","FORMAL_FR":null,"NAME_CIAWF":"Sudan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sudan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":4,"MAPCOLOR13":1,"POP_EST":37345935,"POP_RANK":15,"GDP_MD_EST":176300,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"SU","ISO_A2":"SD","ISO_A3":"SDN","ISO_A3_EH":"SDN","ISO_N3":"729","UN_A3":"729","WB_A2":"SD","WB_A3":"SDN","WOE_ID":-90,"WOE_ID_EH":23424952,"WOE_NOTE":"Almost all FLickr photos are in the north.","ADM0_A3_IS":"SDN","ADM0_A3_US":"SDN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[21.93681,8.229188,38.41009,22],"geometry":{"type":"Polygon","coordinates":[[[24.567369,8.229188],[23.805813,8.666319],[23.459013,8.954286],[23.394779,9.265068],[23.55725,9.681218],[23.554304,10.089255],[22.977544,10.714463],[22.864165,11.142395],[22.87622,11.38461],[22.50869,11.67936],[22.49762,12.26024],[22.28801,12.64605],[21.93681,12.58818],[22.03759,12.95546],[22.29658,13.37232],[22.18329,13.78648],[22.51202,14.09318],[22.30351,14.32682],[22.56795,14.94429],[23.02459,15.68072],[23.88689,15.61084],[23.83766,19.58047],[23.85,20],[25,20.00304],[25,22],[29.02,22],[32.9,22],[36.86623,22],[37.18872,21.01885],[36.96941,20.83744],[37.1147,19.80796],[37.48179,18.61409],[37.86276,18.36786],[38.41009,17.998307],[37.904,17.42754],[37.16747,17.26314],[36.85253,16.95655],[36.75389,16.29186],[36.32322,14.82249],[36.42951,14.42211],[36.27022,13.56333],[35.86363,12.57828],[35.26049,12.08286],[34.83163,11.31896],[34.73115,10.91017],[34.25745,10.63009],[33.96162,9.58358],[33.97498,8.68456],[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074],[29.000932,9.604232],[28.966597,9.398224],[27.97089,9.398224],[27.833551,9.604232],[27.112521,9.638567],[26.752006,9.466893],[26.477328,9.55273],[25.962307,10.136421],[25.790633,10.411099],[25.069604,10.27376],[24.794926,9.810241],[24.537415,8.917538],[24.194068,8.728696],[23.88698,8.61973],[24.567369,8.229188]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"South Sudan","SOV_A3":"SDS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"South Sudan","ADM0_A3":"SDS","GEOU_DIF":0,"GEOUNIT":"South Sudan","GU_A3":"SDS","SU_DIF":0,"SUBUNIT":"South Sudan","SU_A3":"SDS","BRK_DIFF":0,"NAME":"S. Sudan","NAME_LONG":"South Sudan","BRK_A3":"SDS","BRK_NAME":"S. Sudan","BRK_GROUP":null,"ABBREV":"S. Sud.","POSTAL":"SS","FORMAL_EN":"Republic of South Sudan","FORMAL_FR":null,"NAME_CIAWF":"South Sudan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"South Sudan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":5,"POP_EST":13026129,"POP_RANK":14,"GDP_MD_EST":20880,"POP_YEAR":2017,"LASTCENSUS":2008,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"SS","ISO_A3":"SSD","ISO_A3_EH":"SSD","ISO_N3":"728","UN_A3":"728","WB_A2":"SS","WB_A3":"SSD","WOE_ID":-99,"WOE_ID_EH":-99,"WOE_NOTE":"Includes states of 20069899, 20069897, 20069898, 20069901, 20069909, and 20069908 but maybe more?","ADM0_A3_IS":"SSD","ADM0_A3_US":"SDS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":11,"ABBREV_LEN":7,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[23.88698,3.509172,35.298007,12.248008],"geometry":{"type":"Polygon","coordinates":[[[27.374226,5.233944],[27.213409,5.550953],[26.465909,5.946717],[26.213418,6.546603],[25.796648,6.979316],[25.124131,7.500085],[25.114932,7.825104],[24.567369,8.229188],[23.88698,8.61973],[24.194068,8.728696],[24.537415,8.917538],[24.794926,9.810241],[25.069604,10.27376],[25.790633,10.411099],[25.962307,10.136421],[26.477328,9.55273],[26.752006,9.466893],[27.112521,9.638567],[27.833551,9.604232],[27.97089,9.398224],[28.966597,9.398224],[29.000932,9.604232],[29.515953,9.793074],[29.618957,10.084919],[29.996639,10.290927],[30.837841,9.707237],[31.352862,9.810241],[31.850716,10.531271],[32.400072,11.080626],[32.314235,11.681484],[32.073892,11.97333],[32.67475,12.024832],[32.743419,12.248008],[33.206938,12.179338],[33.086766,11.441141],[33.206938,10.720112],[33.721959,10.325262],[33.842131,9.981915],[33.824963,9.484061],[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.833852,3.509172],[29.9535,4.173699],[29.715995,4.600805],[29.159078,4.389267],[28.696678,4.455077],[28.428994,4.287155],[27.979977,4.408413],[27.374226,5.233944]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Senegal","SOV_A3":"SEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Senegal","ADM0_A3":"SEN","GEOU_DIF":0,"GEOUNIT":"Senegal","GU_A3":"SEN","SU_DIF":0,"SUBUNIT":"Senegal","SU_A3":"SEN","BRK_DIFF":0,"NAME":"Senegal","NAME_LONG":"Senegal","BRK_A3":"SEN","BRK_NAME":"Senegal","BRK_GROUP":null,"ABBREV":"Sen.","POSTAL":"SN","FORMAL_EN":"Republic of Senegal","FORMAL_FR":null,"NAME_CIAWF":"Senegal","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Senegal","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":5,"POP_EST":14668522,"POP_RANK":14,"GDP_MD_EST":39720,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"SG","ISO_A2":"SN","ISO_A3":"SEN","ISO_A3_EH":"SEN","ISO_N3":"686","UN_A3":"686","WB_A2":"SN","WB_A3":"SEN","WOE_ID":23424943,"WOE_ID_EH":23424943,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SEN","ADM0_A3_US":"SEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-17.625043,12.33209,-11.467899,16.598264],"geometry":{"type":"Polygon","coordinates":[[[-11.513943,12.442988],[-11.658301,12.386583],[-12.203565,12.465648],[-12.278599,12.35444],[-12.499051,12.33209],[-13.217818,12.575874],[-13.700476,12.586183],[-15.548477,12.62817],[-15.816574,12.515567],[-16.147717,12.547762],[-16.677452,12.384852],[-16.841525,13.151394],[-15.931296,13.130284],[-15.691001,13.270353],[-15.511813,13.27857],[-15.141163,13.509512],[-14.712197,13.298207],[-14.277702,13.280585],[-13.844963,13.505042],[-14.046992,13.794068],[-14.376714,13.62568],[-14.687031,13.630357],[-15.081735,13.876492],[-15.39877,13.860369],[-15.624596,13.623587],[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.141214],[-11.467899,12.754519],[-11.513943,12.442988]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Solomon Islands","SOV_A3":"SLB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Solomon Islands","ADM0_A3":"SLB","GEOU_DIF":0,"GEOUNIT":"Solomon Islands","GU_A3":"SLB","SU_DIF":0,"SUBUNIT":"Solomon Islands","SU_A3":"SLB","BRK_DIFF":0,"NAME":"Solomon Is.","NAME_LONG":"Solomon Islands","BRK_A3":"SLB","BRK_NAME":"Solomon Is.","BRK_GROUP":null,"ABBREV":"S. Is.","POSTAL":"SB","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":"Solomon Islands","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Solomon Islands","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":6,"POP_EST":647581,"POP_RANK":11,"GDP_MD_EST":1198,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"BP","ISO_A2":"SB","ISO_A3":"SLB","ISO_A3_EH":"SLB","ISO_N3":"090","UN_A3":"090","WB_A2":"SB","WB_A3":"SLB","WOE_ID":23424766,"WOE_ID_EH":23424766,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SLB","ADM0_A3_US":"SLB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":15,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[156.491358,-10.826367,162.398646,-6.599338],"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.784312],[160.788253,-8.917543],[160.579997,-8.320009],[160.920028,-8.320009],[161.280006,-9.120011],[161.679982,-9.599982]]],[[[159.875027,-8.33732],[159.917402,-8.53829],[159.133677,-8.114181],[158.586114,-7.754824],[158.21115,-7.421872],[158.359978,-7.320018],[158.820001,-7.560003],[159.640003,-8.020027],[159.875027,-8.33732]]],[[[157.538426,-7.34782],[157.33942,-7.404767],[156.90203,-7.176874],[156.491358,-6.765943],[156.542828,-6.599338],[157.14,-7.021638],[157.538426,-7.34782]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Sierra Leone","SOV_A3":"SLE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Sierra Leone","ADM0_A3":"SLE","GEOU_DIF":0,"GEOUNIT":"Sierra Leone","GU_A3":"SLE","SU_DIF":0,"SUBUNIT":"Sierra Leone","SU_A3":"SLE","BRK_DIFF":0,"NAME":"Sierra Leone","NAME_LONG":"Sierra Leone","BRK_A3":"SLE","BRK_NAME":"Sierra Leone","BRK_GROUP":null,"ABBREV":"S.L.","POSTAL":"SL","FORMAL_EN":"Republic of Sierra Leone","FORMAL_FR":null,"NAME_CIAWF":"Sierra Leone","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sierra Leone","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":1,"MAPCOLOR13":7,"POP_EST":6163195,"POP_RANK":13,"GDP_MD_EST":10640,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"SL","ISO_A2":"SL","ISO_A3":"SLE","ISO_A3_EH":"SLE","ISO_N3":"694","UN_A3":"694","WB_A2":"SL","WB_A3":"SLE","WOE_ID":23424946,"WOE_ID_EH":23424946,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SLE","ADM0_A3_US":"SLE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-13.24655,6.785917,-10.230094,10.046984],"geometry":{"type":"Polygon","coordinates":[[[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230094,8.406206],[-10.695595,7.939464],[-11.146704,7.396706],[-11.199802,7.105846],[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"El Salvador","SOV_A3":"SLV","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"El Salvador","ADM0_A3":"SLV","GEOU_DIF":0,"GEOUNIT":"El Salvador","GU_A3":"SLV","SU_DIF":0,"SUBUNIT":"El Salvador","SU_A3":"SLV","BRK_DIFF":0,"NAME":"El Salvador","NAME_LONG":"El Salvador","BRK_A3":"SLV","BRK_NAME":"El Salvador","BRK_GROUP":null,"ABBREV":"El. S.","POSTAL":"SV","FORMAL_EN":"Republic of El Salvador","FORMAL_FR":null,"NAME_CIAWF":"El Salvador","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"El Salvador","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":6,"MAPCOLOR13":8,"POP_EST":6172011,"POP_RANK":13,"GDP_MD_EST":54790,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"ES","ISO_A2":"SV","ISO_A3":"SLV","ISO_A3_EH":"SLV","ISO_N3":"222","UN_A3":"222","WB_A2":"SV","WB_A3":"SLV","WOE_ID":23424807,"WOE_ID_EH":23424807,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SLV","ADM0_A3_US":"SLV","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Central America","REGION_WB":"Latin America & Caribbean","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[-90.095555,13.149017,-87.723503,14.424133],"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.964626],[-87.859515,13.893312],[-87.723503,13.78505],[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Somaliland","SOV_A3":"SOL","ADM0_DIF":0,"LEVEL":2,"TYPE":"Indeterminate","ADMIN":"Somaliland","ADM0_A3":"SOL","GEOU_DIF":0,"GEOUNIT":"Somaliland","GU_A3":"SOL","SU_DIF":0,"SUBUNIT":"Somaliland","SU_A3":"SOL","BRK_DIFF":1,"NAME":"Somaliland","NAME_LONG":"Somaliland","BRK_A3":"B30","BRK_NAME":"Somaliland","BRK_GROUP":null,"ABBREV":"Solnd.","POSTAL":"SL","FORMAL_EN":"Republic of Somaliland","FORMAL_FR":null,"NAME_CIAWF":null,"NOTE_ADM0":"Self admin.","NOTE_BRK":"Self admin.; Claimed by Somalia","NAME_SORT":"Somaliland","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":2,"POP_EST":3500000,"POP_RANK":12,"GDP_MD_EST":12250,"POP_YEAR":2013,"LASTCENSUS":-99,"GDP_YEAR":2013,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"-99","ISO_A2":"-99","ISO_A3":"-99","ISO_A3_EH":"-99","ISO_N3":"-99","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":-99,"WOE_ID_EH":-99,"WOE_NOTE":"Includes old states of 2347021, 2347020, 2347017 and portion of 2347016.","ADM0_A3_IS":"SOM","ADM0_A3_US":"SOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":4,"MIN_LABEL":4.5,"MAX_LABEL":9},"bbox":[42.55876,7.99688,48.948206,11.46204],"geometry":{"type":"Polygon","coordinates":[[[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378784,11.375482],[48.948206,11.410622],[48.948205,11.410617],[48.948205,11.410617],[48.942005,11.394266],[48.938491,10.982327],[48.938233,9.9735],[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.94834,7.99688],[43.67875,9.18358],[43.29699,9.54048],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Somalia","SOV_A3":"SOM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Somalia","ADM0_A3":"SOM","GEOU_DIF":0,"GEOUNIT":"Somalia","GU_A3":"SOM","SU_DIF":0,"SUBUNIT":"Somalia","SU_A3":"SOM","BRK_DIFF":0,"NAME":"Somalia","NAME_LONG":"Somalia","BRK_A3":"SOM","BRK_NAME":"Somalia","BRK_GROUP":null,"ABBREV":"Som.","POSTAL":"SO","FORMAL_EN":"Federal Republic of Somalia","FORMAL_FR":null,"NAME_CIAWF":"Somalia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Somalia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":8,"MAPCOLOR9":6,"MAPCOLOR13":7,"POP_EST":7531386,"POP_RANK":13,"GDP_MD_EST":4719,"POP_YEAR":2017,"LASTCENSUS":1987,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"SO","ISO_A2":"SO","ISO_A3":"SOM","ISO_A3_EH":"SOM","ISO_N3":"706","UN_A3":"706","WB_A2":"SO","WB_A3":"SOM","WOE_ID":-90,"WOE_ID_EH":23424949,"WOE_NOTE":"Includes Somaliland (2347021, 2347020, 2347017 and portion of 2347016)","ADM0_A3_IS":"SOM","ADM0_A3_US":"SOM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[40.98105,-1.68325,51.13387,12.02464],"geometry":{"type":"Polygon","coordinates":[[[41.855083,3.918912],[42.12861,4.23413],[42.76967,4.25259],[43.66087,4.95755],[44.9636,5.00162],[47.78942,8.003],[48.486736,8.837626],[48.93813,9.451749],[48.938233,9.9735],[48.938491,10.982327],[48.942005,11.394266],[48.948205,11.410617],[48.948205,11.410617],[49.26776,11.43033],[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[40.993,-0.85829],[40.98105,2.78452],[41.855083,3.918912]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Republic of Serbia","SOV_A3":"SRB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Republic of Serbia","ADM0_A3":"SRB","GEOU_DIF":0,"GEOUNIT":"Republic of Serbia","GU_A3":"SRB","SU_DIF":0,"SUBUNIT":"Republic of Serbia","SU_A3":"SRB","BRK_DIFF":0,"NAME":"Serbia","NAME_LONG":"Serbia","BRK_A3":"SRB","BRK_NAME":"Serbia","BRK_GROUP":null,"ABBREV":"Serb.","POSTAL":"RS","FORMAL_EN":"Republic of Serbia","FORMAL_FR":null,"NAME_CIAWF":"Serbia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Serbia","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":7111024,"POP_RANK":13,"GDP_MD_EST":101800,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"RI","ISO_A2":"RS","ISO_A3":"SRB","ISO_A3_EH":"SRB","ISO_N3":"688","UN_A3":"688","WB_A2":"YF","WB_A3":"SRB","WOE_ID":-90,"WOE_ID_EH":20069818,"WOE_NOTE":"Expired WOE also contains Kosovo.","ADM0_A3_IS":"SRB","ADM0_A3_US":"SRB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":7},"bbox":[18.829825,42.245224,22.986019,46.17173],"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54332,42.32025],[21.66292,42.43922],[21.77505,42.6827],[21.63302,42.67717],[21.43866,42.86255],[21.27421,42.90959],[21.143395,43.068685],[20.95651,43.13094],[20.81448,43.27205],[20.63508,43.21671],[20.49679,42.88469],[20.25758,42.81275],[20.3398,42.89852],[19.95857,43.10604],[19.63,43.21378],[19.48389,43.35229],[19.21852,43.52384],[19.454,43.5681],[19.59976,44.03847],[19.11761,44.42307],[19.36803,44.863],[19.00548,44.86023],[19.005485,44.860234],[19.390476,45.236516],[19.072769,45.521511],[18.829825,45.908872],[18.829838,45.908878],[19.596045,46.17173],[20.220192,46.127469],[20.762175,45.734573],[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Suriname","SOV_A3":"SUR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Suriname","ADM0_A3":"SUR","GEOU_DIF":0,"GEOUNIT":"Suriname","GU_A3":"SUR","SU_DIF":0,"SUBUNIT":"Suriname","SU_A3":"SUR","BRK_DIFF":0,"NAME":"Suriname","NAME_LONG":"Suriname","BRK_A3":"SUR","BRK_NAME":"Suriname","BRK_GROUP":null,"ABBREV":"Sur.","POSTAL":"SR","FORMAL_EN":"Republic of Suriname","FORMAL_FR":null,"NAME_CIAWF":"Suriname","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Suriname","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":7,"MAPCOLOR13":6,"POP_EST":591919,"POP_RANK":11,"GDP_MD_EST":8547,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"NS","ISO_A2":"SR","ISO_A3":"SUR","ISO_A3_EH":"SUR","ISO_N3":"740","UN_A3":"740","WB_A2":"SR","WB_A3":"SUR","WOE_ID":23424913,"WOE_ID_EH":23424913,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SUR","ADM0_A3_US":"SUR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[-58.044694,1.817667,-53.958045,6.025291],"geometry":{"type":"Polygon","coordinates":[[[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899523],[-57.150098,2.768927],[-57.281433,3.333492],[-57.601569,3.334655],[-58.044694,4.060864],[-57.86021,4.576801],[-57.914289,4.812626],[-57.307246,5.073567],[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.011504,3.62257],[-54.184284,3.194172],[-54.27123,2.738748],[-54.524754,2.311849]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Slovakia","SOV_A3":"SVK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Slovakia","ADM0_A3":"SVK","GEOU_DIF":0,"GEOUNIT":"Slovakia","GU_A3":"SVK","SU_DIF":0,"SUBUNIT":"Slovakia","SU_A3":"SVK","BRK_DIFF":0,"NAME":"Slovakia","NAME_LONG":"Slovakia","BRK_A3":"SVK","BRK_NAME":"Slovakia","BRK_GROUP":null,"ABBREV":"Svk.","POSTAL":"SK","FORMAL_EN":"Slovak Republic","FORMAL_FR":null,"NAME_CIAWF":"Slovakia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Slovak Republic","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":4,"MAPCOLOR9":4,"MAPCOLOR13":9,"POP_EST":5445829,"POP_RANK":13,"GDP_MD_EST":168800,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"LO","ISO_A2":"SK","ISO_A3":"SVK","ISO_A3_EH":"SVK","ISO_N3":"703","UN_A3":"703","WB_A2":"SK","WB_A3":"SVK","WOE_ID":23424877,"WOE_ID_EH":23424877,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SVK","ADM0_A3_US":"SVK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[16.879983,47.758429,22.558138,49.571574],"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.879983,48.470013],[16.960288,48.596982],[17.101985,48.816969],[17.545007,48.800019],[17.886485,48.903475],[17.913512,48.996493],[18.104973,49.043983],[18.170498,49.271515],[18.399994,49.315001],[18.554971,49.495015],[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48.081768],[18.696513,47.880954],[17.857133,47.758429],[17.488473,47.867466],[16.979667,48.123497]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Slovenia","SOV_A3":"SVN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Slovenia","ADM0_A3":"SVN","GEOU_DIF":0,"GEOUNIT":"Slovenia","GU_A3":"SVN","SU_DIF":0,"SUBUNIT":"Slovenia","SU_A3":"SVN","BRK_DIFF":0,"NAME":"Slovenia","NAME_LONG":"Slovenia","BRK_A3":"SVN","BRK_NAME":"Slovenia","BRK_GROUP":null,"ABBREV":"Slo.","POSTAL":"SLO","FORMAL_EN":"Republic of Slovenia","FORMAL_FR":null,"NAME_CIAWF":"Slovenia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Slovenia","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":2,"MAPCOLOR13":12,"POP_EST":1972126,"POP_RANK":12,"GDP_MD_EST":68350,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"SI","ISO_A2":"SI","ISO_A3":"SVN","ISO_A3_EH":"SVN","ISO_N3":"705","UN_A3":"705","WB_A2":"SI","WB_A3":"SVN","WOE_ID":23424945,"WOE_ID_EH":23424945,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SVN","ADM0_A3_US":"SVN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Southern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[13.69811,45.452316,16.564808,46.852386],"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.509306]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Sweden","SOV_A3":"SWE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Sweden","ADM0_A3":"SWE","GEOU_DIF":0,"GEOUNIT":"Sweden","GU_A3":"SWE","SU_DIF":0,"SUBUNIT":"Sweden","SU_A3":"SWE","BRK_DIFF":0,"NAME":"Sweden","NAME_LONG":"Sweden","BRK_A3":"SWE","BRK_NAME":"Sweden","BRK_GROUP":null,"ABBREV":"Swe.","POSTAL":"S","FORMAL_EN":"Kingdom of Sweden","FORMAL_FR":null,"NAME_CIAWF":"Sweden","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Sweden","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":4,"MAPCOLOR9":2,"MAPCOLOR13":4,"POP_EST":9960487,"POP_RANK":13,"GDP_MD_EST":498100,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":-99,"FIPS_10_":"SW","ISO_A2":"SE","ISO_A3":"SWE","ISO_A3_EH":"SWE","ISO_N3":"752","UN_A3":"752","WB_A2":"SE","WB_A3":"SWE","WOE_ID":23424954,"WOE_ID_EH":23424954,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SWE","ADM0_A3_US":"SWE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Northern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[11.027369,55.361737,23.903379,69.106247],"geometry":{"type":"Polygon","coordinates":[[[20.645593,69.106247],[21.978535,68.616846],[23.539473,67.936009],[23.56588,66.396051],[23.903379,66.006927],[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856149],[11.468272,59.432393],[12.300366,60.117933],[12.631147,61.293572],[11.992064,61.800362],[11.930569,63.128318],[12.579935,64.066219],[13.571916,64.049114],[13.919905,64.445421],[13.55569,64.787028],[15.108411,66.193867],[16.108712,67.302456],[16.768879,68.013937],[17.729182,68.010552],[17.993868,68.567391],[19.87856,68.407194],[20.025269,69.065139],[20.645593,69.106247]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Swaziland","SOV_A3":"SWZ","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Swaziland","ADM0_A3":"SWZ","GEOU_DIF":0,"GEOUNIT":"Swaziland","GU_A3":"SWZ","SU_DIF":0,"SUBUNIT":"Swaziland","SU_A3":"SWZ","BRK_DIFF":0,"NAME":"Swaziland","NAME_LONG":"Swaziland","BRK_A3":"SWZ","BRK_NAME":"Swaziland","BRK_GROUP":null,"ABBREV":"Swz.","POSTAL":"SW","FORMAL_EN":"Kingdom of Swaziland","FORMAL_FR":null,"NAME_CIAWF":"Swaziland","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Swaziland","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":1467152,"POP_RANK":12,"GDP_MD_EST":11060,"POP_YEAR":2017,"LASTCENSUS":2007,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"WZ","ISO_A2":"SZ","ISO_A3":"SWZ","ISO_A3_EH":"SWZ","ISO_N3":"748","UN_A3":"748","WB_A2":"SZ","WB_A3":"SWZ","WOE_ID":23424993,"WOE_ID_EH":23424993,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SWZ","ADM0_A3_US":"SWZ","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[30.676609,-27.285879,32.071665,-25.660191],"geometry":{"type":"Polygon","coordinates":[[[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Syria","SOV_A3":"SYR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Syria","ADM0_A3":"SYR","GEOU_DIF":0,"GEOUNIT":"Syria","GU_A3":"SYR","SU_DIF":0,"SUBUNIT":"Syria","SU_A3":"SYR","BRK_DIFF":0,"NAME":"Syria","NAME_LONG":"Syria","BRK_A3":"SYR","BRK_NAME":"Syria","BRK_GROUP":null,"ABBREV":"Syria","POSTAL":"SYR","FORMAL_EN":"Syrian Arab Republic","FORMAL_FR":null,"NAME_CIAWF":"Syria","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Syrian Arab Republic","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":6,"POP_EST":18028549,"POP_RANK":14,"GDP_MD_EST":50280,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2015,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"SY","ISO_A2":"SY","ISO_A3":"SYR","ISO_A3_EH":"SYR","ISO_N3":"760","UN_A3":"760","WB_A2":"SY","WB_A3":"SYR","WOE_ID":23424956,"WOE_ID_EH":23424956,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"SYR","ADM0_A3_US":"SYR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[35.700798,32.312938,42.349591,37.229873],"geometry":{"type":"Polygon","coordinates":[[[42.349591,37.229873],[41.837064,36.605854],[41.289707,36.358815],[41.383965,35.628317],[41.006159,34.419372],[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.712927],[39.52258,36.716054],[40.673259,37.091276],[41.212089,37.074352],[42.349591,37.229873]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Chad","SOV_A3":"TCD","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Chad","ADM0_A3":"TCD","GEOU_DIF":0,"GEOUNIT":"Chad","GU_A3":"TCD","SU_DIF":0,"SUBUNIT":"Chad","SU_A3":"TCD","BRK_DIFF":0,"NAME":"Chad","NAME_LONG":"Chad","BRK_A3":"TCD","BRK_NAME":"Chad","BRK_GROUP":null,"ABBREV":"Chad","POSTAL":"TD","FORMAL_EN":"Republic of Chad","FORMAL_FR":null,"NAME_CIAWF":"Chad","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Chad","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":1,"MAPCOLOR9":8,"MAPCOLOR13":6,"POP_EST":12075985,"POP_RANK":14,"GDP_MD_EST":30590,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"CD","ISO_A2":"TD","ISO_A3":"TCD","ISO_A3_EH":"TCD","ISO_N3":"148","UN_A3":"148","WB_A2":"TD","WB_A3":"TCD","WOE_ID":23424777,"WOE_ID_EH":23424777,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TCD","ADM0_A3_US":"TCD","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Middle Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[13.540394,7.421925,23.88689,23.40972],"geometry":{"type":"Polygon","coordinates":[[[22.864165,11.142395],[22.231129,10.971889],[21.723822,10.567056],[21.000868,9.475985],[20.059685,9.012706],[19.094008,9.074847],[18.81201,8.982915],[18.911022,8.630895],[18.389555,8.281304],[17.96493,7.890914],[16.705988,7.508328],[16.456185,7.734774],[16.290562,7.754307],[16.106232,7.497088],[15.27946,7.421925],[15.436092,7.692812],[15.120866,8.38215],[14.979996,8.796104],[14.544467,8.965861],[13.954218,9.549495],[14.171466,10.021378],[14.627201,9.920919],[14.909354,9.992129],[15.467873,9.982337],[14.923565,10.891325],[14.960152,11.555574],[14.89336,12.21905],[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459,15.68072],[22.56795,14.94429],[22.30351,14.32682],[22.51202,14.09318],[22.18329,13.78648],[22.29658,13.37232],[22.03759,12.95546],[21.93681,12.58818],[22.28801,12.64605],[22.49762,12.26024],[22.50869,11.67936],[22.87622,11.38461],[22.864165,11.142395]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":6,"SOVEREIGNT":"Togo","SOV_A3":"TGO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Togo","ADM0_A3":"TGO","GEOU_DIF":0,"GEOUNIT":"Togo","GU_A3":"TGO","SU_DIF":0,"SUBUNIT":"Togo","SU_A3":"TGO","BRK_DIFF":0,"NAME":"Togo","NAME_LONG":"Togo","BRK_A3":"TGO","BRK_NAME":"Togo","BRK_GROUP":null,"ABBREV":"Togo","POSTAL":"TG","FORMAL_EN":"Togolese Republic","FORMAL_FR":"République Togolaise","NAME_CIAWF":"Togo","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Togo","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":1,"MAPCOLOR9":3,"MAPCOLOR13":5,"POP_EST":7965055,"POP_RANK":13,"GDP_MD_EST":11610,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"TO","ISO_A2":"TG","ISO_A3":"TGO","ISO_A3_EH":"TGO","ISO_N3":"768","UN_A3":"768","WB_A2":"TG","WB_A3":"TGO","WOE_ID":23424965,"WOE_ID_EH":23424965,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TGO","ADM0_A3_US":"TGO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Western Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":4,"LONG_LEN":4,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":5,"MAX_LABEL":10},"bbox":[-0.049785,5.928837,1.865241,11.018682],"geometry":{"type":"Polygon","coordinates":[[[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Thailand","SOV_A3":"THA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Thailand","ADM0_A3":"THA","GEOU_DIF":0,"GEOUNIT":"Thailand","GU_A3":"THA","SU_DIF":0,"SUBUNIT":"Thailand","SU_A3":"THA","BRK_DIFF":0,"NAME":"Thailand","NAME_LONG":"Thailand","BRK_A3":"THA","BRK_NAME":"Thailand","BRK_GROUP":null,"ABBREV":"Thai.","POSTAL":"TH","FORMAL_EN":"Kingdom of Thailand","FORMAL_FR":null,"NAME_CIAWF":"Thailand","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Thailand","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":8,"MAPCOLOR13":1,"POP_EST":68414135,"POP_RANK":16,"GDP_MD_EST":1161000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"TH","ISO_A2":"TH","ISO_A3":"THA","ISO_A3_EH":"THA","ISO_N3":"764","UN_A3":"764","WB_A2":"TH","WB_A3":"THA","WOE_ID":23424960,"WOE_ID_EH":23424960,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"THA","ADM0_A3_US":"THA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[97.375896,5.691384,105.589039,20.41785],"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Tajikistan","SOV_A3":"TJK","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Tajikistan","ADM0_A3":"TJK","GEOU_DIF":0,"GEOUNIT":"Tajikistan","GU_A3":"TJK","SU_DIF":0,"SUBUNIT":"Tajikistan","SU_A3":"TJK","BRK_DIFF":0,"NAME":"Tajikistan","NAME_LONG":"Tajikistan","BRK_A3":"TJK","BRK_NAME":"Tajikistan","BRK_GROUP":null,"ABBREV":"Tjk.","POSTAL":"TJ","FORMAL_EN":"Republic of Tajikistan","FORMAL_FR":null,"NAME_CIAWF":"Tajikistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tajikistan","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":8468555,"POP_RANK":13,"GDP_MD_EST":25810,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"TI","ISO_A2":"TJ","ISO_A3":"TJK","ISO_A3_EH":"TJK","ISO_N3":"762","UN_A3":"762","WB_A2":"TJ","WB_A3":"TJK","WOE_ID":23424961,"WOE_ID_EH":23424961,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TJK","ADM0_A3_US":"TJK","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[67.44222,36.738171,74.980002,40.960213],"geometry":{"type":"Polygon","coordinates":[[[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,37.065645],[71.541918,37.905774],[71.239404,37.953265],[71.348131,38.258905],[70.806821,38.486282],[70.376304,38.138396],[70.270574,37.735165],[70.116578,37.588223],[69.518785,37.608997],[69.196273,37.151144],[68.859446,37.344336],[68.135562,37.023115],[67.83,37.144994],[68.392033,38.157025],[68.176025,38.901553],[67.44222,39.140144],[67.701429,39.580478],[68.536416,39.533453],[69.011633,40.086158],[69.329495,40.727824],[70.666622,40.960213],[70.45816,40.496495],[70.601407,40.218527],[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Turkmenistan","SOV_A3":"TKM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Turkmenistan","ADM0_A3":"TKM","GEOU_DIF":0,"GEOUNIT":"Turkmenistan","GU_A3":"TKM","SU_DIF":0,"SUBUNIT":"Turkmenistan","SU_A3":"TKM","BRK_DIFF":0,"NAME":"Turkmenistan","NAME_LONG":"Turkmenistan","BRK_A3":"TKM","BRK_NAME":"Turkmenistan","BRK_GROUP":null,"ABBREV":"Turkm.","POSTAL":"TM","FORMAL_EN":"Turkmenistan","FORMAL_FR":null,"NAME_CIAWF":"Turkmenistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Turkmenistan","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":2,"MAPCOLOR9":1,"MAPCOLOR13":9,"POP_EST":5351277,"POP_RANK":13,"GDP_MD_EST":94720,"POP_YEAR":2017,"LASTCENSUS":1995,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"TX","ISO_A2":"TM","ISO_A3":"TKM","ISO_A3_EH":"TKM","ISO_N3":"795","UN_A3":"795","WB_A2":"TM","WB_A3":"TKM","WOE_ID":23424972,"WOE_ID_EH":23424972,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TKM","ADM0_A3_US":"TKM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[52.50246,35.270664,66.54615,42.751551],"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.217385,37.39379],[65.745631,37.661164],[65.588948,37.305217],[64.746105,37.111818],[64.546479,36.312073],[63.982896,36.007957],[63.193538,35.857166],[62.984662,35.404041],[62.230651,35.270664],[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858139,40.631034],[54.736845,40.951015],[54.008311,41.551211],[53.721713,42.123191],[52.91675,41.868117],[52.814689,41.135371],[52.50246,41.783316],[52.944293,42.116034],[54.079418,42.324109],[54.755345,42.043971],[55.455251,41.259859],[55.968191,41.308642],[57.096391,41.32231],[56.932215,41.826026],[57.78653,42.170553],[58.629011,42.751551],[59.976422,42.223082],[60.083341,41.425146],[60.465953,41.220327],[61.547179,41.26637],[61.882714,41.084857],[62.37426,40.053886],[63.518015,39.363257],[64.170223,38.892407],[65.215999,38.402695],[66.54615,37.974685],[66.518607,37.362784]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"East Timor","SOV_A3":"TLS","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"East Timor","ADM0_A3":"TLS","GEOU_DIF":0,"GEOUNIT":"East Timor","GU_A3":"TLS","SU_DIF":0,"SUBUNIT":"East Timor","SU_A3":"TLS","BRK_DIFF":0,"NAME":"Timor-Leste","NAME_LONG":"Timor-Leste","BRK_A3":"TLS","BRK_NAME":"Timor-Leste","BRK_GROUP":null,"ABBREV":"T.L.","POSTAL":"TL","FORMAL_EN":"Democratic Republic of Timor-Leste","FORMAL_FR":null,"NAME_CIAWF":"Timor-Leste","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Timor-Leste","NAME_ALT":"East Timor","MAPCOLOR7":2,"MAPCOLOR8":2,"MAPCOLOR9":4,"MAPCOLOR13":3,"POP_EST":1291358,"POP_RANK":12,"GDP_MD_EST":4975,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"TT","ISO_A2":"TL","ISO_A3":"TLS","ISO_A3_EH":"TLS","ISO_N3":"626","UN_A3":"626","WB_A2":"TP","WB_A3":"TMP","WOE_ID":23424968,"WOE_ID_EH":23424968,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TLS","ADM0_A3_US":"TLS","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":11,"LONG_LEN":11,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[124.968682,-9.393173,127.335928,-8.273345],"geometry":{"type":"Polygon","coordinates":[[[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":5,"SOVEREIGNT":"Trinidad and Tobago","SOV_A3":"TTO","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Trinidad and Tobago","ADM0_A3":"TTO","GEOU_DIF":0,"GEOUNIT":"Trinidad and Tobago","GU_A3":"TTO","SU_DIF":0,"SUBUNIT":"Trinidad and Tobago","SU_A3":"TTO","BRK_DIFF":0,"NAME":"Trinidad and Tobago","NAME_LONG":"Trinidad and Tobago","BRK_A3":"TTO","BRK_NAME":"Trinidad and Tobago","BRK_GROUP":null,"ABBREV":"Tr.T.","POSTAL":"TT","FORMAL_EN":"Republic of Trinidad and Tobago","FORMAL_FR":null,"NAME_CIAWF":"Trinidad and Tobago","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Trinidad and Tobago","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":5,"POP_EST":1218208,"POP_RANK":12,"GDP_MD_EST":43570,"POP_YEAR":2017,"LASTCENSUS":2011,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"TD","ISO_A2":"TT","ISO_A3":"TTO","ISO_A3_EH":"TTO","ISO_N3":"780","UN_A3":"780","WB_A2":"TT","WB_A3":"TTO","WOE_ID":23424958,"WOE_ID_EH":23424958,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TTO","ADM0_A3_US":"TTO","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Caribbean","REGION_WB":"Latin America & Caribbean","NAME_LEN":19,"LONG_LEN":19,"ABBREV_LEN":5,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4.5,"MAX_LABEL":9.5},"bbox":[-61.95,10,-60.895,10.89],"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Tunisia","SOV_A3":"TUN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Tunisia","ADM0_A3":"TUN","GEOU_DIF":0,"GEOUNIT":"Tunisia","GU_A3":"TUN","SU_DIF":0,"SUBUNIT":"Tunisia","SU_A3":"TUN","BRK_DIFF":0,"NAME":"Tunisia","NAME_LONG":"Tunisia","BRK_A3":"TUN","BRK_NAME":"Tunisia","BRK_GROUP":null,"ABBREV":"Tun.","POSTAL":"TN","FORMAL_EN":"Republic of Tunisia","FORMAL_FR":null,"NAME_CIAWF":"Tunisia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tunisia","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":2,"POP_EST":11403800,"POP_RANK":14,"GDP_MD_EST":130800,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"TS","ISO_A2":"TN","ISO_A3":"TUN","ISO_A3_EH":"TUN","ISO_N3":"788","UN_A3":"788","WB_A2":"TN","WB_A3":"TUN","WOE_ID":23424967,"WOE_ID_EH":23424967,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TUN","ADM0_A3_US":"TUN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Northern Africa","REGION_WB":"Middle East & North Africa","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[7.524482,30.307556,11.488787,37.349994],"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807847,34.833507],[10.149593,34.330773],[10.339659,33.785742],[10.856836,33.76874],[11.108501,33.293343],[11.488787,33.136996],[11.432253,32.368903],[10.94479,32.081815],[10.636901,31.761421],[9.950225,31.37607],[10.056575,30.961831],[9.970017,30.539325],[9.48214,30.307556]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Turkey","SOV_A3":"TUR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Turkey","ADM0_A3":"TUR","GEOU_DIF":0,"GEOUNIT":"Turkey","GU_A3":"TUR","SU_DIF":0,"SUBUNIT":"Turkey","SU_A3":"TUR","BRK_DIFF":0,"NAME":"Turkey","NAME_LONG":"Turkey","BRK_A3":"TUR","BRK_NAME":"Turkey","BRK_GROUP":null,"ABBREV":"Tur.","POSTAL":"TR","FORMAL_EN":"Republic of Turkey","FORMAL_FR":null,"NAME_CIAWF":"Turkey","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Turkey","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":8,"MAPCOLOR13":4,"POP_EST":80845215,"POP_RANK":16,"GDP_MD_EST":1670000,"POP_YEAR":2017,"LASTCENSUS":2000,"GDP_YEAR":2016,"ECONOMY":"4. Emerging region: MIKT","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"TU","ISO_A2":"TR","ISO_A3":"TUR","ISO_A3_EH":"TUR","ISO_N3":"792","UN_A3":"792","WB_A2":"TR","WB_A3":"TUR","WOE_ID":23424969,"WOE_ID_EH":23424969,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TUR","ADM0_A3_US":"TUR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[26.043351,35.821535,44.79399,42.141485],"geometry":{"type":"MultiPolygon","coordinates":[[[[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.77267,37.17045],[44.772677,37.170437],[44.293452,37.001514],[43.942259,37.256228],[42.779126,37.385264],[42.349591,37.229873],[41.212089,37.074352],[40.673259,37.091276],[39.52258,36.716054],[38.699891,36.712927],[38.167727,36.90121],[37.066761,36.623036],[36.739494,36.81752],[36.685389,36.259699],[36.41755,36.040617],[36.149763,35.821535],[35.782085,36.274995],[36.160822,36.650606],[35.550936,36.565443],[34.714553,36.795532],[34.026895,36.21996],[32.509158,36.107564],[31.699595,36.644275],[30.621625,36.677865],[30.391096,36.262981],[29.699976,36.144357],[28.732903,36.676831],[27.641187,36.658822],[27.048768,37.653361],[26.318218,38.208133],[26.8047,38.98576],[26.170785,39.463612],[27.28002,40.420014],[28.819978,40.460011],[29.240004,41.219991],[31.145934,41.087622],[32.347979,41.736264],[33.513283,42.01896],[35.167704,42.040225],[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143]]],[[[26.117042,41.826905],[27.135739,42.141485],[27.99672,42.007359],[28.115525,41.622886],[28.988443,41.299934],[28.806438,41.054962],[27.619017,40.999823],[27.192377,40.690566],[26.358009,40.151994],[26.043351,40.617754],[26.056942,40.824123],[26.294602,40.936261],[26.604196,41.562115],[26.117042,41.826905]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Taiwan","SOV_A3":"TWN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Taiwan","ADM0_A3":"TWN","GEOU_DIF":0,"GEOUNIT":"Taiwan","GU_A3":"TWN","SU_DIF":0,"SUBUNIT":"Taiwan","SU_A3":"TWN","BRK_DIFF":1,"NAME":"Taiwan","NAME_LONG":"Taiwan","BRK_A3":"B77","BRK_NAME":"Taiwan","BRK_GROUP":null,"ABBREV":"Taiwan","POSTAL":"TW","FORMAL_EN":null,"FORMAL_FR":null,"NAME_CIAWF":"Taiwan","NOTE_ADM0":null,"NOTE_BRK":"Self admin.; Claimed by China","NAME_SORT":"Taiwan","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":7,"MAPCOLOR13":2,"POP_EST":23508428,"POP_RANK":15,"GDP_MD_EST":1127000,"POP_YEAR":2017,"LASTCENSUS":-99,"GDP_YEAR":2016,"ECONOMY":"2. Developed region: nonG7","INCOME_GRP":"2. High income: nonOECD","WIKIPEDIA":-99,"FIPS_10_":"TW","ISO_A2":"TW","ISO_A3":"TWN","ISO_A3_EH":"TWN","ISO_N3":"158","UN_A3":"-099","WB_A2":"-99","WB_A3":"-99","WOE_ID":23424971,"WOE_ID_EH":23424971,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TWN","ADM0_A3_US":"TWN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[120.106189,21.970571,121.951244,25.295459],"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"United Republic of Tanzania","SOV_A3":"TZA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"United Republic of Tanzania","ADM0_A3":"TZA","GEOU_DIF":0,"GEOUNIT":"Tanzania","GU_A3":"TZA","SU_DIF":0,"SUBUNIT":"Tanzania","SU_A3":"TZA","BRK_DIFF":0,"NAME":"Tanzania","NAME_LONG":"Tanzania","BRK_A3":"TZA","BRK_NAME":"Tanzania","BRK_GROUP":null,"ABBREV":"Tanz.","POSTAL":"TZ","FORMAL_EN":"United Republic of Tanzania","FORMAL_FR":null,"NAME_CIAWF":"Tanzania","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Tanzania","NAME_ALT":null,"MAPCOLOR7":3,"MAPCOLOR8":6,"MAPCOLOR9":2,"MAPCOLOR13":2,"POP_EST":53950935,"POP_RANK":16,"GDP_MD_EST":150600,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"TZ","ISO_A2":"TZ","ISO_A3":"TZA","ISO_A3_EH":"TZA","ISO_N3":"834","UN_A3":"834","WB_A2":"TZ","WB_A3":"TZA","WOE_ID":23424973,"WOE_ID_EH":23424973,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"TZA","ADM0_A3_US":"TZA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[29.339998,-11.720938,40.31659,-0.95],"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.753512,-4.452389],[30.11632,-4.09012],[30.50554,-3.56858],[30.75224,-3.35931],[30.74301,-3.03431],[30.52766,-2.80762],[30.469674,-2.413855],[30.46967,-2.41383],[30.758309,-2.28725],[30.816135,-1.698914],[30.419105,-1.134659],[30.76986,-1.01455],[31.86617,-1.02736],[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.316586,-10.317098],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876],[36.775151,-11.594537],[36.514082,-11.720938],[35.312398,-11.439146],[34.559989,-11.52002],[34.28,-10.16],[33.940838,-9.693674],[33.73972,-9.41715],[32.759375,-9.230599],[32.191865,-8.930359],[31.556348,-8.762049],[31.157751,-8.594579],[30.74001,-8.340006],[30.740015,-8.340007],[30.199997,-7.079981],[29.620032,-6.520015],[29.419993,-5.939999],[29.519987,-5.419979],[29.339998,-4.499983]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Uganda","SOV_A3":"UGA","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Uganda","ADM0_A3":"UGA","GEOU_DIF":0,"GEOUNIT":"Uganda","GU_A3":"UGA","SU_DIF":0,"SUBUNIT":"Uganda","SU_A3":"UGA","BRK_DIFF":0,"NAME":"Uganda","NAME_LONG":"Uganda","BRK_A3":"UGA","BRK_NAME":"Uganda","BRK_GROUP":null,"ABBREV":"Uga.","POSTAL":"UG","FORMAL_EN":"Republic of Uganda","FORMAL_FR":null,"NAME_CIAWF":"Uganda","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uganda","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":6,"MAPCOLOR13":4,"POP_EST":39570125,"POP_RANK":15,"GDP_MD_EST":84930,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"UG","ISO_A2":"UG","ISO_A3":"UGA","ISO_A3_EH":"UGA","ISO_N3":"800","UN_A3":"800","WB_A2":"UG","WB_A3":"UGA","WOE_ID":23424974,"WOE_ID_EH":23424974,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"UGA","ADM0_A3_US":"UGA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[29.579466,-1.443322,35.03599,4.249885],"geometry":{"type":"Polygon","coordinates":[[[29.579466,-1.341313],[29.587838,-0.587406],[29.819503,-0.20531],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.773347,2.339883],[30.83386,3.509166],[30.833852,3.509172],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5556],[34.59607,3.05374],[35.03599,1.90584],[34.6721,1.17694],[34.18,0.515],[33.893569,0.109814],[33.903711,-0.95],[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Ukraine","SOV_A3":"UKR","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Ukraine","ADM0_A3":"UKR","GEOU_DIF":0,"GEOUNIT":"Ukraine","GU_A3":"UKR","SU_DIF":0,"SUBUNIT":"Ukraine","SU_A3":"UKR","BRK_DIFF":0,"NAME":"Ukraine","NAME_LONG":"Ukraine","BRK_A3":"UKR","BRK_NAME":"Ukraine","BRK_GROUP":null,"ABBREV":"Ukr.","POSTAL":"UA","FORMAL_EN":"Ukraine","FORMAL_FR":null,"NAME_CIAWF":"Ukraine","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Ukraine","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":1,"MAPCOLOR9":6,"MAPCOLOR13":3,"POP_EST":44033874,"POP_RANK":15,"GDP_MD_EST":352600,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"UP","ISO_A2":"UA","ISO_A3":"UKR","ISO_A3_EH":"UKR","ISO_N3":"804","UN_A3":"804","WB_A2":"UA","WB_A3":"UKR","WOE_ID":23424976,"WOE_ID_EH":23424976,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"UKR","ADM0_A3_US":"UKR","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Europe","REGION_UN":"Europe","SUBREGION":"Eastern Europe","REGION_WB":"Europe & Central Asia","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7},"bbox":[22.085608,45.293308,40.080789,52.335075],"geometry":{"type":"Polygon","coordinates":[[[23.527071,51.578454],[24.005078,51.617444],[24.553106,51.888461],[25.327788,51.910656],[26.337959,51.832289],[27.454066,51.592303],[28.241615,51.572227],[28.617613,51.427714],[28.992835,51.602044],[29.254938,51.368234],[30.157364,51.416138],[30.555117,51.319503],[30.619454,51.822806],[30.927549,52.042353],[31.785992,52.101678],[32.15944,52.06125],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.37791,50.77394],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.06904,49.60105],[40.080789,49.30743],[39.67465,48.78382],[39.89562,48.23241],[39.738278,47.898937],[38.77057,47.82562],[38.255112,47.5464],[38.223538,47.10219],[37.425137,47.022221],[36.759855,46.6987],[35.823685,46.645964],[34.962342,46.273197],[35.012659,45.737725],[34.861792,45.768182],[34.732017,45.965666],[34.410402,46.005162],[33.699462,46.219573],[33.435988,45.971917],[33.298567,46.080598],[31.74414,46.333348],[31.675307,46.706245],[30.748749,46.5831],[30.377609,46.03241],[29.603289,45.293308],[29.149725,45.464925],[28.679779,45.304031],[28.233554,45.488283],[28.485269,45.596907],[28.659987,45.939987],[28.933717,46.25883],[28.862972,46.437889],[29.072107,46.517678],[29.170654,46.379262],[29.759972,46.349988],[30.024659,46.423937],[29.83821,46.525326],[29.908852,46.674361],[29.559674,46.928583],[29.415135,47.346645],[29.050868,47.510227],[29.122698,47.849095],[28.670891,48.118149],[28.259547,48.155562],[27.522537,48.467119],[26.857824,48.368211],[26.619337,48.220726],[26.19745,48.220881],[25.945941,47.987149],[25.207743,47.891056],[24.866317,47.737526],[24.402056,47.981878],[23.760958,47.985598],[23.142236,48.096341],[22.710531,47.882194],[22.64082,48.15024],[22.085608,48.422264],[22.280842,48.825392],[22.558138,49.085738],[22.776419,49.027395],[22.51845,49.476774],[23.426508,50.308506],[23.922757,50.424881],[24.029986,50.705407],[23.527071,51.578454]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Uruguay","SOV_A3":"URY","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Uruguay","ADM0_A3":"URY","GEOU_DIF":0,"GEOUNIT":"Uruguay","GU_A3":"URY","SU_DIF":0,"SUBUNIT":"Uruguay","SU_A3":"URY","BRK_DIFF":0,"NAME":"Uruguay","NAME_LONG":"Uruguay","BRK_A3":"URY","BRK_NAME":"Uruguay","BRK_GROUP":null,"ABBREV":"Ury.","POSTAL":"UY","FORMAL_EN":"Oriental Republic of Uruguay","FORMAL_FR":null,"NAME_CIAWF":"Uruguay","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uruguay","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":2,"MAPCOLOR9":2,"MAPCOLOR13":10,"POP_EST":3360148,"POP_RANK":12,"GDP_MD_EST":73250,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"UY","ISO_A2":"UY","ISO_A3":"URY","ISO_A3_EH":"URY","ISO_N3":"858","UN_A3":"858","WB_A2":"UY","WB_A3":"URY","WOE_ID":23424979,"WOE_ID_EH":23424979,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"URY","ADM0_A3_US":"URY","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[-58.427074,-34.952647,-53.209589,-30.109686],"geometry":{"type":"Polygon","coordinates":[[[-58.427074,-33.909454],[-58.349611,-33.263189],[-58.132648,-33.040567],[-58.14244,-32.044504],[-57.874937,-31.016556],[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"United States of America","SOV_A3":"US1","ADM0_DIF":1,"LEVEL":2,"TYPE":"Country","ADMIN":"United States of America","ADM0_A3":"USA","GEOU_DIF":0,"GEOUNIT":"United States of America","GU_A3":"USA","SU_DIF":0,"SUBUNIT":"United States","SU_A3":"USA","BRK_DIFF":0,"NAME":"United States of America","NAME_LONG":"United States","BRK_A3":"USA","BRK_NAME":"United States","BRK_GROUP":null,"ABBREV":"U.S.A.","POSTAL":"US","FORMAL_EN":"United States of America","FORMAL_FR":null,"NAME_CIAWF":"United States","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"United States of America","NAME_ALT":null,"MAPCOLOR7":4,"MAPCOLOR8":5,"MAPCOLOR9":1,"MAPCOLOR13":1,"POP_EST":326625791,"POP_RANK":17,"GDP_MD_EST":18560000,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"1. Developed region: G7","INCOME_GRP":"1. High income: OECD","WIKIPEDIA":0,"FIPS_10_":"US","ISO_A2":"US","ISO_A3":"USA","ISO_A3_EH":"USA","ISO_N3":"840","UN_A3":"840","WB_A2":"US","WB_A3":"USA","WOE_ID":23424977,"WOE_ID_EH":23424977,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"USA","ADM0_A3_US":"USA","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"North America","REGION_UN":"Americas","SUBREGION":"Northern America","REGION_WB":"North America","NAME_LEN":24,"LONG_LEN":13,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":5.7},"bbox":[-171.791111,18.91619,-66.96466,71.357764],"geometry":{"type":"MultiPolygon","coordinates":[[[[-122.84,49],[-120,49],[-117.03121,49],[-116.04818,49],[-113,49],[-110.05,49],[-107.05,49],[-104.04826,48.99986],[-100.65,49],[-97.22872,49.0007],[-95.15907,49],[-95.15609,49.38425],[-94.81758,49.38905],[-94.64,48.84],[-94.32914,48.67074],[-93.63087,48.60926],[-92.61,48.45],[-91.64,48.14],[-90.83,48.27],[-89.6,48.01],[-89.272917,48.019808],[-88.378114,48.302918],[-87.439793,47.94],[-86.461991,47.553338],[-85.652363,47.220219],[-84.87608,46.900083],[-84.779238,46.637102],[-84.543749,46.538684],[-84.6049,46.4396],[-84.3367,46.40877],[-84.14212,46.512226],[-84.091851,46.275419],[-83.890765,46.116927],[-83.616131,46.116927],[-83.469551,45.994686],[-83.592851,45.816894],[-82.550925,45.347517],[-82.337763,44.44],[-82.137642,43.571088],[-82.43,42.98],[-82.9,42.43],[-83.12,42.08],[-83.142,41.975681],[-83.02981,41.832796],[-82.690089,41.675105],[-82.439278,41.675105],[-81.277747,42.209026],[-80.247448,42.3662],[-78.939362,42.863611],[-78.92,42.965],[-79.01,43.27],[-79.171674,43.466339],[-78.72028,43.625089],[-77.737885,43.629056],[-76.820034,43.628784],[-76.5,44.018459],[-76.375,44.09631],[-75.31821,44.81645],[-74.867,45.00048],[-73.34783,45.00738],[-71.50506,45.0082],[-71.405,45.255],[-71.08482,45.30524],[-70.66,45.46],[-70.305,45.915],[-69.99997,46.69307],[-69.237216,47.447781],[-68.905,47.185],[-68.23444,47.35486],[-67.79046,47.06636],[-67.79134,45.70281],[-67.13741,45.13753],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.645476,43.090238],[-70.81489,42.8653],[-70.825,42.335],[-70.495,41.805],[-70.08,41.78],[-70.185,42.145],[-69.88497,41.92283],[-69.96503,41.63717],[-70.64,41.475],[-71.12039,41.49445],[-71.86,41.32],[-72.295,41.27],[-72.87643,41.22065],[-73.71,40.931102],[-72.24126,41.11948],[-71.945,40.93],[-73.345,40.63],[-73.982,40.628],[-73.952325,40.75075],[-74.25671,40.47351],[-73.96244,40.42763],[-74.17838,39.70926],[-74.90604,38.93954],[-74.98041,39.1964],[-75.20002,39.24845],[-75.52805,39.4985],[-75.32,38.96],[-75.071835,38.782032],[-75.05673,38.40412],[-75.37747,38.01551],[-75.94023,37.21689],[-76.03127,37.2566],[-75.72205,37.93705],[-76.23287,38.319215],[-76.35,39.15],[-76.542725,38.717615],[-76.32933,38.08326],[-76.989998,38.239992],[-76.30162,37.917945],[-76.25874,36.9664],[-75.9718,36.89726],[-75.86804,36.55125],[-75.72749,35.55074],[-76.36318,34.80854],[-77.397635,34.51201],[-78.05496,33.92547],[-78.55435,33.86133],[-79.06067,33.49395],[-79.20357,33.15839],[-80.301325,32.509355],[-80.86498,32.0333],[-81.33629,31.44049],[-81.49042,30.72999],[-81.31371,30.03552],[-80.98,29.18],[-80.535585,28.47213],[-80.53,28.04],[-80.056539,26.88],[-80.088015,26.205765],[-80.13156,25.816775],[-80.38103,25.20616],[-80.68,25.08],[-81.17213,25.20126],[-81.33,25.64],[-81.71,25.87],[-82.24,26.73],[-82.70515,27.49504],[-82.85526,27.88624],[-82.65,28.55],[-82.93,29.1],[-83.70959,29.93656],[-84.1,30.09],[-85.10882,29.63615],[-85.28784,29.68612],[-85.7731,30.15261],[-86.4,30.4],[-87.53036,30.27433],[-88.41782,30.3849],[-89.18049,30.31598],[-89.593831,30.159994],[-89.413735,29.89419],[-89.43,29.48864],[-89.21767,29.29108],[-89.40823,29.15961],[-89.77928,29.30714],[-90.15463,29.11743],[-90.880225,29.148535],[-91.626785,29.677],[-92.49906,29.5523],[-93.22637,29.78375],[-93.84842,29.71363],[-94.69,29.48],[-95.60026,28.73863],[-96.59404,28.30748],[-97.14,27.83],[-97.37,27.38],[-97.38,26.69],[-97.33,26.21],[-97.14,25.87],[-97.53,25.84],[-98.24,26.06],[-99.02,26.37],[-99.3,26.84],[-99.52,27.54],[-100.11,28.11],[-100.45584,28.69612],[-100.9576,29.38071],[-101.6624,29.7793],[-102.48,29.76],[-103.11,28.97],[-103.94,29.27],[-104.45697,29.57196],[-104.70575,30.12173],[-105.03737,30.64402],[-105.63159,31.08383],[-106.1429,31.39995],[-106.50759,31.75452],[-108.24,31.754854],[-108.24194,31.34222],[-109.035,31.34194],[-111.02361,31.33472],[-113.30498,32.03914],[-114.815,32.52528],[-114.72139,32.72083],[-115.99135,32.61239],[-117.12776,32.53534],[-117.295938,33.046225],[-117.944,33.621236],[-118.410602,33.740909],[-118.519895,34.027782],[-119.081,34.078],[-119.438841,34.348477],[-120.36778,34.44711],[-120.62286,34.60855],[-120.74433,35.15686],[-121.71457,36.16153],[-122.54747,37.55176],[-122.51201,37.78339],[-122.95319,38.11371],[-123.7272,38.95166],[-123.86517,39.76699],[-124.39807,40.3132],[-124.17886,41.14202],[-124.2137,41.99964],[-124.53284,42.76599],[-124.14214,43.70838],[-124.020535,44.615895],[-123.89893,45.52341],[-124.079635,46.86475],[-124.39567,47.72017],[-124.68721,48.184433],[-124.566101,48.379715],[-123.12,48.04],[-122.58736,47.096],[-122.34,47.36],[-122.5,48.18],[-122.84,49]]],[[[-140.985988,69.711998],[-140.986,69.712],[-140.9925,66.00003],[-140.99778,60.30639],[-140.013,60.27682],[-139.039,60],[-138.34089,59.56211],[-137.4525,58.905],[-136.47972,59.46389],[-135.47583,59.78778],[-134.945,59.27056],[-134.27111,58.86111],[-133.35556,58.41028],[-132.73042,57.69289],[-131.70781,56.55212],[-130.00778,55.91583],[-129.98,55.285],[-130.53611,54.80278],[-130.536109,54.802754],[-130.53611,54.802753],[-131.085818,55.178906],[-131.967211,55.497776],[-132.250011,56.369996],[-133.539181,57.178887],[-134.078063,58.123068],[-135.038211,58.187715],[-136.628062,58.212209],[-137.800006,58.499995],[-139.867787,59.537762],[-140.825274,59.727517],[-142.574444,60.084447],[-143.958881,59.99918],[-145.925557,60.45861],[-147.114374,60.884656],[-148.224306,60.672989],[-148.018066,59.978329],[-148.570823,59.914173],[-149.727858,59.705658],[-150.608243,59.368211],[-151.716393,59.155821],[-151.859433,59.744984],[-151.409719,60.725803],[-150.346941,61.033588],[-150.621111,61.284425],[-151.895839,60.727198],[-152.57833,60.061657],[-154.019172,59.350279],[-153.287511,58.864728],[-154.232492,58.146374],[-155.307491,57.727795],[-156.308335,57.422774],[-156.556097,56.979985],[-158.117217,56.463608],[-158.433321,55.994154],[-159.603327,55.566686],[-160.28972,55.643581],[-161.223048,55.364735],[-162.237766,55.024187],[-163.069447,54.689737],[-164.785569,54.404173],[-164.942226,54.572225],[-163.84834,55.039431],[-162.870001,55.348043],[-161.804175,55.894986],[-160.563605,56.008055],[-160.07056,56.418055],[-158.684443,57.016675],[-158.461097,57.216921],[-157.72277,57.570001],[-157.550274,58.328326],[-157.041675,58.918885],[-158.194731,58.615802],[-158.517218,58.787781],[-159.058606,58.424186],[-159.711667,58.93139],[-159.981289,58.572549],[-160.355271,59.071123],[-161.355003,58.670838],[-161.968894,58.671665],[-162.054987,59.266925],[-161.874171,59.633621],[-162.518059,59.989724],[-163.818341,59.798056],[-164.662218,60.267484],[-165.346388,60.507496],[-165.350832,61.073895],[-166.121379,61.500019],[-165.734452,62.074997],[-164.919179,62.633076],[-164.562508,63.146378],[-163.753332,63.219449],[-163.067224,63.059459],[-162.260555,63.541936],[-161.53445,63.455817],[-160.772507,63.766108],[-160.958335,64.222799],[-161.518068,64.402788],[-160.777778,64.788604],[-161.391926,64.777235],[-162.45305,64.559445],[-162.757786,64.338605],[-163.546394,64.55916],[-164.96083,64.446945],[-166.425288,64.686672],[-166.845004,65.088896],[-168.11056,65.669997],[-166.705271,66.088318],[-164.47471,66.57666],[-163.652512,66.57666],[-163.788602,66.077207],[-161.677774,66.11612],[-162.489715,66.735565],[-163.719717,67.116395],[-164.430991,67.616338],[-165.390287,68.042772],[-166.764441,68.358877],[-166.204707,68.883031],[-164.430811,68.915535],[-163.168614,69.371115],[-162.930566,69.858062],[-161.908897,70.33333],[-160.934797,70.44769],[-159.039176,70.891642],[-158.119723,70.824721],[-156.580825,71.357764],[-155.06779,71.147776],[-154.344165,70.696409],[-153.900006,70.889989],[-152.210006,70.829992],[-152.270002,70.600006],[-150.739992,70.430017],[-149.720003,70.53001],[-147.613362,70.214035],[-145.68999,70.12001],[-144.920011,69.989992],[-143.589446,70.152514],[-142.07251,69.851938],[-140.985988,69.711998],[-140.985988,69.711998]]],[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,19.08348]]],[[[-156.07926,20.64397],[-156.41445,20.57241],[-156.58673,20.783],[-156.70167,20.8643],[-156.71055,20.92676],[-156.61258,21.01249],[-156.25711,20.91745],[-155.99566,20.76404],[-156.07926,20.64397]]],[[[-156.75824,21.17684],[-156.78933,21.06873],[-157.32521,21.09777],[-157.25027,21.21958],[-156.75824,21.17684]]],[[[-157.65283,21.32217],[-157.70703,21.26442],[-157.7786,21.27729],[-158.12667,21.31244],[-158.2538,21.53919],[-158.29265,21.57912],[-158.0252,21.71696],[-157.94161,21.65272],[-157.65283,21.32217]]],[[[-159.34512,21.982],[-159.46372,21.88299],[-159.80051,22.06533],[-159.74877,22.1382],[-159.5962,22.23618],[-159.36569,22.21494],[-159.34512,21.982]]],[[[-153.006314,57.115842],[-154.00509,56.734677],[-154.516403,56.992749],[-154.670993,57.461196],[-153.76278,57.816575],[-153.228729,57.968968],[-152.564791,57.901427],[-152.141147,57.591059],[-153.006314,57.115842]]],[[[-165.579164,59.909987],[-166.19277,59.754441],[-166.848337,59.941406],[-167.455277,60.213069],[-166.467792,60.38417],[-165.67443,60.293607],[-165.579164,59.909987]]],[[[-171.731657,63.782515],[-171.114434,63.592191],[-170.491112,63.694975],[-169.682505,63.431116],[-168.689439,63.297506],[-168.771941,63.188598],[-169.52944,62.976931],[-170.290556,63.194438],[-170.671386,63.375822],[-171.553063,63.317789],[-171.791111,63.405846],[-171.731657,63.782515]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Uzbekistan","SOV_A3":"UZB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Uzbekistan","ADM0_A3":"UZB","GEOU_DIF":0,"GEOUNIT":"Uzbekistan","GU_A3":"UZB","SU_DIF":0,"SUBUNIT":"Uzbekistan","SU_A3":"UZB","BRK_DIFF":0,"NAME":"Uzbekistan","NAME_LONG":"Uzbekistan","BRK_A3":"UZB","BRK_NAME":"Uzbekistan","BRK_GROUP":null,"ABBREV":"Uzb.","POSTAL":"UZ","FORMAL_EN":"Republic of Uzbekistan","FORMAL_FR":null,"NAME_CIAWF":"Uzbekistan","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Uzbekistan","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":29748859,"POP_RANK":15,"GDP_MD_EST":202300,"POP_YEAR":2017,"LASTCENSUS":1989,"GDP_YEAR":2016,"ECONOMY":"6. Developing region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"UZ","ISO_A2":"UZ","ISO_A3":"UZB","ISO_A3_EH":"UZB","ISO_N3":"860","UN_A3":"860","WB_A2":"UZ","WB_A3":"UZB","WOE_ID":23424980,"WOE_ID_EH":23424980,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"UZB","ADM0_A3_US":"UZB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Central Asia","REGION_WB":"Europe & Central Asia","NAME_LEN":10,"LONG_LEN":10,"ABBREV_LEN":4,"TINY":5,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[55.928917,37.144994,73.055417,45.586804],"geometry":{"type":"Polygon","coordinates":[[[67.83,37.144994],[67.075782,37.356144],[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45.586804],[58.689989,45.500014],[60.239972,44.784037],[61.05832,44.405817],[62.0133,43.504477],[63.185787,43.650075],[64.900824,43.728081],[66.098012,42.99766],[66.023392,41.994646],[66.510649,41.987644],[66.714047,41.168444],[67.985856,41.135991],[68.259896,40.662325],[68.632483,40.668681],[69.070027,41.384244],[70.388965,42.081308],[70.962315,42.266154],[71.259248,42.167711],[70.420022,41.519998],[71.157859,41.143587],[71.870115,41.3929],[73.055417,40.866033],[71.774875,40.145844],[71.014198,40.244366],[70.601407,40.218527],[70.45816,40.496495],[70.666622,40.960213],[69.329495,40.727824],[69.011633,40.086158],[68.536416,39.533453],[67.701429,39.580478],[67.44222,39.140144],[68.176025,38.901553],[68.392033,38.157025],[67.83,37.144994]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Venezuela","SOV_A3":"VEN","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Venezuela","ADM0_A3":"VEN","GEOU_DIF":0,"GEOUNIT":"Venezuela","GU_A3":"VEN","SU_DIF":0,"SUBUNIT":"Venezuela","SU_A3":"VEN","BRK_DIFF":0,"NAME":"Venezuela","NAME_LONG":"Venezuela","BRK_A3":"VEN","BRK_NAME":"Venezuela","BRK_GROUP":null,"ABBREV":"Ven.","POSTAL":"VE","FORMAL_EN":"Bolivarian Republic of Venezuela","FORMAL_FR":"República Bolivariana de Venezuela","NAME_CIAWF":"Venezuela","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Venezuela, RB","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":3,"MAPCOLOR9":1,"MAPCOLOR13":4,"POP_EST":31304016,"POP_RANK":15,"GDP_MD_EST":468600,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"VE","ISO_A2":"VE","ISO_A3":"VEN","ISO_A3_EH":"VEN","ISO_N3":"862","UN_A3":"862","WB_A2":"VE","WB_A3":"VEN","WOE_ID":23424982,"WOE_ID_EH":23424982,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"VEN","ADM0_A3_US":"VEN","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"South America","REGION_UN":"Americas","SUBREGION":"South America","REGION_WB":"Latin America & Caribbean","NAME_LEN":9,"LONG_LEN":9,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":7.5},"bbox":[-73.304952,0.724452,-59.758285,12.162307],"geometry":{"type":"Polygon","coordinates":[[[-60.733574,5.200277],[-60.601179,4.918098],[-60.966893,4.536468],[-62.08543,4.162124],[-62.804533,4.006965],[-63.093198,3.770571],[-63.888343,4.02053],[-64.628659,4.148481],[-64.816064,4.056445],[-64.368494,3.79721],[-64.408828,3.126786],[-64.269999,2.497006],[-63.422867,2.411068],[-63.368788,2.2009],[-64.083085,1.916369],[-64.199306,1.492855],[-64.611012,1.328731],[-65.354713,1.095282],[-65.548267,0.789254],[-66.325765,0.724452],[-66.876326,1.253361],[-67.181294,2.250638],[-67.447092,2.600281],[-67.809938,2.820655],[-67.303173,3.318454],[-67.337564,3.542342],[-67.621836,3.839482],[-67.823012,4.503937],[-67.744697,5.221129],[-67.521532,5.55687],[-67.34144,6.095468],[-67.695087,6.267318],[-68.265052,6.153268],[-68.985319,6.206805],[-69.38948,6.099861],[-70.093313,6.960376],[-70.674234,7.087785],[-71.960176,6.991615],[-72.198352,7.340431],[-72.444487,7.423785],[-72.479679,7.632506],[-72.360901,8.002638],[-72.439862,8.405275],[-72.660495,8.625288],[-72.78873,9.085027],[-73.304952,9.152],[-73.027604,9.73677],[-72.905286,10.450344],[-72.614658,10.821975],[-72.227575,11.108702],[-71.973922,11.608672],[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[-68.194127,10.554653],[-67.296249,10.545868],[-66.227864,10.648627],[-65.655238,10.200799],[-64.890452,10.077215],[-64.329479,10.389599],[-64.318007,10.641418],[-63.079322,10.701724],[-61.880946,10.715625],[-62.730119,10.420269],[-62.388512,9.948204],[-61.588767,9.873067],[-60.830597,9.38134],[-60.671252,8.580174],[-60.150096,8.602757],[-59.758285,8.367035],[-60.550588,7.779603],[-60.637973,7.415],[-60.295668,7.043911],[-60.543999,6.856584],[-61.159336,6.696077],[-61.139415,6.234297],[-61.410303,5.959068],[-60.733574,5.200277]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"Vietnam","SOV_A3":"VNM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Vietnam","ADM0_A3":"VNM","GEOU_DIF":0,"GEOUNIT":"Vietnam","GU_A3":"VNM","SU_DIF":0,"SUBUNIT":"Vietnam","SU_A3":"VNM","BRK_DIFF":0,"NAME":"Vietnam","NAME_LONG":"Vietnam","BRK_A3":"VNM","BRK_NAME":"Vietnam","BRK_GROUP":null,"ABBREV":"Viet.","POSTAL":"VN","FORMAL_EN":"Socialist Republic of Vietnam","FORMAL_FR":null,"NAME_CIAWF":"Vietnam","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Vietnam","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":6,"MAPCOLOR9":5,"MAPCOLOR13":4,"POP_EST":96160163,"POP_RANK":16,"GDP_MD_EST":594900,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"VM","ISO_A2":"VN","ISO_A3":"VNM","ISO_A3_EH":"VNM","ISO_N3":"704","UN_A3":"704","WB_A2":"VN","WB_A3":"VNM","WOE_ID":23424984,"WOE_ID_EH":23424984,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"VNM","ADM0_A3_US":"VNM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"South-Eastern Asia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":5,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":2,"MAX_LABEL":7},"bbox":[102.170436,8.59976,109.33527,23.352063],"geometry":{"type":"Polygon","coordinates":[[[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":4,"SOVEREIGNT":"Vanuatu","SOV_A3":"VUT","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Vanuatu","ADM0_A3":"VUT","GEOU_DIF":0,"GEOUNIT":"Vanuatu","GU_A3":"VUT","SU_DIF":0,"SUBUNIT":"Vanuatu","SU_A3":"VUT","BRK_DIFF":0,"NAME":"Vanuatu","NAME_LONG":"Vanuatu","BRK_A3":"VUT","BRK_NAME":"Vanuatu","BRK_GROUP":null,"ABBREV":"Van.","POSTAL":"VU","FORMAL_EN":"Republic of Vanuatu","FORMAL_FR":null,"NAME_CIAWF":"Vanuatu","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Vanuatu","NAME_ALT":null,"MAPCOLOR7":6,"MAPCOLOR8":3,"MAPCOLOR9":7,"MAPCOLOR13":3,"POP_EST":282814,"POP_RANK":10,"GDP_MD_EST":723,"POP_YEAR":2017,"LASTCENSUS":2009,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"NH","ISO_A2":"VU","ISO_A3":"VUT","ISO_A3_EH":"VUT","ISO_N3":"548","UN_A3":"548","WB_A2":"VU","WB_A3":"VUT","WOE_ID":23424907,"WOE_ID_EH":23424907,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"VUT","ADM0_A3_US":"VUT","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Oceania","REGION_UN":"Oceania","SUBREGION":"Melanesia","REGION_WB":"East Asia & Pacific","NAME_LEN":7,"LONG_LEN":7,"ABBREV_LEN":4,"TINY":2,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":4,"MAX_LABEL":9},"bbox":[166.629137,-16.59785,167.844877,-14.626497],"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Yemen","SOV_A3":"YEM","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Yemen","ADM0_A3":"YEM","GEOU_DIF":0,"GEOUNIT":"Yemen","GU_A3":"YEM","SU_DIF":0,"SUBUNIT":"Yemen","SU_A3":"YEM","BRK_DIFF":0,"NAME":"Yemen","NAME_LONG":"Yemen","BRK_A3":"YEM","BRK_NAME":"Yemen","BRK_GROUP":null,"ABBREV":"Yem.","POSTAL":"YE","FORMAL_EN":"Republic of Yemen","FORMAL_FR":null,"NAME_CIAWF":"Yemen","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Yemen, Rep.","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":3,"MAPCOLOR9":3,"MAPCOLOR13":11,"POP_EST":28036829,"POP_RANK":15,"GDP_MD_EST":73450,"POP_YEAR":2017,"LASTCENSUS":2004,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"YM","ISO_A2":"YE","ISO_A3":"YEM","ISO_A3_EH":"YEM","ISO_N3":"887","UN_A3":"887","WB_A2":"RY","WB_A3":"YEM","WOE_ID":23425002,"WOE_ID_EH":23425002,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"YEM","ADM0_A3_US":"YEM","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Asia","REGION_UN":"Asia","SUBREGION":"Western Asia","REGION_WB":"Middle East & North Africa","NAME_LEN":5,"LONG_LEN":5,"ABBREV_LEN":4,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[42.604873,12.58595,53.108573,19.000003],"geometry":{"type":"Polygon","coordinates":[[[52.00001,19.000003],[52.782184,17.349742],[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595],[43.482959,12.6368],[43.222871,13.22095],[43.251448,13.767584],[43.087944,14.06263],[42.892245,14.802249],[42.604873,15.213335],[42.805015,15.261963],[42.702438,15.718886],[42.823671,15.911742],[42.779332,16.347891],[43.218375,16.66689],[43.115798,17.08844],[43.380794,17.579987],[43.791519,17.319977],[44.062613,17.410359],[45.216651,17.433329],[45.399999,17.333335],[46.366659,17.233315],[46.749994,17.283338],[47.000005,16.949999],[47.466695,17.116682],[48.183344,18.166669],[49.116672,18.616668],[52.00001,19.000003]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":2,"SOVEREIGNT":"South Africa","SOV_A3":"ZAF","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"South Africa","ADM0_A3":"ZAF","GEOU_DIF":0,"GEOUNIT":"South Africa","GU_A3":"ZAF","SU_DIF":0,"SUBUNIT":"South Africa","SU_A3":"ZAF","BRK_DIFF":0,"NAME":"South Africa","NAME_LONG":"South Africa","BRK_A3":"ZAF","BRK_NAME":"South Africa","BRK_GROUP":null,"ABBREV":"S.Af.","POSTAL":"ZA","FORMAL_EN":"Republic of South Africa","FORMAL_FR":null,"NAME_CIAWF":"South Africa","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"South Africa","NAME_ALT":null,"MAPCOLOR7":2,"MAPCOLOR8":3,"MAPCOLOR9":4,"MAPCOLOR13":2,"POP_EST":54841552,"POP_RANK":16,"GDP_MD_EST":739100,"POP_YEAR":2017,"LASTCENSUS":2001,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"3. Upper middle income","WIKIPEDIA":-99,"FIPS_10_":"SF","ISO_A2":"ZA","ISO_A3":"ZAF","ISO_A3_EH":"ZAF","ISO_N3":"710","UN_A3":"710","WB_A2":"ZA","WB_A3":"ZAF","WOE_ID":23424942,"WOE_ID_EH":23424942,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ZAF","ADM0_A3_US":"ZAF","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Southern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":12,"LONG_LEN":12,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":1.7,"MAX_LABEL":6.7},"bbox":[16.344977,-34.819166,32.83012,-22.091313],"geometry":{"type":"Polygon","coordinates":[[[19.895768,-24.76779],[20.165726,-24.917962],[20.758609,-25.868136],[20.66647,-26.477453],[20.889609,-26.828543],[21.605896,-26.726534],[22.105969,-26.280256],[22.579532,-25.979448],[22.824271,-25.500459],[23.312097,-25.26869],[23.73357,-25.390129],[24.211267,-25.670216],[25.025171,-25.71967],[25.664666,-25.486816],[25.765849,-25.174845],[25.941652,-24.696373],[26.485753,-24.616327],[26.786407,-24.240691],[27.11941,-23.574323],[28.017236,-22.827754],[29.432188,-22.091313],[29.839037,-22.102216],[30.322883,-22.271612],[30.659865,-22.151567],[31.191409,-22.25151],[31.670398,-23.658969],[31.930589,-24.369417],[31.752408,-25.484284],[31.837778,-25.843332],[31.333158,-25.660191],[31.04408,-25.731452],[30.949667,-26.022649],[30.676609,-26.398078],[30.685962,-26.743845],[31.282773,-27.285879],[31.86806,-27.177927],[32.071665,-26.73382],[32.83012,-26.742192],[32.580265,-27.470158],[32.462133,-28.301011],[32.203389,-28.752405],[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34.258839],[20.689053,-34.417175],[20.071261,-34.795137],[19.616405,-34.819166],[19.193278,-34.462599],[18.855315,-34.444306],[18.424643,-33.997873],[18.377411,-34.136521],[18.244499,-33.867752],[18.25008,-33.281431],[17.92519,-32.611291],[18.24791,-32.429131],[18.221762,-31.661633],[17.566918,-30.725721],[17.064416,-29.878641],[17.062918,-29.875954],[16.344977,-28.576705],[16.824017,-28.082162],[17.218929,-28.355943],[17.387497,-28.783514],[17.836152,-28.856378],[18.464899,-29.045462],[19.002127,-28.972443],[19.894734,-28.461105],[19.895768,-24.76779]],[[28.978263,-28.955597],[28.5417,-28.647502],[28.074338,-28.851469],[27.532511,-29.242711],[26.999262,-29.875954],[27.749397,-30.645106],[28.107205,-30.545732],[28.291069,-30.226217],[28.8484,-30.070051],[29.018415,-29.743766],[29.325166,-29.257387],[28.978263,-28.955597]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Zambia","SOV_A3":"ZMB","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Zambia","ADM0_A3":"ZMB","GEOU_DIF":0,"GEOUNIT":"Zambia","GU_A3":"ZMB","SU_DIF":0,"SUBUNIT":"Zambia","SU_A3":"ZMB","BRK_DIFF":0,"NAME":"Zambia","NAME_LONG":"Zambia","BRK_A3":"ZMB","BRK_NAME":"Zambia","BRK_GROUP":null,"ABBREV":"Zambia","POSTAL":"ZM","FORMAL_EN":"Republic of Zambia","FORMAL_FR":null,"NAME_CIAWF":"Zambia","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Zambia","NAME_ALT":null,"MAPCOLOR7":5,"MAPCOLOR8":8,"MAPCOLOR9":5,"MAPCOLOR13":13,"POP_EST":15972000,"POP_RANK":14,"GDP_MD_EST":65170,"POP_YEAR":2017,"LASTCENSUS":2010,"GDP_YEAR":2016,"ECONOMY":"7. Least developed region","INCOME_GRP":"4. Lower middle income","WIKIPEDIA":-99,"FIPS_10_":"ZA","ISO_A2":"ZM","ISO_A3":"ZMB","ISO_A3_EH":"ZMB","ISO_N3":"894","UN_A3":"894","WB_A2":"ZM","WB_A3":"ZMB","WOE_ID":23425003,"WOE_ID_EH":23425003,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ZMB","ADM0_A3_US":"ZMB","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":6,"LONG_LEN":6,"ABBREV_LEN":6,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[21.887843,-17.961229,33.485688,-8.238257],"geometry":{"type":"Polygon","coordinates":[[[23.215048,-17.523116],[22.562478,-16.898451],[21.887843,-16.08031],[21.933886,-12.898437],[24.016137,-12.911046],[23.930922,-12.565848],[24.079905,-12.191297],[23.904154,-11.722282],[24.017894,-11.237298],[23.912215,-10.926826],[24.257155,-10.951993],[24.314516,-11.262826],[24.78317,-11.238694],[25.418118,-11.330936],[25.75231,-11.784965],[26.553088,-11.92444],[27.16442,-11.608748],[27.388799,-12.132747],[28.155109,-12.272481],[28.523562,-12.698604],[28.934286,-13.248958],[29.699614,-13.257227],[29.616001,-12.178895],[29.341548,-12.360744],[28.642417,-11.971569],[28.372253,-11.793647],[28.49607,-10.789884],[28.673682,-9.605925],[28.449871,-9.164918],[28.734867,-8.526559],[29.002912,-8.407032],[30.346086,-8.238257],[30.74001,-8.340006],[31.157751,-8.594579],[31.556348,-8.762049],[32.191865,-8.930359],[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26.706773,-17.961229],[26.381935,-17.846042],[25.264226,-17.73654],[25.084443,-17.661816],[25.07695,-17.578823],[24.682349,-17.353411],[24.033862,-17.295843],[23.215048,-17.523116]]]}},{"type":"Feature","properties":{"scalerank":1,"featurecla":"Admin-0 country","LABELRANK":3,"SOVEREIGNT":"Zimbabwe","SOV_A3":"ZWE","ADM0_DIF":0,"LEVEL":2,"TYPE":"Sovereign country","ADMIN":"Zimbabwe","ADM0_A3":"ZWE","GEOU_DIF":0,"GEOUNIT":"Zimbabwe","GU_A3":"ZWE","SU_DIF":0,"SUBUNIT":"Zimbabwe","SU_A3":"ZWE","BRK_DIFF":0,"NAME":"Zimbabwe","NAME_LONG":"Zimbabwe","BRK_A3":"ZWE","BRK_NAME":"Zimbabwe","BRK_GROUP":null,"ABBREV":"Zimb.","POSTAL":"ZW","FORMAL_EN":"Republic of Zimbabwe","FORMAL_FR":null,"NAME_CIAWF":"Zimbabwe","NOTE_ADM0":null,"NOTE_BRK":null,"NAME_SORT":"Zimbabwe","NAME_ALT":null,"MAPCOLOR7":1,"MAPCOLOR8":5,"MAPCOLOR9":3,"MAPCOLOR13":9,"POP_EST":13805084,"POP_RANK":14,"GDP_MD_EST":28330,"POP_YEAR":2017,"LASTCENSUS":2002,"GDP_YEAR":2016,"ECONOMY":"5. Emerging region: G20","INCOME_GRP":"5. Low income","WIKIPEDIA":-99,"FIPS_10_":"ZI","ISO_A2":"ZW","ISO_A3":"ZWE","ISO_A3_EH":"ZWE","ISO_N3":"716","UN_A3":"716","WB_A2":"ZW","WB_A3":"ZWE","WOE_ID":23425004,"WOE_ID_EH":23425004,"WOE_NOTE":"Exact WOE match as country","ADM0_A3_IS":"ZWE","ADM0_A3_US":"ZWE","ADM0_A3_UN":-99,"ADM0_A3_WB":-99,"CONTINENT":"Africa","REGION_UN":"Africa","SUBREGION":"Eastern Africa","REGION_WB":"Sub-Saharan Africa","NAME_LEN":8,"LONG_LEN":8,"ABBREV_LEN":5,"TINY":-99,"HOMEPART":1,"MIN_ZOOM":0,"MIN_LABEL":3,"MAX_LABEL":8},"bbox":[25.264226,-22.271612,32.849861,-15.507787],"geometry":{"type":"Polygon","coordinates":[[[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026],[27.598243,-17.290831],[28.467906,-16.4684],[28.825869,-16.389749],[28.947463,-16.043051],[29.516834,-15.644678],[30.274256,-15.507787],[30.338955,-15.880839],[31.173064,-15.860944],[31.636498,-16.07199],[31.852041,-16.319417],[32.328239,-16.392074],[32.847639,-16.713398],[32.849861,-17.979057],[32.654886,-18.67209],[32.611994,-19.419383],[32.772708,-19.715592],[32.659743,-20.30429],[32.508693,-20.395292],[32.244988,-21.116489],[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313]]]}}],"bbox":[-180,-90,180,83.64513]} +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Afghanistan", + "SOV_A3": "AFG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Afghanistan", + "ADM0_A3": "AFG", + "GEOU_DIF": 0, + "GEOUNIT": "Afghanistan", + "GU_A3": "AFG", + "SU_DIF": 0, + "SUBUNIT": "Afghanistan", + "SU_A3": "AFG", + "BRK_DIFF": 0, + "NAME": "Afghanistan", + "NAME_LONG": "Afghanistan", + "BRK_A3": "AFG", + "BRK_NAME": "Afghanistan", + "BRK_GROUP": null, + "ABBREV": "Afg.", + "POSTAL": "AF", + "FORMAL_EN": "Islamic State of Afghanistan", + "FORMAL_FR": null, + "NAME_CIAWF": "Afghanistan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Afghanistan", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 8, + "MAPCOLOR13": 7, + "POP_EST": 34124811, + "POP_RANK": 15, + "GDP_MD_EST": 64080, + "POP_YEAR": 2017, + "LASTCENSUS": 1979, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "AF", + "ISO_A2": "AF", + "ISO_A3": "AFG", + "ISO_A3_EH": "AFG", + "ISO_N3": "004", + "UN_A3": "004", + "WB_A2": "AF", + "WB_A3": "AFG", + "WOE_ID": 23424739, + "WOE_ID_EH": 23424739, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "AFG", + "ADM0_A3_US": "AFG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [60.52843, 29.318572, 75.158028, 38.486282], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [61.210817, 35.650072], + [62.230651, 35.270664], + [62.984662, 35.404041], + [63.193538, 35.857166], + [63.982896, 36.007957], + [64.546479, 36.312073], + [64.746105, 37.111818], + [65.588948, 37.305217], + [65.745631, 37.661164], + [66.217385, 37.39379], + [66.518607, 37.362784], + [67.075782, 37.356144], + [67.83, 37.144994], + [68.135562, 37.023115], + [68.859446, 37.344336], + [69.196273, 37.151144], + [69.518785, 37.608997], + [70.116578, 37.588223], + [70.270574, 37.735165], + [70.376304, 38.138396], + [70.806821, 38.486282], + [71.348131, 38.258905], + [71.239404, 37.953265], + [71.541918, 37.905774], + [71.448693, 37.065645], + [71.844638, 36.738171], + [72.193041, 36.948288], + [72.63689, 37.047558], + [73.260056, 37.495257], + [73.948696, 37.421566], + [74.980002, 37.41999], + [75.158028, 37.133031], + [74.575893, 37.020841], + [74.067552, 36.836176], + [72.920025, 36.720007], + [71.846292, 36.509942], + [71.262348, 36.074388], + [71.498768, 35.650563], + [71.613076, 35.153203], + [71.115019, 34.733126], + [71.156773, 34.348911], + [70.881803, 33.988856], + [69.930543, 34.02012], + [70.323594, 33.358533], + [69.687147, 33.105499], + [69.262522, 32.501944], + [69.317764, 31.901412], + [68.926677, 31.620189], + [68.556932, 31.71331], + [67.792689, 31.58293], + [67.683394, 31.303154], + [66.938891, 31.304911], + [66.381458, 30.738899], + [66.346473, 29.887943], + [65.046862, 29.472181], + [64.350419, 29.560031], + [64.148002, 29.340819], + [63.550261, 29.468331], + [62.549857, 29.318572], + [60.874248, 29.829239], + [61.781222, 30.73585], + [61.699314, 31.379506], + [60.941945, 31.548075], + [60.863655, 32.18292], + [60.536078, 32.981269], + [60.9637, 33.528832], + [60.52843, 33.676446], + [60.803193, 34.404102], + [61.210817, 35.650072] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Angola", + "SOV_A3": "AGO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Angola", + "ADM0_A3": "AGO", + "GEOU_DIF": 0, + "GEOUNIT": "Angola", + "GU_A3": "AGO", + "SU_DIF": 0, + "SUBUNIT": "Angola", + "SU_A3": "AGO", + "BRK_DIFF": 0, + "NAME": "Angola", + "NAME_LONG": "Angola", + "BRK_A3": "AGO", + "BRK_NAME": "Angola", + "BRK_GROUP": null, + "ABBREV": "Ang.", + "POSTAL": "AO", + "FORMAL_EN": "People's Republic of Angola", + "FORMAL_FR": null, + "NAME_CIAWF": "Angola", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Angola", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 6, + "MAPCOLOR13": 1, + "POP_EST": 29310273, + "POP_RANK": 15, + "GDP_MD_EST": 189000, + "POP_YEAR": 2017, + "LASTCENSUS": 1970, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AO", + "ISO_A2": "AO", + "ISO_A3": "AGO", + "ISO_A3_EH": "AGO", + "ISO_N3": "024", + "UN_A3": "024", + "WB_A2": "AO", + "WB_A3": "AGO", + "WOE_ID": 23424745, + "WOE_ID_EH": 23424745, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "AGO", + "ADM0_A3_US": "AGO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [11.640096, -17.930636, 24.079905, -4.438023], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [23.904154, -11.722282], + [24.079905, -12.191297], + [23.930922, -12.565848], + [24.016137, -12.911046], + [21.933886, -12.898437], + [21.887843, -16.08031], + [22.562478, -16.898451], + [23.215048, -17.523116], + [21.377176, -17.930636], + [18.956187, -17.789095], + [18.263309, -17.309951], + [14.209707, -17.353101], + [14.058501, -17.423381], + [13.462362, -16.971212], + [12.814081, -16.941343], + [12.215461, -17.111668], + [11.734199, -17.301889], + [11.640096, -16.673142], + [11.778537, -15.793816], + [12.123581, -14.878316], + [12.175619, -14.449144], + [12.500095, -13.5477], + [12.738479, -13.137906], + [13.312914, -12.48363], + [13.633721, -12.038645], + [13.738728, -11.297863], + [13.686379, -10.731076], + [13.387328, -10.373578], + [13.120988, -9.766897], + [12.87537, -9.166934], + [12.929061, -8.959091], + [13.236433, -8.562629], + [12.93304, -7.596539], + [12.728298, -6.927122], + [12.227347, -6.294448], + [12.322432, -6.100092], + [12.735171, -5.965682], + [13.024869, -5.984389], + [13.375597, -5.864241], + [16.326528, -5.87747], + [16.57318, -6.622645], + [16.860191, -7.222298], + [17.089996, -7.545689], + [17.47297, -8.068551], + [18.134222, -7.987678], + [18.464176, -7.847014], + [19.016752, -7.988246], + [19.166613, -7.738184], + [19.417502, -7.155429], + [20.037723, -7.116361], + [20.091622, -6.94309], + [20.601823, -6.939318], + [20.514748, -7.299606], + [21.728111, -7.290872], + [21.746456, -7.920085], + [21.949131, -8.305901], + [21.801801, -8.908707], + [21.875182, -9.523708], + [22.208753, -9.894796], + [22.155268, -11.084801], + [22.402798, -10.993075], + [22.837345, -11.017622], + [23.456791, -10.867863], + [23.912215, -10.926826], + [24.017894, -11.237298], + [23.904154, -11.722282] + ] + ], + [ + [ + [12.182337, -5.789931], + [11.914963, -5.037987], + [12.318608, -4.60623], + [12.62076, -4.438023], + [12.995517, -4.781103], + [12.631612, -4.991271], + [12.468004, -5.248362], + [12.436688, -5.684304], + [12.182337, -5.789931] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Albania", + "SOV_A3": "ALB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Albania", + "ADM0_A3": "ALB", + "GEOU_DIF": 0, + "GEOUNIT": "Albania", + "GU_A3": "ALB", + "SU_DIF": 0, + "SUBUNIT": "Albania", + "SU_A3": "ALB", + "BRK_DIFF": 0, + "NAME": "Albania", + "NAME_LONG": "Albania", + "BRK_A3": "ALB", + "BRK_NAME": "Albania", + "BRK_GROUP": null, + "ABBREV": "Alb.", + "POSTAL": "AL", + "FORMAL_EN": "Republic of Albania", + "FORMAL_FR": null, + "NAME_CIAWF": "Albania", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Albania", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 6, + "POP_EST": 3047987, + "POP_RANK": 12, + "GDP_MD_EST": 33900, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AL", + "ISO_A2": "AL", + "ISO_A3": "ALB", + "ISO_A3_EH": "ALB", + "ISO_N3": "008", + "UN_A3": "008", + "WB_A2": "AL", + "WB_A3": "ALB", + "WOE_ID": 23424742, + "WOE_ID_EH": 23424742, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ALB", + "ADM0_A3_US": "ALB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [19.304486, 39.624998, 21.02004, 42.688247], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [21.02004, 40.842727], + [20.99999, 40.580004], + [20.674997, 40.435], + [20.615, 40.110007], + [20.150016, 39.624998], + [19.98, 39.694993], + [19.960002, 39.915006], + [19.406082, 40.250773], + [19.319059, 40.72723], + [19.40355, 41.409566], + [19.540027, 41.719986], + [19.371769, 41.877548], + [19.371768, 41.877551], + [19.304486, 42.195745], + [19.738051, 42.688247], + [19.801613, 42.500093], + [20.0707, 42.58863], + [20.283755, 42.32026], + [20.52295, 42.21787], + [20.590247, 41.855409], + [20.590247, 41.855404], + [20.463175, 41.515089], + [20.605182, 41.086226], + [21.02004, 40.842727] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "United Arab Emirates", + "SOV_A3": "ARE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "United Arab Emirates", + "ADM0_A3": "ARE", + "GEOU_DIF": 0, + "GEOUNIT": "United Arab Emirates", + "GU_A3": "ARE", + "SU_DIF": 0, + "SUBUNIT": "United Arab Emirates", + "SU_A3": "ARE", + "BRK_DIFF": 0, + "NAME": "United Arab Emirates", + "NAME_LONG": "United Arab Emirates", + "BRK_A3": "ARE", + "BRK_NAME": "United Arab Emirates", + "BRK_GROUP": null, + "ABBREV": "U.A.E.", + "POSTAL": "AE", + "FORMAL_EN": "United Arab Emirates", + "FORMAL_FR": null, + "NAME_CIAWF": "United Arab Emirates", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "United Arab Emirates", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 3, + "POP_EST": 6072475, + "POP_RANK": 13, + "GDP_MD_EST": 667200, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "AE", + "ISO_A2": "AE", + "ISO_A3": "ARE", + "ISO_A3_EH": "ARE", + "ISO_N3": "784", + "UN_A3": "784", + "WB_A2": "AE", + "WB_A3": "ARE", + "WOE_ID": 23424738, + "WOE_ID_EH": 23424738, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ARE", + "ADM0_A3_US": "ARE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 20, + "LONG_LEN": 20, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [51.579519, 22.496948, 56.396847, 26.055464], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [51.579519, 24.245497], + [51.757441, 24.294073], + [51.794389, 24.019826], + [52.577081, 24.177439], + [53.404007, 24.151317], + [54.008001, 24.121758], + [54.693024, 24.797892], + [55.439025, 25.439145], + [56.070821, 26.055464], + [56.261042, 25.714606], + [56.396847, 24.924732], + [55.886233, 24.920831], + [55.804119, 24.269604], + [55.981214, 24.130543], + [55.528632, 23.933604], + [55.525841, 23.524869], + [55.234489, 23.110993], + [55.208341, 22.70833], + [55.006803, 22.496948], + [52.000733, 23.001154], + [51.617708, 24.014219], + [51.579519, 24.245497] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Argentina", + "SOV_A3": "ARG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Argentina", + "ADM0_A3": "ARG", + "GEOU_DIF": 0, + "GEOUNIT": "Argentina", + "GU_A3": "ARG", + "SU_DIF": 0, + "SUBUNIT": "Argentina", + "SU_A3": "ARG", + "BRK_DIFF": 0, + "NAME": "Argentina", + "NAME_LONG": "Argentina", + "BRK_A3": "ARG", + "BRK_NAME": "Argentina", + "BRK_GROUP": null, + "ABBREV": "Arg.", + "POSTAL": "AR", + "FORMAL_EN": "Argentine Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Argentina", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Argentina", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 13, + "POP_EST": 44293293, + "POP_RANK": 15, + "GDP_MD_EST": 879400, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AR", + "ISO_A2": "AR", + "ISO_A3": "ARG", + "ISO_A3_EH": "ARG", + "ISO_N3": "032", + "UN_A3": "032", + "WB_A2": "AR", + "WB_A3": "ARG", + "WOE_ID": 23424747, + "WOE_ID_EH": 23424747, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ARG", + "ADM0_A3_US": "ARG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [-73.415436, -55.25, -53.628349, -21.83231], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-66.95992, -54.89681], + [-67.56244, -54.87001], + [-68.63335, -54.8695], + [-68.63401, -52.63637], + [-68.25, -53.1], + [-67.75, -53.85], + [-66.45, -54.45], + [-65.05, -54.7], + [-65.5, -55.2], + [-66.45, -55.25], + [-66.95992, -54.89681] + ] + ], + [ + [ + [-68.571545, -52.299444], + [-69.498362, -52.142761], + [-71.914804, -52.009022], + [-72.329404, -51.425956], + [-72.309974, -50.67701], + [-72.975747, -50.74145], + [-73.328051, -50.378785], + [-73.415436, -49.318436], + [-72.648247, -48.878618], + [-72.331161, -48.244238], + [-72.447355, -47.738533], + [-71.917258, -46.884838], + [-71.552009, -45.560733], + [-71.659316, -44.973689], + [-71.222779, -44.784243], + [-71.329801, -44.407522], + [-71.793623, -44.207172], + [-71.464056, -43.787611], + [-71.915424, -43.408565], + [-72.148898, -42.254888], + [-71.746804, -42.051386], + [-71.915734, -40.832339], + [-71.680761, -39.808164], + [-71.413517, -38.916022], + [-70.814664, -38.552995], + [-71.118625, -37.576827], + [-71.121881, -36.658124], + [-70.364769, -36.005089], + [-70.388049, -35.169688], + [-69.817309, -34.193571], + [-69.814777, -33.273886], + [-70.074399, -33.09121], + [-70.535069, -31.36501], + [-69.919008, -30.336339], + [-70.01355, -29.367923], + [-69.65613, -28.459141], + [-69.001235, -27.521214], + [-68.295542, -26.89934], + [-68.5948, -26.506909], + [-68.386001, -26.185016], + [-68.417653, -24.518555], + [-67.328443, -24.025303], + [-66.985234, -22.986349], + [-67.106674, -22.735925], + [-66.273339, -21.83231], + [-64.964892, -22.075862], + [-64.377021, -22.798091], + [-63.986838, -21.993644], + [-62.846468, -22.034985], + [-62.685057, -22.249029], + [-60.846565, -23.880713], + [-60.028966, -24.032796], + [-58.807128, -24.771459], + [-57.777217, -25.16234], + [-57.63366, -25.603657], + [-58.618174, -27.123719], + [-57.60976, -27.395899], + [-56.486702, -27.548499], + [-55.695846, -27.387837], + [-54.788795, -26.621786], + [-54.625291, -25.739255], + [-54.13005, -25.547639], + [-53.628349, -26.124865], + [-53.648735, -26.923473], + [-54.490725, -27.474757], + [-55.162286, -27.881915], + [-56.2909, -28.852761], + [-57.625133, -30.216295], + [-57.874937, -31.016556], + [-58.14244, -32.044504], + [-58.132648, -33.040567], + [-58.349611, -33.263189], + [-58.427074, -33.909454], + [-58.495442, -34.43149], + [-57.22583, -35.288027], + [-57.362359, -35.97739], + [-56.737487, -36.413126], + [-56.788285, -36.901572], + [-57.749157, -38.183871], + [-59.231857, -38.72022], + [-61.237445, -38.928425], + [-62.335957, -38.827707], + [-62.125763, -39.424105], + [-62.330531, -40.172586], + [-62.145994, -40.676897], + [-62.745803, -41.028761], + [-63.770495, -41.166789], + [-64.73209, -40.802677], + [-65.118035, -41.064315], + [-64.978561, -42.058001], + [-64.303408, -42.359016], + [-63.755948, -42.043687], + [-63.458059, -42.563138], + [-64.378804, -42.873558], + [-65.181804, -43.495381], + [-65.328823, -44.501366], + [-65.565269, -45.036786], + [-66.509966, -45.039628], + [-67.293794, -45.551896], + [-67.580546, -46.301773], + [-66.597066, -47.033925], + [-65.641027, -47.236135], + [-65.985088, -48.133289], + [-67.166179, -48.697337], + [-67.816088, -49.869669], + [-68.728745, -50.264218], + [-69.138539, -50.73251], + [-68.815561, -51.771104], + [-68.149995, -52.349983], + [-68.571545, -52.299444] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Armenia", + "SOV_A3": "ARM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Armenia", + "ADM0_A3": "ARM", + "GEOU_DIF": 0, + "GEOUNIT": "Armenia", + "GU_A3": "ARM", + "SU_DIF": 0, + "SUBUNIT": "Armenia", + "SU_A3": "ARM", + "BRK_DIFF": 0, + "NAME": "Armenia", + "NAME_LONG": "Armenia", + "BRK_A3": "ARM", + "BRK_NAME": "Armenia", + "BRK_GROUP": null, + "ABBREV": "Arm.", + "POSTAL": "ARM", + "FORMAL_EN": "Republic of Armenia", + "FORMAL_FR": null, + "NAME_CIAWF": "Armenia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Armenia", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 2, + "MAPCOLOR13": 10, + "POP_EST": 3045191, + "POP_RANK": 12, + "GDP_MD_EST": 26300, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AM", + "ISO_A2": "AM", + "ISO_A3": "ARM", + "ISO_A3_EH": "ARM", + "ISO_N3": "051", + "UN_A3": "051", + "WB_A2": "AM", + "WB_A3": "ARM", + "WOE_ID": 23424743, + "WOE_ID_EH": 23424743, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ARM", + "ADM0_A3_US": "ARM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [43.582746, 38.741201, 46.50572, 41.248129], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [43.582746, 41.092143], + [44.97248, 41.248129], + [45.179496, 40.985354], + [45.560351, 40.81229], + [45.359175, 40.561504], + [45.891907, 40.218476], + [45.610012, 39.899994], + [46.034534, 39.628021], + [46.483499, 39.464155], + [46.50572, 38.770605], + [46.143623, 38.741201], + [45.735379, 39.319719], + [45.739978, 39.473999], + [45.298145, 39.471751], + [45.001987, 39.740004], + [44.79399, 39.713003], + [44.400009, 40.005], + [43.656436, 40.253564], + [43.752658, 40.740201], + [43.582746, 41.092143] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Antarctica", + "SOV_A3": "ATA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Indeterminate", + "ADMIN": "Antarctica", + "ADM0_A3": "ATA", + "GEOU_DIF": 0, + "GEOUNIT": "Antarctica", + "GU_A3": "ATA", + "SU_DIF": 0, + "SUBUNIT": "Antarctica", + "SU_A3": "ATA", + "BRK_DIFF": 0, + "NAME": "Antarctica", + "NAME_LONG": "Antarctica", + "BRK_A3": "ATA", + "BRK_NAME": "Antarctica", + "BRK_GROUP": null, + "ABBREV": "Ant.", + "POSTAL": "AQ", + "FORMAL_EN": null, + "FORMAL_FR": null, + "NAME_CIAWF": null, + "NOTE_ADM0": null, + "NOTE_BRK": "Multiple claims held in abeyance", + "NAME_SORT": "Antarctica", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 1, + "MAPCOLOR13": -99, + "POP_EST": 4050, + "POP_RANK": 4, + "GDP_MD_EST": 810, + "POP_YEAR": 2013, + "LASTCENSUS": -99, + "GDP_YEAR": 2013, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "AY", + "ISO_A2": "AQ", + "ISO_A3": "ATA", + "ISO_A3_EH": "ATA", + "ISO_N3": "010", + "UN_A3": "-099", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": 28289409, + "WOE_ID_EH": 28289409, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ATA", + "ADM0_A3_US": "ATA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Antarctica", + "REGION_UN": "Antarctica", + "SUBREGION": "Antarctica", + "REGION_WB": "Antarctica", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-180, -90, 180, -63.27066], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-59.572095, -80.040179], + [-59.865849, -80.549657], + [-60.159656, -81.000327], + [-62.255393, -80.863178], + [-64.488125, -80.921934], + [-65.741666, -80.588827], + [-65.741666, -80.549657], + [-66.290031, -80.255773], + [-64.037688, -80.294944], + [-61.883246, -80.39287], + [-61.138976, -79.981371], + [-60.610119, -79.628679], + [-59.572095, -80.040179] + ] + ], + [ + [ + [-159.208184, -79.497059], + [-161.127601, -79.634209], + [-162.439847, -79.281465], + [-163.027408, -78.928774], + [-163.066604, -78.869966], + [-163.712896, -78.595667], + [-163.712896, -78.595667], + [-163.105801, -78.223338], + [-161.245113, -78.380176], + [-160.246208, -78.693645], + [-159.482405, -79.046338], + [-159.208184, -79.497059] + ] + ], + [ + [ + [-45.154758, -78.04707], + [-43.920828, -78.478103], + [-43.48995, -79.08556], + [-43.372438, -79.516645], + [-43.333267, -80.026123], + [-44.880537, -80.339644], + [-46.506174, -80.594357], + [-48.386421, -80.829485], + [-50.482107, -81.025442], + [-52.851988, -80.966685], + [-54.164259, -80.633528], + [-53.987991, -80.222028], + [-51.853134, -79.94773], + [-50.991326, -79.614623], + [-50.364595, -79.183487], + [-49.914131, -78.811209], + [-49.306959, -78.458569], + [-48.660616, -78.047018], + [-48.660616, -78.047019], + [-48.151396, -78.04707], + [-46.662857, -77.831476], + [-45.154758, -78.04707] + ] + ], + [ + [ + [-121.211511, -73.50099], + [-119.918851, -73.657725], + [-118.724143, -73.481353], + [-119.292119, -73.834097], + [-120.232217, -74.08881], + [-121.62283, -74.010468], + [-122.621735, -73.657778], + [-122.621735, -73.657777], + [-122.406245, -73.324619], + [-121.211511, -73.50099] + ] + ], + [ + [ + [-125.559566, -73.481353], + [-124.031882, -73.873268], + [-124.619469, -73.834097], + [-125.912181, -73.736118], + [-127.28313, -73.461769], + [-127.28313, -73.461768], + [-126.558472, -73.246226], + [-125.559566, -73.481353] + ] + ], + [ + [ + [-98.98155, -71.933334], + [-97.884743, -72.070535], + [-96.787937, -71.952971], + [-96.20035, -72.521205], + [-96.983765, -72.442864], + [-98.198083, -72.482035], + [-99.432013, -72.442864], + [-100.783455, -72.50162], + [-101.801868, -72.305663], + [-102.330725, -71.894164], + [-102.330725, -71.894164], + [-101.703967, -71.717792], + [-100.430919, -71.854993], + [-98.98155, -71.933334] + ] + ], + [ + [ + [-68.451346, -70.955823], + [-68.333834, -71.406493], + [-68.510128, -71.798407], + [-68.784297, -72.170736], + [-69.959471, -72.307885], + [-71.075889, -72.503842], + [-72.388134, -72.484257], + [-71.8985, -72.092343], + [-73.073622, -72.229492], + [-74.19004, -72.366693], + [-74.953895, -72.072757], + [-75.012625, -71.661258], + [-73.915819, -71.269345], + [-73.915819, -71.269344], + [-73.230331, -71.15178], + [-72.074717, -71.190951], + [-71.780962, -70.681473], + [-71.72218, -70.309196], + [-71.741791, -69.505782], + [-71.173815, -69.035475], + [-70.253252, -68.87874], + [-69.724447, -69.251017], + [-69.489422, -69.623346], + [-69.058518, -70.074016], + [-68.725541, -70.505153], + [-68.451346, -70.955823] + ] + ], + [ + [ + [-58.614143, -64.152467], + [-59.045073, -64.36801], + [-59.789342, -64.211223], + [-60.611928, -64.309202], + [-61.297416, -64.54433], + [-62.0221, -64.799094], + [-62.51176, -65.09303], + [-62.648858, -65.484942], + [-62.590128, -65.857219], + [-62.120079, -66.190326], + [-62.805567, -66.425505], + [-63.74569, -66.503847], + [-64.294106, -66.837004], + [-64.881693, -67.150474], + [-65.508425, -67.58161], + [-65.665082, -67.953887], + [-65.312545, -68.365335], + [-64.783715, -68.678908], + [-63.961103, -68.913984], + [-63.1973, -69.227556], + [-62.785955, -69.619419], + [-62.570516, -69.991747], + [-62.276736, -70.383661], + [-61.806661, -70.716768], + [-61.512906, -71.089045], + [-61.375809, -72.010074], + [-61.081977, -72.382351], + [-61.003661, -72.774265], + [-60.690269, -73.166179], + [-60.827367, -73.695242], + [-61.375809, -74.106742], + [-61.96337, -74.439848], + [-63.295201, -74.576997], + [-63.74569, -74.92974], + [-64.352836, -75.262847], + [-65.860987, -75.635124], + [-67.192818, -75.79191], + [-68.446282, -76.007452], + [-69.797724, -76.222995], + [-70.600724, -76.634494], + [-72.206776, -76.673665], + [-73.969536, -76.634494], + [-75.555977, -76.712887], + [-77.24037, -76.712887], + [-76.926979, -77.104802], + [-75.399294, -77.28107], + [-74.282876, -77.55542], + [-73.656119, -77.908112], + [-74.772536, -78.221633], + [-76.4961, -78.123654], + [-77.925858, -78.378419], + [-77.984666, -78.789918], + [-78.023785, -79.181833], + [-76.848637, -79.514939], + [-76.633224, -79.887216], + [-75.360097, -80.259545], + [-73.244852, -80.416331], + [-71.442946, -80.69063], + [-70.013163, -81.004151], + [-68.191646, -81.317672], + [-65.704279, -81.474458], + [-63.25603, -81.748757], + [-61.552026, -82.042692], + [-59.691416, -82.37585], + [-58.712121, -82.846106], + [-58.222487, -83.218434], + [-57.008117, -82.865691], + [-55.362894, -82.571755], + [-53.619771, -82.258235], + [-51.543644, -82.003521], + [-49.76135, -81.729171], + [-47.273931, -81.709586], + [-44.825708, -81.846735], + [-42.808363, -82.081915], + [-42.16202, -81.65083], + [-40.771433, -81.356894], + [-38.244818, -81.337309], + [-36.26667, -81.121715], + [-34.386397, -80.906172], + [-32.310296, -80.769023], + [-30.097098, -80.592651], + [-28.549802, -80.337938], + [-29.254901, -79.985195], + [-29.685805, -79.632503], + [-29.685805, -79.260226], + [-31.624808, -79.299397], + [-33.681324, -79.456132], + [-35.639912, -79.456132], + [-35.914107, -79.083855], + [-35.77701, -78.339248], + [-35.326546, -78.123654], + [-33.896763, -77.888526], + [-32.212369, -77.65345], + [-30.998051, -77.359515], + [-29.783732, -77.065579], + [-28.882779, -76.673665], + [-27.511752, -76.497345], + [-26.160336, -76.360144], + [-25.474822, -76.281803], + [-23.927552, -76.24258], + [-22.458598, -76.105431], + [-21.224694, -75.909474], + [-20.010375, -75.674346], + [-18.913543, -75.439218], + [-17.522982, -75.125698], + [-16.641589, -74.79254], + [-15.701491, -74.498604], + [-15.40771, -74.106742], + [-16.46532, -73.871614], + [-16.112784, -73.460114], + [-15.446855, -73.146542], + [-14.408805, -72.950585], + [-13.311973, -72.715457], + [-12.293508, -72.401936], + [-11.510067, -72.010074], + [-11.020433, -71.539767], + [-10.295774, -71.265416], + [-9.101015, -71.324224], + [-8.611381, -71.65733], + [-7.416622, -71.696501], + [-7.377451, -71.324224], + [-6.868232, -70.93231], + [-5.790985, -71.030289], + [-5.536375, -71.402617], + [-4.341667, -71.461373], + [-3.048981, -71.285053], + [-1.795492, -71.167438], + [-0.659489, -71.226246], + [-0.228637, -71.637745], + [0.868195, -71.304639], + [1.886686, -71.128267], + [3.022638, -70.991118], + [4.139055, -70.853917], + [5.157546, -70.618789], + [6.273912, -70.462055], + [7.13572, -70.246512], + [7.742866, -69.893769], + [8.48711, -70.148534], + [9.525135, -70.011333], + [10.249845, -70.48164], + [10.817821, -70.834332], + [11.953824, -70.638375], + [12.404287, -70.246512], + [13.422778, -69.972162], + [14.734998, -70.030918], + [15.126757, -70.403247], + [15.949342, -70.030918], + [17.026589, -69.913354], + [18.201711, -69.874183], + [19.259373, -69.893769], + [20.375739, -70.011333], + [21.452985, -70.07014], + [21.923034, -70.403247], + [22.569403, -70.697182], + [23.666184, -70.520811], + [24.841357, -70.48164], + [25.977309, -70.48164], + [27.093726, -70.462055], + [28.09258, -70.324854], + [29.150242, -70.20729], + [30.031583, -69.93294], + [30.971733, -69.75662], + [31.990172, -69.658641], + [32.754053, -69.384291], + [33.302443, -68.835642], + [33.870419, -68.502588], + [34.908495, -68.659271], + [35.300202, -69.012014], + [36.16201, -69.247142], + [37.200035, -69.168748], + [37.905108, -69.52144], + [38.649404, -69.776205], + [39.667894, -69.541077], + [40.020431, -69.109941], + [40.921358, -68.933621], + [41.959434, -68.600514], + [42.938702, -68.463313], + [44.113876, -68.267408], + [44.897291, -68.051866], + [45.719928, -67.816738], + [46.503343, -67.601196], + [47.44344, -67.718759], + [48.344419, -67.366068], + [48.990736, -67.091718], + [49.930885, -67.111303], + [50.753471, -66.876175], + [50.949325, -66.523484], + [51.791547, -66.249133], + [52.614133, -66.053176], + [53.613038, -65.89639], + [54.53355, -65.818049], + [55.414943, -65.876805], + [56.355041, -65.974783], + [57.158093, -66.249133], + [57.255968, -66.680218], + [58.137361, -67.013324], + [58.744508, -67.287675], + [59.939318, -67.405239], + [60.605221, -67.679589], + [61.427806, -67.953887], + [62.387489, -68.012695], + [63.19049, -67.816738], + [64.052349, -67.405239], + [64.992447, -67.620729], + [65.971715, -67.738345], + [66.911864, -67.855909], + [67.891133, -67.934302], + [68.890038, -67.934302], + [69.712624, -68.972791], + [69.673453, -69.227556], + [69.555941, -69.678226], + [68.596258, -69.93294], + [67.81274, -70.305268], + [67.949889, -70.697182], + [69.066307, -70.677545], + [68.929157, -71.069459], + [68.419989, -71.441788], + [67.949889, -71.853287], + [68.71377, -72.166808], + [69.869307, -72.264787], + [71.024895, -72.088415], + [71.573285, -71.696501], + [71.906288, -71.324224], + [72.454627, -71.010703], + [73.08141, -70.716768], + [73.33602, -70.364024], + [73.864877, -69.874183], + [74.491557, -69.776205], + [75.62756, -69.737034], + [76.626465, -69.619419], + [77.644904, -69.462684], + [78.134539, -69.07077], + [78.428371, -68.698441], + [79.113859, -68.326216], + [80.093127, -68.071503], + [80.93535, -67.875546], + [81.483792, -67.542388], + [82.051767, -67.366068], + [82.776426, -67.209282], + [83.775331, -67.30726], + [84.676206, -67.209282], + [85.655527, -67.091718], + [86.752359, -67.150474], + [87.477017, -66.876175], + [87.986289, -66.209911], + [88.358411, -66.484261], + [88.828408, -66.954568], + [89.67063, -67.150474], + [90.630365, -67.228867], + [91.5901, -67.111303], + [92.608539, -67.189696], + [93.548637, -67.209282], + [94.17542, -67.111303], + [95.017591, -67.170111], + [95.781472, -67.385653], + [96.682399, -67.248504], + [97.759646, -67.248504], + [98.68021, -67.111303], + [99.718182, -67.248504], + [100.384188, -66.915346], + [100.893356, -66.58224], + [101.578896, -66.30789], + [102.832411, -65.563284], + [103.478676, -65.700485], + [104.242557, -65.974783], + [104.90846, -66.327527], + [106.181561, -66.934931], + [107.160881, -66.954568], + [108.081393, -66.954568], + [109.15864, -66.837004], + [110.235835, -66.699804], + [111.058472, -66.425505], + [111.74396, -66.13157], + [112.860378, -66.092347], + [113.604673, -65.876805], + [114.388088, -66.072762], + [114.897308, -66.386283], + [115.602381, -66.699804], + [116.699161, -66.660633], + [117.384701, -66.915346], + [118.57946, -67.170111], + [119.832924, -67.268089], + [120.871, -67.189696], + [121.654415, -66.876175], + [122.320369, -66.562654], + [123.221296, -66.484261], + [124.122274, -66.621462], + [125.160247, -66.719389], + [126.100396, -66.562654], + [127.001427, -66.562654], + [127.882768, -66.660633], + [128.80328, -66.758611], + [129.704259, -66.58224], + [130.781454, -66.425505], + [131.799945, -66.386283], + [132.935896, -66.386283], + [133.85646, -66.288304], + [134.757387, -66.209963], + [135.031582, -65.72007], + [135.070753, -65.308571], + [135.697485, -65.582869], + [135.873805, -66.033591], + [136.206705, -66.44509], + [136.618049, -66.778197], + [137.460271, -66.954568], + [138.596223, -66.895761], + [139.908442, -66.876175], + [140.809421, -66.817367], + [142.121692, -66.817367], + [143.061842, -66.797782], + [144.374061, -66.837004], + [145.490427, -66.915346], + [146.195552, -67.228867], + [145.999699, -67.601196], + [146.646067, -67.895131], + [147.723263, -68.130259], + [148.839629, -68.385024], + [150.132314, -68.561292], + [151.483705, -68.71813], + [152.502247, -68.874813], + [153.638199, -68.894502], + [154.284567, -68.561292], + [155.165857, -68.835642], + [155.92979, -69.149215], + [156.811132, -69.384291], + [158.025528, -69.482269], + [159.181013, -69.599833], + [159.670699, -69.991747], + [160.80665, -70.226875], + [161.570479, -70.579618], + [162.686897, -70.736353], + [163.842434, -70.716768], + [164.919681, -70.775524], + [166.11444, -70.755938], + [167.309095, -70.834332], + [168.425616, -70.971481], + [169.463589, -71.20666], + [170.501665, -71.402617], + [171.20679, -71.696501], + [171.089227, -72.088415], + [170.560422, -72.441159], + [170.109958, -72.891829], + [169.75737, -73.24452], + [169.287321, -73.65602], + [167.975101, -73.812806], + [167.387489, -74.165498], + [166.094803, -74.38104], + [165.644391, -74.772954], + [164.958851, -75.145283], + [164.234193, -75.458804], + [163.822797, -75.870303], + [163.568239, -76.24258], + [163.47026, -76.693302], + [163.489897, -77.065579], + [164.057873, -77.457442], + [164.273363, -77.82977], + [164.743464, -78.182514], + [166.604126, -78.319611], + [166.995781, -78.750748], + [165.193876, -78.907483], + [163.666217, -79.123025], + [161.766385, -79.162248], + [160.924162, -79.730482], + [160.747894, -80.200737], + [160.316964, -80.573066], + [159.788211, -80.945395], + [161.120016, -81.278501], + [161.629287, -81.690001], + [162.490992, -82.062278], + [163.705336, -82.395435], + [165.095949, -82.708956], + [166.604126, -83.022477], + [168.895665, -83.335998], + [169.404782, -83.825891], + [172.283934, -84.041433], + [172.477049, -84.117914], + [173.224083, -84.41371], + [175.985672, -84.158997], + [178.277212, -84.472518], + [180, -84.71338], + [180, -90], + [-180, -90], + [-180, -84.71338], + [-179.942499, -84.721443], + [-179.058677, -84.139412], + [-177.256772, -84.452933], + [-177.140807, -84.417941], + [-176.084673, -84.099259], + [-175.947235, -84.110449], + [-175.829882, -84.117914], + [-174.382503, -84.534323], + [-173.116559, -84.117914], + [-172.889106, -84.061019], + [-169.951223, -83.884647], + [-168.999989, -84.117914], + [-168.530199, -84.23739], + [-167.022099, -84.570497], + [-164.182144, -84.82521], + [-161.929775, -85.138731], + [-158.07138, -85.37391], + [-155.192253, -85.09956], + [-150.942099, -85.295517], + [-148.533073, -85.609038], + [-145.888918, -85.315102], + [-143.107718, -85.040752], + [-142.892279, -84.570497], + [-146.829068, -84.531274], + [-150.060732, -84.296146], + [-150.902928, -83.904232], + [-153.586201, -83.68869], + [-153.409907, -83.23802], + [-153.037759, -82.82652], + [-152.665637, -82.454192], + [-152.861517, -82.042692], + [-154.526299, -81.768394], + [-155.29018, -81.41565], + [-156.83745, -81.102129], + [-154.408787, -81.160937], + [-152.097662, -81.004151], + [-150.648293, -81.337309], + [-148.865998, -81.043373], + [-147.22075, -80.671045], + [-146.417749, -80.337938], + [-146.770286, -79.926439], + [-148.062947, -79.652089], + [-149.531901, -79.358205], + [-151.588416, -79.299397], + [-153.390322, -79.162248], + [-155.329376, -79.064269], + [-155.975668, -78.69194], + [-157.268302, -78.378419], + [-158.051768, -78.025676], + [-158.365134, -76.889207], + [-157.875474, -76.987238], + [-156.974573, -77.300759], + [-155.329376, -77.202728], + [-153.742832, -77.065579], + [-152.920247, -77.496664], + [-151.33378, -77.398737], + [-150.00195, -77.183143], + [-148.748486, -76.908845], + [-147.612483, -76.575738], + [-146.104409, -76.47776], + [-146.143528, -76.105431], + [-146.496091, -75.733154], + [-146.20231, -75.380411], + [-144.909624, -75.204039], + [-144.322037, -75.537197], + [-142.794353, -75.34124], + [-141.638764, -75.086475], + [-140.209007, -75.06689], + [-138.85759, -74.968911], + [-137.5062, -74.733783], + [-136.428901, -74.518241], + [-135.214583, -74.302699], + [-134.431194, -74.361455], + [-133.745654, -74.439848], + [-132.257168, -74.302699], + [-130.925311, -74.479019], + [-129.554284, -74.459433], + [-128.242038, -74.322284], + [-126.890622, -74.420263], + [-125.402082, -74.518241], + [-124.011496, -74.479019], + [-122.562152, -74.498604], + [-121.073613, -74.518241], + [-119.70256, -74.479019], + [-118.684145, -74.185083], + [-117.469801, -74.028348], + [-116.216312, -74.243891], + [-115.021552, -74.067519], + [-113.944331, -73.714828], + [-113.297988, -74.028348], + [-112.945452, -74.38104], + [-112.299083, -74.714198], + [-111.261059, -74.420263], + [-110.066325, -74.79254], + [-108.714909, -74.910103], + [-107.559346, -75.184454], + [-106.149148, -75.125698], + [-104.876074, -74.949326], + [-103.367949, -74.988497], + [-102.016507, -75.125698], + [-100.645531, -75.302018], + [-100.1167, -74.870933], + [-100.763043, -74.537826], + [-101.252703, -74.185083], + [-102.545337, -74.106742], + [-103.113313, -73.734413], + [-103.328752, -73.362084], + [-103.681289, -72.61753], + [-102.917485, -72.754679], + [-101.60524, -72.813436], + [-100.312528, -72.754679], + [-99.13738, -72.911414], + [-98.118889, -73.20535], + [-97.688037, -73.558041], + [-96.336595, -73.616849], + [-95.043961, -73.4797], + [-93.672907, -73.283743], + [-92.439003, -73.166179], + [-91.420564, -73.401307], + [-90.088733, -73.322914], + [-89.226951, -72.558722], + [-88.423951, -73.009393], + [-87.268337, -73.185764], + [-86.014822, -73.087786], + [-85.192236, -73.4797], + [-83.879991, -73.518871], + [-82.665646, -73.636434], + [-81.470913, -73.851977], + [-80.687447, -73.4797], + [-80.295791, -73.126956], + [-79.296886, -73.518871], + [-77.925858, -73.420892], + [-76.907367, -73.636434], + [-76.221879, -73.969541], + [-74.890049, -73.871614], + [-73.852024, -73.65602], + [-72.833533, -73.401307], + [-71.619215, -73.264157], + [-70.209042, -73.146542], + [-68.935916, -73.009393], + [-67.956622, -72.79385], + [-67.369061, -72.480329], + [-67.134036, -72.049244], + [-67.251548, -71.637745], + [-67.56494, -71.245831], + [-67.917477, -70.853917], + [-68.230843, -70.462055], + [-68.485452, -70.109311], + [-68.544209, -69.717397], + [-68.446282, -69.325535], + [-67.976233, -68.953206], + [-67.5845, -68.541707], + [-67.427843, -68.149844], + [-67.62367, -67.718759], + [-67.741183, -67.326845], + [-67.251548, -66.876175], + [-66.703184, -66.58224], + [-66.056815, -66.209963], + [-65.371327, -65.89639], + [-64.568276, -65.602506], + [-64.176542, -65.171423], + [-63.628152, -64.897073], + [-63.001394, -64.642308], + [-62.041686, -64.583552], + [-61.414928, -64.270031], + [-60.709855, -64.074074], + [-59.887269, -63.95651], + [-59.162585, -63.701745], + [-58.594557, -63.388224], + [-57.811143, -63.27066], + [-57.223582, -63.525425], + [-57.59573, -63.858532], + [-58.614143, -64.152467] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 3, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "France", + "SOV_A3": "FR1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Dependency", + "ADMIN": "French Southern and Antarctic Lands", + "ADM0_A3": "ATF", + "GEOU_DIF": 0, + "GEOUNIT": "French Southern and Antarctic Lands", + "GU_A3": "ATF", + "SU_DIF": 0, + "SUBUNIT": "French Southern and Antarctic Lands", + "SU_A3": "ATF", + "BRK_DIFF": 0, + "NAME": "Fr. S. Antarctic Lands", + "NAME_LONG": "French Southern and Antarctic Lands", + "BRK_A3": "ATF", + "BRK_NAME": "Fr. S. and Antarctic Lands", + "BRK_GROUP": null, + "ABBREV": "Fr. S.A.L.", + "POSTAL": "TF", + "FORMAL_EN": "Territory of the French Southern and Antarctic Lands", + "FORMAL_FR": null, + "NAME_CIAWF": null, + "NOTE_ADM0": "Fr.", + "NOTE_BRK": null, + "NAME_SORT": "French Southern and Antarctic Lands", + "NAME_ALT": null, + "MAPCOLOR7": 7, + "MAPCOLOR8": 5, + "MAPCOLOR9": 9, + "MAPCOLOR13": 11, + "POP_EST": 140, + "POP_RANK": 1, + "GDP_MD_EST": 16, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "FS", + "ISO_A2": "TF", + "ISO_A3": "ATF", + "ISO_A3_EH": "ATF", + "ISO_N3": "260", + "UN_A3": "-099", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": 28289406, + "WOE_ID_EH": 28289406, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ATF", + "ADM0_A3_US": "ATF", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Seven seas (open ocean)", + "REGION_UN": "Seven seas (open ocean)", + "SUBREGION": "Seven seas (open ocean)", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 22, + "LONG_LEN": 35, + "ABBREV_LEN": 10, + "TINY": 2, + "HOMEPART": -99, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [68.72, -49.775, 70.56, -48.625], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [68.935, -48.625], + [69.58, -48.94], + [70.525, -49.065], + [70.56, -49.255], + [70.28, -49.71], + [68.745, -49.775], + [68.72, -49.2425], + [68.8675, -48.83], + [68.935, -48.625] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Australia", + "SOV_A3": "AU1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Australia", + "ADM0_A3": "AUS", + "GEOU_DIF": 0, + "GEOUNIT": "Australia", + "GU_A3": "AUS", + "SU_DIF": 0, + "SUBUNIT": "Australia", + "SU_A3": "AUS", + "BRK_DIFF": 0, + "NAME": "Australia", + "NAME_LONG": "Australia", + "BRK_A3": "AUS", + "BRK_NAME": "Australia", + "BRK_GROUP": null, + "ABBREV": "Auz.", + "POSTAL": "AU", + "FORMAL_EN": "Commonwealth of Australia", + "FORMAL_FR": null, + "NAME_CIAWF": "Australia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Australia", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 7, + "POP_EST": 23232413, + "POP_RANK": 15, + "GDP_MD_EST": 1189000, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "AS", + "ISO_A2": "AU", + "ISO_A3": "AUS", + "ISO_A3_EH": "AUS", + "ISO_N3": "036", + "UN_A3": "036", + "WB_A2": "AU", + "WB_A3": "AUS", + "WOE_ID": -90, + "WOE_ID_EH": 23424748, + "WOE_NOTE": "Includes Ashmore and Cartier Islands (23424749) and Coral Sea Islands (23424790).", + "ADM0_A3_IS": "AUS", + "ADM0_A3_US": "AUS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Australia and New Zealand", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.7 + }, + "bbox": [113.338953, -43.634597, 153.569469, -10.668186], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [145.397978, -40.792549], + [146.364121, -41.137695], + [146.908584, -41.000546], + [147.689259, -40.808258], + [148.289068, -40.875438], + [148.359865, -42.062445], + [148.017301, -42.407024], + [147.914052, -43.211522], + [147.564564, -42.937689], + [146.870343, -43.634597], + [146.663327, -43.580854], + [146.048378, -43.549745], + [145.43193, -42.693776], + [145.29509, -42.03361], + [144.718071, -41.162552], + [144.743755, -40.703975], + [145.397978, -40.792549] + ] + ], + [ + [ + [143.561811, -13.763656], + [143.922099, -14.548311], + [144.563714, -14.171176], + [144.894908, -14.594458], + [145.374724, -14.984976], + [145.271991, -15.428205], + [145.48526, -16.285672], + [145.637033, -16.784918], + [145.888904, -16.906926], + [146.160309, -17.761655], + [146.063674, -18.280073], + [146.387478, -18.958274], + [147.471082, -19.480723], + [148.177602, -19.955939], + [148.848414, -20.39121], + [148.717465, -20.633469], + [149.28942, -21.260511], + [149.678337, -22.342512], + [150.077382, -22.122784], + [150.482939, -22.556142], + [150.727265, -22.402405], + [150.899554, -23.462237], + [151.609175, -24.076256], + [152.07354, -24.457887], + [152.855197, -25.267501], + [153.136162, -26.071173], + [153.161949, -26.641319], + [153.092909, -27.2603], + [153.569469, -28.110067], + [153.512108, -28.995077], + [153.339095, -29.458202], + [153.069241, -30.35024], + [153.089602, -30.923642], + [152.891578, -31.640446], + [152.450002, -32.550003], + [151.709117, -33.041342], + [151.343972, -33.816023], + [151.010555, -34.31036], + [150.714139, -35.17346], + [150.32822, -35.671879], + [150.075212, -36.420206], + [149.946124, -37.109052], + [149.997284, -37.425261], + [149.423882, -37.772681], + [148.304622, -37.809061], + [147.381733, -38.219217], + [146.922123, -38.606532], + [146.317922, -39.035757], + [145.489652, -38.593768], + [144.876976, -38.417448], + [145.032212, -37.896188], + [144.485682, -38.085324], + [143.609974, -38.809465], + [142.745427, -38.538268], + [142.17833, -38.380034], + [141.606582, -38.308514], + [140.638579, -38.019333], + [139.992158, -37.402936], + [139.806588, -36.643603], + [139.574148, -36.138362], + [139.082808, -35.732754], + [138.120748, -35.612296], + [138.449462, -35.127261], + [138.207564, -34.384723], + [137.71917, -35.076825], + [136.829406, -35.260535], + [137.352371, -34.707339], + [137.503886, -34.130268], + [137.890116, -33.640479], + [137.810328, -32.900007], + [136.996837, -33.752771], + [136.372069, -34.094766], + [135.989043, -34.890118], + [135.208213, -34.47867], + [135.239218, -33.947953], + [134.613417, -33.222778], + [134.085904, -32.848072], + [134.273903, -32.617234], + [132.990777, -32.011224], + [132.288081, -31.982647], + [131.326331, -31.495803], + [129.535794, -31.590423], + [128.240938, -31.948489], + [127.102867, -32.282267], + [126.148714, -32.215966], + [125.088623, -32.728751], + [124.221648, -32.959487], + [124.028947, -33.483847], + [123.659667, -33.890179], + [122.811036, -33.914467], + [122.183064, -34.003402], + [121.299191, -33.821036], + [120.580268, -33.930177], + [119.893695, -33.976065], + [119.298899, -34.509366], + [119.007341, -34.464149], + [118.505718, -34.746819], + [118.024972, -35.064733], + [117.295507, -35.025459], + [116.625109, -35.025097], + [115.564347, -34.386428], + [115.026809, -34.196517], + [115.048616, -33.623425], + [115.545123, -33.487258], + [115.714674, -33.259572], + [115.679379, -32.900369], + [115.801645, -32.205062], + [115.689611, -31.612437], + [115.160909, -30.601594], + [114.997043, -30.030725], + [115.040038, -29.461095], + [114.641974, -28.810231], + [114.616498, -28.516399], + [114.173579, -28.118077], + [114.048884, -27.334765], + [113.477498, -26.543134], + [113.338953, -26.116545], + [113.778358, -26.549025], + [113.440962, -25.621278], + [113.936901, -25.911235], + [114.232852, -26.298446], + [114.216161, -25.786281], + [113.721255, -24.998939], + [113.625344, -24.683971], + [113.393523, -24.384764], + [113.502044, -23.80635], + [113.706993, -23.560215], + [113.843418, -23.059987], + [113.736552, -22.475475], + [114.149756, -21.755881], + [114.225307, -22.517488], + [114.647762, -21.82952], + [115.460167, -21.495173], + [115.947373, -21.068688], + [116.711615, -20.701682], + [117.166316, -20.623599], + [117.441545, -20.746899], + [118.229559, -20.374208], + [118.836085, -20.263311], + [118.987807, -20.044203], + [119.252494, -19.952942], + [119.805225, -19.976506], + [120.85622, -19.683708], + [121.399856, -19.239756], + [121.655138, -18.705318], + [122.241665, -18.197649], + [122.286624, -17.798603], + [122.312772, -17.254967], + [123.012574, -16.4052], + [123.433789, -17.268558], + [123.859345, -17.069035], + [123.503242, -16.596506], + [123.817073, -16.111316], + [124.258287, -16.327944], + [124.379726, -15.56706], + [124.926153, -15.0751], + [125.167275, -14.680396], + [125.670087, -14.51007], + [125.685796, -14.230656], + [126.125149, -14.347341], + [126.142823, -14.095987], + [126.582589, -13.952791], + [127.065867, -13.817968], + [127.804633, -14.276906], + [128.35969, -14.86917], + [128.985543, -14.875991], + [129.621473, -14.969784], + [129.4096, -14.42067], + [129.888641, -13.618703], + [130.339466, -13.357376], + [130.183506, -13.10752], + [130.617795, -12.536392], + [131.223495, -12.183649], + [131.735091, -12.302453], + [132.575298, -12.114041], + [132.557212, -11.603012], + [131.824698, -11.273782], + [132.357224, -11.128519], + [133.019561, -11.376411], + [133.550846, -11.786515], + [134.393068, -12.042365], + [134.678632, -11.941183], + [135.298491, -12.248606], + [135.882693, -11.962267], + [136.258381, -12.049342], + [136.492475, -11.857209], + [136.95162, -12.351959], + [136.685125, -12.887223], + [136.305407, -13.29123], + [135.961758, -13.324509], + [136.077617, -13.724278], + [135.783836, -14.223989], + [135.428664, -14.715432], + [135.500184, -14.997741], + [136.295175, -15.550265], + [137.06536, -15.870762], + [137.580471, -16.215082], + [138.303217, -16.807604], + [138.585164, -16.806622], + [139.108543, -17.062679], + [139.260575, -17.371601], + [140.215245, -17.710805], + [140.875463, -17.369069], + [141.07111, -16.832047], + [141.274095, -16.38887], + [141.398222, -15.840532], + [141.702183, -15.044921], + [141.56338, -14.561333], + [141.63552, -14.270395], + [141.519869, -13.698078], + [141.65092, -12.944688], + [141.842691, -12.741548], + [141.68699, -12.407614], + [141.928629, -11.877466], + [142.118488, -11.328042], + [142.143706, -11.042737], + [142.51526, -10.668186], + [142.79731, -11.157355], + [142.866763, -11.784707], + [143.115947, -11.90563], + [143.158632, -12.325656], + [143.522124, -12.834358], + [143.597158, -13.400422], + [143.561811, -13.763656] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Austria", + "SOV_A3": "AUT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Austria", + "ADM0_A3": "AUT", + "GEOU_DIF": 0, + "GEOUNIT": "Austria", + "GU_A3": "AUT", + "SU_DIF": 0, + "SUBUNIT": "Austria", + "SU_A3": "AUT", + "BRK_DIFF": 0, + "NAME": "Austria", + "NAME_LONG": "Austria", + "BRK_A3": "AUT", + "BRK_NAME": "Austria", + "BRK_GROUP": null, + "ABBREV": "Aust.", + "POSTAL": "A", + "FORMAL_EN": "Republic of Austria", + "FORMAL_FR": null, + "NAME_CIAWF": "Austria", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Austria", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 4, + "POP_EST": 8754413, + "POP_RANK": 13, + "GDP_MD_EST": 416600, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "AU", + "ISO_A2": "AT", + "ISO_A3": "AUT", + "ISO_A3_EH": "AUT", + "ISO_N3": "040", + "UN_A3": "040", + "WB_A2": "AT", + "WB_A3": "AUT", + "WOE_ID": 23424750, + "WOE_ID_EH": 23424750, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "AUT", + "ADM0_A3_US": "AUT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [9.47997, 46.431817, 16.979667, 49.039074], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.979667, 48.123497], + [16.903754, 47.714866], + [16.340584, 47.712902], + [16.534268, 47.496171], + [16.202298, 46.852386], + [16.011664, 46.683611], + [15.137092, 46.658703], + [14.632472, 46.431817], + [13.806475, 46.509306], + [12.376485, 46.767559], + [12.153088, 47.115393], + [11.164828, 46.941579], + [11.048556, 46.751359], + [10.442701, 46.893546], + [9.932448, 46.920728], + [9.47997, 47.10281], + [9.632932, 47.347601], + [9.594226, 47.525058], + [9.896068, 47.580197], + [10.402084, 47.302488], + [10.544504, 47.566399], + [11.426414, 47.523766], + [12.141357, 47.703083], + [12.62076, 47.672388], + [12.932627, 47.467646], + [13.025851, 47.637584], + [12.884103, 48.289146], + [13.243357, 48.416115], + [13.595946, 48.877172], + [14.338898, 48.555305], + [14.901447, 48.964402], + [15.253416, 49.039074], + [16.029647, 48.733899], + [16.499283, 48.785808], + [16.960288, 48.596982], + [16.879983, 48.470013], + [16.979667, 48.123497] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Azerbaijan", + "SOV_A3": "AZE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Azerbaijan", + "ADM0_A3": "AZE", + "GEOU_DIF": 0, + "GEOUNIT": "Azerbaijan", + "GU_A3": "AZE", + "SU_DIF": 0, + "SUBUNIT": "Azerbaijan", + "SU_A3": "AZE", + "BRK_DIFF": 0, + "NAME": "Azerbaijan", + "NAME_LONG": "Azerbaijan", + "BRK_A3": "AZE", + "BRK_NAME": "Azerbaijan", + "BRK_GROUP": null, + "ABBREV": "Aze.", + "POSTAL": "AZ", + "FORMAL_EN": "Republic of Azerbaijan", + "FORMAL_FR": null, + "NAME_CIAWF": "Azerbaijan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Azerbaijan", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 6, + "MAPCOLOR9": 5, + "MAPCOLOR13": 8, + "POP_EST": 9961396, + "POP_RANK": 13, + "GDP_MD_EST": 167900, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AJ", + "ISO_A2": "AZ", + "ISO_A3": "AZE", + "ISO_A3_EH": "AZE", + "ISO_N3": "031", + "UN_A3": "031", + "WB_A2": "AZ", + "WB_A3": "AZE", + "WOE_ID": 23424741, + "WOE_ID_EH": 23424741, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "AZE", + "ADM0_A3_US": "AZE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [44.79399, 38.270378, 50.392821, 41.860675], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [46.50572, 38.770605], + [46.483499, 39.464155], + [46.034534, 39.628021], + [45.610012, 39.899994], + [45.891907, 40.218476], + [45.359175, 40.561504], + [45.560351, 40.81229], + [45.179496, 40.985354], + [44.97248, 41.248129], + [45.217426, 41.411452], + [45.962601, 41.123873], + [46.501637, 41.064445], + [46.637908, 41.181673], + [46.145432, 41.722802], + [46.404951, 41.860675], + [46.686071, 41.827137], + [47.373315, 41.219732], + [47.815666, 41.151416], + [47.987283, 41.405819], + [48.584353, 41.808869], + [49.110264, 41.282287], + [49.618915, 40.572924], + [50.08483, 40.526157], + [50.392821, 40.256561], + [49.569202, 40.176101], + [49.395259, 39.399482], + [49.223228, 39.049219], + [48.856532, 38.815486], + [48.883249, 38.320245], + [48.634375, 38.270378], + [48.010744, 38.794015], + [48.355529, 39.288765], + [48.060095, 39.582235], + [47.685079, 39.508364], + [46.50572, 38.770605] + ] + ], + [ + [ + [44.79399, 39.713003], + [45.001987, 39.740004], + [45.298145, 39.471751], + [45.739978, 39.473999], + [45.735379, 39.319719], + [46.143623, 38.741201], + [45.457722, 38.874139], + [44.952688, 39.335765], + [44.79399, 39.713003] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Burundi", + "SOV_A3": "BDI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Burundi", + "ADM0_A3": "BDI", + "GEOU_DIF": 0, + "GEOUNIT": "Burundi", + "GU_A3": "BDI", + "SU_DIF": 0, + "SUBUNIT": "Burundi", + "SU_A3": "BDI", + "BRK_DIFF": 0, + "NAME": "Burundi", + "NAME_LONG": "Burundi", + "BRK_A3": "BDI", + "BRK_NAME": "Burundi", + "BRK_GROUP": null, + "ABBREV": "Bur.", + "POSTAL": "BI", + "FORMAL_EN": "Republic of Burundi", + "FORMAL_FR": null, + "NAME_CIAWF": "Burundi", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Burundi", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 8, + "POP_EST": 11466756, + "POP_RANK": 14, + "GDP_MD_EST": 7892, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "BY", + "ISO_A2": "BI", + "ISO_A3": "BDI", + "ISO_A3_EH": "BDI", + "ISO_N3": "108", + "UN_A3": "108", + "WB_A2": "BI", + "WB_A3": "BDI", + "WOE_ID": 23424774, + "WOE_ID_EH": 23424774, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BDI", + "ADM0_A3_US": "BDI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [29.024926, -4.499983, 30.75224, -2.348487], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [29.339998, -4.499983], + [29.276384, -3.293907], + [29.024926, -2.839258], + [29.632176, -2.917858], + [29.938359, -2.348487], + [30.469674, -2.413855], + [30.52766, -2.80762], + [30.74301, -3.03431], + [30.75224, -3.35931], + [30.50554, -3.56858], + [30.11632, -4.09012], + [29.753512, -4.452389], + [29.339998, -4.499983] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Belgium", + "SOV_A3": "BEL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Belgium", + "ADM0_A3": "BEL", + "GEOU_DIF": 0, + "GEOUNIT": "Belgium", + "GU_A3": "BEL", + "SU_DIF": 0, + "SUBUNIT": "Belgium", + "SU_A3": "BEL", + "BRK_DIFF": 0, + "NAME": "Belgium", + "NAME_LONG": "Belgium", + "BRK_A3": "BEL", + "BRK_NAME": "Belgium", + "BRK_GROUP": null, + "ABBREV": "Belg.", + "POSTAL": "B", + "FORMAL_EN": "Kingdom of Belgium", + "FORMAL_FR": null, + "NAME_CIAWF": "Belgium", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Belgium", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 1, + "MAPCOLOR13": 8, + "POP_EST": 11491346, + "POP_RANK": 14, + "GDP_MD_EST": 508600, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "BE", + "ISO_A2": "BE", + "ISO_A3": "BEL", + "ISO_A3_EH": "BEL", + "ISO_N3": "056", + "UN_A3": "056", + "WB_A2": "BE", + "WB_A3": "BEL", + "WOE_ID": 23424757, + "WOE_ID_EH": 23424757, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BEL", + "ADM0_A3_US": "BEL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [2.513573, 49.529484, 6.156658, 51.475024], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.047071, 51.267259], + [4.973991, 51.475024], + [5.606976, 51.037298], + [6.156658, 50.803721], + [6.043073, 50.128052], + [5.782417, 50.090328], + [5.674052, 49.529484], + [4.799222, 49.985373], + [4.286023, 49.907497], + [3.588184, 50.378992], + [3.123252, 50.780363], + [2.658422, 50.796848], + [2.513573, 51.148506], + [3.314971, 51.345781], + [3.315011, 51.345777], + [3.314971, 51.345755], + [4.047071, 51.267259] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Benin", + "SOV_A3": "BEN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Benin", + "ADM0_A3": "BEN", + "GEOU_DIF": 0, + "GEOUNIT": "Benin", + "GU_A3": "BEN", + "SU_DIF": 0, + "SUBUNIT": "Benin", + "SU_A3": "BEN", + "BRK_DIFF": 0, + "NAME": "Benin", + "NAME_LONG": "Benin", + "BRK_A3": "BEN", + "BRK_NAME": "Benin", + "BRK_GROUP": null, + "ABBREV": "Benin", + "POSTAL": "BJ", + "FORMAL_EN": "Republic of Benin", + "FORMAL_FR": null, + "NAME_CIAWF": "Benin", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Benin", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 12, + "POP_EST": 11038805, + "POP_RANK": 14, + "GDP_MD_EST": 24310, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "BN", + "ISO_A2": "BJ", + "ISO_A3": "BEN", + "ISO_A3_EH": "BEN", + "ISO_N3": "204", + "UN_A3": "204", + "WB_A2": "BJ", + "WB_A3": "BEN", + "WOE_ID": 23424764, + "WOE_ID_EH": 23424764, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BEN", + "ADM0_A3_US": "BEN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [0.772336, 6.142158, 3.797112, 12.235636], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [2.691702, 6.258817], + [1.865241, 6.142158], + [1.618951, 6.832038], + [1.664478, 9.12859], + [1.463043, 9.334624], + [1.425061, 9.825395], + [1.077795, 10.175607], + [0.772336, 10.470808], + [0.899563, 10.997339], + [1.24347, 11.110511], + [1.447178, 11.547719], + [1.935986, 11.64115], + [2.154474, 11.94015], + [2.490164, 12.233052], + [2.848643, 12.235636], + [3.61118, 11.660167], + [3.572216, 11.327939], + [3.797112, 10.734746], + [3.60007, 10.332186], + [3.705438, 10.06321], + [3.220352, 9.444153], + [2.912308, 9.137608], + [2.723793, 8.506845], + [2.749063, 7.870734], + [2.691702, 6.258817] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Burkina Faso", + "SOV_A3": "BFA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Burkina Faso", + "ADM0_A3": "BFA", + "GEOU_DIF": 0, + "GEOUNIT": "Burkina Faso", + "GU_A3": "BFA", + "SU_DIF": 0, + "SUBUNIT": "Burkina Faso", + "SU_A3": "BFA", + "BRK_DIFF": 0, + "NAME": "Burkina Faso", + "NAME_LONG": "Burkina Faso", + "BRK_A3": "BFA", + "BRK_NAME": "Burkina Faso", + "BRK_GROUP": null, + "ABBREV": "B.F.", + "POSTAL": "BF", + "FORMAL_EN": "Burkina Faso", + "FORMAL_FR": null, + "NAME_CIAWF": "Burkina Faso", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Burkina Faso", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 1, + "MAPCOLOR9": 5, + "MAPCOLOR13": 11, + "POP_EST": 20107509, + "POP_RANK": 15, + "GDP_MD_EST": 32990, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "UV", + "ISO_A2": "BF", + "ISO_A3": "BFA", + "ISO_A3_EH": "BFA", + "ISO_N3": "854", + "UN_A3": "854", + "WB_A2": "BF", + "WB_A3": "BFA", + "WOE_ID": 23424978, + "WOE_ID_EH": 23424978, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BFA", + "ADM0_A3_US": "BFA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 12, + "LONG_LEN": 12, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-5.470565, 9.610835, 2.177108, 15.116158], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [2.154474, 11.94015], + [1.935986, 11.64115], + [1.447178, 11.547719], + [1.24347, 11.110511], + [0.899563, 10.997339], + [0.023803, 11.018682], + [-0.438702, 11.098341], + [-0.761576, 10.93693], + [-1.203358, 11.009819], + [-2.940409, 10.96269], + [-2.963896, 10.395335], + [-2.827496, 9.642461], + [-3.511899, 9.900326], + [-3.980449, 9.862344], + [-4.330247, 9.610835], + [-4.779884, 9.821985], + [-4.954653, 10.152714], + [-5.404342, 10.370737], + [-5.470565, 10.95127], + [-5.197843, 11.375146], + [-5.220942, 11.713859], + [-4.427166, 12.542646], + [-4.280405, 13.228444], + [-4.006391, 13.472485], + [-3.522803, 13.337662], + [-3.103707, 13.541267], + [-2.967694, 13.79815], + [-2.191825, 14.246418], + [-2.001035, 14.559008], + [-1.066363, 14.973815], + [-0.515854, 15.116158], + [-0.266257, 14.924309], + [0.374892, 14.928908], + [0.295646, 14.444235], + [0.429928, 13.988733], + [0.993046, 13.33575], + [1.024103, 12.851826], + [2.177108, 12.625018], + [2.154474, 11.94015] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Bangladesh", + "SOV_A3": "BGD", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Bangladesh", + "ADM0_A3": "BGD", + "GEOU_DIF": 0, + "GEOUNIT": "Bangladesh", + "GU_A3": "BGD", + "SU_DIF": 0, + "SUBUNIT": "Bangladesh", + "SU_A3": "BGD", + "BRK_DIFF": 0, + "NAME": "Bangladesh", + "NAME_LONG": "Bangladesh", + "BRK_A3": "BGD", + "BRK_NAME": "Bangladesh", + "BRK_GROUP": null, + "ABBREV": "Bang.", + "POSTAL": "BD", + "FORMAL_EN": "People's Republic of Bangladesh", + "FORMAL_FR": null, + "NAME_CIAWF": "Bangladesh", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bangladesh", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 4, + "MAPCOLOR9": 7, + "MAPCOLOR13": 7, + "POP_EST": 157826578, + "POP_RANK": 17, + "GDP_MD_EST": 628400, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "BG", + "ISO_A2": "BD", + "ISO_A3": "BGD", + "ISO_A3_EH": "BGD", + "ISO_N3": "050", + "UN_A3": "050", + "WB_A2": "BD", + "WB_A3": "BGD", + "WOE_ID": 23424759, + "WOE_ID_EH": 23424759, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BGD", + "ADM0_A3_US": "BGD", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [88.084422, 20.670883, 92.672721, 26.446526], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [92.672721, 22.041239], + [92.652257, 21.324048], + [92.303234, 21.475485], + [92.368554, 20.670883], + [92.082886, 21.192195], + [92.025215, 21.70157], + [91.834891, 22.182936], + [91.417087, 22.765019], + [90.496006, 22.805017], + [90.586957, 22.392794], + [90.272971, 21.836368], + [89.847467, 22.039146], + [89.70205, 21.857116], + [89.418863, 21.966179], + [89.031961, 22.055708], + [88.876312, 22.879146], + [88.52977, 23.631142], + [88.69994, 24.233715], + [88.084422, 24.501657], + [88.306373, 24.866079], + [88.931554, 25.238692], + [88.209789, 25.768066], + [88.563049, 26.446526], + [89.355094, 26.014407], + [89.832481, 25.965082], + [89.920693, 25.26975], + [90.872211, 25.132601], + [91.799596, 25.147432], + [92.376202, 24.976693], + [91.915093, 24.130414], + [91.46773, 24.072639], + [91.158963, 23.503527], + [91.706475, 22.985264], + [91.869928, 23.624346], + [92.146035, 23.627499], + [92.672721, 22.041239] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Bulgaria", + "SOV_A3": "BGR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Bulgaria", + "ADM0_A3": "BGR", + "GEOU_DIF": 0, + "GEOUNIT": "Bulgaria", + "GU_A3": "BGR", + "SU_DIF": 0, + "SUBUNIT": "Bulgaria", + "SU_A3": "BGR", + "BRK_DIFF": 0, + "NAME": "Bulgaria", + "NAME_LONG": "Bulgaria", + "BRK_A3": "BGR", + "BRK_NAME": "Bulgaria", + "BRK_GROUP": null, + "ABBREV": "Bulg.", + "POSTAL": "BG", + "FORMAL_EN": "Republic of Bulgaria", + "FORMAL_FR": null, + "NAME_CIAWF": "Bulgaria", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bulgaria", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 1, + "MAPCOLOR13": 8, + "POP_EST": 7101510, + "POP_RANK": 13, + "GDP_MD_EST": 143100, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BU", + "ISO_A2": "BG", + "ISO_A3": "BGR", + "ISO_A3_EH": "BGR", + "ISO_N3": "100", + "UN_A3": "100", + "WB_A2": "BG", + "WB_A3": "BGR", + "WOE_ID": 23424771, + "WOE_ID_EH": 23424771, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BGR", + "ADM0_A3_US": "BGR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [22.380526, 41.234486, 28.558081, 44.234923], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.65715, 44.234923], + [22.944832, 43.823785], + [23.332302, 43.897011], + [24.100679, 43.741051], + [25.569272, 43.688445], + [26.065159, 43.943494], + [27.2424, 44.175986], + [27.970107, 43.812468], + [28.558081, 43.707462], + [28.039095, 43.293172], + [27.673898, 42.577892], + [27.99672, 42.007359], + [27.135739, 42.141485], + [26.117042, 41.826905], + [26.106138, 41.328899], + [25.197201, 41.234486], + [24.492645, 41.583896], + [23.692074, 41.309081], + [22.952377, 41.337994], + [22.881374, 41.999297], + [22.380526, 42.32026], + [22.545012, 42.461362], + [22.436595, 42.580321], + [22.604801, 42.898519], + [22.986019, 43.211161], + [22.500157, 43.642814], + [22.410446, 44.008063], + [22.65715, 44.234923] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "The Bahamas", + "SOV_A3": "BHS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "The Bahamas", + "ADM0_A3": "BHS", + "GEOU_DIF": 0, + "GEOUNIT": "The Bahamas", + "GU_A3": "BHS", + "SU_DIF": 0, + "SUBUNIT": "The Bahamas", + "SU_A3": "BHS", + "BRK_DIFF": 0, + "NAME": "Bahamas", + "NAME_LONG": "Bahamas", + "BRK_A3": "BHS", + "BRK_NAME": "Bahamas", + "BRK_GROUP": null, + "ABBREV": "Bhs.", + "POSTAL": "BS", + "FORMAL_EN": "Commonwealth of the Bahamas", + "FORMAL_FR": null, + "NAME_CIAWF": "Bahamas, The", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bahamas, The", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 1, + "MAPCOLOR9": 2, + "MAPCOLOR13": 5, + "POP_EST": 329988, + "POP_RANK": 10, + "GDP_MD_EST": 9066, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "BF", + "ISO_A2": "BS", + "ISO_A3": "BHS", + "ISO_A3_EH": "BHS", + "ISO_N3": "044", + "UN_A3": "044", + "WB_A2": "BS", + "WB_A3": "BHS", + "WOE_ID": 23424758, + "WOE_ID_EH": 23424758, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BHS", + "ADM0_A3_US": "BHS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-78.98, 23.71, -77, 27.04], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-77.53466, 23.75975], + [-77.78, 23.71], + [-78.03405, 24.28615], + [-78.40848, 24.57564], + [-78.19087, 25.2103], + [-77.89, 25.17], + [-77.54, 24.34], + [-77.53466, 23.75975] + ] + ], + [ + [ + [-77.82, 26.58], + [-78.91, 26.42], + [-78.98, 26.79], + [-78.51, 26.87], + [-77.85, 26.84], + [-77.82, 26.58] + ] + ], + [ + [ + [-77, 26.59], + [-77.17255, 25.87918], + [-77.35641, 26.00735], + [-77.34, 26.53], + [-77.78802, 26.92516], + [-77.79, 27.04], + [-77, 26.59] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Bosnia and Herzegovina", + "SOV_A3": "BIH", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Bosnia and Herzegovina", + "ADM0_A3": "BIH", + "GEOU_DIF": 0, + "GEOUNIT": "Bosnia and Herzegovina", + "GU_A3": "BIH", + "SU_DIF": 0, + "SUBUNIT": "Bosnia and Herzegovina", + "SU_A3": "BIH", + "BRK_DIFF": 0, + "NAME": "Bosnia and Herz.", + "NAME_LONG": "Bosnia and Herzegovina", + "BRK_A3": "BIH", + "BRK_NAME": "Bosnia and Herz.", + "BRK_GROUP": null, + "ABBREV": "B.H.", + "POSTAL": "BiH", + "FORMAL_EN": "Bosnia and Herzegovina", + "FORMAL_FR": null, + "NAME_CIAWF": "Bosnia and Herzegovina", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bosnia and Herzegovina", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 1, + "MAPCOLOR9": 1, + "MAPCOLOR13": 2, + "POP_EST": 3856181, + "POP_RANK": 12, + "GDP_MD_EST": 42530, + "POP_YEAR": 2017, + "LASTCENSUS": 1991, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BK", + "ISO_A2": "BA", + "ISO_A3": "BIH", + "ISO_A3_EH": "BIH", + "ISO_N3": "070", + "UN_A3": "070", + "WB_A2": "BA", + "WB_A3": "BIH", + "WOE_ID": 23424761, + "WOE_ID_EH": 23424761, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BIH", + "ADM0_A3_US": "BIH", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 16, + "LONG_LEN": 22, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [15.750026, 42.65, 19.59976, 45.233777], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.36803, 44.863], + [19.11761, 44.42307], + [19.59976, 44.03847], + [19.454, 43.5681], + [19.21852, 43.52384], + [19.03165, 43.43253], + [18.70648, 43.20011], + [18.56, 42.65], + [17.674922, 43.028563], + [17.297373, 43.446341], + [16.916156, 43.667722], + [16.456443, 44.04124], + [16.23966, 44.351143], + [15.750026, 44.818712], + [15.959367, 45.233777], + [16.318157, 45.004127], + [16.534939, 45.211608], + [17.002146, 45.233777], + [17.861783, 45.06774], + [18.553214, 45.08159], + [19.005485, 44.860234], + [19.00548, 44.86023], + [19.36803, 44.863] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Belarus", + "SOV_A3": "BLR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Belarus", + "ADM0_A3": "BLR", + "GEOU_DIF": 0, + "GEOUNIT": "Belarus", + "GU_A3": "BLR", + "SU_DIF": 0, + "SUBUNIT": "Belarus", + "SU_A3": "BLR", + "BRK_DIFF": 0, + "NAME": "Belarus", + "NAME_LONG": "Belarus", + "BRK_A3": "BLR", + "BRK_NAME": "Belarus", + "BRK_GROUP": null, + "ABBREV": "Bela.", + "POSTAL": "BY", + "FORMAL_EN": "Republic of Belarus", + "FORMAL_FR": null, + "NAME_CIAWF": "Belarus", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Belarus", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 1, + "MAPCOLOR9": 5, + "MAPCOLOR13": 11, + "POP_EST": 9549747, + "POP_RANK": 13, + "GDP_MD_EST": 165400, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BO", + "ISO_A2": "BY", + "ISO_A3": "BLR", + "ISO_A3_EH": "BLR", + "ISO_N3": "112", + "UN_A3": "112", + "WB_A2": "BY", + "WB_A3": "BLR", + "WOE_ID": 23424765, + "WOE_ID_EH": 23424765, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BLR", + "ADM0_A3_US": "BLR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [23.199494, 51.319503, 32.693643, 56.16913], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.484128, 53.912498], + [24.450684, 53.905702], + [25.536354, 54.282423], + [25.768433, 54.846963], + [26.588279, 55.167176], + [26.494331, 55.615107], + [27.10246, 55.783314], + [28.176709, 56.16913], + [29.229513, 55.918344], + [29.371572, 55.670091], + [29.896294, 55.789463], + [30.873909, 55.550976], + [30.971836, 55.081548], + [30.757534, 54.811771], + [31.384472, 54.157056], + [31.791424, 53.974639], + [31.731273, 53.794029], + [32.405599, 53.618045], + [32.693643, 53.351421], + [32.304519, 53.132726], + [31.49764, 53.16743], + [31.305201, 53.073996], + [31.540018, 52.742052], + [31.78597, 52.10168], + [31.785992, 52.101678], + [30.927549, 52.042353], + [30.619454, 51.822806], + [30.555117, 51.319503], + [30.157364, 51.416138], + [29.254938, 51.368234], + [28.992835, 51.602044], + [28.617613, 51.427714], + [28.241615, 51.572227], + [27.454066, 51.592303], + [26.337959, 51.832289], + [25.327788, 51.910656], + [24.553106, 51.888461], + [24.005078, 51.617444], + [23.527071, 51.578454], + [23.508002, 52.023647], + [23.199494, 52.486977], + [23.799199, 52.691099], + [23.804935, 53.089731], + [23.527536, 53.470122], + [23.484128, 53.912498] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Belize", + "SOV_A3": "BLZ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Belize", + "ADM0_A3": "BLZ", + "GEOU_DIF": 0, + "GEOUNIT": "Belize", + "GU_A3": "BLZ", + "SU_DIF": 0, + "SUBUNIT": "Belize", + "SU_A3": "BLZ", + "BRK_DIFF": 0, + "NAME": "Belize", + "NAME_LONG": "Belize", + "BRK_A3": "BLZ", + "BRK_NAME": "Belize", + "BRK_GROUP": null, + "ABBREV": "Belize", + "POSTAL": "BZ", + "FORMAL_EN": "Belize", + "FORMAL_FR": null, + "NAME_CIAWF": "Belize", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Belize", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 5, + "MAPCOLOR13": 7, + "POP_EST": 360346, + "POP_RANK": 10, + "GDP_MD_EST": 3088, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BH", + "ISO_A2": "BZ", + "ISO_A3": "BLZ", + "ISO_A3_EH": "BLZ", + "ISO_N3": "084", + "UN_A3": "084", + "WB_A2": "BZ", + "WB_A3": "BLZ", + "WOE_ID": 23424760, + "WOE_ID_EH": 23424760, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BLZ", + "ADM0_A3_US": "BLZ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [-89.229122, 15.886938, -88.106813, 18.499982], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-89.14308, 17.808319], + [-89.150909, 17.955468], + [-89.029857, 18.001511], + [-88.848344, 17.883198], + [-88.490123, 18.486831], + [-88.300031, 18.499982], + [-88.296336, 18.353273], + [-88.106813, 18.348674], + [-88.123479, 18.076675], + [-88.285355, 17.644143], + [-88.197867, 17.489475], + [-88.302641, 17.131694], + [-88.239518, 17.036066], + [-88.355428, 16.530774], + [-88.551825, 16.265467], + [-88.732434, 16.233635], + [-88.930613, 15.887273], + [-89.229122, 15.886938], + [-89.150806, 17.015577], + [-89.14308, 17.808319] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Bolivia", + "SOV_A3": "BOL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Bolivia", + "ADM0_A3": "BOL", + "GEOU_DIF": 0, + "GEOUNIT": "Bolivia", + "GU_A3": "BOL", + "SU_DIF": 0, + "SUBUNIT": "Bolivia", + "SU_A3": "BOL", + "BRK_DIFF": 0, + "NAME": "Bolivia", + "NAME_LONG": "Bolivia", + "BRK_A3": "BOL", + "BRK_NAME": "Bolivia", + "BRK_GROUP": null, + "ABBREV": "Bolivia", + "POSTAL": "BO", + "FORMAL_EN": "Plurinational State of Bolivia", + "FORMAL_FR": null, + "NAME_CIAWF": "Bolivia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bolivia", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 5, + "MAPCOLOR9": 2, + "MAPCOLOR13": 3, + "POP_EST": 11138234, + "POP_RANK": 14, + "GDP_MD_EST": 78350, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BL", + "ISO_A2": "BO", + "ISO_A3": "BOL", + "ISO_A3_EH": "BOL", + "ISO_N3": "068", + "UN_A3": "068", + "WB_A2": "BO", + "WB_A3": "BOL", + "WOE_ID": 23424762, + "WOE_ID_EH": 23424762, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BOL", + "ADM0_A3_US": "BOL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7.5 + }, + "bbox": [-69.590424, -22.872919, -57.498371, -9.761988], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-62.685057, -22.249029], + [-62.846468, -22.034985], + [-63.986838, -21.993644], + [-64.377021, -22.798091], + [-64.964892, -22.075862], + [-66.273339, -21.83231], + [-67.106674, -22.735925], + [-67.82818, -22.872919], + [-68.219913, -21.494347], + [-68.757167, -20.372658], + [-68.442225, -19.405068], + [-68.966818, -18.981683], + [-69.100247, -18.260125], + [-69.590424, -17.580012], + [-68.959635, -16.500698], + [-69.389764, -15.660129], + [-69.160347, -15.323974], + [-69.339535, -14.953195], + [-68.948887, -14.453639], + [-68.929224, -13.602684], + [-68.88008, -12.899729], + [-68.66508, -12.5613], + [-69.529678, -10.951734], + [-68.786158, -11.03638], + [-68.271254, -11.014521], + [-68.048192, -10.712059], + [-67.173801, -10.306812], + [-66.646908, -9.931331], + [-65.338435, -9.761988], + [-65.444837, -10.511451], + [-65.321899, -10.895872], + [-65.402281, -11.56627], + [-64.316353, -12.461978], + [-63.196499, -12.627033], + [-62.80306, -13.000653], + [-62.127081, -13.198781], + [-61.713204, -13.489202], + [-61.084121, -13.479384], + [-60.503304, -13.775955], + [-60.459198, -14.354007], + [-60.264326, -14.645979], + [-60.251149, -15.077219], + [-60.542966, -15.09391], + [-60.15839, -16.258284], + [-58.24122, -16.299573], + [-58.388058, -16.877109], + [-58.280804, -17.27171], + [-57.734558, -17.552468], + [-57.498371, -18.174188], + [-57.676009, -18.96184], + [-57.949997, -19.400004], + [-57.853802, -19.969995], + [-58.166392, -20.176701], + [-58.183471, -19.868399], + [-59.115042, -19.356906], + [-60.043565, -19.342747], + [-61.786326, -19.633737], + [-62.265961, -20.513735], + [-62.291179, -21.051635], + [-62.685057, -22.249029] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Brazil", + "SOV_A3": "BRA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Brazil", + "ADM0_A3": "BRA", + "GEOU_DIF": 0, + "GEOUNIT": "Brazil", + "GU_A3": "BRA", + "SU_DIF": 0, + "SUBUNIT": "Brazil", + "SU_A3": "BRA", + "BRK_DIFF": 0, + "NAME": "Brazil", + "NAME_LONG": "Brazil", + "BRK_A3": "BRA", + "BRK_NAME": "Brazil", + "BRK_GROUP": null, + "ABBREV": "Brazil", + "POSTAL": "BR", + "FORMAL_EN": "Federative Republic of Brazil", + "FORMAL_FR": null, + "NAME_CIAWF": "Brazil", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Brazil", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 5, + "MAPCOLOR13": 7, + "POP_EST": 207353391, + "POP_RANK": 17, + "GDP_MD_EST": 3081000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "3. Emerging region: BRIC", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BR", + "ISO_A2": "BR", + "ISO_A3": "BRA", + "ISO_A3_EH": "BRA", + "ISO_N3": "076", + "UN_A3": "076", + "WB_A2": "BR", + "WB_A3": "BRA", + "WOE_ID": 23424768, + "WOE_ID_EH": 23424768, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BRA", + "ADM0_A3_US": "BRA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.7 + }, + "bbox": [-73.987235, -33.768378, -34.729993, 5.244486], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-57.625133, -30.216295], + [-56.2909, -28.852761], + [-55.162286, -27.881915], + [-54.490725, -27.474757], + [-53.648735, -26.923473], + [-53.628349, -26.124865], + [-54.13005, -25.547639], + [-54.625291, -25.739255], + [-54.428946, -25.162185], + [-54.293476, -24.5708], + [-54.29296, -24.021014], + [-54.652834, -23.839578], + [-55.027902, -24.001274], + [-55.400747, -23.956935], + [-55.517639, -23.571998], + [-55.610683, -22.655619], + [-55.797958, -22.35693], + [-56.473317, -22.0863], + [-56.88151, -22.282154], + [-57.937156, -22.090176], + [-57.870674, -20.732688], + [-58.166392, -20.176701], + [-57.853802, -19.969995], + [-57.949997, -19.400004], + [-57.676009, -18.96184], + [-57.498371, -18.174188], + [-57.734558, -17.552468], + [-58.280804, -17.27171], + [-58.388058, -16.877109], + [-58.24122, -16.299573], + [-60.15839, -16.258284], + [-60.542966, -15.09391], + [-60.251149, -15.077219], + [-60.264326, -14.645979], + [-60.459198, -14.354007], + [-60.503304, -13.775955], + [-61.084121, -13.479384], + [-61.713204, -13.489202], + [-62.127081, -13.198781], + [-62.80306, -13.000653], + [-63.196499, -12.627033], + [-64.316353, -12.461978], + [-65.402281, -11.56627], + [-65.321899, -10.895872], + [-65.444837, -10.511451], + [-65.338435, -9.761988], + [-66.646908, -9.931331], + [-67.173801, -10.306812], + [-68.048192, -10.712059], + [-68.271254, -11.014521], + [-68.786158, -11.03638], + [-69.529678, -10.951734], + [-70.093752, -11.123972], + [-70.548686, -11.009147], + [-70.481894, -9.490118], + [-71.302412, -10.079436], + [-72.184891, -10.053598], + [-72.563033, -9.520194], + [-73.226713, -9.462213], + [-73.015383, -9.032833], + [-73.571059, -8.424447], + [-73.987235, -7.52383], + [-73.723401, -7.340999], + [-73.724487, -6.918595], + [-73.120027, -6.629931], + [-73.219711, -6.089189], + [-72.964507, -5.741251], + [-72.891928, -5.274561], + [-71.748406, -4.593983], + [-70.928843, -4.401591], + [-70.794769, -4.251265], + [-69.893635, -4.298187], + [-69.444102, -1.556287], + [-69.420486, -1.122619], + [-69.577065, -0.549992], + [-70.020656, -0.185156], + [-70.015566, 0.541414], + [-69.452396, 0.706159], + [-69.252434, 0.602651], + [-69.218638, 0.985677], + [-69.804597, 1.089081], + [-69.816973, 1.714805], + [-67.868565, 1.692455], + [-67.53781, 2.037163], + [-67.259998, 1.719999], + [-67.065048, 1.130112], + [-66.876326, 1.253361], + [-66.325765, 0.724452], + [-65.548267, 0.789254], + [-65.354713, 1.095282], + [-64.611012, 1.328731], + [-64.199306, 1.492855], + [-64.083085, 1.916369], + [-63.368788, 2.2009], + [-63.422867, 2.411068], + [-64.269999, 2.497006], + [-64.408828, 3.126786], + [-64.368494, 3.79721], + [-64.816064, 4.056445], + [-64.628659, 4.148481], + [-63.888343, 4.02053], + [-63.093198, 3.770571], + [-62.804533, 4.006965], + [-62.08543, 4.162124], + [-60.966893, 4.536468], + [-60.601179, 4.918098], + [-60.733574, 5.200277], + [-60.213683, 5.244486], + [-59.980959, 5.014061], + [-60.111002, 4.574967], + [-59.767406, 4.423503], + [-59.53804, 3.958803], + [-59.815413, 3.606499], + [-59.974525, 2.755233], + [-59.718546, 2.24963], + [-59.646044, 1.786894], + [-59.030862, 1.317698], + [-58.540013, 1.268088], + [-58.429477, 1.463942], + [-58.11345, 1.507195], + [-57.660971, 1.682585], + [-57.335823, 1.948538], + [-56.782704, 1.863711], + [-56.539386, 1.899523], + [-55.995698, 1.817667], + [-55.9056, 2.021996], + [-56.073342, 2.220795], + [-55.973322, 2.510364], + [-55.569755, 2.421506], + [-55.097587, 2.523748], + [-54.524754, 2.311849], + [-54.088063, 2.105557], + [-53.778521, 2.376703], + [-53.554839, 2.334897], + [-53.418465, 2.053389], + [-52.939657, 2.124858], + [-52.556425, 2.504705], + [-52.249338, 3.241094], + [-51.657797, 4.156232], + [-51.317146, 4.203491], + [-51.069771, 3.650398], + [-50.508875, 1.901564], + [-49.974076, 1.736483], + [-49.947101, 1.04619], + [-50.699251, 0.222984], + [-50.388211, -0.078445], + [-48.620567, -0.235489], + [-48.584497, -1.237805], + [-47.824956, -0.581618], + [-46.566584, -0.941028], + [-44.905703, -1.55174], + [-44.417619, -2.13775], + [-44.581589, -2.691308], + [-43.418791, -2.38311], + [-41.472657, -2.912018], + [-39.978665, -2.873054], + [-38.500383, -3.700652], + [-37.223252, -4.820946], + [-36.452937, -5.109404], + [-35.597796, -5.149504], + [-35.235389, -5.464937], + [-34.89603, -6.738193], + [-34.729993, -7.343221], + [-35.128212, -8.996401], + [-35.636967, -9.649282], + [-37.046519, -11.040721], + [-37.683612, -12.171195], + [-38.423877, -13.038119], + [-38.673887, -13.057652], + [-38.953276, -13.79337], + [-38.882298, -15.667054], + [-39.161092, -17.208407], + [-39.267339, -17.867746], + [-39.583521, -18.262296], + [-39.760823, -19.599113], + [-40.774741, -20.904512], + [-40.944756, -21.937317], + [-41.754164, -22.370676], + [-41.988284, -22.97007], + [-43.074704, -22.967693], + [-44.647812, -23.351959], + [-45.352136, -23.796842], + [-46.472093, -24.088969], + [-47.648972, -24.885199], + [-48.495458, -25.877025], + [-48.641005, -26.623698], + [-48.474736, -27.175912], + [-48.66152, -28.186135], + [-48.888457, -28.674115], + [-49.587329, -29.224469], + [-50.696874, -30.984465], + [-51.576226, -31.777698], + [-52.256081, -32.24537], + [-52.7121, -33.196578], + [-53.373662, -33.768378], + [-53.650544, -33.202004], + [-53.209589, -32.727666], + [-53.787952, -32.047243], + [-54.572452, -31.494511], + [-55.60151, -30.853879], + [-55.973245, -30.883076], + [-56.976026, -30.109686], + [-57.625133, -30.216295] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Brunei", + "SOV_A3": "BRN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Brunei", + "ADM0_A3": "BRN", + "GEOU_DIF": 0, + "GEOUNIT": "Brunei", + "GU_A3": "BRN", + "SU_DIF": 0, + "SUBUNIT": "Brunei", + "SU_A3": "BRN", + "BRK_DIFF": 0, + "NAME": "Brunei", + "NAME_LONG": "Brunei Darussalam", + "BRK_A3": "BRN", + "BRK_NAME": "Brunei", + "BRK_GROUP": null, + "ABBREV": "Brunei", + "POSTAL": "BN", + "FORMAL_EN": "Negara Brunei Darussalam", + "FORMAL_FR": null, + "NAME_CIAWF": "Brunei", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Brunei", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 6, + "MAPCOLOR9": 6, + "MAPCOLOR13": 12, + "POP_EST": 443593, + "POP_RANK": 10, + "GDP_MD_EST": 33730, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "BX", + "ISO_A2": "BN", + "ISO_A3": "BRN", + "ISO_A3_EH": "BRN", + "ISO_N3": "096", + "UN_A3": "096", + "WB_A2": "BN", + "WB_A3": "BRN", + "WOE_ID": 23424773, + "WOE_ID_EH": 23424773, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BRN", + "ADM0_A3_US": "BRN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 6, + "LONG_LEN": 17, + "ABBREV_LEN": 6, + "TINY": 2, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [114.204017, 4.007637, 115.45071, 5.44773], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [114.204017, 4.525874], + [114.599961, 4.900011], + [115.45071, 5.44773], + [115.4057, 4.955228], + [115.347461, 4.316636], + [114.869557, 4.348314], + [114.659596, 4.007637], + [114.204017, 4.525874] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Bhutan", + "SOV_A3": "BTN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Bhutan", + "ADM0_A3": "BTN", + "GEOU_DIF": 0, + "GEOUNIT": "Bhutan", + "GU_A3": "BTN", + "SU_DIF": 0, + "SUBUNIT": "Bhutan", + "SU_A3": "BTN", + "BRK_DIFF": 0, + "NAME": "Bhutan", + "NAME_LONG": "Bhutan", + "BRK_A3": "BTN", + "BRK_NAME": "Bhutan", + "BRK_GROUP": null, + "ABBREV": "Bhutan", + "POSTAL": "BT", + "FORMAL_EN": "Kingdom of Bhutan", + "FORMAL_FR": null, + "NAME_CIAWF": "Bhutan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Bhutan", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 1, + "MAPCOLOR13": 8, + "POP_EST": 758288, + "POP_RANK": 11, + "GDP_MD_EST": 6432, + "POP_YEAR": 2017, + "LASTCENSUS": 2005, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BT", + "ISO_A2": "BT", + "ISO_A3": "BTN", + "ISO_A3_EH": "BTN", + "ISO_N3": "064", + "UN_A3": "064", + "WB_A2": "BT", + "WB_A3": "BTN", + "WOE_ID": 23424770, + "WOE_ID_EH": 23424770, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BTN", + "ADM0_A3_US": "BTN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [88.814248, 26.719403, 92.103712, 28.296439], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [91.696657, 27.771742], + [92.103712, 27.452614], + [92.033484, 26.83831], + [91.217513, 26.808648], + [90.373275, 26.875724], + [89.744528, 26.719403], + [88.835643, 27.098966], + [88.814248, 27.299316], + [89.47581, 28.042759], + [90.015829, 28.296439], + [90.730514, 28.064954], + [91.258854, 28.040614], + [91.696657, 27.771742] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Botswana", + "SOV_A3": "BWA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Botswana", + "ADM0_A3": "BWA", + "GEOU_DIF": 0, + "GEOUNIT": "Botswana", + "GU_A3": "BWA", + "SU_DIF": 0, + "SUBUNIT": "Botswana", + "SU_A3": "BWA", + "BRK_DIFF": 0, + "NAME": "Botswana", + "NAME_LONG": "Botswana", + "BRK_A3": "BWA", + "BRK_NAME": "Botswana", + "BRK_GROUP": null, + "ABBREV": "Bwa.", + "POSTAL": "BW", + "FORMAL_EN": "Republic of Botswana", + "FORMAL_FR": null, + "NAME_CIAWF": "Botswana", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Botswana", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 5, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 2214858, + "POP_RANK": 12, + "GDP_MD_EST": 35900, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BC", + "ISO_A2": "BW", + "ISO_A3": "BWA", + "ISO_A3_EH": "BWA", + "ISO_N3": "072", + "UN_A3": "072", + "WB_A2": "BW", + "WB_A3": "BWA", + "WOE_ID": 23424755, + "WOE_ID_EH": 23424755, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "BWA", + "ADM0_A3_US": "BWA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Southern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [19.895458, -26.828543, 29.432188, -17.661816], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [29.432188, -22.091313], + [28.017236, -22.827754], + [27.11941, -23.574323], + [26.786407, -24.240691], + [26.485753, -24.616327], + [25.941652, -24.696373], + [25.765849, -25.174845], + [25.664666, -25.486816], + [25.025171, -25.71967], + [24.211267, -25.670216], + [23.73357, -25.390129], + [23.312097, -25.26869], + [22.824271, -25.500459], + [22.579532, -25.979448], + [22.105969, -26.280256], + [21.605896, -26.726534], + [20.889609, -26.828543], + [20.66647, -26.477453], + [20.758609, -25.868136], + [20.165726, -24.917962], + [19.895768, -24.76779], + [19.895458, -21.849157], + [20.881134, -21.814327], + [20.910641, -18.252219], + [21.65504, -18.219146], + [23.196858, -17.869038], + [23.579006, -18.281261], + [24.217365, -17.889347], + [24.520705, -17.887125], + [25.084443, -17.661816], + [25.264226, -17.73654], + [25.649163, -18.536026], + [25.850391, -18.714413], + [26.164791, -19.293086], + [27.296505, -20.39152], + [27.724747, -20.499059], + [27.727228, -20.851802], + [28.02137, -21.485975], + [28.794656, -21.639454], + [29.432188, -22.091313] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Central African Republic", + "SOV_A3": "CAF", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Central African Republic", + "ADM0_A3": "CAF", + "GEOU_DIF": 0, + "GEOUNIT": "Central African Republic", + "GU_A3": "CAF", + "SU_DIF": 0, + "SUBUNIT": "Central African Republic", + "SU_A3": "CAF", + "BRK_DIFF": 0, + "NAME": "Central African Rep.", + "NAME_LONG": "Central African Republic", + "BRK_A3": "CAF", + "BRK_NAME": "Central African Rep.", + "BRK_GROUP": null, + "ABBREV": "C.A.R.", + "POSTAL": "CF", + "FORMAL_EN": "Central African Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Central African Republic", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Central African Republic", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 6, + "MAPCOLOR13": 9, + "POP_EST": 5625118, + "POP_RANK": 13, + "GDP_MD_EST": 3206, + "POP_YEAR": 2017, + "LASTCENSUS": 2003, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "CT", + "ISO_A2": "CF", + "ISO_A3": "CAF", + "ISO_A3_EH": "CAF", + "ISO_N3": "140", + "UN_A3": "140", + "WB_A2": "CF", + "WB_A3": "CAF", + "WOE_ID": 23424792, + "WOE_ID_EH": 23424792, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CAF", + "ADM0_A3_US": "CAF", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 20, + "LONG_LEN": 24, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [14.459407, 2.26764, 27.374226, 11.142395], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [15.27946, 7.421925], + [16.106232, 7.497088], + [16.290562, 7.754307], + [16.456185, 7.734774], + [16.705988, 7.508328], + [17.96493, 7.890914], + [18.389555, 8.281304], + [18.911022, 8.630895], + [18.81201, 8.982915], + [19.094008, 9.074847], + [20.059685, 9.012706], + [21.000868, 9.475985], + [21.723822, 10.567056], + [22.231129, 10.971889], + [22.864165, 11.142395], + [22.977544, 10.714463], + [23.554304, 10.089255], + [23.55725, 9.681218], + [23.394779, 9.265068], + [23.459013, 8.954286], + [23.805813, 8.666319], + [24.567369, 8.229188], + [25.114932, 7.825104], + [25.124131, 7.500085], + [25.796648, 6.979316], + [26.213418, 6.546603], + [26.465909, 5.946717], + [27.213409, 5.550953], + [27.374226, 5.233944], + [27.044065, 5.127853], + [26.402761, 5.150875], + [25.650455, 5.256088], + [25.278798, 5.170408], + [25.128833, 4.927245], + [24.805029, 4.897247], + [24.410531, 5.108784], + [23.297214, 4.609693], + [22.84148, 4.710126], + [22.704124, 4.633051], + [22.405124, 4.02916], + [21.659123, 4.224342], + [20.927591, 4.322786], + [20.290679, 4.691678], + [19.467784, 5.031528], + [18.932312, 4.709506], + [18.542982, 4.201785], + [18.453065, 3.504386], + [17.8099, 3.560196], + [17.133042, 3.728197], + [16.537058, 3.198255], + [16.012852, 2.26764], + [15.907381, 2.557389], + [15.862732, 3.013537], + [15.405396, 3.335301], + [15.03622, 3.851367], + [14.950953, 4.210389], + [14.478372, 4.732605], + [14.558936, 5.030598], + [14.459407, 5.451761], + [14.53656, 6.226959], + [14.776545, 6.408498], + [15.27946, 7.421925] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Canada", + "SOV_A3": "CAN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Canada", + "ADM0_A3": "CAN", + "GEOU_DIF": 0, + "GEOUNIT": "Canada", + "GU_A3": "CAN", + "SU_DIF": 0, + "SUBUNIT": "Canada", + "SU_A3": "CAN", + "BRK_DIFF": 0, + "NAME": "Canada", + "NAME_LONG": "Canada", + "BRK_A3": "CAN", + "BRK_NAME": "Canada", + "BRK_GROUP": null, + "ABBREV": "Can.", + "POSTAL": "CA", + "FORMAL_EN": "Canada", + "FORMAL_FR": null, + "NAME_CIAWF": "Canada", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Canada", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 35623680, + "POP_RANK": 15, + "GDP_MD_EST": 1674000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "CA", + "ISO_A2": "CA", + "ISO_A3": "CAN", + "ISO_A3_EH": "CAN", + "ISO_N3": "124", + "UN_A3": "124", + "WB_A2": "CA", + "WB_A3": "CAN", + "WOE_ID": 23424775, + "WOE_ID_EH": 23424775, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CAN", + "ADM0_A3_US": "CAN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Northern America", + "REGION_WB": "North America", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.7 + }, + "bbox": [-140.99778, 41.675105, -52.648099, 83.23324], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-63.6645, 46.55001], + [-62.9393, 46.41587], + [-62.01208, 46.44314], + [-62.50391, 46.03339], + [-62.87433, 45.96818], + [-64.1428, 46.39265], + [-64.39261, 46.72747], + [-64.01486, 47.03601], + [-63.6645, 46.55001] + ] + ], + [ + [ + [-61.806305, 49.10506], + [-62.29318, 49.08717], + [-63.58926, 49.40069], + [-64.51912, 49.87304], + [-64.17322, 49.95718], + [-62.85829, 49.70641], + [-61.835585, 49.28855], + [-61.806305, 49.10506] + ] + ], + [ + [ + [-123.510002, 48.510011], + [-124.012891, 48.370846], + [-125.655013, 48.825005], + [-125.954994, 49.179996], + [-126.850004, 49.53], + [-127.029993, 49.814996], + [-128.059336, 49.994959], + [-128.444584, 50.539138], + [-128.358414, 50.770648], + [-127.308581, 50.552574], + [-126.695001, 50.400903], + [-125.755007, 50.295018], + [-125.415002, 49.950001], + [-124.920768, 49.475275], + [-123.922509, 49.062484], + [-123.510002, 48.510011] + ] + ], + [ + [ + [-56.134036, 50.68701], + [-56.795882, 49.812309], + [-56.143105, 50.150117], + [-55.471492, 49.935815], + [-55.822401, 49.587129], + [-54.935143, 49.313011], + [-54.473775, 49.556691], + [-53.476549, 49.249139], + [-53.786014, 48.516781], + [-53.086134, 48.687804], + [-52.958648, 48.157164], + [-52.648099, 47.535548], + [-53.069158, 46.655499], + [-53.521456, 46.618292], + [-54.178936, 46.807066], + [-53.961869, 47.625207], + [-54.240482, 47.752279], + [-55.400773, 46.884994], + [-55.997481, 46.91972], + [-55.291219, 47.389562], + [-56.250799, 47.632545], + [-57.325229, 47.572807], + [-59.266015, 47.603348], + [-59.419494, 47.899454], + [-58.796586, 48.251525], + [-59.231625, 48.523188], + [-58.391805, 49.125581], + [-57.35869, 50.718274], + [-56.73865, 51.287438], + [-55.870977, 51.632094], + [-55.406974, 51.588273], + [-55.600218, 51.317075], + [-56.134036, 50.68701] + ] + ], + [ + [ + [-133.180004, 54.169975], + [-132.710008, 54.040009], + [-131.74999, 54.120004], + [-132.04948, 52.984621], + [-131.179043, 52.180433], + [-131.57783, 52.182371], + [-132.180428, 52.639707], + [-132.549992, 53.100015], + [-133.054611, 53.411469], + [-133.239664, 53.85108], + [-133.180004, 54.169975] + ] + ], + [ + [ + [-79.26582, 62.158675], + [-79.65752, 61.63308], + [-80.09956, 61.7181], + [-80.36215, 62.01649], + [-80.315395, 62.085565], + [-79.92939, 62.3856], + [-79.52002, 62.36371], + [-79.26582, 62.158675] + ] + ], + [ + [ + [-81.89825, 62.7108], + [-83.06857, 62.15922], + [-83.77462, 62.18231], + [-83.99367, 62.4528], + [-83.25048, 62.91409], + [-81.87699, 62.90458], + [-81.89825, 62.7108] + ] + ], + [ + [ + [-85.161308, 65.657285], + [-84.975764, 65.217518], + [-84.464012, 65.371772], + [-83.882626, 65.109618], + [-82.787577, 64.766693], + [-81.642014, 64.455136], + [-81.55344, 63.979609], + [-80.817361, 64.057486], + [-80.103451, 63.725981], + [-80.99102, 63.411246], + [-82.547178, 63.651722], + [-83.108798, 64.101876], + [-84.100417, 63.569712], + [-85.523405, 63.052379], + [-85.866769, 63.637253], + [-87.221983, 63.541238], + [-86.35276, 64.035833], + [-86.224886, 64.822917], + [-85.883848, 65.738778], + [-85.161308, 65.657285] + ] + ], + [ + [ + [-75.86588, 67.14886], + [-76.98687, 67.09873], + [-77.2364, 67.58809], + [-76.81166, 68.14856], + [-75.89521, 68.28721], + [-75.1145, 68.01036], + [-75.10333, 67.58202], + [-75.21597, 67.44425], + [-75.86588, 67.14886] + ] + ], + [ + [ + [-95.647681, 69.10769], + [-96.269521, 68.75704], + [-97.617401, 69.06003], + [-98.431801, 68.9507], + [-99.797401, 69.40003], + [-98.917401, 69.71003], + [-98.218261, 70.14354], + [-97.157401, 69.86003], + [-96.557401, 69.68003], + [-96.257401, 69.49003], + [-95.647681, 69.10769] + ] + ], + [ + [ + [-68.23444, 47.35486], + [-68.905, 47.185], + [-69.237216, 47.447781], + [-69.99997, 46.69307], + [-70.305, 45.915], + [-70.66, 45.46], + [-71.08482, 45.30524], + [-71.405, 45.255], + [-71.50506, 45.0082], + [-73.34783, 45.00738], + [-74.867, 45.00048], + [-75.31821, 44.81645], + [-76.375, 44.09631], + [-76.5, 44.018459], + [-76.820034, 43.628784], + [-77.737885, 43.629056], + [-78.72028, 43.625089], + [-79.171674, 43.466339], + [-79.01, 43.27], + [-78.92, 42.965], + [-78.939362, 42.863611], + [-80.247448, 42.3662], + [-81.277747, 42.209026], + [-82.439278, 41.675105], + [-82.690089, 41.675105], + [-83.02981, 41.832796], + [-83.142, 41.975681], + [-83.12, 42.08], + [-82.9, 42.43], + [-82.43, 42.98], + [-82.137642, 43.571088], + [-82.337763, 44.44], + [-82.550925, 45.347517], + [-83.592851, 45.816894], + [-83.469551, 45.994686], + [-83.616131, 46.116927], + [-83.890765, 46.116927], + [-84.091851, 46.275419], + [-84.14212, 46.512226], + [-84.3367, 46.40877], + [-84.6049, 46.4396], + [-84.543749, 46.538684], + [-84.779238, 46.637102], + [-84.87608, 46.900083], + [-85.652363, 47.220219], + [-86.461991, 47.553338], + [-87.439793, 47.94], + [-88.378114, 48.302918], + [-89.272917, 48.019808], + [-89.6, 48.01], + [-90.83, 48.27], + [-91.64, 48.14], + [-92.61, 48.45], + [-93.63087, 48.60926], + [-94.32914, 48.67074], + [-94.64, 48.84], + [-94.81758, 49.38905], + [-95.15609, 49.38425], + [-95.15907, 49], + [-97.22872, 49.0007], + [-100.65, 49], + [-104.04826, 48.99986], + [-107.05, 49], + [-110.05, 49], + [-113, 49], + [-116.04818, 49], + [-117.03121, 49], + [-120, 49], + [-122.84, 49], + [-122.97421, 49.002538], + [-124.91024, 49.98456], + [-125.62461, 50.41656], + [-127.43561, 50.83061], + [-127.99276, 51.71583], + [-127.85032, 52.32961], + [-129.12979, 52.75538], + [-129.30523, 53.56159], + [-130.51497, 54.28757], + [-130.536109, 54.802754], + [-130.53611, 54.80278], + [-129.98, 55.285], + [-130.00778, 55.91583], + [-131.70781, 56.55212], + [-132.73042, 57.69289], + [-133.35556, 58.41028], + [-134.27111, 58.86111], + [-134.945, 59.27056], + [-135.47583, 59.78778], + [-136.47972, 59.46389], + [-137.4525, 58.905], + [-138.34089, 59.56211], + [-139.039, 60], + [-140.013, 60.27682], + [-140.99778, 60.30639], + [-140.9925, 66.00003], + [-140.986, 69.712], + [-140.985988, 69.711998], + [-139.12052, 69.47102], + [-137.54636, 68.99002], + [-136.50358, 68.89804], + [-135.62576, 69.31512], + [-134.41464, 69.62743], + [-132.92925, 69.50534], + [-131.43136, 69.94451], + [-129.79471, 70.19369], + [-129.10773, 69.77927], + [-128.36156, 70.01286], + [-128.13817, 70.48384], + [-127.44712, 70.37721], + [-125.75632, 69.48058], + [-124.42483, 70.1584], + [-124.28968, 69.39969], + [-123.06108, 69.56372], + [-122.6835, 69.85553], + [-121.47226, 69.79778], + [-119.94288, 69.37786], + [-117.60268, 69.01128], + [-116.22643, 68.84151], + [-115.2469, 68.90591], + [-113.89794, 68.3989], + [-115.30489, 67.90261], + [-113.49727, 67.68815], + [-110.798, 67.80612], + [-109.94619, 67.98104], + [-108.8802, 67.38144], + [-107.79239, 67.88736], + [-108.81299, 68.31164], + [-108.16721, 68.65392], + [-106.95, 68.7], + [-106.15, 68.8], + [-105.34282, 68.56122], + [-104.33791, 68.018], + [-103.22115, 68.09775], + [-101.45433, 67.64689], + [-99.90195, 67.80566], + [-98.4432, 67.78165], + [-98.5586, 68.40394], + [-97.66948, 68.57864], + [-96.11991, 68.23939], + [-96.12588, 67.29338], + [-95.48943, 68.0907], + [-94.685, 68.06383], + [-94.23282, 69.06903], + [-95.30408, 69.68571], + [-96.47131, 70.08976], + [-96.39115, 71.19482], + [-95.2088, 71.92053], + [-93.88997, 71.76015], + [-92.87818, 71.31869], + [-91.51964, 70.19129], + [-92.40692, 69.69997], + [-90.5471, 69.49766], + [-90.55151, 68.47499], + [-89.21515, 69.25873], + [-88.01966, 68.61508], + [-88.31749, 67.87338], + [-87.35017, 67.19872], + [-86.30607, 67.92146], + [-85.57664, 68.78456], + [-85.52197, 69.88211], + [-84.10081, 69.80539], + [-82.62258, 69.65826], + [-81.28043, 69.16202], + [-81.2202, 68.66567], + [-81.96436, 68.13253], + [-81.25928, 67.59716], + [-81.38653, 67.11078], + [-83.34456, 66.41154], + [-84.73542, 66.2573], + [-85.76943, 66.55833], + [-86.0676, 66.05625], + [-87.03143, 65.21297], + [-87.32324, 64.77563], + [-88.48296, 64.09897], + [-89.91444, 64.03273], + [-90.70398, 63.61017], + [-90.77004, 62.96021], + [-91.93342, 62.83508], + [-93.15698, 62.02469], + [-94.24153, 60.89865], + [-94.62931, 60.11021], + [-94.6846, 58.94882], + [-93.21502, 58.78212], + [-92.76462, 57.84571], + [-92.29703, 57.08709], + [-90.89769, 57.28468], + [-89.03953, 56.85172], + [-88.03978, 56.47162], + [-87.32421, 55.99914], + [-86.07121, 55.72383], + [-85.01181, 55.3026], + [-83.36055, 55.24489], + [-82.27285, 55.14832], + [-82.4362, 54.28227], + [-82.12502, 53.27703], + [-81.40075, 52.15788], + [-79.91289, 51.20842], + [-79.14301, 51.53393], + [-78.60191, 52.56208], + [-79.12421, 54.14145], + [-79.82958, 54.66772], + [-78.22874, 55.13645], + [-77.0956, 55.83741], + [-76.54137, 56.53423], + [-76.62319, 57.20263], + [-77.30226, 58.05209], + [-78.51688, 58.80458], + [-77.33676, 59.85261], + [-77.77272, 60.75788], + [-78.10687, 62.31964], + [-77.41067, 62.55053], + [-75.69621, 62.2784], + [-74.6682, 62.18111], + [-73.83988, 62.4438], + [-72.90853, 62.10507], + [-71.67708, 61.52535], + [-71.37369, 61.13717], + [-69.59042, 61.06141], + [-69.62033, 60.22125], + [-69.2879, 58.95736], + [-68.37455, 58.80106], + [-67.64976, 58.21206], + [-66.20178, 58.76731], + [-65.24517, 59.87071], + [-64.58352, 60.33558], + [-63.80475, 59.4426], + [-62.50236, 58.16708], + [-61.39655, 56.96745], + [-61.79866, 56.33945], + [-60.46853, 55.77548], + [-59.56962, 55.20407], + [-57.97508, 54.94549], + [-57.3332, 54.6265], + [-56.93689, 53.78032], + [-56.15811, 53.64749], + [-55.75632, 53.27036], + [-55.68338, 52.14664], + [-56.40916, 51.7707], + [-57.12691, 51.41972], + [-58.77482, 51.0643], + [-60.03309, 50.24277], + [-61.72366, 50.08046], + [-63.86251, 50.29099], + [-65.36331, 50.2982], + [-66.39905, 50.22897], + [-67.23631, 49.51156], + [-68.51114, 49.06836], + [-69.95362, 47.74488], + [-71.10458, 46.82171], + [-70.25522, 46.98606], + [-68.65, 48.3], + [-66.55243, 49.1331], + [-65.05626, 49.23278], + [-64.17099, 48.74248], + [-65.11545, 48.07085], + [-64.79854, 46.99297], + [-64.47219, 46.23849], + [-63.17329, 45.73902], + [-61.52072, 45.88377], + [-60.51815, 47.00793], + [-60.4486, 46.28264], + [-59.80287, 45.9204], + [-61.03988, 45.26525], + [-63.25471, 44.67014], + [-64.24656, 44.26553], + [-65.36406, 43.54523], + [-66.1234, 43.61867], + [-66.16173, 44.46512], + [-64.42549, 45.29204], + [-66.02605, 45.25931], + [-67.13741, 45.13753], + [-67.79134, 45.70281], + [-67.79046, 47.06636], + [-68.23444, 47.35486] + ] + ], + [ + [ + [-114.16717, 73.12145], + [-114.66634, 72.65277], + [-112.44102, 72.9554], + [-111.05039, 72.4504], + [-109.92035, 72.96113], + [-109.00654, 72.63335], + [-108.18835, 71.65089], + [-107.68599, 72.06548], + [-108.39639, 73.08953], + [-107.51645, 73.23598], + [-106.52259, 73.07601], + [-105.40246, 72.67259], + [-104.77484, 71.6984], + [-104.46476, 70.99297], + [-102.78537, 70.49776], + [-100.98078, 70.02432], + [-101.08929, 69.58447], + [-102.73116, 69.50402], + [-102.09329, 69.11962], + [-102.43024, 68.75282], + [-104.24, 68.91], + [-105.96, 69.18], + [-107.12254, 69.11922], + [-109, 68.78], + [-111.534149, 68.630059], + [-113.3132, 68.53554], + [-113.85496, 69.00744], + [-115.22, 69.28], + [-116.10794, 69.16821], + [-117.34, 69.96], + [-116.67473, 70.06655], + [-115.13112, 70.2373], + [-113.72141, 70.19237], + [-112.4161, 70.36638], + [-114.35, 70.6], + [-116.48684, 70.52045], + [-117.9048, 70.54056], + [-118.43238, 70.9092], + [-116.11311, 71.30918], + [-117.65568, 71.2952], + [-119.40199, 71.55859], + [-118.56267, 72.30785], + [-117.86642, 72.70594], + [-115.18909, 73.31459], + [-114.16717, 73.12145] + ] + ], + [ + [ + [-104.5, 73.42], + [-105.38, 72.76], + [-106.94, 73.46], + [-106.6, 73.6], + [-105.26, 73.64], + [-104.5, 73.42] + ] + ], + [ + [ + [-76.34, 73.102685], + [-76.251404, 72.826385], + [-77.314438, 72.855545], + [-78.39167, 72.876656], + [-79.486252, 72.742203], + [-79.775833, 72.802902], + [-80.876099, 73.333183], + [-80.833885, 73.693184], + [-80.353058, 73.75972], + [-78.064438, 73.651932], + [-76.34, 73.102685] + ] + ], + [ + [ + [-86.562179, 73.157447], + [-85.774371, 72.534126], + [-84.850112, 73.340278], + [-82.31559, 73.750951], + [-80.600088, 72.716544], + [-80.748942, 72.061907], + [-78.770639, 72.352173], + [-77.824624, 72.749617], + [-75.605845, 72.243678], + [-74.228616, 71.767144], + [-74.099141, 71.33084], + [-72.242226, 71.556925], + [-71.200015, 70.920013], + [-68.786054, 70.525024], + [-67.91497, 70.121948], + [-66.969033, 69.186087], + [-68.805123, 68.720198], + [-66.449866, 68.067163], + [-64.862314, 67.847539], + [-63.424934, 66.928473], + [-61.851981, 66.862121], + [-62.163177, 66.160251], + [-63.918444, 64.998669], + [-65.14886, 65.426033], + [-66.721219, 66.388041], + [-68.015016, 66.262726], + [-68.141287, 65.689789], + [-67.089646, 65.108455], + [-65.73208, 64.648406], + [-65.320168, 64.382737], + [-64.669406, 63.392927], + [-65.013804, 62.674185], + [-66.275045, 62.945099], + [-68.783186, 63.74567], + [-67.369681, 62.883966], + [-66.328297, 62.280075], + [-66.165568, 61.930897], + [-68.877367, 62.330149], + [-71.023437, 62.910708], + [-72.235379, 63.397836], + [-71.886278, 63.679989], + [-73.378306, 64.193963], + [-74.834419, 64.679076], + [-74.818503, 64.389093], + [-77.70998, 64.229542], + [-78.555949, 64.572906], + [-77.897281, 65.309192], + [-76.018274, 65.326969], + [-73.959795, 65.454765], + [-74.293883, 65.811771], + [-73.944912, 66.310578], + [-72.651167, 67.284576], + [-72.92606, 67.726926], + [-73.311618, 68.069437], + [-74.843307, 68.554627], + [-76.869101, 68.894736], + [-76.228649, 69.147769], + [-77.28737, 69.76954], + [-78.168634, 69.826488], + [-78.957242, 70.16688], + [-79.492455, 69.871808], + [-81.305471, 69.743185], + [-84.944706, 69.966634], + [-87.060003, 70.260001], + [-88.681713, 70.410741], + [-89.51342, 70.762038], + [-88.467721, 71.218186], + [-89.888151, 71.222552], + [-90.20516, 72.235074], + [-89.436577, 73.129464], + [-88.408242, 73.537889], + [-85.826151, 73.803816], + [-86.562179, 73.157447] + ] + ], + [ + [ + [-100.35642, 73.84389], + [-99.16387, 73.63339], + [-97.38, 73.76], + [-97.12, 73.47], + [-98.05359, 72.99052], + [-96.54, 72.56], + [-96.72, 71.66], + [-98.35966, 71.27285], + [-99.32286, 71.35639], + [-100.01482, 71.73827], + [-102.5, 72.51], + [-102.48, 72.83], + [-100.43836, 72.70588], + [-101.54, 73.36], + [-100.35642, 73.84389] + ] + ], + [ + [ + [-93.196296, 72.771992], + [-94.269047, 72.024596], + [-95.409856, 72.061881], + [-96.033745, 72.940277], + [-96.018268, 73.43743], + [-95.495793, 73.862417], + [-94.503658, 74.134907], + [-92.420012, 74.100025], + [-90.509793, 73.856732], + [-92.003965, 72.966244], + [-93.196296, 72.771992] + ] + ], + [ + [ + [-120.46, 71.383602], + [-123.09219, 70.90164], + [-123.62, 71.34], + [-125.928949, 71.868688], + [-125.5, 72.292261], + [-124.80729, 73.02256], + [-123.94, 73.68], + [-124.91775, 74.29275], + [-121.53788, 74.44893], + [-120.10978, 74.24135], + [-117.55564, 74.18577], + [-116.58442, 73.89607], + [-115.51081, 73.47519], + [-116.76794, 73.22292], + [-119.22, 72.52], + [-120.46, 71.82], + [-120.46, 71.383602] + ] + ], + [ + [ + [-93.612756, 74.979997], + [-94.156909, 74.592347], + [-95.608681, 74.666864], + [-96.820932, 74.927623], + [-96.288587, 75.377828], + [-94.85082, 75.647218], + [-93.977747, 75.29649], + [-93.612756, 74.979997] + ] + ], + [ + [ + [-98.5, 76.72], + [-97.735585, 76.25656], + [-97.704415, 75.74344], + [-98.16, 75], + [-99.80874, 74.89744], + [-100.88366, 75.05736], + [-100.86292, 75.64075], + [-102.50209, 75.5638], + [-102.56552, 76.3366], + [-101.48973, 76.30537], + [-99.98349, 76.64634], + [-98.57699, 76.58859], + [-98.5, 76.72] + ] + ], + [ + [ + [-108.21141, 76.20168], + [-107.81943, 75.84552], + [-106.92893, 76.01282], + [-105.881, 75.9694], + [-105.70498, 75.47951], + [-106.31347, 75.00527], + [-109.7, 74.85], + [-112.22307, 74.41696], + [-113.74381, 74.39427], + [-113.87135, 74.72029], + [-111.79421, 75.1625], + [-116.31221, 75.04343], + [-117.7104, 75.2222], + [-116.34602, 76.19903], + [-115.40487, 76.47887], + [-112.59056, 76.14134], + [-110.81422, 75.54919], + [-109.0671, 75.47321], + [-110.49726, 76.42982], + [-109.5811, 76.79417], + [-108.54859, 76.67832], + [-108.21141, 76.20168] + ] + ], + [ + [ + [-94.684086, 77.097878], + [-93.573921, 76.776296], + [-91.605023, 76.778518], + [-90.741846, 76.449597], + [-90.969661, 76.074013], + [-89.822238, 75.847774], + [-89.187083, 75.610166], + [-87.838276, 75.566189], + [-86.379192, 75.482421], + [-84.789625, 75.699204], + [-82.753445, 75.784315], + [-81.128531, 75.713983], + [-80.057511, 75.336849], + [-79.833933, 74.923127], + [-80.457771, 74.657304], + [-81.948843, 74.442459], + [-83.228894, 74.564028], + [-86.097452, 74.410032], + [-88.15035, 74.392307], + [-89.764722, 74.515555], + [-92.422441, 74.837758], + [-92.768285, 75.38682], + [-92.889906, 75.882655], + [-93.893824, 76.319244], + [-95.962457, 76.441381], + [-97.121379, 76.751078], + [-96.745123, 77.161389], + [-94.684086, 77.097878] + ] + ], + [ + [ + [-116.198587, 77.645287], + [-116.335813, 76.876962], + [-117.106051, 76.530032], + [-118.040412, 76.481172], + [-119.899318, 76.053213], + [-121.499995, 75.900019], + [-122.854924, 76.116543], + [-122.854925, 76.116543], + [-121.157535, 76.864508], + [-119.103939, 77.51222], + [-117.570131, 77.498319], + [-116.198587, 77.645287] + ] + ], + [ + [ + [-93.840003, 77.519997], + [-94.295608, 77.491343], + [-96.169654, 77.555111], + [-96.436304, 77.834629], + [-94.422577, 77.820005], + [-93.720656, 77.634331], + [-93.840003, 77.519997] + ] + ], + [ + [ + [-110.186938, 77.697015], + [-112.051191, 77.409229], + [-113.534279, 77.732207], + [-112.724587, 78.05105], + [-111.264443, 78.152956], + [-109.854452, 77.996325], + [-110.186938, 77.697015] + ] + ], + [ + [ + [-109.663146, 78.601973], + [-110.881314, 78.40692], + [-112.542091, 78.407902], + [-112.525891, 78.550555], + [-111.50001, 78.849994], + [-110.963661, 78.804441], + [-109.663146, 78.601973] + ] + ], + [ + [ + [-95.830295, 78.056941], + [-97.309843, 77.850597], + [-98.124289, 78.082857], + [-98.552868, 78.458105], + [-98.631984, 78.87193], + [-97.337231, 78.831984], + [-96.754399, 78.765813], + [-95.559278, 78.418315], + [-95.830295, 78.056941] + ] + ], + [ + [ + [-100.060192, 78.324754], + [-99.670939, 77.907545], + [-101.30394, 78.018985], + [-102.949809, 78.343229], + [-105.176133, 78.380332], + [-104.210429, 78.67742], + [-105.41958, 78.918336], + [-105.492289, 79.301594], + [-103.529282, 79.165349], + [-100.825158, 78.800462], + [-100.060192, 78.324754] + ] + ], + [ + [ + [-87.02, 79.66], + [-85.81435, 79.3369], + [-87.18756, 79.0393], + [-89.03535, 78.28723], + [-90.80436, 78.21533], + [-92.87669, 78.34333], + [-93.95116, 78.75099], + [-93.93574, 79.11373], + [-93.14524, 79.3801], + [-94.974, 79.37248], + [-96.07614, 79.70502], + [-96.70972, 80.15777], + [-96.01644, 80.60233], + [-95.32345, 80.90729], + [-94.29843, 80.97727], + [-94.73542, 81.20646], + [-92.40984, 81.25739], + [-91.13289, 80.72345], + [-89.45, 80.509322], + [-87.81, 80.32], + [-87.02, 79.66] + ] + ], + [ + [ + [-68.5, 83.106322], + [-65.82735, 83.02801], + [-63.68, 82.9], + [-61.85, 82.6286], + [-61.89388, 82.36165], + [-64.334, 81.92775], + [-66.75342, 81.72527], + [-67.65755, 81.50141], + [-65.48031, 81.50657], + [-67.84, 80.9], + [-69.4697, 80.61683], + [-71.18, 79.8], + [-73.2428, 79.63415], + [-73.88, 79.430162], + [-76.90773, 79.32309], + [-75.52924, 79.19766], + [-76.22046, 79.01907], + [-75.39345, 78.52581], + [-76.34354, 78.18296], + [-77.88851, 77.89991], + [-78.36269, 77.50859], + [-79.75951, 77.20968], + [-79.61965, 76.98336], + [-77.91089, 77.022045], + [-77.88911, 76.777955], + [-80.56125, 76.17812], + [-83.17439, 76.45403], + [-86.11184, 76.29901], + [-87.6, 76.42], + [-89.49068, 76.47239], + [-89.6161, 76.95213], + [-87.76739, 77.17833], + [-88.26, 77.9], + [-87.65, 77.970222], + [-84.97634, 77.53873], + [-86.34, 78.18], + [-87.96192, 78.37181], + [-87.15198, 78.75867], + [-85.37868, 78.9969], + [-85.09495, 79.34543], + [-86.50734, 79.73624], + [-86.93179, 80.25145], + [-84.19844, 80.20836], + [-83.408696, 80.1], + [-81.84823, 80.46442], + [-84.1, 80.58], + [-87.59895, 80.51627], + [-89.36663, 80.85569], + [-90.2, 81.26], + [-91.36786, 81.5531], + [-91.58702, 81.89429], + [-90.1, 82.085], + [-88.93227, 82.11751], + [-86.97024, 82.27961], + [-85.5, 82.652273], + [-84.260005, 82.6], + [-83.18, 82.32], + [-82.42, 82.86], + [-81.1, 83.02], + [-79.30664, 83.13056], + [-76.25, 83.172059], + [-75.71878, 83.06404], + [-72.83153, 83.23324], + [-70.665765, 83.169781], + [-68.5, 83.106322] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Switzerland", + "SOV_A3": "CHE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Switzerland", + "ADM0_A3": "CHE", + "GEOU_DIF": 0, + "GEOUNIT": "Switzerland", + "GU_A3": "CHE", + "SU_DIF": 0, + "SUBUNIT": "Switzerland", + "SU_A3": "CHE", + "BRK_DIFF": 0, + "NAME": "Switzerland", + "NAME_LONG": "Switzerland", + "BRK_A3": "CHE", + "BRK_NAME": "Switzerland", + "BRK_GROUP": null, + "ABBREV": "Switz.", + "POSTAL": "CH", + "FORMAL_EN": "Swiss Confederation", + "FORMAL_FR": null, + "NAME_CIAWF": "Switzerland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Switzerland", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 2, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 8236303, + "POP_RANK": 13, + "GDP_MD_EST": 496300, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "SZ", + "ISO_A2": "CH", + "ISO_A3": "CHE", + "ISO_A3_EH": "CHE", + "ISO_N3": "756", + "UN_A3": "756", + "WB_A2": "CH", + "WB_A3": "CHE", + "WOE_ID": 23424957, + "WOE_ID_EH": 23424957, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CHE", + "ADM0_A3_US": "CHE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [6.022609, 45.776948, 10.442701, 47.830828], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.594226, 47.525058], + [9.632932, 47.347601], + [9.47997, 47.10281], + [9.932448, 46.920728], + [10.442701, 46.893546], + [10.363378, 46.483571], + [9.922837, 46.314899], + [9.182882, 46.440215], + [8.966306, 46.036932], + [8.489952, 46.005151], + [8.31663, 46.163642], + [7.755992, 45.82449], + [7.273851, 45.776948], + [6.843593, 45.991147], + [6.5001, 46.429673], + [6.022609, 46.27299], + [6.037389, 46.725779], + [6.768714, 47.287708], + [6.736571, 47.541801], + [7.192202, 47.449766], + [7.466759, 47.620582], + [8.317301, 47.61358], + [8.522612, 47.830828], + [9.594226, 47.525058] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Chile", + "SOV_A3": "CHL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Chile", + "ADM0_A3": "CHL", + "GEOU_DIF": 0, + "GEOUNIT": "Chile", + "GU_A3": "CHL", + "SU_DIF": 0, + "SUBUNIT": "Chile", + "SU_A3": "CHL", + "BRK_DIFF": 0, + "NAME": "Chile", + "NAME_LONG": "Chile", + "BRK_A3": "CHL", + "BRK_NAME": "Chile", + "BRK_GROUP": null, + "ABBREV": "Chile", + "POSTAL": "CL", + "FORMAL_EN": "Republic of Chile", + "FORMAL_FR": null, + "NAME_CIAWF": "Chile", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Chile", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 1, + "MAPCOLOR9": 5, + "MAPCOLOR13": 9, + "POP_EST": 17789267, + "POP_RANK": 14, + "GDP_MD_EST": 436100, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CI", + "ISO_A2": "CL", + "ISO_A3": "CHL", + "ISO_A3_EH": "CHL", + "ISO_N3": "152", + "UN_A3": "152", + "WB_A2": "CL", + "WB_A3": "CHL", + "WOE_ID": 23424782, + "WOE_ID_EH": 23424782, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CHL", + "ADM0_A3_US": "CHL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [-75.644395, -55.61183, -66.95992, -17.580012], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-68.63401, -52.63637], + [-68.63335, -54.8695], + [-67.56244, -54.87001], + [-66.95992, -54.89681], + [-67.29103, -55.30124], + [-68.14863, -55.61183], + [-68.639991, -55.580018], + [-69.2321, -55.49906], + [-69.95809, -55.19843], + [-71.00568, -55.05383], + [-72.2639, -54.49514], + [-73.2852, -53.95752], + [-74.66253, -52.83749], + [-73.8381, -53.04743], + [-72.43418, -53.7154], + [-71.10773, -54.07433], + [-70.59178, -53.61583], + [-70.26748, -52.93123], + [-69.34565, -52.5183], + [-68.63401, -52.63637] + ] + ], + [ + [ + [-67.106674, -22.735925], + [-66.985234, -22.986349], + [-67.328443, -24.025303], + [-68.417653, -24.518555], + [-68.386001, -26.185016], + [-68.5948, -26.506909], + [-68.295542, -26.89934], + [-69.001235, -27.521214], + [-69.65613, -28.459141], + [-70.01355, -29.367923], + [-69.919008, -30.336339], + [-70.535069, -31.36501], + [-70.074399, -33.09121], + [-69.814777, -33.273886], + [-69.817309, -34.193571], + [-70.388049, -35.169688], + [-70.364769, -36.005089], + [-71.121881, -36.658124], + [-71.118625, -37.576827], + [-70.814664, -38.552995], + [-71.413517, -38.916022], + [-71.680761, -39.808164], + [-71.915734, -40.832339], + [-71.746804, -42.051386], + [-72.148898, -42.254888], + [-71.915424, -43.408565], + [-71.464056, -43.787611], + [-71.793623, -44.207172], + [-71.329801, -44.407522], + [-71.222779, -44.784243], + [-71.659316, -44.973689], + [-71.552009, -45.560733], + [-71.917258, -46.884838], + [-72.447355, -47.738533], + [-72.331161, -48.244238], + [-72.648247, -48.878618], + [-73.415436, -49.318436], + [-73.328051, -50.378785], + [-72.975747, -50.74145], + [-72.309974, -50.67701], + [-72.329404, -51.425956], + [-71.914804, -52.009022], + [-69.498362, -52.142761], + [-68.571545, -52.299444], + [-69.461284, -52.291951], + [-69.94278, -52.537931], + [-70.845102, -52.899201], + [-71.006332, -53.833252], + [-71.429795, -53.856455], + [-72.557943, -53.53141], + [-73.702757, -52.835069], + [-73.702757, -52.83507], + [-74.946763, -52.262754], + [-75.260026, -51.629355], + [-74.976632, -51.043396], + [-75.479754, -50.378372], + [-75.608015, -48.673773], + [-75.18277, -47.711919], + [-74.126581, -46.939253], + [-75.644395, -46.647643], + [-74.692154, -45.763976], + [-74.351709, -44.103044], + [-73.240356, -44.454961], + [-72.717804, -42.383356], + [-73.3889, -42.117532], + [-73.701336, -43.365776], + [-74.331943, -43.224958], + [-74.017957, -41.794813], + [-73.677099, -39.942213], + [-73.217593, -39.258689], + [-73.505559, -38.282883], + [-73.588061, -37.156285], + [-73.166717, -37.12378], + [-72.553137, -35.50884], + [-71.861732, -33.909093], + [-71.43845, -32.418899], + [-71.668721, -30.920645], + [-71.370083, -30.095682], + [-71.489894, -28.861442], + [-70.905124, -27.64038], + [-70.724954, -25.705924], + [-70.403966, -23.628997], + [-70.091246, -21.393319], + [-70.16442, -19.756468], + [-70.372572, -18.347975], + [-69.858444, -18.092694], + [-69.590424, -17.580012], + [-69.100247, -18.260125], + [-68.966818, -18.981683], + [-68.442225, -19.405068], + [-68.757167, -20.372658], + [-68.219913, -21.494347], + [-67.82818, -22.872919], + [-67.106674, -22.735925] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "China", + "SOV_A3": "CH1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "China", + "ADM0_A3": "CHN", + "GEOU_DIF": 0, + "GEOUNIT": "China", + "GU_A3": "CHN", + "SU_DIF": 0, + "SUBUNIT": "China", + "SU_A3": "CHN", + "BRK_DIFF": 0, + "NAME": "China", + "NAME_LONG": "China", + "BRK_A3": "CHN", + "BRK_NAME": "China", + "BRK_GROUP": null, + "ABBREV": "China", + "POSTAL": "CN", + "FORMAL_EN": "People's Republic of China", + "FORMAL_FR": null, + "NAME_CIAWF": "China", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "China", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 3, + "POP_EST": 1379302771, + "POP_RANK": 18, + "GDP_MD_EST": 21140000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "3. Emerging region: BRIC", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CH", + "ISO_A2": "CN", + "ISO_A3": "CHN", + "ISO_A3_EH": "CHN", + "ISO_N3": "156", + "UN_A3": "156", + "WB_A2": "CN", + "WB_A3": "CHN", + "WOE_ID": 23424781, + "WOE_ID_EH": 23424781, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CHN", + "ADM0_A3_US": "CHN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.7 + }, + "bbox": [73.675379, 18.197701, 135.026311, 53.4588], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [75.158028, 37.133031], + [74.980002, 37.41999], + [74.829986, 37.990007], + [74.864816, 38.378846], + [74.257514, 38.606507], + [73.928852, 38.505815], + [73.675379, 39.431237], + [73.960013, 39.660008], + [73.822244, 39.893973], + [74.776862, 40.366425], + [75.467828, 40.562072], + [76.526368, 40.427946], + [76.904484, 41.066486], + [78.187197, 41.185316], + [78.543661, 41.582243], + [80.11943, 42.123941], + [80.25999, 42.349999], + [80.18015, 42.920068], + [80.866206, 43.180362], + [79.966106, 44.917517], + [81.947071, 45.317027], + [82.458926, 45.53965], + [83.180484, 47.330031], + [85.16429, 47.000956], + [85.720484, 47.452969], + [85.768233, 48.455751], + [86.598776, 48.549182], + [87.35997, 49.214981], + [87.751264, 49.297198], + [88.013832, 48.599463], + [88.854298, 48.069082], + [90.280826, 47.693549], + [90.970809, 46.888146], + [90.585768, 45.719716], + [90.94554, 45.286073], + [92.133891, 45.115076], + [93.480734, 44.975472], + [94.688929, 44.352332], + [95.306875, 44.241331], + [95.762455, 43.319449], + [96.349396, 42.725635], + [97.451757, 42.74889], + [99.515817, 42.524691], + [100.845866, 42.663804], + [101.83304, 42.514873], + [103.312278, 41.907468], + [104.522282, 41.908347], + [104.964994, 41.59741], + [106.129316, 42.134328], + [107.744773, 42.481516], + [109.243596, 42.519446], + [110.412103, 42.871234], + [111.129682, 43.406834], + [111.829588, 43.743118], + [111.667737, 44.073176], + [111.348377, 44.457442], + [111.873306, 45.102079], + [112.436062, 45.011646], + [113.463907, 44.808893], + [114.460332, 45.339817], + [115.985096, 45.727235], + [116.717868, 46.388202], + [117.421701, 46.672733], + [118.874326, 46.805412], + [119.66327, 46.69268], + [119.772824, 47.048059], + [118.866574, 47.74706], + [118.064143, 48.06673], + [117.295507, 47.697709], + [116.308953, 47.85341], + [115.742837, 47.726545], + [115.485282, 48.135383], + [116.191802, 49.134598], + [116.678801, 49.888531], + [117.879244, 49.510983], + [119.288461, 50.142883], + [119.27939, 50.58292], + [120.18208, 51.64355], + [120.7382, 51.96411], + [120.725789, 52.516226], + [120.177089, 52.753886], + [121.003085, 53.251401], + [122.245748, 53.431726], + [123.57147, 53.4588], + [125.068211, 53.161045], + [125.946349, 52.792799], + [126.564399, 51.784255], + [126.939157, 51.353894], + [127.287456, 50.739797], + [127.6574, 49.76027], + [129.397818, 49.4406], + [130.582293, 48.729687], + [130.98726, 47.79013], + [132.50669, 47.78896], + [133.373596, 48.183442], + [135.026311, 48.47823], + [134.50081, 47.57845], + [134.11235, 47.21248], + [133.769644, 46.116927], + [133.09712, 45.14409], + [131.883454, 45.321162], + [131.02519, 44.96796], + [131.288555, 44.11152], + [131.144688, 42.92999], + [130.633866, 42.903015], + [130.64, 42.395024], + [129.994267, 42.985387], + [129.596669, 42.424982], + [128.052215, 41.994285], + [128.208433, 41.466772], + [127.343783, 41.503152], + [126.869083, 41.816569], + [126.182045, 41.107336], + [125.079942, 40.569824], + [124.265625, 39.928493], + [122.86757, 39.637788], + [122.131388, 39.170452], + [121.054554, 38.897471], + [121.585995, 39.360854], + [121.376757, 39.750261], + [122.168595, 40.422443], + [121.640359, 40.94639], + [120.768629, 40.593388], + [119.639602, 39.898056], + [119.023464, 39.252333], + [118.042749, 39.204274], + [117.532702, 38.737636], + [118.059699, 38.061476], + [118.87815, 37.897325], + [118.911636, 37.448464], + [119.702802, 37.156389], + [120.823457, 37.870428], + [121.711259, 37.481123], + [122.357937, 37.454484], + [122.519995, 36.930614], + [121.104164, 36.651329], + [120.637009, 36.11144], + [119.664562, 35.609791], + [119.151208, 34.909859], + [120.227525, 34.360332], + [120.620369, 33.376723], + [121.229014, 32.460319], + [121.908146, 31.692174], + [121.891919, 30.949352], + [121.264257, 30.676267], + [121.503519, 30.142915], + [122.092114, 29.83252], + [121.938428, 29.018022], + [121.684439, 28.225513], + [121.125661, 28.135673], + [120.395473, 27.053207], + [119.585497, 25.740781], + [118.656871, 24.547391], + [117.281606, 23.624501], + [115.890735, 22.782873], + [114.763827, 22.668074], + [114.152547, 22.22376], + [113.80678, 22.54834], + [113.241078, 22.051367], + [111.843592, 21.550494], + [110.785466, 21.397144], + [110.444039, 20.341033], + [109.889861, 20.282457], + [109.627655, 21.008227], + [109.864488, 21.395051], + [108.522813, 21.715212], + [108.05018, 21.55238], + [107.04342, 21.811899], + [106.567273, 22.218205], + [106.725403, 22.794268], + [105.811247, 22.976892], + [105.329209, 23.352063], + [104.476858, 22.81915], + [103.504515, 22.703757], + [102.706992, 22.708795], + [102.170436, 22.464753], + [101.652018, 22.318199], + [101.80312, 21.174367], + [101.270026, 21.201652], + [101.180005, 21.436573], + [101.150033, 21.849984], + [100.416538, 21.558839], + [99.983489, 21.742937], + [99.240899, 22.118314], + [99.531992, 22.949039], + [98.898749, 23.142722], + [98.660262, 24.063286], + [97.60472, 23.897405], + [97.724609, 25.083637], + [98.671838, 25.918703], + [98.712094, 26.743536], + [98.68269, 27.508812], + [98.246231, 27.747221], + [97.911988, 28.335945], + [97.327114, 28.261583], + [96.248833, 28.411031], + [96.586591, 28.83098], + [96.117679, 29.452802], + [95.404802, 29.031717], + [94.56599, 29.277438], + [93.413348, 28.640629], + [92.503119, 27.896876], + [91.696657, 27.771742], + [91.258854, 28.040614], + [90.730514, 28.064954], + [90.015829, 28.296439], + [89.47581, 28.042759], + [88.814248, 27.299316], + [88.730326, 28.086865], + [88.120441, 27.876542], + [86.954517, 27.974262], + [85.82332, 28.203576], + [85.011638, 28.642774], + [84.23458, 28.839894], + [83.898993, 29.320226], + [83.337115, 29.463732], + [82.327513, 30.115268], + [81.525804, 30.422717], + [81.111256, 30.183481], + [79.721367, 30.882715], + [78.738894, 31.515906], + [78.458446, 32.618164], + [79.176129, 32.48378], + [79.208892, 32.994395], + [78.811086, 33.506198], + [78.912269, 34.321936], + [77.837451, 35.49401], + [76.192848, 35.898403], + [75.896897, 36.666806], + [75.158028, 37.133031] + ] + ], + [ + [ + [110.339188, 18.678395], + [109.47521, 18.197701], + [108.655208, 18.507682], + [108.626217, 19.367888], + [109.119056, 19.821039], + [110.211599, 20.101254], + [110.786551, 20.077534], + [111.010051, 19.69593], + [110.570647, 19.255879], + [110.339188, 18.678395] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Ivory Coast", + "SOV_A3": "CIV", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ivory Coast", + "ADM0_A3": "CIV", + "GEOU_DIF": 0, + "GEOUNIT": "Ivory Coast", + "GU_A3": "CIV", + "SU_DIF": 0, + "SUBUNIT": "Ivory Coast", + "SU_A3": "CIV", + "BRK_DIFF": 0, + "NAME": "Côte d'Ivoire", + "NAME_LONG": "Côte d'Ivoire", + "BRK_A3": "CIV", + "BRK_NAME": "Côte d'Ivoire", + "BRK_GROUP": null, + "ABBREV": "I.C.", + "POSTAL": "CI", + "FORMAL_EN": "Republic of Ivory Coast", + "FORMAL_FR": "Republic of Cote D'Ivoire", + "NAME_CIAWF": "Cote D'ivoire", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Côte d'Ivoire", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 6, + "MAPCOLOR9": 3, + "MAPCOLOR13": 3, + "POP_EST": 24184810, + "POP_RANK": 15, + "GDP_MD_EST": 87120, + "POP_YEAR": 2017, + "LASTCENSUS": 1998, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "IV", + "ISO_A2": "CI", + "ISO_A3": "CIV", + "ISO_A3_EH": "CIV", + "ISO_N3": "384", + "UN_A3": "384", + "WB_A2": "CI", + "WB_A3": "CIV", + "WOE_ID": 23424854, + "WOE_ID_EH": 23424854, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CIV", + "ADM0_A3_US": "CIV", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 13, + "LONG_LEN": 13, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-8.60288, 4.338288, -2.56219, 10.524061], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-5.404342, 10.370737], + [-4.954653, 10.152714], + [-4.779884, 9.821985], + [-4.330247, 9.610835], + [-3.980449, 9.862344], + [-3.511899, 9.900326], + [-2.827496, 9.642461], + [-2.56219, 8.219628], + [-2.983585, 7.379705], + [-3.24437, 6.250472], + [-2.810701, 5.389051], + [-2.856125, 4.994476], + [-3.311084, 4.984296], + [-4.00882, 5.179813], + [-4.649917, 5.168264], + [-5.834496, 4.993701], + [-6.528769, 4.705088], + [-7.518941, 4.338288], + [-7.712159, 4.364566], + [-7.635368, 5.188159], + [-7.539715, 5.313345], + [-7.570153, 5.707352], + [-7.993693, 6.12619], + [-8.311348, 6.193033], + [-8.60288, 6.467564], + [-8.385452, 6.911801], + [-8.485446, 7.395208], + [-8.439298, 7.686043], + [-8.280703, 7.68718], + [-8.221792, 8.123329], + [-8.299049, 8.316444], + [-8.203499, 8.455453], + [-7.8321, 8.575704], + [-8.079114, 9.376224], + [-8.309616, 9.789532], + [-8.229337, 10.12902], + [-8.029944, 10.206535], + [-7.89959, 10.297382], + [-7.622759, 10.147236], + [-6.850507, 10.138994], + [-6.666461, 10.430811], + [-6.493965, 10.411303], + [-6.205223, 10.524061], + [-6.050452, 10.096361], + [-5.816926, 10.222555], + [-5.404342, 10.370737] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Cameroon", + "SOV_A3": "CMR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Cameroon", + "ADM0_A3": "CMR", + "GEOU_DIF": 0, + "GEOUNIT": "Cameroon", + "GU_A3": "CMR", + "SU_DIF": 0, + "SUBUNIT": "Cameroon", + "SU_A3": "CMR", + "BRK_DIFF": 0, + "NAME": "Cameroon", + "NAME_LONG": "Cameroon", + "BRK_A3": "CMR", + "BRK_NAME": "Cameroon", + "BRK_GROUP": null, + "ABBREV": "Cam.", + "POSTAL": "CM", + "FORMAL_EN": "Republic of Cameroon", + "FORMAL_FR": null, + "NAME_CIAWF": "Cameroon", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Cameroon", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 3, + "POP_EST": 24994885, + "POP_RANK": 15, + "GDP_MD_EST": 77240, + "POP_YEAR": 2017, + "LASTCENSUS": 2005, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CM", + "ISO_A2": "CM", + "ISO_A3": "CMR", + "ISO_A3_EH": "CMR", + "ISO_N3": "120", + "UN_A3": "120", + "WB_A2": "CM", + "WB_A3": "CMR", + "WOE_ID": 23424785, + "WOE_ID_EH": 23424785, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CMR", + "ADM0_A3_US": "CMR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [8.488816, 1.727673, 16.012852, 12.859396], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [15.27946, 7.421925], + [14.776545, 6.408498], + [14.53656, 6.226959], + [14.459407, 5.451761], + [14.558936, 5.030598], + [14.478372, 4.732605], + [14.950953, 4.210389], + [15.03622, 3.851367], + [15.405396, 3.335301], + [15.862732, 3.013537], + [15.907381, 2.557389], + [16.012852, 2.26764], + [15.940919, 1.727673], + [15.146342, 1.964015], + [14.337813, 2.227875], + [13.075822, 2.267097], + [12.951334, 2.321616], + [12.35938, 2.192812], + [11.751665, 2.326758], + [11.276449, 2.261051], + [9.649158, 2.283866], + [9.795196, 3.073404], + [9.404367, 3.734527], + [8.948116, 3.904129], + [8.744924, 4.352215], + [8.488816, 4.495617], + [8.500288, 4.771983], + [8.757533, 5.479666], + [9.233163, 6.444491], + [9.522706, 6.453482], + [10.118277, 7.03877], + [10.497375, 7.055358], + [11.058788, 6.644427], + [11.745774, 6.981383], + [11.839309, 7.397042], + [12.063946, 7.799808], + [12.218872, 8.305824], + [12.753672, 8.717763], + [12.955468, 9.417772], + [13.1676, 9.640626], + [13.308676, 10.160362], + [13.57295, 10.798566], + [14.415379, 11.572369], + [14.468192, 11.904752], + [14.577178, 12.085361], + [14.181336, 12.483657], + [14.213531, 12.802035], + [14.495787, 12.859396], + [14.89336, 12.21905], + [14.960152, 11.555574], + [14.923565, 10.891325], + [15.467873, 9.982337], + [14.909354, 9.992129], + [14.627201, 9.920919], + [14.171466, 10.021378], + [13.954218, 9.549495], + [14.544467, 8.965861], + [14.979996, 8.796104], + [15.120866, 8.38215], + [15.436092, 7.692812], + [15.27946, 7.421925] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Democratic Republic of the Congo", + "SOV_A3": "COD", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Democratic Republic of the Congo", + "ADM0_A3": "COD", + "GEOU_DIF": 0, + "GEOUNIT": "Democratic Republic of the Congo", + "GU_A3": "COD", + "SU_DIF": 0, + "SUBUNIT": "Democratic Republic of the Congo", + "SU_A3": "COD", + "BRK_DIFF": 0, + "NAME": "Dem. Rep. Congo", + "NAME_LONG": "Democratic Republic of the Congo", + "BRK_A3": "COD", + "BRK_NAME": "Democratic Republic of the Congo", + "BRK_GROUP": null, + "ABBREV": "D.R.C.", + "POSTAL": "DRC", + "FORMAL_EN": "Democratic Republic of the Congo", + "FORMAL_FR": null, + "NAME_CIAWF": "Congo, Democratic Republic of the", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Congo, Dem. Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 7, + "POP_EST": 83301151, + "POP_RANK": 16, + "GDP_MD_EST": 66010, + "POP_YEAR": 2017, + "LASTCENSUS": 1984, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "CG", + "ISO_A2": "CD", + "ISO_A3": "COD", + "ISO_A3_EH": "COD", + "ISO_N3": "180", + "UN_A3": "180", + "WB_A2": "ZR", + "WB_A3": "ZAR", + "WOE_ID": 23424780, + "WOE_ID_EH": 23424780, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "COD", + "ADM0_A3_US": "COD", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 15, + "LONG_LEN": 32, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [12.182337, -13.257227, 31.174149, 5.256088], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.912215, -10.926826], + [23.456791, -10.867863], + [22.837345, -11.017622], + [22.402798, -10.993075], + [22.155268, -11.084801], + [22.208753, -9.894796], + [21.875182, -9.523708], + [21.801801, -8.908707], + [21.949131, -8.305901], + [21.746456, -7.920085], + [21.728111, -7.290872], + [20.514748, -7.299606], + [20.601823, -6.939318], + [20.091622, -6.94309], + [20.037723, -7.116361], + [19.417502, -7.155429], + [19.166613, -7.738184], + [19.016752, -7.988246], + [18.464176, -7.847014], + [18.134222, -7.987678], + [17.47297, -8.068551], + [17.089996, -7.545689], + [16.860191, -7.222298], + [16.57318, -6.622645], + [16.326528, -5.87747], + [13.375597, -5.864241], + [13.024869, -5.984389], + [12.735171, -5.965682], + [12.322432, -6.100092], + [12.182337, -5.789931], + [12.436688, -5.684304], + [12.468004, -5.248362], + [12.631612, -4.991271], + [12.995517, -4.781103], + [13.25824, -4.882957], + [13.600235, -4.500138], + [14.144956, -4.510009], + [14.209035, -4.793092], + [14.582604, -4.970239], + [15.170992, -4.343507], + [15.75354, -3.855165], + [16.00629, -3.535133], + [15.972803, -2.712392], + [16.407092, -1.740927], + [16.865307, -1.225816], + [17.523716, -0.74383], + [17.638645, -0.424832], + [17.663553, -0.058084], + [17.82654, 0.288923], + [17.774192, 0.855659], + [17.898835, 1.741832], + [18.094276, 2.365722], + [18.393792, 2.900443], + [18.453065, 3.504386], + [18.542982, 4.201785], + [18.932312, 4.709506], + [19.467784, 5.031528], + [20.290679, 4.691678], + [20.927591, 4.322786], + [21.659123, 4.224342], + [22.405124, 4.02916], + [22.704124, 4.633051], + [22.84148, 4.710126], + [23.297214, 4.609693], + [24.410531, 5.108784], + [24.805029, 4.897247], + [25.128833, 4.927245], + [25.278798, 5.170408], + [25.650455, 5.256088], + [26.402761, 5.150875], + [27.044065, 5.127853], + [27.374226, 5.233944], + [27.979977, 4.408413], + [28.428994, 4.287155], + [28.696678, 4.455077], + [29.159078, 4.389267], + [29.715995, 4.600805], + [29.9535, 4.173699], + [30.833852, 3.509172], + [30.83386, 3.509166], + [30.773347, 2.339883], + [31.174149, 2.204465], + [30.85267, 1.849396], + [30.468508, 1.583805], + [30.086154, 1.062313], + [29.875779, 0.59738], + [29.819503, -0.20531], + [29.587838, -0.587406], + [29.579466, -1.341313], + [29.291887, -1.620056], + [29.254835, -2.21511], + [29.117479, -2.292211], + [29.024926, -2.839258], + [29.276384, -3.293907], + [29.339998, -4.499983], + [29.519987, -5.419979], + [29.419993, -5.939999], + [29.620032, -6.520015], + [30.199997, -7.079981], + [30.740015, -8.340007], + [30.74001, -8.340006], + [30.346086, -8.238257], + [29.002912, -8.407032], + [28.734867, -8.526559], + [28.449871, -9.164918], + [28.673682, -9.605925], + [28.49607, -10.789884], + [28.372253, -11.793647], + [28.642417, -11.971569], + [29.341548, -12.360744], + [29.616001, -12.178895], + [29.699614, -13.257227], + [28.934286, -13.248958], + [28.523562, -12.698604], + [28.155109, -12.272481], + [27.388799, -12.132747], + [27.16442, -11.608748], + [26.553088, -11.92444], + [25.75231, -11.784965], + [25.418118, -11.330936], + [24.78317, -11.238694], + [24.314516, -11.262826], + [24.257155, -10.951993], + [23.912215, -10.926826] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Republic of the Congo", + "SOV_A3": "COG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Republic of the Congo", + "ADM0_A3": "COG", + "GEOU_DIF": 0, + "GEOUNIT": "Republic of the Congo", + "GU_A3": "COG", + "SU_DIF": 0, + "SUBUNIT": "Republic of the Congo", + "SU_A3": "COG", + "BRK_DIFF": 0, + "NAME": "Congo", + "NAME_LONG": "Republic of the Congo", + "BRK_A3": "COG", + "BRK_NAME": "Republic of the Congo", + "BRK_GROUP": null, + "ABBREV": "Rep. Congo", + "POSTAL": "CG", + "FORMAL_EN": "Republic of the Congo", + "FORMAL_FR": null, + "NAME_CIAWF": "Congo, Republic of the", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Congo, Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 10, + "POP_EST": 4954674, + "POP_RANK": 12, + "GDP_MD_EST": 30270, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CF", + "ISO_A2": "CG", + "ISO_A3": "COG", + "ISO_A3_EH": "COG", + "ISO_N3": "178", + "UN_A3": "178", + "WB_A2": "CG", + "WB_A3": "COG", + "WOE_ID": 23424779, + "WOE_ID_EH": 23424779, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "COG", + "ADM0_A3_US": "COG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 21, + "ABBREV_LEN": 10, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [11.093773, -5.037987, 18.453065, 3.728197], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [12.995517, -4.781103], + [12.62076, -4.438023], + [12.318608, -4.60623], + [11.914963, -5.037987], + [11.093773, -3.978827], + [11.855122, -3.426871], + [11.478039, -2.765619], + [11.820964, -2.514161], + [12.495703, -2.391688], + [12.575284, -1.948511], + [13.109619, -2.42874], + [13.992407, -2.470805], + [14.29921, -1.998276], + [14.425456, -1.333407], + [14.316418, -0.552627], + [13.843321, 0.038758], + [14.276266, 1.19693], + [14.026669, 1.395677], + [13.282631, 1.314184], + [13.003114, 1.830896], + [13.075822, 2.267097], + [14.337813, 2.227875], + [15.146342, 1.964015], + [15.940919, 1.727673], + [16.012852, 2.26764], + [16.537058, 3.198255], + [17.133042, 3.728197], + [17.8099, 3.560196], + [18.453065, 3.504386], + [18.393792, 2.900443], + [18.094276, 2.365722], + [17.898835, 1.741832], + [17.774192, 0.855659], + [17.82654, 0.288923], + [17.663553, -0.058084], + [17.638645, -0.424832], + [17.523716, -0.74383], + [16.865307, -1.225816], + [16.407092, -1.740927], + [15.972803, -2.712392], + [16.00629, -3.535133], + [15.75354, -3.855165], + [15.170992, -4.343507], + [14.582604, -4.970239], + [14.209035, -4.793092], + [14.144956, -4.510009], + [13.600235, -4.500138], + [13.25824, -4.882957], + [12.995517, -4.781103] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Colombia", + "SOV_A3": "COL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Colombia", + "ADM0_A3": "COL", + "GEOU_DIF": 0, + "GEOUNIT": "Colombia", + "GU_A3": "COL", + "SU_DIF": 0, + "SUBUNIT": "Colombia", + "SU_A3": "COL", + "BRK_DIFF": 0, + "NAME": "Colombia", + "NAME_LONG": "Colombia", + "BRK_A3": "COL", + "BRK_NAME": "Colombia", + "BRK_GROUP": null, + "ABBREV": "Col.", + "POSTAL": "CO", + "FORMAL_EN": "Republic of Colombia", + "FORMAL_FR": null, + "NAME_CIAWF": "Colombia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Colombia", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 1, + "POP_EST": 47698524, + "POP_RANK": 15, + "GDP_MD_EST": 688000, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CO", + "ISO_A2": "CO", + "ISO_A3": "COL", + "ISO_A3_EH": "COL", + "ISO_N3": "170", + "UN_A3": "170", + "WB_A2": "CO", + "WB_A3": "COL", + "WOE_ID": 23424787, + "WOE_ID_EH": 23424787, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "COL", + "ADM0_A3_US": "COL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [-78.990935, -4.298187, -66.876326, 12.437303], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-66.876326, 1.253361], + [-67.065048, 1.130112], + [-67.259998, 1.719999], + [-67.53781, 2.037163], + [-67.868565, 1.692455], + [-69.816973, 1.714805], + [-69.804597, 1.089081], + [-69.218638, 0.985677], + [-69.252434, 0.602651], + [-69.452396, 0.706159], + [-70.015566, 0.541414], + [-70.020656, -0.185156], + [-69.577065, -0.549992], + [-69.420486, -1.122619], + [-69.444102, -1.556287], + [-69.893635, -4.298187], + [-70.394044, -3.766591], + [-70.692682, -3.742872], + [-70.047709, -2.725156], + [-70.813476, -2.256865], + [-71.413646, -2.342802], + [-71.774761, -2.16979], + [-72.325787, -2.434218], + [-73.070392, -2.308954], + [-73.659504, -1.260491], + [-74.122395, -1.002833], + [-74.441601, -0.53082], + [-75.106625, -0.057205], + [-75.373223, -0.152032], + [-75.801466, 0.084801], + [-76.292314, 0.416047], + [-76.57638, 0.256936], + [-77.424984, 0.395687], + [-77.668613, 0.825893], + [-77.855061, 0.809925], + [-78.855259, 1.380924], + [-78.990935, 1.69137], + [-78.617831, 1.766404], + [-78.662118, 2.267355], + [-78.42761, 2.629556], + [-77.931543, 2.696606], + [-77.510431, 3.325017], + [-77.12769, 3.849636], + [-77.496272, 4.087606], + [-77.307601, 4.667984], + [-77.533221, 5.582812], + [-77.318815, 5.845354], + [-77.476661, 6.691116], + [-77.881571, 7.223771], + [-77.753414, 7.70984], + [-77.431108, 7.638061], + [-77.242566, 7.935278], + [-77.474723, 8.524286], + [-77.353361, 8.670505], + [-76.836674, 8.638749], + [-76.086384, 9.336821], + [-75.6746, 9.443248], + [-75.664704, 9.774003], + [-75.480426, 10.61899], + [-74.906895, 11.083045], + [-74.276753, 11.102036], + [-74.197223, 11.310473], + [-73.414764, 11.227015], + [-72.627835, 11.731972], + [-72.238195, 11.95555], + [-71.75409, 12.437303], + [-71.399822, 12.376041], + [-71.137461, 12.112982], + [-71.331584, 11.776284], + [-71.973922, 11.608672], + [-72.227575, 11.108702], + [-72.614658, 10.821975], + [-72.905286, 10.450344], + [-73.027604, 9.73677], + [-73.304952, 9.152], + [-72.78873, 9.085027], + [-72.660495, 8.625288], + [-72.439862, 8.405275], + [-72.360901, 8.002638], + [-72.479679, 7.632506], + [-72.444487, 7.423785], + [-72.198352, 7.340431], + [-71.960176, 6.991615], + [-70.674234, 7.087785], + [-70.093313, 6.960376], + [-69.38948, 6.099861], + [-68.985319, 6.206805], + [-68.265052, 6.153268], + [-67.695087, 6.267318], + [-67.34144, 6.095468], + [-67.521532, 5.55687], + [-67.744697, 5.221129], + [-67.823012, 4.503937], + [-67.621836, 3.839482], + [-67.337564, 3.542342], + [-67.303173, 3.318454], + [-67.809938, 2.820655], + [-67.447092, 2.600281], + [-67.181294, 2.250638], + [-66.876326, 1.253361] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Costa Rica", + "SOV_A3": "CRI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Costa Rica", + "ADM0_A3": "CRI", + "GEOU_DIF": 0, + "GEOUNIT": "Costa Rica", + "GU_A3": "CRI", + "SU_DIF": 0, + "SUBUNIT": "Costa Rica", + "SU_A3": "CRI", + "BRK_DIFF": 0, + "NAME": "Costa Rica", + "NAME_LONG": "Costa Rica", + "BRK_A3": "CRI", + "BRK_NAME": "Costa Rica", + "BRK_GROUP": null, + "ABBREV": "C.R.", + "POSTAL": "CR", + "FORMAL_EN": "Republic of Costa Rica", + "FORMAL_FR": null, + "NAME_CIAWF": "Costa Rica", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Costa Rica", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 4, + "MAPCOLOR13": 2, + "POP_EST": 4930258, + "POP_RANK": 12, + "GDP_MD_EST": 79260, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CS", + "ISO_A2": "CR", + "ISO_A3": "CRI", + "ISO_A3_EH": "CRI", + "ISO_N3": "188", + "UN_A3": "188", + "WB_A2": "CR", + "WB_A3": "CRI", + "WOE_ID": 23424791, + "WOE_ID_EH": 23424791, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CRI", + "ADM0_A3_US": "CRI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-85.941725, 8.225028, -82.546196, 11.217119], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-82.965783, 8.225028], + [-83.508437, 8.446927], + [-83.711474, 8.656836], + [-83.596313, 8.830443], + [-83.632642, 9.051386], + [-83.909886, 9.290803], + [-84.303402, 9.487354], + [-84.647644, 9.615537], + [-84.713351, 9.908052], + [-84.97566, 10.086723], + [-84.911375, 9.795992], + [-85.110923, 9.55704], + [-85.339488, 9.834542], + [-85.660787, 9.933347], + [-85.797445, 10.134886], + [-85.791709, 10.439337], + [-85.659314, 10.754331], + [-85.941725, 10.895278], + [-85.71254, 11.088445], + [-85.561852, 11.217119], + [-84.903003, 10.952303], + [-84.673069, 11.082657], + [-84.355931, 10.999226], + [-84.190179, 10.79345], + [-83.895054, 10.726839], + [-83.655612, 10.938764], + [-83.40232, 10.395438], + [-83.015677, 9.992982], + [-82.546196, 9.566135], + [-82.932891, 9.476812], + [-82.927155, 9.07433], + [-82.719183, 8.925709], + [-82.868657, 8.807266], + [-82.829771, 8.626295], + [-82.913176, 8.423517], + [-82.965783, 8.225028] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Cuba", + "SOV_A3": "CUB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Cuba", + "ADM0_A3": "CUB", + "GEOU_DIF": 0, + "GEOUNIT": "Cuba", + "GU_A3": "CUB", + "SU_DIF": 0, + "SUBUNIT": "Cuba", + "SU_A3": "CUB", + "BRK_DIFF": 0, + "NAME": "Cuba", + "NAME_LONG": "Cuba", + "BRK_A3": "CUB", + "BRK_NAME": "Cuba", + "BRK_GROUP": null, + "ABBREV": "Cuba", + "POSTAL": "CU", + "FORMAL_EN": "Republic of Cuba", + "FORMAL_FR": null, + "NAME_CIAWF": "Cuba", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Cuba", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 3, + "MAPCOLOR13": 4, + "POP_EST": 11147407, + "POP_RANK": 14, + "GDP_MD_EST": 132900, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CU", + "ISO_A2": "CU", + "ISO_A3": "CUB", + "ISO_A3_EH": "CUB", + "ISO_N3": "192", + "UN_A3": "192", + "WB_A2": "CU", + "WB_A3": "CUB", + "WOE_ID": 23424793, + "WOE_ID_EH": 23424793, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CUB", + "ADM0_A3_US": "CUB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-84.974911, 19.855481, -74.178025, 23.188611], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-82.268151, 23.188611], + [-81.404457, 23.117271], + [-80.618769, 23.10598], + [-79.679524, 22.765303], + [-79.281486, 22.399202], + [-78.347434, 22.512166], + [-77.993296, 22.277194], + [-77.146422, 21.657851], + [-76.523825, 21.20682], + [-76.19462, 21.220565], + [-75.598222, 21.016624], + [-75.67106, 20.735091], + [-74.933896, 20.693905], + [-74.178025, 20.284628], + [-74.296648, 20.050379], + [-74.961595, 19.923435], + [-75.63468, 19.873774], + [-76.323656, 19.952891], + [-77.755481, 19.855481], + [-77.085108, 20.413354], + [-77.492655, 20.673105], + [-78.137292, 20.739949], + [-78.482827, 21.028613], + [-78.719867, 21.598114], + [-79.285, 21.559175], + [-80.217475, 21.827324], + [-80.517535, 22.037079], + [-81.820943, 22.192057], + [-82.169992, 22.387109], + [-81.795002, 22.636965], + [-82.775898, 22.68815], + [-83.494459, 22.168518], + [-83.9088, 22.154565], + [-84.052151, 21.910575], + [-84.54703, 21.801228], + [-84.974911, 21.896028], + [-84.447062, 22.20495], + [-84.230357, 22.565755], + [-83.77824, 22.788118], + [-83.267548, 22.983042], + [-82.510436, 23.078747], + [-82.268151, 23.188611] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Northern Cyprus", + "SOV_A3": "CYN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Northern Cyprus", + "ADM0_A3": "CYN", + "GEOU_DIF": 0, + "GEOUNIT": "Northern Cyprus", + "GU_A3": "CYN", + "SU_DIF": 0, + "SUBUNIT": "Northern Cyprus", + "SU_A3": "CYN", + "BRK_DIFF": 1, + "NAME": "N. Cyprus", + "NAME_LONG": "Northern Cyprus", + "BRK_A3": "B20", + "BRK_NAME": "N. Cyprus", + "BRK_GROUP": null, + "ABBREV": "N. Cy.", + "POSTAL": "CN", + "FORMAL_EN": "Turkish Republic of Northern Cyprus", + "FORMAL_FR": null, + "NAME_CIAWF": null, + "NOTE_ADM0": "Self admin.", + "NOTE_BRK": "Self admin.; Claimed by Cyprus", + "NAME_SORT": "Cyprus, Northern", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 4, + "MAPCOLOR13": 8, + "POP_EST": 265100, + "POP_RANK": 10, + "GDP_MD_EST": 3600, + "POP_YEAR": 2013, + "LASTCENSUS": -99, + "GDP_YEAR": 2013, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "-99", + "ISO_A3": "-99", + "ISO_A3_EH": "-99", + "ISO_N3": "-99", + "UN_A3": "-099", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": -90, + "WOE_ID_EH": 23424995, + "WOE_NOTE": "WOE lists as subunit of united Cyprus", + "ADM0_A3_IS": "CYP", + "ADM0_A3_US": "CYP", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 9, + "LONG_LEN": 15, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 6, + "MAX_LABEL": 10 + }, + "bbox": [32.73178, 35.000345, 34.576474, 35.671596], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [32.73178, 35.140026], + [32.802474, 35.145504], + [32.946961, 35.386703], + [33.667227, 35.373216], + [34.576474, 35.671596], + [33.900804, 35.245756], + [33.973617, 35.058506], + [33.86644, 35.093595], + [33.675392, 35.017863], + [33.525685, 35.038688], + [33.475817, 35.000345], + [33.455922, 35.101424], + [33.383833, 35.162712], + [33.190977, 35.173125], + [32.919572, 35.087833], + [32.73178, 35.140026] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Cyprus", + "SOV_A3": "CYP", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Cyprus", + "ADM0_A3": "CYP", + "GEOU_DIF": 0, + "GEOUNIT": "Cyprus", + "GU_A3": "CYP", + "SU_DIF": 0, + "SUBUNIT": "Cyprus", + "SU_A3": "CYP", + "BRK_DIFF": 0, + "NAME": "Cyprus", + "NAME_LONG": "Cyprus", + "BRK_A3": "CYP", + "BRK_NAME": "Cyprus", + "BRK_GROUP": null, + "ABBREV": "Cyp.", + "POSTAL": "CY", + "FORMAL_EN": "Republic of Cyprus", + "FORMAL_FR": null, + "NAME_CIAWF": "Cyprus", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Cyprus", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 7, + "POP_EST": 1221549, + "POP_RANK": 12, + "GDP_MD_EST": 29260, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "CY", + "ISO_A2": "CY", + "ISO_A3": "CYP", + "ISO_A3_EH": "CYP", + "ISO_N3": "196", + "UN_A3": "196", + "WB_A2": "CY", + "WB_A3": "CYP", + "WOE_ID": -90, + "WOE_ID_EH": 23424994, + "WOE_NOTE": "WOE lists as subunit of united Cyprus", + "ADM0_A3_IS": "CYP", + "ADM0_A3_US": "CYP", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [32.256667, 34.571869, 34.004881, 35.173125], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [32.73178, 35.140026], + [32.919572, 35.087833], + [33.190977, 35.173125], + [33.383833, 35.162712], + [33.455922, 35.101424], + [33.475817, 35.000345], + [33.525685, 35.038688], + [33.675392, 35.017863], + [33.86644, 35.093595], + [33.973617, 35.058506], + [34.004881, 34.978098], + [32.979827, 34.571869], + [32.490296, 34.701655], + [32.256667, 35.103232], + [32.73178, 35.140026] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Czechia", + "SOV_A3": "CZE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Czechia", + "ADM0_A3": "CZE", + "GEOU_DIF": 0, + "GEOUNIT": "Czechia", + "GU_A3": "CZE", + "SU_DIF": 0, + "SUBUNIT": "Czechia", + "SU_A3": "CZE", + "BRK_DIFF": 0, + "NAME": "Czechia", + "NAME_LONG": "Czech Republic", + "BRK_A3": "CZE", + "BRK_NAME": "Czechia", + "BRK_GROUP": null, + "ABBREV": "Cz.", + "POSTAL": "CZ", + "FORMAL_EN": "Czech Republic", + "FORMAL_FR": "la République tchèque", + "NAME_CIAWF": "Czechia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Czechia", + "NAME_ALT": "Česko", + "MAPCOLOR7": 1, + "MAPCOLOR8": 1, + "MAPCOLOR9": 2, + "MAPCOLOR13": 6, + "POP_EST": 10674723, + "POP_RANK": 14, + "GDP_MD_EST": 350900, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "EZ", + "ISO_A2": "CZ", + "ISO_A3": "CZE", + "ISO_A3_EH": "CZE", + "ISO_N3": "203", + "UN_A3": "203", + "WB_A2": "CZ", + "WB_A3": "CZE", + "WOE_ID": 23424810, + "WOE_ID_EH": 23424810, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "CZE", + "ADM0_A3_US": "CZE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 14, + "ABBREV_LEN": 3, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [12.240111, 48.555305, 18.853144, 51.117268], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.960288, 48.596982], + [16.499283, 48.785808], + [16.029647, 48.733899], + [15.253416, 49.039074], + [14.901447, 48.964402], + [14.338898, 48.555305], + [13.595946, 48.877172], + [13.031329, 49.307068], + [12.521024, 49.547415], + [12.415191, 49.969121], + [12.240111, 50.266338], + [12.966837, 50.484076], + [13.338132, 50.733234], + [14.056228, 50.926918], + [14.307013, 51.117268], + [14.570718, 51.002339], + [15.016996, 51.106674], + [15.490972, 50.78473], + [16.238627, 50.697733], + [16.176253, 50.422607], + [16.719476, 50.215747], + [16.868769, 50.473974], + [17.554567, 50.362146], + [17.649445, 50.049038], + [18.392914, 49.988629], + [18.853144, 49.49623], + [18.554971, 49.495015], + [18.399994, 49.315001], + [18.170498, 49.271515], + [18.104973, 49.043983], + [17.913512, 48.996493], + [17.886485, 48.903475], + [17.545007, 48.800019], + [17.101985, 48.816969], + [16.960288, 48.596982] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Germany", + "SOV_A3": "DEU", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Germany", + "ADM0_A3": "DEU", + "GEOU_DIF": 0, + "GEOUNIT": "Germany", + "GU_A3": "DEU", + "SU_DIF": 0, + "SUBUNIT": "Germany", + "SU_A3": "DEU", + "BRK_DIFF": 0, + "NAME": "Germany", + "NAME_LONG": "Germany", + "BRK_A3": "DEU", + "BRK_NAME": "Germany", + "BRK_GROUP": null, + "ABBREV": "Ger.", + "POSTAL": "D", + "FORMAL_EN": "Federal Republic of Germany", + "FORMAL_FR": null, + "NAME_CIAWF": "Germany", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Germany", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 5, + "MAPCOLOR9": 5, + "MAPCOLOR13": 1, + "POP_EST": 80594017, + "POP_RANK": 16, + "GDP_MD_EST": 3979000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "GM", + "ISO_A2": "DE", + "ISO_A3": "DEU", + "ISO_A3_EH": "DEU", + "ISO_N3": "276", + "UN_A3": "276", + "WB_A2": "DE", + "WB_A3": "DEU", + "WOE_ID": 23424829, + "WOE_ID_EH": 23424829, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "DEU", + "ADM0_A3_US": "DEU", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [5.988658, 47.302488, 15.016996, 54.983104], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [13.595946, 48.877172], + [13.243357, 48.416115], + [12.884103, 48.289146], + [13.025851, 47.637584], + [12.932627, 47.467646], + [12.62076, 47.672388], + [12.141357, 47.703083], + [11.426414, 47.523766], + [10.544504, 47.566399], + [10.402084, 47.302488], + [9.896068, 47.580197], + [9.594226, 47.525058], + [8.522612, 47.830828], + [8.317301, 47.61358], + [7.466759, 47.620582], + [7.593676, 48.333019], + [8.099279, 49.017784], + [6.65823, 49.201958], + [6.18632, 49.463803], + [6.242751, 49.902226], + [6.043073, 50.128052], + [6.156658, 50.803721], + [5.988658, 51.851616], + [6.589397, 51.852029], + [6.84287, 52.22844], + [7.092053, 53.144043], + [6.90514, 53.482162], + [7.100425, 53.693932], + [7.936239, 53.748296], + [8.121706, 53.527792], + [8.800734, 54.020786], + [8.572118, 54.395646], + [8.526229, 54.962744], + [9.282049, 54.830865], + [9.921906, 54.983104], + [9.93958, 54.596642], + [10.950112, 54.363607], + [10.939467, 54.008693], + [11.956252, 54.196486], + [12.51844, 54.470371], + [13.647467, 54.075511], + [14.119686, 53.757029], + [14.353315, 53.248171], + [14.074521, 52.981263], + [14.4376, 52.62485], + [14.685026, 52.089947], + [14.607098, 51.745188], + [15.016996, 51.106674], + [14.570718, 51.002339], + [14.307013, 51.117268], + [14.056228, 50.926918], + [13.338132, 50.733234], + [12.966837, 50.484076], + [12.240111, 50.266338], + [12.415191, 49.969121], + [12.521024, 49.547415], + [13.031329, 49.307068], + [13.595946, 48.877172] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Djibouti", + "SOV_A3": "DJI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Djibouti", + "ADM0_A3": "DJI", + "GEOU_DIF": 0, + "GEOUNIT": "Djibouti", + "GU_A3": "DJI", + "SU_DIF": 0, + "SUBUNIT": "Djibouti", + "SU_A3": "DJI", + "BRK_DIFF": 0, + "NAME": "Djibouti", + "NAME_LONG": "Djibouti", + "BRK_A3": "DJI", + "BRK_NAME": "Djibouti", + "BRK_GROUP": null, + "ABBREV": "Dji.", + "POSTAL": "DJ", + "FORMAL_EN": "Republic of Djibouti", + "FORMAL_FR": null, + "NAME_CIAWF": "Djibouti", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Djibouti", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 4, + "MAPCOLOR13": 8, + "POP_EST": 865267, + "POP_RANK": 11, + "GDP_MD_EST": 3345, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "DJ", + "ISO_A2": "DJ", + "ISO_A3": "DJI", + "ISO_A3_EH": "DJI", + "ISO_N3": "262", + "UN_A3": "262", + "WB_A2": "DJ", + "WB_A3": "DJI", + "WOE_ID": 23424797, + "WOE_ID_EH": 23424797, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "DJI", + "ADM0_A3_US": "DJI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [41.66176, 10.926879, 43.317852, 12.699639], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [43.081226, 12.699639], + [43.317852, 12.390148], + [43.286381, 11.974928], + [42.715874, 11.735641], + [43.145305, 11.46204], + [42.776852, 10.926879], + [42.55493, 11.10511], + [42.31414, 11.0342], + [41.75557, 11.05091], + [41.73959, 11.35511], + [41.66176, 11.6312], + [42, 12.1], + [42.35156, 12.54223], + [42.779642, 12.455416], + [43.081226, 12.699639] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Denmark", + "SOV_A3": "DN1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Denmark", + "ADM0_A3": "DNK", + "GEOU_DIF": 0, + "GEOUNIT": "Denmark", + "GU_A3": "DNK", + "SU_DIF": 0, + "SUBUNIT": "Denmark", + "SU_A3": "DNK", + "BRK_DIFF": 0, + "NAME": "Denmark", + "NAME_LONG": "Denmark", + "BRK_A3": "DNK", + "BRK_NAME": "Denmark", + "BRK_GROUP": null, + "ABBREV": "Den.", + "POSTAL": "DK", + "FORMAL_EN": "Kingdom of Denmark", + "FORMAL_FR": null, + "NAME_CIAWF": "Denmark", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Denmark", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 12, + "POP_EST": 5605948, + "POP_RANK": 13, + "GDP_MD_EST": 264800, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "DA", + "ISO_A2": "DK", + "ISO_A3": "DNK", + "ISO_A3_EH": "DNK", + "ISO_N3": "208", + "UN_A3": "208", + "WB_A2": "DK", + "WB_A3": "DNK", + "WOE_ID": 23424796, + "WOE_ID_EH": 23424796, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "DNK", + "ADM0_A3_US": "DNK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [8.089977, 54.800015, 12.690006, 57.730017], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [9.921906, 54.983104], + [9.282049, 54.830865], + [8.526229, 54.962744], + [8.120311, 55.517723], + [8.089977, 56.540012], + [8.256582, 56.809969], + [8.543438, 57.110003], + [9.424469, 57.172066], + [9.775559, 57.447941], + [10.580006, 57.730017], + [10.546106, 57.215733], + [10.25, 56.890016], + [10.369993, 56.609982], + [10.912182, 56.458621], + [10.667804, 56.081383], + [10.369993, 56.190007], + [9.649985, 55.469999], + [9.921906, 54.983104] + ] + ], + [ + [ + [12.690006, 55.609991], + [12.089991, 54.800015], + [11.043543, 55.364864], + [10.903914, 55.779955], + [12.370904, 56.111407], + [12.690006, 55.609991] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Dominican Republic", + "SOV_A3": "DOM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Dominican Republic", + "ADM0_A3": "DOM", + "GEOU_DIF": 0, + "GEOUNIT": "Dominican Republic", + "GU_A3": "DOM", + "SU_DIF": 0, + "SUBUNIT": "Dominican Republic", + "SU_A3": "DOM", + "BRK_DIFF": 0, + "NAME": "Dominican Rep.", + "NAME_LONG": "Dominican Republic", + "BRK_A3": "DOM", + "BRK_NAME": "Dominican Rep.", + "BRK_GROUP": null, + "ABBREV": "Dom. Rep.", + "POSTAL": "DO", + "FORMAL_EN": "Dominican Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Dominican Republic", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Dominican Republic", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 7, + "POP_EST": 10734247, + "POP_RANK": 14, + "GDP_MD_EST": 161900, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "DR", + "ISO_A2": "DO", + "ISO_A3": "DOM", + "ISO_A3_EH": "DOM", + "ISO_N3": "214", + "UN_A3": "214", + "WB_A2": "DO", + "WB_A3": "DOM", + "WOE_ID": 23424800, + "WOE_ID_EH": 23424800, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "DOM", + "ADM0_A3_US": "DOM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 14, + "LONG_LEN": 18, + "ABBREV_LEN": 9, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [-71.945112, 17.598564, -68.317943, 19.884911], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-71.712361, 19.714456], + [-71.587304, 19.884911], + [-70.806706, 19.880286], + [-70.214365, 19.622885], + [-69.950815, 19.648], + [-69.76925, 19.293267], + [-69.222126, 19.313214], + [-69.254346, 19.015196], + [-68.809412, 18.979074], + [-68.317943, 18.612198], + [-68.689316, 18.205142], + [-69.164946, 18.422648], + [-69.623988, 18.380713], + [-69.952934, 18.428307], + [-70.133233, 18.245915], + [-70.517137, 18.184291], + [-70.669298, 18.426886], + [-70.99995, 18.283329], + [-71.40021, 17.598564], + [-71.657662, 17.757573], + [-71.708305, 18.044997], + [-71.687738, 18.31666], + [-71.945112, 18.6169], + [-71.701303, 18.785417], + [-71.624873, 19.169838], + [-71.712361, 19.714456] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Algeria", + "SOV_A3": "DZA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Algeria", + "ADM0_A3": "DZA", + "GEOU_DIF": 0, + "GEOUNIT": "Algeria", + "GU_A3": "DZA", + "SU_DIF": 0, + "SUBUNIT": "Algeria", + "SU_A3": "DZA", + "BRK_DIFF": 0, + "NAME": "Algeria", + "NAME_LONG": "Algeria", + "BRK_A3": "DZA", + "BRK_NAME": "Algeria", + "BRK_GROUP": null, + "ABBREV": "Alg.", + "POSTAL": "DZ", + "FORMAL_EN": "People's Democratic Republic of Algeria", + "FORMAL_FR": null, + "NAME_CIAWF": "Algeria", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Algeria", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 1, + "MAPCOLOR9": 6, + "MAPCOLOR13": 3, + "POP_EST": 40969443, + "POP_RANK": 15, + "GDP_MD_EST": 609400, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "AG", + "ISO_A2": "DZ", + "ISO_A3": "DZA", + "ISO_A3_EH": "DZA", + "ISO_N3": "012", + "UN_A3": "012", + "WB_A2": "DZ", + "WB_A3": "DZA", + "WOE_ID": 23424740, + "WOE_ID_EH": 23424740, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "DZA", + "ADM0_A3_US": "DZA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [-8.6844, 19.057364, 11.999506, 37.118381], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.267419, 19.155265], + [3.158133, 19.057364], + [3.146661, 19.693579], + [2.683588, 19.85623], + [2.060991, 20.142233], + [1.823228, 20.610809], + [-1.550055, 22.792666], + [-4.923337, 24.974574], + [-8.6844, 27.395744], + [-8.665124, 27.589479], + [-8.66559, 27.656426], + [-8.674116, 28.841289], + [-7.059228, 29.579228], + [-6.060632, 29.7317], + [-5.242129, 30.000443], + [-4.859646, 30.501188], + [-3.690441, 30.896952], + [-3.647498, 31.637294], + [-3.06898, 31.724498], + [-2.616605, 32.094346], + [-1.307899, 32.262889], + [-1.124551, 32.651522], + [-1.388049, 32.864015], + [-1.733455, 33.919713], + [-1.792986, 34.527919], + [-2.169914, 35.168396], + [-1.208603, 35.714849], + [-0.127454, 35.888662], + [0.503877, 36.301273], + [1.466919, 36.605647], + [3.161699, 36.783905], + [4.815758, 36.865037], + [5.32012, 36.716519], + [6.26182, 37.110655], + [7.330385, 37.118381], + [7.737078, 36.885708], + [8.420964, 36.946427], + [8.217824, 36.433177], + [8.376368, 35.479876], + [8.140981, 34.655146], + [7.524482, 34.097376], + [7.612642, 33.344115], + [8.430473, 32.748337], + [8.439103, 32.506285], + [9.055603, 32.102692], + [9.48214, 30.307556], + [9.805634, 29.424638], + [9.859998, 28.95999], + [9.683885, 28.144174], + [9.756128, 27.688259], + [9.629056, 27.140953], + [9.716286, 26.512206], + [9.319411, 26.094325], + [9.910693, 25.365455], + [9.948261, 24.936954], + [10.303847, 24.379313], + [10.771364, 24.562532], + [11.560669, 24.097909], + [11.999506, 23.471668], + [8.572893, 21.565661], + [5.677566, 19.601207], + [4.267419, 19.155265] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Ecuador", + "SOV_A3": "ECU", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ecuador", + "ADM0_A3": "ECU", + "GEOU_DIF": 0, + "GEOUNIT": "Ecuador", + "GU_A3": "ECU", + "SU_DIF": 0, + "SUBUNIT": "Ecuador", + "SU_A3": "ECU", + "BRK_DIFF": 0, + "NAME": "Ecuador", + "NAME_LONG": "Ecuador", + "BRK_A3": "ECU", + "BRK_NAME": "Ecuador", + "BRK_GROUP": null, + "ABBREV": "Ecu.", + "POSTAL": "EC", + "FORMAL_EN": "Republic of Ecuador", + "FORMAL_FR": null, + "NAME_CIAWF": "Ecuador", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Ecuador", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 5, + "MAPCOLOR9": 2, + "MAPCOLOR13": 12, + "POP_EST": 16290913, + "POP_RANK": 14, + "GDP_MD_EST": 182400, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "EC", + "ISO_A2": "EC", + "ISO_A3": "ECU", + "ISO_A3_EH": "ECU", + "ISO_N3": "218", + "UN_A3": "218", + "WB_A2": "EC", + "WB_A3": "ECU", + "WOE_ID": 23424801, + "WOE_ID_EH": 23424801, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ECU", + "ADM0_A3_US": "ECU", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-80.967765, -4.959129, -75.233723, 1.380924], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-78.855259, 1.380924], + [-77.855061, 0.809925], + [-77.668613, 0.825893], + [-77.424984, 0.395687], + [-76.57638, 0.256936], + [-76.292314, 0.416047], + [-75.801466, 0.084801], + [-75.373223, -0.152032], + [-75.233723, -0.911417], + [-75.544996, -1.56161], + [-76.635394, -2.608678], + [-77.837905, -3.003021], + [-78.450684, -3.873097], + [-78.639897, -4.547784], + [-79.205289, -4.959129], + [-79.624979, -4.454198], + [-80.028908, -4.346091], + [-80.442242, -4.425724], + [-80.469295, -4.059287], + [-80.184015, -3.821162], + [-80.302561, -3.404856], + [-79.770293, -2.657512], + [-79.986559, -2.220794], + [-80.368784, -2.685159], + [-80.967765, -2.246943], + [-80.764806, -1.965048], + [-80.933659, -1.057455], + [-80.58337, -0.906663], + [-80.399325, -0.283703], + [-80.020898, 0.36034], + [-80.09061, 0.768429], + [-79.542762, 0.982938], + [-78.855259, 1.380924] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Egypt", + "SOV_A3": "EGY", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Egypt", + "ADM0_A3": "EGY", + "GEOU_DIF": 0, + "GEOUNIT": "Egypt", + "GU_A3": "EGY", + "SU_DIF": 0, + "SUBUNIT": "Egypt", + "SU_A3": "EGY", + "BRK_DIFF": 0, + "NAME": "Egypt", + "NAME_LONG": "Egypt", + "BRK_A3": "EGY", + "BRK_NAME": "Egypt", + "BRK_GROUP": null, + "ABBREV": "Egypt", + "POSTAL": "EG", + "FORMAL_EN": "Arab Republic of Egypt", + "FORMAL_FR": null, + "NAME_CIAWF": "Egypt", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Egypt, Arab Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 6, + "MAPCOLOR9": 7, + "MAPCOLOR13": 2, + "POP_EST": 97041072, + "POP_RANK": 16, + "GDP_MD_EST": 1105000, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "EG", + "ISO_A2": "EG", + "ISO_A3": "EGY", + "ISO_A3_EH": "EGY", + "ISO_N3": "818", + "UN_A3": "818", + "WB_A2": "EG", + "WB_A3": "EGY", + "WOE_ID": 23424802, + "WOE_ID_EH": 23424802, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "EGY", + "ADM0_A3_US": "EGY", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [24.70007, 22, 36.86623, 31.58568], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [36.86623, 22], + [32.9, 22], + [29.02, 22], + [25, 22], + [25, 25.6825], + [25, 29.238655], + [24.70007, 30.04419], + [24.95762, 30.6616], + [24.80287, 31.08929], + [25.16482, 31.56915], + [26.49533, 31.58568], + [27.45762, 31.32126], + [28.45048, 31.02577], + [28.91353, 30.87005], + [29.68342, 31.18686], + [30.09503, 31.4734], + [30.97693, 31.55586], + [31.68796, 31.4296], + [31.96041, 30.9336], + [32.19247, 31.26034], + [32.99392, 31.02407], + [33.7734, 30.96746], + [34.265435, 31.219357], + [34.26544, 31.21936], + [34.823243, 29.761081], + [34.9226, 29.50133], + [34.64174, 29.09942], + [34.42655, 28.34399], + [34.15451, 27.8233], + [33.92136, 27.6487], + [33.58811, 27.97136], + [33.13676, 28.41765], + [32.42323, 29.85108], + [32.32046, 29.76043], + [32.73482, 28.70523], + [33.34876, 27.69989], + [34.10455, 26.14227], + [34.47387, 25.59856], + [34.79507, 25.03375], + [35.69241, 23.92671], + [35.49372, 23.75237], + [35.52598, 23.10244], + [36.69069, 22.20485], + [36.86623, 22] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Eritrea", + "SOV_A3": "ERI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Eritrea", + "ADM0_A3": "ERI", + "GEOU_DIF": 0, + "GEOUNIT": "Eritrea", + "GU_A3": "ERI", + "SU_DIF": 0, + "SUBUNIT": "Eritrea", + "SU_A3": "ERI", + "BRK_DIFF": 0, + "NAME": "Eritrea", + "NAME_LONG": "Eritrea", + "BRK_A3": "ERI", + "BRK_NAME": "Eritrea", + "BRK_GROUP": null, + "ABBREV": "Erit.", + "POSTAL": "ER", + "FORMAL_EN": "State of Eritrea", + "FORMAL_FR": null, + "NAME_CIAWF": "Eritrea", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Eritrea", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 2, + "MAPCOLOR13": 12, + "POP_EST": 5918919, + "POP_RANK": 13, + "GDP_MD_EST": 9169, + "POP_YEAR": 2017, + "LASTCENSUS": 1984, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "ER", + "ISO_A2": "ER", + "ISO_A3": "ERI", + "ISO_A3_EH": "ERI", + "ISO_N3": "232", + "UN_A3": "232", + "WB_A2": "ER", + "WB_A3": "ERI", + "WOE_ID": 23424806, + "WOE_ID_EH": 23424806, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ERI", + "ADM0_A3_US": "ERI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [36.32322, 12.455416, 43.081226, 17.998307], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [43.081226, 12.699639], + [42.779642, 12.455416], + [42.35156, 12.54223], + [42.00975, 12.86582], + [41.59856, 13.45209], + [41.1552, 13.77333], + [40.8966, 14.11864], + [40.02625, 14.51959], + [39.34061, 14.53155], + [39.0994, 14.74064], + [38.51295, 14.50547], + [37.90607, 14.95943], + [37.59377, 14.2131], + [36.42951, 14.42211], + [36.32322, 14.82249], + [36.75389, 16.29186], + [36.85253, 16.95655], + [37.16747, 17.26314], + [37.904, 17.42754], + [38.41009, 17.998307], + [38.990623, 16.840626], + [39.26611, 15.922723], + [39.814294, 15.435647], + [41.179275, 14.49108], + [41.734952, 13.921037], + [42.276831, 13.343992], + [42.589576, 13.000421], + [43.081226, 12.699639] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Spain", + "SOV_A3": "ESP", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Spain", + "ADM0_A3": "ESP", + "GEOU_DIF": 0, + "GEOUNIT": "Spain", + "GU_A3": "ESP", + "SU_DIF": 0, + "SUBUNIT": "Spain", + "SU_A3": "ESP", + "BRK_DIFF": 0, + "NAME": "Spain", + "NAME_LONG": "Spain", + "BRK_A3": "ESP", + "BRK_NAME": "Spain", + "BRK_GROUP": null, + "ABBREV": "Sp.", + "POSTAL": "E", + "FORMAL_EN": "Kingdom of Spain", + "FORMAL_FR": null, + "NAME_CIAWF": "Spain", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Spain", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 5, + "MAPCOLOR13": 5, + "POP_EST": 48958159, + "POP_RANK": 15, + "GDP_MD_EST": 1690000, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "SP", + "ISO_A2": "ES", + "ISO_A3": "ESP", + "ISO_A3_EH": "ESP", + "ISO_N3": "724", + "UN_A3": "724", + "WB_A2": "ES", + "WB_A3": "ESP", + "WOE_ID": 23424950, + "WOE_ID_EH": 23424950, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ESP", + "ADM0_A3_US": "ESP", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 3, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [-9.392884, 35.94685, 3.039484, 43.748338], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-9.034818, 41.880571], + [-8.984433, 42.592775], + [-9.392884, 43.026625], + [-7.97819, 43.748338], + [-6.754492, 43.567909], + [-5.411886, 43.57424], + [-4.347843, 43.403449], + [-3.517532, 43.455901], + [-1.901351, 43.422802], + [-1.502771, 43.034014], + [0.338047, 42.579546], + [0.701591, 42.795734], + [1.826793, 42.343385], + [2.985999, 42.473015], + [3.039484, 41.89212], + [2.091842, 41.226089], + [0.810525, 41.014732], + [0.721331, 40.678318], + [0.106692, 40.123934], + [-0.278711, 39.309978], + [0.111291, 38.738514], + [-0.467124, 38.292366], + [-0.683389, 37.642354], + [-1.438382, 37.443064], + [-2.146453, 36.674144], + [-3.415781, 36.6589], + [-4.368901, 36.677839], + [-4.995219, 36.324708], + [-5.37716, 35.94685], + [-5.866432, 36.029817], + [-6.236694, 36.367677], + [-6.520191, 36.942913], + [-7.453726, 37.097788], + [-7.537105, 37.428904], + [-7.166508, 37.803894], + [-7.029281, 38.075764], + [-7.374092, 38.373059], + [-7.098037, 39.030073], + [-7.498632, 39.629571], + [-7.066592, 39.711892], + [-7.026413, 40.184524], + [-6.86402, 40.330872], + [-6.851127, 41.111083], + [-6.389088, 41.381815], + [-6.668606, 41.883387], + [-7.251309, 41.918346], + [-7.422513, 41.792075], + [-8.013175, 41.790886], + [-8.263857, 42.280469], + [-8.671946, 42.134689], + [-9.034818, 41.880571] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Estonia", + "SOV_A3": "EST", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Estonia", + "ADM0_A3": "EST", + "GEOU_DIF": 0, + "GEOUNIT": "Estonia", + "GU_A3": "EST", + "SU_DIF": 0, + "SUBUNIT": "Estonia", + "SU_A3": "EST", + "BRK_DIFF": 0, + "NAME": "Estonia", + "NAME_LONG": "Estonia", + "BRK_A3": "EST", + "BRK_NAME": "Estonia", + "BRK_GROUP": null, + "ABBREV": "Est.", + "POSTAL": "EST", + "FORMAL_EN": "Republic of Estonia", + "FORMAL_FR": null, + "NAME_CIAWF": "Estonia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Estonia", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 1, + "MAPCOLOR13": 10, + "POP_EST": 1251581, + "POP_RANK": 12, + "GDP_MD_EST": 38700, + "POP_YEAR": 2017, + "LASTCENSUS": 2000, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "EN", + "ISO_A2": "EE", + "ISO_A3": "EST", + "ISO_A3_EH": "EST", + "ISO_N3": "233", + "UN_A3": "233", + "WB_A2": "EE", + "WB_A3": "EST", + "WOE_ID": 23424805, + "WOE_ID_EH": 23424805, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "EST", + "ADM0_A3_US": "EST", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [23.339795, 57.474528, 28.131699, 59.61109], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [24.312863, 57.793424], + [24.428928, 58.383413], + [24.061198, 58.257375], + [23.42656, 58.612753], + [23.339795, 59.18724], + [24.604214, 59.465854], + [25.864189, 59.61109], + [26.949136, 59.445803], + [27.981114, 59.475388], + [27.981127, 59.475373], + [27.98112, 59.47537], + [28.131699, 59.300825], + [27.42015, 58.72457], + [27.716686, 57.791899], + [27.288185, 57.474528], + [26.463532, 57.476389], + [25.60281, 57.847529], + [25.164594, 57.970157], + [24.312863, 57.793424] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Ethiopia", + "SOV_A3": "ETH", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ethiopia", + "ADM0_A3": "ETH", + "GEOU_DIF": 0, + "GEOUNIT": "Ethiopia", + "GU_A3": "ETH", + "SU_DIF": 0, + "SUBUNIT": "Ethiopia", + "SU_A3": "ETH", + "BRK_DIFF": 0, + "NAME": "Ethiopia", + "NAME_LONG": "Ethiopia", + "BRK_A3": "ETH", + "BRK_NAME": "Ethiopia", + "BRK_GROUP": null, + "ABBREV": "Eth.", + "POSTAL": "ET", + "FORMAL_EN": "Federal Democratic Republic of Ethiopia", + "FORMAL_FR": null, + "NAME_CIAWF": "Ethiopia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Ethiopia", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 13, + "POP_EST": 105350020, + "POP_RANK": 17, + "GDP_MD_EST": 174700, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "ET", + "ISO_A2": "ET", + "ISO_A3": "ETH", + "ISO_A3_EH": "ETH", + "ISO_N3": "231", + "UN_A3": "231", + "WB_A2": "ET", + "WB_A3": "ETH", + "WOE_ID": 23424808, + "WOE_ID_EH": 23424808, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ETH", + "ADM0_A3_US": "ETH", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [32.95418, 3.42206, 47.78942, 14.95943], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [42.35156, 12.54223], + [42, 12.1], + [41.66176, 11.6312], + [41.73959, 11.35511], + [41.75557, 11.05091], + [42.31414, 11.0342], + [42.55493, 11.10511], + [42.776852, 10.926879], + [42.55876, 10.57258], + [42.92812, 10.02194], + [43.29699, 9.54048], + [43.67875, 9.18358], + [46.94834, 7.99688], + [47.78942, 8.003], + [44.9636, 5.00162], + [43.66087, 4.95755], + [42.76967, 4.25259], + [42.12861, 4.23413], + [41.855083, 3.918912], + [41.1718, 3.91909], + [40.76848, 4.25702], + [39.85494, 3.83879], + [39.559384, 3.42206], + [38.89251, 3.50074], + [38.67114, 3.61607], + [38.43697, 3.58851], + [38.120915, 3.598605], + [36.855093, 4.447864], + [36.159079, 4.447864], + [35.817448, 4.776966], + [35.817448, 5.338232], + [35.298007, 5.506], + [34.70702, 6.59422], + [34.25032, 6.82607], + [34.0751, 7.22595], + [33.56829, 7.71334], + [32.95418, 7.78497], + [33.2948, 8.35458], + [33.8255, 8.37916], + [33.97498, 8.68456], + [33.96162, 9.58358], + [34.25745, 10.63009], + [34.73115, 10.91017], + [34.83163, 11.31896], + [35.26049, 12.08286], + [35.86363, 12.57828], + [36.27022, 13.56333], + [36.42951, 14.42211], + [37.59377, 14.2131], + [37.90607, 14.95943], + [38.51295, 14.50547], + [39.0994, 14.74064], + [39.34061, 14.53155], + [40.02625, 14.51959], + [40.8966, 14.11864], + [41.1552, 13.77333], + [41.59856, 13.45209], + [42.00975, 12.86582], + [42.35156, 12.54223] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Finland", + "SOV_A3": "FI1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Finland", + "ADM0_A3": "FIN", + "GEOU_DIF": 0, + "GEOUNIT": "Finland", + "GU_A3": "FIN", + "SU_DIF": 0, + "SUBUNIT": "Finland", + "SU_A3": "FIN", + "BRK_DIFF": 0, + "NAME": "Finland", + "NAME_LONG": "Finland", + "BRK_A3": "FIN", + "BRK_NAME": "Finland", + "BRK_GROUP": null, + "ABBREV": "Fin.", + "POSTAL": "FIN", + "FORMAL_EN": "Republic of Finland", + "FORMAL_FR": null, + "NAME_CIAWF": "Finland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Finland", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 4, + "MAPCOLOR13": 6, + "POP_EST": 5491218, + "POP_RANK": 13, + "GDP_MD_EST": 224137, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "FI", + "ISO_A2": "FI", + "ISO_A3": "FIN", + "ISO_A3_EH": "FIN", + "ISO_N3": "246", + "UN_A3": "246", + "WB_A2": "FI", + "WB_A3": "FIN", + "WOE_ID": 23424812, + "WOE_ID_EH": 23424812, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "FIN", + "ADM0_A3_US": "FIN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [20.645593, 59.846373, 31.516092, 70.164193], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.903379, 66.006927], + [23.56588, 66.396051], + [23.539473, 67.936009], + [21.978535, 68.616846], + [20.645593, 69.106247], + [21.244936, 69.370443], + [22.356238, 68.841741], + [23.66205, 68.891247], + [24.735679, 68.649557], + [25.689213, 69.092114], + [26.179622, 69.825299], + [27.732292, 70.164193], + [29.015573, 69.766491], + [28.59193, 69.064777], + [28.445944, 68.364613], + [29.977426, 67.698297], + [29.054589, 66.944286], + [30.21765, 65.80598], + [29.54443, 64.948672], + [30.444685, 64.204453], + [30.035872, 63.552814], + [31.516092, 62.867687], + [31.139991, 62.357693], + [30.211107, 61.780028], + [28.07, 60.50352], + [28.070002, 60.503519], + [28.069998, 60.503517], + [26.255173, 60.423961], + [24.496624, 60.057316], + [22.869695, 59.846373], + [22.290764, 60.391921], + [21.322244, 60.72017], + [21.544866, 61.705329], + [21.059211, 62.607393], + [21.536029, 63.189735], + [22.442744, 63.81781], + [24.730512, 64.902344], + [25.398068, 65.111427], + [25.294043, 65.534346], + [23.903379, 66.006927] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Fiji", + "SOV_A3": "FJI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Fiji", + "ADM0_A3": "FJI", + "GEOU_DIF": 0, + "GEOUNIT": "Fiji", + "GU_A3": "FJI", + "SU_DIF": 0, + "SUBUNIT": "Fiji", + "SU_A3": "FJI", + "BRK_DIFF": 0, + "NAME": "Fiji", + "NAME_LONG": "Fiji", + "BRK_A3": "FJI", + "BRK_NAME": "Fiji", + "BRK_GROUP": null, + "ABBREV": "Fiji", + "POSTAL": "FJ", + "FORMAL_EN": "Republic of Fiji", + "FORMAL_FR": null, + "NAME_CIAWF": "Fiji", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Fiji", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 1, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 920938, + "POP_RANK": 11, + "GDP_MD_EST": 8374, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "FJ", + "ISO_A2": "FJ", + "ISO_A3": "FJI", + "ISO_A3_EH": "FJI", + "ISO_N3": "242", + "UN_A3": "242", + "WB_A2": "FJ", + "WB_A3": "FJI", + "WOE_ID": 23424813, + "WOE_ID_EH": 23424813, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "FJI", + "ADM0_A3_US": "FJI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Melanesia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-180, -18.28799, 180, -16.020882], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [178.3736, -17.33992], + [178.71806, -17.62846], + [178.55271, -18.15059], + [177.93266, -18.28799], + [177.38146, -18.16432], + [177.28504, -17.72465], + [177.67087, -17.38114], + [178.12557, -17.50481], + [178.3736, -17.33992] + ] + ], + [ + [ + [179.364143, -16.801354], + [178.725059, -17.012042], + [178.596839, -16.63915], + [179.096609, -16.433984], + [179.413509, -16.379054], + [180, -16.067133], + [180, -16.555217], + [179.364143, -16.801354] + ] + ], + [ + [ + [-179.917369, -16.501783], + [-180, -16.555217], + [-180, -16.067133], + [-179.79332, -16.020882], + [-179.917369, -16.501783] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "United Kingdom", + "SOV_A3": "GB1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Dependency", + "ADMIN": "Falkland Islands", + "ADM0_A3": "FLK", + "GEOU_DIF": 0, + "GEOUNIT": "Falkland Islands", + "GU_A3": "FLK", + "SU_DIF": 0, + "SUBUNIT": "Falkland Islands", + "SU_A3": "FLK", + "BRK_DIFF": 1, + "NAME": "Falkland Is.", + "NAME_LONG": "Falkland Islands", + "BRK_A3": "B12", + "BRK_NAME": "Falkland Is.", + "BRK_GROUP": null, + "ABBREV": "Flk. Is.", + "POSTAL": "FK", + "FORMAL_EN": "Falkland Islands", + "FORMAL_FR": null, + "NAME_CIAWF": "Falkland Islands (Islas Malvinas)", + "NOTE_ADM0": "U.K.", + "NOTE_BRK": "Admin. by U.K.; Claimed by Argentina", + "NAME_SORT": "Falkland Islands", + "NAME_ALT": "Islas Malvinas", + "MAPCOLOR7": 6, + "MAPCOLOR8": 6, + "MAPCOLOR9": 6, + "MAPCOLOR13": 3, + "POP_EST": 2931, + "POP_RANK": 4, + "GDP_MD_EST": 281.8, + "POP_YEAR": 2014, + "LASTCENSUS": -99, + "GDP_YEAR": 2012, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "FK", + "ISO_A2": "FK", + "ISO_A3": "FLK", + "ISO_A3_EH": "FLK", + "ISO_N3": "238", + "UN_A3": "238", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": 23424814, + "WOE_ID_EH": 23424814, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "FLK", + "ADM0_A3_US": "FLK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 12, + "LONG_LEN": 16, + "ABBREV_LEN": 8, + "TINY": -99, + "HOMEPART": -99, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9 + }, + "bbox": [-61.2, -52.3, -57.75, -51.1], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.2, -51.85], + [-60, -51.25], + [-59.15, -51.5], + [-58.55, -51.1], + [-57.75, -51.55], + [-58.05, -51.9], + [-59.4, -52.2], + [-59.85, -51.85], + [-60.7, -52.3], + [-61.2, -51.85] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "France", + "SOV_A3": "FR1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "France", + "ADM0_A3": "FRA", + "GEOU_DIF": 0, + "GEOUNIT": "France", + "GU_A3": "FRA", + "SU_DIF": 0, + "SUBUNIT": "France", + "SU_A3": "FRA", + "BRK_DIFF": 0, + "NAME": "France", + "NAME_LONG": "France", + "BRK_A3": "FRA", + "BRK_NAME": "France", + "BRK_GROUP": null, + "ABBREV": "Fr.", + "POSTAL": "F", + "FORMAL_EN": "French Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "France", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "France", + "NAME_ALT": null, + "MAPCOLOR7": 7, + "MAPCOLOR8": 5, + "MAPCOLOR9": 9, + "MAPCOLOR13": 11, + "POP_EST": 67106161, + "POP_RANK": 16, + "GDP_MD_EST": 2699000, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "FR", + "ISO_A2": "-99", + "ISO_A3": "-99", + "ISO_A3_EH": "-99", + "ISO_N3": "250", + "UN_A3": "250", + "WB_A2": "FR", + "WB_A3": "FRA", + "WOE_ID": -90, + "WOE_ID_EH": 23424819, + "WOE_NOTE": "Includes only Metropolitan France (including Corsica)", + "ADM0_A3_IS": "FRA", + "ADM0_A3_US": "FRA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 3, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [-54.524754, 2.053389, 9.560016, 51.148506], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [2.513573, 51.148506], + [2.658422, 50.796848], + [3.123252, 50.780363], + [3.588184, 50.378992], + [4.286023, 49.907497], + [4.799222, 49.985373], + [5.674052, 49.529484], + [5.897759, 49.442667], + [6.18632, 49.463803], + [6.65823, 49.201958], + [8.099279, 49.017784], + [7.593676, 48.333019], + [7.466759, 47.620582], + [7.192202, 47.449766], + [6.736571, 47.541801], + [6.768714, 47.287708], + [6.037389, 46.725779], + [6.022609, 46.27299], + [6.5001, 46.429673], + [6.843593, 45.991147], + [6.802355, 45.70858], + [7.096652, 45.333099], + [6.749955, 45.028518], + [7.007562, 44.254767], + [7.549596, 44.127901], + [7.435185, 43.693845], + [6.529245, 43.128892], + [4.556963, 43.399651], + [3.100411, 43.075201], + [2.985999, 42.473015], + [1.826793, 42.343385], + [0.701591, 42.795734], + [0.338047, 42.579546], + [-1.502771, 43.034014], + [-1.901351, 43.422802], + [-1.384225, 44.02261], + [-1.193798, 46.014918], + [-2.225724, 47.064363], + [-2.963276, 47.570327], + [-4.491555, 47.954954], + [-4.59235, 48.68416], + [-3.295814, 48.901692], + [-1.616511, 48.644421], + [-1.933494, 49.776342], + [-0.989469, 49.347376], + [1.338761, 50.127173], + [1.639001, 50.946606], + [2.513573, 51.148506] + ] + ], + [ + [ + [-51.657797, 4.156232], + [-52.249338, 3.241094], + [-52.556425, 2.504705], + [-52.939657, 2.124858], + [-53.418465, 2.053389], + [-53.554839, 2.334897], + [-53.778521, 2.376703], + [-54.088063, 2.105557], + [-54.524754, 2.311849], + [-54.27123, 2.738748], + [-54.184284, 3.194172], + [-54.011504, 3.62257], + [-54.399542, 4.212611], + [-54.478633, 4.896756], + [-53.958045, 5.756548], + [-53.618453, 5.646529], + [-52.882141, 5.409851], + [-51.823343, 4.565768], + [-51.657797, 4.156232] + ] + ], + [ + [ + [9.560016, 42.152492], + [9.229752, 41.380007], + [8.775723, 41.583612], + [8.544213, 42.256517], + [8.746009, 42.628122], + [9.390001, 43.009985], + [9.560016, 42.152492] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Gabon", + "SOV_A3": "GAB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Gabon", + "ADM0_A3": "GAB", + "GEOU_DIF": 0, + "GEOUNIT": "Gabon", + "GU_A3": "GAB", + "SU_DIF": 0, + "SUBUNIT": "Gabon", + "SU_A3": "GAB", + "BRK_DIFF": 0, + "NAME": "Gabon", + "NAME_LONG": "Gabon", + "BRK_A3": "GAB", + "BRK_NAME": "Gabon", + "BRK_GROUP": null, + "ABBREV": "Gabon", + "POSTAL": "GA", + "FORMAL_EN": "Gabonese Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Gabon", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Gabon", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 5, + "POP_EST": 1772255, + "POP_RANK": 12, + "GDP_MD_EST": 35980, + "POP_YEAR": 2017, + "LASTCENSUS": 2003, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "GB", + "ISO_A2": "GA", + "ISO_A3": "GAB", + "ISO_A3_EH": "GAB", + "ISO_N3": "266", + "UN_A3": "266", + "WB_A2": "GA", + "WB_A3": "GAB", + "WOE_ID": 23424822, + "WOE_ID_EH": 23424822, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GAB", + "ADM0_A3_US": "GAB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": 3, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [8.797996, -3.978827, 14.425456, 2.326758], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [11.276449, 2.261051], + [11.751665, 2.326758], + [12.35938, 2.192812], + [12.951334, 2.321616], + [13.075822, 2.267097], + [13.003114, 1.830896], + [13.282631, 1.314184], + [14.026669, 1.395677], + [14.276266, 1.19693], + [13.843321, 0.038758], + [14.316418, -0.552627], + [14.425456, -1.333407], + [14.29921, -1.998276], + [13.992407, -2.470805], + [13.109619, -2.42874], + [12.575284, -1.948511], + [12.495703, -2.391688], + [11.820964, -2.514161], + [11.478039, -2.765619], + [11.855122, -3.426871], + [11.093773, -3.978827], + [10.066135, -2.969483], + [9.405245, -2.144313], + [8.797996, -1.111301], + [8.830087, -0.779074], + [9.04842, -0.459351], + [9.291351, 0.268666], + [9.492889, 1.01012], + [9.830284, 1.067894], + [11.285079, 1.057662], + [11.276449, 2.261051] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "United Kingdom", + "SOV_A3": "GB1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "United Kingdom", + "ADM0_A3": "GBR", + "GEOU_DIF": 0, + "GEOUNIT": "United Kingdom", + "GU_A3": "GBR", + "SU_DIF": 0, + "SUBUNIT": "United Kingdom", + "SU_A3": "GBR", + "BRK_DIFF": 0, + "NAME": "United Kingdom", + "NAME_LONG": "United Kingdom", + "BRK_A3": "GBR", + "BRK_NAME": "United Kingdom", + "BRK_GROUP": null, + "ABBREV": "U.K.", + "POSTAL": "GB", + "FORMAL_EN": "United Kingdom of Great Britain and Northern Ireland", + "FORMAL_FR": null, + "NAME_CIAWF": "United Kingdom", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "United Kingdom", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 6, + "MAPCOLOR9": 6, + "MAPCOLOR13": 3, + "POP_EST": 64769452, + "POP_RANK": 16, + "GDP_MD_EST": 2788000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "UK", + "ISO_A2": "GB", + "ISO_A3": "GBR", + "ISO_A3_EH": "GBR", + "ISO_N3": "826", + "UN_A3": "826", + "WB_A2": "GB", + "WB_A3": "GBR", + "WOE_ID": -90, + "WOE_ID_EH": 23424975, + "WOE_NOTE": "Eh ID includes Channel Islands and Isle of Man. UK constituent countries of England (24554868), Wales (12578049), Scotland (12578048), and Northern Ireland (20070563).", + "ADM0_A3_IS": "GBR", + "ADM0_A3_US": "GBR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 14, + "LONG_LEN": 14, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [-7.572168, 49.96, 1.681531, 58.635], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-6.197885, 53.867565], + [-6.95373, 54.073702], + [-7.572168, 54.059956], + [-7.366031, 54.595841], + [-7.572168, 55.131622], + [-6.733847, 55.17286], + [-5.661949, 54.554603], + [-6.197885, 53.867565] + ] + ], + [ + [ + [-3.005005, 58.635], + [-4.073828, 57.553025], + [-3.055002, 57.690019], + [-1.959281, 57.6848], + [-2.219988, 56.870017], + [-3.119003, 55.973793], + [-2.085009, 55.909998], + [-2.005676, 55.804903], + [-1.114991, 54.624986], + [-0.430485, 54.464376], + [0.184981, 53.325014], + [0.469977, 52.929999], + [1.681531, 52.73952], + [1.559988, 52.099998], + [1.050562, 51.806761], + [1.449865, 51.289428], + [0.550334, 50.765739], + [-0.787517, 50.774989], + [-2.489998, 50.500019], + [-2.956274, 50.69688], + [-3.617448, 50.228356], + [-4.542508, 50.341837], + [-5.245023, 49.96], + [-5.776567, 50.159678], + [-4.30999, 51.210001], + [-3.414851, 51.426009], + [-3.422719, 51.426848], + [-4.984367, 51.593466], + [-5.267296, 51.9914], + [-4.222347, 52.301356], + [-4.770013, 52.840005], + [-4.579999, 53.495004], + [-3.093831, 53.404547], + [-3.09208, 53.404441], + [-2.945009, 53.985], + [-3.614701, 54.600937], + [-3.630005, 54.615013], + [-4.844169, 54.790971], + [-5.082527, 55.061601], + [-4.719112, 55.508473], + [-5.047981, 55.783986], + [-5.586398, 55.311146], + [-5.644999, 56.275015], + [-6.149981, 56.78501], + [-5.786825, 57.818848], + [-5.009999, 58.630013], + [-4.211495, 58.550845], + [-3.005005, 58.635] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Georgia", + "SOV_A3": "GEO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Georgia", + "ADM0_A3": "GEO", + "GEOU_DIF": 0, + "GEOUNIT": "Georgia", + "GU_A3": "GEO", + "SU_DIF": 0, + "SUBUNIT": "Georgia", + "SU_A3": "GEO", + "BRK_DIFF": 0, + "NAME": "Georgia", + "NAME_LONG": "Georgia", + "BRK_A3": "GEO", + "BRK_NAME": "Georgia", + "BRK_GROUP": null, + "ABBREV": "Geo.", + "POSTAL": "GE", + "FORMAL_EN": "Georgia", + "FORMAL_FR": null, + "NAME_CIAWF": "Georgia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Georgia", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 2, + "POP_EST": 4926330, + "POP_RANK": 12, + "GDP_MD_EST": 37270, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "GG", + "ISO_A2": "GE", + "ISO_A3": "GEO", + "ISO_A3_EH": "GEO", + "ISO_N3": "268", + "UN_A3": "268", + "WB_A2": "GE", + "WB_A3": "GEO", + "WOE_ID": 23424823, + "WOE_ID_EH": 23424823, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GEO", + "ADM0_A3_US": "GEO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [39.955009, 41.064445, 46.637908, 43.553104], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [44.97248, 41.248129], + [43.582746, 41.092143], + [42.619549, 41.583173], + [41.554084, 41.535656], + [41.703171, 41.962943], + [41.45347, 42.645123], + [40.875469, 43.013628], + [40.321394, 43.128634], + [39.955009, 43.434998], + [40.076965, 43.553104], + [40.92219, 43.38215], + [42.3944, 43.2203], + [43.75599, 42.74083], + [43.93121, 42.55496], + [44.537623, 42.711993], + [45.470279, 42.502781], + [45.7764, 42.09244], + [46.404951, 41.860675], + [46.145432, 41.722802], + [46.637908, 41.181673], + [46.501637, 41.064445], + [45.962601, 41.123873], + [45.217426, 41.411452], + [44.97248, 41.248129] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Ghana", + "SOV_A3": "GHA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ghana", + "ADM0_A3": "GHA", + "GEOU_DIF": 0, + "GEOUNIT": "Ghana", + "GU_A3": "GHA", + "SU_DIF": 0, + "SUBUNIT": "Ghana", + "SU_A3": "GHA", + "BRK_DIFF": 0, + "NAME": "Ghana", + "NAME_LONG": "Ghana", + "BRK_A3": "GHA", + "BRK_NAME": "Ghana", + "BRK_GROUP": null, + "ABBREV": "Ghana", + "POSTAL": "GH", + "FORMAL_EN": "Republic of Ghana", + "FORMAL_FR": null, + "NAME_CIAWF": "Ghana", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Ghana", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 1, + "MAPCOLOR13": 4, + "POP_EST": 27499924, + "POP_RANK": 15, + "GDP_MD_EST": 120800, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "GH", + "ISO_A2": "GH", + "ISO_A3": "GHA", + "ISO_A3_EH": "GHA", + "ISO_N3": "288", + "UN_A3": "288", + "WB_A2": "GH", + "WB_A3": "GHA", + "WOE_ID": 23424824, + "WOE_ID_EH": 23424824, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GHA", + "ADM0_A3_US": "GHA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-3.24437, 4.710462, 1.060122, 11.098341], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.827496, 9.642461], + [-2.963896, 10.395335], + [-2.940409, 10.96269], + [-1.203358, 11.009819], + [-0.761576, 10.93693], + [-0.438702, 11.098341], + [0.023803, 11.018682], + [-0.049785, 10.706918], + [0.36758, 10.191213], + [0.365901, 9.465004], + [0.461192, 8.677223], + [0.712029, 8.312465], + [0.490957, 7.411744], + [0.570384, 6.914359], + [0.836931, 6.279979], + [1.060122, 5.928837], + [-0.507638, 5.343473], + [-1.063625, 5.000548], + [-1.964707, 4.710462], + [-2.856125, 4.994476], + [-2.810701, 5.389051], + [-3.24437, 6.250472], + [-2.983585, 7.379705], + [-2.56219, 8.219628], + [-2.827496, 9.642461] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Guinea", + "SOV_A3": "GIN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Guinea", + "ADM0_A3": "GIN", + "GEOU_DIF": 0, + "GEOUNIT": "Guinea", + "GU_A3": "GIN", + "SU_DIF": 0, + "SUBUNIT": "Guinea", + "SU_A3": "GIN", + "BRK_DIFF": 0, + "NAME": "Guinea", + "NAME_LONG": "Guinea", + "BRK_A3": "GIN", + "BRK_NAME": "Guinea", + "BRK_GROUP": null, + "ABBREV": "Gin.", + "POSTAL": "GN", + "FORMAL_EN": "Republic of Guinea", + "FORMAL_FR": null, + "NAME_CIAWF": "Guinea", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Guinea", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 7, + "MAPCOLOR13": 2, + "POP_EST": 12413867, + "POP_RANK": 14, + "GDP_MD_EST": 16080, + "POP_YEAR": 2017, + "LASTCENSUS": 1996, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "GV", + "ISO_A2": "GN", + "ISO_A3": "GIN", + "ISO_A3_EH": "GIN", + "ISO_N3": "324", + "UN_A3": "324", + "WB_A2": "GN", + "WB_A3": "GIN", + "WOE_ID": 23424835, + "WOE_ID_EH": 23424835, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GIN", + "ADM0_A3_US": "GIN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-15.130311, 7.309037, -7.8321, 12.586183], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.029944, 10.206535], + [-8.229337, 10.12902], + [-8.309616, 9.789532], + [-8.079114, 9.376224], + [-7.8321, 8.575704], + [-8.203499, 8.455453], + [-8.299049, 8.316444], + [-8.221792, 8.123329], + [-8.280703, 7.68718], + [-8.439298, 7.686043], + [-8.722124, 7.711674], + [-8.926065, 7.309037], + [-9.208786, 7.313921], + [-9.403348, 7.526905], + [-9.33728, 7.928534], + [-9.755342, 8.541055], + [-10.016567, 8.428504], + [-10.230094, 8.406206], + [-10.505477, 8.348896], + [-10.494315, 8.715541], + [-10.65477, 8.977178], + [-10.622395, 9.26791], + [-10.839152, 9.688246], + [-11.117481, 10.045873], + [-11.917277, 10.046984], + [-12.150338, 9.858572], + [-12.425929, 9.835834], + [-12.596719, 9.620188], + [-12.711958, 9.342712], + [-13.24655, 8.903049], + [-13.685154, 9.494744], + [-14.074045, 9.886167], + [-14.330076, 10.01572], + [-14.579699, 10.214467], + [-14.693232, 10.656301], + [-14.839554, 10.876572], + [-15.130311, 11.040412], + [-14.685687, 11.527824], + [-14.382192, 11.509272], + [-14.121406, 11.677117], + [-13.9008, 11.678719], + [-13.743161, 11.811269], + [-13.828272, 12.142644], + [-13.718744, 12.247186], + [-13.700476, 12.586183], + [-13.217818, 12.575874], + [-12.499051, 12.33209], + [-12.278599, 12.35444], + [-12.203565, 12.465648], + [-11.658301, 12.386583], + [-11.513943, 12.442988], + [-11.456169, 12.076834], + [-11.297574, 12.077971], + [-11.036556, 12.211245], + [-10.87083, 12.177887], + [-10.593224, 11.923975], + [-10.165214, 11.844084], + [-9.890993, 12.060479], + [-9.567912, 12.194243], + [-9.327616, 12.334286], + [-9.127474, 12.30806], + [-8.905265, 12.088358], + [-8.786099, 11.812561], + [-8.376305, 11.393646], + [-8.581305, 11.136246], + [-8.620321, 10.810891], + [-8.407311, 10.909257], + [-8.282357, 10.792597], + [-8.335377, 10.494812], + [-8.029944, 10.206535] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Gambia", + "SOV_A3": "GMB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Gambia", + "ADM0_A3": "GMB", + "GEOU_DIF": 0, + "GEOUNIT": "Gambia", + "GU_A3": "GMB", + "SU_DIF": 0, + "SUBUNIT": "Gambia", + "SU_A3": "GMB", + "BRK_DIFF": 0, + "NAME": "Gambia", + "NAME_LONG": "The Gambia", + "BRK_A3": "GMB", + "BRK_NAME": "Gambia", + "BRK_GROUP": null, + "ABBREV": "Gambia", + "POSTAL": "GM", + "FORMAL_EN": "Republic of the Gambia", + "FORMAL_FR": null, + "NAME_CIAWF": "Gambia, The", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Gambia, The", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 8, + "POP_EST": 2051363, + "POP_RANK": 12, + "GDP_MD_EST": 3387, + "POP_YEAR": 2017, + "LASTCENSUS": 2003, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "GA", + "ISO_A2": "GM", + "ISO_A3": "GMB", + "ISO_A3_EH": "GMB", + "ISO_N3": "270", + "UN_A3": "270", + "WB_A2": "GM", + "WB_A3": "GMB", + "WOE_ID": 23424821, + "WOE_ID_EH": 23424821, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GMB", + "ADM0_A3_US": "GMB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 10, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [-16.841525, 13.130284, -13.844963, 13.876492], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-16.841525, 13.151394], + [-16.713729, 13.594959], + [-15.624596, 13.623587], + [-15.39877, 13.860369], + [-15.081735, 13.876492], + [-14.687031, 13.630357], + [-14.376714, 13.62568], + [-14.046992, 13.794068], + [-13.844963, 13.505042], + [-14.277702, 13.280585], + [-14.712197, 13.298207], + [-15.141163, 13.509512], + [-15.511813, 13.27857], + [-15.691001, 13.270353], + [-15.931296, 13.130284], + [-16.841525, 13.151394] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Guinea-Bissau", + "SOV_A3": "GNB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Guinea-Bissau", + "ADM0_A3": "GNB", + "GEOU_DIF": 0, + "GEOUNIT": "Guinea-Bissau", + "GU_A3": "GNB", + "SU_DIF": 0, + "SUBUNIT": "Guinea-Bissau", + "SU_A3": "GNB", + "BRK_DIFF": 0, + "NAME": "Guinea-Bissau", + "NAME_LONG": "Guinea-Bissau", + "BRK_A3": "GNB", + "BRK_NAME": "Guinea-Bissau", + "BRK_GROUP": null, + "ABBREV": "GnB.", + "POSTAL": "GW", + "FORMAL_EN": "Republic of Guinea-Bissau", + "FORMAL_FR": null, + "NAME_CIAWF": "Guinea-Bissau", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Guinea-Bissau", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 3, + "MAPCOLOR13": 4, + "POP_EST": 1792338, + "POP_RANK": 12, + "GDP_MD_EST": 2851, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "PU", + "ISO_A2": "GW", + "ISO_A3": "GNB", + "ISO_A3_EH": "GNB", + "ISO_N3": "624", + "UN_A3": "624", + "WB_A2": "GW", + "WB_A3": "GNB", + "WOE_ID": 23424929, + "WOE_ID_EH": 23424929, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GNB", + "ADM0_A3_US": "GNB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 13, + "LONG_LEN": 13, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [-16.677452, 11.040412, -13.700476, 12.62817], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-13.700476, 12.586183], + [-13.718744, 12.247186], + [-13.828272, 12.142644], + [-13.743161, 11.811269], + [-13.9008, 11.678719], + [-14.121406, 11.677117], + [-14.382192, 11.509272], + [-14.685687, 11.527824], + [-15.130311, 11.040412], + [-15.66418, 11.458474], + [-16.085214, 11.524594], + [-16.314787, 11.806515], + [-16.308947, 11.958702], + [-16.613838, 12.170911], + [-16.677452, 12.384852], + [-16.147717, 12.547762], + [-15.816574, 12.515567], + [-15.548477, 12.62817], + [-13.700476, 12.586183] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Equatorial Guinea", + "SOV_A3": "GNQ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Equatorial Guinea", + "ADM0_A3": "GNQ", + "GEOU_DIF": 0, + "GEOUNIT": "Equatorial Guinea", + "GU_A3": "GNQ", + "SU_DIF": 0, + "SUBUNIT": "Equatorial Guinea", + "SU_A3": "GNQ", + "BRK_DIFF": 0, + "NAME": "Eq. Guinea", + "NAME_LONG": "Equatorial Guinea", + "BRK_A3": "GNQ", + "BRK_NAME": "Eq. Guinea", + "BRK_GROUP": null, + "ABBREV": "Eq. G.", + "POSTAL": "GQ", + "FORMAL_EN": "Republic of Equatorial Guinea", + "FORMAL_FR": null, + "NAME_CIAWF": "Equatorial Guinea", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Equatorial Guinea", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 4, + "MAPCOLOR13": 8, + "POP_EST": 778358, + "POP_RANK": 11, + "GDP_MD_EST": 31770, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "EK", + "ISO_A2": "GQ", + "ISO_A3": "GNQ", + "ISO_A3_EH": "GNQ", + "ISO_N3": "226", + "UN_A3": "226", + "WB_A2": "GQ", + "WB_A3": "GNQ", + "WOE_ID": 23424804, + "WOE_ID_EH": 23424804, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GNQ", + "ADM0_A3_US": "GNQ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 10, + "LONG_LEN": 17, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [9.305613, 1.01012, 11.285079, 2.283866], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.649158, 2.283866], + [11.276449, 2.261051], + [11.285079, 1.057662], + [9.830284, 1.067894], + [9.492889, 1.01012], + [9.305613, 1.160911], + [9.649158, 2.283866] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Greece", + "SOV_A3": "GRC", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Greece", + "ADM0_A3": "GRC", + "GEOU_DIF": 0, + "GEOUNIT": "Greece", + "GU_A3": "GRC", + "SU_DIF": 0, + "SUBUNIT": "Greece", + "SU_A3": "GRC", + "BRK_DIFF": 0, + "NAME": "Greece", + "NAME_LONG": "Greece", + "BRK_A3": "GRC", + "BRK_NAME": "Greece", + "BRK_GROUP": null, + "ABBREV": "Greece", + "POSTAL": "GR", + "FORMAL_EN": "Hellenic Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Greece", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Greece", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 9, + "POP_EST": 10768477, + "POP_RANK": 14, + "GDP_MD_EST": 290500, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "GR", + "ISO_A2": "GR", + "ISO_A3": "GRC", + "ISO_A3_EH": "GRC", + "ISO_N3": "300", + "UN_A3": "300", + "WB_A2": "GR", + "WB_A3": "GRC", + "WOE_ID": 23424833, + "WOE_ID_EH": 23424833, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GRC", + "ADM0_A3_US": "GRC", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [20.150016, 34.919988, 26.604196, 41.826905], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [20.150016, 39.624998], + [20.615, 40.110007], + [20.674997, 40.435], + [20.99999, 40.580004], + [21.02004, 40.842727], + [21.674161, 40.931275], + [22.055378, 41.149866], + [22.597308, 41.130487], + [22.76177, 41.3048], + [22.952377, 41.337994], + [23.692074, 41.309081], + [24.492645, 41.583896], + [25.197201, 41.234486], + [26.106138, 41.328899], + [26.117042, 41.826905], + [26.604196, 41.562115], + [26.294602, 40.936261], + [26.056942, 40.824123], + [25.447677, 40.852545], + [24.925848, 40.947062], + [23.714811, 40.687129], + [24.407999, 40.124993], + [23.899968, 39.962006], + [23.342999, 39.960998], + [22.813988, 40.476005], + [22.626299, 40.256561], + [22.849748, 39.659311], + [23.350027, 39.190011], + [22.973099, 38.970903], + [23.530016, 38.510001], + [24.025025, 38.219993], + [24.040011, 37.655015], + [23.115003, 37.920011], + [23.409972, 37.409991], + [22.774972, 37.30501], + [23.154225, 36.422506], + [22.490028, 36.41], + [21.670026, 36.844986], + [21.295011, 37.644989], + [21.120034, 38.310323], + [20.730032, 38.769985], + [20.217712, 39.340235], + [20.150016, 39.624998] + ] + ], + [ + [ + [23.69998, 35.705004], + [24.246665, 35.368022], + [25.025015, 35.424996], + [25.769208, 35.354018], + [25.745023, 35.179998], + [26.290003, 35.29999], + [26.164998, 35.004995], + [24.724982, 34.919988], + [24.735007, 35.084991], + [23.514978, 35.279992], + [23.69998, 35.705004] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Denmark", + "SOV_A3": "DN1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Greenland", + "ADM0_A3": "GRL", + "GEOU_DIF": 0, + "GEOUNIT": "Greenland", + "GU_A3": "GRL", + "SU_DIF": 0, + "SUBUNIT": "Greenland", + "SU_A3": "GRL", + "BRK_DIFF": 0, + "NAME": "Greenland", + "NAME_LONG": "Greenland", + "BRK_A3": "GRL", + "BRK_NAME": "Greenland", + "BRK_GROUP": null, + "ABBREV": "Grlnd.", + "POSTAL": "GL", + "FORMAL_EN": "Greenland", + "FORMAL_FR": null, + "NAME_CIAWF": "Greenland", + "NOTE_ADM0": "Den.", + "NOTE_BRK": null, + "NAME_SORT": "Greenland", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 12, + "POP_EST": 57713, + "POP_RANK": 8, + "GDP_MD_EST": 2173, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2015, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "GL", + "ISO_A2": "GL", + "ISO_A3": "GRL", + "ISO_A3_EH": "GRL", + "ISO_N3": "304", + "UN_A3": "304", + "WB_A2": "GL", + "WB_A3": "GRL", + "WOE_ID": 23424828, + "WOE_ID_EH": 23424828, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GRL", + "ADM0_A3_US": "GRL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Northern America", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": -99, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [-73.297, 60.03676, -12.20855, 83.64513], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-46.76379, 82.62796], + [-43.40644, 83.22516], + [-39.89753, 83.18018], + [-38.62214, 83.54905], + [-35.08787, 83.64513], + [-27.10046, 83.51966], + [-20.84539, 82.72669], + [-22.69182, 82.34165], + [-26.51753, 82.29765], + [-31.9, 82.2], + [-31.39646, 82.02154], + [-27.85666, 82.13178], + [-24.84448, 81.78697], + [-22.90328, 82.09317], + [-22.07175, 81.73449], + [-23.16961, 81.15271], + [-20.62363, 81.52462], + [-15.76818, 81.91245], + [-12.77018, 81.71885], + [-12.20855, 81.29154], + [-16.28533, 80.58004], + [-16.85, 80.35], + [-20.04624, 80.17708], + [-17.73035, 80.12912], + [-18.9, 79.4], + [-19.70499, 78.75128], + [-19.67353, 77.63859], + [-18.47285, 76.98565], + [-20.03503, 76.94434], + [-21.67944, 76.62795], + [-19.83407, 76.09808], + [-19.59896, 75.24838], + [-20.66818, 75.15585], + [-19.37281, 74.29561], + [-21.59422, 74.22382], + [-20.43454, 73.81713], + [-20.76234, 73.46436], + [-22.17221, 73.30955], + [-23.56593, 73.30663], + [-22.31311, 72.62928], + [-22.29954, 72.18409], + [-24.27834, 72.59788], + [-24.79296, 72.3302], + [-23.44296, 72.08016], + [-22.13281, 71.46898], + [-21.75356, 70.66369], + [-23.53603, 70.471], + [-24.30702, 70.85649], + [-25.54341, 71.43094], + [-25.20135, 70.75226], + [-26.36276, 70.22646], + [-23.72742, 70.18401], + [-22.34902, 70.12946], + [-25.02927, 69.2588], + [-27.74737, 68.47046], + [-30.67371, 68.12503], + [-31.77665, 68.12078], + [-32.81105, 67.73547], + [-34.20196, 66.67974], + [-36.35284, 65.9789], + [-37.04378, 65.93768], + [-38.37505, 65.69213], + [-39.81222, 65.45848], + [-40.66899, 64.83997], + [-40.68281, 64.13902], + [-41.1887, 63.48246], + [-42.81938, 62.68233], + [-42.41666, 61.90093], + [-42.86619, 61.07404], + [-43.3784, 60.09772], + [-44.7875, 60.03676], + [-46.26364, 60.85328], + [-48.26294, 60.85843], + [-49.23308, 61.40681], + [-49.90039, 62.38336], + [-51.63325, 63.62691], + [-52.14014, 64.27842], + [-52.27659, 65.1767], + [-53.66166, 66.09957], + [-53.30161, 66.8365], + [-53.96911, 67.18899], + [-52.9804, 68.35759], + [-51.47536, 68.72958], + [-51.08041, 69.14781], + [-50.87122, 69.9291], + [-52.013585, 69.574925], + [-52.55792, 69.42616], + [-53.45629, 69.283625], + [-54.68336, 69.61003], + [-54.75001, 70.28932], + [-54.35884, 70.821315], + [-53.431315, 70.835755], + [-51.39014, 70.56978], + [-53.10937, 71.20485], + [-54.00422, 71.54719], + [-55, 71.406537], + [-55.83468, 71.65444], + [-54.71819, 72.58625], + [-55.32634, 72.95861], + [-56.12003, 73.64977], + [-57.32363, 74.71026], + [-58.59679, 75.09861], + [-58.58516, 75.51727], + [-61.26861, 76.10238], + [-63.39165, 76.1752], + [-66.06427, 76.13486], + [-68.50438, 76.06141], + [-69.66485, 76.37975], + [-71.40257, 77.00857], + [-68.77671, 77.32312], + [-66.76397, 77.37595], + [-71.04293, 77.63595], + [-73.297, 78.04419], + [-73.15938, 78.43271], + [-69.37345, 78.91388], + [-65.7107, 79.39436], + [-65.3239, 79.75814], + [-68.02298, 80.11721], + [-67.15129, 80.51582], + [-63.68925, 81.21396], + [-62.23444, 81.3211], + [-62.65116, 81.77042], + [-60.28249, 82.03363], + [-57.20744, 82.19074], + [-54.13442, 82.19962], + [-53.04328, 81.88833], + [-50.39061, 82.43883], + [-48.00386, 82.06481], + [-46.59984, 81.985945], + [-44.523, 81.6607], + [-46.9007, 82.19979], + [-46.76379, 82.62796] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Guatemala", + "SOV_A3": "GTM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Guatemala", + "ADM0_A3": "GTM", + "GEOU_DIF": 0, + "GEOUNIT": "Guatemala", + "GU_A3": "GTM", + "SU_DIF": 0, + "SUBUNIT": "Guatemala", + "SU_A3": "GTM", + "BRK_DIFF": 0, + "NAME": "Guatemala", + "NAME_LONG": "Guatemala", + "BRK_A3": "GTM", + "BRK_NAME": "Guatemala", + "BRK_GROUP": null, + "ABBREV": "Guat.", + "POSTAL": "GT", + "FORMAL_EN": "Republic of Guatemala", + "FORMAL_FR": null, + "NAME_CIAWF": "Guatemala", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Guatemala", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 3, + "MAPCOLOR9": 3, + "MAPCOLOR13": 6, + "POP_EST": 15460732, + "POP_RANK": 14, + "GDP_MD_EST": 131800, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "GT", + "ISO_A2": "GT", + "ISO_A3": "GTM", + "ISO_A3_EH": "GTM", + "ISO_N3": "320", + "UN_A3": "320", + "WB_A2": "GT", + "WB_A3": "GTM", + "WOE_ID": 23424834, + "WOE_ID_EH": 23424834, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GTM", + "ADM0_A3_US": "GTM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 5, + "TINY": 4, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-92.229249, 13.735338, -88.225023, 17.819326], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-89.14308, 17.808319], + [-89.150806, 17.015577], + [-89.229122, 15.886938], + [-88.930613, 15.887273], + [-88.604586, 15.70638], + [-88.518364, 15.855389], + [-88.225023, 15.727722], + [-88.68068, 15.346247], + [-89.154811, 15.066419], + [-89.22522, 14.874286], + [-89.145535, 14.678019], + [-89.353326, 14.424133], + [-89.587343, 14.362586], + [-89.534219, 14.244816], + [-89.721934, 14.134228], + [-90.064678, 13.88197], + [-90.095555, 13.735338], + [-90.608624, 13.909771], + [-91.23241, 13.927832], + [-91.689747, 14.126218], + [-92.22775, 14.538829], + [-92.20323, 14.830103], + [-92.087216, 15.064585], + [-92.229249, 15.251447], + [-91.74796, 16.066565], + [-90.464473, 16.069562], + [-90.438867, 16.41011], + [-90.600847, 16.470778], + [-90.711822, 16.687483], + [-91.08167, 16.918477], + [-91.453921, 17.252177], + [-91.002269, 17.254658], + [-91.00152, 17.817595], + [-90.067934, 17.819326], + [-89.14308, 17.808319] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Guyana", + "SOV_A3": "GUY", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Guyana", + "ADM0_A3": "GUY", + "GEOU_DIF": 0, + "GEOUNIT": "Guyana", + "GU_A3": "GUY", + "SU_DIF": 0, + "SUBUNIT": "Guyana", + "SU_A3": "GUY", + "BRK_DIFF": 0, + "NAME": "Guyana", + "NAME_LONG": "Guyana", + "BRK_A3": "GUY", + "BRK_NAME": "Guyana", + "BRK_GROUP": null, + "ABBREV": "Guy.", + "POSTAL": "GY", + "FORMAL_EN": "Co-operative Republic of Guyana", + "FORMAL_FR": null, + "NAME_CIAWF": "Guyana", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Guyana", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 4, + "MAPCOLOR13": 8, + "POP_EST": 737718, + "POP_RANK": 11, + "GDP_MD_EST": 6093, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "GY", + "ISO_A2": "GY", + "ISO_A3": "GUY", + "ISO_A3_EH": "GUY", + "ISO_N3": "328", + "UN_A3": "328", + "WB_A2": "GY", + "WB_A3": "GUY", + "WOE_ID": 23424836, + "WOE_ID_EH": 23424836, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "GUY", + "ADM0_A3_US": "GUY", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-61.410303, 1.268088, -56.539386, 8.367035], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-56.539386, 1.899523], + [-56.782704, 1.863711], + [-57.335823, 1.948538], + [-57.660971, 1.682585], + [-58.11345, 1.507195], + [-58.429477, 1.463942], + [-58.540013, 1.268088], + [-59.030862, 1.317698], + [-59.646044, 1.786894], + [-59.718546, 2.24963], + [-59.974525, 2.755233], + [-59.815413, 3.606499], + [-59.53804, 3.958803], + [-59.767406, 4.423503], + [-60.111002, 4.574967], + [-59.980959, 5.014061], + [-60.213683, 5.244486], + [-60.733574, 5.200277], + [-61.410303, 5.959068], + [-61.139415, 6.234297], + [-61.159336, 6.696077], + [-60.543999, 6.856584], + [-60.295668, 7.043911], + [-60.637973, 7.415], + [-60.550588, 7.779603], + [-59.758285, 8.367035], + [-59.101684, 7.999202], + [-58.482962, 7.347691], + [-58.454876, 6.832787], + [-58.078103, 6.809094], + [-57.542219, 6.321268], + [-57.147436, 5.97315], + [-57.307246, 5.073567], + [-57.914289, 4.812626], + [-57.86021, 4.576801], + [-58.044694, 4.060864], + [-57.601569, 3.334655], + [-57.281433, 3.333492], + [-57.150098, 2.768927], + [-56.539386, 1.899523] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Honduras", + "SOV_A3": "HND", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Honduras", + "ADM0_A3": "HND", + "GEOU_DIF": 0, + "GEOUNIT": "Honduras", + "GU_A3": "HND", + "SU_DIF": 0, + "SUBUNIT": "Honduras", + "SU_A3": "HND", + "BRK_DIFF": 0, + "NAME": "Honduras", + "NAME_LONG": "Honduras", + "BRK_A3": "HND", + "BRK_NAME": "Honduras", + "BRK_GROUP": null, + "ABBREV": "Hond.", + "POSTAL": "HN", + "FORMAL_EN": "Republic of Honduras", + "FORMAL_FR": null, + "NAME_CIAWF": "Honduras", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Honduras", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 5, + "MAPCOLOR9": 2, + "MAPCOLOR13": 5, + "POP_EST": 9038741, + "POP_RANK": 13, + "GDP_MD_EST": 43190, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "HO", + "ISO_A2": "HN", + "ISO_A3": "HND", + "ISO_A3_EH": "HND", + "ISO_N3": "340", + "UN_A3": "340", + "WB_A2": "HN", + "WB_A3": "HND", + "WOE_ID": 23424841, + "WOE_ID_EH": 23424841, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "HND", + "ADM0_A3_US": "HND", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [-89.353326, 12.984686, -83.147219, 16.005406], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-89.353326, 14.424133], + [-89.145535, 14.678019], + [-89.22522, 14.874286], + [-89.154811, 15.066419], + [-88.68068, 15.346247], + [-88.225023, 15.727722], + [-88.121153, 15.688655], + [-87.901813, 15.864458], + [-87.61568, 15.878799], + [-87.522921, 15.797279], + [-87.367762, 15.84694], + [-86.903191, 15.756713], + [-86.440946, 15.782835], + [-86.119234, 15.893449], + [-86.001954, 16.005406], + [-85.683317, 15.953652], + [-85.444004, 15.885749], + [-85.182444, 15.909158], + [-84.983722, 15.995923], + [-84.52698, 15.857224], + [-84.368256, 15.835158], + [-84.063055, 15.648244], + [-83.773977, 15.424072], + [-83.410381, 15.270903], + [-83.147219, 14.995829], + [-83.489989, 15.016267], + [-83.628585, 14.880074], + [-83.975721, 14.749436], + [-84.228342, 14.748764], + [-84.449336, 14.621614], + [-84.649582, 14.666805], + [-84.820037, 14.819587], + [-84.924501, 14.790493], + [-85.052787, 14.551541], + [-85.148751, 14.560197], + [-85.165365, 14.35437], + [-85.514413, 14.079012], + [-85.698665, 13.960078], + [-85.801295, 13.836055], + [-86.096264, 14.038187], + [-86.312142, 13.771356], + [-86.520708, 13.778487], + [-86.755087, 13.754845], + [-86.733822, 13.263093], + [-86.880557, 13.254204], + [-87.005769, 13.025794], + [-87.316654, 12.984686], + [-87.489409, 13.297535], + [-87.793111, 13.38448], + [-87.723503, 13.78505], + [-87.859515, 13.893312], + [-88.065343, 13.964626], + [-88.503998, 13.845486], + [-88.541231, 13.980155], + [-88.843073, 14.140507], + [-89.058512, 14.340029], + [-89.353326, 14.424133] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Croatia", + "SOV_A3": "HRV", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Croatia", + "ADM0_A3": "HRV", + "GEOU_DIF": 0, + "GEOUNIT": "Croatia", + "GU_A3": "HRV", + "SU_DIF": 0, + "SUBUNIT": "Croatia", + "SU_A3": "HRV", + "BRK_DIFF": 0, + "NAME": "Croatia", + "NAME_LONG": "Croatia", + "BRK_A3": "HRV", + "BRK_NAME": "Croatia", + "BRK_GROUP": null, + "ABBREV": "Cro.", + "POSTAL": "HR", + "FORMAL_EN": "Republic of Croatia", + "FORMAL_FR": null, + "NAME_CIAWF": "Croatia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Croatia", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 4, + "MAPCOLOR9": 5, + "MAPCOLOR13": 1, + "POP_EST": 4292095, + "POP_RANK": 12, + "GDP_MD_EST": 94240, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "HR", + "ISO_A2": "HR", + "ISO_A3": "HRV", + "ISO_A3_EH": "HRV", + "ISO_N3": "191", + "UN_A3": "191", + "WB_A2": "HR", + "WB_A3": "HRV", + "WOE_ID": 23424843, + "WOE_ID_EH": 23424843, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "HRV", + "ADM0_A3_US": "HRV", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [13.656976, 42.479991, 19.390476, 46.503751], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.005485, 44.860234], + [18.553214, 45.08159], + [17.861783, 45.06774], + [17.002146, 45.233777], + [16.534939, 45.211608], + [16.318157, 45.004127], + [15.959367, 45.233777], + [15.750026, 44.818712], + [16.23966, 44.351143], + [16.456443, 44.04124], + [16.916156, 43.667722], + [17.297373, 43.446341], + [17.674922, 43.028563], + [18.56, 42.65], + [18.450017, 42.479992], + [18.450016, 42.479991], + [17.50997, 42.849995], + [16.930006, 43.209998], + [16.015385, 43.507215], + [15.174454, 44.243191], + [15.37625, 44.317915], + [14.920309, 44.738484], + [14.901602, 45.07606], + [14.258748, 45.233777], + [13.952255, 44.802124], + [13.656976, 45.136935], + [13.679403, 45.484149], + [13.71506, 45.500324], + [14.411968, 45.466166], + [14.595109, 45.634941], + [14.935244, 45.471695], + [15.327675, 45.452316], + [15.323954, 45.731783], + [15.67153, 45.834154], + [15.768733, 46.238108], + [16.564808, 46.503751], + [16.882515, 46.380632], + [17.630066, 45.951769], + [18.456062, 45.759481], + [18.829825, 45.908872], + [19.072769, 45.521511], + [19.390476, 45.236516], + [19.005485, 44.860234] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Haiti", + "SOV_A3": "HTI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Haiti", + "ADM0_A3": "HTI", + "GEOU_DIF": 0, + "GEOUNIT": "Haiti", + "GU_A3": "HTI", + "SU_DIF": 0, + "SUBUNIT": "Haiti", + "SU_A3": "HTI", + "BRK_DIFF": 0, + "NAME": "Haiti", + "NAME_LONG": "Haiti", + "BRK_A3": "HTI", + "BRK_NAME": "Haiti", + "BRK_GROUP": null, + "ABBREV": "Haiti", + "POSTAL": "HT", + "FORMAL_EN": "Republic of Haiti", + "FORMAL_FR": null, + "NAME_CIAWF": "Haiti", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Haiti", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 1, + "MAPCOLOR9": 7, + "MAPCOLOR13": 2, + "POP_EST": 10646714, + "POP_RANK": 14, + "GDP_MD_EST": 19340, + "POP_YEAR": 2017, + "LASTCENSUS": 2003, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "HA", + "ISO_A2": "HT", + "ISO_A3": "HTI", + "ISO_A3_EH": "HTI", + "ISO_N3": "332", + "UN_A3": "332", + "WB_A2": "HT", + "WB_A3": "HTI", + "WOE_ID": 23424839, + "WOE_ID_EH": 23424839, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "HTI", + "ADM0_A3_US": "HTI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-74.458034, 18.030993, -71.624873, 19.915684], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-71.712361, 19.714456], + [-71.624873, 19.169838], + [-71.701303, 18.785417], + [-71.945112, 18.6169], + [-71.687738, 18.31666], + [-71.708305, 18.044997], + [-72.372476, 18.214961], + [-72.844411, 18.145611], + [-73.454555, 18.217906], + [-73.922433, 18.030993], + [-74.458034, 18.34255], + [-74.369925, 18.664908], + [-73.449542, 18.526053], + [-72.694937, 18.445799], + [-72.334882, 18.668422], + [-72.79165, 19.101625], + [-72.784105, 19.483591], + [-73.415022, 19.639551], + [-73.189791, 19.915684], + [-72.579673, 19.871501], + [-71.712361, 19.714456] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Hungary", + "SOV_A3": "HUN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Hungary", + "ADM0_A3": "HUN", + "GEOU_DIF": 0, + "GEOUNIT": "Hungary", + "GU_A3": "HUN", + "SU_DIF": 0, + "SUBUNIT": "Hungary", + "SU_A3": "HUN", + "BRK_DIFF": 0, + "NAME": "Hungary", + "NAME_LONG": "Hungary", + "BRK_A3": "HUN", + "BRK_NAME": "Hungary", + "BRK_GROUP": null, + "ABBREV": "Hun.", + "POSTAL": "HU", + "FORMAL_EN": "Republic of Hungary", + "FORMAL_FR": null, + "NAME_CIAWF": "Hungary", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Hungary", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 6, + "MAPCOLOR9": 1, + "MAPCOLOR13": 5, + "POP_EST": 9850845, + "POP_RANK": 13, + "GDP_MD_EST": 267600, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "HU", + "ISO_A2": "HU", + "ISO_A3": "HUN", + "ISO_A3_EH": "HUN", + "ISO_N3": "348", + "UN_A3": "348", + "WB_A2": "HU", + "WB_A3": "HUN", + "WOE_ID": 23424844, + "WOE_ID_EH": 23424844, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "HUN", + "ADM0_A3_US": "HUN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [16.202298, 45.759481, 22.710531, 48.623854], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.202298, 46.852386], + [16.534268, 47.496171], + [16.340584, 47.712902], + [16.903754, 47.714866], + [16.979667, 48.123497], + [17.488473, 47.867466], + [17.857133, 47.758429], + [18.696513, 47.880954], + [18.777025, 48.081768], + [19.174365, 48.111379], + [19.661364, 48.266615], + [19.769471, 48.202691], + [20.239054, 48.327567], + [20.473562, 48.56285], + [20.801294, 48.623854], + [21.872236, 48.319971], + [22.085608, 48.422264], + [22.64082, 48.15024], + [22.710531, 47.882194], + [22.099768, 47.672439], + [21.626515, 46.994238], + [21.021952, 46.316088], + [20.220192, 46.127469], + [19.596045, 46.17173], + [18.829838, 45.908878], + [18.829825, 45.908872], + [18.456062, 45.759481], + [17.630066, 45.951769], + [16.882515, 46.380632], + [16.564808, 46.503751], + [16.370505, 46.841327], + [16.202298, 46.852386] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Indonesia", + "SOV_A3": "IDN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Indonesia", + "ADM0_A3": "IDN", + "GEOU_DIF": 0, + "GEOUNIT": "Indonesia", + "GU_A3": "IDN", + "SU_DIF": 0, + "SUBUNIT": "Indonesia", + "SU_A3": "IDN", + "BRK_DIFF": 0, + "NAME": "Indonesia", + "NAME_LONG": "Indonesia", + "BRK_A3": "IDN", + "BRK_NAME": "Indonesia", + "BRK_GROUP": null, + "ABBREV": "Indo.", + "POSTAL": "INDO", + "FORMAL_EN": "Republic of Indonesia", + "FORMAL_FR": null, + "NAME_CIAWF": "Indonesia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Indonesia", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 6, + "MAPCOLOR9": 6, + "MAPCOLOR13": 11, + "POP_EST": 260580739, + "POP_RANK": 17, + "GDP_MD_EST": 3028000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "4. Emerging region: MIKT", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "ID", + "ISO_A2": "ID", + "ISO_A3": "IDN", + "ISO_A3_EH": "IDN", + "ISO_N3": "360", + "UN_A3": "360", + "WB_A2": "ID", + "WB_A3": "IDN", + "WOE_ID": 23424846, + "WOE_ID_EH": 23424846, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "IDN", + "ADM0_A3_US": "IDN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [95.293026, -10.359987, 141.033852, 5.479821], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [120.715609, -10.239581], + [120.295014, -10.25865], + [118.967808, -9.557969], + [119.90031, -9.36134], + [120.425756, -9.665921], + [120.775502, -9.969675], + [120.715609, -10.239581] + ] + ], + [ + [ + [124.968682, -8.89279], + [125.07002, -9.089987], + [125.08852, -9.393173], + [124.43595, -10.140001], + [123.579982, -10.359987], + [123.459989, -10.239995], + [123.550009, -9.900016], + [123.980009, -9.290027], + [124.968682, -8.89279] + ] + ], + [ + [ + [117.900018, -8.095681], + [118.260616, -8.362383], + [118.87846, -8.280683], + [119.126507, -8.705825], + [117.970402, -8.906639], + [117.277731, -9.040895], + [116.740141, -9.032937], + [117.083737, -8.457158], + [117.632024, -8.449303], + [117.900018, -8.095681] + ] + ], + [ + [ + [122.903537, -8.094234], + [122.756983, -8.649808], + [121.254491, -8.933666], + [119.924391, -8.810418], + [119.920929, -8.444859], + [120.715092, -8.236965], + [121.341669, -8.53674], + [122.007365, -8.46062], + [122.903537, -8.094234] + ] + ], + [ + [ + [108.623479, -6.777674], + [110.539227, -6.877358], + [110.759576, -6.465186], + [112.614811, -6.946036], + [112.978768, -7.594213], + [114.478935, -7.776528], + [115.705527, -8.370807], + [114.564511, -8.751817], + [113.464734, -8.348947], + [112.559672, -8.376181], + [111.522061, -8.302129], + [110.58615, -8.122605], + [109.427667, -7.740664], + [108.693655, -7.6416], + [108.277763, -7.766657], + [106.454102, -7.3549], + [106.280624, -6.9249], + [105.365486, -6.851416], + [106.051646, -5.895919], + [107.265009, -5.954985], + [108.072091, -6.345762], + [108.486846, -6.421985], + [108.623479, -6.777674] + ] + ], + [ + [ + [134.724624, -6.214401], + [134.210134, -6.895238], + [134.112776, -6.142467], + [134.290336, -5.783058], + [134.499625, -5.445042], + [134.727002, -5.737582], + [134.724624, -6.214401] + ] + ], + [ + [ + [127.249215, -3.459065], + [126.874923, -3.790983], + [126.183802, -3.607376], + [125.989034, -3.177273], + [127.000651, -3.129318], + [127.249215, -3.459065] + ] + ], + [ + [ + [130.471344, -3.093764], + [130.834836, -3.858472], + [129.990547, -3.446301], + [129.155249, -3.362637], + [128.590684, -3.428679], + [127.898891, -3.393436], + [128.135879, -2.84365], + [129.370998, -2.802154], + [130.471344, -3.093764] + ] + ], + [ + [ + [141.00021, -2.600151], + [141.017057, -5.859022], + [141.033852, -9.117893], + [140.143415, -8.297168], + [139.127767, -8.096043], + [138.881477, -8.380935], + [137.614474, -8.411683], + [138.039099, -7.597882], + [138.668621, -7.320225], + [138.407914, -6.232849], + [137.92784, -5.393366], + [135.98925, -4.546544], + [135.164598, -4.462931], + [133.66288, -3.538853], + [133.367705, -4.024819], + [132.983956, -4.112979], + [132.756941, -3.746283], + [132.753789, -3.311787], + [131.989804, -2.820551], + [133.066845, -2.460418], + [133.780031, -2.479848], + [133.696212, -2.214542], + [132.232373, -2.212526], + [131.836222, -1.617162], + [130.94284, -1.432522], + [130.519558, -0.93772], + [131.867538, -0.695461], + [132.380116, -0.369538], + [133.985548, -0.78021], + [134.143368, -1.151867], + [134.422627, -2.769185], + [135.457603, -3.367753], + [136.293314, -2.307042], + [137.440738, -1.703513], + [138.329727, -1.702686], + [139.184921, -2.051296], + [139.926684, -2.409052], + [141.00021, -2.600151] + ] + ], + [ + [ + [125.240501, 1.419836], + [124.437035, 0.427881], + [123.685505, 0.235593], + [122.723083, 0.431137], + [121.056725, 0.381217], + [120.183083, 0.237247], + [120.04087, -0.519658], + [120.935905, -1.408906], + [121.475821, -0.955962], + [123.340565, -0.615673], + [123.258399, -1.076213], + [122.822715, -0.930951], + [122.38853, -1.516858], + [121.508274, -1.904483], + [122.454572, -3.186058], + [122.271896, -3.5295], + [123.170963, -4.683693], + [123.162333, -5.340604], + [122.628515, -5.634591], + [122.236394, -5.282933], + [122.719569, -4.464172], + [121.738234, -4.851331], + [121.489463, -4.574553], + [121.619171, -4.188478], + [120.898182, -3.602105], + [120.972389, -2.627643], + [120.305453, -2.931604], + [120.390047, -4.097579], + [120.430717, -5.528241], + [119.796543, -5.6734], + [119.366906, -5.379878], + [119.653606, -4.459417], + [119.498835, -3.494412], + [119.078344, -3.487022], + [118.767769, -2.801999], + [119.180974, -2.147104], + [119.323394, -1.353147], + [119.825999, 0.154254], + [120.035702, 0.566477], + [120.885779, 1.309223], + [121.666817, 1.013944], + [122.927567, 0.875192], + [124.077522, 0.917102], + [125.065989, 1.643259], + [125.240501, 1.419836] + ] + ], + [ + [ + [128.688249, 1.132386], + [128.635952, 0.258486], + [128.12017, 0.356413], + [127.968034, -0.252077], + [128.379999, -0.780004], + [128.100016, -0.899996], + [127.696475, -0.266598], + [127.39949, 1.011722], + [127.600512, 1.810691], + [127.932378, 2.174596], + [128.004156, 1.628531], + [128.594559, 1.540811], + [128.688249, 1.132386] + ] + ], + [ + [ + [109.66326, 2.006467], + [109.830227, 1.338136], + [110.514061, 0.773131], + [111.159138, 0.976478], + [111.797548, 0.904441], + [112.380252, 1.410121], + [112.859809, 1.49779], + [113.80585, 1.217549], + [114.621355, 1.430688], + [115.134037, 2.821482], + [115.519078, 3.169238], + [115.865517, 4.306559], + [117.015214, 4.306094], + [117.882035, 4.137551], + [117.313232, 3.234428], + [118.04833, 2.28769], + [117.875627, 1.827641], + [118.996747, 0.902219], + [117.811858, 0.784242], + [117.478339, 0.102475], + [117.521644, -0.803723], + [116.560048, -1.487661], + [116.533797, -2.483517], + [116.148084, -4.012726], + [116.000858, -3.657037], + [114.864803, -4.106984], + [114.468652, -3.495704], + [113.755672, -3.43917], + [113.256994, -3.118776], + [112.068126, -3.478392], + [111.703291, -2.994442], + [111.04824, -3.049426], + [110.223846, -2.934032], + [110.070936, -1.592874], + [109.571948, -1.314907], + [109.091874, -0.459507], + [108.952658, 0.415375], + [109.069136, 1.341934], + [109.66326, 2.006467] + ] + ], + [ + [ + [105.817655, -5.852356], + [104.710384, -5.873285], + [103.868213, -5.037315], + [102.584261, -4.220259], + [102.156173, -3.614146], + [101.399113, -2.799777], + [100.902503, -2.050262], + [100.141981, -0.650348], + [99.26374, 0.183142], + [98.970011, 1.042882], + [98.601351, 1.823507], + [97.699598, 2.453184], + [97.176942, 3.308791], + [96.424017, 3.86886], + [95.380876, 4.970782], + [95.293026, 5.479821], + [95.936863, 5.439513], + [97.484882, 5.246321], + [98.369169, 4.26837], + [99.142559, 3.59035], + [99.693998, 3.174329], + [100.641434, 2.099381], + [101.658012, 2.083697], + [102.498271, 1.3987], + [103.07684, 0.561361], + [103.838396, 0.104542], + [103.437645, -0.711946], + [104.010789, -1.059212], + [104.369991, -1.084843], + [104.53949, -1.782372], + [104.887893, -2.340425], + [105.622111, -2.428844], + [106.108593, -3.061777], + [105.857446, -4.305525], + [105.817655, -5.852356] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "India", + "SOV_A3": "IND", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "India", + "ADM0_A3": "IND", + "GEOU_DIF": 0, + "GEOUNIT": "India", + "GU_A3": "IND", + "SU_DIF": 0, + "SUBUNIT": "India", + "SU_A3": "IND", + "BRK_DIFF": 0, + "NAME": "India", + "NAME_LONG": "India", + "BRK_A3": "IND", + "BRK_NAME": "India", + "BRK_GROUP": null, + "ABBREV": "India", + "POSTAL": "IND", + "FORMAL_EN": "Republic of India", + "FORMAL_FR": null, + "NAME_CIAWF": "India", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "India", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 3, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 1281935911, + "POP_RANK": 18, + "GDP_MD_EST": 8721000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "3. Emerging region: BRIC", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "IN", + "ISO_A2": "IN", + "ISO_A3": "IND", + "ISO_A3_EH": "IND", + "ISO_N3": "356", + "UN_A3": "356", + "WB_A2": "IN", + "WB_A3": "IND", + "WOE_ID": 23424848, + "WOE_ID_EH": 23424848, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "IND", + "ADM0_A3_US": "IND", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [68.176645, 7.965535, 97.402561, 35.49401], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [92.672721, 22.041239], + [92.146035, 23.627499], + [91.869928, 23.624346], + [91.706475, 22.985264], + [91.158963, 23.503527], + [91.46773, 24.072639], + [91.915093, 24.130414], + [92.376202, 24.976693], + [91.799596, 25.147432], + [90.872211, 25.132601], + [89.920693, 25.26975], + [89.832481, 25.965082], + [89.355094, 26.014407], + [88.563049, 26.446526], + [88.209789, 25.768066], + [88.931554, 25.238692], + [88.306373, 24.866079], + [88.084422, 24.501657], + [88.69994, 24.233715], + [88.52977, 23.631142], + [88.876312, 22.879146], + [89.031961, 22.055708], + [88.888766, 21.690588], + [88.208497, 21.703172], + [86.975704, 21.495562], + [87.033169, 20.743308], + [86.499351, 20.151638], + [85.060266, 19.478579], + [83.941006, 18.30201], + [83.189217, 17.671221], + [82.192792, 17.016636], + [82.191242, 16.556664], + [81.692719, 16.310219], + [80.791999, 15.951972], + [80.324896, 15.899185], + [80.025069, 15.136415], + [80.233274, 13.835771], + [80.286294, 13.006261], + [79.862547, 12.056215], + [79.857999, 10.357275], + [79.340512, 10.308854], + [78.885345, 9.546136], + [79.18972, 9.216544], + [78.277941, 8.933047], + [77.941165, 8.252959], + [77.539898, 7.965535], + [76.592979, 8.899276], + [76.130061, 10.29963], + [75.746467, 11.308251], + [75.396101, 11.781245], + [74.864816, 12.741936], + [74.616717, 13.992583], + [74.443859, 14.617222], + [73.534199, 15.990652], + [73.119909, 17.92857], + [72.820909, 19.208234], + [72.824475, 20.419503], + [72.630533, 21.356009], + [71.175273, 20.757441], + [70.470459, 20.877331], + [69.16413, 22.089298], + [69.644928, 22.450775], + [69.349597, 22.84318], + [68.176645, 23.691965], + [68.842599, 24.359134], + [71.04324, 24.356524], + [70.844699, 25.215102], + [70.282873, 25.722229], + [70.168927, 26.491872], + [69.514393, 26.940966], + [70.616496, 27.989196], + [71.777666, 27.91318], + [72.823752, 28.961592], + [73.450638, 29.976413], + [74.42138, 30.979815], + [74.405929, 31.692639], + [75.258642, 32.271105], + [74.451559, 32.7649], + [74.104294, 33.441473], + [73.749948, 34.317699], + [74.240203, 34.748887], + [75.757061, 34.504923], + [76.871722, 34.653544], + [77.837451, 35.49401], + [78.912269, 34.321936], + [78.811086, 33.506198], + [79.208892, 32.994395], + [79.176129, 32.48378], + [78.458446, 32.618164], + [78.738894, 31.515906], + [79.721367, 30.882715], + [81.111256, 30.183481], + [80.476721, 29.729865], + [80.088425, 28.79447], + [81.057203, 28.416095], + [81.999987, 27.925479], + [83.304249, 27.364506], + [84.675018, 27.234901], + [85.251779, 26.726198], + [86.024393, 26.630985], + [87.227472, 26.397898], + [88.060238, 26.414615], + [88.174804, 26.810405], + [88.043133, 27.445819], + [88.120441, 27.876542], + [88.730326, 28.086865], + [88.814248, 27.299316], + [88.835643, 27.098966], + [89.744528, 26.719403], + [90.373275, 26.875724], + [91.217513, 26.808648], + [92.033484, 26.83831], + [92.103712, 27.452614], + [91.696657, 27.771742], + [92.503119, 27.896876], + [93.413348, 28.640629], + [94.56599, 29.277438], + [95.404802, 29.031717], + [96.117679, 29.452802], + [96.586591, 28.83098], + [96.248833, 28.411031], + [97.327114, 28.261583], + [97.402561, 27.882536], + [97.051989, 27.699059], + [97.133999, 27.083774], + [96.419366, 27.264589], + [95.124768, 26.573572], + [95.155153, 26.001307], + [94.603249, 25.162495], + [94.552658, 24.675238], + [94.106742, 23.850741], + [93.325188, 24.078556], + [93.286327, 23.043658], + [93.060294, 22.703111], + [93.166128, 22.27846], + [92.672721, 22.041239] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Ireland", + "SOV_A3": "IRL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ireland", + "ADM0_A3": "IRL", + "GEOU_DIF": 0, + "GEOUNIT": "Ireland", + "GU_A3": "IRL", + "SU_DIF": 0, + "SUBUNIT": "Ireland", + "SU_A3": "IRL", + "BRK_DIFF": 0, + "NAME": "Ireland", + "NAME_LONG": "Ireland", + "BRK_A3": "IRL", + "BRK_NAME": "Ireland", + "BRK_GROUP": null, + "ABBREV": "Ire.", + "POSTAL": "IRL", + "FORMAL_EN": "Ireland", + "FORMAL_FR": null, + "NAME_CIAWF": "Ireland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Ireland", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 3, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 5011102, + "POP_RANK": 13, + "GDP_MD_EST": 322000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "EI", + "ISO_A2": "IE", + "ISO_A3": "IRL", + "ISO_A3_EH": "IRL", + "ISO_N3": "372", + "UN_A3": "372", + "WB_A2": "IE", + "WB_A3": "IRL", + "WOE_ID": 23424803, + "WOE_ID_EH": 23424803, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "IRL", + "ADM0_A3_US": "IRL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-9.977086, 51.669301, -6.032985, 55.131622], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-7.572168, 55.131622], + [-7.366031, 54.595841], + [-7.572168, 54.059956], + [-6.95373, 54.073702], + [-6.197885, 53.867565], + [-6.032985, 53.153164], + [-6.788857, 52.260118], + [-8.561617, 51.669301], + [-9.977086, 51.820455], + [-9.166283, 52.864629], + [-9.688525, 53.881363], + [-8.327987, 54.664519], + [-7.572168, 55.131622] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Iran", + "SOV_A3": "IRN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Iran", + "ADM0_A3": "IRN", + "GEOU_DIF": 0, + "GEOUNIT": "Iran", + "GU_A3": "IRN", + "SU_DIF": 0, + "SUBUNIT": "Iran", + "SU_A3": "IRN", + "BRK_DIFF": 0, + "NAME": "Iran", + "NAME_LONG": "Iran", + "BRK_A3": "IRN", + "BRK_NAME": "Iran", + "BRK_GROUP": null, + "ABBREV": "Iran", + "POSTAL": "IRN", + "FORMAL_EN": "Islamic Republic of Iran", + "FORMAL_FR": null, + "NAME_CIAWF": "Iran", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Iran, Islamic Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 13, + "POP_EST": 82021564, + "POP_RANK": 16, + "GDP_MD_EST": 1459000, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "IR", + "ISO_A2": "IR", + "ISO_A3": "IRN", + "ISO_A3_EH": "IRN", + "ISO_N3": "364", + "UN_A3": "364", + "WB_A2": "IR", + "WB_A3": "IRN", + "WOE_ID": 23424851, + "WOE_ID_EH": 23424851, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "IRN", + "ADM0_A3_US": "IRN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2.5, + "MAX_LABEL": 6.7 + }, + "bbox": [44.109225, 25.078237, 63.316632, 39.713003], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [61.210817, 35.650072], + [60.803193, 34.404102], + [60.52843, 33.676446], + [60.9637, 33.528832], + [60.536078, 32.981269], + [60.863655, 32.18292], + [60.941945, 31.548075], + [61.699314, 31.379506], + [61.781222, 30.73585], + [60.874248, 29.829239], + [61.369309, 29.303276], + [61.771868, 28.699334], + [62.72783, 28.259645], + [62.755426, 27.378923], + [63.233898, 27.217047], + [63.316632, 26.756532], + [61.874187, 26.239975], + [61.497363, 25.078237], + [59.616134, 25.380157], + [58.525761, 25.609962], + [57.397251, 25.739902], + [56.970766, 26.966106], + [56.492139, 27.143305], + [55.72371, 26.964633], + [54.71509, 26.480658], + [53.493097, 26.812369], + [52.483598, 27.580849], + [51.520763, 27.86569], + [50.852948, 28.814521], + [50.115009, 30.147773], + [49.57685, 29.985715], + [48.941333, 30.31709], + [48.567971, 29.926778], + [48.014568, 30.452457], + [48.004698, 30.985137], + [47.685286, 30.984853], + [47.849204, 31.709176], + [47.334661, 32.469155], + [46.109362, 33.017287], + [45.416691, 33.967798], + [45.64846, 34.748138], + [46.151788, 35.093259], + [46.07634, 35.677383], + [45.420618, 35.977546], + [44.772677, 37.170437], + [44.77267, 37.17045], + [44.225756, 37.971584], + [44.421403, 38.281281], + [44.109225, 39.428136], + [44.79399, 39.713003], + [44.952688, 39.335765], + [45.457722, 38.874139], + [46.143623, 38.741201], + [46.50572, 38.770605], + [47.685079, 39.508364], + [48.060095, 39.582235], + [48.355529, 39.288765], + [48.010744, 38.794015], + [48.634375, 38.270378], + [48.883249, 38.320245], + [49.199612, 37.582874], + [50.147771, 37.374567], + [50.842354, 36.872814], + [52.264025, 36.700422], + [53.82579, 36.965031], + [53.921598, 37.198918], + [54.800304, 37.392421], + [55.511578, 37.964117], + [56.180375, 37.935127], + [56.619366, 38.121394], + [57.330434, 38.029229], + [58.436154, 37.522309], + [59.234762, 37.412988], + [60.377638, 36.527383], + [61.123071, 36.491597], + [61.210817, 35.650072] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Iraq", + "SOV_A3": "IRQ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Iraq", + "ADM0_A3": "IRQ", + "GEOU_DIF": 0, + "GEOUNIT": "Iraq", + "GU_A3": "IRQ", + "SU_DIF": 0, + "SUBUNIT": "Iraq", + "SU_A3": "IRQ", + "BRK_DIFF": 0, + "NAME": "Iraq", + "NAME_LONG": "Iraq", + "BRK_A3": "IRQ", + "BRK_NAME": "Iraq", + "BRK_GROUP": null, + "ABBREV": "Iraq", + "POSTAL": "IRQ", + "FORMAL_EN": "Republic of Iraq", + "FORMAL_FR": null, + "NAME_CIAWF": "Iraq", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Iraq", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 3, + "MAPCOLOR13": 1, + "POP_EST": 39192111, + "POP_RANK": 15, + "GDP_MD_EST": 596700, + "POP_YEAR": 2017, + "LASTCENSUS": 1997, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "IZ", + "ISO_A2": "IQ", + "ISO_A3": "IRQ", + "ISO_A3_EH": "IRQ", + "ISO_N3": "368", + "UN_A3": "368", + "WB_A2": "IQ", + "WB_A3": "IRQ", + "WOE_ID": 23424855, + "WOE_ID_EH": 23424855, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "IRQ", + "ADM0_A3_US": "IRQ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7.5 + }, + "bbox": [38.792341, 29.099025, 48.567971, 37.385264], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [44.772677, 37.170437], + [45.420618, 35.977546], + [46.07634, 35.677383], + [46.151788, 35.093259], + [45.64846, 34.748138], + [45.416691, 33.967798], + [46.109362, 33.017287], + [47.334661, 32.469155], + [47.849204, 31.709176], + [47.685286, 30.984853], + [48.004698, 30.985137], + [48.014568, 30.452457], + [48.567971, 29.926778], + [47.974519, 29.975819], + [47.302622, 30.05907], + [46.568713, 29.099025], + [44.709499, 29.178891], + [41.889981, 31.190009], + [40.399994, 31.889992], + [39.195468, 32.161009], + [38.792341, 33.378686], + [41.006159, 34.419372], + [41.383965, 35.628317], + [41.289707, 36.358815], + [41.837064, 36.605854], + [42.349591, 37.229873], + [42.779126, 37.385264], + [43.942259, 37.256228], + [44.293452, 37.001514], + [44.772677, 37.170437] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Iceland", + "SOV_A3": "ISL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Iceland", + "ADM0_A3": "ISL", + "GEOU_DIF": 0, + "GEOUNIT": "Iceland", + "GU_A3": "ISL", + "SU_DIF": 0, + "SUBUNIT": "Iceland", + "SU_A3": "ISL", + "BRK_DIFF": 0, + "NAME": "Iceland", + "NAME_LONG": "Iceland", + "BRK_A3": "ISL", + "BRK_NAME": "Iceland", + "BRK_GROUP": null, + "ABBREV": "Iceland", + "POSTAL": "IS", + "FORMAL_EN": "Republic of Iceland", + "FORMAL_FR": null, + "NAME_CIAWF": "Iceland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Iceland", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 9, + "POP_EST": 339747, + "POP_RANK": 10, + "GDP_MD_EST": 16150, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "IC", + "ISO_A2": "IS", + "ISO_A3": "ISL", + "ISO_A3_EH": "ISL", + "ISO_N3": "352", + "UN_A3": "352", + "WB_A2": "IS", + "WB_A3": "ISL", + "WOE_ID": 23424845, + "WOE_ID_EH": 23424845, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ISL", + "ADM0_A3_US": "ISL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [-24.326184, 63.496383, -13.609732, 66.526792], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-14.508695, 66.455892], + [-14.739637, 65.808748], + [-13.609732, 65.126671], + [-14.909834, 64.364082], + [-17.794438, 63.678749], + [-18.656246, 63.496383], + [-19.972755, 63.643635], + [-22.762972, 63.960179], + [-21.778484, 64.402116], + [-23.955044, 64.89113], + [-22.184403, 65.084968], + [-22.227423, 65.378594], + [-24.326184, 65.611189], + [-23.650515, 66.262519], + [-22.134922, 66.410469], + [-20.576284, 65.732112], + [-19.056842, 66.276601], + [-17.798624, 65.993853], + [-16.167819, 66.526792], + [-14.508695, 66.455892] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Israel", + "SOV_A3": "IS1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Israel", + "ADM0_A3": "ISR", + "GEOU_DIF": 0, + "GEOUNIT": "Israel", + "GU_A3": "ISR", + "SU_DIF": 0, + "SUBUNIT": "Israel", + "SU_A3": "ISR", + "BRK_DIFF": 0, + "NAME": "Israel", + "NAME_LONG": "Israel", + "BRK_A3": "ISR", + "BRK_NAME": "Israel", + "BRK_GROUP": null, + "ABBREV": "Isr.", + "POSTAL": "IS", + "FORMAL_EN": "State of Israel", + "FORMAL_FR": null, + "NAME_CIAWF": "Israel", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Israel", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 9, + "POP_EST": 8299706, + "POP_RANK": 13, + "GDP_MD_EST": 297000, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "IL", + "ISO_A3": "ISR", + "ISO_A3_EH": "ISR", + "ISO_N3": "376", + "UN_A3": "376", + "WB_A2": "IL", + "WB_A3": "ISR", + "WOE_ID": 23424852, + "WOE_ID_EH": 23424852, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ISR", + "ADM0_A3_US": "ISR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [34.265433, 29.501326, 35.836397, 33.277426], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.823243, 29.761081], + [34.26544, 31.21936], + [34.265435, 31.219357], + [34.265433, 31.219361], + [34.556372, 31.548824], + [34.488107, 31.605539], + [34.752587, 32.072926], + [34.955417, 32.827376], + [35.098457, 33.080539], + [35.126053, 33.0909], + [35.460709, 33.08904], + [35.552797, 33.264275], + [35.821101, 33.277426], + [35.836397, 32.868123], + [35.700798, 32.716014], + [35.719918, 32.709192], + [35.545665, 32.393992], + [35.18393, 32.532511], + [34.974641, 31.866582], + [35.225892, 31.754341], + [34.970507, 31.616778], + [34.927408, 31.353435], + [35.397561, 31.489086], + [35.420918, 31.100066], + [34.922603, 29.501326], + [34.823243, 29.761081] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Italy", + "SOV_A3": "ITA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Italy", + "ADM0_A3": "ITA", + "GEOU_DIF": 0, + "GEOUNIT": "Italy", + "GU_A3": "ITA", + "SU_DIF": 0, + "SUBUNIT": "Italy", + "SU_A3": "ITA", + "BRK_DIFF": 0, + "NAME": "Italy", + "NAME_LONG": "Italy", + "BRK_A3": "ITA", + "BRK_NAME": "Italy", + "BRK_GROUP": null, + "ABBREV": "Italy", + "POSTAL": "I", + "FORMAL_EN": "Italian Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Italy", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Italy", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 7, + "MAPCOLOR9": 8, + "MAPCOLOR13": 7, + "POP_EST": 62137802, + "POP_RANK": 16, + "GDP_MD_EST": 2221000, + "POP_YEAR": 2017, + "LASTCENSUS": 2012, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "IT", + "ISO_A2": "IT", + "ISO_A3": "ITA", + "ISO_A3_EH": "ITA", + "ISO_N3": "380", + "UN_A3": "380", + "WB_A2": "IT", + "WB_A3": "ITA", + "WOE_ID": 23424853, + "WOE_ID_EH": 23424853, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ITA", + "ADM0_A3_US": "ITA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [6.749955, 36.619987, 18.480247, 47.115393], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10.442701, 46.893546], + [11.048556, 46.751359], + [11.164828, 46.941579], + [12.153088, 47.115393], + [12.376485, 46.767559], + [13.806475, 46.509306], + [13.69811, 46.016778], + [13.93763, 45.591016], + [13.141606, 45.736692], + [12.328581, 45.381778], + [12.383875, 44.885374], + [12.261453, 44.600482], + [12.589237, 44.091366], + [13.526906, 43.587727], + [14.029821, 42.761008], + [15.14257, 41.95514], + [15.926191, 41.961315], + [16.169897, 41.740295], + [15.889346, 41.541082], + [16.785002, 41.179606], + [17.519169, 40.877143], + [18.376687, 40.355625], + [18.480247, 40.168866], + [18.293385, 39.810774], + [17.73838, 40.277671], + [16.869596, 40.442235], + [16.448743, 39.795401], + [17.17149, 39.4247], + [17.052841, 38.902871], + [16.635088, 38.843572], + [16.100961, 37.985899], + [15.684087, 37.908849], + [15.687963, 38.214593], + [15.891981, 38.750942], + [16.109332, 38.964547], + [15.718814, 39.544072], + [15.413613, 40.048357], + [14.998496, 40.172949], + [14.703268, 40.60455], + [14.060672, 40.786348], + [13.627985, 41.188287], + [12.888082, 41.25309], + [12.106683, 41.704535], + [11.191906, 42.355425], + [10.511948, 42.931463], + [10.200029, 43.920007], + [9.702488, 44.036279], + [8.888946, 44.366336], + [8.428561, 44.231228], + [7.850767, 43.767148], + [7.435185, 43.693845], + [7.549596, 44.127901], + [7.007562, 44.254767], + [6.749955, 45.028518], + [7.096652, 45.333099], + [6.802355, 45.70858], + [6.843593, 45.991147], + [7.273851, 45.776948], + [7.755992, 45.82449], + [8.31663, 46.163642], + [8.489952, 46.005151], + [8.966306, 46.036932], + [9.182882, 46.440215], + [9.922837, 46.314899], + [10.363378, 46.483571], + [10.442701, 46.893546] + ] + ], + [ + [ + [15.520376, 38.231155], + [15.160243, 37.444046], + [15.309898, 37.134219], + [15.099988, 36.619987], + [14.335229, 36.996631], + [13.826733, 37.104531], + [12.431004, 37.61295], + [12.570944, 38.126381], + [13.741156, 38.034966], + [14.761249, 38.143874], + [15.520376, 38.231155] + ] + ], + [ + [ + [9.210012, 41.209991], + [9.809975, 40.500009], + [9.669519, 39.177376], + [9.214818, 39.240473], + [8.806936, 38.906618], + [8.428302, 39.171847], + [8.388253, 40.378311], + [8.159998, 40.950007], + [8.709991, 40.899984], + [9.210012, 41.209991] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Jamaica", + "SOV_A3": "JAM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Jamaica", + "ADM0_A3": "JAM", + "GEOU_DIF": 0, + "GEOUNIT": "Jamaica", + "GU_A3": "JAM", + "SU_DIF": 0, + "SUBUNIT": "Jamaica", + "SU_A3": "JAM", + "BRK_DIFF": 0, + "NAME": "Jamaica", + "NAME_LONG": "Jamaica", + "BRK_A3": "JAM", + "BRK_NAME": "Jamaica", + "BRK_GROUP": null, + "ABBREV": "Jam.", + "POSTAL": "J", + "FORMAL_EN": "Jamaica", + "FORMAL_FR": null, + "NAME_CIAWF": "Jamaica", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Jamaica", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 4, + "MAPCOLOR13": 10, + "POP_EST": 2990561, + "POP_RANK": 12, + "GDP_MD_EST": 25390, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "JM", + "ISO_A2": "JM", + "ISO_A3": "JAM", + "ISO_A3_EH": "JAM", + "ISO_N3": "388", + "UN_A3": "388", + "WB_A2": "JM", + "WB_A3": "JAM", + "WOE_ID": 23424858, + "WOE_ID_EH": 23424858, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "JAM", + "ADM0_A3_US": "JAM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-78.337719, 17.701116, -76.199659, 18.524218], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-77.569601, 18.490525], + [-76.896619, 18.400867], + [-76.365359, 18.160701], + [-76.199659, 17.886867], + [-76.902561, 17.868238], + [-77.206341, 17.701116], + [-77.766023, 17.861597], + [-78.337719, 18.225968], + [-78.217727, 18.454533], + [-77.797365, 18.524218], + [-77.569601, 18.490525] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Jordan", + "SOV_A3": "JOR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Jordan", + "ADM0_A3": "JOR", + "GEOU_DIF": 0, + "GEOUNIT": "Jordan", + "GU_A3": "JOR", + "SU_DIF": 0, + "SUBUNIT": "Jordan", + "SU_A3": "JOR", + "BRK_DIFF": 0, + "NAME": "Jordan", + "NAME_LONG": "Jordan", + "BRK_A3": "JOR", + "BRK_NAME": "Jordan", + "BRK_GROUP": null, + "ABBREV": "Jord.", + "POSTAL": "J", + "FORMAL_EN": "Hashemite Kingdom of Jordan", + "FORMAL_FR": null, + "NAME_CIAWF": "Jordan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Jordan", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 4, + "POP_EST": 10248069, + "POP_RANK": 14, + "GDP_MD_EST": 86190, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "JO", + "ISO_A2": "JO", + "ISO_A3": "JOR", + "ISO_A3_EH": "JOR", + "ISO_N3": "400", + "UN_A3": "400", + "WB_A2": "JO", + "WB_A3": "JOR", + "WOE_ID": 23424860, + "WOE_ID_EH": 23424860, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "JOR", + "ADM0_A3_US": "JOR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [34.922603, 29.197495, 39.195468, 33.378686], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [38.792341, 33.378686], + [39.195468, 32.161009], + [39.004886, 32.010217], + [37.002166, 31.508413], + [37.998849, 30.5085], + [37.66812, 30.338665], + [37.503582, 30.003776], + [36.740528, 29.865283], + [36.501214, 29.505254], + [36.068941, 29.197495], + [34.956037, 29.356555], + [34.922603, 29.501326], + [35.420918, 31.100066], + [35.397561, 31.489086], + [35.545252, 31.782505], + [35.545665, 32.393992], + [35.719918, 32.709192], + [36.834062, 32.312938], + [38.792341, 33.378686] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Japan", + "SOV_A3": "JPN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Japan", + "ADM0_A3": "JPN", + "GEOU_DIF": 0, + "GEOUNIT": "Japan", + "GU_A3": "JPN", + "SU_DIF": 0, + "SUBUNIT": "Japan", + "SU_A3": "JPN", + "BRK_DIFF": 0, + "NAME": "Japan", + "NAME_LONG": "Japan", + "BRK_A3": "JPN", + "BRK_NAME": "Japan", + "BRK_GROUP": null, + "ABBREV": "Japan", + "POSTAL": "J", + "FORMAL_EN": "Japan", + "FORMAL_FR": null, + "NAME_CIAWF": "Japan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Japan", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 5, + "MAPCOLOR13": 4, + "POP_EST": 126451398, + "POP_RANK": 17, + "GDP_MD_EST": 4932000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "JA", + "ISO_A2": "JP", + "ISO_A3": "JPN", + "ISO_A3_EH": "JPN", + "ISO_N3": "392", + "UN_A3": "392", + "WB_A2": "JP", + "WB_A3": "JPN", + "WOE_ID": 23424856, + "WOE_ID_EH": 23424856, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "JPN", + "ADM0_A3_US": "JPN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 7 + }, + "bbox": [129.408463, 31.029579, 145.543137, 45.551483], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [134.638428, 34.149234], + [134.766379, 33.806335], + [134.203416, 33.201178], + [133.79295, 33.521985], + [133.280268, 33.28957], + [133.014858, 32.704567], + [132.363115, 32.989382], + [132.371176, 33.463642], + [132.924373, 34.060299], + [133.492968, 33.944621], + [133.904106, 34.364931], + [134.638428, 34.149234] + ] + ], + [ + [ + [140.976388, 37.142074], + [140.59977, 36.343983], + [140.774074, 35.842877], + [140.253279, 35.138114], + [138.975528, 34.6676], + [137.217599, 34.606286], + [135.792983, 33.464805], + [135.120983, 33.849071], + [135.079435, 34.596545], + [133.340316, 34.375938], + [132.156771, 33.904933], + [130.986145, 33.885761], + [132.000036, 33.149992], + [131.33279, 31.450355], + [130.686318, 31.029579], + [130.20242, 31.418238], + [130.447676, 32.319475], + [129.814692, 32.61031], + [129.408463, 33.296056], + [130.353935, 33.604151], + [130.878451, 34.232743], + [131.884229, 34.749714], + [132.617673, 35.433393], + [134.608301, 35.731618], + [135.677538, 35.527134], + [136.723831, 37.304984], + [137.390612, 36.827391], + [138.857602, 37.827485], + [139.426405, 38.215962], + [140.05479, 39.438807], + [139.883379, 40.563312], + [140.305783, 41.195005], + [141.368973, 41.37856], + [141.914263, 39.991616], + [141.884601, 39.180865], + [140.959489, 38.174001], + [140.976388, 37.142074] + ] + ], + [ + [ + [143.910162, 44.1741], + [144.613427, 43.960883], + [145.320825, 44.384733], + [145.543137, 43.262088], + [144.059662, 42.988358], + [143.18385, 41.995215], + [141.611491, 42.678791], + [141.067286, 41.584594], + [139.955106, 41.569556], + [139.817544, 42.563759], + [140.312087, 43.333273], + [141.380549, 43.388825], + [141.671952, 44.772125], + [141.967645, 45.551483], + [143.14287, 44.510358], + [143.910162, 44.1741] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Kazakhstan", + "SOV_A3": "KAZ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Kazakhstan", + "ADM0_A3": "KAZ", + "GEOU_DIF": 0, + "GEOUNIT": "Kazakhstan", + "GU_A3": "KAZ", + "SU_DIF": 0, + "SUBUNIT": "Kazakhstan", + "SU_A3": "KAZ", + "BRK_DIFF": 0, + "NAME": "Kazakhstan", + "NAME_LONG": "Kazakhstan", + "BRK_A3": "KAZ", + "BRK_NAME": "Kazakhstan", + "BRK_GROUP": null, + "ABBREV": "Kaz.", + "POSTAL": "KZ", + "FORMAL_EN": "Republic of Kazakhstan", + "FORMAL_FR": null, + "NAME_CIAWF": "Kazakhstan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Kazakhstan", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 1, + "MAPCOLOR9": 6, + "MAPCOLOR13": 1, + "POP_EST": 18556698, + "POP_RANK": 14, + "GDP_MD_EST": 460700, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "KZ", + "ISO_A2": "KZ", + "ISO_A3": "KAZ", + "ISO_A3_EH": "KAZ", + "ISO_N3": "398", + "UN_A3": "398", + "WB_A2": "KZ", + "WB_A3": "KAZ", + "WOE_ID": -90, + "WOE_ID_EH": 23424871, + "WOE_NOTE": "Includes Baykonur Cosmodrome as an admin-1", + "ADM0_A3_IS": "KAZ", + "ADM0_A3_US": "KAZ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Central Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [46.466446, 40.662325, 87.35997, 55.38525], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [87.35997, 49.214981], + [86.598776, 48.549182], + [85.768233, 48.455751], + [85.720484, 47.452969], + [85.16429, 47.000956], + [83.180484, 47.330031], + [82.458926, 45.53965], + [81.947071, 45.317027], + [79.966106, 44.917517], + [80.866206, 43.180362], + [80.18015, 42.920068], + [80.25999, 42.349999], + [79.643645, 42.496683], + [79.142177, 42.856092], + [77.658392, 42.960686], + [76.000354, 42.988022], + [75.636965, 42.8779], + [74.212866, 43.298339], + [73.645304, 43.091272], + [73.489758, 42.500894], + [71.844638, 42.845395], + [71.186281, 42.704293], + [70.962315, 42.266154], + [70.388965, 42.081308], + [69.070027, 41.384244], + [68.632483, 40.668681], + [68.259896, 40.662325], + [67.985856, 41.135991], + [66.714047, 41.168444], + [66.510649, 41.987644], + [66.023392, 41.994646], + [66.098012, 42.99766], + [64.900824, 43.728081], + [63.185787, 43.650075], + [62.0133, 43.504477], + [61.05832, 44.405817], + [60.239972, 44.784037], + [58.689989, 45.500014], + [58.503127, 45.586804], + [55.928917, 44.995858], + [55.968191, 41.308642], + [55.455251, 41.259859], + [54.755345, 42.043971], + [54.079418, 42.324109], + [52.944293, 42.116034], + [52.50246, 41.783316], + [52.446339, 42.027151], + [52.692112, 42.443895], + [52.501426, 42.792298], + [51.342427, 43.132975], + [50.891292, 44.031034], + [50.339129, 44.284016], + [50.305643, 44.609836], + [51.278503, 44.514854], + [51.316899, 45.245998], + [52.16739, 45.408391], + [53.040876, 45.259047], + [53.220866, 46.234646], + [53.042737, 46.853006], + [52.042023, 46.804637], + [51.191945, 47.048705], + [50.034083, 46.60899], + [49.10116, 46.39933], + [48.59325, 46.56104], + [48.694734, 47.075628], + [48.05725, 47.74377], + [47.31524, 47.71585], + [46.466446, 48.394152], + [47.043672, 49.152039], + [46.751596, 49.356006], + [47.54948, 50.454698], + [48.577841, 49.87476], + [48.702382, 50.605128], + [50.766648, 51.692762], + [52.328724, 51.718652], + [54.532878, 51.02624], + [55.71694, 50.62171], + [56.77798, 51.04355], + [58.36332, 51.06364], + [59.642282, 50.545442], + [59.932807, 50.842194], + [61.337424, 50.79907], + [61.588003, 51.272659], + [59.967534, 51.96042], + [60.927269, 52.447548], + [60.739993, 52.719986], + [61.699986, 52.979996], + [60.978066, 53.664993], + [61.4366, 54.00625], + [65.178534, 54.354228], + [65.66687, 54.60125], + [68.1691, 54.970392], + [69.068167, 55.38525], + [70.865267, 55.169734], + [71.180131, 54.133285], + [72.22415, 54.376655], + [73.508516, 54.035617], + [73.425679, 53.48981], + [74.38482, 53.54685], + [76.8911, 54.490524], + [76.525179, 54.177003], + [77.800916, 53.404415], + [80.03556, 50.864751], + [80.568447, 51.388336], + [81.945986, 50.812196], + [83.383004, 51.069183], + [83.935115, 50.889246], + [84.416377, 50.3114], + [85.11556, 50.117303], + [85.54127, 49.692859], + [86.829357, 49.826675], + [87.35997, 49.214981] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Kenya", + "SOV_A3": "KEN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Kenya", + "ADM0_A3": "KEN", + "GEOU_DIF": 0, + "GEOUNIT": "Kenya", + "GU_A3": "KEN", + "SU_DIF": 0, + "SUBUNIT": "Kenya", + "SU_A3": "KEN", + "BRK_DIFF": 0, + "NAME": "Kenya", + "NAME_LONG": "Kenya", + "BRK_A3": "KEN", + "BRK_NAME": "Kenya", + "BRK_GROUP": null, + "ABBREV": "Ken.", + "POSTAL": "KE", + "FORMAL_EN": "Republic of Kenya", + "FORMAL_FR": null, + "NAME_CIAWF": "Kenya", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Kenya", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 2, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 47615739, + "POP_RANK": 15, + "GDP_MD_EST": 152700, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "KE", + "ISO_A2": "KE", + "ISO_A3": "KEN", + "ISO_A3_EH": "KEN", + "ISO_N3": "404", + "UN_A3": "404", + "WB_A2": "KE", + "WB_A3": "KEN", + "WOE_ID": 23424863, + "WOE_ID_EH": 23424863, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "KEN", + "ADM0_A3_US": "KEN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [33.893569, -4.67677, 41.855083, 5.506], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.298007, 5.506], + [35.817448, 5.338232], + [35.817448, 4.776966], + [36.159079, 4.447864], + [36.855093, 4.447864], + [38.120915, 3.598605], + [38.43697, 3.58851], + [38.67114, 3.61607], + [38.89251, 3.50074], + [39.559384, 3.42206], + [39.85494, 3.83879], + [40.76848, 4.25702], + [41.1718, 3.91909], + [41.855083, 3.918912], + [40.98105, 2.78452], + [40.993, -0.85829], + [41.58513, -1.68325], + [40.88477, -2.08255], + [40.63785, -2.49979], + [40.26304, -2.57309], + [40.12119, -3.27768], + [39.80006, -3.68116], + [39.60489, -4.34653], + [39.20222, -4.67677], + [37.7669, -3.67712], + [37.69869, -3.09699], + [34.07262, -1.05982], + [33.903711, -0.95], + [33.893569, 0.109814], + [34.18, 0.515], + [34.6721, 1.17694], + [35.03599, 1.90584], + [34.59607, 3.05374], + [34.47913, 3.5556], + [34.005, 4.249885], + [34.620196, 4.847123], + [35.298007, 5.506] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Kyrgyzstan", + "SOV_A3": "KGZ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Kyrgyzstan", + "ADM0_A3": "KGZ", + "GEOU_DIF": 0, + "GEOUNIT": "Kyrgyzstan", + "GU_A3": "KGZ", + "SU_DIF": 0, + "SUBUNIT": "Kyrgyzstan", + "SU_A3": "KGZ", + "BRK_DIFF": 0, + "NAME": "Kyrgyzstan", + "NAME_LONG": "Kyrgyzstan", + "BRK_A3": "KGZ", + "BRK_NAME": "Kyrgyzstan", + "BRK_GROUP": null, + "ABBREV": "Kgz.", + "POSTAL": "KG", + "FORMAL_EN": "Kyrgyz Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Kyrgyzstan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Kyrgyz Republic", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 7, + "MAPCOLOR9": 7, + "MAPCOLOR13": 6, + "POP_EST": 5789122, + "POP_RANK": 13, + "GDP_MD_EST": 21010, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "KG", + "ISO_A2": "KG", + "ISO_A3": "KGZ", + "ISO_A3_EH": "KGZ", + "ISO_N3": "417", + "UN_A3": "417", + "WB_A2": "KG", + "WB_A3": "KGZ", + "WOE_ID": 23424864, + "WOE_ID_EH": 23424864, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "KGZ", + "ADM0_A3_US": "KGZ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Central Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [69.464887, 39.279463, 80.25999, 43.298339], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [80.25999, 42.349999], + [80.11943, 42.123941], + [78.543661, 41.582243], + [78.187197, 41.185316], + [76.904484, 41.066486], + [76.526368, 40.427946], + [75.467828, 40.562072], + [74.776862, 40.366425], + [73.822244, 39.893973], + [73.960013, 39.660008], + [73.675379, 39.431237], + [71.784694, 39.279463], + [70.549162, 39.604198], + [69.464887, 39.526683], + [69.55961, 40.103211], + [70.648019, 39.935754], + [71.014198, 40.244366], + [71.774875, 40.145844], + [73.055417, 40.866033], + [71.870115, 41.3929], + [71.157859, 41.143587], + [70.420022, 41.519998], + [71.259248, 42.167711], + [70.962315, 42.266154], + [71.186281, 42.704293], + [71.844638, 42.845395], + [73.489758, 42.500894], + [73.645304, 43.091272], + [74.212866, 43.298339], + [75.636965, 42.8779], + [76.000354, 42.988022], + [77.658392, 42.960686], + [79.142177, 42.856092], + [79.643645, 42.496683], + [80.25999, 42.349999] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Cambodia", + "SOV_A3": "KHM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Cambodia", + "ADM0_A3": "KHM", + "GEOU_DIF": 0, + "GEOUNIT": "Cambodia", + "GU_A3": "KHM", + "SU_DIF": 0, + "SUBUNIT": "Cambodia", + "SU_A3": "KHM", + "BRK_DIFF": 0, + "NAME": "Cambodia", + "NAME_LONG": "Cambodia", + "BRK_A3": "KHM", + "BRK_NAME": "Cambodia", + "BRK_GROUP": null, + "ABBREV": "Camb.", + "POSTAL": "KH", + "FORMAL_EN": "Kingdom of Cambodia", + "FORMAL_FR": null, + "NAME_CIAWF": "Cambodia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Cambodia", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 6, + "MAPCOLOR13": 5, + "POP_EST": 16204486, + "POP_RANK": 14, + "GDP_MD_EST": 58940, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "CB", + "ISO_A2": "KH", + "ISO_A3": "KHM", + "ISO_A3_EH": "KHM", + "ISO_N3": "116", + "UN_A3": "116", + "WB_A2": "KH", + "WB_A3": "KHM", + "WOE_ID": 23424776, + "WOE_ID_EH": 23424776, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "KHM", + "ADM0_A3_US": "KHM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [102.348099, 10.486544, 107.614548, 14.570584], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [102.584932, 12.186595], + [102.348099, 13.394247], + [102.988422, 14.225721], + [104.281418, 14.416743], + [105.218777, 14.273212], + [106.043946, 13.881091], + [106.496373, 14.570584], + [107.382727, 14.202441], + [107.614548, 13.535531], + [107.491403, 12.337206], + [105.810524, 11.567615], + [106.24967, 10.961812], + [105.199915, 10.88931], + [104.334335, 10.486544], + [103.49728, 10.632555], + [103.09069, 11.153661], + [102.584932, 12.186595] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "South Korea", + "SOV_A3": "KOR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "South Korea", + "ADM0_A3": "KOR", + "GEOU_DIF": 0, + "GEOUNIT": "South Korea", + "GU_A3": "KOR", + "SU_DIF": 0, + "SUBUNIT": "South Korea", + "SU_A3": "KOR", + "BRK_DIFF": 0, + "NAME": "South Korea", + "NAME_LONG": "Republic of Korea", + "BRK_A3": "KOR", + "BRK_NAME": "Republic of Korea", + "BRK_GROUP": null, + "ABBREV": "S.K.", + "POSTAL": "KR", + "FORMAL_EN": "Republic of Korea", + "FORMAL_FR": null, + "NAME_CIAWF": "Korea, South", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Korea, Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 1, + "MAPCOLOR13": 5, + "POP_EST": 51181299, + "POP_RANK": 16, + "GDP_MD_EST": 1929000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "4. Emerging region: MIKT", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "KS", + "ISO_A2": "KR", + "ISO_A3": "KOR", + "ISO_A3_EH": "KOR", + "ISO_N3": "410", + "UN_A3": "410", + "WB_A2": "KR", + "WB_A3": "KOR", + "WOE_ID": 23424868, + "WOE_ID_EH": 23424868, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "KOR", + "ADM0_A3_US": "KOR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 17, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [126.117398, 34.390046, 129.468304, 38.612243], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [128.349716, 38.612243], + [129.21292, 37.432392], + [129.46045, 36.784189], + [129.468304, 35.632141], + [129.091377, 35.082484], + [128.18585, 34.890377], + [127.386519, 34.475674], + [126.485748, 34.390046], + [126.37392, 34.93456], + [126.559231, 35.684541], + [126.117398, 36.725485], + [126.860143, 36.893924], + [126.174759, 37.749686], + [126.237339, 37.840378], + [126.68372, 37.804773], + [127.073309, 38.256115], + [127.780035, 38.304536], + [128.205746, 38.370397], + [128.349716, 38.612243] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Kosovo", + "SOV_A3": "KOS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Kosovo", + "ADM0_A3": "KOS", + "GEOU_DIF": 0, + "GEOUNIT": "Kosovo", + "GU_A3": "KOS", + "SU_DIF": 0, + "SUBUNIT": "Kosovo", + "SU_A3": "KOS", + "BRK_DIFF": 0, + "NAME": "Kosovo", + "NAME_LONG": "Kosovo", + "BRK_A3": "KOS", + "BRK_NAME": "Kosovo", + "BRK_GROUP": null, + "ABBREV": "Kos.", + "POSTAL": "KO", + "FORMAL_EN": "Republic of Kosovo", + "FORMAL_FR": null, + "NAME_CIAWF": "Kosovo", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Kosovo", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 11, + "POP_EST": 1895250, + "POP_RANK": 12, + "GDP_MD_EST": 18490, + "POP_YEAR": 2017, + "LASTCENSUS": 1981, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "KV", + "ISO_A2": "XK", + "ISO_A3": "-99", + "ISO_A3_EH": "-99", + "ISO_N3": "-99", + "UN_A3": "-099", + "WB_A2": "KV", + "WB_A3": "KSV", + "WOE_ID": -90, + "WOE_ID_EH": 29389201, + "WOE_NOTE": "Subunit of Serbia in WOE still; should include 29389201, 29389207, 29389218, 29389209 and 29389214.", + "ADM0_A3_IS": "KOS", + "ADM0_A3_US": "KOS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [20.0707, 41.84711, 21.77505, 43.27205], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.590247, 41.855409], + [20.52295, 42.21787], + [20.283755, 42.32026], + [20.0707, 42.58863], + [20.25758, 42.81275], + [20.49679, 42.88469], + [20.63508, 43.21671], + [20.81448, 43.27205], + [20.95651, 43.13094], + [21.143395, 43.068685], + [21.27421, 42.90959], + [21.43866, 42.86255], + [21.63302, 42.67717], + [21.77505, 42.6827], + [21.66292, 42.43922], + [21.54332, 42.32025], + [21.576636, 42.245224], + [21.3527, 42.2068], + [20.76216, 42.05186], + [20.71731, 41.84711], + [20.590247, 41.855409] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Kuwait", + "SOV_A3": "KWT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Kuwait", + "ADM0_A3": "KWT", + "GEOU_DIF": 0, + "GEOUNIT": "Kuwait", + "GU_A3": "KWT", + "SU_DIF": 0, + "SUBUNIT": "Kuwait", + "SU_A3": "KWT", + "BRK_DIFF": 0, + "NAME": "Kuwait", + "NAME_LONG": "Kuwait", + "BRK_A3": "KWT", + "BRK_NAME": "Kuwait", + "BRK_GROUP": null, + "ABBREV": "Kwt.", + "POSTAL": "KW", + "FORMAL_EN": "State of Kuwait", + "FORMAL_FR": null, + "NAME_CIAWF": "Kuwait", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Kuwait", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 2875422, + "POP_RANK": 12, + "GDP_MD_EST": 301100, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "KU", + "ISO_A2": "KW", + "ISO_A3": "KWT", + "ISO_A3_EH": "KWT", + "ISO_N3": "414", + "UN_A3": "414", + "WB_A2": "KW", + "WB_A3": "KWT", + "WOE_ID": 23424870, + "WOE_ID_EH": 23424870, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "KWT", + "ADM0_A3_US": "KWT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [46.568713, 28.526063, 48.416094, 30.05907], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [46.568713, 29.099025], + [47.302622, 30.05907], + [47.974519, 29.975819], + [48.183189, 29.534477], + [48.093943, 29.306299], + [48.416094, 28.552004], + [47.708851, 28.526063], + [47.459822, 29.002519], + [46.568713, 29.099025] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Laos", + "SOV_A3": "LAO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Laos", + "ADM0_A3": "LAO", + "GEOU_DIF": 0, + "GEOUNIT": "Laos", + "GU_A3": "LAO", + "SU_DIF": 0, + "SUBUNIT": "Laos", + "SU_A3": "LAO", + "BRK_DIFF": 0, + "NAME": "Laos", + "NAME_LONG": "Lao PDR", + "BRK_A3": "LAO", + "BRK_NAME": "Laos", + "BRK_GROUP": null, + "ABBREV": "Laos", + "POSTAL": "LA", + "FORMAL_EN": "Lao People's Democratic Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Laos", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Lao PDR", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 1, + "MAPCOLOR9": 1, + "MAPCOLOR13": 9, + "POP_EST": 7126706, + "POP_RANK": 13, + "GDP_MD_EST": 40960, + "POP_YEAR": 2017, + "LASTCENSUS": 2005, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LA", + "ISO_A2": "LA", + "ISO_A3": "LAO", + "ISO_A3_EH": "LAO", + "ISO_N3": "418", + "UN_A3": "418", + "WB_A2": "LA", + "WB_A3": "LAO", + "WOE_ID": 23424872, + "WOE_ID_EH": 23424872, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LAO", + "ADM0_A3_US": "LAO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 4, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [100.115988, 13.881091, 107.564525, 22.464753], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [101.180005, 21.436573], + [101.270026, 21.201652], + [101.80312, 21.174367], + [101.652018, 22.318199], + [102.170436, 22.464753], + [102.754896, 21.675137], + [103.203861, 20.766562], + [104.435, 20.758733], + [104.822574, 19.886642], + [104.183388, 19.624668], + [103.896532, 19.265181], + [105.094598, 18.666975], + [105.925762, 17.485315], + [106.556008, 16.604284], + [107.312706, 15.908538], + [107.564525, 15.202173], + [107.382727, 14.202441], + [106.496373, 14.570584], + [106.043946, 13.881091], + [105.218777, 14.273212], + [105.544338, 14.723934], + [105.589039, 15.570316], + [104.779321, 16.441865], + [104.716947, 17.428859], + [103.956477, 18.240954], + [103.200192, 18.309632], + [102.998706, 17.961695], + [102.413005, 17.932782], + [102.113592, 18.109102], + [101.059548, 17.512497], + [101.035931, 18.408928], + [101.282015, 19.462585], + [100.606294, 19.508344], + [100.548881, 20.109238], + [100.115988, 20.41785], + [100.329101, 20.786122], + [101.180005, 21.436573] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Lebanon", + "SOV_A3": "LBN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Lebanon", + "ADM0_A3": "LBN", + "GEOU_DIF": 0, + "GEOUNIT": "Lebanon", + "GU_A3": "LBN", + "SU_DIF": 0, + "SUBUNIT": "Lebanon", + "SU_A3": "LBN", + "BRK_DIFF": 0, + "NAME": "Lebanon", + "NAME_LONG": "Lebanon", + "BRK_A3": "LBN", + "BRK_NAME": "Lebanon", + "BRK_GROUP": null, + "ABBREV": "Leb.", + "POSTAL": "LB", + "FORMAL_EN": "Lebanese Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Lebanon", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Lebanon", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 12, + "POP_EST": 6229794, + "POP_RANK": 13, + "GDP_MD_EST": 85160, + "POP_YEAR": 2017, + "LASTCENSUS": 1970, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LE", + "ISO_A2": "LB", + "ISO_A3": "LBN", + "ISO_A3_EH": "LBN", + "ISO_N3": "422", + "UN_A3": "422", + "WB_A2": "LB", + "WB_A3": "LBN", + "WOE_ID": 23424873, + "WOE_ID_EH": 23424873, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LBN", + "ADM0_A3_US": "LBN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": 4, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [35.126053, 33.08904, 36.61175, 34.644914], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.821101, 33.277426], + [35.552797, 33.264275], + [35.460709, 33.08904], + [35.126053, 33.0909], + [35.482207, 33.90545], + [35.979592, 34.610058], + [35.998403, 34.644914], + [36.448194, 34.593935], + [36.61175, 34.201789], + [36.06646, 33.824912], + [35.821101, 33.277426] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Liberia", + "SOV_A3": "LBR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Liberia", + "ADM0_A3": "LBR", + "GEOU_DIF": 0, + "GEOUNIT": "Liberia", + "GU_A3": "LBR", + "SU_DIF": 0, + "SUBUNIT": "Liberia", + "SU_A3": "LBR", + "BRK_DIFF": 0, + "NAME": "Liberia", + "NAME_LONG": "Liberia", + "BRK_A3": "LBR", + "BRK_NAME": "Liberia", + "BRK_GROUP": null, + "ABBREV": "Liberia", + "POSTAL": "LR", + "FORMAL_EN": "Republic of Liberia", + "FORMAL_FR": null, + "NAME_CIAWF": "Liberia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Liberia", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 9, + "POP_EST": 4689021, + "POP_RANK": 12, + "GDP_MD_EST": 3881, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "LI", + "ISO_A2": "LR", + "ISO_A3": "LBR", + "ISO_A3_EH": "LBR", + "ISO_N3": "430", + "UN_A3": "430", + "WB_A2": "LR", + "WB_A3": "LBR", + "WOE_ID": 23424876, + "WOE_ID_EH": 23424876, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LBR", + "ADM0_A3_US": "LBR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-11.438779, 4.355755, -7.539715, 8.541055], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.439298, 7.686043], + [-8.485446, 7.395208], + [-8.385452, 6.911801], + [-8.60288, 6.467564], + [-8.311348, 6.193033], + [-7.993693, 6.12619], + [-7.570153, 5.707352], + [-7.539715, 5.313345], + [-7.635368, 5.188159], + [-7.712159, 4.364566], + [-7.974107, 4.355755], + [-9.004794, 4.832419], + [-9.91342, 5.593561], + [-10.765384, 6.140711], + [-11.438779, 6.785917], + [-11.199802, 7.105846], + [-11.146704, 7.396706], + [-10.695595, 7.939464], + [-10.230094, 8.406206], + [-10.016567, 8.428504], + [-9.755342, 8.541055], + [-9.33728, 7.928534], + [-9.403348, 7.526905], + [-9.208786, 7.313921], + [-8.926065, 7.309037], + [-8.722124, 7.711674], + [-8.439298, 7.686043] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Libya", + "SOV_A3": "LBY", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Libya", + "ADM0_A3": "LBY", + "GEOU_DIF": 0, + "GEOUNIT": "Libya", + "GU_A3": "LBY", + "SU_DIF": 0, + "SUBUNIT": "Libya", + "SU_A3": "LBY", + "BRK_DIFF": 0, + "NAME": "Libya", + "NAME_LONG": "Libya", + "BRK_A3": "LBY", + "BRK_NAME": "Libya", + "BRK_GROUP": null, + "ABBREV": "Libya", + "POSTAL": "LY", + "FORMAL_EN": "Libya", + "FORMAL_FR": null, + "NAME_CIAWF": "Libya", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Libya", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 11, + "POP_EST": 6653210, + "POP_RANK": 13, + "GDP_MD_EST": 90890, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LY", + "ISO_A2": "LY", + "ISO_A3": "LBY", + "ISO_A3_EH": "LBY", + "ISO_N3": "434", + "UN_A3": "434", + "WB_A2": "LY", + "WB_A3": "LBY", + "WOE_ID": 23424882, + "WOE_ID_EH": 23424882, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LBY", + "ADM0_A3_US": "LBY", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [9.319411, 19.58047, 25.16482, 33.136996], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [11.999506, 23.471668], + [11.560669, 24.097909], + [10.771364, 24.562532], + [10.303847, 24.379313], + [9.948261, 24.936954], + [9.910693, 25.365455], + [9.319411, 26.094325], + [9.716286, 26.512206], + [9.629056, 27.140953], + [9.756128, 27.688259], + [9.683885, 28.144174], + [9.859998, 28.95999], + [9.805634, 29.424638], + [9.48214, 30.307556], + [9.970017, 30.539325], + [10.056575, 30.961831], + [9.950225, 31.37607], + [10.636901, 31.761421], + [10.94479, 32.081815], + [11.432253, 32.368903], + [11.488787, 33.136996], + [12.66331, 32.79278], + [13.08326, 32.87882], + [13.91868, 32.71196], + [15.24563, 32.26508], + [15.71394, 31.37626], + [16.61162, 31.18218], + [18.02109, 30.76357], + [19.08641, 30.26639], + [19.57404, 30.52582], + [20.05335, 30.98576], + [19.82033, 31.75179], + [20.13397, 32.2382], + [20.85452, 32.7068], + [21.54298, 32.8432], + [22.89576, 32.63858], + [23.2368, 32.19149], + [23.60913, 32.18726], + [23.9275, 32.01667], + [24.92114, 31.89936], + [25.16482, 31.56915], + [24.80287, 31.08929], + [24.95762, 30.6616], + [24.70007, 30.04419], + [25, 29.238655], + [25, 25.6825], + [25, 22], + [25, 20.00304], + [23.85, 20], + [23.83766, 19.58047], + [19.84926, 21.49509], + [15.86085, 23.40972], + [14.8513, 22.86295], + [14.143871, 22.491289], + [13.581425, 23.040506], + [11.999506, 23.471668] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Sri Lanka", + "SOV_A3": "LKA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Sri Lanka", + "ADM0_A3": "LKA", + "GEOU_DIF": 0, + "GEOUNIT": "Sri Lanka", + "GU_A3": "LKA", + "SU_DIF": 0, + "SUBUNIT": "Sri Lanka", + "SU_A3": "LKA", + "BRK_DIFF": 0, + "NAME": "Sri Lanka", + "NAME_LONG": "Sri Lanka", + "BRK_A3": "LKA", + "BRK_NAME": "Sri Lanka", + "BRK_GROUP": null, + "ABBREV": "Sri L.", + "POSTAL": "LK", + "FORMAL_EN": "Democratic Socialist Republic of Sri Lanka", + "FORMAL_FR": null, + "NAME_CIAWF": "Sri Lanka", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Sri Lanka", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 4, + "MAPCOLOR13": 9, + "POP_EST": 22409381, + "POP_RANK": 15, + "GDP_MD_EST": 236700, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "CE", + "ISO_A2": "LK", + "ISO_A3": "LKA", + "ISO_A3_EH": "LKA", + "ISO_N3": "144", + "UN_A3": "144", + "WB_A2": "LK", + "WB_A3": "LKA", + "WOE_ID": 23424778, + "WOE_ID_EH": 23424778, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LKA", + "ADM0_A3_US": "LKA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [79.695167, 5.96837, 81.787959, 9.824078], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [81.787959, 7.523055], + [81.637322, 6.481775], + [81.21802, 6.197141], + [80.348357, 5.96837], + [79.872469, 6.763463], + [79.695167, 8.200843], + [80.147801, 9.824078], + [80.838818, 9.268427], + [81.304319, 8.564206], + [81.787959, 7.523055] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Lesotho", + "SOV_A3": "LSO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Lesotho", + "ADM0_A3": "LSO", + "GEOU_DIF": 0, + "GEOUNIT": "Lesotho", + "GU_A3": "LSO", + "SU_DIF": 0, + "SUBUNIT": "Lesotho", + "SU_A3": "LSO", + "BRK_DIFF": 0, + "NAME": "Lesotho", + "NAME_LONG": "Lesotho", + "BRK_A3": "LSO", + "BRK_NAME": "Lesotho", + "BRK_GROUP": null, + "ABBREV": "Les.", + "POSTAL": "LS", + "FORMAL_EN": "Kingdom of Lesotho", + "FORMAL_FR": null, + "NAME_CIAWF": "Lesotho", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Lesotho", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 5, + "MAPCOLOR9": 2, + "MAPCOLOR13": 8, + "POP_EST": 1958042, + "POP_RANK": 12, + "GDP_MD_EST": 6019, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LT", + "ISO_A2": "LS", + "ISO_A3": "LSO", + "ISO_A3_EH": "LSO", + "ISO_N3": "426", + "UN_A3": "426", + "WB_A2": "LS", + "WB_A3": "LSO", + "WOE_ID": 23424880, + "WOE_ID_EH": 23424880, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LSO", + "ADM0_A3_US": "LSO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Southern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [26.999262, -30.645106, 29.325166, -28.647502], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.978263, -28.955597], + [29.325166, -29.257387], + [29.018415, -29.743766], + [28.8484, -30.070051], + [28.291069, -30.226217], + [28.107205, -30.545732], + [27.749397, -30.645106], + [26.999262, -29.875954], + [27.532511, -29.242711], + [28.074338, -28.851469], + [28.5417, -28.647502], + [28.978263, -28.955597] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Lithuania", + "SOV_A3": "LTU", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Lithuania", + "ADM0_A3": "LTU", + "GEOU_DIF": 0, + "GEOUNIT": "Lithuania", + "GU_A3": "LTU", + "SU_DIF": 0, + "SUBUNIT": "Lithuania", + "SU_A3": "LTU", + "BRK_DIFF": 0, + "NAME": "Lithuania", + "NAME_LONG": "Lithuania", + "BRK_A3": "LTU", + "BRK_NAME": "Lithuania", + "BRK_GROUP": null, + "ABBREV": "Lith.", + "POSTAL": "LT", + "FORMAL_EN": "Republic of Lithuania", + "FORMAL_FR": null, + "NAME_CIAWF": "Lithuania", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Lithuania", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 3, + "MAPCOLOR13": 9, + "POP_EST": 2823859, + "POP_RANK": 12, + "GDP_MD_EST": 85620, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LH", + "ISO_A2": "LT", + "ISO_A3": "LTU", + "ISO_A3_EH": "LTU", + "ISO_N3": "440", + "UN_A3": "440", + "WB_A2": "LT", + "WB_A3": "LTU", + "WOE_ID": 23424875, + "WOE_ID_EH": 23424875, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LTU", + "ADM0_A3_US": "LTU", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [21.0558, 53.905702, 26.588279, 56.372528], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [26.494331, 55.615107], + [26.588279, 55.167176], + [25.768433, 54.846963], + [25.536354, 54.282423], + [24.450684, 53.905702], + [23.484128, 53.912498], + [23.243987, 54.220567], + [22.731099, 54.327537], + [22.651052, 54.582741], + [22.757764, 54.856574], + [22.315724, 55.015299], + [21.268449, 55.190482], + [21.0558, 56.031076], + [22.201157, 56.337802], + [23.878264, 56.273671], + [24.860684, 56.372528], + [25.000934, 56.164531], + [25.533047, 56.100297], + [26.494331, 55.615107] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Luxembourg", + "SOV_A3": "LUX", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Luxembourg", + "ADM0_A3": "LUX", + "GEOU_DIF": 0, + "GEOUNIT": "Luxembourg", + "GU_A3": "LUX", + "SU_DIF": 0, + "SUBUNIT": "Luxembourg", + "SU_A3": "LUX", + "BRK_DIFF": 0, + "NAME": "Luxembourg", + "NAME_LONG": "Luxembourg", + "BRK_A3": "LUX", + "BRK_NAME": "Luxembourg", + "BRK_GROUP": null, + "ABBREV": "Lux.", + "POSTAL": "L", + "FORMAL_EN": "Grand Duchy of Luxembourg", + "FORMAL_FR": null, + "NAME_CIAWF": "Luxembourg", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Luxembourg", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 7, + "MAPCOLOR9": 3, + "MAPCOLOR13": 7, + "POP_EST": 594130, + "POP_RANK": 11, + "GDP_MD_EST": 58740, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "LU", + "ISO_A2": "LU", + "ISO_A3": "LUX", + "ISO_A3_EH": "LUX", + "ISO_N3": "442", + "UN_A3": "442", + "WB_A2": "LU", + "WB_A3": "LUX", + "WOE_ID": 23424881, + "WOE_ID_EH": 23424881, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LUX", + "ADM0_A3_US": "LUX", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": 5, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5.7, + "MAX_LABEL": 10 + }, + "bbox": [5.674052, 49.442667, 6.242751, 50.128052], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5.674052, 49.529484], + [5.782417, 50.090328], + [6.043073, 50.128052], + [6.242751, 49.902226], + [6.18632, 49.463803], + [5.897759, 49.442667], + [5.674052, 49.529484] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Latvia", + "SOV_A3": "LVA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Latvia", + "ADM0_A3": "LVA", + "GEOU_DIF": 0, + "GEOUNIT": "Latvia", + "GU_A3": "LVA", + "SU_DIF": 0, + "SUBUNIT": "Latvia", + "SU_A3": "LVA", + "BRK_DIFF": 0, + "NAME": "Latvia", + "NAME_LONG": "Latvia", + "BRK_A3": "LVA", + "BRK_NAME": "Latvia", + "BRK_GROUP": null, + "ABBREV": "Lat.", + "POSTAL": "LV", + "FORMAL_EN": "Republic of Latvia", + "FORMAL_FR": null, + "NAME_CIAWF": "Latvia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Latvia", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 7, + "MAPCOLOR9": 6, + "MAPCOLOR13": 13, + "POP_EST": 1944643, + "POP_RANK": 12, + "GDP_MD_EST": 50650, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "LG", + "ISO_A2": "LV", + "ISO_A3": "LVA", + "ISO_A3_EH": "LVA", + "ISO_N3": "428", + "UN_A3": "428", + "WB_A2": "LV", + "WB_A3": "LVA", + "WOE_ID": 23424874, + "WOE_ID_EH": 23424874, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "LVA", + "ADM0_A3_US": "LVA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [21.0558, 55.615107, 28.176709, 57.970157], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.176709, 56.16913], + [27.10246, 55.783314], + [26.494331, 55.615107], + [25.533047, 56.100297], + [25.000934, 56.164531], + [24.860684, 56.372528], + [23.878264, 56.273671], + [22.201157, 56.337802], + [21.0558, 56.031076], + [21.090424, 56.783873], + [21.581866, 57.411871], + [22.524341, 57.753374], + [23.318453, 57.006236], + [24.12073, 57.025693], + [24.312863, 57.793424], + [25.164594, 57.970157], + [25.60281, 57.847529], + [26.463532, 57.476389], + [27.288185, 57.474528], + [27.770016, 57.244258], + [27.855282, 56.759326], + [28.176709, 56.16913] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Morocco", + "SOV_A3": "MAR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Morocco", + "ADM0_A3": "MAR", + "GEOU_DIF": 0, + "GEOUNIT": "Morocco", + "GU_A3": "MAR", + "SU_DIF": 0, + "SUBUNIT": "Morocco", + "SU_A3": "MAR", + "BRK_DIFF": 0, + "NAME": "Morocco", + "NAME_LONG": "Morocco", + "BRK_A3": "MAR", + "BRK_NAME": "Morocco", + "BRK_GROUP": null, + "ABBREV": "Mor.", + "POSTAL": "MA", + "FORMAL_EN": "Kingdom of Morocco", + "FORMAL_FR": null, + "NAME_CIAWF": "Morocco", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Morocco", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 9, + "POP_EST": 33986655, + "POP_RANK": 15, + "GDP_MD_EST": 282800, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MO", + "ISO_A2": "MA", + "ISO_A3": "MAR", + "ISO_A3_EH": "MAR", + "ISO_N3": "504", + "UN_A3": "504", + "WB_A2": "MA", + "WB_A3": "MAR", + "WOE_ID": 23424893, + "WOE_ID_EH": 23424893, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MAR", + "ADM0_A3_US": "MAR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-17.020428, 21.420734, -1.124551, 35.759988], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.169914, 35.168396], + [-1.792986, 34.527919], + [-1.733455, 33.919713], + [-1.388049, 32.864015], + [-1.124551, 32.651522], + [-1.307899, 32.262889], + [-2.616605, 32.094346], + [-3.06898, 31.724498], + [-3.647498, 31.637294], + [-3.690441, 30.896952], + [-4.859646, 30.501188], + [-5.242129, 30.000443], + [-6.060632, 29.7317], + [-7.059228, 29.579228], + [-8.674116, 28.841289], + [-8.66559, 27.656426], + [-8.817828, 27.656426], + [-8.794884, 27.120696], + [-9.413037, 27.088476], + [-9.735343, 26.860945], + [-10.189424, 26.860945], + [-10.551263, 26.990808], + [-11.392555, 26.883424], + [-11.71822, 26.104092], + [-12.030759, 26.030866], + [-12.500963, 24.770116], + [-13.89111, 23.691009], + [-14.221168, 22.310163], + [-14.630833, 21.86094], + [-14.750955, 21.5006], + [-17.002962, 21.420734], + [-17.020428, 21.42231], + [-16.973248, 21.885745], + [-16.589137, 22.158234], + [-16.261922, 22.67934], + [-16.326414, 23.017768], + [-15.982611, 23.723358], + [-15.426004, 24.359134], + [-15.089332, 24.520261], + [-14.824645, 25.103533], + [-14.800926, 25.636265], + [-14.43994, 26.254418], + [-13.773805, 26.618892], + [-13.139942, 27.640148], + [-13.121613, 27.654148], + [-12.618837, 28.038186], + [-11.688919, 28.148644], + [-10.900957, 28.832142], + [-10.399592, 29.098586], + [-9.564811, 29.933574], + [-9.814718, 31.177736], + [-9.434793, 32.038096], + [-9.300693, 32.564679], + [-8.657476, 33.240245], + [-7.654178, 33.697065], + [-6.912544, 34.110476], + [-6.244342, 35.145865], + [-5.929994, 35.759988], + [-5.193863, 35.755182], + [-4.591006, 35.330712], + [-3.640057, 35.399855], + [-2.604306, 35.179093], + [-2.169914, 35.168396] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Moldova", + "SOV_A3": "MDA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Moldova", + "ADM0_A3": "MDA", + "GEOU_DIF": 0, + "GEOUNIT": "Moldova", + "GU_A3": "MDA", + "SU_DIF": 0, + "SUBUNIT": "Moldova", + "SU_A3": "MDA", + "BRK_DIFF": 0, + "NAME": "Moldova", + "NAME_LONG": "Moldova", + "BRK_A3": "MDA", + "BRK_NAME": "Moldova", + "BRK_GROUP": null, + "ABBREV": "Mda.", + "POSTAL": "MD", + "FORMAL_EN": "Republic of Moldova", + "FORMAL_FR": null, + "NAME_CIAWF": "Moldova", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Moldova", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 4, + "MAPCOLOR13": 12, + "POP_EST": 3474121, + "POP_RANK": 12, + "GDP_MD_EST": 18540, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MD", + "ISO_A2": "MD", + "ISO_A3": "MDA", + "ISO_A3_EH": "MDA", + "ISO_N3": "498", + "UN_A3": "498", + "WB_A2": "MD", + "WB_A3": "MDA", + "WOE_ID": 23424885, + "WOE_ID_EH": 23424885, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MDA", + "ADM0_A3_US": "MDA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [26.619337, 45.488283, 30.024659, 48.467119], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [26.619337, 48.220726], + [26.857824, 48.368211], + [27.522537, 48.467119], + [28.259547, 48.155562], + [28.670891, 48.118149], + [29.122698, 47.849095], + [29.050868, 47.510227], + [29.415135, 47.346645], + [29.559674, 46.928583], + [29.908852, 46.674361], + [29.83821, 46.525326], + [30.024659, 46.423937], + [29.759972, 46.349988], + [29.170654, 46.379262], + [29.072107, 46.517678], + [28.862972, 46.437889], + [28.933717, 46.25883], + [28.659987, 45.939987], + [28.485269, 45.596907], + [28.233554, 45.488283], + [28.054443, 45.944586], + [28.160018, 46.371563], + [28.12803, 46.810476], + [27.551166, 47.405117], + [27.233873, 47.826771], + [26.924176, 48.123264], + [26.619337, 48.220726] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Madagascar", + "SOV_A3": "MDG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Madagascar", + "ADM0_A3": "MDG", + "GEOU_DIF": 0, + "GEOUNIT": "Madagascar", + "GU_A3": "MDG", + "SU_DIF": 0, + "SUBUNIT": "Madagascar", + "SU_A3": "MDG", + "BRK_DIFF": 0, + "NAME": "Madagascar", + "NAME_LONG": "Madagascar", + "BRK_A3": "MDG", + "BRK_NAME": "Madagascar", + "BRK_GROUP": null, + "ABBREV": "Mad.", + "POSTAL": "MG", + "FORMAL_EN": "Republic of Madagascar", + "FORMAL_FR": null, + "NAME_CIAWF": "Madagascar", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Madagascar", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 5, + "MAPCOLOR9": 2, + "MAPCOLOR13": 3, + "POP_EST": 25054161, + "POP_RANK": 15, + "GDP_MD_EST": 36860, + "POP_YEAR": 2017, + "LASTCENSUS": 1993, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "MA", + "ISO_A2": "MG", + "ISO_A3": "MDG", + "ISO_A3_EH": "MDG", + "ISO_N3": "450", + "UN_A3": "450", + "WB_A2": "MG", + "WB_A3": "MDG", + "WOE_ID": 23424883, + "WOE_ID_EH": 23424883, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MDG", + "ADM0_A3_US": "MDG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [43.254187, -25.601434, 50.476537, -12.040557], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [49.543519, -12.469833], + [49.808981, -12.895285], + [50.056511, -13.555761], + [50.217431, -14.758789], + [50.476537, -15.226512], + [50.377111, -15.706069], + [50.200275, -16.000263], + [49.860606, -15.414253], + [49.672607, -15.710204], + [49.863344, -16.451037], + [49.774564, -16.875042], + [49.498612, -17.106036], + [49.435619, -17.953064], + [49.041792, -19.118781], + [48.548541, -20.496888], + [47.930749, -22.391501], + [47.547723, -23.781959], + [47.095761, -24.94163], + [46.282478, -25.178463], + [45.409508, -25.601434], + [44.833574, -25.346101], + [44.03972, -24.988345], + [43.763768, -24.460677], + [43.697778, -23.574116], + [43.345654, -22.776904], + [43.254187, -22.057413], + [43.433298, -21.336475], + [43.893683, -21.163307], + [43.89637, -20.830459], + [44.374325, -20.072366], + [44.464397, -19.435454], + [44.232422, -18.961995], + [44.042976, -18.331387], + [43.963084, -17.409945], + [44.312469, -16.850496], + [44.446517, -16.216219], + [44.944937, -16.179374], + [45.502732, -15.974373], + [45.872994, -15.793454], + [46.312243, -15.780018], + [46.882183, -15.210182], + [47.70513, -14.594303], + [48.005215, -14.091233], + [47.869047, -13.663869], + [48.293828, -13.784068], + [48.84506, -13.089175], + [48.863509, -12.487868], + [49.194651, -12.040557], + [49.543519, -12.469833] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Mexico", + "SOV_A3": "MEX", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Mexico", + "ADM0_A3": "MEX", + "GEOU_DIF": 0, + "GEOUNIT": "Mexico", + "GU_A3": "MEX", + "SU_DIF": 0, + "SUBUNIT": "Mexico", + "SU_A3": "MEX", + "BRK_DIFF": 0, + "NAME": "Mexico", + "NAME_LONG": "Mexico", + "BRK_A3": "MEX", + "BRK_NAME": "Mexico", + "BRK_GROUP": null, + "ABBREV": "Mex.", + "POSTAL": "MX", + "FORMAL_EN": "United Mexican States", + "FORMAL_FR": null, + "NAME_CIAWF": "Mexico", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Mexico", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 1, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 124574795, + "POP_RANK": 17, + "GDP_MD_EST": 2307000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "4. Emerging region: MIKT", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MX", + "ISO_A2": "MX", + "ISO_A3": "MEX", + "ISO_A3_EH": "MEX", + "ISO_N3": "484", + "UN_A3": "484", + "WB_A2": "MX", + "WB_A3": "MEX", + "WOE_ID": 23424900, + "WOE_ID_EH": 23424900, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MEX", + "ADM0_A3_US": "MEX", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 6.7 + }, + "bbox": [-117.12776, 14.538829, -86.811982, 32.72083], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-88.300031, 18.499982], + [-88.490123, 18.486831], + [-88.848344, 17.883198], + [-89.029857, 18.001511], + [-89.150909, 17.955468], + [-89.14308, 17.808319], + [-90.067934, 17.819326], + [-91.00152, 17.817595], + [-91.002269, 17.254658], + [-91.453921, 17.252177], + [-91.08167, 16.918477], + [-90.711822, 16.687483], + [-90.600847, 16.470778], + [-90.438867, 16.41011], + [-90.464473, 16.069562], + [-91.74796, 16.066565], + [-92.229249, 15.251447], + [-92.087216, 15.064585], + [-92.20323, 14.830103], + [-92.22775, 14.538829], + [-93.359464, 15.61543], + [-93.875169, 15.940164], + [-94.691656, 16.200975], + [-95.250227, 16.128318], + [-96.053382, 15.752088], + [-96.557434, 15.653515], + [-97.263592, 15.917065], + [-98.01303, 16.107312], + [-98.947676, 16.566043], + [-99.697397, 16.706164], + [-100.829499, 17.171071], + [-101.666089, 17.649026], + [-101.918528, 17.91609], + [-102.478132, 17.975751], + [-103.50099, 18.292295], + [-103.917527, 18.748572], + [-104.99201, 19.316134], + [-105.493038, 19.946767], + [-105.731396, 20.434102], + [-105.397773, 20.531719], + [-105.500661, 20.816895], + [-105.270752, 21.076285], + [-105.265817, 21.422104], + [-105.603161, 21.871146], + [-105.693414, 22.26908], + [-106.028716, 22.773752], + [-106.90998, 23.767774], + [-107.915449, 24.548915], + [-108.401905, 25.172314], + [-109.260199, 25.580609], + [-109.444089, 25.824884], + [-109.291644, 26.442934], + [-109.801458, 26.676176], + [-110.391732, 27.162115], + [-110.641019, 27.859876], + [-111.178919, 27.941241], + [-111.759607, 28.467953], + [-112.228235, 28.954409], + [-112.271824, 29.266844], + [-112.809594, 30.021114], + [-113.163811, 30.786881], + [-113.148669, 31.170966], + [-113.871881, 31.567608], + [-114.205737, 31.524045], + [-114.776451, 31.799532], + [-114.9367, 31.393485], + [-114.771232, 30.913617], + [-114.673899, 30.162681], + [-114.330974, 29.750432], + [-113.588875, 29.061611], + [-113.424053, 28.826174], + [-113.271969, 28.754783], + [-113.140039, 28.411289], + [-112.962298, 28.42519], + [-112.761587, 27.780217], + [-112.457911, 27.525814], + [-112.244952, 27.171727], + [-111.616489, 26.662817], + [-111.284675, 25.73259], + [-110.987819, 25.294606], + [-110.710007, 24.826004], + [-110.655049, 24.298595], + [-110.172856, 24.265548], + [-109.771847, 23.811183], + [-109.409104, 23.364672], + [-109.433392, 23.185588], + [-109.854219, 22.818272], + [-110.031392, 22.823078], + [-110.295071, 23.430973], + [-110.949501, 24.000964], + [-111.670568, 24.484423], + [-112.182036, 24.738413], + [-112.148989, 25.470125], + [-112.300711, 26.012004], + [-112.777297, 26.32196], + [-113.464671, 26.768186], + [-113.59673, 26.63946], + [-113.848937, 26.900064], + [-114.465747, 27.14209], + [-115.055142, 27.722727], + [-114.982253, 27.7982], + [-114.570366, 27.741485], + [-114.199329, 28.115003], + [-114.162018, 28.566112], + [-114.931842, 29.279479], + [-115.518654, 29.556362], + [-115.887365, 30.180794], + [-116.25835, 30.836464], + [-116.721526, 31.635744], + [-117.12776, 32.53534], + [-115.99135, 32.61239], + [-114.72139, 32.72083], + [-114.815, 32.52528], + [-113.30498, 32.03914], + [-111.02361, 31.33472], + [-109.035, 31.34194], + [-108.24194, 31.34222], + [-108.24, 31.754854], + [-106.50759, 31.75452], + [-106.1429, 31.39995], + [-105.63159, 31.08383], + [-105.03737, 30.64402], + [-104.70575, 30.12173], + [-104.45697, 29.57196], + [-103.94, 29.27], + [-103.11, 28.97], + [-102.48, 29.76], + [-101.6624, 29.7793], + [-100.9576, 29.38071], + [-100.45584, 28.69612], + [-100.11, 28.11], + [-99.52, 27.54], + [-99.3, 26.84], + [-99.02, 26.37], + [-98.24, 26.06], + [-97.53, 25.84], + [-97.140008, 25.869997], + [-97.528072, 24.992144], + [-97.702946, 24.272343], + [-97.776042, 22.93258], + [-97.872367, 22.444212], + [-97.699044, 21.898689], + [-97.38896, 21.411019], + [-97.189333, 20.635433], + [-96.525576, 19.890931], + [-96.292127, 19.320371], + [-95.900885, 18.828024], + [-94.839063, 18.562717], + [-94.42573, 18.144371], + [-93.548651, 18.423837], + [-92.786114, 18.524839], + [-92.037348, 18.704569], + [-91.407903, 18.876083], + [-90.77187, 19.28412], + [-90.53359, 19.867418], + [-90.451476, 20.707522], + [-90.278618, 20.999855], + [-89.601321, 21.261726], + [-88.543866, 21.493675], + [-87.658417, 21.458846], + [-87.05189, 21.543543], + [-86.811982, 21.331515], + [-86.845908, 20.849865], + [-87.383291, 20.255405], + [-87.621054, 19.646553], + [-87.43675, 19.472403], + [-87.58656, 19.04013], + [-87.837191, 18.259816], + [-88.090664, 18.516648], + [-88.300031, 18.499982] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Macedonia", + "SOV_A3": "MKD", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Macedonia", + "ADM0_A3": "MKD", + "GEOU_DIF": 0, + "GEOUNIT": "Macedonia", + "GU_A3": "MKD", + "SU_DIF": 0, + "SUBUNIT": "Macedonia", + "SU_A3": "MKD", + "BRK_DIFF": 0, + "NAME": "Macedonia", + "NAME_LONG": "Macedonia", + "BRK_A3": "MKD", + "BRK_NAME": "Macedonia", + "BRK_GROUP": null, + "ABBREV": "Mkd.", + "POSTAL": "MK", + "FORMAL_EN": "Former Yugoslav Republic of Macedonia", + "FORMAL_FR": null, + "NAME_CIAWF": "Macedonia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Macedonia, FYR", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 2103721, + "POP_RANK": 12, + "GDP_MD_EST": 29520, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MK", + "ISO_A2": "MK", + "ISO_A3": "MKD", + "ISO_A3_EH": "MKD", + "ISO_N3": "807", + "UN_A3": "807", + "WB_A2": "MK", + "WB_A3": "MKD", + "WOE_ID": 23424890, + "WOE_ID_EH": 23424890, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MKD", + "ADM0_A3_US": "MKD", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [20.463175, 40.842727, 22.952377, 42.32026], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [21.02004, 40.842727], + [20.605182, 41.086226], + [20.463175, 41.515089], + [20.590247, 41.855404], + [20.590247, 41.855409], + [20.71731, 41.84711], + [20.76216, 42.05186], + [21.3527, 42.2068], + [21.576636, 42.245224], + [21.91708, 42.30364], + [22.380526, 42.32026], + [22.881374, 41.999297], + [22.952377, 41.337994], + [22.76177, 41.3048], + [22.597308, 41.130487], + [22.055378, 41.149866], + [21.674161, 40.931275], + [21.02004, 40.842727] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Mali", + "SOV_A3": "MLI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Mali", + "ADM0_A3": "MLI", + "GEOU_DIF": 0, + "GEOUNIT": "Mali", + "GU_A3": "MLI", + "SU_DIF": 0, + "SUBUNIT": "Mali", + "SU_A3": "MLI", + "BRK_DIFF": 0, + "NAME": "Mali", + "NAME_LONG": "Mali", + "BRK_A3": "MLI", + "BRK_NAME": "Mali", + "BRK_GROUP": null, + "ABBREV": "Mali", + "POSTAL": "ML", + "FORMAL_EN": "Republic of Mali", + "FORMAL_FR": null, + "NAME_CIAWF": "Mali", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Mali", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 7, + "POP_EST": 17885245, + "POP_RANK": 14, + "GDP_MD_EST": 38090, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "ML", + "ISO_A2": "ML", + "ISO_A3": "MLI", + "ISO_A3_EH": "MLI", + "ISO_N3": "466", + "UN_A3": "466", + "WB_A2": "ML", + "WB_A3": "MLI", + "WOE_ID": 23424891, + "WOE_ID_EH": 23424891, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MLI", + "ADM0_A3_US": "MLI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [-12.17075, 10.096361, 4.27021, 24.974574], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0.374892, 14.928908], + [-0.266257, 14.924309], + [-0.515854, 15.116158], + [-1.066363, 14.973815], + [-2.001035, 14.559008], + [-2.191825, 14.246418], + [-2.967694, 13.79815], + [-3.103707, 13.541267], + [-3.522803, 13.337662], + [-4.006391, 13.472485], + [-4.280405, 13.228444], + [-4.427166, 12.542646], + [-5.220942, 11.713859], + [-5.197843, 11.375146], + [-5.470565, 10.95127], + [-5.404342, 10.370737], + [-5.816926, 10.222555], + [-6.050452, 10.096361], + [-6.205223, 10.524061], + [-6.493965, 10.411303], + [-6.666461, 10.430811], + [-6.850507, 10.138994], + [-7.622759, 10.147236], + [-7.89959, 10.297382], + [-8.029944, 10.206535], + [-8.335377, 10.494812], + [-8.282357, 10.792597], + [-8.407311, 10.909257], + [-8.620321, 10.810891], + [-8.581305, 11.136246], + [-8.376305, 11.393646], + [-8.786099, 11.812561], + [-8.905265, 12.088358], + [-9.127474, 12.30806], + [-9.327616, 12.334286], + [-9.567912, 12.194243], + [-9.890993, 12.060479], + [-10.165214, 11.844084], + [-10.593224, 11.923975], + [-10.87083, 12.177887], + [-11.036556, 12.211245], + [-11.297574, 12.077971], + [-11.456169, 12.076834], + [-11.513943, 12.442988], + [-11.467899, 12.754519], + [-11.553398, 13.141214], + [-11.927716, 13.422075], + [-12.124887, 13.994727], + [-12.17075, 14.616834], + [-11.834208, 14.799097], + [-11.666078, 15.388208], + [-11.349095, 15.411256], + [-10.650791, 15.132746], + [-10.086846, 15.330486], + [-9.700255, 15.264107], + [-9.550238, 15.486497], + [-5.537744, 15.50169], + [-5.315277, 16.201854], + [-5.488523, 16.325102], + [-5.971129, 20.640833], + [-6.453787, 24.956591], + [-4.923337, 24.974574], + [-1.550055, 22.792666], + [1.823228, 20.610809], + [2.060991, 20.142233], + [2.683588, 19.85623], + [3.146661, 19.693579], + [3.158133, 19.057364], + [4.267419, 19.155265], + [4.27021, 16.852227], + [3.723422, 16.184284], + [3.638259, 15.56812], + [2.749993, 15.409525], + [1.385528, 15.323561], + [1.015783, 14.968182], + [0.374892, 14.928908] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Myanmar", + "SOV_A3": "MMR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Myanmar", + "ADM0_A3": "MMR", + "GEOU_DIF": 0, + "GEOUNIT": "Myanmar", + "GU_A3": "MMR", + "SU_DIF": 0, + "SUBUNIT": "Myanmar", + "SU_A3": "MMR", + "BRK_DIFF": 0, + "NAME": "Myanmar", + "NAME_LONG": "Myanmar", + "BRK_A3": "MMR", + "BRK_NAME": "Myanmar", + "BRK_GROUP": null, + "ABBREV": "Myan.", + "POSTAL": "MM", + "FORMAL_EN": "Republic of the Union of Myanmar", + "FORMAL_FR": null, + "NAME_CIAWF": "Burma", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Myanmar", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 13, + "POP_EST": 55123814, + "POP_RANK": 16, + "GDP_MD_EST": 311100, + "POP_YEAR": 2017, + "LASTCENSUS": 1983, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "BM", + "ISO_A2": "MM", + "ISO_A3": "MMR", + "ISO_A3_EH": "MMR", + "ISO_N3": "104", + "UN_A3": "104", + "WB_A2": "MM", + "WB_A3": "MMR", + "WOE_ID": 23424763, + "WOE_ID_EH": 23424763, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MMR", + "ADM0_A3_US": "MMR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [92.303234, 9.93296, 101.180005, 28.335945], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [92.368554, 20.670883], + [92.303234, 21.475485], + [92.652257, 21.324048], + [92.672721, 22.041239], + [93.166128, 22.27846], + [93.060294, 22.703111], + [93.286327, 23.043658], + [93.325188, 24.078556], + [94.106742, 23.850741], + [94.552658, 24.675238], + [94.603249, 25.162495], + [95.155153, 26.001307], + [95.124768, 26.573572], + [96.419366, 27.264589], + [97.133999, 27.083774], + [97.051989, 27.699059], + [97.402561, 27.882536], + [97.327114, 28.261583], + [97.911988, 28.335945], + [98.246231, 27.747221], + [98.68269, 27.508812], + [98.712094, 26.743536], + [98.671838, 25.918703], + [97.724609, 25.083637], + [97.60472, 23.897405], + [98.660262, 24.063286], + [98.898749, 23.142722], + [99.531992, 22.949039], + [99.240899, 22.118314], + [99.983489, 21.742937], + [100.416538, 21.558839], + [101.150033, 21.849984], + [101.180005, 21.436573], + [100.329101, 20.786122], + [100.115988, 20.41785], + [99.543309, 20.186598], + [98.959676, 19.752981], + [98.253724, 19.708203], + [97.797783, 18.62708], + [97.375896, 18.445438], + [97.859123, 17.567946], + [98.493761, 16.837836], + [98.903348, 16.177824], + [98.537376, 15.308497], + [98.192074, 15.123703], + [98.430819, 14.622028], + [99.097755, 13.827503], + [99.212012, 13.269294], + [99.196354, 12.804748], + [99.587286, 11.892763], + [99.038121, 10.960546], + [98.553551, 9.93296], + [98.457174, 10.675266], + [98.764546, 11.441292], + [98.428339, 12.032987], + [98.509574, 13.122378], + [98.103604, 13.64046], + [97.777732, 14.837286], + [97.597072, 16.100568], + [97.16454, 16.928734], + [96.505769, 16.427241], + [95.369352, 15.71439], + [94.808405, 15.803454], + [94.188804, 16.037936], + [94.533486, 17.27724], + [94.324817, 18.213514], + [93.540988, 19.366493], + [93.663255, 19.726962], + [93.078278, 19.855145], + [92.368554, 20.670883] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Montenegro", + "SOV_A3": "MNE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Montenegro", + "ADM0_A3": "MNE", + "GEOU_DIF": 0, + "GEOUNIT": "Montenegro", + "GU_A3": "MNE", + "SU_DIF": 0, + "SUBUNIT": "Montenegro", + "SU_A3": "MNE", + "BRK_DIFF": 0, + "NAME": "Montenegro", + "NAME_LONG": "Montenegro", + "BRK_A3": "MNE", + "BRK_NAME": "Montenegro", + "BRK_GROUP": null, + "ABBREV": "Mont.", + "POSTAL": "ME", + "FORMAL_EN": "Montenegro", + "FORMAL_FR": null, + "NAME_CIAWF": "Montenegro", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Montenegro", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 4, + "MAPCOLOR13": 5, + "POP_EST": 642550, + "POP_RANK": 11, + "GDP_MD_EST": 10610, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MJ", + "ISO_A2": "ME", + "ISO_A3": "MNE", + "ISO_A3_EH": "MNE", + "ISO_N3": "499", + "UN_A3": "499", + "WB_A2": "ME", + "WB_A3": "MNE", + "WOE_ID": 20069817, + "WOE_ID_EH": 20069817, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MNE", + "ADM0_A3_US": "MNE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [18.450017, 41.877551, 20.3398, 43.52384], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.0707, 42.58863], + [19.801613, 42.500093], + [19.738051, 42.688247], + [19.304486, 42.195745], + [19.371768, 41.877551], + [19.16246, 41.95502], + [18.88214, 42.28151], + [18.450017, 42.479992], + [18.56, 42.65], + [18.70648, 43.20011], + [19.03165, 43.43253], + [19.21852, 43.52384], + [19.48389, 43.35229], + [19.63, 43.21378], + [19.95857, 43.10604], + [20.3398, 42.89852], + [20.25758, 42.81275], + [20.0707, 42.58863] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Mongolia", + "SOV_A3": "MNG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Mongolia", + "ADM0_A3": "MNG", + "GEOU_DIF": 0, + "GEOUNIT": "Mongolia", + "GU_A3": "MNG", + "SU_DIF": 0, + "SUBUNIT": "Mongolia", + "SU_A3": "MNG", + "BRK_DIFF": 0, + "NAME": "Mongolia", + "NAME_LONG": "Mongolia", + "BRK_A3": "MNG", + "BRK_NAME": "Mongolia", + "BRK_GROUP": null, + "ABBREV": "Mong.", + "POSTAL": "MN", + "FORMAL_EN": "Mongolia", + "FORMAL_FR": null, + "NAME_CIAWF": "Mongolia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Mongolia", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 5, + "MAPCOLOR13": 6, + "POP_EST": 3068243, + "POP_RANK": 12, + "GDP_MD_EST": 37000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MG", + "ISO_A2": "MN", + "ISO_A3": "MNG", + "ISO_A3_EH": "MNG", + "ISO_N3": "496", + "UN_A3": "496", + "WB_A2": "MN", + "WB_A3": "MNG", + "WOE_ID": 23424887, + "WOE_ID_EH": 23424887, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MNG", + "ADM0_A3_US": "MNG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [87.751264, 41.59741, 119.772824, 52.047366], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [116.678801, 49.888531], + [116.191802, 49.134598], + [115.485282, 48.135383], + [115.742837, 47.726545], + [116.308953, 47.85341], + [117.295507, 47.697709], + [118.064143, 48.06673], + [118.866574, 47.74706], + [119.772824, 47.048059], + [119.66327, 46.69268], + [118.874326, 46.805412], + [117.421701, 46.672733], + [116.717868, 46.388202], + [115.985096, 45.727235], + [114.460332, 45.339817], + [113.463907, 44.808893], + [112.436062, 45.011646], + [111.873306, 45.102079], + [111.348377, 44.457442], + [111.667737, 44.073176], + [111.829588, 43.743118], + [111.129682, 43.406834], + [110.412103, 42.871234], + [109.243596, 42.519446], + [107.744773, 42.481516], + [106.129316, 42.134328], + [104.964994, 41.59741], + [104.522282, 41.908347], + [103.312278, 41.907468], + [101.83304, 42.514873], + [100.845866, 42.663804], + [99.515817, 42.524691], + [97.451757, 42.74889], + [96.349396, 42.725635], + [95.762455, 43.319449], + [95.306875, 44.241331], + [94.688929, 44.352332], + [93.480734, 44.975472], + [92.133891, 45.115076], + [90.94554, 45.286073], + [90.585768, 45.719716], + [90.970809, 46.888146], + [90.280826, 47.693549], + [88.854298, 48.069082], + [88.013832, 48.599463], + [87.751264, 49.297198], + [88.805567, 49.470521], + [90.713667, 50.331812], + [92.234712, 50.802171], + [93.10421, 50.49529], + [94.147566, 50.480537], + [94.815949, 50.013433], + [95.81402, 49.97746], + [97.25976, 49.72605], + [98.231762, 50.422401], + [97.82574, 51.010995], + [98.861491, 52.047366], + [99.981732, 51.634006], + [100.88948, 51.516856], + [102.06521, 51.25991], + [102.25589, 50.51056], + [103.676545, 50.089966], + [104.62158, 50.27532], + [105.886591, 50.406019], + [106.888804, 50.274296], + [107.868176, 49.793705], + [108.475167, 49.282548], + [109.402449, 49.292961], + [110.662011, 49.130128], + [111.581231, 49.377968], + [112.89774, 49.543565], + [114.362456, 50.248303], + [114.96211, 50.140247], + [115.485695, 49.805177], + [116.678801, 49.888531] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Mozambique", + "SOV_A3": "MOZ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Mozambique", + "ADM0_A3": "MOZ", + "GEOU_DIF": 0, + "GEOUNIT": "Mozambique", + "GU_A3": "MOZ", + "SU_DIF": 0, + "SUBUNIT": "Mozambique", + "SU_A3": "MOZ", + "BRK_DIFF": 0, + "NAME": "Mozambique", + "NAME_LONG": "Mozambique", + "BRK_A3": "MOZ", + "BRK_NAME": "Mozambique", + "BRK_GROUP": null, + "ABBREV": "Moz.", + "POSTAL": "MZ", + "FORMAL_EN": "Republic of Mozambique", + "FORMAL_FR": null, + "NAME_CIAWF": "Mozambique", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Mozambique", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 2, + "MAPCOLOR9": 1, + "MAPCOLOR13": 4, + "POP_EST": 26573706, + "POP_RANK": 15, + "GDP_MD_EST": 35010, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "MZ", + "ISO_A2": "MZ", + "ISO_A3": "MOZ", + "ISO_A3_EH": "MOZ", + "ISO_N3": "508", + "UN_A3": "508", + "WB_A2": "MZ", + "WB_A3": "MOZ", + "WOE_ID": 23424902, + "WOE_ID_EH": 23424902, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MOZ", + "ADM0_A3_US": "MOZ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [30.179481, -26.742192, 40.775475, -10.317096], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.559989, -11.52002], + [35.312398, -11.439146], + [36.514082, -11.720938], + [36.775151, -11.594537], + [37.47129, -11.56876], + [37.82764, -11.26879], + [38.427557, -11.285202], + [39.521, -10.89688], + [40.31659, -10.3171], + [40.316586, -10.317098], + [40.316589, -10.317096], + [40.478387, -10.765441], + [40.437253, -11.761711], + [40.560811, -12.639177], + [40.59962, -14.201975], + [40.775475, -14.691764], + [40.477251, -15.406294], + [40.089264, -16.100774], + [39.452559, -16.720891], + [38.538351, -17.101023], + [37.411133, -17.586368], + [36.281279, -18.659688], + [35.896497, -18.84226], + [35.1984, -19.552811], + [34.786383, -19.784012], + [34.701893, -20.497043], + [35.176127, -21.254361], + [35.373428, -21.840837], + [35.385848, -22.14], + [35.562546, -22.09], + [35.533935, -23.070788], + [35.371774, -23.535359], + [35.60747, -23.706563], + [35.458746, -24.12261], + [35.040735, -24.478351], + [34.215824, -24.816314], + [33.01321, -25.357573], + [32.574632, -25.727318], + [32.660363, -26.148584], + [32.915955, -26.215867], + [32.83012, -26.742192], + [32.071665, -26.73382], + [31.985779, -26.29178], + [31.837778, -25.843332], + [31.752408, -25.484284], + [31.930589, -24.369417], + [31.670398, -23.658969], + [31.191409, -22.25151], + [32.244988, -21.116489], + [32.508693, -20.395292], + [32.659743, -20.30429], + [32.772708, -19.715592], + [32.611994, -19.419383], + [32.654886, -18.67209], + [32.849861, -17.979057], + [32.847639, -16.713398], + [32.328239, -16.392074], + [31.852041, -16.319417], + [31.636498, -16.07199], + [31.173064, -15.860944], + [30.338955, -15.880839], + [30.274256, -15.507787], + [30.179481, -14.796099], + [33.214025, -13.97186], + [33.7897, -14.451831], + [34.064825, -14.35995], + [34.459633, -14.61301], + [34.517666, -15.013709], + [34.307291, -15.478641], + [34.381292, -16.18356], + [35.03381, -16.8013], + [35.339063, -16.10744], + [35.771905, -15.896859], + [35.686845, -14.611046], + [35.267956, -13.887834], + [34.907151, -13.565425], + [34.559989, -13.579998], + [34.280006, -12.280025], + [34.559989, -11.52002] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Mauritania", + "SOV_A3": "MRT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Mauritania", + "ADM0_A3": "MRT", + "GEOU_DIF": 0, + "GEOUNIT": "Mauritania", + "GU_A3": "MRT", + "SU_DIF": 0, + "SUBUNIT": "Mauritania", + "SU_A3": "MRT", + "BRK_DIFF": 0, + "NAME": "Mauritania", + "NAME_LONG": "Mauritania", + "BRK_A3": "MRT", + "BRK_NAME": "Mauritania", + "BRK_GROUP": null, + "ABBREV": "Mrt.", + "POSTAL": "MR", + "FORMAL_EN": "Islamic Republic of Mauritania", + "FORMAL_FR": null, + "NAME_CIAWF": "Mauritania", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Mauritania", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 3, + "MAPCOLOR9": 2, + "MAPCOLOR13": 1, + "POP_EST": 3758571, + "POP_RANK": 12, + "GDP_MD_EST": 16710, + "POP_YEAR": 2017, + "LASTCENSUS": 2000, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "MR", + "ISO_A2": "MR", + "ISO_A3": "MRT", + "ISO_A3_EH": "MRT", + "ISO_N3": "478", + "UN_A3": "478", + "WB_A2": "MR", + "WB_A3": "MRT", + "WOE_ID": 23424896, + "WOE_ID_EH": 23424896, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MRT", + "ADM0_A3_US": "MRT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-17.063423, 14.616834, -4.923337, 27.395744], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.6844, 27.395744], + [-4.923337, 24.974574], + [-6.453787, 24.956591], + [-5.971129, 20.640833], + [-5.488523, 16.325102], + [-5.315277, 16.201854], + [-5.537744, 15.50169], + [-9.550238, 15.486497], + [-9.700255, 15.264107], + [-10.086846, 15.330486], + [-10.650791, 15.132746], + [-11.349095, 15.411256], + [-11.666078, 15.388208], + [-11.834208, 14.799097], + [-12.17075, 14.616834], + [-12.830658, 15.303692], + [-13.435738, 16.039383], + [-14.099521, 16.304302], + [-14.577348, 16.598264], + [-15.135737, 16.587282], + [-15.623666, 16.369337], + [-16.12069, 16.455663], + [-16.463098, 16.135036], + [-16.549708, 16.673892], + [-16.270552, 17.166963], + [-16.146347, 18.108482], + [-16.256883, 19.096716], + [-16.377651, 19.593817], + [-16.277838, 20.092521], + [-16.536324, 20.567866], + [-17.063423, 20.999752], + [-16.845194, 21.333323], + [-12.929102, 21.327071], + [-13.118754, 22.77122], + [-12.874222, 23.284832], + [-11.937224, 23.374594], + [-11.969419, 25.933353], + [-8.687294, 25.881056], + [-8.6844, 27.395744] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Malawi", + "SOV_A3": "MWI", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Malawi", + "ADM0_A3": "MWI", + "GEOU_DIF": 0, + "GEOUNIT": "Malawi", + "GU_A3": "MWI", + "SU_DIF": 0, + "SUBUNIT": "Malawi", + "SU_A3": "MWI", + "BRK_DIFF": 0, + "NAME": "Malawi", + "NAME_LONG": "Malawi", + "BRK_A3": "MWI", + "BRK_NAME": "Malawi", + "BRK_GROUP": null, + "ABBREV": "Mal.", + "POSTAL": "MW", + "FORMAL_EN": "Republic of Malawi", + "FORMAL_FR": null, + "NAME_CIAWF": "Malawi", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Malawi", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 5, + "POP_EST": 19196246, + "POP_RANK": 14, + "GDP_MD_EST": 21200, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "MI", + "ISO_A2": "MW", + "ISO_A3": "MWI", + "ISO_A3_EH": "MWI", + "ISO_N3": "454", + "UN_A3": "454", + "WB_A2": "MW", + "WB_A3": "MWI", + "WOE_ID": 23424889, + "WOE_ID_EH": 23424889, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MWI", + "ADM0_A3_US": "MWI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [32.688165, -16.8013, 35.771905, -9.230599], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.559989, -11.52002], + [34.280006, -12.280025], + [34.559989, -13.579998], + [34.907151, -13.565425], + [35.267956, -13.887834], + [35.686845, -14.611046], + [35.771905, -15.896859], + [35.339063, -16.10744], + [35.03381, -16.8013], + [34.381292, -16.18356], + [34.307291, -15.478641], + [34.517666, -15.013709], + [34.459633, -14.61301], + [34.064825, -14.35995], + [33.7897, -14.451831], + [33.214025, -13.97186], + [32.688165, -13.712858], + [32.991764, -12.783871], + [33.306422, -12.435778], + [33.114289, -11.607198], + [33.31531, -10.79655], + [33.485688, -10.525559], + [33.231388, -9.676722], + [32.759375, -9.230599], + [33.73972, -9.41715], + [33.940838, -9.693674], + [34.28, -10.16], + [34.559989, -11.52002] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Malaysia", + "SOV_A3": "MYS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Malaysia", + "ADM0_A3": "MYS", + "GEOU_DIF": 0, + "GEOUNIT": "Malaysia", + "GU_A3": "MYS", + "SU_DIF": 0, + "SUBUNIT": "Malaysia", + "SU_A3": "MYS", + "BRK_DIFF": 0, + "NAME": "Malaysia", + "NAME_LONG": "Malaysia", + "BRK_A3": "MYS", + "BRK_NAME": "Malaysia", + "BRK_GROUP": null, + "ABBREV": "Malay.", + "POSTAL": "MY", + "FORMAL_EN": "Malaysia", + "FORMAL_FR": null, + "NAME_CIAWF": "Malaysia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Malaysia", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 4, + "MAPCOLOR9": 3, + "MAPCOLOR13": 6, + "POP_EST": 31381992, + "POP_RANK": 15, + "GDP_MD_EST": 863000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "MY", + "ISO_A2": "MY", + "ISO_A3": "MYS", + "ISO_A3_EH": "MYS", + "ISO_N3": "458", + "UN_A3": "458", + "WB_A2": "MY", + "WB_A3": "MYS", + "WOE_ID": 23424901, + "WOE_ID_EH": 23424901, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MYS", + "ADM0_A3_US": "MYS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [100.085757, 0.773131, 119.181904, 6.928053], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [114.204017, 4.525874], + [114.659596, 4.007637], + [114.869557, 4.348314], + [115.347461, 4.316636], + [115.4057, 4.955228], + [115.45071, 5.44773], + [116.220741, 6.143191], + [116.725103, 6.924771], + [117.129626, 6.928053], + [117.643393, 6.422166], + [117.689075, 5.98749], + [118.347691, 5.708696], + [119.181904, 5.407836], + [119.110694, 5.016128], + [118.439727, 4.966519], + [118.618321, 4.478202], + [117.882035, 4.137551], + [117.015214, 4.306094], + [115.865517, 4.306559], + [115.519078, 3.169238], + [115.134037, 2.821482], + [114.621355, 1.430688], + [113.80585, 1.217549], + [112.859809, 1.49779], + [112.380252, 1.410121], + [111.797548, 0.904441], + [111.159138, 0.976478], + [110.514061, 0.773131], + [109.830227, 1.338136], + [109.66326, 2.006467], + [110.396135, 1.663775], + [111.168853, 1.850637], + [111.370081, 2.697303], + [111.796928, 2.885897], + [112.995615, 3.102395], + [113.712935, 3.893509], + [114.204017, 4.525874] + ] + ], + [ + [ + [102.141187, 6.221636], + [102.371147, 6.128205], + [102.961705, 5.524495], + [103.381215, 4.855001], + [103.438575, 4.181606], + [103.332122, 3.726698], + [103.429429, 3.382869], + [103.502448, 2.791019], + [103.854674, 2.515454], + [104.247932, 1.631141], + [104.228811, 1.293048], + [103.519707, 1.226334], + [102.573615, 1.967115], + [101.390638, 2.760814], + [101.27354, 3.270292], + [100.695435, 3.93914], + [100.557408, 4.76728], + [100.196706, 5.312493], + [100.30626, 6.040562], + [100.085757, 6.464489], + [100.259596, 6.642825], + [101.075516, 6.204867], + [101.154219, 5.691384], + [101.814282, 5.810808], + [102.141187, 6.221636] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Namibia", + "SOV_A3": "NAM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Namibia", + "ADM0_A3": "NAM", + "GEOU_DIF": 0, + "GEOUNIT": "Namibia", + "GU_A3": "NAM", + "SU_DIF": 0, + "SUBUNIT": "Namibia", + "SU_A3": "NAM", + "BRK_DIFF": 0, + "NAME": "Namibia", + "NAME_LONG": "Namibia", + "BRK_A3": "NAM", + "BRK_NAME": "Namibia", + "BRK_GROUP": null, + "ABBREV": "Nam.", + "POSTAL": "NA", + "FORMAL_EN": "Republic of Namibia", + "FORMAL_FR": null, + "NAME_CIAWF": "Namibia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Namibia", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 1, + "MAPCOLOR9": 1, + "MAPCOLOR13": 7, + "POP_EST": 2484780, + "POP_RANK": 12, + "GDP_MD_EST": 25990, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "WA", + "ISO_A2": "NA", + "ISO_A3": "NAM", + "ISO_A3_EH": "NAM", + "ISO_N3": "516", + "UN_A3": "516", + "WB_A2": "NA", + "WB_A3": "NAM", + "WOE_ID": 23424987, + "WOE_ID_EH": 23424987, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NAM", + "ADM0_A3_US": "NAM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Southern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7.5 + }, + "bbox": [11.734199, -29.045462, 25.084443, -16.941343], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [11.734199, -17.301889], + [12.215461, -17.111668], + [12.814081, -16.941343], + [13.462362, -16.971212], + [14.058501, -17.423381], + [14.209707, -17.353101], + [18.263309, -17.309951], + [18.956187, -17.789095], + [21.377176, -17.930636], + [23.215048, -17.523116], + [24.033862, -17.295843], + [24.682349, -17.353411], + [25.07695, -17.578823], + [25.084443, -17.661816], + [24.520705, -17.887125], + [24.217365, -17.889347], + [23.579006, -18.281261], + [23.196858, -17.869038], + [21.65504, -18.219146], + [20.910641, -18.252219], + [20.881134, -21.814327], + [19.895458, -21.849157], + [19.895768, -24.76779], + [19.894734, -28.461105], + [19.002127, -28.972443], + [18.464899, -29.045462], + [17.836152, -28.856378], + [17.387497, -28.783514], + [17.218929, -28.355943], + [16.824017, -28.082162], + [16.344977, -28.576705], + [15.601818, -27.821247], + [15.210472, -27.090956], + [14.989711, -26.117372], + [14.743214, -25.39292], + [14.408144, -23.853014], + [14.385717, -22.656653], + [14.257714, -22.111208], + [13.868642, -21.699037], + [13.352498, -20.872834], + [12.826845, -19.673166], + [12.608564, -19.045349], + [11.794919, -18.069129], + [11.734199, -17.301889] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "France", + "SOV_A3": "FR1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Dependency", + "ADMIN": "New Caledonia", + "ADM0_A3": "NCL", + "GEOU_DIF": 0, + "GEOUNIT": "New Caledonia", + "GU_A3": "NCL", + "SU_DIF": 0, + "SUBUNIT": "New Caledonia", + "SU_A3": "NCL", + "BRK_DIFF": 0, + "NAME": "New Caledonia", + "NAME_LONG": "New Caledonia", + "BRK_A3": "NCL", + "BRK_NAME": "New Caledonia", + "BRK_GROUP": null, + "ABBREV": "New C.", + "POSTAL": "NC", + "FORMAL_EN": "New Caledonia", + "FORMAL_FR": "Nouvelle-Calédonie", + "NAME_CIAWF": "New Caledonia", + "NOTE_ADM0": "Fr.", + "NOTE_BRK": null, + "NAME_SORT": "New Caledonia", + "NAME_ALT": null, + "MAPCOLOR7": 7, + "MAPCOLOR8": 5, + "MAPCOLOR9": 9, + "MAPCOLOR13": 11, + "POP_EST": 279070, + "POP_RANK": 10, + "GDP_MD_EST": 10770, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "NC", + "ISO_A2": "NC", + "ISO_A3": "NCL", + "ISO_A3_EH": "NCL", + "ISO_N3": "540", + "UN_A3": "540", + "WB_A2": "NC", + "WB_A3": "NCL", + "WOE_ID": 23424903, + "WOE_ID_EH": 23424903, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NCL", + "ADM0_A3_US": "NCL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Melanesia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 13, + "LONG_LEN": 13, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": -99, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.6, + "MAX_LABEL": 8 + }, + "bbox": [164.029606, -22.399976, 167.120011, -20.105646], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [165.77999, -21.080005], + [166.599991, -21.700019], + [167.120011, -22.159991], + [166.740035, -22.399976], + [166.189732, -22.129708], + [165.474375, -21.679607], + [164.829815, -21.14982], + [164.167995, -20.444747], + [164.029606, -20.105646], + [164.459967, -20.120012], + [165.020036, -20.459991], + [165.460009, -20.800022], + [165.77999, -21.080005] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Niger", + "SOV_A3": "NER", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Niger", + "ADM0_A3": "NER", + "GEOU_DIF": 0, + "GEOUNIT": "Niger", + "GU_A3": "NER", + "SU_DIF": 0, + "SUBUNIT": "Niger", + "SU_A3": "NER", + "BRK_DIFF": 0, + "NAME": "Niger", + "NAME_LONG": "Niger", + "BRK_A3": "NER", + "BRK_NAME": "Niger", + "BRK_GROUP": null, + "ABBREV": "Niger", + "POSTAL": "NE", + "FORMAL_EN": "Republic of Niger", + "FORMAL_FR": null, + "NAME_CIAWF": "Niger", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Niger", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 3, + "MAPCOLOR13": 13, + "POP_EST": 19245344, + "POP_RANK": 14, + "GDP_MD_EST": 20150, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "NG", + "ISO_A2": "NE", + "ISO_A3": "NER", + "ISO_A3_EH": "NER", + "ISO_N3": "562", + "UN_A3": "562", + "WB_A2": "NE", + "WB_A3": "NER", + "WOE_ID": 23424906, + "WOE_ID_EH": 23424906, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NER", + "ADM0_A3_US": "NER", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [0.295646, 11.660167, 15.903247, 23.471668], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [3.61118, 11.660167], + [2.848643, 12.235636], + [2.490164, 12.233052], + [2.154474, 11.94015], + [2.177108, 12.625018], + [1.024103, 12.851826], + [0.993046, 13.33575], + [0.429928, 13.988733], + [0.295646, 14.444235], + [0.374892, 14.928908], + [1.015783, 14.968182], + [1.385528, 15.323561], + [2.749993, 15.409525], + [3.638259, 15.56812], + [3.723422, 16.184284], + [4.27021, 16.852227], + [4.267419, 19.155265], + [5.677566, 19.601207], + [8.572893, 21.565661], + [11.999506, 23.471668], + [13.581425, 23.040506], + [14.143871, 22.491289], + [14.8513, 22.86295], + [15.096888, 21.308519], + [15.47106, 21.04845], + [15.487148, 20.730415], + [15.903247, 20.387619], + [15.685741, 19.95718], + [15.300441, 17.92795], + [15.247731, 16.627306], + [13.97217, 15.68437], + [13.540394, 14.367134], + [13.956699, 13.996691], + [13.954477, 13.353449], + [14.595781, 13.330427], + [14.495787, 12.859396], + [14.213531, 12.802035], + [14.181336, 12.483657], + [13.995353, 12.461565], + [13.318702, 13.556356], + [13.083987, 13.596147], + [12.302071, 13.037189], + [11.527803, 13.32898], + [10.989593, 13.387323], + [10.701032, 13.246918], + [10.114814, 13.277252], + [9.524928, 12.851102], + [9.014933, 12.826659], + [7.804671, 13.343527], + [7.330747, 13.098038], + [6.820442, 13.115091], + [6.445426, 13.492768], + [5.443058, 13.865924], + [4.368344, 13.747482], + [4.107946, 13.531216], + [3.967283, 12.956109], + [3.680634, 12.552903], + [3.61118, 11.660167] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Nigeria", + "SOV_A3": "NGA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Nigeria", + "ADM0_A3": "NGA", + "GEOU_DIF": 0, + "GEOUNIT": "Nigeria", + "GU_A3": "NGA", + "SU_DIF": 0, + "SUBUNIT": "Nigeria", + "SU_A3": "NGA", + "BRK_DIFF": 0, + "NAME": "Nigeria", + "NAME_LONG": "Nigeria", + "BRK_A3": "NGA", + "BRK_NAME": "Nigeria", + "BRK_GROUP": null, + "ABBREV": "Nigeria", + "POSTAL": "NG", + "FORMAL_EN": "Federal Republic of Nigeria", + "FORMAL_FR": null, + "NAME_CIAWF": "Nigeria", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Nigeria", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 2, + "POP_EST": 190632261, + "POP_RANK": 17, + "GDP_MD_EST": 1089000, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "NI", + "ISO_A2": "NG", + "ISO_A3": "NGA", + "ISO_A3_EH": "NGA", + "ISO_N3": "566", + "UN_A3": "566", + "WB_A2": "NG", + "WB_A3": "NGA", + "WOE_ID": 23424908, + "WOE_ID_EH": 23424908, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NGA", + "ADM0_A3_US": "NGA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [2.691702, 4.240594, 14.577178, 13.865924], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [2.691702, 6.258817], + [2.749063, 7.870734], + [2.723793, 8.506845], + [2.912308, 9.137608], + [3.220352, 9.444153], + [3.705438, 10.06321], + [3.60007, 10.332186], + [3.797112, 10.734746], + [3.572216, 11.327939], + [3.61118, 11.660167], + [3.680634, 12.552903], + [3.967283, 12.956109], + [4.107946, 13.531216], + [4.368344, 13.747482], + [5.443058, 13.865924], + [6.445426, 13.492768], + [6.820442, 13.115091], + [7.330747, 13.098038], + [7.804671, 13.343527], + [9.014933, 12.826659], + [9.524928, 12.851102], + [10.114814, 13.277252], + [10.701032, 13.246918], + [10.989593, 13.387323], + [11.527803, 13.32898], + [12.302071, 13.037189], + [13.083987, 13.596147], + [13.318702, 13.556356], + [13.995353, 12.461565], + [14.181336, 12.483657], + [14.577178, 12.085361], + [14.468192, 11.904752], + [14.415379, 11.572369], + [13.57295, 10.798566], + [13.308676, 10.160362], + [13.1676, 9.640626], + [12.955468, 9.417772], + [12.753672, 8.717763], + [12.218872, 8.305824], + [12.063946, 7.799808], + [11.839309, 7.397042], + [11.745774, 6.981383], + [11.058788, 6.644427], + [10.497375, 7.055358], + [10.118277, 7.03877], + [9.522706, 6.453482], + [9.233163, 6.444491], + [8.757533, 5.479666], + [8.500288, 4.771983], + [7.462108, 4.412108], + [7.082596, 4.464689], + [6.698072, 4.240594], + [5.898173, 4.262453], + [5.362805, 4.887971], + [5.033574, 5.611802], + [4.325607, 6.270651], + [3.57418, 6.2583], + [2.691702, 6.258817] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Nicaragua", + "SOV_A3": "NIC", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Nicaragua", + "ADM0_A3": "NIC", + "GEOU_DIF": 0, + "GEOUNIT": "Nicaragua", + "GU_A3": "NIC", + "SU_DIF": 0, + "SUBUNIT": "Nicaragua", + "SU_A3": "NIC", + "BRK_DIFF": 0, + "NAME": "Nicaragua", + "NAME_LONG": "Nicaragua", + "BRK_A3": "NIC", + "BRK_NAME": "Nicaragua", + "BRK_GROUP": null, + "ABBREV": "Nic.", + "POSTAL": "NI", + "FORMAL_EN": "Republic of Nicaragua", + "FORMAL_FR": null, + "NAME_CIAWF": "Nicaragua", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Nicaragua", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 9, + "POP_EST": 6025951, + "POP_RANK": 13, + "GDP_MD_EST": 33550, + "POP_YEAR": 2017, + "LASTCENSUS": 2005, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "NU", + "ISO_A2": "NI", + "ISO_A3": "NIC", + "ISO_A3_EH": "NIC", + "ISO_N3": "558", + "UN_A3": "558", + "WB_A2": "NI", + "WB_A3": "NIC", + "WOE_ID": 23424915, + "WOE_ID_EH": 23424915, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NIC", + "ADM0_A3_US": "NIC", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-87.668493, 10.726839, -83.147219, 15.016267], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-83.655612, 10.938764], + [-83.895054, 10.726839], + [-84.190179, 10.79345], + [-84.355931, 10.999226], + [-84.673069, 11.082657], + [-84.903003, 10.952303], + [-85.561852, 11.217119], + [-85.71254, 11.088445], + [-86.058488, 11.403439], + [-86.52585, 11.806877], + [-86.745992, 12.143962], + [-87.167516, 12.458258], + [-87.668493, 12.90991], + [-87.557467, 13.064552], + [-87.392386, 12.914018], + [-87.316654, 12.984686], + [-87.005769, 13.025794], + [-86.880557, 13.254204], + [-86.733822, 13.263093], + [-86.755087, 13.754845], + [-86.520708, 13.778487], + [-86.312142, 13.771356], + [-86.096264, 14.038187], + [-85.801295, 13.836055], + [-85.698665, 13.960078], + [-85.514413, 14.079012], + [-85.165365, 14.35437], + [-85.148751, 14.560197], + [-85.052787, 14.551541], + [-84.924501, 14.790493], + [-84.820037, 14.819587], + [-84.649582, 14.666805], + [-84.449336, 14.621614], + [-84.228342, 14.748764], + [-83.975721, 14.749436], + [-83.628585, 14.880074], + [-83.489989, 15.016267], + [-83.147219, 14.995829], + [-83.233234, 14.899866], + [-83.284162, 14.676624], + [-83.182126, 14.310703], + [-83.4125, 13.970078], + [-83.519832, 13.567699], + [-83.552207, 13.127054], + [-83.498515, 12.869292], + [-83.473323, 12.419087], + [-83.626104, 12.32085], + [-83.719613, 11.893124], + [-83.650858, 11.629032], + [-83.85547, 11.373311], + [-83.808936, 11.103044], + [-83.655612, 10.938764] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Netherlands", + "SOV_A3": "NL1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "Netherlands", + "ADM0_A3": "NLD", + "GEOU_DIF": 0, + "GEOUNIT": "Netherlands", + "GU_A3": "NLD", + "SU_DIF": 0, + "SUBUNIT": "Netherlands", + "SU_A3": "NLD", + "BRK_DIFF": 0, + "NAME": "Netherlands", + "NAME_LONG": "Netherlands", + "BRK_A3": "NLD", + "BRK_NAME": "Netherlands", + "BRK_GROUP": null, + "ABBREV": "Neth.", + "POSTAL": "NL", + "FORMAL_EN": "Kingdom of the Netherlands", + "FORMAL_FR": null, + "NAME_CIAWF": "Netherlands", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Netherlands", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 9, + "POP_EST": 17084719, + "POP_RANK": 14, + "GDP_MD_EST": 870800, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "NL", + "ISO_A2": "NL", + "ISO_A3": "NLD", + "ISO_A3_EH": "NLD", + "ISO_N3": "528", + "UN_A3": "528", + "WB_A2": "NL", + "WB_A3": "NLD", + "WOE_ID": -90, + "WOE_ID_EH": 23424909, + "WOE_NOTE": "Doesn't include new former units of Netherlands Antilles (24549811, 24549808, and 24549809)", + "ADM0_A3_IS": "NLD", + "ADM0_A3_US": "NLD", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Western Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [3.314971, 50.803721, 7.092053, 53.510403], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.156658, 50.803721], + [5.606976, 51.037298], + [4.973991, 51.475024], + [4.047071, 51.267259], + [3.314971, 51.345755], + [3.315011, 51.345777], + [3.830289, 51.620545], + [4.705997, 53.091798], + [6.074183, 53.510403], + [6.90514, 53.482162], + [7.092053, 53.144043], + [6.84287, 52.22844], + [6.589397, 51.852029], + [5.988658, 51.851616], + [6.156658, 50.803721] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Norway", + "SOV_A3": "NOR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Norway", + "ADM0_A3": "NOR", + "GEOU_DIF": 0, + "GEOUNIT": "Norway", + "GU_A3": "NOR", + "SU_DIF": 0, + "SUBUNIT": "Norway", + "SU_A3": "NOR", + "BRK_DIFF": 0, + "NAME": "Norway", + "NAME_LONG": "Norway", + "BRK_A3": "NOR", + "BRK_NAME": "Norway", + "BRK_GROUP": null, + "ABBREV": "Nor.", + "POSTAL": "N", + "FORMAL_EN": "Kingdom of Norway", + "FORMAL_FR": null, + "NAME_CIAWF": "Norway", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Norway", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 8, + "MAPCOLOR13": 12, + "POP_EST": 5320045, + "POP_RANK": 13, + "GDP_MD_EST": 364700, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "-99", + "ISO_A3": "-99", + "ISO_A3_EH": "-99", + "ISO_N3": "-99", + "UN_A3": "-99", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": -90, + "WOE_ID_EH": 23424910, + "WOE_NOTE": "Does not include Svalbard, Jan Mayen, or Bouvet Islands (28289410).", + "ADM0_A3_IS": "NOR", + "ADM0_A3_US": "NOR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [4.992078, 58.078884, 31.293418, 80.657144], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [28.59193, 69.064777], + [29.015573, 69.766491], + [27.732292, 70.164193], + [26.179622, 69.825299], + [25.689213, 69.092114], + [24.735679, 68.649557], + [23.66205, 68.891247], + [22.356238, 68.841741], + [21.244936, 69.370443], + [20.645593, 69.106247], + [20.025269, 69.065139], + [19.87856, 68.407194], + [17.993868, 68.567391], + [17.729182, 68.010552], + [16.768879, 68.013937], + [16.108712, 67.302456], + [15.108411, 66.193867], + [13.55569, 64.787028], + [13.919905, 64.445421], + [13.571916, 64.049114], + [12.579935, 64.066219], + [11.930569, 63.128318], + [11.992064, 61.800362], + [12.631147, 61.293572], + [12.300366, 60.117933], + [11.468272, 59.432393], + [11.027369, 58.856149], + [10.356557, 59.469807], + [8.382, 58.313288], + [7.048748, 58.078884], + [5.665835, 58.588155], + [5.308234, 59.663232], + [4.992078, 61.970998], + [5.9129, 62.614473], + [8.553411, 63.454008], + [10.527709, 64.486038], + [12.358347, 65.879726], + [14.761146, 67.810642], + [16.435927, 68.563205], + [19.184028, 69.817444], + [21.378416, 70.255169], + [23.023742, 70.202072], + [24.546543, 71.030497], + [26.37005, 70.986262], + [28.165547, 71.185474], + [31.293418, 70.453788], + [30.005435, 70.186259], + [31.101042, 69.558101], + [29.39955, 69.15692], + [28.59193, 69.064777] + ] + ], + [ + [ + [24.72412, 77.85385], + [22.49032, 77.44493], + [20.72601, 77.67704], + [21.41611, 77.93504], + [20.8119, 78.25463], + [22.88426, 78.45494], + [23.28134, 78.07954], + [24.72412, 77.85385] + ] + ], + [ + [ + [18.25183, 79.70175], + [21.54383, 78.95611], + [19.02737, 78.5626], + [18.47172, 77.82669], + [17.59441, 77.63796], + [17.1182, 76.80941], + [15.91315, 76.77045], + [13.76259, 77.38035], + [14.66956, 77.73565], + [13.1706, 78.02493], + [11.22231, 78.8693], + [10.44453, 79.65239], + [13.17077, 80.01046], + [13.71852, 79.66039], + [15.14282, 79.67431], + [15.52255, 80.01608], + [16.99085, 80.05086], + [18.25183, 79.70175] + ] + ], + [ + [ + [25.447625, 80.40734], + [27.407506, 80.056406], + [25.924651, 79.517834], + [23.024466, 79.400012], + [20.075188, 79.566823], + [19.897266, 79.842362], + [18.462264, 79.85988], + [17.368015, 80.318896], + [20.455992, 80.598156], + [21.907945, 80.357679], + [22.919253, 80.657144], + [25.447625, 80.40734] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Nepal", + "SOV_A3": "NPL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Nepal", + "ADM0_A3": "NPL", + "GEOU_DIF": 0, + "GEOUNIT": "Nepal", + "GU_A3": "NPL", + "SU_DIF": 0, + "SUBUNIT": "Nepal", + "SU_A3": "NPL", + "BRK_DIFF": 0, + "NAME": "Nepal", + "NAME_LONG": "Nepal", + "BRK_A3": "NPL", + "BRK_NAME": "Nepal", + "BRK_GROUP": null, + "ABBREV": "Nepal", + "POSTAL": "NP", + "FORMAL_EN": "Nepal", + "FORMAL_FR": null, + "NAME_CIAWF": "Nepal", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Nepal", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 12, + "POP_EST": 29384297, + "POP_RANK": 15, + "GDP_MD_EST": 71520, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "NP", + "ISO_A2": "NP", + "ISO_A3": "NPL", + "ISO_A3_EH": "NPL", + "ISO_N3": "524", + "UN_A3": "524", + "WB_A2": "NP", + "WB_A3": "NPL", + "WOE_ID": 23424911, + "WOE_ID_EH": 23424911, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NPL", + "ADM0_A3_US": "NPL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [80.088425, 26.397898, 88.174804, 30.422717], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [81.111256, 30.183481], + [81.525804, 30.422717], + [82.327513, 30.115268], + [83.337115, 29.463732], + [83.898993, 29.320226], + [84.23458, 28.839894], + [85.011638, 28.642774], + [85.82332, 28.203576], + [86.954517, 27.974262], + [88.120441, 27.876542], + [88.043133, 27.445819], + [88.174804, 26.810405], + [88.060238, 26.414615], + [87.227472, 26.397898], + [86.024393, 26.630985], + [85.251779, 26.726198], + [84.675018, 27.234901], + [83.304249, 27.364506], + [81.999987, 27.925479], + [81.057203, 28.416095], + [80.088425, 28.79447], + [80.476721, 29.729865], + [81.111256, 30.183481] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "New Zealand", + "SOV_A3": "NZ1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "New Zealand", + "ADM0_A3": "NZL", + "GEOU_DIF": 0, + "GEOUNIT": "New Zealand", + "GU_A3": "NZL", + "SU_DIF": 0, + "SUBUNIT": "New Zealand", + "SU_A3": "NZL", + "BRK_DIFF": 0, + "NAME": "New Zealand", + "NAME_LONG": "New Zealand", + "BRK_A3": "NZL", + "BRK_NAME": "New Zealand", + "BRK_GROUP": null, + "ABBREV": "N.Z.", + "POSTAL": "NZ", + "FORMAL_EN": "New Zealand", + "FORMAL_FR": null, + "NAME_CIAWF": "New Zealand", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "New Zealand", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 4, + "POP_EST": 4510327, + "POP_RANK": 12, + "GDP_MD_EST": 174800, + "POP_YEAR": 2017, + "LASTCENSUS": 2006, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "NZ", + "ISO_A2": "NZ", + "ISO_A3": "NZL", + "ISO_A3_EH": "NZL", + "ISO_N3": "554", + "UN_A3": "554", + "WB_A2": "NZ", + "WB_A3": "NZL", + "WOE_ID": 23424916, + "WOE_ID_EH": 23424916, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "NZL", + "ADM0_A3_US": "NZL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Australia and New Zealand", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 6.7 + }, + "bbox": [166.509144, -46.641235, 178.517094, -34.450662], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [173.020375, -40.919052], + [173.247234, -41.331999], + [173.958405, -40.926701], + [174.247587, -41.349155], + [174.248517, -41.770008], + [173.876447, -42.233184], + [173.22274, -42.970038], + [172.711246, -43.372288], + [173.080113, -43.853344], + [172.308584, -43.865694], + [171.452925, -44.242519], + [171.185138, -44.897104], + [170.616697, -45.908929], + [169.831422, -46.355775], + [169.332331, -46.641235], + [168.411354, -46.619945], + [167.763745, -46.290197], + [166.676886, -46.219917], + [166.509144, -45.852705], + [167.046424, -45.110941], + [168.303763, -44.123973], + [168.949409, -43.935819], + [169.667815, -43.555326], + [170.52492, -43.031688], + [171.12509, -42.512754], + [171.569714, -41.767424], + [171.948709, -41.514417], + [172.097227, -40.956104], + [172.79858, -40.493962], + [173.020375, -40.919052] + ] + ], + [ + [ + [174.612009, -36.156397], + [175.336616, -37.209098], + [175.357596, -36.526194], + [175.808887, -36.798942], + [175.95849, -37.555382], + [176.763195, -37.881253], + [177.438813, -37.961248], + [178.010354, -37.579825], + [178.517094, -37.695373], + [178.274731, -38.582813], + [177.97046, -39.166343], + [177.206993, -39.145776], + [176.939981, -39.449736], + [177.032946, -39.879943], + [176.885824, -40.065978], + [176.508017, -40.604808], + [176.01244, -41.289624], + [175.239567, -41.688308], + [175.067898, -41.425895], + [174.650973, -41.281821], + [175.22763, -40.459236], + [174.900157, -39.908933], + [173.824047, -39.508854], + [173.852262, -39.146602], + [174.574802, -38.797683], + [174.743474, -38.027808], + [174.697017, -37.381129], + [174.292028, -36.711092], + [174.319004, -36.534824], + [173.840997, -36.121981], + [173.054171, -35.237125], + [172.636005, -34.529107], + [173.007042, -34.450662], + [173.551298, -35.006183], + [174.32939, -35.265496], + [174.612009, -36.156397] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Oman", + "SOV_A3": "OMN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Oman", + "ADM0_A3": "OMN", + "GEOU_DIF": 0, + "GEOUNIT": "Oman", + "GU_A3": "OMN", + "SU_DIF": 0, + "SUBUNIT": "Oman", + "SU_A3": "OMN", + "BRK_DIFF": 0, + "NAME": "Oman", + "NAME_LONG": "Oman", + "BRK_A3": "OMN", + "BRK_NAME": "Oman", + "BRK_GROUP": null, + "ABBREV": "Oman", + "POSTAL": "OM", + "FORMAL_EN": "Sultanate of Oman", + "FORMAL_FR": null, + "NAME_CIAWF": "Oman", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Oman", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 6, + "POP_EST": 3424386, + "POP_RANK": 12, + "GDP_MD_EST": 173100, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "MU", + "ISO_A2": "OM", + "ISO_A3": "OMN", + "ISO_A3_EH": "OMN", + "ISO_N3": "512", + "UN_A3": "512", + "WB_A2": "OM", + "WB_A3": "OMN", + "WOE_ID": 23424898, + "WOE_ID_EH": 23424898, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "OMN", + "ADM0_A3_US": "OMN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [52.00001, 16.651051, 59.80806, 26.395934], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [56.261042, 25.714606], + [56.070821, 26.055464], + [56.362017, 26.395934], + [56.485679, 26.309118], + [56.391421, 25.895991], + [56.261042, 25.714606] + ] + ], + [ + [ + [55.208341, 22.70833], + [55.234489, 23.110993], + [55.525841, 23.524869], + [55.528632, 23.933604], + [55.981214, 24.130543], + [55.804119, 24.269604], + [55.886233, 24.920831], + [56.396847, 24.924732], + [56.84514, 24.241673], + [57.403453, 23.878594], + [58.136948, 23.747931], + [58.729211, 23.565668], + [59.180502, 22.992395], + [59.450098, 22.660271], + [59.80806, 22.533612], + [59.806148, 22.310525], + [59.442191, 21.714541], + [59.282408, 21.433886], + [58.861141, 21.114035], + [58.487986, 20.428986], + [58.034318, 20.481437], + [57.826373, 20.243002], + [57.665762, 19.736005], + [57.7887, 19.06757], + [57.694391, 18.94471], + [57.234264, 18.947991], + [56.609651, 18.574267], + [56.512189, 18.087113], + [56.283521, 17.876067], + [55.661492, 17.884128], + [55.269939, 17.632309], + [55.2749, 17.228354], + [54.791002, 16.950697], + [54.239253, 17.044981], + [53.570508, 16.707663], + [53.108573, 16.651051], + [52.782184, 17.349742], + [52.00001, 19.000003], + [54.999982, 19.999994], + [55.666659, 22.000001], + [55.208341, 22.70833] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Pakistan", + "SOV_A3": "PAK", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Pakistan", + "ADM0_A3": "PAK", + "GEOU_DIF": 0, + "GEOUNIT": "Pakistan", + "GU_A3": "PAK", + "SU_DIF": 0, + "SUBUNIT": "Pakistan", + "SU_A3": "PAK", + "BRK_DIFF": 0, + "NAME": "Pakistan", + "NAME_LONG": "Pakistan", + "BRK_A3": "PAK", + "BRK_NAME": "Pakistan", + "BRK_GROUP": null, + "ABBREV": "Pak.", + "POSTAL": "PK", + "FORMAL_EN": "Islamic Republic of Pakistan", + "FORMAL_FR": null, + "NAME_CIAWF": "Pakistan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Pakistan", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 11, + "POP_EST": 204924861, + "POP_RANK": 17, + "GDP_MD_EST": 988200, + "POP_YEAR": 2017, + "LASTCENSUS": 1998, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "PK", + "ISO_A2": "PK", + "ISO_A3": "PAK", + "ISO_A3_EH": "PAK", + "ISO_N3": "586", + "UN_A3": "586", + "WB_A2": "PK", + "WB_A3": "PAK", + "WOE_ID": 23424922, + "WOE_ID_EH": 23424922, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PAK", + "ADM0_A3_US": "PAK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Southern Asia", + "REGION_WB": "South Asia", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [60.874248, 23.691965, 77.837451, 37.133031], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [60.874248, 29.829239], + [62.549857, 29.318572], + [63.550261, 29.468331], + [64.148002, 29.340819], + [64.350419, 29.560031], + [65.046862, 29.472181], + [66.346473, 29.887943], + [66.381458, 30.738899], + [66.938891, 31.304911], + [67.683394, 31.303154], + [67.792689, 31.58293], + [68.556932, 31.71331], + [68.926677, 31.620189], + [69.317764, 31.901412], + [69.262522, 32.501944], + [69.687147, 33.105499], + [70.323594, 33.358533], + [69.930543, 34.02012], + [70.881803, 33.988856], + [71.156773, 34.348911], + [71.115019, 34.733126], + [71.613076, 35.153203], + [71.498768, 35.650563], + [71.262348, 36.074388], + [71.846292, 36.509942], + [72.920025, 36.720007], + [74.067552, 36.836176], + [74.575893, 37.020841], + [75.158028, 37.133031], + [75.896897, 36.666806], + [76.192848, 35.898403], + [77.837451, 35.49401], + [76.871722, 34.653544], + [75.757061, 34.504923], + [74.240203, 34.748887], + [73.749948, 34.317699], + [74.104294, 33.441473], + [74.451559, 32.7649], + [75.258642, 32.271105], + [74.405929, 31.692639], + [74.42138, 30.979815], + [73.450638, 29.976413], + [72.823752, 28.961592], + [71.777666, 27.91318], + [70.616496, 27.989196], + [69.514393, 26.940966], + [70.168927, 26.491872], + [70.282873, 25.722229], + [70.844699, 25.215102], + [71.04324, 24.356524], + [68.842599, 24.359134], + [68.176645, 23.691965], + [67.443667, 23.944844], + [67.145442, 24.663611], + [66.372828, 25.425141], + [64.530408, 25.237039], + [62.905701, 25.218409], + [61.497363, 25.078237], + [61.874187, 26.239975], + [63.316632, 26.756532], + [63.233898, 27.217047], + [62.755426, 27.378923], + [62.72783, 28.259645], + [61.771868, 28.699334], + [61.369309, 29.303276], + [60.874248, 29.829239] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Panama", + "SOV_A3": "PAN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Panama", + "ADM0_A3": "PAN", + "GEOU_DIF": 0, + "GEOUNIT": "Panama", + "GU_A3": "PAN", + "SU_DIF": 0, + "SUBUNIT": "Panama", + "SU_A3": "PAN", + "BRK_DIFF": 0, + "NAME": "Panama", + "NAME_LONG": "Panama", + "BRK_A3": "PAN", + "BRK_NAME": "Panama", + "BRK_GROUP": null, + "ABBREV": "Pan.", + "POSTAL": "PA", + "FORMAL_EN": "Republic of Panama", + "FORMAL_FR": null, + "NAME_CIAWF": "Panama", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Panama", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 6, + "MAPCOLOR13": 3, + "POP_EST": 3753142, + "POP_RANK": 12, + "GDP_MD_EST": 93120, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "PM", + "ISO_A2": "PA", + "ISO_A3": "PAN", + "ISO_A3_EH": "PAN", + "ISO_N3": "591", + "UN_A3": "591", + "WB_A2": "PA", + "WB_A3": "PAN", + "WOE_ID": 23424924, + "WOE_ID_EH": 23424924, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PAN", + "ADM0_A3_US": "PAN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-82.965783, 7.220541, -77.242566, 9.61161], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-77.353361, 8.670505], + [-77.474723, 8.524286], + [-77.242566, 7.935278], + [-77.431108, 7.638061], + [-77.753414, 7.70984], + [-77.881571, 7.223771], + [-78.214936, 7.512255], + [-78.429161, 8.052041], + [-78.182096, 8.319182], + [-78.435465, 8.387705], + [-78.622121, 8.718124], + [-79.120307, 8.996092], + [-79.557877, 8.932375], + [-79.760578, 8.584515], + [-80.164481, 8.333316], + [-80.382659, 8.298409], + [-80.480689, 8.090308], + [-80.00369, 7.547524], + [-80.276671, 7.419754], + [-80.421158, 7.271572], + [-80.886401, 7.220541], + [-81.059543, 7.817921], + [-81.189716, 7.647906], + [-81.519515, 7.70661], + [-81.721311, 8.108963], + [-82.131441, 8.175393], + [-82.390934, 8.292362], + [-82.820081, 8.290864], + [-82.850958, 8.073823], + [-82.965783, 8.225028], + [-82.913176, 8.423517], + [-82.829771, 8.626295], + [-82.868657, 8.807266], + [-82.719183, 8.925709], + [-82.927155, 9.07433], + [-82.932891, 9.476812], + [-82.546196, 9.566135], + [-82.187123, 9.207449], + [-82.207586, 8.995575], + [-81.808567, 8.950617], + [-81.714154, 9.031955], + [-81.439287, 8.786234], + [-80.947302, 8.858504], + [-80.521901, 9.111072], + [-79.9146, 9.312765], + [-79.573303, 9.61161], + [-79.021192, 9.552931], + [-79.05845, 9.454565], + [-78.500888, 9.420459], + [-78.055928, 9.24773], + [-77.729514, 8.946844], + [-77.353361, 8.670505] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Peru", + "SOV_A3": "PER", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Peru", + "ADM0_A3": "PER", + "GEOU_DIF": 0, + "GEOUNIT": "Peru", + "GU_A3": "PER", + "SU_DIF": 0, + "SUBUNIT": "Peru", + "SU_A3": "PER", + "BRK_DIFF": 0, + "NAME": "Peru", + "NAME_LONG": "Peru", + "BRK_A3": "PER", + "BRK_NAME": "Peru", + "BRK_GROUP": null, + "ABBREV": "Peru", + "POSTAL": "PE", + "FORMAL_EN": "Republic of Peru", + "FORMAL_FR": null, + "NAME_CIAWF": "Peru", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Peru", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 11, + "POP_EST": 31036656, + "POP_RANK": 15, + "GDP_MD_EST": 410400, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "PE", + "ISO_A2": "PE", + "ISO_A3": "PER", + "ISO_A3_EH": "PER", + "ISO_N3": "604", + "UN_A3": "604", + "WB_A2": "PE", + "WB_A3": "PER", + "WOE_ID": 23424919, + "WOE_ID_EH": 23424919, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PER", + "ADM0_A3_US": "PER", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [-81.410943, -18.347975, -68.66508, -0.057205], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-69.529678, -10.951734], + [-68.66508, -12.5613], + [-68.88008, -12.899729], + [-68.929224, -13.602684], + [-68.948887, -14.453639], + [-69.339535, -14.953195], + [-69.160347, -15.323974], + [-69.389764, -15.660129], + [-68.959635, -16.500698], + [-69.590424, -17.580012], + [-69.858444, -18.092694], + [-70.372572, -18.347975], + [-71.37525, -17.773799], + [-71.462041, -17.363488], + [-73.44453, -16.359363], + [-75.237883, -15.265683], + [-76.009205, -14.649286], + [-76.423469, -13.823187], + [-76.259242, -13.535039], + [-77.106192, -12.222716], + [-78.092153, -10.377712], + [-79.036953, -8.386568], + [-79.44592, -7.930833], + [-79.760578, -7.194341], + [-80.537482, -6.541668], + [-81.249996, -6.136834], + [-80.926347, -5.690557], + [-81.410943, -4.736765], + [-81.09967, -4.036394], + [-80.302561, -3.404856], + [-80.184015, -3.821162], + [-80.469295, -4.059287], + [-80.442242, -4.425724], + [-80.028908, -4.346091], + [-79.624979, -4.454198], + [-79.205289, -4.959129], + [-78.639897, -4.547784], + [-78.450684, -3.873097], + [-77.837905, -3.003021], + [-76.635394, -2.608678], + [-75.544996, -1.56161], + [-75.233723, -0.911417], + [-75.373223, -0.152032], + [-75.106625, -0.057205], + [-74.441601, -0.53082], + [-74.122395, -1.002833], + [-73.659504, -1.260491], + [-73.070392, -2.308954], + [-72.325787, -2.434218], + [-71.774761, -2.16979], + [-71.413646, -2.342802], + [-70.813476, -2.256865], + [-70.047709, -2.725156], + [-70.692682, -3.742872], + [-70.394044, -3.766591], + [-69.893635, -4.298187], + [-70.794769, -4.251265], + [-70.928843, -4.401591], + [-71.748406, -4.593983], + [-72.891928, -5.274561], + [-72.964507, -5.741251], + [-73.219711, -6.089189], + [-73.120027, -6.629931], + [-73.724487, -6.918595], + [-73.723401, -7.340999], + [-73.987235, -7.52383], + [-73.571059, -8.424447], + [-73.015383, -9.032833], + [-73.226713, -9.462213], + [-72.563033, -9.520194], + [-72.184891, -10.053598], + [-71.302412, -10.079436], + [-70.481894, -9.490118], + [-70.548686, -11.009147], + [-70.093752, -11.123972], + [-69.529678, -10.951734] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Philippines", + "SOV_A3": "PHL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Philippines", + "ADM0_A3": "PHL", + "GEOU_DIF": 0, + "GEOUNIT": "Philippines", + "GU_A3": "PHL", + "SU_DIF": 0, + "SUBUNIT": "Philippines", + "SU_A3": "PHL", + "BRK_DIFF": 0, + "NAME": "Philippines", + "NAME_LONG": "Philippines", + "BRK_A3": "PHL", + "BRK_NAME": "Philippines", + "BRK_GROUP": null, + "ABBREV": "Phil.", + "POSTAL": "PH", + "FORMAL_EN": "Republic of the Philippines", + "FORMAL_FR": null, + "NAME_CIAWF": "Philippines", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Philippines", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 8, + "POP_EST": 104256076, + "POP_RANK": 17, + "GDP_MD_EST": 801900, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "RP", + "ISO_A2": "PH", + "ISO_A3": "PHL", + "ISO_A3_EH": "PHL", + "ISO_N3": "608", + "UN_A3": "608", + "WB_A2": "PH", + "WB_A3": "PHL", + "WOE_ID": 23424934, + "WOE_ID_EH": 23424934, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PHL", + "ADM0_A3_US": "PHL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [117.174275, 5.581003, 126.537424, 18.505227], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [126.376814, 8.414706], + [126.478513, 7.750354], + [126.537424, 7.189381], + [126.196773, 6.274294], + [125.831421, 7.293715], + [125.363852, 6.786485], + [125.683161, 6.049657], + [125.396512, 5.581003], + [124.219788, 6.161355], + [123.93872, 6.885136], + [124.243662, 7.36061], + [123.610212, 7.833527], + [123.296071, 7.418876], + [122.825506, 7.457375], + [122.085499, 6.899424], + [121.919928, 7.192119], + [122.312359, 8.034962], + [122.942398, 8.316237], + [123.487688, 8.69301], + [123.841154, 8.240324], + [124.60147, 8.514158], + [124.764612, 8.960409], + [125.471391, 8.986997], + [125.412118, 9.760335], + [126.222714, 9.286074], + [126.306637, 8.782487], + [126.376814, 8.414706] + ] + ], + [ + [ + [123.982438, 10.278779], + [123.623183, 9.950091], + [123.309921, 9.318269], + [122.995883, 9.022189], + [122.380055, 9.713361], + [122.586089, 9.981045], + [122.837081, 10.261157], + [122.947411, 10.881868], + [123.49885, 10.940624], + [123.337774, 10.267384], + [124.077936, 11.232726], + [123.982438, 10.278779] + ] + ], + [ + [ + [118.504581, 9.316383], + [117.174275, 8.3675], + [117.664477, 9.066889], + [118.386914, 9.6845], + [118.987342, 10.376292], + [119.511496, 11.369668], + [119.689677, 10.554291], + [119.029458, 10.003653], + [118.504581, 9.316383] + ] + ], + [ + [ + [121.883548, 11.891755], + [122.483821, 11.582187], + [123.120217, 11.58366], + [123.100838, 11.165934], + [122.637714, 10.741308], + [122.00261, 10.441017], + [121.967367, 10.905691], + [122.03837, 11.415841], + [121.883548, 11.891755] + ] + ], + [ + [ + [125.502552, 12.162695], + [125.783465, 11.046122], + [125.011884, 11.311455], + [125.032761, 10.975816], + [125.277449, 10.358722], + [124.801819, 10.134679], + [124.760168, 10.837995], + [124.459101, 10.88993], + [124.302522, 11.495371], + [124.891013, 11.415583], + [124.87799, 11.79419], + [124.266762, 12.557761], + [125.227116, 12.535721], + [125.502552, 12.162695] + ] + ], + [ + [ + [121.527394, 13.06959], + [121.26219, 12.20556], + [120.833896, 12.704496], + [120.323436, 13.466413], + [121.180128, 13.429697], + [121.527394, 13.06959] + ] + ], + [ + [ + [121.321308, 18.504065], + [121.937601, 18.218552], + [122.246006, 18.47895], + [122.336957, 18.224883], + [122.174279, 17.810283], + [122.515654, 17.093505], + [122.252311, 16.262444], + [121.662786, 15.931018], + [121.50507, 15.124814], + [121.728829, 14.328376], + [122.258925, 14.218202], + [122.701276, 14.336541], + [123.950295, 13.782131], + [123.855107, 13.237771], + [124.181289, 12.997527], + [124.077419, 12.536677], + [123.298035, 13.027526], + [122.928652, 13.55292], + [122.671355, 13.185836], + [122.03465, 13.784482], + [121.126385, 13.636687], + [120.628637, 13.857656], + [120.679384, 14.271016], + [120.991819, 14.525393], + [120.693336, 14.756671], + [120.564145, 14.396279], + [120.070429, 14.970869], + [119.920929, 15.406347], + [119.883773, 16.363704], + [120.286488, 16.034629], + [120.390047, 17.599081], + [120.715867, 18.505227], + [121.321308, 18.504065] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Papua New Guinea", + "SOV_A3": "PNG", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Papua New Guinea", + "ADM0_A3": "PNG", + "GEOU_DIF": 0, + "GEOUNIT": "Papua New Guinea", + "GU_A3": "PNG", + "SU_DIF": 1, + "SUBUNIT": "Papua New Guinea", + "SU_A3": "PN1", + "BRK_DIFF": 0, + "NAME": "Papua New Guinea", + "NAME_LONG": "Papua New Guinea", + "BRK_A3": "PN1", + "BRK_NAME": "Papua New Guinea", + "BRK_GROUP": null, + "ABBREV": "P.N.G.", + "POSTAL": "PG", + "FORMAL_EN": "Independent State of Papua New Guinea", + "FORMAL_FR": null, + "NAME_CIAWF": "Papua New Guinea", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Papua New Guinea", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 1, + "POP_EST": 6909701, + "POP_RANK": 13, + "GDP_MD_EST": 28020, + "POP_YEAR": 2017, + "LASTCENSUS": 2000, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "PP", + "ISO_A2": "PG", + "ISO_A3": "PNG", + "ISO_A3_EH": "PNG", + "ISO_N3": "598", + "UN_A3": "598", + "WB_A2": "PG", + "WB_A3": "PNG", + "WOE_ID": 23424926, + "WOE_ID_EH": 23424926, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PNG", + "ADM0_A3_US": "PNG", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Melanesia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 16, + "LONG_LEN": 16, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2.5, + "MAX_LABEL": 7.5 + }, + "bbox": [141.00021, -10.652476, 156.019965, -2.500002], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [141.033852, -9.117893], + [141.017057, -5.859022], + [141.00021, -2.600151], + [142.735247, -3.289153], + [144.583971, -3.861418], + [145.27318, -4.373738], + [145.829786, -4.876498], + [145.981922, -5.465609], + [147.648073, -6.083659], + [147.891108, -6.614015], + [146.970905, -6.721657], + [147.191874, -7.388024], + [148.084636, -8.044108], + [148.734105, -9.104664], + [149.306835, -9.071436], + [149.266631, -9.514406], + [150.038728, -9.684318], + [149.738798, -9.872937], + [150.801628, -10.293687], + [150.690575, -10.582713], + [150.028393, -10.652476], + [149.78231, -10.393267], + [148.923138, -10.280923], + [147.913018, -10.130441], + [147.135443, -9.492444], + [146.567881, -8.942555], + [146.048481, -8.067414], + [144.744168, -7.630128], + [143.897088, -7.91533], + [143.286376, -8.245491], + [143.413913, -8.983069], + [142.628431, -9.326821], + [142.068259, -9.159596], + [141.033852, -9.117893] + ] + ], + [ + [ + [155.880026, -6.819997], + [155.599991, -6.919991], + [155.166994, -6.535931], + [154.729192, -5.900828], + [154.514114, -5.139118], + [154.652504, -5.042431], + [154.759991, -5.339984], + [155.062918, -5.566792], + [155.547746, -6.200655], + [156.019965, -6.540014], + [155.880026, -6.819997] + ] + ], + [ + [ + [151.982796, -5.478063], + [151.459107, -5.56028], + [151.30139, -5.840728], + [150.754447, -6.083763], + [150.241197, -6.317754], + [149.709963, -6.316513], + [148.890065, -6.02604], + [148.318937, -5.747142], + [148.401826, -5.437756], + [149.298412, -5.583742], + [149.845562, -5.505503], + [149.99625, -5.026101], + [150.139756, -5.001348], + [150.236908, -5.53222], + [150.807467, -5.455842], + [151.089672, -5.113693], + [151.647881, -4.757074], + [151.537862, -4.167807], + [152.136792, -4.14879], + [152.338743, -4.312966], + [152.318693, -4.867661], + [151.982796, -5.478063] + ] + ], + [ + [ + [153.140038, -4.499983], + [152.827292, -4.766427], + [152.638673, -4.176127], + [152.406026, -3.789743], + [151.953237, -3.462062], + [151.384279, -3.035422], + [150.66205, -2.741486], + [150.939965, -2.500002], + [151.479984, -2.779985], + [151.820015, -2.999972], + [152.239989, -3.240009], + [152.640017, -3.659983], + [153.019994, -3.980015], + [153.140038, -4.499983] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Poland", + "SOV_A3": "POL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Poland", + "ADM0_A3": "POL", + "GEOU_DIF": 0, + "GEOUNIT": "Poland", + "GU_A3": "POL", + "SU_DIF": 0, + "SUBUNIT": "Poland", + "SU_A3": "POL", + "BRK_DIFF": 0, + "NAME": "Poland", + "NAME_LONG": "Poland", + "BRK_A3": "POL", + "BRK_NAME": "Poland", + "BRK_GROUP": null, + "ABBREV": "Pol.", + "POSTAL": "PL", + "FORMAL_EN": "Republic of Poland", + "FORMAL_FR": null, + "NAME_CIAWF": "Poland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Poland", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 7, + "MAPCOLOR9": 1, + "MAPCOLOR13": 2, + "POP_EST": 38476269, + "POP_RANK": 15, + "GDP_MD_EST": 1052000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "PL", + "ISO_A2": "PL", + "ISO_A3": "POL", + "ISO_A3_EH": "POL", + "ISO_N3": "616", + "UN_A3": "616", + "WB_A2": "PL", + "WB_A3": "POL", + "WOE_ID": 23424923, + "WOE_ID_EH": 23424923, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "POL", + "ADM0_A3_US": "POL", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [14.074521, 49.027395, 24.029986, 54.851536], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.484128, 53.912498], + [23.527536, 53.470122], + [23.804935, 53.089731], + [23.799199, 52.691099], + [23.199494, 52.486977], + [23.508002, 52.023647], + [23.527071, 51.578454], + [24.029986, 50.705407], + [23.922757, 50.424881], + [23.426508, 50.308506], + [22.51845, 49.476774], + [22.776419, 49.027395], + [22.558138, 49.085738], + [21.607808, 49.470107], + [20.887955, 49.328772], + [20.415839, 49.431453], + [19.825023, 49.217125], + [19.320713, 49.571574], + [18.909575, 49.435846], + [18.853144, 49.49623], + [18.392914, 49.988629], + [17.649445, 50.049038], + [17.554567, 50.362146], + [16.868769, 50.473974], + [16.719476, 50.215747], + [16.176253, 50.422607], + [16.238627, 50.697733], + [15.490972, 50.78473], + [15.016996, 51.106674], + [14.607098, 51.745188], + [14.685026, 52.089947], + [14.4376, 52.62485], + [14.074521, 52.981263], + [14.353315, 53.248171], + [14.119686, 53.757029], + [14.8029, 54.050706], + [16.363477, 54.513159], + [17.622832, 54.851536], + [18.620859, 54.682606], + [18.696255, 54.438719], + [19.66064, 54.426084], + [20.892245, 54.312525], + [22.731099, 54.327537], + [23.243987, 54.220567], + [23.484128, 53.912498] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "United States of America", + "SOV_A3": "US1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Dependency", + "ADMIN": "Puerto Rico", + "ADM0_A3": "PRI", + "GEOU_DIF": 0, + "GEOUNIT": "Puerto Rico", + "GU_A3": "PRI", + "SU_DIF": 0, + "SUBUNIT": "Puerto Rico", + "SU_A3": "PRI", + "BRK_DIFF": 0, + "NAME": "Puerto Rico", + "NAME_LONG": "Puerto Rico", + "BRK_A3": "PRI", + "BRK_NAME": "Puerto Rico", + "BRK_GROUP": null, + "ABBREV": "P.R.", + "POSTAL": "PR", + "FORMAL_EN": "Commonwealth of Puerto Rico", + "FORMAL_FR": null, + "NAME_CIAWF": "Puerto Rico", + "NOTE_ADM0": "Commonwealth of U.S.A.", + "NOTE_BRK": null, + "NAME_SORT": "Puerto Rico", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 1, + "MAPCOLOR13": 1, + "POP_EST": 3351827, + "POP_RANK": 12, + "GDP_MD_EST": 131000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "RQ", + "ISO_A2": "PR", + "ISO_A3": "PRI", + "ISO_A3_EH": "PRI", + "ISO_N3": "630", + "UN_A3": "630", + "WB_A2": "PR", + "WB_A3": "PRI", + "WOE_ID": 23424935, + "WOE_ID_EH": 23424935, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PRI", + "ADM0_A3_US": "PRI", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": -99, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-67.242428, 17.946553, -65.591004, 18.520601], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-66.282434, 18.514762], + [-65.771303, 18.426679], + [-65.591004, 18.228035], + [-65.847164, 17.975906], + [-66.599934, 17.981823], + [-67.184162, 17.946553], + [-67.242428, 18.37446], + [-67.100679, 18.520601], + [-66.282434, 18.514762] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "North Korea", + "SOV_A3": "PRK", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "North Korea", + "ADM0_A3": "PRK", + "GEOU_DIF": 0, + "GEOUNIT": "North Korea", + "GU_A3": "PRK", + "SU_DIF": 0, + "SUBUNIT": "North Korea", + "SU_A3": "PRK", + "BRK_DIFF": 0, + "NAME": "North Korea", + "NAME_LONG": "Dem. Rep. Korea", + "BRK_A3": "PRK", + "BRK_NAME": "Dem. Rep. Korea", + "BRK_GROUP": null, + "ABBREV": "N.K.", + "POSTAL": "KP", + "FORMAL_EN": "Democratic People's Republic of Korea", + "FORMAL_FR": null, + "NAME_CIAWF": "Korea, North", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Korea, Dem. Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 5, + "MAPCOLOR9": 3, + "MAPCOLOR13": 9, + "POP_EST": 25248140, + "POP_RANK": 15, + "GDP_MD_EST": 40000, + "POP_YEAR": 2013, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "KN", + "ISO_A2": "KP", + "ISO_A3": "PRK", + "ISO_A3_EH": "PRK", + "ISO_N3": "408", + "UN_A3": "408", + "WB_A2": "KP", + "WB_A3": "PRK", + "WOE_ID": 23424865, + "WOE_ID_EH": 23424865, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PRK", + "ADM0_A3_US": "PRK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 15, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [124.265625, 37.669071, 130.780007, 42.985387], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [124.265625, 39.928493], + [125.079942, 40.569824], + [126.182045, 41.107336], + [126.869083, 41.816569], + [127.343783, 41.503152], + [128.208433, 41.466772], + [128.052215, 41.994285], + [129.596669, 42.424982], + [129.994267, 42.985387], + [130.64, 42.395024], + [130.64, 42.395], + [130.779992, 42.22001], + [130.400031, 42.280004], + [129.965949, 41.941368], + [129.667362, 41.601104], + [129.705189, 40.882828], + [129.188115, 40.661808], + [129.0104, 40.485436], + [128.633368, 40.189847], + [127.967414, 40.025413], + [127.533436, 39.75685], + [127.50212, 39.323931], + [127.385434, 39.213472], + [127.783343, 39.050898], + [128.349716, 38.612243], + [128.205746, 38.370397], + [127.780035, 38.304536], + [127.073309, 38.256115], + [126.68372, 37.804773], + [126.237339, 37.840378], + [126.174759, 37.749686], + [125.689104, 37.94001], + [125.568439, 37.752089], + [125.27533, 37.669071], + [125.240087, 37.857224], + [124.981033, 37.948821], + [124.712161, 38.108346], + [124.985994, 38.548474], + [125.221949, 38.665857], + [125.132859, 38.848559], + [125.38659, 39.387958], + [125.321116, 39.551385], + [124.737482, 39.660344], + [124.265625, 39.928493] + ] + ], + [ + [ + [130.780005, 42.22001], + [130.780007, 42.220007], + [130.780004, 42.220008], + [130.780005, 42.22001] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Portugal", + "SOV_A3": "PRT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Portugal", + "ADM0_A3": "PRT", + "GEOU_DIF": 0, + "GEOUNIT": "Portugal", + "GU_A3": "PRT", + "SU_DIF": 1, + "SUBUNIT": "Portugal", + "SU_A3": "PR1", + "BRK_DIFF": 0, + "NAME": "Portugal", + "NAME_LONG": "Portugal", + "BRK_A3": "PR1", + "BRK_NAME": "Portugal", + "BRK_GROUP": null, + "ABBREV": "Port.", + "POSTAL": "P", + "FORMAL_EN": "Portuguese Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Portugal", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Portugal", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 7, + "MAPCOLOR9": 1, + "MAPCOLOR13": 4, + "POP_EST": 10839514, + "POP_RANK": 14, + "GDP_MD_EST": 297100, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "PO", + "ISO_A2": "PT", + "ISO_A3": "PRT", + "ISO_A3_EH": "PRT", + "ISO_N3": "620", + "UN_A3": "620", + "WB_A2": "PT", + "WB_A3": "PRT", + "WOE_ID": 23424925, + "WOE_ID_EH": 23424925, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PRT", + "ADM0_A3_US": "PRT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-9.526571, 36.838269, -6.389088, 42.280469], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-9.034818, 41.880571], + [-8.671946, 42.134689], + [-8.263857, 42.280469], + [-8.013175, 41.790886], + [-7.422513, 41.792075], + [-7.251309, 41.918346], + [-6.668606, 41.883387], + [-6.389088, 41.381815], + [-6.851127, 41.111083], + [-6.86402, 40.330872], + [-7.026413, 40.184524], + [-7.066592, 39.711892], + [-7.498632, 39.629571], + [-7.098037, 39.030073], + [-7.374092, 38.373059], + [-7.029281, 38.075764], + [-7.166508, 37.803894], + [-7.537105, 37.428904], + [-7.453726, 37.097788], + [-7.855613, 36.838269], + [-8.382816, 36.97888], + [-8.898857, 36.868809], + [-8.746101, 37.651346], + [-8.839998, 38.266243], + [-9.287464, 38.358486], + [-9.526571, 38.737429], + [-9.446989, 39.392066], + [-9.048305, 39.755093], + [-8.977353, 40.159306], + [-8.768684, 40.760639], + [-8.790853, 41.184334], + [-8.990789, 41.543459], + [-9.034818, 41.880571] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Paraguay", + "SOV_A3": "PRY", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Paraguay", + "ADM0_A3": "PRY", + "GEOU_DIF": 0, + "GEOUNIT": "Paraguay", + "GU_A3": "PRY", + "SU_DIF": 0, + "SUBUNIT": "Paraguay", + "SU_A3": "PRY", + "BRK_DIFF": 0, + "NAME": "Paraguay", + "NAME_LONG": "Paraguay", + "BRK_A3": "PRY", + "BRK_NAME": "Paraguay", + "BRK_GROUP": null, + "ABBREV": "Para.", + "POSTAL": "PY", + "FORMAL_EN": "Republic of Paraguay", + "FORMAL_FR": null, + "NAME_CIAWF": "Paraguay", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Paraguay", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 6, + "MAPCOLOR13": 2, + "POP_EST": 6943739, + "POP_RANK": 13, + "GDP_MD_EST": 64670, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "PA", + "ISO_A2": "PY", + "ISO_A3": "PRY", + "ISO_A3_EH": "PRY", + "ISO_N3": "600", + "UN_A3": "600", + "WB_A2": "PY", + "WB_A3": "PRY", + "WOE_ID": 23424917, + "WOE_ID_EH": 23424917, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PRY", + "ADM0_A3_US": "PRY", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-62.685057, -27.548499, -54.29296, -19.342747], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-54.625291, -25.739255], + [-54.788795, -26.621786], + [-55.695846, -27.387837], + [-56.486702, -27.548499], + [-57.60976, -27.395899], + [-58.618174, -27.123719], + [-57.63366, -25.603657], + [-57.777217, -25.16234], + [-58.807128, -24.771459], + [-60.028966, -24.032796], + [-60.846565, -23.880713], + [-62.685057, -22.249029], + [-62.291179, -21.051635], + [-62.265961, -20.513735], + [-61.786326, -19.633737], + [-60.043565, -19.342747], + [-59.115042, -19.356906], + [-58.183471, -19.868399], + [-58.166392, -20.176701], + [-57.870674, -20.732688], + [-57.937156, -22.090176], + [-56.88151, -22.282154], + [-56.473317, -22.0863], + [-55.797958, -22.35693], + [-55.610683, -22.655619], + [-55.517639, -23.571998], + [-55.400747, -23.956935], + [-55.027902, -24.001274], + [-54.652834, -23.839578], + [-54.29296, -24.021014], + [-54.293476, -24.5708], + [-54.428946, -25.162185], + [-54.625291, -25.739255] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Israel", + "SOV_A3": "IS1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Disputed", + "ADMIN": "Palestine", + "ADM0_A3": "PSX", + "GEOU_DIF": 0, + "GEOUNIT": "Palestine", + "GU_A3": "PSX", + "SU_DIF": 0, + "SUBUNIT": "Palestine", + "SU_A3": "PSX", + "BRK_DIFF": 0, + "NAME": "Palestine", + "NAME_LONG": "Palestine", + "BRK_A3": "PSX", + "BRK_NAME": "Palestine", + "BRK_GROUP": null, + "ABBREV": "Pal.", + "POSTAL": "PAL", + "FORMAL_EN": "West Bank and Gaza", + "FORMAL_FR": null, + "NAME_CIAWF": null, + "NOTE_ADM0": "Partial self-admin.", + "NOTE_BRK": "Partial self-admin.", + "NAME_SORT": "Palestine (West Bank and Gaza)", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 5, + "MAPCOLOR13": 8, + "POP_EST": 4543126, + "POP_RANK": 12, + "GDP_MD_EST": 21220.77, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "PS", + "ISO_A3": "PSE", + "ISO_A3_EH": "PSE", + "ISO_N3": "275", + "UN_A3": "275", + "WB_A2": "GZ", + "WB_A3": "WBG", + "WOE_ID": 28289408, + "WOE_ID_EH": 28289408, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "PSE", + "ADM0_A3_US": "PSX", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": -99, + "MIN_ZOOM": 7, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [34.927408, 31.353435, 35.545665, 32.532511], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.397561, 31.489086], + [34.927408, 31.353435], + [34.970507, 31.616778], + [35.225892, 31.754341], + [34.974641, 31.866582], + [35.18393, 32.532511], + [35.545665, 32.393992], + [35.545252, 31.782505], + [35.397561, 31.489086] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Qatar", + "SOV_A3": "QAT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Qatar", + "ADM0_A3": "QAT", + "GEOU_DIF": 0, + "GEOUNIT": "Qatar", + "GU_A3": "QAT", + "SU_DIF": 0, + "SUBUNIT": "Qatar", + "SU_A3": "QAT", + "BRK_DIFF": 0, + "NAME": "Qatar", + "NAME_LONG": "Qatar", + "BRK_A3": "QAT", + "BRK_NAME": "Qatar", + "BRK_GROUP": null, + "ABBREV": "Qatar", + "POSTAL": "QA", + "FORMAL_EN": "State of Qatar", + "FORMAL_FR": null, + "NAME_CIAWF": "Qatar", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Qatar", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 4, + "POP_EST": 2314307, + "POP_RANK": 12, + "GDP_MD_EST": 334500, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "QA", + "ISO_A2": "QA", + "ISO_A3": "QAT", + "ISO_A3_EH": "QAT", + "ISO_N3": "634", + "UN_A3": "634", + "WB_A2": "QA", + "WB_A3": "QAT", + "WOE_ID": 23424930, + "WOE_ID_EH": 23424930, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "QAT", + "ADM0_A3_US": "QAT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [50.743911, 24.556331, 51.6067, 26.114582], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [50.810108, 24.754743], + [50.743911, 25.482424], + [51.013352, 26.006992], + [51.286462, 26.114582], + [51.589079, 25.801113], + [51.6067, 25.21567], + [51.389608, 24.627386], + [51.112415, 24.556331], + [50.810108, 24.754743] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Romania", + "SOV_A3": "ROU", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Romania", + "ADM0_A3": "ROU", + "GEOU_DIF": 0, + "GEOUNIT": "Romania", + "GU_A3": "ROU", + "SU_DIF": 0, + "SUBUNIT": "Romania", + "SU_A3": "ROU", + "BRK_DIFF": 0, + "NAME": "Romania", + "NAME_LONG": "Romania", + "BRK_A3": "ROU", + "BRK_NAME": "Romania", + "BRK_GROUP": null, + "ABBREV": "Rom.", + "POSTAL": "RO", + "FORMAL_EN": "Romania", + "FORMAL_FR": null, + "NAME_CIAWF": "Romania", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Romania", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 3, + "MAPCOLOR13": 13, + "POP_EST": 21529967, + "POP_RANK": 15, + "GDP_MD_EST": 441000, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "RO", + "ISO_A2": "RO", + "ISO_A3": "ROU", + "ISO_A3_EH": "ROU", + "ISO_N3": "642", + "UN_A3": "642", + "WB_A2": "RO", + "WB_A3": "ROM", + "WOE_ID": 23424933, + "WOE_ID_EH": 23424933, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ROU", + "ADM0_A3_US": "ROU", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [20.220192, 43.688445, 29.626543, 48.220881], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.558081, 43.707462], + [27.970107, 43.812468], + [27.2424, 44.175986], + [26.065159, 43.943494], + [25.569272, 43.688445], + [24.100679, 43.741051], + [23.332302, 43.897011], + [22.944832, 43.823785], + [22.65715, 44.234923], + [22.474008, 44.409228], + [22.705726, 44.578003], + [22.459022, 44.702517], + [22.145088, 44.478422], + [21.562023, 44.768947], + [21.483526, 45.18117], + [20.874313, 45.416375], + [20.762175, 45.734573], + [20.220192, 46.127469], + [21.021952, 46.316088], + [21.626515, 46.994238], + [22.099768, 47.672439], + [22.710531, 47.882194], + [23.142236, 48.096341], + [23.760958, 47.985598], + [24.402056, 47.981878], + [24.866317, 47.737526], + [25.207743, 47.891056], + [25.945941, 47.987149], + [26.19745, 48.220881], + [26.619337, 48.220726], + [26.924176, 48.123264], + [27.233873, 47.826771], + [27.551166, 47.405117], + [28.12803, 46.810476], + [28.160018, 46.371563], + [28.054443, 45.944586], + [28.233554, 45.488283], + [28.679779, 45.304031], + [29.149725, 45.464925], + [29.603289, 45.293308], + [29.626543, 45.035391], + [29.141612, 44.82021], + [28.837858, 44.913874], + [28.558081, 43.707462] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Russia", + "SOV_A3": "RUS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Russia", + "ADM0_A3": "RUS", + "GEOU_DIF": 0, + "GEOUNIT": "Russia", + "GU_A3": "RUS", + "SU_DIF": 0, + "SUBUNIT": "Russia", + "SU_A3": "RUS", + "BRK_DIFF": 0, + "NAME": "Russia", + "NAME_LONG": "Russian Federation", + "BRK_A3": "RUS", + "BRK_NAME": "Russia", + "BRK_GROUP": null, + "ABBREV": "Rus.", + "POSTAL": "RUS", + "FORMAL_EN": "Russian Federation", + "FORMAL_FR": null, + "NAME_CIAWF": "Russia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Russian Federation", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 5, + "MAPCOLOR9": 7, + "MAPCOLOR13": 7, + "POP_EST": 142257519, + "POP_RANK": 17, + "GDP_MD_EST": 3745000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "3. Emerging region: BRIC", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "RS", + "ISO_A2": "RU", + "ISO_A3": "RUS", + "ISO_A3_EH": "RUS", + "ISO_N3": "643", + "UN_A3": "643", + "WB_A2": "RU", + "WB_A3": "RUS", + "WOE_ID": 23424936, + "WOE_ID_EH": 23424936, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "RUS", + "ADM0_A3_US": "RUS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 18, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.2 + }, + "bbox": [-180, 41.151416, 180, 81.2504], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [48.584353, 41.808869], + [47.987283, 41.405819], + [47.815666, 41.151416], + [47.373315, 41.219732], + [46.686071, 41.827137], + [46.404951, 41.860675], + [45.7764, 42.09244], + [45.470279, 42.502781], + [44.537623, 42.711993], + [43.93121, 42.55496], + [43.75599, 42.74083], + [42.3944, 43.2203], + [40.92219, 43.38215], + [40.076965, 43.553104], + [39.955009, 43.434998], + [38.68, 44.28], + [37.53912, 44.65721], + [36.67546, 45.24469], + [37.40317, 45.40451], + [38.23295, 46.24087], + [37.67372, 46.63657], + [39.14767, 47.04475], + [39.1212, 47.26336], + [38.223538, 47.10219], + [38.255112, 47.5464], + [38.77057, 47.82562], + [39.738278, 47.898937], + [39.89562, 48.23241], + [39.67465, 48.78382], + [40.080789, 49.30743], + [40.06904, 49.60105], + [38.594988, 49.926462], + [38.010631, 49.915662], + [37.39346, 50.383953], + [36.626168, 50.225591], + [35.356116, 50.577197], + [35.37791, 50.77394], + [35.022183, 51.207572], + [34.224816, 51.255993], + [34.141978, 51.566413], + [34.391731, 51.768882], + [33.7527, 52.335075], + [32.715761, 52.238465], + [32.412058, 52.288695], + [32.15944, 52.06125], + [31.785992, 52.101678], + [31.78597, 52.10168], + [31.540018, 52.742052], + [31.305201, 53.073996], + [31.49764, 53.16743], + [32.304519, 53.132726], + [32.693643, 53.351421], + [32.405599, 53.618045], + [31.731273, 53.794029], + [31.791424, 53.974639], + [31.384472, 54.157056], + [30.757534, 54.811771], + [30.971836, 55.081548], + [30.873909, 55.550976], + [29.896294, 55.789463], + [29.371572, 55.670091], + [29.229513, 55.918344], + [28.176709, 56.16913], + [27.855282, 56.759326], + [27.770016, 57.244258], + [27.288185, 57.474528], + [27.716686, 57.791899], + [27.42015, 58.72457], + [28.131699, 59.300825], + [27.98112, 59.47537], + [27.981127, 59.475373], + [29.1177, 60.02805], + [28.070002, 60.503519], + [28.07, 60.50352], + [30.211107, 61.780028], + [31.139991, 62.357693], + [31.516092, 62.867687], + [30.035872, 63.552814], + [30.444685, 64.204453], + [29.54443, 64.948672], + [30.21765, 65.80598], + [29.054589, 66.944286], + [29.977426, 67.698297], + [28.445944, 68.364613], + [28.59193, 69.064777], + [29.39955, 69.15692], + [31.101042, 69.558101], + [31.10108, 69.55811], + [32.13272, 69.90595], + [33.77547, 69.30142], + [36.51396, 69.06342], + [40.29234, 67.9324], + [41.05987, 67.45713], + [41.12595, 66.79158], + [40.01583, 66.26618], + [38.38295, 65.99953], + [33.91871, 66.75961], + [33.18444, 66.63253], + [34.81477, 65.90015], + [34.878574, 65.436213], + [34.94391, 64.41437], + [36.23129, 64.10945], + [37.01273, 63.84983], + [37.14197, 64.33471], + [36.539579, 64.76446], + [37.17604, 65.14322], + [39.59345, 64.52079], + [40.4356, 64.76446], + [39.7626, 65.49682], + [42.09309, 66.47623], + [43.01604, 66.41858], + [43.94975, 66.06908], + [44.53226, 66.75634], + [43.69839, 67.35245], + [44.18795, 67.95051], + [43.45282, 68.57079], + [46.25, 68.25], + [46.82134, 67.68997], + [45.55517, 67.56652], + [45.56202, 67.01005], + [46.34915, 66.66767], + [47.89416, 66.88455], + [48.13876, 67.52238], + [50.22766, 67.99867], + [53.71743, 68.85738], + [54.47171, 68.80815], + [53.48582, 68.20131], + [54.72628, 68.09702], + [55.44268, 68.43866], + [57.31702, 68.46628], + [58.802, 68.88082], + [59.94142, 68.27844], + [61.07784, 68.94069], + [60.03, 69.52], + [60.55, 69.85], + [63.504, 69.54739], + [64.888115, 69.234835], + [68.51216, 68.09233], + [69.18068, 68.61563], + [68.16444, 69.14436], + [68.13522, 69.35649], + [66.93008, 69.45461], + [67.25976, 69.92873], + [66.72492, 70.70889], + [66.69466, 71.02897], + [68.54006, 71.9345], + [69.19636, 72.84336], + [69.94, 73.04], + [72.58754, 72.77629], + [72.79603, 72.22006], + [71.84811, 71.40898], + [72.47011, 71.09019], + [72.79188, 70.39114], + [72.5647, 69.02085], + [73.66787, 68.4079], + [73.2387, 67.7404], + [71.28, 66.32], + [72.42301, 66.17267], + [72.82077, 66.53267], + [73.92099, 66.78946], + [74.18651, 67.28429], + [75.052, 67.76047], + [74.46926, 68.32899], + [74.93584, 68.98918], + [73.84236, 69.07146], + [73.60187, 69.62763], + [74.3998, 70.63175], + [73.1011, 71.44717], + [74.89082, 72.12119], + [74.65926, 72.83227], + [75.15801, 72.85497], + [75.68351, 72.30056], + [75.28898, 71.33556], + [76.35911, 71.15287], + [75.90313, 71.87401], + [77.57665, 72.26717], + [79.65202, 72.32011], + [81.5, 71.75], + [80.61071, 72.58285], + [80.51109, 73.6482], + [82.25, 73.85], + [84.65526, 73.80591], + [86.8223, 73.93688], + [86.00956, 74.45967], + [87.16682, 75.11643], + [88.31571, 75.14393], + [90.26, 75.64], + [92.90058, 75.77333], + [93.23421, 76.0472], + [95.86, 76.14], + [96.67821, 75.91548], + [98.92254, 76.44689], + [100.75967, 76.43028], + [101.03532, 76.86189], + [101.99084, 77.28754], + [104.3516, 77.69792], + [106.06664, 77.37389], + [104.705, 77.1274], + [106.97013, 76.97419], + [107.24, 76.48], + [108.1538, 76.72335], + [111.07726, 76.71], + [113.33151, 76.22224], + [114.13417, 75.84764], + [113.88539, 75.32779], + [112.77918, 75.03186], + [110.15125, 74.47673], + [109.4, 74.18], + [110.64, 74.04], + [112.11919, 73.78774], + [113.01954, 73.97693], + [113.52958, 73.33505], + [113.96881, 73.59488], + [115.56782, 73.75285], + [118.77633, 73.58772], + [119.02, 73.12], + [123.20066, 72.97122], + [123.25777, 73.73503], + [125.38, 73.56], + [126.97644, 73.56549], + [128.59126, 73.03871], + [129.05157, 72.39872], + [128.46, 71.98], + [129.71599, 71.19304], + [131.28858, 70.78699], + [132.2535, 71.8363], + [133.85766, 71.38642], + [135.56193, 71.65525], + [137.49755, 71.34763], + [138.23409, 71.62803], + [139.86983, 71.48783], + [139.14791, 72.41619], + [140.46817, 72.84941], + [149.5, 72.2], + [150.35118, 71.60643], + [152.9689, 70.84222], + [157.00688, 71.03141], + [158.99779, 70.86672], + [159.83031, 70.45324], + [159.70866, 69.72198], + [160.94053, 69.43728], + [162.27907, 69.64204], + [164.05248, 69.66823], + [165.94037, 69.47199], + [167.83567, 69.58269], + [169.57763, 68.6938], + [170.81688, 69.01363], + [170.0082, 69.65276], + [170.45345, 70.09703], + [173.64391, 69.81743], + [175.72403, 69.87725], + [178.6, 69.4], + [180, 68.963636], + [180, 64.979709], + [179.99281, 64.97433], + [178.7072, 64.53493], + [177.41128, 64.60821], + [178.313, 64.07593], + [178.90825, 63.25197], + [179.37034, 62.98262], + [179.48636, 62.56894], + [179.22825, 62.3041], + [177.3643, 62.5219], + [174.56929, 61.76915], + [173.68013, 61.65261], + [172.15, 60.95], + [170.6985, 60.33618], + [170.33085, 59.88177], + [168.90046, 60.57355], + [166.29498, 59.78855], + [165.84, 60.16], + [164.87674, 59.7316], + [163.53929, 59.86871], + [163.21711, 59.21101], + [162.01733, 58.24328], + [162.05297, 57.83912], + [163.19191, 57.61503], + [163.05794, 56.15924], + [162.12958, 56.12219], + [161.70146, 55.28568], + [162.11749, 54.85514], + [160.36877, 54.34433], + [160.02173, 53.20257], + [158.53094, 52.95868], + [158.23118, 51.94269], + [156.78979, 51.01105], + [156.42, 51.7], + [155.99182, 53.15895], + [155.43366, 55.38103], + [155.91442, 56.76792], + [156.75815, 57.3647], + [156.81035, 57.83204], + [158.36433, 58.05575], + [160.15064, 59.31477], + [161.87204, 60.343], + [163.66969, 61.1409], + [164.47355, 62.55061], + [163.25842, 62.46627], + [162.65791, 61.6425], + [160.12148, 60.54423], + [159.30232, 61.77396], + [156.72068, 61.43442], + [154.21806, 59.75818], + [155.04375, 59.14495], + [152.81185, 58.88385], + [151.26573, 58.78089], + [151.33815, 59.50396], + [149.78371, 59.65573], + [148.54481, 59.16448], + [145.48722, 59.33637], + [142.19782, 59.03998], + [138.95848, 57.08805], + [135.12619, 54.72959], + [136.70171, 54.60355], + [137.19342, 53.97732], + [138.1647, 53.75501], + [138.80463, 54.25455], + [139.90151, 54.18968], + [141.34531, 53.08957], + [141.37923, 52.23877], + [140.59742, 51.23967], + [140.51308, 50.04553], + [140.06193, 48.44671], + [138.55472, 46.99965], + [138.21971, 46.30795], + [136.86232, 45.1435], + [135.51535, 43.989], + [134.86939, 43.39821], + [133.53687, 42.81147], + [132.90627, 42.79849], + [132.27807, 43.28456], + [130.93587, 42.55274], + [130.780005, 42.22001], + [130.780004, 42.220008], + [130.78, 42.22], + [130.779992, 42.22001], + [130.64, 42.395], + [130.64, 42.395024], + [130.633866, 42.903015], + [131.144688, 42.92999], + [131.288555, 44.11152], + [131.02519, 44.96796], + [131.883454, 45.321162], + [133.09712, 45.14409], + [133.769644, 46.116927], + [134.11235, 47.21248], + [134.50081, 47.57845], + [135.026311, 48.47823], + [133.373596, 48.183442], + [132.50669, 47.78896], + [130.98726, 47.79013], + [130.582293, 48.729687], + [129.397818, 49.4406], + [127.6574, 49.76027], + [127.287456, 50.739797], + [126.939157, 51.353894], + [126.564399, 51.784255], + [125.946349, 52.792799], + [125.068211, 53.161045], + [123.57147, 53.4588], + [122.245748, 53.431726], + [121.003085, 53.251401], + [120.177089, 52.753886], + [120.725789, 52.516226], + [120.7382, 51.96411], + [120.18208, 51.64355], + [119.27939, 50.58292], + [119.288461, 50.142883], + [117.879244, 49.510983], + [116.678801, 49.888531], + [115.485695, 49.805177], + [114.96211, 50.140247], + [114.362456, 50.248303], + [112.89774, 49.543565], + [111.581231, 49.377968], + [110.662011, 49.130128], + [109.402449, 49.292961], + [108.475167, 49.282548], + [107.868176, 49.793705], + [106.888804, 50.274296], + [105.886591, 50.406019], + [104.62158, 50.27532], + [103.676545, 50.089966], + [102.25589, 50.51056], + [102.06521, 51.25991], + [100.88948, 51.516856], + [99.981732, 51.634006], + [98.861491, 52.047366], + [97.82574, 51.010995], + [98.231762, 50.422401], + [97.25976, 49.72605], + [95.81402, 49.97746], + [94.815949, 50.013433], + [94.147566, 50.480537], + [93.10421, 50.49529], + [92.234712, 50.802171], + [90.713667, 50.331812], + [88.805567, 49.470521], + [87.751264, 49.297198], + [87.35997, 49.214981], + [86.829357, 49.826675], + [85.54127, 49.692859], + [85.11556, 50.117303], + [84.416377, 50.3114], + [83.935115, 50.889246], + [83.383004, 51.069183], + [81.945986, 50.812196], + [80.568447, 51.388336], + [80.03556, 50.864751], + [77.800916, 53.404415], + [76.525179, 54.177003], + [76.8911, 54.490524], + [74.38482, 53.54685], + [73.425679, 53.48981], + [73.508516, 54.035617], + [72.22415, 54.376655], + [71.180131, 54.133285], + [70.865267, 55.169734], + [69.068167, 55.38525], + [68.1691, 54.970392], + [65.66687, 54.60125], + [65.178534, 54.354228], + [61.4366, 54.00625], + [60.978066, 53.664993], + [61.699986, 52.979996], + [60.739993, 52.719986], + [60.927269, 52.447548], + [59.967534, 51.96042], + [61.588003, 51.272659], + [61.337424, 50.79907], + [59.932807, 50.842194], + [59.642282, 50.545442], + [58.36332, 51.06364], + [56.77798, 51.04355], + [55.71694, 50.62171], + [54.532878, 51.02624], + [52.328724, 51.718652], + [50.766648, 51.692762], + [48.702382, 50.605128], + [48.577841, 49.87476], + [47.54948, 50.454698], + [46.751596, 49.356006], + [47.043672, 49.152039], + [46.466446, 48.394152], + [47.31524, 47.71585], + [48.05725, 47.74377], + [48.694734, 47.075628], + [48.59325, 46.56104], + [49.10116, 46.39933], + [48.64541, 45.80629], + [47.67591, 45.64149], + [46.68201, 44.6092], + [47.59094, 43.66016], + [47.49252, 42.98658], + [48.58437, 41.80888], + [48.584353, 41.808869] + ] + ], + [ + [ + [21.268449, 55.190482], + [22.315724, 55.015299], + [22.757764, 54.856574], + [22.651052, 54.582741], + [22.731099, 54.327537], + [20.892245, 54.312525], + [19.66064, 54.426084], + [19.888481, 54.86616], + [21.268449, 55.190482] + ] + ], + [ + [ + [33.435988, 45.971917], + [33.699462, 46.219573], + [34.410402, 46.005162], + [34.732017, 45.965666], + [34.861792, 45.768182], + [35.012659, 45.737725], + [35.020788, 45.651219], + [35.510009, 45.409993], + [36.529998, 45.46999], + [36.334713, 45.113216], + [35.239999, 44.939996], + [33.882511, 44.361479], + [33.326421, 44.564877], + [33.546924, 45.034771], + [32.454174, 45.327466], + [32.630804, 45.519186], + [33.588162, 45.851569], + [33.435988, 45.971917] + ] + ], + [ + [ + [143.648007, 50.7476], + [144.654148, 48.976391], + [143.173928, 49.306551], + [142.558668, 47.861575], + [143.533492, 46.836728], + [143.505277, 46.137908], + [142.747701, 46.740765], + [142.09203, 45.966755], + [141.906925, 46.805929], + [142.018443, 47.780133], + [141.904445, 48.859189], + [142.1358, 49.615163], + [142.179983, 50.952342], + [141.594076, 51.935435], + [141.682546, 53.301966], + [142.606934, 53.762145], + [142.209749, 54.225476], + [142.654786, 54.365881], + [142.914616, 53.704578], + [143.260848, 52.74076], + [143.235268, 51.75666], + [143.648007, 50.7476] + ] + ], + [ + [ + [-175.01425, 66.58435], + [-174.33983, 66.33556], + [-174.57182, 67.06219], + [-171.85731, 66.91308], + [-169.89958, 65.97724], + [-170.89107, 65.54139], + [-172.53025, 65.43791], + [-172.555, 64.46079], + [-172.95533, 64.25269], + [-173.89184, 64.2826], + [-174.65392, 64.63125], + [-175.98353, 64.92288], + [-176.20716, 65.35667], + [-177.22266, 65.52024], + [-178.35993, 65.39052], + [-178.90332, 65.74044], + [-178.68611, 66.11211], + [-179.88377, 65.87456], + [-179.43268, 65.40411], + [-180, 64.979709], + [-180, 68.963636], + [-177.55, 68.2], + [-174.92825, 67.20589], + [-175.01425, 66.58435] + ] + ], + [ + [ + [180, 70.832199], + [178.903425, 70.78114], + [178.7253, 71.0988], + [180, 71.515714], + [180, 70.832199] + ] + ], + [ + [ + [-178.69378, 70.89302], + [-180, 70.832199], + [-180, 71.515714], + [-179.871875, 71.55762], + [-179.02433, 71.55553], + [-177.577945, 71.26948], + [-177.663575, 71.13277], + [-178.69378, 70.89302] + ] + ], + [ + [ + [143.60385, 73.21244], + [142.08763, 73.20544], + [140.038155, 73.31692], + [139.86312, 73.36983], + [140.81171, 73.76506], + [142.06207, 73.85758], + [143.48283, 73.47525], + [143.60385, 73.21244] + ] + ], + [ + [ + [150.73167, 75.08406], + [149.575925, 74.68892], + [147.977465, 74.778355], + [146.11919, 75.17298], + [146.358485, 75.49682], + [148.22223, 75.345845], + [150.73167, 75.08406] + ] + ], + [ + [ + [145.086285, 75.562625], + [144.3, 74.82], + [140.61381, 74.84768], + [138.95544, 74.61148], + [136.97439, 75.26167], + [137.51176, 75.94917], + [138.831075, 76.13676], + [141.471615, 76.09289], + [145.086285, 75.562625] + ] + ], + [ + [ + [57.535693, 70.720464], + [56.944979, 70.632743], + [53.677375, 70.762658], + [53.412017, 71.206662], + [51.601895, 71.474759], + [51.455754, 72.014881], + [52.478275, 72.229442], + [52.444169, 72.774731], + [54.427614, 73.627548], + [53.50829, 73.749814], + [55.902459, 74.627486], + [55.631933, 75.081412], + [57.868644, 75.60939], + [61.170044, 76.251883], + [64.498368, 76.439055], + [66.210977, 76.809782], + [68.15706, 76.939697], + [68.852211, 76.544811], + [68.180573, 76.233642], + [64.637326, 75.737755], + [61.583508, 75.260885], + [58.477082, 74.309056], + [56.986786, 73.333044], + [55.419336, 72.371268], + [55.622838, 71.540595], + [57.535693, 70.720464] + ] + ], + [ + [ + [105.07547, 78.30689], + [99.43814, 77.921], + [101.2649, 79.23399], + [102.08635, 79.34641], + [102.837815, 79.28129], + [105.37243, 78.71334], + [105.07547, 78.30689] + ] + ], + [ + [ + [51.136187, 80.54728], + [49.793685, 80.415428], + [48.894411, 80.339567], + [48.754937, 80.175468], + [47.586119, 80.010181], + [46.502826, 80.247247], + [47.072455, 80.559424], + [44.846958, 80.58981], + [46.799139, 80.771918], + [48.318477, 80.78401], + [48.522806, 80.514569], + [49.09719, 80.753986], + [50.039768, 80.918885], + [51.522933, 80.699726], + [51.136187, 80.54728] + ] + ], + [ + [ + [99.93976, 78.88094], + [97.75794, 78.7562], + [94.97259, 79.044745], + [93.31288, 79.4265], + [92.5454, 80.14379], + [91.18107, 80.34146], + [93.77766, 81.0246], + [95.940895, 81.2504], + [97.88385, 80.746975], + [100.186655, 79.780135], + [99.93976, 78.88094] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Rwanda", + "SOV_A3": "RWA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Rwanda", + "ADM0_A3": "RWA", + "GEOU_DIF": 0, + "GEOUNIT": "Rwanda", + "GU_A3": "RWA", + "SU_DIF": 0, + "SUBUNIT": "Rwanda", + "SU_A3": "RWA", + "BRK_DIFF": 0, + "NAME": "Rwanda", + "NAME_LONG": "Rwanda", + "BRK_A3": "RWA", + "BRK_NAME": "Rwanda", + "BRK_GROUP": null, + "ABBREV": "Rwa.", + "POSTAL": "RW", + "FORMAL_EN": "Republic of Rwanda", + "FORMAL_FR": null, + "NAME_CIAWF": "Rwanda", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Rwanda", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 2, + "MAPCOLOR9": 3, + "MAPCOLOR13": 10, + "POP_EST": 11901484, + "POP_RANK": 14, + "GDP_MD_EST": 21970, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "RW", + "ISO_A2": "RW", + "ISO_A3": "RWA", + "ISO_A3_EH": "RWA", + "ISO_N3": "646", + "UN_A3": "646", + "WB_A2": "RW", + "WB_A3": "RWA", + "WOE_ID": 23424937, + "WOE_ID_EH": 23424937, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "RWA", + "ADM0_A3_US": "RWA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [29.024926, -2.917858, 30.816135, -1.134659], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [30.469674, -2.413855], + [29.938359, -2.348487], + [29.632176, -2.917858], + [29.024926, -2.839258], + [29.117479, -2.292211], + [29.254835, -2.21511], + [29.291887, -1.620056], + [29.579466, -1.341313], + [29.821519, -1.443322], + [30.419105, -1.134659], + [30.816135, -1.698914], + [30.758309, -2.28725], + [30.46967, -2.41383], + [30.469674, -2.413855] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 7, + "SOVEREIGNT": "Western Sahara", + "SOV_A3": "SAH", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Indeterminate", + "ADMIN": "Western Sahara", + "ADM0_A3": "SAH", + "GEOU_DIF": 0, + "GEOUNIT": "Western Sahara", + "GU_A3": "SAH", + "SU_DIF": 0, + "SUBUNIT": "Western Sahara", + "SU_A3": "SAH", + "BRK_DIFF": 1, + "NAME": "W. Sahara", + "NAME_LONG": "Western Sahara", + "BRK_A3": "B28", + "BRK_NAME": "W. Sahara", + "BRK_GROUP": null, + "ABBREV": "W. Sah.", + "POSTAL": "WS", + "FORMAL_EN": "Sahrawi Arab Democratic Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Western Sahara", + "NOTE_ADM0": "Self admin.", + "NOTE_BRK": "Self admin.; Claimed by Morocco", + "NAME_SORT": "Western Sahara", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 7, + "MAPCOLOR9": 4, + "MAPCOLOR13": 4, + "POP_EST": 603253, + "POP_RANK": 11, + "GDP_MD_EST": 906.5, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2007, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "WI", + "ISO_A2": "EH", + "ISO_A3": "ESH", + "ISO_A3_EH": "ESH", + "ISO_N3": "732", + "UN_A3": "732", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": 23424990, + "WOE_ID_EH": 23424990, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "MAR", + "ADM0_A3_US": "SAH", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 9, + "LONG_LEN": 14, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 4.7, + "MIN_LABEL": 6, + "MAX_LABEL": 11 + }, + "bbox": [-17.063423, 20.999752, -8.665124, 27.656426], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.66559, 27.656426], + [-8.665124, 27.589479], + [-8.6844, 27.395744], + [-8.687294, 25.881056], + [-11.969419, 25.933353], + [-11.937224, 23.374594], + [-12.874222, 23.284832], + [-13.118754, 22.77122], + [-12.929102, 21.327071], + [-16.845194, 21.333323], + [-17.063423, 20.999752], + [-17.020428, 21.42231], + [-17.002962, 21.420734], + [-14.750955, 21.5006], + [-14.630833, 21.86094], + [-14.221168, 22.310163], + [-13.89111, 23.691009], + [-12.500963, 24.770116], + [-12.030759, 26.030866], + [-11.71822, 26.104092], + [-11.392555, 26.883424], + [-10.551263, 26.990808], + [-10.189424, 26.860945], + [-9.735343, 26.860945], + [-9.413037, 27.088476], + [-8.794884, 27.120696], + [-8.817828, 27.656426], + [-8.66559, 27.656426] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Saudi Arabia", + "SOV_A3": "SAU", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Saudi Arabia", + "ADM0_A3": "SAU", + "GEOU_DIF": 0, + "GEOUNIT": "Saudi Arabia", + "GU_A3": "SAU", + "SU_DIF": 0, + "SUBUNIT": "Saudi Arabia", + "SU_A3": "SAU", + "BRK_DIFF": 0, + "NAME": "Saudi Arabia", + "NAME_LONG": "Saudi Arabia", + "BRK_A3": "SAU", + "BRK_NAME": "Saudi Arabia", + "BRK_GROUP": null, + "ABBREV": "Saud.", + "POSTAL": "SA", + "FORMAL_EN": "Kingdom of Saudi Arabia", + "FORMAL_FR": null, + "NAME_CIAWF": "Saudi Arabia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Saudi Arabia", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 1, + "MAPCOLOR9": 6, + "MAPCOLOR13": 7, + "POP_EST": 28571770, + "POP_RANK": 15, + "GDP_MD_EST": 1731000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "SA", + "ISO_A2": "SA", + "ISO_A3": "SAU", + "ISO_A3_EH": "SAU", + "ISO_N3": "682", + "UN_A3": "682", + "WB_A2": "SA", + "WB_A3": "SAU", + "WOE_ID": 23424938, + "WOE_ID_EH": 23424938, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SAU", + "ADM0_A3_US": "SAU", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 12, + "LONG_LEN": 12, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2.7, + "MAX_LABEL": 7 + }, + "bbox": [34.632336, 16.347891, 55.666659, 32.161009], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [51.579519, 24.245497], + [51.617708, 24.014219], + [52.000733, 23.001154], + [55.006803, 22.496948], + [55.208341, 22.70833], + [55.666659, 22.000001], + [54.999982, 19.999994], + [52.00001, 19.000003], + [49.116672, 18.616668], + [48.183344, 18.166669], + [47.466695, 17.116682], + [47.000005, 16.949999], + [46.749994, 17.283338], + [46.366659, 17.233315], + [45.399999, 17.333335], + [45.216651, 17.433329], + [44.062613, 17.410359], + [43.791519, 17.319977], + [43.380794, 17.579987], + [43.115798, 17.08844], + [43.218375, 16.66689], + [42.779332, 16.347891], + [42.649573, 16.774635], + [42.347989, 17.075806], + [42.270888, 17.474722], + [41.754382, 17.833046], + [41.221391, 18.6716], + [40.939341, 19.486485], + [40.247652, 20.174635], + [39.801685, 20.338862], + [39.139399, 21.291905], + [39.023696, 21.986875], + [39.066329, 22.579656], + [38.492772, 23.688451], + [38.02386, 24.078686], + [37.483635, 24.285495], + [37.154818, 24.858483], + [37.209491, 25.084542], + [36.931627, 25.602959], + [36.639604, 25.826228], + [36.249137, 26.570136], + [35.640182, 27.37652], + [35.130187, 28.063352], + [34.632336, 28.058546], + [34.787779, 28.607427], + [34.83222, 28.957483], + [34.956037, 29.356555], + [36.068941, 29.197495], + [36.501214, 29.505254], + [36.740528, 29.865283], + [37.503582, 30.003776], + [37.66812, 30.338665], + [37.998849, 30.5085], + [37.002166, 31.508413], + [39.004886, 32.010217], + [39.195468, 32.161009], + [40.399994, 31.889992], + [41.889981, 31.190009], + [44.709499, 29.178891], + [46.568713, 29.099025], + [47.459822, 29.002519], + [47.708851, 28.526063], + [48.416094, 28.552004], + [48.807595, 27.689628], + [49.299554, 27.461218], + [49.470914, 27.109999], + [50.152422, 26.689663], + [50.212935, 26.277027], + [50.113303, 25.943972], + [50.239859, 25.60805], + [50.527387, 25.327808], + [50.660557, 24.999896], + [50.810108, 24.754743], + [51.112415, 24.556331], + [51.389608, 24.627386], + [51.579519, 24.245497] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Sudan", + "SOV_A3": "SDN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Sudan", + "ADM0_A3": "SDN", + "GEOU_DIF": 0, + "GEOUNIT": "Sudan", + "GU_A3": "SDN", + "SU_DIF": 0, + "SUBUNIT": "Sudan", + "SU_A3": "SDN", + "BRK_DIFF": 0, + "NAME": "Sudan", + "NAME_LONG": "Sudan", + "BRK_A3": "SDN", + "BRK_NAME": "Sudan", + "BRK_GROUP": null, + "ABBREV": "Sudan", + "POSTAL": "SD", + "FORMAL_EN": "Republic of the Sudan", + "FORMAL_FR": null, + "NAME_CIAWF": "Sudan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Sudan", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 6, + "MAPCOLOR9": 4, + "MAPCOLOR13": 1, + "POP_EST": 37345935, + "POP_RANK": 15, + "GDP_MD_EST": 176300, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "SU", + "ISO_A2": "SD", + "ISO_A3": "SDN", + "ISO_A3_EH": "SDN", + "ISO_N3": "729", + "UN_A3": "729", + "WB_A2": "SD", + "WB_A3": "SDN", + "WOE_ID": -90, + "WOE_ID_EH": 23424952, + "WOE_NOTE": "Almost all FLickr photos are in the north.", + "ADM0_A3_IS": "SDN", + "ADM0_A3_US": "SDN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [21.93681, 8.229188, 38.41009, 22], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [24.567369, 8.229188], + [23.805813, 8.666319], + [23.459013, 8.954286], + [23.394779, 9.265068], + [23.55725, 9.681218], + [23.554304, 10.089255], + [22.977544, 10.714463], + [22.864165, 11.142395], + [22.87622, 11.38461], + [22.50869, 11.67936], + [22.49762, 12.26024], + [22.28801, 12.64605], + [21.93681, 12.58818], + [22.03759, 12.95546], + [22.29658, 13.37232], + [22.18329, 13.78648], + [22.51202, 14.09318], + [22.30351, 14.32682], + [22.56795, 14.94429], + [23.02459, 15.68072], + [23.88689, 15.61084], + [23.83766, 19.58047], + [23.85, 20], + [25, 20.00304], + [25, 22], + [29.02, 22], + [32.9, 22], + [36.86623, 22], + [37.18872, 21.01885], + [36.96941, 20.83744], + [37.1147, 19.80796], + [37.48179, 18.61409], + [37.86276, 18.36786], + [38.41009, 17.998307], + [37.904, 17.42754], + [37.16747, 17.26314], + [36.85253, 16.95655], + [36.75389, 16.29186], + [36.32322, 14.82249], + [36.42951, 14.42211], + [36.27022, 13.56333], + [35.86363, 12.57828], + [35.26049, 12.08286], + [34.83163, 11.31896], + [34.73115, 10.91017], + [34.25745, 10.63009], + [33.96162, 9.58358], + [33.97498, 8.68456], + [33.963393, 9.464285], + [33.824963, 9.484061], + [33.842131, 9.981915], + [33.721959, 10.325262], + [33.206938, 10.720112], + [33.086766, 11.441141], + [33.206938, 12.179338], + [32.743419, 12.248008], + [32.67475, 12.024832], + [32.073892, 11.97333], + [32.314235, 11.681484], + [32.400072, 11.080626], + [31.850716, 10.531271], + [31.352862, 9.810241], + [30.837841, 9.707237], + [29.996639, 10.290927], + [29.618957, 10.084919], + [29.515953, 9.793074], + [29.000932, 9.604232], + [28.966597, 9.398224], + [27.97089, 9.398224], + [27.833551, 9.604232], + [27.112521, 9.638567], + [26.752006, 9.466893], + [26.477328, 9.55273], + [25.962307, 10.136421], + [25.790633, 10.411099], + [25.069604, 10.27376], + [24.794926, 9.810241], + [24.537415, 8.917538], + [24.194068, 8.728696], + [23.88698, 8.61973], + [24.567369, 8.229188] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "South Sudan", + "SOV_A3": "SDS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "South Sudan", + "ADM0_A3": "SDS", + "GEOU_DIF": 0, + "GEOUNIT": "South Sudan", + "GU_A3": "SDS", + "SU_DIF": 0, + "SUBUNIT": "South Sudan", + "SU_A3": "SDS", + "BRK_DIFF": 0, + "NAME": "S. Sudan", + "NAME_LONG": "South Sudan", + "BRK_A3": "SDS", + "BRK_NAME": "S. Sudan", + "BRK_GROUP": null, + "ABBREV": "S. Sud.", + "POSTAL": "SS", + "FORMAL_EN": "Republic of South Sudan", + "FORMAL_FR": null, + "NAME_CIAWF": "South Sudan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "South Sudan", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 3, + "MAPCOLOR9": 3, + "MAPCOLOR13": 5, + "POP_EST": 13026129, + "POP_RANK": 14, + "GDP_MD_EST": 20880, + "POP_YEAR": 2017, + "LASTCENSUS": 2008, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "SS", + "ISO_A3": "SSD", + "ISO_A3_EH": "SSD", + "ISO_N3": "728", + "UN_A3": "728", + "WB_A2": "SS", + "WB_A3": "SSD", + "WOE_ID": -99, + "WOE_ID_EH": -99, + "WOE_NOTE": "Includes states of 20069899, 20069897, 20069898, 20069901, 20069909, and 20069908 but maybe more?", + "ADM0_A3_IS": "SSD", + "ADM0_A3_US": "SDS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 11, + "ABBREV_LEN": 7, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [23.88698, 3.509172, 35.298007, 12.248008], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [27.374226, 5.233944], + [27.213409, 5.550953], + [26.465909, 5.946717], + [26.213418, 6.546603], + [25.796648, 6.979316], + [25.124131, 7.500085], + [25.114932, 7.825104], + [24.567369, 8.229188], + [23.88698, 8.61973], + [24.194068, 8.728696], + [24.537415, 8.917538], + [24.794926, 9.810241], + [25.069604, 10.27376], + [25.790633, 10.411099], + [25.962307, 10.136421], + [26.477328, 9.55273], + [26.752006, 9.466893], + [27.112521, 9.638567], + [27.833551, 9.604232], + [27.97089, 9.398224], + [28.966597, 9.398224], + [29.000932, 9.604232], + [29.515953, 9.793074], + [29.618957, 10.084919], + [29.996639, 10.290927], + [30.837841, 9.707237], + [31.352862, 9.810241], + [31.850716, 10.531271], + [32.400072, 11.080626], + [32.314235, 11.681484], + [32.073892, 11.97333], + [32.67475, 12.024832], + [32.743419, 12.248008], + [33.206938, 12.179338], + [33.086766, 11.441141], + [33.206938, 10.720112], + [33.721959, 10.325262], + [33.842131, 9.981915], + [33.824963, 9.484061], + [33.963393, 9.464285], + [33.97498, 8.68456], + [33.8255, 8.37916], + [33.2948, 8.35458], + [32.95418, 7.78497], + [33.56829, 7.71334], + [34.0751, 7.22595], + [34.25032, 6.82607], + [34.70702, 6.59422], + [35.298007, 5.506], + [34.620196, 4.847123], + [34.005, 4.249885], + [33.39, 3.79], + [32.68642, 3.79232], + [31.88145, 3.55827], + [31.24556, 3.7819], + [30.833852, 3.509172], + [29.9535, 4.173699], + [29.715995, 4.600805], + [29.159078, 4.389267], + [28.696678, 4.455077], + [28.428994, 4.287155], + [27.979977, 4.408413], + [27.374226, 5.233944] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Senegal", + "SOV_A3": "SEN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Senegal", + "ADM0_A3": "SEN", + "GEOU_DIF": 0, + "GEOUNIT": "Senegal", + "GU_A3": "SEN", + "SU_DIF": 0, + "SUBUNIT": "Senegal", + "SU_A3": "SEN", + "BRK_DIFF": 0, + "NAME": "Senegal", + "NAME_LONG": "Senegal", + "BRK_A3": "SEN", + "BRK_NAME": "Senegal", + "BRK_GROUP": null, + "ABBREV": "Sen.", + "POSTAL": "SN", + "FORMAL_EN": "Republic of Senegal", + "FORMAL_FR": null, + "NAME_CIAWF": "Senegal", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Senegal", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 6, + "MAPCOLOR9": 5, + "MAPCOLOR13": 5, + "POP_EST": 14668522, + "POP_RANK": 14, + "GDP_MD_EST": 39720, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "SG", + "ISO_A2": "SN", + "ISO_A3": "SEN", + "ISO_A3_EH": "SEN", + "ISO_N3": "686", + "UN_A3": "686", + "WB_A2": "SN", + "WB_A3": "SEN", + "WOE_ID": 23424943, + "WOE_ID_EH": 23424943, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SEN", + "ADM0_A3_US": "SEN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-17.625043, 12.33209, -11.467899, 16.598264], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-11.513943, 12.442988], + [-11.658301, 12.386583], + [-12.203565, 12.465648], + [-12.278599, 12.35444], + [-12.499051, 12.33209], + [-13.217818, 12.575874], + [-13.700476, 12.586183], + [-15.548477, 12.62817], + [-15.816574, 12.515567], + [-16.147717, 12.547762], + [-16.677452, 12.384852], + [-16.841525, 13.151394], + [-15.931296, 13.130284], + [-15.691001, 13.270353], + [-15.511813, 13.27857], + [-15.141163, 13.509512], + [-14.712197, 13.298207], + [-14.277702, 13.280585], + [-13.844963, 13.505042], + [-14.046992, 13.794068], + [-14.376714, 13.62568], + [-14.687031, 13.630357], + [-15.081735, 13.876492], + [-15.39877, 13.860369], + [-15.624596, 13.623587], + [-16.713729, 13.594959], + [-17.126107, 14.373516], + [-17.625043, 14.729541], + [-17.185173, 14.919477], + [-16.700706, 15.621527], + [-16.463098, 16.135036], + [-16.12069, 16.455663], + [-15.623666, 16.369337], + [-15.135737, 16.587282], + [-14.577348, 16.598264], + [-14.099521, 16.304302], + [-13.435738, 16.039383], + [-12.830658, 15.303692], + [-12.17075, 14.616834], + [-12.124887, 13.994727], + [-11.927716, 13.422075], + [-11.553398, 13.141214], + [-11.467899, 12.754519], + [-11.513943, 12.442988] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Solomon Islands", + "SOV_A3": "SLB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Solomon Islands", + "ADM0_A3": "SLB", + "GEOU_DIF": 0, + "GEOUNIT": "Solomon Islands", + "GU_A3": "SLB", + "SU_DIF": 0, + "SUBUNIT": "Solomon Islands", + "SU_A3": "SLB", + "BRK_DIFF": 0, + "NAME": "Solomon Is.", + "NAME_LONG": "Solomon Islands", + "BRK_A3": "SLB", + "BRK_NAME": "Solomon Is.", + "BRK_GROUP": null, + "ABBREV": "S. Is.", + "POSTAL": "SB", + "FORMAL_EN": null, + "FORMAL_FR": null, + "NAME_CIAWF": "Solomon Islands", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Solomon Islands", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 6, + "POP_EST": 647581, + "POP_RANK": 11, + "GDP_MD_EST": 1198, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "BP", + "ISO_A2": "SB", + "ISO_A3": "SLB", + "ISO_A3_EH": "SLB", + "ISO_N3": "090", + "UN_A3": "090", + "WB_A2": "SB", + "WB_A3": "SLB", + "WOE_ID": 23424766, + "WOE_ID_EH": 23424766, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SLB", + "ADM0_A3_US": "SLB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Melanesia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 15, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [156.491358, -10.826367, 162.398646, -6.599338], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [162.119025, -10.482719], + [162.398646, -10.826367], + [161.700032, -10.820011], + [161.319797, -10.204751], + [161.917383, -10.446701], + [162.119025, -10.482719] + ] + ], + [ + [ + [160.852229, -9.872937], + [160.462588, -9.89521], + [159.849447, -9.794027], + [159.640003, -9.63998], + [159.702945, -9.24295], + [160.362956, -9.400304], + [160.688518, -9.610162], + [160.852229, -9.872937] + ] + ], + [ + [ + [161.679982, -9.599982], + [161.529397, -9.784312], + [160.788253, -8.917543], + [160.579997, -8.320009], + [160.920028, -8.320009], + [161.280006, -9.120011], + [161.679982, -9.599982] + ] + ], + [ + [ + [159.875027, -8.33732], + [159.917402, -8.53829], + [159.133677, -8.114181], + [158.586114, -7.754824], + [158.21115, -7.421872], + [158.359978, -7.320018], + [158.820001, -7.560003], + [159.640003, -8.020027], + [159.875027, -8.33732] + ] + ], + [ + [ + [157.538426, -7.34782], + [157.33942, -7.404767], + [156.90203, -7.176874], + [156.491358, -6.765943], + [156.542828, -6.599338], + [157.14, -7.021638], + [157.538426, -7.34782] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Sierra Leone", + "SOV_A3": "SLE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Sierra Leone", + "ADM0_A3": "SLE", + "GEOU_DIF": 0, + "GEOUNIT": "Sierra Leone", + "GU_A3": "SLE", + "SU_DIF": 0, + "SUBUNIT": "Sierra Leone", + "SU_A3": "SLE", + "BRK_DIFF": 0, + "NAME": "Sierra Leone", + "NAME_LONG": "Sierra Leone", + "BRK_A3": "SLE", + "BRK_NAME": "Sierra Leone", + "BRK_GROUP": null, + "ABBREV": "S.L.", + "POSTAL": "SL", + "FORMAL_EN": "Republic of Sierra Leone", + "FORMAL_FR": null, + "NAME_CIAWF": "Sierra Leone", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Sierra Leone", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 1, + "MAPCOLOR13": 7, + "POP_EST": 6163195, + "POP_RANK": 13, + "GDP_MD_EST": 10640, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "SL", + "ISO_A2": "SL", + "ISO_A3": "SLE", + "ISO_A3_EH": "SLE", + "ISO_N3": "694", + "UN_A3": "694", + "WB_A2": "SL", + "WB_A3": "SLE", + "WOE_ID": 23424946, + "WOE_ID_EH": 23424946, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SLE", + "ADM0_A3_US": "SLE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 12, + "LONG_LEN": 12, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-13.24655, 6.785917, -10.230094, 10.046984], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-13.24655, 8.903049], + [-12.711958, 9.342712], + [-12.596719, 9.620188], + [-12.425929, 9.835834], + [-12.150338, 9.858572], + [-11.917277, 10.046984], + [-11.117481, 10.045873], + [-10.839152, 9.688246], + [-10.622395, 9.26791], + [-10.65477, 8.977178], + [-10.494315, 8.715541], + [-10.505477, 8.348896], + [-10.230094, 8.406206], + [-10.695595, 7.939464], + [-11.146704, 7.396706], + [-11.199802, 7.105846], + [-11.438779, 6.785917], + [-11.708195, 6.860098], + [-12.428099, 7.262942], + [-12.949049, 7.798646], + [-13.124025, 8.163946], + [-13.24655, 8.903049] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "El Salvador", + "SOV_A3": "SLV", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "El Salvador", + "ADM0_A3": "SLV", + "GEOU_DIF": 0, + "GEOUNIT": "El Salvador", + "GU_A3": "SLV", + "SU_DIF": 0, + "SUBUNIT": "El Salvador", + "SU_A3": "SLV", + "BRK_DIFF": 0, + "NAME": "El Salvador", + "NAME_LONG": "El Salvador", + "BRK_A3": "SLV", + "BRK_NAME": "El Salvador", + "BRK_GROUP": null, + "ABBREV": "El. S.", + "POSTAL": "SV", + "FORMAL_EN": "Republic of El Salvador", + "FORMAL_FR": null, + "NAME_CIAWF": "El Salvador", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "El Salvador", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 6, + "MAPCOLOR13": 8, + "POP_EST": 6172011, + "POP_RANK": 13, + "GDP_MD_EST": 54790, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "ES", + "ISO_A2": "SV", + "ISO_A3": "SLV", + "ISO_A3_EH": "SLV", + "ISO_N3": "222", + "UN_A3": "222", + "WB_A2": "SV", + "WB_A3": "SLV", + "WOE_ID": 23424807, + "WOE_ID_EH": 23424807, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SLV", + "ADM0_A3_US": "SLV", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Central America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [-90.095555, 13.149017, -87.723503, 14.424133], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-90.095555, 13.735338], + [-90.064678, 13.88197], + [-89.721934, 14.134228], + [-89.534219, 14.244816], + [-89.587343, 14.362586], + [-89.353326, 14.424133], + [-89.058512, 14.340029], + [-88.843073, 14.140507], + [-88.541231, 13.980155], + [-88.503998, 13.845486], + [-88.065343, 13.964626], + [-87.859515, 13.893312], + [-87.723503, 13.78505], + [-87.793111, 13.38448], + [-87.904112, 13.149017], + [-88.483302, 13.163951], + [-88.843228, 13.259734], + [-89.256743, 13.458533], + [-89.812394, 13.520622], + [-90.095555, 13.735338] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Somaliland", + "SOV_A3": "SOL", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Indeterminate", + "ADMIN": "Somaliland", + "ADM0_A3": "SOL", + "GEOU_DIF": 0, + "GEOUNIT": "Somaliland", + "GU_A3": "SOL", + "SU_DIF": 0, + "SUBUNIT": "Somaliland", + "SU_A3": "SOL", + "BRK_DIFF": 1, + "NAME": "Somaliland", + "NAME_LONG": "Somaliland", + "BRK_A3": "B30", + "BRK_NAME": "Somaliland", + "BRK_GROUP": null, + "ABBREV": "Solnd.", + "POSTAL": "SL", + "FORMAL_EN": "Republic of Somaliland", + "FORMAL_FR": null, + "NAME_CIAWF": null, + "NOTE_ADM0": "Self admin.", + "NOTE_BRK": "Self admin.; Claimed by Somalia", + "NAME_SORT": "Somaliland", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 5, + "MAPCOLOR13": 2, + "POP_EST": 3500000, + "POP_RANK": 12, + "GDP_MD_EST": 12250, + "POP_YEAR": 2013, + "LASTCENSUS": -99, + "GDP_YEAR": 2013, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "-99", + "ISO_A2": "-99", + "ISO_A3": "-99", + "ISO_A3_EH": "-99", + "ISO_N3": "-99", + "UN_A3": "-099", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": -99, + "WOE_ID_EH": -99, + "WOE_NOTE": "Includes old states of 2347021, 2347020, 2347017 and portion of 2347016.", + "ADM0_A3_IS": "SOM", + "ADM0_A3_US": "SOM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 4, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9 + }, + "bbox": [42.55876, 7.99688, 48.948206, 11.46204], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [42.776852, 10.926879], + [43.145305, 11.46204], + [43.47066, 11.27771], + [43.666668, 10.864169], + [44.117804, 10.445538], + [44.614259, 10.442205], + [45.556941, 10.698029], + [46.645401, 10.816549], + [47.525658, 11.127228], + [48.021596, 11.193064], + [48.378784, 11.375482], + [48.948206, 11.410622], + [48.948205, 11.410617], + [48.948205, 11.410617], + [48.942005, 11.394266], + [48.938491, 10.982327], + [48.938233, 9.9735], + [48.93813, 9.451749], + [48.486736, 8.837626], + [47.78942, 8.003], + [46.94834, 7.99688], + [43.67875, 9.18358], + [43.29699, 9.54048], + [42.92812, 10.02194], + [42.55876, 10.57258], + [42.776852, 10.926879] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Somalia", + "SOV_A3": "SOM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Somalia", + "ADM0_A3": "SOM", + "GEOU_DIF": 0, + "GEOUNIT": "Somalia", + "GU_A3": "SOM", + "SU_DIF": 0, + "SUBUNIT": "Somalia", + "SU_A3": "SOM", + "BRK_DIFF": 0, + "NAME": "Somalia", + "NAME_LONG": "Somalia", + "BRK_A3": "SOM", + "BRK_NAME": "Somalia", + "BRK_GROUP": null, + "ABBREV": "Som.", + "POSTAL": "SO", + "FORMAL_EN": "Federal Republic of Somalia", + "FORMAL_FR": null, + "NAME_CIAWF": "Somalia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Somalia", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 8, + "MAPCOLOR9": 6, + "MAPCOLOR13": 7, + "POP_EST": 7531386, + "POP_RANK": 13, + "GDP_MD_EST": 4719, + "POP_YEAR": 2017, + "LASTCENSUS": 1987, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "SO", + "ISO_A2": "SO", + "ISO_A3": "SOM", + "ISO_A3_EH": "SOM", + "ISO_N3": "706", + "UN_A3": "706", + "WB_A2": "SO", + "WB_A3": "SOM", + "WOE_ID": -90, + "WOE_ID_EH": 23424949, + "WOE_NOTE": "Includes Somaliland (2347021, 2347020, 2347017 and portion of 2347016)", + "ADM0_A3_IS": "SOM", + "ADM0_A3_US": "SOM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [40.98105, -1.68325, 51.13387, 12.02464], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [41.855083, 3.918912], + [42.12861, 4.23413], + [42.76967, 4.25259], + [43.66087, 4.95755], + [44.9636, 5.00162], + [47.78942, 8.003], + [48.486736, 8.837626], + [48.93813, 9.451749], + [48.938233, 9.9735], + [48.938491, 10.982327], + [48.942005, 11.394266], + [48.948205, 11.410617], + [48.948205, 11.410617], + [49.26776, 11.43033], + [49.72862, 11.5789], + [50.25878, 11.67957], + [50.73202, 12.0219], + [51.1112, 12.02464], + [51.13387, 11.74815], + [51.04153, 11.16651], + [51.04531, 10.6409], + [50.83418, 10.27972], + [50.55239, 9.19874], + [50.07092, 8.08173], + [49.4527, 6.80466], + [48.59455, 5.33911], + [47.74079, 4.2194], + [46.56476, 2.85529], + [45.56399, 2.04576], + [44.06815, 1.05283], + [43.13597, 0.2922], + [42.04157, -0.91916], + [41.81095, -1.44647], + [41.58513, -1.68325], + [40.993, -0.85829], + [40.98105, 2.78452], + [41.855083, 3.918912] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Republic of Serbia", + "SOV_A3": "SRB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Republic of Serbia", + "ADM0_A3": "SRB", + "GEOU_DIF": 0, + "GEOUNIT": "Republic of Serbia", + "GU_A3": "SRB", + "SU_DIF": 0, + "SUBUNIT": "Republic of Serbia", + "SU_A3": "SRB", + "BRK_DIFF": 0, + "NAME": "Serbia", + "NAME_LONG": "Serbia", + "BRK_A3": "SRB", + "BRK_NAME": "Serbia", + "BRK_GROUP": null, + "ABBREV": "Serb.", + "POSTAL": "RS", + "FORMAL_EN": "Republic of Serbia", + "FORMAL_FR": null, + "NAME_CIAWF": "Serbia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Serbia", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 3, + "MAPCOLOR9": 2, + "MAPCOLOR13": 10, + "POP_EST": 7111024, + "POP_RANK": 13, + "GDP_MD_EST": 101800, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "RI", + "ISO_A2": "RS", + "ISO_A3": "SRB", + "ISO_A3_EH": "SRB", + "ISO_N3": "688", + "UN_A3": "688", + "WB_A2": "YF", + "WB_A3": "SRB", + "WOE_ID": -90, + "WOE_ID_EH": 20069818, + "WOE_NOTE": "Expired WOE also contains Kosovo.", + "ADM0_A3_IS": "SRB", + "ADM0_A3_US": "SRB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 7 + }, + "bbox": [18.829825, 42.245224, 22.986019, 46.17173], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.65715, 44.234923], + [22.410446, 44.008063], + [22.500157, 43.642814], + [22.986019, 43.211161], + [22.604801, 42.898519], + [22.436595, 42.580321], + [22.545012, 42.461362], + [22.380526, 42.32026], + [21.91708, 42.30364], + [21.576636, 42.245224], + [21.54332, 42.32025], + [21.66292, 42.43922], + [21.77505, 42.6827], + [21.63302, 42.67717], + [21.43866, 42.86255], + [21.27421, 42.90959], + [21.143395, 43.068685], + [20.95651, 43.13094], + [20.81448, 43.27205], + [20.63508, 43.21671], + [20.49679, 42.88469], + [20.25758, 42.81275], + [20.3398, 42.89852], + [19.95857, 43.10604], + [19.63, 43.21378], + [19.48389, 43.35229], + [19.21852, 43.52384], + [19.454, 43.5681], + [19.59976, 44.03847], + [19.11761, 44.42307], + [19.36803, 44.863], + [19.00548, 44.86023], + [19.005485, 44.860234], + [19.390476, 45.236516], + [19.072769, 45.521511], + [18.829825, 45.908872], + [18.829838, 45.908878], + [19.596045, 46.17173], + [20.220192, 46.127469], + [20.762175, 45.734573], + [20.874313, 45.416375], + [21.483526, 45.18117], + [21.562023, 44.768947], + [22.145088, 44.478422], + [22.459022, 44.702517], + [22.705726, 44.578003], + [22.474008, 44.409228], + [22.65715, 44.234923] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Suriname", + "SOV_A3": "SUR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Suriname", + "ADM0_A3": "SUR", + "GEOU_DIF": 0, + "GEOUNIT": "Suriname", + "GU_A3": "SUR", + "SU_DIF": 0, + "SUBUNIT": "Suriname", + "SU_A3": "SUR", + "BRK_DIFF": 0, + "NAME": "Suriname", + "NAME_LONG": "Suriname", + "BRK_A3": "SUR", + "BRK_NAME": "Suriname", + "BRK_GROUP": null, + "ABBREV": "Sur.", + "POSTAL": "SR", + "FORMAL_EN": "Republic of Suriname", + "FORMAL_FR": null, + "NAME_CIAWF": "Suriname", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Suriname", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 7, + "MAPCOLOR13": 6, + "POP_EST": 591919, + "POP_RANK": 11, + "GDP_MD_EST": 8547, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "NS", + "ISO_A2": "SR", + "ISO_A3": "SUR", + "ISO_A3_EH": "SUR", + "ISO_N3": "740", + "UN_A3": "740", + "WB_A2": "SR", + "WB_A3": "SUR", + "WOE_ID": 23424913, + "WOE_ID_EH": 23424913, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SUR", + "ADM0_A3_US": "SUR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [-58.044694, 1.817667, -53.958045, 6.025291], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-54.524754, 2.311849], + [-55.097587, 2.523748], + [-55.569755, 2.421506], + [-55.973322, 2.510364], + [-56.073342, 2.220795], + [-55.9056, 2.021996], + [-55.995698, 1.817667], + [-56.539386, 1.899523], + [-57.150098, 2.768927], + [-57.281433, 3.333492], + [-57.601569, 3.334655], + [-58.044694, 4.060864], + [-57.86021, 4.576801], + [-57.914289, 4.812626], + [-57.307246, 5.073567], + [-57.147436, 5.97315], + [-55.949318, 5.772878], + [-55.84178, 5.953125], + [-55.03325, 6.025291], + [-53.958045, 5.756548], + [-54.478633, 4.896756], + [-54.399542, 4.212611], + [-54.011504, 3.62257], + [-54.184284, 3.194172], + [-54.27123, 2.738748], + [-54.524754, 2.311849] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Slovakia", + "SOV_A3": "SVK", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Slovakia", + "ADM0_A3": "SVK", + "GEOU_DIF": 0, + "GEOUNIT": "Slovakia", + "GU_A3": "SVK", + "SU_DIF": 0, + "SUBUNIT": "Slovakia", + "SU_A3": "SVK", + "BRK_DIFF": 0, + "NAME": "Slovakia", + "NAME_LONG": "Slovakia", + "BRK_A3": "SVK", + "BRK_NAME": "Slovakia", + "BRK_GROUP": null, + "ABBREV": "Svk.", + "POSTAL": "SK", + "FORMAL_EN": "Slovak Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Slovakia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Slovak Republic", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 4, + "MAPCOLOR9": 4, + "MAPCOLOR13": 9, + "POP_EST": 5445829, + "POP_RANK": 13, + "GDP_MD_EST": 168800, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "LO", + "ISO_A2": "SK", + "ISO_A3": "SVK", + "ISO_A3_EH": "SVK", + "ISO_N3": "703", + "UN_A3": "703", + "WB_A2": "SK", + "WB_A3": "SVK", + "WOE_ID": 23424877, + "WOE_ID_EH": 23424877, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SVK", + "ADM0_A3_US": "SVK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [16.879983, 47.758429, 22.558138, 49.571574], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.979667, 48.123497], + [16.879983, 48.470013], + [16.960288, 48.596982], + [17.101985, 48.816969], + [17.545007, 48.800019], + [17.886485, 48.903475], + [17.913512, 48.996493], + [18.104973, 49.043983], + [18.170498, 49.271515], + [18.399994, 49.315001], + [18.554971, 49.495015], + [18.853144, 49.49623], + [18.909575, 49.435846], + [19.320713, 49.571574], + [19.825023, 49.217125], + [20.415839, 49.431453], + [20.887955, 49.328772], + [21.607808, 49.470107], + [22.558138, 49.085738], + [22.280842, 48.825392], + [22.085608, 48.422264], + [21.872236, 48.319971], + [20.801294, 48.623854], + [20.473562, 48.56285], + [20.239054, 48.327567], + [19.769471, 48.202691], + [19.661364, 48.266615], + [19.174365, 48.111379], + [18.777025, 48.081768], + [18.696513, 47.880954], + [17.857133, 47.758429], + [17.488473, 47.867466], + [16.979667, 48.123497] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Slovenia", + "SOV_A3": "SVN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Slovenia", + "ADM0_A3": "SVN", + "GEOU_DIF": 0, + "GEOUNIT": "Slovenia", + "GU_A3": "SVN", + "SU_DIF": 0, + "SUBUNIT": "Slovenia", + "SU_A3": "SVN", + "BRK_DIFF": 0, + "NAME": "Slovenia", + "NAME_LONG": "Slovenia", + "BRK_A3": "SVN", + "BRK_NAME": "Slovenia", + "BRK_GROUP": null, + "ABBREV": "Slo.", + "POSTAL": "SLO", + "FORMAL_EN": "Republic of Slovenia", + "FORMAL_FR": null, + "NAME_CIAWF": "Slovenia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Slovenia", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 3, + "MAPCOLOR9": 2, + "MAPCOLOR13": 12, + "POP_EST": 1972126, + "POP_RANK": 12, + "GDP_MD_EST": 68350, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "SI", + "ISO_A2": "SI", + "ISO_A3": "SVN", + "ISO_A3_EH": "SVN", + "ISO_N3": "705", + "UN_A3": "705", + "WB_A2": "SI", + "WB_A3": "SVN", + "WOE_ID": 23424945, + "WOE_ID_EH": 23424945, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SVN", + "ADM0_A3_US": "SVN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Southern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [13.69811, 45.452316, 16.564808, 46.852386], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [13.806475, 46.509306], + [14.632472, 46.431817], + [15.137092, 46.658703], + [16.011664, 46.683611], + [16.202298, 46.852386], + [16.370505, 46.841327], + [16.564808, 46.503751], + [15.768733, 46.238108], + [15.67153, 45.834154], + [15.323954, 45.731783], + [15.327675, 45.452316], + [14.935244, 45.471695], + [14.595109, 45.634941], + [14.411968, 45.466166], + [13.71506, 45.500324], + [13.93763, 45.591016], + [13.69811, 46.016778], + [13.806475, 46.509306] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Sweden", + "SOV_A3": "SWE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Sweden", + "ADM0_A3": "SWE", + "GEOU_DIF": 0, + "GEOUNIT": "Sweden", + "GU_A3": "SWE", + "SU_DIF": 0, + "SUBUNIT": "Sweden", + "SU_A3": "SWE", + "BRK_DIFF": 0, + "NAME": "Sweden", + "NAME_LONG": "Sweden", + "BRK_A3": "SWE", + "BRK_NAME": "Sweden", + "BRK_GROUP": null, + "ABBREV": "Swe.", + "POSTAL": "S", + "FORMAL_EN": "Kingdom of Sweden", + "FORMAL_FR": null, + "NAME_CIAWF": "Sweden", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Sweden", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 4, + "MAPCOLOR9": 2, + "MAPCOLOR13": 4, + "POP_EST": 9960487, + "POP_RANK": 13, + "GDP_MD_EST": 498100, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": -99, + "FIPS_10_": "SW", + "ISO_A2": "SE", + "ISO_A3": "SWE", + "ISO_A3_EH": "SWE", + "ISO_N3": "752", + "UN_A3": "752", + "WB_A2": "SE", + "WB_A3": "SWE", + "WOE_ID": 23424954, + "WOE_ID_EH": 23424954, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SWE", + "ADM0_A3_US": "SWE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Northern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [11.027369, 55.361737, 23.903379, 69.106247], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.645593, 69.106247], + [21.978535, 68.616846], + [23.539473, 67.936009], + [23.56588, 66.396051], + [23.903379, 66.006927], + [22.183173, 65.723741], + [21.213517, 65.026005], + [21.369631, 64.413588], + [19.778876, 63.609554], + [17.847779, 62.7494], + [17.119555, 61.341166], + [17.831346, 60.636583], + [18.787722, 60.081914], + [17.869225, 58.953766], + [16.829185, 58.719827], + [16.44771, 57.041118], + [15.879786, 56.104302], + [14.666681, 56.200885], + [14.100721, 55.407781], + [12.942911, 55.361737], + [12.625101, 56.30708], + [11.787942, 57.441817], + [11.027369, 58.856149], + [11.468272, 59.432393], + [12.300366, 60.117933], + [12.631147, 61.293572], + [11.992064, 61.800362], + [11.930569, 63.128318], + [12.579935, 64.066219], + [13.571916, 64.049114], + [13.919905, 64.445421], + [13.55569, 64.787028], + [15.108411, 66.193867], + [16.108712, 67.302456], + [16.768879, 68.013937], + [17.729182, 68.010552], + [17.993868, 68.567391], + [19.87856, 68.407194], + [20.025269, 69.065139], + [20.645593, 69.106247] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Swaziland", + "SOV_A3": "SWZ", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Swaziland", + "ADM0_A3": "SWZ", + "GEOU_DIF": 0, + "GEOUNIT": "Swaziland", + "GU_A3": "SWZ", + "SU_DIF": 0, + "SUBUNIT": "Swaziland", + "SU_A3": "SWZ", + "BRK_DIFF": 0, + "NAME": "Swaziland", + "NAME_LONG": "Swaziland", + "BRK_A3": "SWZ", + "BRK_NAME": "Swaziland", + "BRK_GROUP": null, + "ABBREV": "Swz.", + "POSTAL": "SW", + "FORMAL_EN": "Kingdom of Swaziland", + "FORMAL_FR": null, + "NAME_CIAWF": "Swaziland", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Swaziland", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 5, + "POP_EST": 1467152, + "POP_RANK": 12, + "GDP_MD_EST": 11060, + "POP_YEAR": 2017, + "LASTCENSUS": 2007, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "WZ", + "ISO_A2": "SZ", + "ISO_A3": "SWZ", + "ISO_A3_EH": "SWZ", + "ISO_N3": "748", + "UN_A3": "748", + "WB_A2": "SZ", + "WB_A3": "SWZ", + "WOE_ID": 23424993, + "WOE_ID_EH": 23424993, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SWZ", + "ADM0_A3_US": "SWZ", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Southern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [30.676609, -27.285879, 32.071665, -25.660191], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [31.837778, -25.843332], + [31.985779, -26.29178], + [32.071665, -26.73382], + [31.86806, -27.177927], + [31.282773, -27.285879], + [30.685962, -26.743845], + [30.676609, -26.398078], + [30.949667, -26.022649], + [31.04408, -25.731452], + [31.333158, -25.660191], + [31.837778, -25.843332] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Syria", + "SOV_A3": "SYR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Syria", + "ADM0_A3": "SYR", + "GEOU_DIF": 0, + "GEOUNIT": "Syria", + "GU_A3": "SYR", + "SU_DIF": 0, + "SUBUNIT": "Syria", + "SU_A3": "SYR", + "BRK_DIFF": 0, + "NAME": "Syria", + "NAME_LONG": "Syria", + "BRK_A3": "SYR", + "BRK_NAME": "Syria", + "BRK_GROUP": null, + "ABBREV": "Syria", + "POSTAL": "SYR", + "FORMAL_EN": "Syrian Arab Republic", + "FORMAL_FR": null, + "NAME_CIAWF": "Syria", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Syrian Arab Republic", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 6, + "POP_EST": 18028549, + "POP_RANK": 14, + "GDP_MD_EST": 50280, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2015, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "SY", + "ISO_A2": "SY", + "ISO_A3": "SYR", + "ISO_A3_EH": "SYR", + "ISO_N3": "760", + "UN_A3": "760", + "WB_A2": "SY", + "WB_A3": "SYR", + "WOE_ID": 23424956, + "WOE_ID_EH": 23424956, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "SYR", + "ADM0_A3_US": "SYR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [35.700798, 32.312938, 42.349591, 37.229873], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [42.349591, 37.229873], + [41.837064, 36.605854], + [41.289707, 36.358815], + [41.383965, 35.628317], + [41.006159, 34.419372], + [38.792341, 33.378686], + [36.834062, 32.312938], + [35.719918, 32.709192], + [35.700798, 32.716014], + [35.836397, 32.868123], + [35.821101, 33.277426], + [36.06646, 33.824912], + [36.61175, 34.201789], + [36.448194, 34.593935], + [35.998403, 34.644914], + [35.905023, 35.410009], + [36.149763, 35.821535], + [36.41755, 36.040617], + [36.685389, 36.259699], + [36.739494, 36.81752], + [37.066761, 36.623036], + [38.167727, 36.90121], + [38.699891, 36.712927], + [39.52258, 36.716054], + [40.673259, 37.091276], + [41.212089, 37.074352], + [42.349591, 37.229873] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Chad", + "SOV_A3": "TCD", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Chad", + "ADM0_A3": "TCD", + "GEOU_DIF": 0, + "GEOUNIT": "Chad", + "GU_A3": "TCD", + "SU_DIF": 0, + "SUBUNIT": "Chad", + "SU_A3": "TCD", + "BRK_DIFF": 0, + "NAME": "Chad", + "NAME_LONG": "Chad", + "BRK_A3": "TCD", + "BRK_NAME": "Chad", + "BRK_GROUP": null, + "ABBREV": "Chad", + "POSTAL": "TD", + "FORMAL_EN": "Republic of Chad", + "FORMAL_FR": null, + "NAME_CIAWF": "Chad", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Chad", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 1, + "MAPCOLOR9": 8, + "MAPCOLOR13": 6, + "POP_EST": 12075985, + "POP_RANK": 14, + "GDP_MD_EST": 30590, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "CD", + "ISO_A2": "TD", + "ISO_A3": "TCD", + "ISO_A3_EH": "TCD", + "ISO_N3": "148", + "UN_A3": "148", + "WB_A2": "TD", + "WB_A3": "TCD", + "WOE_ID": 23424777, + "WOE_ID_EH": 23424777, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TCD", + "ADM0_A3_US": "TCD", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Middle Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [13.540394, 7.421925, 23.88689, 23.40972], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.864165, 11.142395], + [22.231129, 10.971889], + [21.723822, 10.567056], + [21.000868, 9.475985], + [20.059685, 9.012706], + [19.094008, 9.074847], + [18.81201, 8.982915], + [18.911022, 8.630895], + [18.389555, 8.281304], + [17.96493, 7.890914], + [16.705988, 7.508328], + [16.456185, 7.734774], + [16.290562, 7.754307], + [16.106232, 7.497088], + [15.27946, 7.421925], + [15.436092, 7.692812], + [15.120866, 8.38215], + [14.979996, 8.796104], + [14.544467, 8.965861], + [13.954218, 9.549495], + [14.171466, 10.021378], + [14.627201, 9.920919], + [14.909354, 9.992129], + [15.467873, 9.982337], + [14.923565, 10.891325], + [14.960152, 11.555574], + [14.89336, 12.21905], + [14.495787, 12.859396], + [14.595781, 13.330427], + [13.954477, 13.353449], + [13.956699, 13.996691], + [13.540394, 14.367134], + [13.97217, 15.68437], + [15.247731, 16.627306], + [15.300441, 17.92795], + [15.685741, 19.95718], + [15.903247, 20.387619], + [15.487148, 20.730415], + [15.47106, 21.04845], + [15.096888, 21.308519], + [14.8513, 22.86295], + [15.86085, 23.40972], + [19.84926, 21.49509], + [23.83766, 19.58047], + [23.88689, 15.61084], + [23.02459, 15.68072], + [22.56795, 14.94429], + [22.30351, 14.32682], + [22.51202, 14.09318], + [22.18329, 13.78648], + [22.29658, 13.37232], + [22.03759, 12.95546], + [21.93681, 12.58818], + [22.28801, 12.64605], + [22.49762, 12.26024], + [22.50869, 11.67936], + [22.87622, 11.38461], + [22.864165, 11.142395] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 6, + "SOVEREIGNT": "Togo", + "SOV_A3": "TGO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Togo", + "ADM0_A3": "TGO", + "GEOU_DIF": 0, + "GEOUNIT": "Togo", + "GU_A3": "TGO", + "SU_DIF": 0, + "SUBUNIT": "Togo", + "SU_A3": "TGO", + "BRK_DIFF": 0, + "NAME": "Togo", + "NAME_LONG": "Togo", + "BRK_A3": "TGO", + "BRK_NAME": "Togo", + "BRK_GROUP": null, + "ABBREV": "Togo", + "POSTAL": "TG", + "FORMAL_EN": "Togolese Republic", + "FORMAL_FR": "République Togolaise", + "NAME_CIAWF": "Togo", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Togo", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 1, + "MAPCOLOR9": 3, + "MAPCOLOR13": 5, + "POP_EST": 7965055, + "POP_RANK": 13, + "GDP_MD_EST": 11610, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "TO", + "ISO_A2": "TG", + "ISO_A3": "TGO", + "ISO_A3_EH": "TGO", + "ISO_N3": "768", + "UN_A3": "768", + "WB_A2": "TG", + "WB_A3": "TGO", + "WOE_ID": 23424965, + "WOE_ID_EH": 23424965, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TGO", + "ADM0_A3_US": "TGO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Western Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 4, + "LONG_LEN": 4, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 5, + "MAX_LABEL": 10 + }, + "bbox": [-0.049785, 5.928837, 1.865241, 11.018682], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0.899563, 10.997339], + [0.772336, 10.470808], + [1.077795, 10.175607], + [1.425061, 9.825395], + [1.463043, 9.334624], + [1.664478, 9.12859], + [1.618951, 6.832038], + [1.865241, 6.142158], + [1.060122, 5.928837], + [0.836931, 6.279979], + [0.570384, 6.914359], + [0.490957, 7.411744], + [0.712029, 8.312465], + [0.461192, 8.677223], + [0.365901, 9.465004], + [0.36758, 10.191213], + [-0.049785, 10.706918], + [0.023803, 11.018682], + [0.899563, 10.997339] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Thailand", + "SOV_A3": "THA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Thailand", + "ADM0_A3": "THA", + "GEOU_DIF": 0, + "GEOUNIT": "Thailand", + "GU_A3": "THA", + "SU_DIF": 0, + "SUBUNIT": "Thailand", + "SU_A3": "THA", + "BRK_DIFF": 0, + "NAME": "Thailand", + "NAME_LONG": "Thailand", + "BRK_A3": "THA", + "BRK_NAME": "Thailand", + "BRK_GROUP": null, + "ABBREV": "Thai.", + "POSTAL": "TH", + "FORMAL_EN": "Kingdom of Thailand", + "FORMAL_FR": null, + "NAME_CIAWF": "Thailand", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Thailand", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 8, + "MAPCOLOR13": 1, + "POP_EST": 68414135, + "POP_RANK": 16, + "GDP_MD_EST": 1161000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "TH", + "ISO_A2": "TH", + "ISO_A3": "THA", + "ISO_A3_EH": "THA", + "ISO_N3": "764", + "UN_A3": "764", + "WB_A2": "TH", + "WB_A3": "THA", + "WOE_ID": 23424960, + "WOE_ID_EH": 23424960, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "THA", + "ADM0_A3_US": "THA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [97.375896, 5.691384, 105.589039, 20.41785], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [105.218777, 14.273212], + [104.281418, 14.416743], + [102.988422, 14.225721], + [102.348099, 13.394247], + [102.584932, 12.186595], + [101.687158, 12.64574], + [100.83181, 12.627085], + [100.978467, 13.412722], + [100.097797, 13.406856], + [100.018733, 12.307001], + [99.478921, 10.846367], + [99.153772, 9.963061], + [99.222399, 9.239255], + [99.873832, 9.207862], + [100.279647, 8.295153], + [100.459274, 7.429573], + [101.017328, 6.856869], + [101.623079, 6.740622], + [102.141187, 6.221636], + [101.814282, 5.810808], + [101.154219, 5.691384], + [101.075516, 6.204867], + [100.259596, 6.642825], + [100.085757, 6.464489], + [99.690691, 6.848213], + [99.519642, 7.343454], + [98.988253, 7.907993], + [98.503786, 8.382305], + [98.339662, 7.794512], + [98.150009, 8.350007], + [98.25915, 8.973923], + [98.553551, 9.93296], + [99.038121, 10.960546], + [99.587286, 11.892763], + [99.196354, 12.804748], + [99.212012, 13.269294], + [99.097755, 13.827503], + [98.430819, 14.622028], + [98.192074, 15.123703], + [98.537376, 15.308497], + [98.903348, 16.177824], + [98.493761, 16.837836], + [97.859123, 17.567946], + [97.375896, 18.445438], + [97.797783, 18.62708], + [98.253724, 19.708203], + [98.959676, 19.752981], + [99.543309, 20.186598], + [100.115988, 20.41785], + [100.548881, 20.109238], + [100.606294, 19.508344], + [101.282015, 19.462585], + [101.035931, 18.408928], + [101.059548, 17.512497], + [102.113592, 18.109102], + [102.413005, 17.932782], + [102.998706, 17.961695], + [103.200192, 18.309632], + [103.956477, 18.240954], + [104.716947, 17.428859], + [104.779321, 16.441865], + [105.589039, 15.570316], + [105.544338, 14.723934], + [105.218777, 14.273212] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Tajikistan", + "SOV_A3": "TJK", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Tajikistan", + "ADM0_A3": "TJK", + "GEOU_DIF": 0, + "GEOUNIT": "Tajikistan", + "GU_A3": "TJK", + "SU_DIF": 0, + "SUBUNIT": "Tajikistan", + "SU_A3": "TJK", + "BRK_DIFF": 0, + "NAME": "Tajikistan", + "NAME_LONG": "Tajikistan", + "BRK_A3": "TJK", + "BRK_NAME": "Tajikistan", + "BRK_GROUP": null, + "ABBREV": "Tjk.", + "POSTAL": "TJ", + "FORMAL_EN": "Republic of Tajikistan", + "FORMAL_FR": null, + "NAME_CIAWF": "Tajikistan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Tajikistan", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 5, + "POP_EST": 8468555, + "POP_RANK": 13, + "GDP_MD_EST": 25810, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "TI", + "ISO_A2": "TJ", + "ISO_A3": "TJK", + "ISO_A3_EH": "TJK", + "ISO_N3": "762", + "UN_A3": "762", + "WB_A2": "TJ", + "WB_A3": "TJK", + "WOE_ID": 23424961, + "WOE_ID_EH": 23424961, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TJK", + "ADM0_A3_US": "TJK", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Central Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [67.44222, 36.738171, 74.980002, 40.960213], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [74.980002, 37.41999], + [73.948696, 37.421566], + [73.260056, 37.495257], + [72.63689, 37.047558], + [72.193041, 36.948288], + [71.844638, 36.738171], + [71.448693, 37.065645], + [71.541918, 37.905774], + [71.239404, 37.953265], + [71.348131, 38.258905], + [70.806821, 38.486282], + [70.376304, 38.138396], + [70.270574, 37.735165], + [70.116578, 37.588223], + [69.518785, 37.608997], + [69.196273, 37.151144], + [68.859446, 37.344336], + [68.135562, 37.023115], + [67.83, 37.144994], + [68.392033, 38.157025], + [68.176025, 38.901553], + [67.44222, 39.140144], + [67.701429, 39.580478], + [68.536416, 39.533453], + [69.011633, 40.086158], + [69.329495, 40.727824], + [70.666622, 40.960213], + [70.45816, 40.496495], + [70.601407, 40.218527], + [71.014198, 40.244366], + [70.648019, 39.935754], + [69.55961, 40.103211], + [69.464887, 39.526683], + [70.549162, 39.604198], + [71.784694, 39.279463], + [73.675379, 39.431237], + [73.928852, 38.505815], + [74.257514, 38.606507], + [74.864816, 38.378846], + [74.829986, 37.990007], + [74.980002, 37.41999] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Turkmenistan", + "SOV_A3": "TKM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Turkmenistan", + "ADM0_A3": "TKM", + "GEOU_DIF": 0, + "GEOUNIT": "Turkmenistan", + "GU_A3": "TKM", + "SU_DIF": 0, + "SUBUNIT": "Turkmenistan", + "SU_A3": "TKM", + "BRK_DIFF": 0, + "NAME": "Turkmenistan", + "NAME_LONG": "Turkmenistan", + "BRK_A3": "TKM", + "BRK_NAME": "Turkmenistan", + "BRK_GROUP": null, + "ABBREV": "Turkm.", + "POSTAL": "TM", + "FORMAL_EN": "Turkmenistan", + "FORMAL_FR": null, + "NAME_CIAWF": "Turkmenistan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Turkmenistan", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 2, + "MAPCOLOR9": 1, + "MAPCOLOR13": 9, + "POP_EST": 5351277, + "POP_RANK": 13, + "GDP_MD_EST": 94720, + "POP_YEAR": 2017, + "LASTCENSUS": 1995, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "TX", + "ISO_A2": "TM", + "ISO_A3": "TKM", + "ISO_A3_EH": "TKM", + "ISO_N3": "795", + "UN_A3": "795", + "WB_A2": "TM", + "WB_A3": "TKM", + "WOE_ID": 23424972, + "WOE_ID_EH": 23424972, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TKM", + "ADM0_A3_US": "TKM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Central Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 12, + "LONG_LEN": 12, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [52.50246, 35.270664, 66.54615, 42.751551], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [66.518607, 37.362784], + [66.217385, 37.39379], + [65.745631, 37.661164], + [65.588948, 37.305217], + [64.746105, 37.111818], + [64.546479, 36.312073], + [63.982896, 36.007957], + [63.193538, 35.857166], + [62.984662, 35.404041], + [62.230651, 35.270664], + [61.210817, 35.650072], + [61.123071, 36.491597], + [60.377638, 36.527383], + [59.234762, 37.412988], + [58.436154, 37.522309], + [57.330434, 38.029229], + [56.619366, 38.121394], + [56.180375, 37.935127], + [55.511578, 37.964117], + [54.800304, 37.392421], + [53.921598, 37.198918], + [53.735511, 37.906136], + [53.880929, 38.952093], + [53.101028, 39.290574], + [53.357808, 39.975286], + [52.693973, 40.033629], + [52.915251, 40.876523], + [53.858139, 40.631034], + [54.736845, 40.951015], + [54.008311, 41.551211], + [53.721713, 42.123191], + [52.91675, 41.868117], + [52.814689, 41.135371], + [52.50246, 41.783316], + [52.944293, 42.116034], + [54.079418, 42.324109], + [54.755345, 42.043971], + [55.455251, 41.259859], + [55.968191, 41.308642], + [57.096391, 41.32231], + [56.932215, 41.826026], + [57.78653, 42.170553], + [58.629011, 42.751551], + [59.976422, 42.223082], + [60.083341, 41.425146], + [60.465953, 41.220327], + [61.547179, 41.26637], + [61.882714, 41.084857], + [62.37426, 40.053886], + [63.518015, 39.363257], + [64.170223, 38.892407], + [65.215999, 38.402695], + [66.54615, 37.974685], + [66.518607, 37.362784] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "East Timor", + "SOV_A3": "TLS", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "East Timor", + "ADM0_A3": "TLS", + "GEOU_DIF": 0, + "GEOUNIT": "East Timor", + "GU_A3": "TLS", + "SU_DIF": 0, + "SUBUNIT": "East Timor", + "SU_A3": "TLS", + "BRK_DIFF": 0, + "NAME": "Timor-Leste", + "NAME_LONG": "Timor-Leste", + "BRK_A3": "TLS", + "BRK_NAME": "Timor-Leste", + "BRK_GROUP": null, + "ABBREV": "T.L.", + "POSTAL": "TL", + "FORMAL_EN": "Democratic Republic of Timor-Leste", + "FORMAL_FR": null, + "NAME_CIAWF": "Timor-Leste", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Timor-Leste", + "NAME_ALT": "East Timor", + "MAPCOLOR7": 2, + "MAPCOLOR8": 2, + "MAPCOLOR9": 4, + "MAPCOLOR13": 3, + "POP_EST": 1291358, + "POP_RANK": 12, + "GDP_MD_EST": 4975, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "TT", + "ISO_A2": "TL", + "ISO_A3": "TLS", + "ISO_A3_EH": "TLS", + "ISO_N3": "626", + "UN_A3": "626", + "WB_A2": "TP", + "WB_A3": "TMP", + "WOE_ID": 23424968, + "WOE_ID_EH": 23424968, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TLS", + "ADM0_A3_US": "TLS", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 11, + "LONG_LEN": 11, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [124.968682, -9.393173, 127.335928, -8.273345], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [125.08852, -9.393173], + [125.07002, -9.089987], + [124.968682, -8.89279], + [125.086246, -8.656887], + [125.947072, -8.432095], + [126.644704, -8.398247], + [126.957243, -8.273345], + [127.335928, -8.397317], + [126.967992, -8.668256], + [125.925885, -9.106007], + [125.08852, -9.393173] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 5, + "SOVEREIGNT": "Trinidad and Tobago", + "SOV_A3": "TTO", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Trinidad and Tobago", + "ADM0_A3": "TTO", + "GEOU_DIF": 0, + "GEOUNIT": "Trinidad and Tobago", + "GU_A3": "TTO", + "SU_DIF": 0, + "SUBUNIT": "Trinidad and Tobago", + "SU_A3": "TTO", + "BRK_DIFF": 0, + "NAME": "Trinidad and Tobago", + "NAME_LONG": "Trinidad and Tobago", + "BRK_A3": "TTO", + "BRK_NAME": "Trinidad and Tobago", + "BRK_GROUP": null, + "ABBREV": "Tr.T.", + "POSTAL": "TT", + "FORMAL_EN": "Republic of Trinidad and Tobago", + "FORMAL_FR": null, + "NAME_CIAWF": "Trinidad and Tobago", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Trinidad and Tobago", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 5, + "POP_EST": 1218208, + "POP_RANK": 12, + "GDP_MD_EST": 43570, + "POP_YEAR": 2017, + "LASTCENSUS": 2011, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "TD", + "ISO_A2": "TT", + "ISO_A3": "TTO", + "ISO_A3_EH": "TTO", + "ISO_N3": "780", + "UN_A3": "780", + "WB_A2": "TT", + "WB_A3": "TTO", + "WOE_ID": 23424958, + "WOE_ID_EH": 23424958, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TTO", + "ADM0_A3_US": "TTO", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Caribbean", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 19, + "LONG_LEN": 19, + "ABBREV_LEN": 5, + "TINY": 2, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4.5, + "MAX_LABEL": 9.5 + }, + "bbox": [-61.95, 10, -60.895, 10.89], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.68, 10.76], + [-61.105, 10.89], + [-60.895, 10.855], + [-60.935, 10.11], + [-61.77, 10], + [-61.95, 10.09], + [-61.66, 10.365], + [-61.68, 10.76] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Tunisia", + "SOV_A3": "TUN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Tunisia", + "ADM0_A3": "TUN", + "GEOU_DIF": 0, + "GEOUNIT": "Tunisia", + "GU_A3": "TUN", + "SU_DIF": 0, + "SUBUNIT": "Tunisia", + "SU_A3": "TUN", + "BRK_DIFF": 0, + "NAME": "Tunisia", + "NAME_LONG": "Tunisia", + "BRK_A3": "TUN", + "BRK_NAME": "Tunisia", + "BRK_GROUP": null, + "ABBREV": "Tun.", + "POSTAL": "TN", + "FORMAL_EN": "Republic of Tunisia", + "FORMAL_FR": null, + "NAME_CIAWF": "Tunisia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Tunisia", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 3, + "MAPCOLOR9": 3, + "MAPCOLOR13": 2, + "POP_EST": 11403800, + "POP_RANK": 14, + "GDP_MD_EST": 130800, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "TS", + "ISO_A2": "TN", + "ISO_A3": "TUN", + "ISO_A3_EH": "TUN", + "ISO_N3": "788", + "UN_A3": "788", + "WB_A2": "TN", + "WB_A3": "TUN", + "WOE_ID": 23424967, + "WOE_ID_EH": 23424967, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TUN", + "ADM0_A3_US": "TUN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Northern Africa", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [7.524482, 30.307556, 11.488787, 37.349994], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.48214, 30.307556], + [9.055603, 32.102692], + [8.439103, 32.506285], + [8.430473, 32.748337], + [7.612642, 33.344115], + [7.524482, 34.097376], + [8.140981, 34.655146], + [8.376368, 35.479876], + [8.217824, 36.433177], + [8.420964, 36.946427], + [9.509994, 37.349994], + [10.210002, 37.230002], + [10.18065, 36.724038], + [11.028867, 37.092103], + [11.100026, 36.899996], + [10.600005, 36.41], + [10.593287, 35.947444], + [10.939519, 35.698984], + [10.807847, 34.833507], + [10.149593, 34.330773], + [10.339659, 33.785742], + [10.856836, 33.76874], + [11.108501, 33.293343], + [11.488787, 33.136996], + [11.432253, 32.368903], + [10.94479, 32.081815], + [10.636901, 31.761421], + [9.950225, 31.37607], + [10.056575, 30.961831], + [9.970017, 30.539325], + [9.48214, 30.307556] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Turkey", + "SOV_A3": "TUR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Turkey", + "ADM0_A3": "TUR", + "GEOU_DIF": 0, + "GEOUNIT": "Turkey", + "GU_A3": "TUR", + "SU_DIF": 0, + "SUBUNIT": "Turkey", + "SU_A3": "TUR", + "BRK_DIFF": 0, + "NAME": "Turkey", + "NAME_LONG": "Turkey", + "BRK_A3": "TUR", + "BRK_NAME": "Turkey", + "BRK_GROUP": null, + "ABBREV": "Tur.", + "POSTAL": "TR", + "FORMAL_EN": "Republic of Turkey", + "FORMAL_FR": null, + "NAME_CIAWF": "Turkey", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Turkey", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 8, + "MAPCOLOR13": 4, + "POP_EST": 80845215, + "POP_RANK": 16, + "GDP_MD_EST": 1670000, + "POP_YEAR": 2017, + "LASTCENSUS": 2000, + "GDP_YEAR": 2016, + "ECONOMY": "4. Emerging region: MIKT", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "TU", + "ISO_A2": "TR", + "ISO_A3": "TUR", + "ISO_A3_EH": "TUR", + "ISO_N3": "792", + "UN_A3": "792", + "WB_A2": "TR", + "WB_A3": "TUR", + "WOE_ID": 23424969, + "WOE_ID_EH": 23424969, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TUR", + "ADM0_A3_US": "TUR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [26.043351, 35.821535, 44.79399, 42.141485], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [43.582746, 41.092143], + [43.752658, 40.740201], + [43.656436, 40.253564], + [44.400009, 40.005], + [44.79399, 39.713003], + [44.109225, 39.428136], + [44.421403, 38.281281], + [44.225756, 37.971584], + [44.77267, 37.17045], + [44.772677, 37.170437], + [44.293452, 37.001514], + [43.942259, 37.256228], + [42.779126, 37.385264], + [42.349591, 37.229873], + [41.212089, 37.074352], + [40.673259, 37.091276], + [39.52258, 36.716054], + [38.699891, 36.712927], + [38.167727, 36.90121], + [37.066761, 36.623036], + [36.739494, 36.81752], + [36.685389, 36.259699], + [36.41755, 36.040617], + [36.149763, 35.821535], + [35.782085, 36.274995], + [36.160822, 36.650606], + [35.550936, 36.565443], + [34.714553, 36.795532], + [34.026895, 36.21996], + [32.509158, 36.107564], + [31.699595, 36.644275], + [30.621625, 36.677865], + [30.391096, 36.262981], + [29.699976, 36.144357], + [28.732903, 36.676831], + [27.641187, 36.658822], + [27.048768, 37.653361], + [26.318218, 38.208133], + [26.8047, 38.98576], + [26.170785, 39.463612], + [27.28002, 40.420014], + [28.819978, 40.460011], + [29.240004, 41.219991], + [31.145934, 41.087622], + [32.347979, 41.736264], + [33.513283, 42.01896], + [35.167704, 42.040225], + [36.913127, 41.335358], + [38.347665, 40.948586], + [39.512607, 41.102763], + [40.373433, 41.013673], + [41.554084, 41.535656], + [42.619549, 41.583173], + [43.582746, 41.092143] + ] + ], + [ + [ + [26.117042, 41.826905], + [27.135739, 42.141485], + [27.99672, 42.007359], + [28.115525, 41.622886], + [28.988443, 41.299934], + [28.806438, 41.054962], + [27.619017, 40.999823], + [27.192377, 40.690566], + [26.358009, 40.151994], + [26.043351, 40.617754], + [26.056942, 40.824123], + [26.294602, 40.936261], + [26.604196, 41.562115], + [26.117042, 41.826905] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Taiwan", + "SOV_A3": "TWN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Taiwan", + "ADM0_A3": "TWN", + "GEOU_DIF": 0, + "GEOUNIT": "Taiwan", + "GU_A3": "TWN", + "SU_DIF": 0, + "SUBUNIT": "Taiwan", + "SU_A3": "TWN", + "BRK_DIFF": 1, + "NAME": "Taiwan", + "NAME_LONG": "Taiwan", + "BRK_A3": "B77", + "BRK_NAME": "Taiwan", + "BRK_GROUP": null, + "ABBREV": "Taiwan", + "POSTAL": "TW", + "FORMAL_EN": null, + "FORMAL_FR": null, + "NAME_CIAWF": "Taiwan", + "NOTE_ADM0": null, + "NOTE_BRK": "Self admin.; Claimed by China", + "NAME_SORT": "Taiwan", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 5, + "MAPCOLOR9": 7, + "MAPCOLOR13": 2, + "POP_EST": 23508428, + "POP_RANK": 15, + "GDP_MD_EST": 1127000, + "POP_YEAR": 2017, + "LASTCENSUS": -99, + "GDP_YEAR": 2016, + "ECONOMY": "2. Developed region: nonG7", + "INCOME_GRP": "2. High income: nonOECD", + "WIKIPEDIA": -99, + "FIPS_10_": "TW", + "ISO_A2": "TW", + "ISO_A3": "TWN", + "ISO_A3_EH": "TWN", + "ISO_N3": "158", + "UN_A3": "-099", + "WB_A2": "-99", + "WB_A3": "-99", + "WOE_ID": 23424971, + "WOE_ID_EH": 23424971, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TWN", + "ADM0_A3_US": "TWN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [120.106189, 21.970571, 121.951244, 25.295459], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [121.777818, 24.394274], + [121.175632, 22.790857], + [120.74708, 21.970571], + [120.220083, 22.814861], + [120.106189, 23.556263], + [120.69468, 24.538451], + [121.495044, 25.295459], + [121.951244, 24.997596], + [121.777818, 24.394274] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "United Republic of Tanzania", + "SOV_A3": "TZA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "United Republic of Tanzania", + "ADM0_A3": "TZA", + "GEOU_DIF": 0, + "GEOUNIT": "Tanzania", + "GU_A3": "TZA", + "SU_DIF": 0, + "SUBUNIT": "Tanzania", + "SU_A3": "TZA", + "BRK_DIFF": 0, + "NAME": "Tanzania", + "NAME_LONG": "Tanzania", + "BRK_A3": "TZA", + "BRK_NAME": "Tanzania", + "BRK_GROUP": null, + "ABBREV": "Tanz.", + "POSTAL": "TZ", + "FORMAL_EN": "United Republic of Tanzania", + "FORMAL_FR": null, + "NAME_CIAWF": "Tanzania", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Tanzania", + "NAME_ALT": null, + "MAPCOLOR7": 3, + "MAPCOLOR8": 6, + "MAPCOLOR9": 2, + "MAPCOLOR13": 2, + "POP_EST": 53950935, + "POP_RANK": 16, + "GDP_MD_EST": 150600, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "TZ", + "ISO_A2": "TZ", + "ISO_A3": "TZA", + "ISO_A3_EH": "TZA", + "ISO_N3": "834", + "UN_A3": "834", + "WB_A2": "TZ", + "WB_A3": "TZA", + "WOE_ID": 23424973, + "WOE_ID_EH": 23424973, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "TZA", + "ADM0_A3_US": "TZA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [29.339998, -11.720938, 40.31659, -0.95], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [29.339998, -4.499983], + [29.753512, -4.452389], + [30.11632, -4.09012], + [30.50554, -3.56858], + [30.75224, -3.35931], + [30.74301, -3.03431], + [30.52766, -2.80762], + [30.469674, -2.413855], + [30.46967, -2.41383], + [30.758309, -2.28725], + [30.816135, -1.698914], + [30.419105, -1.134659], + [30.76986, -1.01455], + [31.86617, -1.02736], + [33.903711, -0.95], + [34.07262, -1.05982], + [37.69869, -3.09699], + [37.7669, -3.67712], + [39.20222, -4.67677], + [38.74054, -5.90895], + [38.79977, -6.47566], + [39.44, -6.84], + [39.47, -7.1], + [39.19469, -7.7039], + [39.25203, -8.00781], + [39.18652, -8.48551], + [39.53574, -9.11237], + [39.9496, -10.0984], + [40.316586, -10.317098], + [40.31659, -10.3171], + [39.521, -10.89688], + [38.427557, -11.285202], + [37.82764, -11.26879], + [37.47129, -11.56876], + [36.775151, -11.594537], + [36.514082, -11.720938], + [35.312398, -11.439146], + [34.559989, -11.52002], + [34.28, -10.16], + [33.940838, -9.693674], + [33.73972, -9.41715], + [32.759375, -9.230599], + [32.191865, -8.930359], + [31.556348, -8.762049], + [31.157751, -8.594579], + [30.74001, -8.340006], + [30.740015, -8.340007], + [30.199997, -7.079981], + [29.620032, -6.520015], + [29.419993, -5.939999], + [29.519987, -5.419979], + [29.339998, -4.499983] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Uganda", + "SOV_A3": "UGA", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Uganda", + "ADM0_A3": "UGA", + "GEOU_DIF": 0, + "GEOUNIT": "Uganda", + "GU_A3": "UGA", + "SU_DIF": 0, + "SUBUNIT": "Uganda", + "SU_A3": "UGA", + "BRK_DIFF": 0, + "NAME": "Uganda", + "NAME_LONG": "Uganda", + "BRK_A3": "UGA", + "BRK_NAME": "Uganda", + "BRK_GROUP": null, + "ABBREV": "Uga.", + "POSTAL": "UG", + "FORMAL_EN": "Republic of Uganda", + "FORMAL_FR": null, + "NAME_CIAWF": "Uganda", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Uganda", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 6, + "MAPCOLOR13": 4, + "POP_EST": 39570125, + "POP_RANK": 15, + "GDP_MD_EST": 84930, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "UG", + "ISO_A2": "UG", + "ISO_A3": "UGA", + "ISO_A3_EH": "UGA", + "ISO_N3": "800", + "UN_A3": "800", + "WB_A2": "UG", + "WB_A3": "UGA", + "WOE_ID": 23424974, + "WOE_ID_EH": 23424974, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "UGA", + "ADM0_A3_US": "UGA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [29.579466, -1.443322, 35.03599, 4.249885], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [29.579466, -1.341313], + [29.587838, -0.587406], + [29.819503, -0.20531], + [29.875779, 0.59738], + [30.086154, 1.062313], + [30.468508, 1.583805], + [30.85267, 1.849396], + [31.174149, 2.204465], + [30.773347, 2.339883], + [30.83386, 3.509166], + [30.833852, 3.509172], + [31.24556, 3.7819], + [31.88145, 3.55827], + [32.68642, 3.79232], + [33.39, 3.79], + [34.005, 4.249885], + [34.47913, 3.5556], + [34.59607, 3.05374], + [35.03599, 1.90584], + [34.6721, 1.17694], + [34.18, 0.515], + [33.893569, 0.109814], + [33.903711, -0.95], + [31.86617, -1.02736], + [30.76986, -1.01455], + [30.419105, -1.134659], + [29.821519, -1.443322], + [29.579466, -1.341313] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Ukraine", + "SOV_A3": "UKR", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Ukraine", + "ADM0_A3": "UKR", + "GEOU_DIF": 0, + "GEOUNIT": "Ukraine", + "GU_A3": "UKR", + "SU_DIF": 0, + "SUBUNIT": "Ukraine", + "SU_A3": "UKR", + "BRK_DIFF": 0, + "NAME": "Ukraine", + "NAME_LONG": "Ukraine", + "BRK_A3": "UKR", + "BRK_NAME": "Ukraine", + "BRK_GROUP": null, + "ABBREV": "Ukr.", + "POSTAL": "UA", + "FORMAL_EN": "Ukraine", + "FORMAL_FR": null, + "NAME_CIAWF": "Ukraine", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Ukraine", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 1, + "MAPCOLOR9": 6, + "MAPCOLOR13": 3, + "POP_EST": 44033874, + "POP_RANK": 15, + "GDP_MD_EST": 352600, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "UP", + "ISO_A2": "UA", + "ISO_A3": "UKR", + "ISO_A3_EH": "UKR", + "ISO_N3": "804", + "UN_A3": "804", + "WB_A2": "UA", + "WB_A3": "UKR", + "WOE_ID": 23424976, + "WOE_ID_EH": 23424976, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "UKR", + "ADM0_A3_US": "UKR", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Europe", + "REGION_UN": "Europe", + "SUBREGION": "Eastern Europe", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7 + }, + "bbox": [22.085608, 45.293308, 40.080789, 52.335075], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.527071, 51.578454], + [24.005078, 51.617444], + [24.553106, 51.888461], + [25.327788, 51.910656], + [26.337959, 51.832289], + [27.454066, 51.592303], + [28.241615, 51.572227], + [28.617613, 51.427714], + [28.992835, 51.602044], + [29.254938, 51.368234], + [30.157364, 51.416138], + [30.555117, 51.319503], + [30.619454, 51.822806], + [30.927549, 52.042353], + [31.785992, 52.101678], + [32.15944, 52.06125], + [32.412058, 52.288695], + [32.715761, 52.238465], + [33.7527, 52.335075], + [34.391731, 51.768882], + [34.141978, 51.566413], + [34.224816, 51.255993], + [35.022183, 51.207572], + [35.37791, 50.77394], + [35.356116, 50.577197], + [36.626168, 50.225591], + [37.39346, 50.383953], + [38.010631, 49.915662], + [38.594988, 49.926462], + [40.06904, 49.60105], + [40.080789, 49.30743], + [39.67465, 48.78382], + [39.89562, 48.23241], + [39.738278, 47.898937], + [38.77057, 47.82562], + [38.255112, 47.5464], + [38.223538, 47.10219], + [37.425137, 47.022221], + [36.759855, 46.6987], + [35.823685, 46.645964], + [34.962342, 46.273197], + [35.012659, 45.737725], + [34.861792, 45.768182], + [34.732017, 45.965666], + [34.410402, 46.005162], + [33.699462, 46.219573], + [33.435988, 45.971917], + [33.298567, 46.080598], + [31.74414, 46.333348], + [31.675307, 46.706245], + [30.748749, 46.5831], + [30.377609, 46.03241], + [29.603289, 45.293308], + [29.149725, 45.464925], + [28.679779, 45.304031], + [28.233554, 45.488283], + [28.485269, 45.596907], + [28.659987, 45.939987], + [28.933717, 46.25883], + [28.862972, 46.437889], + [29.072107, 46.517678], + [29.170654, 46.379262], + [29.759972, 46.349988], + [30.024659, 46.423937], + [29.83821, 46.525326], + [29.908852, 46.674361], + [29.559674, 46.928583], + [29.415135, 47.346645], + [29.050868, 47.510227], + [29.122698, 47.849095], + [28.670891, 48.118149], + [28.259547, 48.155562], + [27.522537, 48.467119], + [26.857824, 48.368211], + [26.619337, 48.220726], + [26.19745, 48.220881], + [25.945941, 47.987149], + [25.207743, 47.891056], + [24.866317, 47.737526], + [24.402056, 47.981878], + [23.760958, 47.985598], + [23.142236, 48.096341], + [22.710531, 47.882194], + [22.64082, 48.15024], + [22.085608, 48.422264], + [22.280842, 48.825392], + [22.558138, 49.085738], + [22.776419, 49.027395], + [22.51845, 49.476774], + [23.426508, 50.308506], + [23.922757, 50.424881], + [24.029986, 50.705407], + [23.527071, 51.578454] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Uruguay", + "SOV_A3": "URY", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Uruguay", + "ADM0_A3": "URY", + "GEOU_DIF": 0, + "GEOUNIT": "Uruguay", + "GU_A3": "URY", + "SU_DIF": 0, + "SUBUNIT": "Uruguay", + "SU_A3": "URY", + "BRK_DIFF": 0, + "NAME": "Uruguay", + "NAME_LONG": "Uruguay", + "BRK_A3": "URY", + "BRK_NAME": "Uruguay", + "BRK_GROUP": null, + "ABBREV": "Ury.", + "POSTAL": "UY", + "FORMAL_EN": "Oriental Republic of Uruguay", + "FORMAL_FR": null, + "NAME_CIAWF": "Uruguay", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Uruguay", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 2, + "MAPCOLOR9": 2, + "MAPCOLOR13": 10, + "POP_EST": 3360148, + "POP_RANK": 12, + "GDP_MD_EST": 73250, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "UY", + "ISO_A2": "UY", + "ISO_A3": "URY", + "ISO_A3_EH": "URY", + "ISO_N3": "858", + "UN_A3": "858", + "WB_A2": "UY", + "WB_A3": "URY", + "WOE_ID": 23424979, + "WOE_ID_EH": 23424979, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "URY", + "ADM0_A3_US": "URY", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [-58.427074, -34.952647, -53.209589, -30.109686], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-58.427074, -33.909454], + [-58.349611, -33.263189], + [-58.132648, -33.040567], + [-58.14244, -32.044504], + [-57.874937, -31.016556], + [-57.625133, -30.216295], + [-56.976026, -30.109686], + [-55.973245, -30.883076], + [-55.60151, -30.853879], + [-54.572452, -31.494511], + [-53.787952, -32.047243], + [-53.209589, -32.727666], + [-53.650544, -33.202004], + [-53.373662, -33.768378], + [-53.806426, -34.396815], + [-54.935866, -34.952647], + [-55.67409, -34.752659], + [-56.215297, -34.859836], + [-57.139685, -34.430456], + [-57.817861, -34.462547], + [-58.427074, -33.909454] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "United States of America", + "SOV_A3": "US1", + "ADM0_DIF": 1, + "LEVEL": 2, + "TYPE": "Country", + "ADMIN": "United States of America", + "ADM0_A3": "USA", + "GEOU_DIF": 0, + "GEOUNIT": "United States of America", + "GU_A3": "USA", + "SU_DIF": 0, + "SUBUNIT": "United States", + "SU_A3": "USA", + "BRK_DIFF": 0, + "NAME": "United States of America", + "NAME_LONG": "United States", + "BRK_A3": "USA", + "BRK_NAME": "United States", + "BRK_GROUP": null, + "ABBREV": "U.S.A.", + "POSTAL": "US", + "FORMAL_EN": "United States of America", + "FORMAL_FR": null, + "NAME_CIAWF": "United States", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "United States of America", + "NAME_ALT": null, + "MAPCOLOR7": 4, + "MAPCOLOR8": 5, + "MAPCOLOR9": 1, + "MAPCOLOR13": 1, + "POP_EST": 326625791, + "POP_RANK": 17, + "GDP_MD_EST": 18560000, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "1. Developed region: G7", + "INCOME_GRP": "1. High income: OECD", + "WIKIPEDIA": 0, + "FIPS_10_": "US", + "ISO_A2": "US", + "ISO_A3": "USA", + "ISO_A3_EH": "USA", + "ISO_N3": "840", + "UN_A3": "840", + "WB_A2": "US", + "WB_A3": "USA", + "WOE_ID": 23424977, + "WOE_ID_EH": 23424977, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "USA", + "ADM0_A3_US": "USA", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "North America", + "REGION_UN": "Americas", + "SUBREGION": "Northern America", + "REGION_WB": "North America", + "NAME_LEN": 24, + "LONG_LEN": 13, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 5.7 + }, + "bbox": [-171.791111, 18.91619, -66.96466, 71.357764], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-122.84, 49], + [-120, 49], + [-117.03121, 49], + [-116.04818, 49], + [-113, 49], + [-110.05, 49], + [-107.05, 49], + [-104.04826, 48.99986], + [-100.65, 49], + [-97.22872, 49.0007], + [-95.15907, 49], + [-95.15609, 49.38425], + [-94.81758, 49.38905], + [-94.64, 48.84], + [-94.32914, 48.67074], + [-93.63087, 48.60926], + [-92.61, 48.45], + [-91.64, 48.14], + [-90.83, 48.27], + [-89.6, 48.01], + [-89.272917, 48.019808], + [-88.378114, 48.302918], + [-87.439793, 47.94], + [-86.461991, 47.553338], + [-85.652363, 47.220219], + [-84.87608, 46.900083], + [-84.779238, 46.637102], + [-84.543749, 46.538684], + [-84.6049, 46.4396], + [-84.3367, 46.40877], + [-84.14212, 46.512226], + [-84.091851, 46.275419], + [-83.890765, 46.116927], + [-83.616131, 46.116927], + [-83.469551, 45.994686], + [-83.592851, 45.816894], + [-82.550925, 45.347517], + [-82.337763, 44.44], + [-82.137642, 43.571088], + [-82.43, 42.98], + [-82.9, 42.43], + [-83.12, 42.08], + [-83.142, 41.975681], + [-83.02981, 41.832796], + [-82.690089, 41.675105], + [-82.439278, 41.675105], + [-81.277747, 42.209026], + [-80.247448, 42.3662], + [-78.939362, 42.863611], + [-78.92, 42.965], + [-79.01, 43.27], + [-79.171674, 43.466339], + [-78.72028, 43.625089], + [-77.737885, 43.629056], + [-76.820034, 43.628784], + [-76.5, 44.018459], + [-76.375, 44.09631], + [-75.31821, 44.81645], + [-74.867, 45.00048], + [-73.34783, 45.00738], + [-71.50506, 45.0082], + [-71.405, 45.255], + [-71.08482, 45.30524], + [-70.66, 45.46], + [-70.305, 45.915], + [-69.99997, 46.69307], + [-69.237216, 47.447781], + [-68.905, 47.185], + [-68.23444, 47.35486], + [-67.79046, 47.06636], + [-67.79134, 45.70281], + [-67.13741, 45.13753], + [-66.96466, 44.8097], + [-68.03252, 44.3252], + [-69.06, 43.98], + [-70.11617, 43.68405], + [-70.645476, 43.090238], + [-70.81489, 42.8653], + [-70.825, 42.335], + [-70.495, 41.805], + [-70.08, 41.78], + [-70.185, 42.145], + [-69.88497, 41.92283], + [-69.96503, 41.63717], + [-70.64, 41.475], + [-71.12039, 41.49445], + [-71.86, 41.32], + [-72.295, 41.27], + [-72.87643, 41.22065], + [-73.71, 40.931102], + [-72.24126, 41.11948], + [-71.945, 40.93], + [-73.345, 40.63], + [-73.982, 40.628], + [-73.952325, 40.75075], + [-74.25671, 40.47351], + [-73.96244, 40.42763], + [-74.17838, 39.70926], + [-74.90604, 38.93954], + [-74.98041, 39.1964], + [-75.20002, 39.24845], + [-75.52805, 39.4985], + [-75.32, 38.96], + [-75.071835, 38.782032], + [-75.05673, 38.40412], + [-75.37747, 38.01551], + [-75.94023, 37.21689], + [-76.03127, 37.2566], + [-75.72205, 37.93705], + [-76.23287, 38.319215], + [-76.35, 39.15], + [-76.542725, 38.717615], + [-76.32933, 38.08326], + [-76.989998, 38.239992], + [-76.30162, 37.917945], + [-76.25874, 36.9664], + [-75.9718, 36.89726], + [-75.86804, 36.55125], + [-75.72749, 35.55074], + [-76.36318, 34.80854], + [-77.397635, 34.51201], + [-78.05496, 33.92547], + [-78.55435, 33.86133], + [-79.06067, 33.49395], + [-79.20357, 33.15839], + [-80.301325, 32.509355], + [-80.86498, 32.0333], + [-81.33629, 31.44049], + [-81.49042, 30.72999], + [-81.31371, 30.03552], + [-80.98, 29.18], + [-80.535585, 28.47213], + [-80.53, 28.04], + [-80.056539, 26.88], + [-80.088015, 26.205765], + [-80.13156, 25.816775], + [-80.38103, 25.20616], + [-80.68, 25.08], + [-81.17213, 25.20126], + [-81.33, 25.64], + [-81.71, 25.87], + [-82.24, 26.73], + [-82.70515, 27.49504], + [-82.85526, 27.88624], + [-82.65, 28.55], + [-82.93, 29.1], + [-83.70959, 29.93656], + [-84.1, 30.09], + [-85.10882, 29.63615], + [-85.28784, 29.68612], + [-85.7731, 30.15261], + [-86.4, 30.4], + [-87.53036, 30.27433], + [-88.41782, 30.3849], + [-89.18049, 30.31598], + [-89.593831, 30.159994], + [-89.413735, 29.89419], + [-89.43, 29.48864], + [-89.21767, 29.29108], + [-89.40823, 29.15961], + [-89.77928, 29.30714], + [-90.15463, 29.11743], + [-90.880225, 29.148535], + [-91.626785, 29.677], + [-92.49906, 29.5523], + [-93.22637, 29.78375], + [-93.84842, 29.71363], + [-94.69, 29.48], + [-95.60026, 28.73863], + [-96.59404, 28.30748], + [-97.14, 27.83], + [-97.37, 27.38], + [-97.38, 26.69], + [-97.33, 26.21], + [-97.14, 25.87], + [-97.53, 25.84], + [-98.24, 26.06], + [-99.02, 26.37], + [-99.3, 26.84], + [-99.52, 27.54], + [-100.11, 28.11], + [-100.45584, 28.69612], + [-100.9576, 29.38071], + [-101.6624, 29.7793], + [-102.48, 29.76], + [-103.11, 28.97], + [-103.94, 29.27], + [-104.45697, 29.57196], + [-104.70575, 30.12173], + [-105.03737, 30.64402], + [-105.63159, 31.08383], + [-106.1429, 31.39995], + [-106.50759, 31.75452], + [-108.24, 31.754854], + [-108.24194, 31.34222], + [-109.035, 31.34194], + [-111.02361, 31.33472], + [-113.30498, 32.03914], + [-114.815, 32.52528], + [-114.72139, 32.72083], + [-115.99135, 32.61239], + [-117.12776, 32.53534], + [-117.295938, 33.046225], + [-117.944, 33.621236], + [-118.410602, 33.740909], + [-118.519895, 34.027782], + [-119.081, 34.078], + [-119.438841, 34.348477], + [-120.36778, 34.44711], + [-120.62286, 34.60855], + [-120.74433, 35.15686], + [-121.71457, 36.16153], + [-122.54747, 37.55176], + [-122.51201, 37.78339], + [-122.95319, 38.11371], + [-123.7272, 38.95166], + [-123.86517, 39.76699], + [-124.39807, 40.3132], + [-124.17886, 41.14202], + [-124.2137, 41.99964], + [-124.53284, 42.76599], + [-124.14214, 43.70838], + [-124.020535, 44.615895], + [-123.89893, 45.52341], + [-124.079635, 46.86475], + [-124.39567, 47.72017], + [-124.68721, 48.184433], + [-124.566101, 48.379715], + [-123.12, 48.04], + [-122.58736, 47.096], + [-122.34, 47.36], + [-122.5, 48.18], + [-122.84, 49] + ] + ], + [ + [ + [-140.985988, 69.711998], + [-140.986, 69.712], + [-140.9925, 66.00003], + [-140.99778, 60.30639], + [-140.013, 60.27682], + [-139.039, 60], + [-138.34089, 59.56211], + [-137.4525, 58.905], + [-136.47972, 59.46389], + [-135.47583, 59.78778], + [-134.945, 59.27056], + [-134.27111, 58.86111], + [-133.35556, 58.41028], + [-132.73042, 57.69289], + [-131.70781, 56.55212], + [-130.00778, 55.91583], + [-129.98, 55.285], + [-130.53611, 54.80278], + [-130.536109, 54.802754], + [-130.53611, 54.802753], + [-131.085818, 55.178906], + [-131.967211, 55.497776], + [-132.250011, 56.369996], + [-133.539181, 57.178887], + [-134.078063, 58.123068], + [-135.038211, 58.187715], + [-136.628062, 58.212209], + [-137.800006, 58.499995], + [-139.867787, 59.537762], + [-140.825274, 59.727517], + [-142.574444, 60.084447], + [-143.958881, 59.99918], + [-145.925557, 60.45861], + [-147.114374, 60.884656], + [-148.224306, 60.672989], + [-148.018066, 59.978329], + [-148.570823, 59.914173], + [-149.727858, 59.705658], + [-150.608243, 59.368211], + [-151.716393, 59.155821], + [-151.859433, 59.744984], + [-151.409719, 60.725803], + [-150.346941, 61.033588], + [-150.621111, 61.284425], + [-151.895839, 60.727198], + [-152.57833, 60.061657], + [-154.019172, 59.350279], + [-153.287511, 58.864728], + [-154.232492, 58.146374], + [-155.307491, 57.727795], + [-156.308335, 57.422774], + [-156.556097, 56.979985], + [-158.117217, 56.463608], + [-158.433321, 55.994154], + [-159.603327, 55.566686], + [-160.28972, 55.643581], + [-161.223048, 55.364735], + [-162.237766, 55.024187], + [-163.069447, 54.689737], + [-164.785569, 54.404173], + [-164.942226, 54.572225], + [-163.84834, 55.039431], + [-162.870001, 55.348043], + [-161.804175, 55.894986], + [-160.563605, 56.008055], + [-160.07056, 56.418055], + [-158.684443, 57.016675], + [-158.461097, 57.216921], + [-157.72277, 57.570001], + [-157.550274, 58.328326], + [-157.041675, 58.918885], + [-158.194731, 58.615802], + [-158.517218, 58.787781], + [-159.058606, 58.424186], + [-159.711667, 58.93139], + [-159.981289, 58.572549], + [-160.355271, 59.071123], + [-161.355003, 58.670838], + [-161.968894, 58.671665], + [-162.054987, 59.266925], + [-161.874171, 59.633621], + [-162.518059, 59.989724], + [-163.818341, 59.798056], + [-164.662218, 60.267484], + [-165.346388, 60.507496], + [-165.350832, 61.073895], + [-166.121379, 61.500019], + [-165.734452, 62.074997], + [-164.919179, 62.633076], + [-164.562508, 63.146378], + [-163.753332, 63.219449], + [-163.067224, 63.059459], + [-162.260555, 63.541936], + [-161.53445, 63.455817], + [-160.772507, 63.766108], + [-160.958335, 64.222799], + [-161.518068, 64.402788], + [-160.777778, 64.788604], + [-161.391926, 64.777235], + [-162.45305, 64.559445], + [-162.757786, 64.338605], + [-163.546394, 64.55916], + [-164.96083, 64.446945], + [-166.425288, 64.686672], + [-166.845004, 65.088896], + [-168.11056, 65.669997], + [-166.705271, 66.088318], + [-164.47471, 66.57666], + [-163.652512, 66.57666], + [-163.788602, 66.077207], + [-161.677774, 66.11612], + [-162.489715, 66.735565], + [-163.719717, 67.116395], + [-164.430991, 67.616338], + [-165.390287, 68.042772], + [-166.764441, 68.358877], + [-166.204707, 68.883031], + [-164.430811, 68.915535], + [-163.168614, 69.371115], + [-162.930566, 69.858062], + [-161.908897, 70.33333], + [-160.934797, 70.44769], + [-159.039176, 70.891642], + [-158.119723, 70.824721], + [-156.580825, 71.357764], + [-155.06779, 71.147776], + [-154.344165, 70.696409], + [-153.900006, 70.889989], + [-152.210006, 70.829992], + [-152.270002, 70.600006], + [-150.739992, 70.430017], + [-149.720003, 70.53001], + [-147.613362, 70.214035], + [-145.68999, 70.12001], + [-144.920011, 69.989992], + [-143.589446, 70.152514], + [-142.07251, 69.851938], + [-140.985988, 69.711998], + [-140.985988, 69.711998] + ] + ], + [ + [ + [-155.54211, 19.08348], + [-155.68817, 18.91619], + [-155.93665, 19.05939], + [-155.90806, 19.33888], + [-156.07347, 19.70294], + [-156.02368, 19.81422], + [-155.85008, 19.97729], + [-155.91907, 20.17395], + [-155.86108, 20.26721], + [-155.78505, 20.2487], + [-155.40214, 20.07975], + [-155.22452, 19.99302], + [-155.06226, 19.8591], + [-154.80741, 19.50871], + [-154.83147, 19.45328], + [-155.22217, 19.23972], + [-155.54211, 19.08348] + ] + ], + [ + [ + [-156.07926, 20.64397], + [-156.41445, 20.57241], + [-156.58673, 20.783], + [-156.70167, 20.8643], + [-156.71055, 20.92676], + [-156.61258, 21.01249], + [-156.25711, 20.91745], + [-155.99566, 20.76404], + [-156.07926, 20.64397] + ] + ], + [ + [ + [-156.75824, 21.17684], + [-156.78933, 21.06873], + [-157.32521, 21.09777], + [-157.25027, 21.21958], + [-156.75824, 21.17684] + ] + ], + [ + [ + [-157.65283, 21.32217], + [-157.70703, 21.26442], + [-157.7786, 21.27729], + [-158.12667, 21.31244], + [-158.2538, 21.53919], + [-158.29265, 21.57912], + [-158.0252, 21.71696], + [-157.94161, 21.65272], + [-157.65283, 21.32217] + ] + ], + [ + [ + [-159.34512, 21.982], + [-159.46372, 21.88299], + [-159.80051, 22.06533], + [-159.74877, 22.1382], + [-159.5962, 22.23618], + [-159.36569, 22.21494], + [-159.34512, 21.982] + ] + ], + [ + [ + [-153.006314, 57.115842], + [-154.00509, 56.734677], + [-154.516403, 56.992749], + [-154.670993, 57.461196], + [-153.76278, 57.816575], + [-153.228729, 57.968968], + [-152.564791, 57.901427], + [-152.141147, 57.591059], + [-153.006314, 57.115842] + ] + ], + [ + [ + [-165.579164, 59.909987], + [-166.19277, 59.754441], + [-166.848337, 59.941406], + [-167.455277, 60.213069], + [-166.467792, 60.38417], + [-165.67443, 60.293607], + [-165.579164, 59.909987] + ] + ], + [ + [ + [-171.731657, 63.782515], + [-171.114434, 63.592191], + [-170.491112, 63.694975], + [-169.682505, 63.431116], + [-168.689439, 63.297506], + [-168.771941, 63.188598], + [-169.52944, 62.976931], + [-170.290556, 63.194438], + [-170.671386, 63.375822], + [-171.553063, 63.317789], + [-171.791111, 63.405846], + [-171.731657, 63.782515] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Uzbekistan", + "SOV_A3": "UZB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Uzbekistan", + "ADM0_A3": "UZB", + "GEOU_DIF": 0, + "GEOUNIT": "Uzbekistan", + "GU_A3": "UZB", + "SU_DIF": 0, + "SUBUNIT": "Uzbekistan", + "SU_A3": "UZB", + "BRK_DIFF": 0, + "NAME": "Uzbekistan", + "NAME_LONG": "Uzbekistan", + "BRK_A3": "UZB", + "BRK_NAME": "Uzbekistan", + "BRK_GROUP": null, + "ABBREV": "Uzb.", + "POSTAL": "UZ", + "FORMAL_EN": "Republic of Uzbekistan", + "FORMAL_FR": null, + "NAME_CIAWF": "Uzbekistan", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Uzbekistan", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 3, + "MAPCOLOR9": 5, + "MAPCOLOR13": 4, + "POP_EST": 29748859, + "POP_RANK": 15, + "GDP_MD_EST": 202300, + "POP_YEAR": 2017, + "LASTCENSUS": 1989, + "GDP_YEAR": 2016, + "ECONOMY": "6. Developing region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "UZ", + "ISO_A2": "UZ", + "ISO_A3": "UZB", + "ISO_A3_EH": "UZB", + "ISO_N3": "860", + "UN_A3": "860", + "WB_A2": "UZ", + "WB_A3": "UZB", + "WOE_ID": 23424980, + "WOE_ID_EH": 23424980, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "UZB", + "ADM0_A3_US": "UZB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Central Asia", + "REGION_WB": "Europe & Central Asia", + "NAME_LEN": 10, + "LONG_LEN": 10, + "ABBREV_LEN": 4, + "TINY": 5, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [55.928917, 37.144994, 73.055417, 45.586804], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [67.83, 37.144994], + [67.075782, 37.356144], + [66.518607, 37.362784], + [66.54615, 37.974685], + [65.215999, 38.402695], + [64.170223, 38.892407], + [63.518015, 39.363257], + [62.37426, 40.053886], + [61.882714, 41.084857], + [61.547179, 41.26637], + [60.465953, 41.220327], + [60.083341, 41.425146], + [59.976422, 42.223082], + [58.629011, 42.751551], + [57.78653, 42.170553], + [56.932215, 41.826026], + [57.096391, 41.32231], + [55.968191, 41.308642], + [55.928917, 44.995858], + [58.503127, 45.586804], + [58.689989, 45.500014], + [60.239972, 44.784037], + [61.05832, 44.405817], + [62.0133, 43.504477], + [63.185787, 43.650075], + [64.900824, 43.728081], + [66.098012, 42.99766], + [66.023392, 41.994646], + [66.510649, 41.987644], + [66.714047, 41.168444], + [67.985856, 41.135991], + [68.259896, 40.662325], + [68.632483, 40.668681], + [69.070027, 41.384244], + [70.388965, 42.081308], + [70.962315, 42.266154], + [71.259248, 42.167711], + [70.420022, 41.519998], + [71.157859, 41.143587], + [71.870115, 41.3929], + [73.055417, 40.866033], + [71.774875, 40.145844], + [71.014198, 40.244366], + [70.601407, 40.218527], + [70.45816, 40.496495], + [70.666622, 40.960213], + [69.329495, 40.727824], + [69.011633, 40.086158], + [68.536416, 39.533453], + [67.701429, 39.580478], + [67.44222, 39.140144], + [68.176025, 38.901553], + [68.392033, 38.157025], + [67.83, 37.144994] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Venezuela", + "SOV_A3": "VEN", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Venezuela", + "ADM0_A3": "VEN", + "GEOU_DIF": 0, + "GEOUNIT": "Venezuela", + "GU_A3": "VEN", + "SU_DIF": 0, + "SUBUNIT": "Venezuela", + "SU_A3": "VEN", + "BRK_DIFF": 0, + "NAME": "Venezuela", + "NAME_LONG": "Venezuela", + "BRK_A3": "VEN", + "BRK_NAME": "Venezuela", + "BRK_GROUP": null, + "ABBREV": "Ven.", + "POSTAL": "VE", + "FORMAL_EN": "Bolivarian Republic of Venezuela", + "FORMAL_FR": "República Bolivariana de Venezuela", + "NAME_CIAWF": "Venezuela", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Venezuela, RB", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 3, + "MAPCOLOR9": 1, + "MAPCOLOR13": 4, + "POP_EST": 31304016, + "POP_RANK": 15, + "GDP_MD_EST": 468600, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "VE", + "ISO_A2": "VE", + "ISO_A3": "VEN", + "ISO_A3_EH": "VEN", + "ISO_N3": "862", + "UN_A3": "862", + "WB_A2": "VE", + "WB_A3": "VEN", + "WOE_ID": 23424982, + "WOE_ID_EH": 23424982, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "VEN", + "ADM0_A3_US": "VEN", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "South America", + "REGION_UN": "Americas", + "SUBREGION": "South America", + "REGION_WB": "Latin America & Caribbean", + "NAME_LEN": 9, + "LONG_LEN": 9, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 7.5 + }, + "bbox": [-73.304952, 0.724452, -59.758285, 12.162307], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-60.733574, 5.200277], + [-60.601179, 4.918098], + [-60.966893, 4.536468], + [-62.08543, 4.162124], + [-62.804533, 4.006965], + [-63.093198, 3.770571], + [-63.888343, 4.02053], + [-64.628659, 4.148481], + [-64.816064, 4.056445], + [-64.368494, 3.79721], + [-64.408828, 3.126786], + [-64.269999, 2.497006], + [-63.422867, 2.411068], + [-63.368788, 2.2009], + [-64.083085, 1.916369], + [-64.199306, 1.492855], + [-64.611012, 1.328731], + [-65.354713, 1.095282], + [-65.548267, 0.789254], + [-66.325765, 0.724452], + [-66.876326, 1.253361], + [-67.181294, 2.250638], + [-67.447092, 2.600281], + [-67.809938, 2.820655], + [-67.303173, 3.318454], + [-67.337564, 3.542342], + [-67.621836, 3.839482], + [-67.823012, 4.503937], + [-67.744697, 5.221129], + [-67.521532, 5.55687], + [-67.34144, 6.095468], + [-67.695087, 6.267318], + [-68.265052, 6.153268], + [-68.985319, 6.206805], + [-69.38948, 6.099861], + [-70.093313, 6.960376], + [-70.674234, 7.087785], + [-71.960176, 6.991615], + [-72.198352, 7.340431], + [-72.444487, 7.423785], + [-72.479679, 7.632506], + [-72.360901, 8.002638], + [-72.439862, 8.405275], + [-72.660495, 8.625288], + [-72.78873, 9.085027], + [-73.304952, 9.152], + [-73.027604, 9.73677], + [-72.905286, 10.450344], + [-72.614658, 10.821975], + [-72.227575, 11.108702], + [-71.973922, 11.608672], + [-71.331584, 11.776284], + [-71.360006, 11.539994], + [-71.94705, 11.423282], + [-71.620868, 10.96946], + [-71.633064, 10.446494], + [-72.074174, 9.865651], + [-71.695644, 9.072263], + [-71.264559, 9.137195], + [-71.039999, 9.859993], + [-71.350084, 10.211935], + [-71.400623, 10.968969], + [-70.155299, 11.375482], + [-70.293843, 11.846822], + [-69.943245, 12.162307], + [-69.5843, 11.459611], + [-68.882999, 11.443385], + [-68.233271, 10.885744], + [-68.194127, 10.554653], + [-67.296249, 10.545868], + [-66.227864, 10.648627], + [-65.655238, 10.200799], + [-64.890452, 10.077215], + [-64.329479, 10.389599], + [-64.318007, 10.641418], + [-63.079322, 10.701724], + [-61.880946, 10.715625], + [-62.730119, 10.420269], + [-62.388512, 9.948204], + [-61.588767, 9.873067], + [-60.830597, 9.38134], + [-60.671252, 8.580174], + [-60.150096, 8.602757], + [-59.758285, 8.367035], + [-60.550588, 7.779603], + [-60.637973, 7.415], + [-60.295668, 7.043911], + [-60.543999, 6.856584], + [-61.159336, 6.696077], + [-61.139415, 6.234297], + [-61.410303, 5.959068], + [-60.733574, 5.200277] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "Vietnam", + "SOV_A3": "VNM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Vietnam", + "ADM0_A3": "VNM", + "GEOU_DIF": 0, + "GEOUNIT": "Vietnam", + "GU_A3": "VNM", + "SU_DIF": 0, + "SUBUNIT": "Vietnam", + "SU_A3": "VNM", + "BRK_DIFF": 0, + "NAME": "Vietnam", + "NAME_LONG": "Vietnam", + "BRK_A3": "VNM", + "BRK_NAME": "Vietnam", + "BRK_GROUP": null, + "ABBREV": "Viet.", + "POSTAL": "VN", + "FORMAL_EN": "Socialist Republic of Vietnam", + "FORMAL_FR": null, + "NAME_CIAWF": "Vietnam", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Vietnam", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 6, + "MAPCOLOR9": 5, + "MAPCOLOR13": 4, + "POP_EST": 96160163, + "POP_RANK": 16, + "GDP_MD_EST": 594900, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "VM", + "ISO_A2": "VN", + "ISO_A3": "VNM", + "ISO_A3_EH": "VNM", + "ISO_N3": "704", + "UN_A3": "704", + "WB_A2": "VN", + "WB_A3": "VNM", + "WOE_ID": 23424984, + "WOE_ID_EH": 23424984, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "VNM", + "ADM0_A3_US": "VNM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "South-Eastern Asia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 5, + "TINY": 2, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 2, + "MAX_LABEL": 7 + }, + "bbox": [102.170436, 8.59976, 109.33527, 23.352063], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [102.170436, 22.464753], + [102.706992, 22.708795], + [103.504515, 22.703757], + [104.476858, 22.81915], + [105.329209, 23.352063], + [105.811247, 22.976892], + [106.725403, 22.794268], + [106.567273, 22.218205], + [107.04342, 21.811899], + [108.05018, 21.55238], + [106.715068, 20.696851], + [105.881682, 19.75205], + [105.662006, 19.058165], + [106.426817, 18.004121], + [107.361954, 16.697457], + [108.269495, 16.079742], + [108.877107, 15.276691], + [109.33527, 13.426028], + [109.200136, 11.666859], + [108.36613, 11.008321], + [107.220929, 10.364484], + [106.405113, 9.53084], + [105.158264, 8.59976], + [104.795185, 9.241038], + [105.076202, 9.918491], + [104.334335, 10.486544], + [105.199915, 10.88931], + [106.24967, 10.961812], + [105.810524, 11.567615], + [107.491403, 12.337206], + [107.614548, 13.535531], + [107.382727, 14.202441], + [107.564525, 15.202173], + [107.312706, 15.908538], + [106.556008, 16.604284], + [105.925762, 17.485315], + [105.094598, 18.666975], + [103.896532, 19.265181], + [104.183388, 19.624668], + [104.822574, 19.886642], + [104.435, 20.758733], + [103.203861, 20.766562], + [102.754896, 21.675137], + [102.170436, 22.464753] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 4, + "SOVEREIGNT": "Vanuatu", + "SOV_A3": "VUT", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Vanuatu", + "ADM0_A3": "VUT", + "GEOU_DIF": 0, + "GEOUNIT": "Vanuatu", + "GU_A3": "VUT", + "SU_DIF": 0, + "SUBUNIT": "Vanuatu", + "SU_A3": "VUT", + "BRK_DIFF": 0, + "NAME": "Vanuatu", + "NAME_LONG": "Vanuatu", + "BRK_A3": "VUT", + "BRK_NAME": "Vanuatu", + "BRK_GROUP": null, + "ABBREV": "Van.", + "POSTAL": "VU", + "FORMAL_EN": "Republic of Vanuatu", + "FORMAL_FR": null, + "NAME_CIAWF": "Vanuatu", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Vanuatu", + "NAME_ALT": null, + "MAPCOLOR7": 6, + "MAPCOLOR8": 3, + "MAPCOLOR9": 7, + "MAPCOLOR13": 3, + "POP_EST": 282814, + "POP_RANK": 10, + "GDP_MD_EST": 723, + "POP_YEAR": 2017, + "LASTCENSUS": 2009, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "NH", + "ISO_A2": "VU", + "ISO_A3": "VUT", + "ISO_A3_EH": "VUT", + "ISO_N3": "548", + "UN_A3": "548", + "WB_A2": "VU", + "WB_A3": "VUT", + "WOE_ID": 23424907, + "WOE_ID_EH": 23424907, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "VUT", + "ADM0_A3_US": "VUT", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Oceania", + "REGION_UN": "Oceania", + "SUBREGION": "Melanesia", + "REGION_WB": "East Asia & Pacific", + "NAME_LEN": 7, + "LONG_LEN": 7, + "ABBREV_LEN": 4, + "TINY": 2, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 4, + "MAX_LABEL": 9 + }, + "bbox": [166.629137, -16.59785, 167.844877, -14.626497], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [167.844877, -16.466333], + [167.515181, -16.59785], + [167.180008, -16.159995], + [167.216801, -15.891846], + [167.844877, -16.466333] + ] + ], + [ + [ + [167.107712, -14.93392], + [167.270028, -15.740021], + [167.001207, -15.614602], + [166.793158, -15.668811], + [166.649859, -15.392704], + [166.629137, -14.626497], + [167.107712, -14.93392] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Yemen", + "SOV_A3": "YEM", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Yemen", + "ADM0_A3": "YEM", + "GEOU_DIF": 0, + "GEOUNIT": "Yemen", + "GU_A3": "YEM", + "SU_DIF": 0, + "SUBUNIT": "Yemen", + "SU_A3": "YEM", + "BRK_DIFF": 0, + "NAME": "Yemen", + "NAME_LONG": "Yemen", + "BRK_A3": "YEM", + "BRK_NAME": "Yemen", + "BRK_GROUP": null, + "ABBREV": "Yem.", + "POSTAL": "YE", + "FORMAL_EN": "Republic of Yemen", + "FORMAL_FR": null, + "NAME_CIAWF": "Yemen", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Yemen, Rep.", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 3, + "MAPCOLOR9": 3, + "MAPCOLOR13": 11, + "POP_EST": 28036829, + "POP_RANK": 15, + "GDP_MD_EST": 73450, + "POP_YEAR": 2017, + "LASTCENSUS": 2004, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "YM", + "ISO_A2": "YE", + "ISO_A3": "YEM", + "ISO_A3_EH": "YEM", + "ISO_N3": "887", + "UN_A3": "887", + "WB_A2": "RY", + "WB_A3": "YEM", + "WOE_ID": 23425002, + "WOE_ID_EH": 23425002, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "YEM", + "ADM0_A3_US": "YEM", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Asia", + "REGION_UN": "Asia", + "SUBREGION": "Western Asia", + "REGION_WB": "Middle East & North Africa", + "NAME_LEN": 5, + "LONG_LEN": 5, + "ABBREV_LEN": 4, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [42.604873, 12.58595, 53.108573, 19.000003], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [52.00001, 19.000003], + [52.782184, 17.349742], + [53.108573, 16.651051], + [52.385206, 16.382411], + [52.191729, 15.938433], + [52.168165, 15.59742], + [51.172515, 15.17525], + [49.574576, 14.708767], + [48.679231, 14.003202], + [48.238947, 13.94809], + [47.938914, 14.007233], + [47.354454, 13.59222], + [46.717076, 13.399699], + [45.877593, 13.347764], + [45.62505, 13.290946], + [45.406459, 13.026905], + [45.144356, 12.953938], + [44.989533, 12.699587], + [44.494576, 12.721653], + [44.175113, 12.58595], + [43.482959, 12.6368], + [43.222871, 13.22095], + [43.251448, 13.767584], + [43.087944, 14.06263], + [42.892245, 14.802249], + [42.604873, 15.213335], + [42.805015, 15.261963], + [42.702438, 15.718886], + [42.823671, 15.911742], + [42.779332, 16.347891], + [43.218375, 16.66689], + [43.115798, 17.08844], + [43.380794, 17.579987], + [43.791519, 17.319977], + [44.062613, 17.410359], + [45.216651, 17.433329], + [45.399999, 17.333335], + [46.366659, 17.233315], + [46.749994, 17.283338], + [47.000005, 16.949999], + [47.466695, 17.116682], + [48.183344, 18.166669], + [49.116672, 18.616668], + [52.00001, 19.000003] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 2, + "SOVEREIGNT": "South Africa", + "SOV_A3": "ZAF", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "South Africa", + "ADM0_A3": "ZAF", + "GEOU_DIF": 0, + "GEOUNIT": "South Africa", + "GU_A3": "ZAF", + "SU_DIF": 0, + "SUBUNIT": "South Africa", + "SU_A3": "ZAF", + "BRK_DIFF": 0, + "NAME": "South Africa", + "NAME_LONG": "South Africa", + "BRK_A3": "ZAF", + "BRK_NAME": "South Africa", + "BRK_GROUP": null, + "ABBREV": "S.Af.", + "POSTAL": "ZA", + "FORMAL_EN": "Republic of South Africa", + "FORMAL_FR": null, + "NAME_CIAWF": "South Africa", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "South Africa", + "NAME_ALT": null, + "MAPCOLOR7": 2, + "MAPCOLOR8": 3, + "MAPCOLOR9": 4, + "MAPCOLOR13": 2, + "POP_EST": 54841552, + "POP_RANK": 16, + "GDP_MD_EST": 739100, + "POP_YEAR": 2017, + "LASTCENSUS": 2001, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "3. Upper middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "SF", + "ISO_A2": "ZA", + "ISO_A3": "ZAF", + "ISO_A3_EH": "ZAF", + "ISO_N3": "710", + "UN_A3": "710", + "WB_A2": "ZA", + "WB_A3": "ZAF", + "WOE_ID": 23424942, + "WOE_ID_EH": 23424942, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ZAF", + "ADM0_A3_US": "ZAF", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Southern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 12, + "LONG_LEN": 12, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 1.7, + "MAX_LABEL": 6.7 + }, + "bbox": [16.344977, -34.819166, 32.83012, -22.091313], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.895768, -24.76779], + [20.165726, -24.917962], + [20.758609, -25.868136], + [20.66647, -26.477453], + [20.889609, -26.828543], + [21.605896, -26.726534], + [22.105969, -26.280256], + [22.579532, -25.979448], + [22.824271, -25.500459], + [23.312097, -25.26869], + [23.73357, -25.390129], + [24.211267, -25.670216], + [25.025171, -25.71967], + [25.664666, -25.486816], + [25.765849, -25.174845], + [25.941652, -24.696373], + [26.485753, -24.616327], + [26.786407, -24.240691], + [27.11941, -23.574323], + [28.017236, -22.827754], + [29.432188, -22.091313], + [29.839037, -22.102216], + [30.322883, -22.271612], + [30.659865, -22.151567], + [31.191409, -22.25151], + [31.670398, -23.658969], + [31.930589, -24.369417], + [31.752408, -25.484284], + [31.837778, -25.843332], + [31.333158, -25.660191], + [31.04408, -25.731452], + [30.949667, -26.022649], + [30.676609, -26.398078], + [30.685962, -26.743845], + [31.282773, -27.285879], + [31.86806, -27.177927], + [32.071665, -26.73382], + [32.83012, -26.742192], + [32.580265, -27.470158], + [32.462133, -28.301011], + [32.203389, -28.752405], + [31.521001, -29.257387], + [31.325561, -29.401978], + [30.901763, -29.909957], + [30.622813, -30.423776], + [30.055716, -31.140269], + [28.925553, -32.172041], + [28.219756, -32.771953], + [27.464608, -33.226964], + [26.419452, -33.61495], + [25.909664, -33.66704], + [25.780628, -33.944646], + [25.172862, -33.796851], + [24.677853, -33.987176], + [23.594043, -33.794474], + [22.988189, -33.916431], + [22.574157, -33.864083], + [21.542799, -34.258839], + [20.689053, -34.417175], + [20.071261, -34.795137], + [19.616405, -34.819166], + [19.193278, -34.462599], + [18.855315, -34.444306], + [18.424643, -33.997873], + [18.377411, -34.136521], + [18.244499, -33.867752], + [18.25008, -33.281431], + [17.92519, -32.611291], + [18.24791, -32.429131], + [18.221762, -31.661633], + [17.566918, -30.725721], + [17.064416, -29.878641], + [17.062918, -29.875954], + [16.344977, -28.576705], + [16.824017, -28.082162], + [17.218929, -28.355943], + [17.387497, -28.783514], + [17.836152, -28.856378], + [18.464899, -29.045462], + [19.002127, -28.972443], + [19.894734, -28.461105], + [19.895768, -24.76779] + ], + [ + [28.978263, -28.955597], + [28.5417, -28.647502], + [28.074338, -28.851469], + [27.532511, -29.242711], + [26.999262, -29.875954], + [27.749397, -30.645106], + [28.107205, -30.545732], + [28.291069, -30.226217], + [28.8484, -30.070051], + [29.018415, -29.743766], + [29.325166, -29.257387], + [28.978263, -28.955597] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Zambia", + "SOV_A3": "ZMB", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Zambia", + "ADM0_A3": "ZMB", + "GEOU_DIF": 0, + "GEOUNIT": "Zambia", + "GU_A3": "ZMB", + "SU_DIF": 0, + "SUBUNIT": "Zambia", + "SU_A3": "ZMB", + "BRK_DIFF": 0, + "NAME": "Zambia", + "NAME_LONG": "Zambia", + "BRK_A3": "ZMB", + "BRK_NAME": "Zambia", + "BRK_GROUP": null, + "ABBREV": "Zambia", + "POSTAL": "ZM", + "FORMAL_EN": "Republic of Zambia", + "FORMAL_FR": null, + "NAME_CIAWF": "Zambia", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Zambia", + "NAME_ALT": null, + "MAPCOLOR7": 5, + "MAPCOLOR8": 8, + "MAPCOLOR9": 5, + "MAPCOLOR13": 13, + "POP_EST": 15972000, + "POP_RANK": 14, + "GDP_MD_EST": 65170, + "POP_YEAR": 2017, + "LASTCENSUS": 2010, + "GDP_YEAR": 2016, + "ECONOMY": "7. Least developed region", + "INCOME_GRP": "4. Lower middle income", + "WIKIPEDIA": -99, + "FIPS_10_": "ZA", + "ISO_A2": "ZM", + "ISO_A3": "ZMB", + "ISO_A3_EH": "ZMB", + "ISO_N3": "894", + "UN_A3": "894", + "WB_A2": "ZM", + "WB_A3": "ZMB", + "WOE_ID": 23425003, + "WOE_ID_EH": 23425003, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ZMB", + "ADM0_A3_US": "ZMB", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 6, + "LONG_LEN": 6, + "ABBREV_LEN": 6, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [21.887843, -17.961229, 33.485688, -8.238257], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.215048, -17.523116], + [22.562478, -16.898451], + [21.887843, -16.08031], + [21.933886, -12.898437], + [24.016137, -12.911046], + [23.930922, -12.565848], + [24.079905, -12.191297], + [23.904154, -11.722282], + [24.017894, -11.237298], + [23.912215, -10.926826], + [24.257155, -10.951993], + [24.314516, -11.262826], + [24.78317, -11.238694], + [25.418118, -11.330936], + [25.75231, -11.784965], + [26.553088, -11.92444], + [27.16442, -11.608748], + [27.388799, -12.132747], + [28.155109, -12.272481], + [28.523562, -12.698604], + [28.934286, -13.248958], + [29.699614, -13.257227], + [29.616001, -12.178895], + [29.341548, -12.360744], + [28.642417, -11.971569], + [28.372253, -11.793647], + [28.49607, -10.789884], + [28.673682, -9.605925], + [28.449871, -9.164918], + [28.734867, -8.526559], + [29.002912, -8.407032], + [30.346086, -8.238257], + [30.74001, -8.340006], + [31.157751, -8.594579], + [31.556348, -8.762049], + [32.191865, -8.930359], + [32.759375, -9.230599], + [33.231388, -9.676722], + [33.485688, -10.525559], + [33.31531, -10.79655], + [33.114289, -11.607198], + [33.306422, -12.435778], + [32.991764, -12.783871], + [32.688165, -13.712858], + [33.214025, -13.97186], + [30.179481, -14.796099], + [30.274256, -15.507787], + [29.516834, -15.644678], + [28.947463, -16.043051], + [28.825869, -16.389749], + [28.467906, -16.4684], + [27.598243, -17.290831], + [27.044427, -17.938026], + [26.706773, -17.961229], + [26.381935, -17.846042], + [25.264226, -17.73654], + [25.084443, -17.661816], + [25.07695, -17.578823], + [24.682349, -17.353411], + [24.033862, -17.295843], + [23.215048, -17.523116] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "LABELRANK": 3, + "SOVEREIGNT": "Zimbabwe", + "SOV_A3": "ZWE", + "ADM0_DIF": 0, + "LEVEL": 2, + "TYPE": "Sovereign country", + "ADMIN": "Zimbabwe", + "ADM0_A3": "ZWE", + "GEOU_DIF": 0, + "GEOUNIT": "Zimbabwe", + "GU_A3": "ZWE", + "SU_DIF": 0, + "SUBUNIT": "Zimbabwe", + "SU_A3": "ZWE", + "BRK_DIFF": 0, + "NAME": "Zimbabwe", + "NAME_LONG": "Zimbabwe", + "BRK_A3": "ZWE", + "BRK_NAME": "Zimbabwe", + "BRK_GROUP": null, + "ABBREV": "Zimb.", + "POSTAL": "ZW", + "FORMAL_EN": "Republic of Zimbabwe", + "FORMAL_FR": null, + "NAME_CIAWF": "Zimbabwe", + "NOTE_ADM0": null, + "NOTE_BRK": null, + "NAME_SORT": "Zimbabwe", + "NAME_ALT": null, + "MAPCOLOR7": 1, + "MAPCOLOR8": 5, + "MAPCOLOR9": 3, + "MAPCOLOR13": 9, + "POP_EST": 13805084, + "POP_RANK": 14, + "GDP_MD_EST": 28330, + "POP_YEAR": 2017, + "LASTCENSUS": 2002, + "GDP_YEAR": 2016, + "ECONOMY": "5. Emerging region: G20", + "INCOME_GRP": "5. Low income", + "WIKIPEDIA": -99, + "FIPS_10_": "ZI", + "ISO_A2": "ZW", + "ISO_A3": "ZWE", + "ISO_A3_EH": "ZWE", + "ISO_N3": "716", + "UN_A3": "716", + "WB_A2": "ZW", + "WB_A3": "ZWE", + "WOE_ID": 23425004, + "WOE_ID_EH": 23425004, + "WOE_NOTE": "Exact WOE match as country", + "ADM0_A3_IS": "ZWE", + "ADM0_A3_US": "ZWE", + "ADM0_A3_UN": -99, + "ADM0_A3_WB": -99, + "CONTINENT": "Africa", + "REGION_UN": "Africa", + "SUBREGION": "Eastern Africa", + "REGION_WB": "Sub-Saharan Africa", + "NAME_LEN": 8, + "LONG_LEN": 8, + "ABBREV_LEN": 5, + "TINY": -99, + "HOMEPART": 1, + "MIN_ZOOM": 0, + "MIN_LABEL": 3, + "MAX_LABEL": 8 + }, + "bbox": [25.264226, -22.271612, 32.849861, -15.507787], + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [29.432188, -22.091313], + [28.794656, -21.639454], + [28.02137, -21.485975], + [27.727228, -20.851802], + [27.724747, -20.499059], + [27.296505, -20.39152], + [26.164791, -19.293086], + [25.850391, -18.714413], + [25.649163, -18.536026], + [25.264226, -17.73654], + [26.381935, -17.846042], + [26.706773, -17.961229], + [27.044427, -17.938026], + [27.598243, -17.290831], + [28.467906, -16.4684], + [28.825869, -16.389749], + [28.947463, -16.043051], + [29.516834, -15.644678], + [30.274256, -15.507787], + [30.338955, -15.880839], + [31.173064, -15.860944], + [31.636498, -16.07199], + [31.852041, -16.319417], + [32.328239, -16.392074], + [32.847639, -16.713398], + [32.849861, -17.979057], + [32.654886, -18.67209], + [32.611994, -19.419383], + [32.772708, -19.715592], + [32.659743, -20.30429], + [32.508693, -20.395292], + [32.244988, -21.116489], + [31.191409, -22.25151], + [30.659865, -22.151567], + [30.322883, -22.271612], + [29.839037, -22.102216], + [29.432188, -22.091313] + ] + ] + } + } + ], + "bbox": [-180, -90, 180, 83.64513] +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/index.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/index.ts index 5993c0b4..920d21f6 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/index.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/index.ts @@ -4,8 +4,8 @@ // =================== export * from './useAdmin' +export * from './useAlerts' export * from './useAuth' -export * from './useUsers' export * from './useBgpHijackData' export * from './useCoinbasePrices' export * from './useCveData' @@ -16,3 +16,4 @@ export * from './useKevData' export * from './useOutageData' export * from './useRansomwareData' export * from './useSpaceWeather' +export * from './useUsers' diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAdmin.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAdmin.ts index b339b0de..753787e2 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAdmin.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAdmin.ts @@ -44,7 +44,7 @@ const fetchAdminUsers = async ( size: number ): Promise => { const response = await apiClient.get(API_ENDPOINTS.ADMIN.USERS.LIST, { - params: { page, size }, + params: { page, page_size: size }, }) const data: unknown = response.data @@ -147,7 +147,7 @@ interface AdminUpdateUserParams { const performAdminUpdateUser = async ( params: AdminUpdateUserParams ): Promise => { - const response = await apiClient.patch( + const response = await apiClient.put( API_ENDPOINTS.ADMIN.USERS.UPDATE(params.id), params.data ) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAlerts.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAlerts.ts new file mode 100644 index 00000000..7b1e3820 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAlerts.ts @@ -0,0 +1,111 @@ +// =================== +// © AngelaMos | 2026 +// useAlerts.ts +// =================== + +import { + type UseMutationResult, + type UseQueryResult, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query' +import { toast } from 'sonner' +import { apiClient } from '@/core/api' + +export interface AlertRule { + id: string + name: string + topic: string + predicate: string + cooldown_sec: number + enabled: boolean + created_at: string + updated_at: string +} + +const ALERT_RULES_KEY = ['me', 'alerts'] as const +const ALERT_HISTORY_KEY = ['me', 'alerts', 'history'] as const + +const fetchRules = async (): Promise => { + const res = await apiClient.get('/v1/me/alerts/') + return Array.isArray(res.data) ? res.data : [] +} + +export const useAlertRules = (): UseQueryResult => + useQuery({ + queryKey: ALERT_RULES_KEY, + queryFn: fetchRules, + staleTime: 30_000, + }) + +interface UpdateRuleVars { + id: string + patch: Partial< + Pick + > +} + +const performUpdateRule = async ({ + id, + patch, +}: UpdateRuleVars): Promise => { + const res = await apiClient.patch(`/v1/me/alerts/${id}`, patch) + return res.data +} + +export const useUpdateAlertRule = (): UseMutationResult< + AlertRule, + Error, + UpdateRuleVars +> => { + const qc = useQueryClient() + return useMutation({ + mutationFn: performUpdateRule, + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ALERT_RULES_KEY }) + }, + onError: () => { + toast.error('Failed to update alert rule') + }, + }) +} + +const performDeleteRule = async (id: string): Promise => { + await apiClient.delete(`/v1/me/alerts/${id}`) +} + +export const useDeleteAlertRule = (): UseMutationResult => { + const qc = useQueryClient() + return useMutation({ + mutationFn: performDeleteRule, + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ALERT_RULES_KEY }) + toast.success('Rule removed') + }, + onError: () => { + toast.error('Failed to remove rule') + }, + }) +} + +export interface AlertHistoryEntry { + id: number + rule_id: string + fired_at: string + delivered_to: string[] | null +} + +const fetchHistory = async (): Promise => { + const res = await apiClient.get( + '/v1/me/alerts/history?limit=20' + ) + return Array.isArray(res.data) ? res.data : [] +} + +export const useAlertHistory = (): UseQueryResult => + useQuery({ + queryKey: ALERT_HISTORY_KEY, + queryFn: fetchHistory, + staleTime: 15_000, + }) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAuth.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAuth.ts index a0aea655..66f79b17 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAuth.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useAuth.ts @@ -15,12 +15,9 @@ import { AUTH_ERROR_MESSAGES, AUTH_SUCCESS_MESSAGES, AuthResponseError, - isValidLogoutAllResponse, - isValidTokenResponse, isValidTokenWithUserResponse, isValidUserResponse, type LoginRequest, - type LogoutAllResponse, type PasswordChangeRequest, type TokenWithUserResponse, type UserResponse, @@ -62,17 +59,10 @@ export const useCurrentUser = (): UseQueryResult => { const performLogin = async ( credentials: LoginRequest ): Promise => { - const formData = new URLSearchParams() - formData.append('username', credentials.username) - formData.append('password', credentials.password) - - const response = await apiClient.post( - API_ENDPOINTS.AUTH.LOGIN, - formData, - { - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - } - ) + const response = await apiClient.post(API_ENDPOINTS.AUTH.LOGIN, { + email: credentials.email, + password: credentials.password, + }) const data: unknown = response.data @@ -97,14 +87,11 @@ export const useLogin = (): UseMutationResult< return useMutation({ mutationFn: performLogin, onSuccess: (data: TokenWithUserResponse): void => { - login(data.user, data.access_token) + login(data.user, data.tokens.access_token) queryClient.setQueryData(authQueries.me(), data.user) - const welcomeMessage = AUTH_SUCCESS_MESSAGES.WELCOME_BACK( - data.user.full_name - ) - toast.success(welcomeMessage) + toast.success(AUTH_SUCCESS_MESSAGES.WELCOME_BACK(data.user.name)) }, onError: (error: Error): void => { const message = @@ -115,7 +102,8 @@ export const useLogin = (): UseMutationResult< } const performLogout = async (): Promise => { - await apiClient.post(API_ENDPOINTS.AUTH.LOGOUT) + // Refresh-token cookie is sent automatically by axios via withCredentials. + await apiClient.post(API_ENDPOINTS.AUTH.LOGOUT, {}) } export const useLogout = (): UseMutationResult => { @@ -141,36 +129,22 @@ export const useLogout = (): UseMutationResult => { }) } -const performLogoutAll = async (): Promise => { - const response = await apiClient.post(API_ENDPOINTS.AUTH.LOGOUT_ALL) - const data: unknown = response.data - - if (!isValidLogoutAllResponse(data)) { - throw new AuthResponseError( - AUTH_ERROR_MESSAGES.INVALID_LOGOUT_RESPONSE, - API_ENDPOINTS.AUTH.LOGOUT_ALL - ) - } - - return data +const performLogoutAll = async (): Promise => { + await apiClient.post(API_ENDPOINTS.AUTH.LOGOUT_ALL) } -export const useLogoutAll = (): UseMutationResult< - LogoutAllResponse, - Error, - void -> => { +export const useLogoutAll = (): UseMutationResult => { const queryClient = useQueryClient() const logout = useAuthStore((s) => s.logout) return useMutation({ mutationFn: performLogoutAll, - onSuccess: (data: LogoutAllResponse): void => { + onSuccess: (): void => { logout() queryClient.removeQueries({ queryKey: authQueries.all() }) - toast.success(`Logged out from ${data.revoked_sessions} session(s)`) + toast.success('Logged out from all sessions') window.location.href = ROUTES.LOGIN }, @@ -212,29 +186,25 @@ export const useChangePassword = (): UseMutationResult< export const useRefreshAuth = (): (() => Promise) => { const queryClient = useQueryClient() - const { setAccessToken, login, logout } = useAuthStore() + const { login, logout } = useAuthStore() return async (): Promise => { try { - const response = await apiClient.post(API_ENDPOINTS.AUTH.REFRESH) + const response = await apiClient.post( + API_ENDPOINTS.AUTH.REFRESH, + {} + ) const data: unknown = response.data - if (!isValidTokenResponse(data)) { + if (!isValidTokenWithUserResponse(data)) { throw new AuthResponseError( AUTH_ERROR_MESSAGES.INVALID_TOKEN_RESPONSE, API_ENDPOINTS.AUTH.REFRESH ) } - setAccessToken(data.access_token) - - const userResponse = await apiClient.get(API_ENDPOINTS.AUTH.ME) - const userData: unknown = userResponse.data - - if (isValidUserResponse(userData)) { - login(userData, data.access_token) - queryClient.setQueryData(authQueries.me(), userData) - } + login(data.user, data.tokens.access_token) + queryClient.setQueryData(authQueries.me(), data.user) } catch { logout() queryClient.removeQueries({ queryKey: authQueries.all() }) diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useBgpHijackData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useBgpHijackData.ts index da7a8e27..64ded5b6 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useBgpHijackData.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useBgpHijackData.ts @@ -1,25 +1,42 @@ // ©AngelaMos | 2026 // useBgpHijackData.ts +import { useQuery } from '@tanstack/react-query' import { useEffect } from 'react' -import { isValidBgpHijack, type BgpHijack } from '@/api/types' -import { useSnapshot } from '@/api/snapshot' +import { type BgpHijack, isValidBgpHijack } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' import { useBgpHijackStore } from '@/stores/bgpHijack' interface BgpHijackData { items: BgpHijack[] } +const INTEL_LIMIT = 100 +const STALE_MS = 60_000 + +const fetchRecentHijacks = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.HIJACKS, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidBgpHijack) +} + export function useBgpHijackData(): BgpHijackData { - const { data } = useSnapshot() const items = useBgpHijackStore((s) => s.items) const push = useBgpHijackStore((s) => s.push) - const raw = data?.bgp_hijack - const seed = isValidBgpHijack(raw) ? raw : undefined + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.HIJACKS(), + queryFn: fetchRecentHijacks, + staleTime: STALE_MS, + }) + useEffect(() => { - if (seed) push(seed) - }, [seed, push]) + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) return { items } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCoinbasePrices.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCoinbasePrices.ts new file mode 100644 index 00000000..9062a2af --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCoinbasePrices.ts @@ -0,0 +1,36 @@ +// ©AngelaMos | 2026 +// useCoinbasePrices.ts + +import { useEffect } from 'react' +import { useSnapshot } from '@/api/snapshot' +import { isValidCoinbasePriceMap } from '@/api/types' +import { type MinuteBar, type PriceTick, usePrices } from '@/stores/prices' + +const EMPTY_BARS: MinuteBar[] = [] + +interface CoinbasePricesData { + latest: PriceTick | undefined + history: MinuteBar[] +} + +export function useCoinbasePrices(symbol: string): CoinbasePricesData { + const { data } = useSnapshot() + const latest = usePrices((s) => s.latest[symbol]) + const historyRaw = usePrices((s) => s.history[symbol]) + const history = historyRaw ?? EMPTY_BARS + const pushTick = usePrices((s) => s.pushTick) + + const priceMap = data?.coinbase_price + const seed = isValidCoinbasePriceMap(priceMap) ? priceMap[symbol] : undefined + useEffect(() => { + if (!seed) return + pushTick({ + symbol: seed.symbol, + ts: new Date(seed.ts).getTime(), + price: seed.price, + volume24h: seed.volume_24h, + }) + }, [seed, pushTick]) + + return { latest, history } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCveData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCveData.ts new file mode 100644 index 00000000..12c20faa --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useCveData.ts @@ -0,0 +1,45 @@ +// ©AngelaMos | 2026 +// useCveData.ts + +import { useQuery } from '@tanstack/react-query' +import { useEffect } from 'react' +import { type CveEvent, isValidCveEvent } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' +import { useCveStore } from '@/stores/cve' + +interface CveData { + items: CveEvent[] +} + +const INTEL_LIMIT = 200 +const STALE_MS = 5 * 60_000 + +const fetchRecentCVEs = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.CVES, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidCveEvent) +} + +export function useCveData(): CveData { + const items = useCveStore((s) => s.items) + const push = useCveStore((s) => s.push) + + // /intel/cves backfills the panel on cold load. WS deltas (cve_new) layer + // on top via the dashboard lifecycle. Snapshot's single-event slot is no + // longer the source of truth here. + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.CVES(), + queryFn: fetchRecentCVEs, + staleTime: STALE_MS, + }) + + useEffect(() => { + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) + + return { items } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useDShieldData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useDShieldData.ts new file mode 100644 index 00000000..6952b469 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useDShieldData.ts @@ -0,0 +1,11 @@ +// ©AngelaMos | 2026 +// useDShieldData.ts + +import { useSnapshot } from '@/api/snapshot' +import { type DShieldData, isValidDShieldData } from '@/api/types' + +export function useDShieldData(): DShieldData { + const { data } = useSnapshot() + const raw = data?.scan_firehose + return isValidDShieldData(raw) ? raw : {} +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useEarthquakeData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useEarthquakeData.ts index 093c2bf7..0dcf90f3 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useEarthquakeData.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useEarthquakeData.ts @@ -1,25 +1,42 @@ // ©AngelaMos | 2026 // useEarthquakeData.ts +import { useQuery } from '@tanstack/react-query' import { useEffect } from 'react' -import { isValidEarthquakePayload, type EarthquakePayload } from '@/api/types' -import { useSnapshot } from '@/api/snapshot' +import { type EarthquakePayload, isValidEarthquakePayload } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' import { useEarthquakeStore } from '@/stores/earthquake' interface EarthquakeData { items: EarthquakePayload[] } +const INTEL_LIMIT = 100 +const STALE_MS = 60_000 + +const fetchRecentQuakes = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.QUAKES, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidEarthquakePayload) +} + export function useEarthquakeData(): EarthquakeData { - const { data } = useSnapshot() const items = useEarthquakeStore((s) => s.items) const push = useEarthquakeStore((s) => s.push) - const raw = data?.earthquake - const seed = isValidEarthquakePayload(raw) ? raw : undefined + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.QUAKES(), + queryFn: fetchRecentQuakes, + staleTime: STALE_MS, + }) + useEffect(() => { - if (seed) push(seed) - }, [seed, push]) + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) return { items } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useIssPosition.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useIssPosition.ts new file mode 100644 index 00000000..73bdefd1 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useIssPosition.ts @@ -0,0 +1,11 @@ +// ©AngelaMos | 2026 +// useIssPosition.ts + +import { useSnapshot } from '@/api/snapshot' +import { type IssPosition, isValidIssPosition } from '@/api/types' + +export function useIssPosition(): IssPosition | undefined { + const { data } = useSnapshot() + const raw = data?.iss_position + return isValidIssPosition(raw) ? raw : undefined +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useKevData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useKevData.ts new file mode 100644 index 00000000..58a9443c --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useKevData.ts @@ -0,0 +1,42 @@ +// ©AngelaMos | 2026 +// useKevData.ts + +import { useQuery } from '@tanstack/react-query' +import { useEffect } from 'react' +import { isValidKevEntry, type KevEntry } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' +import { useKevStore } from '@/stores/kev' + +interface KevData { + items: KevEntry[] +} + +const INTEL_LIMIT = 100 +const STALE_MS = 5 * 60_000 + +const fetchRecentKEV = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.KEV, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidKevEntry) +} + +export function useKevData(): KevData { + const items = useKevStore((s) => s.items) + const push = useKevStore((s) => s.push) + + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.KEV(), + queryFn: fetchRecentKEV, + staleTime: STALE_MS, + }) + + useEffect(() => { + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) + + return { items } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useNotifications.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useNotifications.ts new file mode 100644 index 00000000..f0e75ab1 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useNotifications.ts @@ -0,0 +1,222 @@ +// =================== +// © AngelaMos | 2026 +// useNotifications.ts +// =================== + +import { + type UseMutationResult, + type UseQueryResult, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query' +import { toast } from 'sonner' +import { + type ChannelListResponse, + type ChannelResponse, + type CreateChannelRequest, + isValidChannelListResponse, + isValidTelegramStatus, + NOTIFICATION_ERROR_MESSAGES, + NOTIFICATION_SUCCESS_MESSAGES, + type RegisterTelegramRequest, + type RegisterTelegramResponse, + type TelegramStatusResponse, +} from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' + +export const notificationQueries = { + channels: () => QUERY_KEYS.NOTIFICATIONS.CHANNELS(), + telegramStatus: () => QUERY_KEYS.NOTIFICATIONS.TELEGRAM_STATUS(), +} as const + +const fetchChannels = async (): Promise => { + const response = await apiClient.get( + API_ENDPOINTS.NOTIFICATIONS.CHANNELS + ) + const data: unknown = response.data + + if (!isValidChannelListResponse(data)) { + throw new Error(NOTIFICATION_ERROR_MESSAGES.INVALID_RESPONSE) + } + + return data +} + +export const useNotificationChannels = (): UseQueryResult< + ChannelListResponse, + Error +> => { + return useQuery({ + queryKey: notificationQueries.channels(), + queryFn: fetchChannels, + staleTime: 1000 * 30, + }) +} + +const fetchTelegramStatus = async (): Promise => { + const response = await apiClient.get( + API_ENDPOINTS.NOTIFICATIONS.TELEGRAM_STATUS + ) + const data: unknown = response.data + + if (!isValidTelegramStatus(data)) { + throw new Error(NOTIFICATION_ERROR_MESSAGES.INVALID_RESPONSE) + } + + return data +} + +export const useTelegramStatus = (): UseQueryResult< + TelegramStatusResponse, + Error +> => { + return useQuery({ + queryKey: notificationQueries.telegramStatus(), + queryFn: fetchTelegramStatus, + staleTime: 1000 * 15, + }) +} + +const performCreateChannel = async ( + data: CreateChannelRequest +): Promise => { + const response = await apiClient.post( + API_ENDPOINTS.NOTIFICATIONS.CHANNELS, + data + ) + return response.data +} + +export const useCreateChannel = (): UseMutationResult< + ChannelResponse, + Error, + CreateChannelRequest +> => { + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: performCreateChannel, + onSuccess: (): void => { + void queryClient.invalidateQueries({ + queryKey: notificationQueries.channels(), + }) + toast.success(NOTIFICATION_SUCCESS_MESSAGES.CHANNEL_ADDED) + }, + onError: (): void => { + toast.error(NOTIFICATION_ERROR_MESSAGES.CREATE_FAILED) + }, + }) +} + +const performDeleteChannel = async (id: string): Promise => { + await apiClient.delete(API_ENDPOINTS.NOTIFICATIONS.CHANNEL_BY_ID(id)) +} + +export const useDeleteChannel = (): UseMutationResult => { + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: performDeleteChannel, + onSuccess: (): void => { + void queryClient.invalidateQueries({ + queryKey: notificationQueries.channels(), + }) + toast.success(NOTIFICATION_SUCCESS_MESSAGES.CHANNEL_DELETED) + }, + onError: (): void => { + toast.error(NOTIFICATION_ERROR_MESSAGES.DELETE_FAILED) + }, + }) +} + +const performTestChannel = async (id: string): Promise => { + await apiClient.post(API_ENDPOINTS.NOTIFICATIONS.CHANNEL_TEST(id)) +} + +export const useTestChannel = (): UseMutationResult => { + return useMutation({ + mutationFn: performTestChannel, + onSuccess: (): void => { + toast.success(NOTIFICATION_SUCCESS_MESSAGES.TEST_SENT) + }, + onError: (error: Error): void => { + toast.error(`${NOTIFICATION_ERROR_MESSAGES.TEST_FAILED}: ${error.message}`) + }, + }) +} + +const performRegisterTelegram = async ( + data: RegisterTelegramRequest +): Promise => { + const response = await apiClient.post( + API_ENDPOINTS.NOTIFICATIONS.TELEGRAM, + data + ) + return response.data +} + +export const useRegisterTelegram = (): UseMutationResult< + RegisterTelegramResponse, + Error, + RegisterTelegramRequest +> => { + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: performRegisterTelegram, + onSuccess: (): void => { + void queryClient.invalidateQueries({ + queryKey: notificationQueries.channels(), + }) + void queryClient.invalidateQueries({ + queryKey: notificationQueries.telegramStatus(), + }) + toast.success(NOTIFICATION_SUCCESS_MESSAGES.TELEGRAM_REGISTERED) + }, + onError: (): void => { + toast.error(NOTIFICATION_ERROR_MESSAGES.REGISTER_TELEGRAM_FAILED) + }, + }) +} + +const performUnlinkTelegram = async (): Promise => { + await apiClient.delete(API_ENDPOINTS.NOTIFICATIONS.TELEGRAM) +} + +export const useUnlinkTelegram = (): UseMutationResult => { + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: performUnlinkTelegram, + onSuccess: (): void => { + void queryClient.invalidateQueries({ + queryKey: notificationQueries.channels(), + }) + void queryClient.invalidateQueries({ + queryKey: notificationQueries.telegramStatus(), + }) + toast.success(NOTIFICATION_SUCCESS_MESSAGES.TELEGRAM_UNLINKED) + }, + onError: (): void => { + toast.error(NOTIFICATION_ERROR_MESSAGES.UNLINK_TELEGRAM_FAILED) + }, + }) +} + +const performTestTelegram = async (): Promise => { + await apiClient.post(API_ENDPOINTS.NOTIFICATIONS.TELEGRAM_TEST) +} + +export const useTestTelegram = (): UseMutationResult => { + return useMutation({ + mutationFn: performTestTelegram, + onSuccess: (): void => { + toast.success(NOTIFICATION_SUCCESS_MESSAGES.TEST_SENT) + }, + onError: (error: Error): void => { + toast.error(`${NOTIFICATION_ERROR_MESSAGES.TEST_FAILED}: ${error.message}`) + }, + }) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useOutageData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useOutageData.ts index 0717bafc..56a448fa 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useOutageData.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useOutageData.ts @@ -1,25 +1,42 @@ // ©AngelaMos | 2026 // useOutageData.ts +import { useQuery } from '@tanstack/react-query' import { useEffect } from 'react' -import { isValidInternetOutage, type InternetOutage } from '@/api/types' -import { useSnapshot } from '@/api/snapshot' +import { type InternetOutage, isValidInternetOutage } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' import { useOutageStore } from '@/stores/outage' interface OutageData { items: InternetOutage[] } +const INTEL_LIMIT = 100 +const STALE_MS = 60_000 + +const fetchRecentOutages = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.OUTAGES, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidInternetOutage) +} + export function useOutageData(): OutageData { - const { data } = useSnapshot() const items = useOutageStore((s) => s.items) const push = useOutageStore((s) => s.push) - const raw = data?.internet_outage - const seed = isValidInternetOutage(raw) ? raw : undefined + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.OUTAGES(), + queryFn: fetchRecentOutages, + staleTime: STALE_MS, + }) + useEffect(() => { - if (seed) push(seed) - }, [seed, push]) + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) return { items } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useRansomwareData.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useRansomwareData.ts new file mode 100644 index 00000000..2136aa3b --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useRansomwareData.ts @@ -0,0 +1,42 @@ +// ©AngelaMos | 2026 +// useRansomwareData.ts + +import { useQuery } from '@tanstack/react-query' +import { useEffect } from 'react' +import { isValidRansomwareVictim, type RansomwareVictim } from '@/api/types' +import { API_ENDPOINTS, QUERY_KEYS } from '@/config' +import { apiClient } from '@/core/api' +import { useRansomwareStore } from '@/stores/ransomware' + +interface RansomwareData { + items: RansomwareVictim[] +} + +const INTEL_LIMIT = 100 +const STALE_MS = 60_000 + +const fetchRecentRansomware = async (): Promise => { + const res = await apiClient.get(API_ENDPOINTS.INTEL.RANSOMWARE, { + params: { limit: INTEL_LIMIT }, + }) + if (!Array.isArray(res.data)) return [] + return res.data.filter(isValidRansomwareVictim) +} + +export function useRansomwareData(): RansomwareData { + const items = useRansomwareStore((s) => s.items) + const push = useRansomwareStore((s) => s.push) + + const { data } = useQuery({ + queryKey: QUERY_KEYS.INTEL.RANSOMWARE(), + queryFn: fetchRecentRansomware, + staleTime: STALE_MS, + }) + + useEffect(() => { + if (!data) return + for (const ev of data) push(ev) + }, [data, push]) + + return { items } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useSpaceWeather.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useSpaceWeather.ts new file mode 100644 index 00000000..9b669195 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useSpaceWeather.ts @@ -0,0 +1,11 @@ +// ©AngelaMos | 2026 +// useSpaceWeather.ts + +import { useSnapshot } from '@/api/snapshot' +import { isValidSpaceWeatherData, type SpaceWeatherData } from '@/api/types' + +export function useSpaceWeather(): SpaceWeatherData { + const { data } = useSnapshot() + const raw = data?.space_weather + return isValidSpaceWeatherData(raw) ? raw : {} +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useUsers.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useUsers.ts index ba3a2264..36e35be9 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useUsers.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/hooks/useUsers.ts @@ -5,9 +5,7 @@ import { type UseMutationResult, - type UseQueryResult, useMutation, - useQuery, useQueryClient, } from '@tanstack/react-query' import { toast } from 'sonner' @@ -21,60 +19,21 @@ import { type UserUpdateRequest, } from '@/api/types' import { API_ENDPOINTS, QUERY_KEYS } from '@/config' -import { apiClient, QUERY_STRATEGIES } from '@/core/api' +import { apiClient } from '@/core/api' import { useAuthStore } from '@/core/lib' import { authQueries } from './useAuth' export const userQueries = { all: () => QUERY_KEYS.USERS.ALL, - byId: (id: string) => QUERY_KEYS.USERS.BY_ID(id), me: () => QUERY_KEYS.USERS.ME(), } as const -const fetchUserById = async (id: string): Promise => { - const response = await apiClient.get(API_ENDPOINTS.USERS.BY_ID(id)) - const data: unknown = response.data - - if (!isValidUserResponse(data)) { - throw new UserResponseError( - USER_ERROR_MESSAGES.INVALID_USER_RESPONSE, - API_ENDPOINTS.USERS.BY_ID(id) - ) - } - - return data -} - -export const useUser = (id: string): UseQueryResult => { - return useQuery({ - queryKey: userQueries.byId(id), - queryFn: () => fetchUserById(id), - enabled: id.length > 0, - ...QUERY_STRATEGIES.standard, - }) -} - -const performRegister = async ( - data: UserCreateRequest -): Promise => { - const response = await apiClient.post( - API_ENDPOINTS.USERS.REGISTER, - data - ) - const responseData: unknown = response.data - - if (!isValidUserResponse(responseData)) { - throw new UserResponseError( - USER_ERROR_MESSAGES.INVALID_USER_RESPONSE, - API_ENDPOINTS.USERS.REGISTER - ) - } - - return responseData +const performRegister = async (data: UserCreateRequest): Promise => { + await apiClient.post(API_ENDPOINTS.AUTH.REGISTER, data) } export const useRegister = (): UseMutationResult< - UserResponse, + void, Error, UserCreateRequest > => { @@ -96,7 +55,7 @@ export const useRegister = (): UseMutationResult< const performUpdateProfile = async ( data: UserUpdateRequest ): Promise => { - const response = await apiClient.patch(API_ENDPOINTS.USERS.ME, data) + const response = await apiClient.put(API_ENDPOINTS.USERS.ME, data) const responseData: unknown = response.data if (!isValidUserResponse(responseData)) { @@ -136,3 +95,48 @@ export const useUpdateProfile = (): UseMutationResult< }, }) } + +interface UpdateEmailVars { + current_password: string + new_email: string +} + +const performUpdateEmail = async ( + data: UpdateEmailVars +): Promise => { + const response = await apiClient.put(API_ENDPOINTS.USERS.EMAIL, data) + const responseData: unknown = response.data + if (!isValidUserResponse(responseData)) { + throw new UserResponseError( + USER_ERROR_MESSAGES.INVALID_USER_RESPONSE, + API_ENDPOINTS.USERS.EMAIL + ) + } + return responseData +} + +export const useUpdateEmail = (): UseMutationResult< + UserResponse, + Error, + UpdateEmailVars +> => { + const queryClient = useQueryClient() + const updateUser = useAuthStore((s) => s.updateUser) + + return useMutation({ + mutationFn: performUpdateEmail, + onSuccess: (data: UserResponse): void => { + updateUser(data) + queryClient.setQueryData(authQueries.me(), data) + queryClient.setQueryData(userQueries.me(), data) + toast.success('Email updated') + }, + onError: (error: Error): void => { + const message = + error instanceof UserResponseError + ? error.message + : 'Failed to update email' + toast.error(message) + }, + }) +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/auth.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/auth.types.ts index bf1ff764..a4265fd3 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/auth.types.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/auth.types.ts @@ -16,26 +16,29 @@ export type UserRole = (typeof UserRole)[keyof typeof UserRole] export const userResponseSchema = z.object({ id: z.string().uuid(), - created_at: z.string().datetime(), - updated_at: z.string().datetime().nullable(), email: z.string().email(), - full_name: z.string().nullable(), - is_active: z.boolean(), - is_verified: z.boolean(), + name: z.string(), role: z.nativeEnum(UserRole), + tier: z.string(), + created_at: z.string().datetime(), + updated_at: z.string().datetime().optional(), }) export const tokenResponseSchema = z.object({ access_token: z.string(), + refresh_token: z.string(), token_type: z.string(), + expires_in: z.number(), + expires_at: z.string().datetime(), }) -export const tokenWithUserResponseSchema = tokenResponseSchema.extend({ +export const tokenWithUserResponseSchema = z.object({ user: userResponseSchema, + tokens: tokenResponseSchema, }) export const loginRequestSchema = z.object({ - username: z.string().email(), + email: z.string().email(), password: z .string() .min(PASSWORD_CONSTRAINTS.MIN_LENGTH) @@ -74,17 +77,13 @@ export type LogoutAllResponse = z.infer export const isValidUserResponse = (data: unknown): data is UserResponse => { if (data === null || data === undefined) return false if (typeof data !== 'object') return false - - const result = userResponseSchema.safeParse(data) - return result.success + return userResponseSchema.safeParse(data).success } export const isValidTokenResponse = (data: unknown): data is TokenResponse => { if (data === null || data === undefined) return false if (typeof data !== 'object') return false - - const result = tokenResponseSchema.safeParse(data) - return result.success + return tokenResponseSchema.safeParse(data).success } export const isValidTokenWithUserResponse = ( @@ -92,9 +91,7 @@ export const isValidTokenWithUserResponse = ( ): data is TokenWithUserResponse => { if (data === null || data === undefined) return false if (typeof data !== 'object') return false - - const result = tokenWithUserResponseSchema.safeParse(data) - return result.success + return tokenWithUserResponseSchema.safeParse(data).success } export const isValidLogoutAllResponse = ( @@ -102,9 +99,7 @@ export const isValidLogoutAllResponse = ( ): data is LogoutAllResponse => { if (data === null || data === undefined) return false if (typeof data !== 'object') return false - - const result = logoutAllResponseSchema.safeParse(data) - return result.success + return logoutAllResponseSchema.safeParse(data).success } export class AuthResponseError extends Error { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/coinbase.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/coinbase.types.ts new file mode 100644 index 00000000..48d1fcdb --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/coinbase.types.ts @@ -0,0 +1,32 @@ +// ©AngelaMos | 2026 +// coinbase.types.ts + +import { z } from 'zod' + +export const coinbaseTickSchema = z.object({ + symbol: z.string(), + ts: z.string(), + price: z.string(), + volume_24h: z.string().optional(), +}) + +export type CoinbaseTick = z.infer + +export const coinbasePriceMapSchema = z.record(z.string(), coinbaseTickSchema) + +export type CoinbasePriceMap = z.infer + +export const isValidCoinbaseTick = (data: unknown): data is CoinbaseTick => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return coinbaseTickSchema.safeParse(data).success +} + +export const isValidCoinbasePriceMap = ( + data: unknown +): data is CoinbasePriceMap => { + if (data === null || data === undefined || typeof data !== 'object') + return false + if (Array.isArray(data)) return false + return coinbasePriceMapSchema.safeParse(data).success +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/cve.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/cve.types.ts new file mode 100644 index 00000000..0df53d31 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/cve.types.ts @@ -0,0 +1,43 @@ +// ©AngelaMos | 2026 +// cve.types.ts + +import { z } from 'zod' + +export const cveEventSchema = z.object({ + CveID: z.string(), + Published: z.string(), + LastModified: z.string(), + Severity: z.string(), + CVSS: z.number().nullable(), + EPSSScore: z.number().nullable(), + EPSSPercentile: z.number().nullable(), + InKEV: z.boolean().optional(), +}) + +export type CveEvent = z.infer + +export const kevEntrySchema = z.object({ + cveID: z.string(), + vendorProject: z.string(), + product: z.string(), + vulnerabilityName: z.string(), + dateAdded: z.string(), + dueDate: z.string().optional(), + knownRansomwareCampaignUse: z.string().optional(), + shortDescription: z.string().optional(), + requiredAction: z.string().optional(), +}) + +export type KevEntry = z.infer + +export const isValidCveEvent = (data: unknown): data is CveEvent => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return cveEventSchema.safeParse(data).success +} + +export const isValidKevEntry = (data: unknown): data is KevEntry => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return kevEntrySchema.safeParse(data).success +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/geo.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/geo.types.ts index b20380e6..86982db4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/geo.types.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/geo.types.ts @@ -29,9 +29,7 @@ export type EarthquakeProperties = z.infer export const earthquakePayloadSchema = z.object({ id: z.string(), - geometry: z - .object({ coordinates: z.array(z.number()).optional() }) - .optional(), + geometry: z.object({ coordinates: z.array(z.number()).optional() }).optional(), properties: earthquakePropertiesSchema.optional(), }) @@ -50,18 +48,21 @@ export const internetOutageSchema = z.object({ export type InternetOutage = z.infer export const isValidIssPosition = (data: unknown): data is IssPosition => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return issPositionSchema.safeParse(data).success } export const isValidEarthquakePayload = ( data: unknown ): data is EarthquakePayload => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return earthquakePayloadSchema.safeParse(data).success } export const isValidInternetOutage = (data: unknown): data is InternetOutage => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return internetOutageSchema.safeParse(data).success } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/index.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/index.ts index 7f26f3c6..a0522bae 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/index.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/index.ts @@ -4,4 +4,10 @@ // =================== export * from './auth.types' +export * from './coinbase.types' +export * from './cve.types' +export * from './geo.types' +export * from './intel.types' +export * from './notification.types' +export * from './threat.types' export * from './user.types' diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/intel.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/intel.types.ts new file mode 100644 index 00000000..d44e8d61 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/intel.types.ts @@ -0,0 +1,53 @@ +// ©AngelaMos | 2026 +// intel.types.ts + +import { z } from 'zod' + +export const spaceWeatherDataSchema = z.object({ + kp: z.number().optional(), + bz_gsm: z.number().optional(), + speed_kms: z.number().optional(), + density: z.number().optional(), + xray_class: z.string().optional(), + xray_flux: z.number().optional(), + ts: z.string().optional(), + pushed: z.number().optional(), +}) + +export type SpaceWeatherData = z.infer + +export const wikiItnSchema = z.object({ + slug: z.string(), + text: z.string(), +}) + +export type WikiItn = z.infer + +export const gdeltSpikeSchema = z.object({ + theme: z.string(), + time: z.string(), + count: z.number(), + zscore: z.number(), +}) + +export type GdeltSpike = z.infer + +export const isValidSpaceWeatherData = ( + data: unknown +): data is SpaceWeatherData => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return spaceWeatherDataSchema.safeParse(data).success +} + +export const isValidWikiItn = (data: unknown): data is WikiItn => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return wikiItnSchema.safeParse(data).success +} + +export const isValidGdeltSpike = (data: unknown): data is GdeltSpike => { + if (data === null || data === undefined || typeof data !== 'object') + return false + return gdeltSpikeSchema.safeParse(data).success +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/notification.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/notification.types.ts new file mode 100644 index 00000000..8f3d0ec3 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/notification.types.ts @@ -0,0 +1,89 @@ +// =================== +// © AngelaMos | 2026 +// notification.types.ts +// =================== + +import { z } from 'zod' + +export const channelTypeSchema = z.enum(['slack', 'discord', 'telegram']) +export type ChannelType = z.infer + +export const channelResponseSchema = z.object({ + id: z.string(), + type: channelTypeSchema, + label: z.string(), + invalid: z.boolean(), + created_at: z.string(), +}) + +export const telegramStatusResponseSchema = z.object({ + configured: z.boolean(), + linked: z.boolean(), + pending_link: z.boolean(), + webhook_url: z.string().optional(), + webhook_registered: z.boolean().optional(), + created_at: z.string().optional(), +}) + +export const channelListResponseSchema = z.object({ + channels: z.array(channelResponseSchema), + telegram: telegramStatusResponseSchema, +}) + +export const registerTelegramResponseSchema = z.object({ + webhook_url: z.string(), + webhook_registered: z.boolean(), +}) + +export const createChannelRequestSchema = z.object({ + type: z.enum(['slack', 'discord']), + label: z.string().min(1).max(100), + webhook_url: z.string().url().max(2048), +}) + +export const registerTelegramRequestSchema = z.object({ + bot_token: z.string().min(10).max(200), +}) + +export type ChannelResponse = z.infer +export type TelegramStatusResponse = z.infer +export type ChannelListResponse = z.infer +export type RegisterTelegramResponse = z.infer< + typeof registerTelegramResponseSchema +> +export type CreateChannelRequest = z.infer +export type RegisterTelegramRequest = z.infer< + typeof registerTelegramRequestSchema +> + +export const isValidChannelListResponse = ( + data: unknown +): data is ChannelListResponse => { + if (data === null || data === undefined) return false + return channelListResponseSchema.safeParse(data).success +} + +export const isValidTelegramStatus = ( + data: unknown +): data is TelegramStatusResponse => { + if (data === null || data === undefined) return false + return telegramStatusResponseSchema.safeParse(data).success +} + +export const NOTIFICATION_ERROR_MESSAGES = { + LIST_FAILED: 'Failed to load notification channels', + CREATE_FAILED: 'Failed to add notification channel', + DELETE_FAILED: 'Failed to remove notification channel', + TEST_FAILED: 'Test notification failed', + REGISTER_TELEGRAM_FAILED: 'Failed to register Telegram bot', + UNLINK_TELEGRAM_FAILED: 'Failed to unlink Telegram', + INVALID_RESPONSE: 'Invalid response from server', +} as const + +export const NOTIFICATION_SUCCESS_MESSAGES = { + CHANNEL_ADDED: 'Notification channel added', + CHANNEL_DELETED: 'Notification channel removed', + TEST_SENT: 'Test notification sent', + TELEGRAM_REGISTERED: 'Telegram bot registered', + TELEGRAM_UNLINKED: 'Telegram unlinked', +} as const diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/threat.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/threat.types.ts index acae5284..a07ecb21 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/threat.types.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/threat.types.ts @@ -31,6 +31,8 @@ export const dshieldSourceSchema = z.object({ reports: z.number(), targets: z.number(), country: z.string().optional(), + classification: z.string().optional(), + actor: z.string().optional(), }) export type DShieldSource = z.infer @@ -58,12 +60,14 @@ export type DShieldData = z.infer export const isValidRansomwareVictim = ( data: unknown ): data is RansomwareVictim => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return ransomwareVictimSchema.safeParse(data).success } export const isValidDShieldData = (data: unknown): data is DShieldData => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return dshieldDataSchema.safeParse(data).success } @@ -89,6 +93,7 @@ export const bgpHijackSchema = z.object({ export type BgpHijack = z.infer export const isValidBgpHijack = (data: unknown): data is BgpHijack => { - if (data === null || data === undefined || typeof data !== 'object') return false + if (data === null || data === undefined || typeof data !== 'object') + return false return bgpHijackSchema.safeParse(data).success } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/user.types.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/user.types.ts index 2fd36234..4031596f 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/user.types.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/types/user.types.ts @@ -13,7 +13,8 @@ export const userListResponseSchema = z.object({ items: z.array(userResponseSchema), total: z.number(), page: z.number(), - size: z.number(), + page_size: z.number(), + total_pages: z.number(), }) export const userCreateRequestSchema = z.object({ @@ -22,11 +23,11 @@ export const userCreateRequestSchema = z.object({ .string() .min(PASSWORD_CONSTRAINTS.MIN_LENGTH) .max(PASSWORD_CONSTRAINTS.MAX_LENGTH), - full_name: z.string().max(255).nullable().optional(), + name: z.string().min(1).max(100), }) export const userUpdateRequestSchema = z.object({ - full_name: z.string().max(255).nullable().optional(), + name: z.string().min(1).max(100).optional(), }) export const adminUserCreateRequestSchema = z.object({ @@ -35,18 +36,15 @@ export const adminUserCreateRequestSchema = z.object({ .string() .min(PASSWORD_CONSTRAINTS.MIN_LENGTH) .max(PASSWORD_CONSTRAINTS.MAX_LENGTH), - full_name: z.string().max(255).nullable().optional(), + name: z.string().min(1).max(100), role: z.nativeEnum(UserRole).optional(), - is_active: z.boolean().optional(), - is_verified: z.boolean().optional(), + tier: z.string().optional(), }) export const adminUserUpdateRequestSchema = z.object({ - email: z.string().email().optional(), - full_name: z.string().max(255).nullable().optional(), + name: z.string().min(1).max(100).optional(), role: z.nativeEnum(UserRole).optional(), - is_active: z.boolean().optional(), - is_verified: z.boolean().optional(), + tier: z.string().optional(), }) export const paginationParamsSchema = z.object({ @@ -66,29 +64,7 @@ export const isValidUserListResponse = ( ): data is UserListResponse => { if (data === null || data === undefined) return false if (typeof data !== 'object') return false - - const result = userListResponseSchema.safeParse(data) - return result.success -} - -export const isValidUserCreateRequest = ( - data: unknown -): data is UserCreateRequest => { - if (data === null || data === undefined) return false - if (typeof data !== 'object') return false - - const result = userCreateRequestSchema.safeParse(data) - return result.success -} - -export const isValidAdminUserCreateRequest = ( - data: unknown -): data is AdminUserCreateRequest => { - if (data === null || data === undefined) return false - if (typeof data !== 'object') return false - - const result = adminUserCreateRequestSchema.safeParse(data) - return result.success + return userListResponseSchema.safeParse(data).success } export class UserResponseError extends Error { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.test.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.test.ts index bd43e1d8..0b01fcd7 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.test.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.test.ts @@ -1,7 +1,7 @@ // ©AngelaMos | 2026 // ws.test.ts -import { describe, it, expect, vi } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { createDashboardWS, type WSDriver } from './ws' class FakeDriver implements WSDriver { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.ts index e24135c5..4fcc8d3b 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/api/ws.ts @@ -10,10 +10,9 @@ export interface WSDriver { } export interface WSEvent { - topic: string - source?: string - timestamp?: string - payload?: unknown + ch: string + data?: unknown + ts?: string } export interface BackoffConfig { @@ -39,32 +38,41 @@ interface DashboardWS { disconnect: () => void } +const INIT_OP = '{"op":"init"}' + export function createDashboardWS(opts: CreateDashboardWSOpts): DashboardWS { const backoff = opts.backoff ?? DEFAULT_BACKOFF const onEvent = opts.onEvent ?? (() => undefined) let driver: WSDriver | null = null let ready = false + let opened = false let closed = false let buffer: WSEvent[] = [] let nextDelay = backoff.initialMs let reconnectTimer: ReturnType | null = null + function sendInitIfReady() { + if (ready && opened && driver) { + driver.send(INIT_OP) + } + } + function attach() { if (closed) return const d = opts.driver() driver = d + opened = false d.onOpen = () => { - // reset backoff on a successful open; init is sent only after setReady() nextDelay = backoff.initialMs - if (ready) sendInit() + opened = true + sendInitIfReady() } d.onMessage = (data) => { let parsed: WSEvent try { parsed = JSON.parse(data) as WSEvent } catch { - console.warn('coinbase ws: malformed frame', data) return } if (ready) { @@ -75,6 +83,7 @@ export function createDashboardWS(opts: CreateDashboardWSOpts): DashboardWS { } d.onClose = () => { driver = null + opened = false if (closed) return const delay = nextDelay nextDelay = Math.min(nextDelay * 2, backoff.maxMs) @@ -82,24 +91,21 @@ export function createDashboardWS(opts: CreateDashboardWSOpts): DashboardWS { } } - function sendInit() { - driver?.send(JSON.stringify({ op: 'init' })) - } - return { connect() { attach() }, setReady() { ready = true + sendInitIfReady() const flush = buffer buffer = [] for (const ev of flush) onEvent(ev) - sendInit() }, disconnect() { closed = true ready = false + opened = false if (reconnectTimer) { clearTimeout(reconnectTimer) reconnectTimer = null diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/config.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/config.ts index d6fcfb30..fc86b087 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/config.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/config.ts @@ -7,6 +7,7 @@ const API_VERSION = 'v1' export const API_ENDPOINTS = { AUTH: { LOGIN: `/${API_VERSION}/auth/login`, + REGISTER: `/${API_VERSION}/auth/register`, REFRESH: `/${API_VERSION}/auth/refresh`, LOGOUT: `/${API_VERSION}/auth/logout`, LOGOUT_ALL: `/${API_VERSION}/auth/logout-all`, @@ -15,9 +16,8 @@ export const API_ENDPOINTS = { }, USERS: { BASE: `/${API_VERSION}/users`, - BY_ID: (id: string) => `/${API_VERSION}/users/${id}`, ME: `/${API_VERSION}/users/me`, - REGISTER: `/${API_VERSION}/users`, + EMAIL: `/${API_VERSION}/users/me/email`, }, ADMIN: { USERS: { @@ -28,6 +28,23 @@ export const API_ENDPOINTS = { DELETE: (id: string) => `/${API_VERSION}/admin/users/${id}`, }, }, + NOTIFICATIONS: { + CHANNELS: `/${API_VERSION}/notifications/channels`, + CHANNEL_BY_ID: (id: string) => `/${API_VERSION}/notifications/channels/${id}`, + CHANNEL_TEST: (id: string) => + `/${API_VERSION}/notifications/channels/${id}/test`, + TELEGRAM: `/${API_VERSION}/notifications/telegram`, + TELEGRAM_STATUS: `/${API_VERSION}/notifications/telegram/status`, + TELEGRAM_TEST: `/${API_VERSION}/notifications/telegram/test`, + }, + INTEL: { + CVES: `/${API_VERSION}/intel/cves`, + KEV: `/${API_VERSION}/intel/kev`, + HIJACKS: `/${API_VERSION}/intel/hijacks`, + OUTAGES: `/${API_VERSION}/intel/outages`, + RANSOMWARE: `/${API_VERSION}/intel/ransomware`, + QUAKES: `/${API_VERSION}/intel/quakes`, + }, } as const export const QUERY_KEYS = { @@ -37,7 +54,6 @@ export const QUERY_KEYS = { }, USERS: { ALL: ['users'] as const, - BY_ID: (id: string) => [...QUERY_KEYS.USERS.ALL, 'detail', id] as const, ME: () => [...QUERY_KEYS.USERS.ALL, 'me'] as const, }, ADMIN: { @@ -50,6 +66,21 @@ export const QUERY_KEYS = { [...QUERY_KEYS.ADMIN.USERS.ALL(), 'detail', id] as const, }, }, + NOTIFICATIONS: { + ALL: ['notifications'] as const, + CHANNELS: () => [...QUERY_KEYS.NOTIFICATIONS.ALL, 'channels'] as const, + TELEGRAM_STATUS: () => + [...QUERY_KEYS.NOTIFICATIONS.ALL, 'telegram-status'] as const, + }, + INTEL: { + ALL: ['intel'] as const, + CVES: () => [...QUERY_KEYS.INTEL.ALL, 'cves'] as const, + KEV: () => [...QUERY_KEYS.INTEL.ALL, 'kev'] as const, + HIJACKS: () => [...QUERY_KEYS.INTEL.ALL, 'hijacks'] as const, + OUTAGES: () => [...QUERY_KEYS.INTEL.ALL, 'outages'] as const, + RANSOMWARE: () => [...QUERY_KEYS.INTEL.ALL, 'ransomware'] as const, + QUAKES: () => [...QUERY_KEYS.INTEL.ALL, 'quakes'] as const, + }, } as const export const ROUTES = { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/api.config.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/api.config.ts index 8347fa00..f2722898 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/api.config.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/api.config.ts @@ -21,6 +21,17 @@ interface RefreshSubscriber { reject: (error: Error) => void } +interface GoEnvelope { + success: boolean + data?: unknown + meta?: { + page: number + page_size: number + total: number + total_pages: number + } +} + const getBaseURL = (): string => { return import.meta.env.VITE_API_URL ?? '/api' } @@ -54,9 +65,10 @@ const addRefreshSubscriber = ( } const handleTokenRefresh = async (): Promise => { - const response = await apiClient.post<{ access_token: string }>( - API_ENDPOINTS.AUTH.REFRESH - ) + // Refresh token rides in the HttpOnly cookie set by the backend on login. + // axios sends it automatically because the client is configured with + // withCredentials: true. We don't read or send it from JS at all. + const response = await apiClient.post(API_ENDPOINTS.AUTH.REFRESH, {}) if ( response.data === null || @@ -70,7 +82,10 @@ const handleTokenRefresh = async (): Promise => { ) } - const accessToken = response.data.access_token + const payload = response.data as { + tokens?: { access_token?: string } + } + const accessToken = payload.tokens?.access_token if (typeof accessToken !== 'string' || accessToken.length === 0) { throw new ApiError( 'Invalid access token', @@ -87,6 +102,33 @@ const handleAuthFailure = (): void => { window.location.href = '/login' } +apiClient.interceptors.response.use( + (response) => { + if ( + response.status !== 204 && + response.data !== null && + response.data !== undefined && + typeof response.data === 'object' && + 'success' in (response.data as object) + ) { + const envelope = response.data as GoEnvelope + if (envelope.meta !== undefined && envelope.meta !== null) { + response.data = { + items: envelope.data, + page: envelope.meta.page, + page_size: envelope.meta.page_size, + total: envelope.meta.total, + total_pages: envelope.meta.total_pages, + } + } else { + response.data = envelope.data + } + } + return response + }, + (error: unknown) => Promise.reject(error) +) + apiClient.interceptors.request.use( (config: InternalAxiosRequestConfig): InternalAxiosRequestConfig => { const token = useAuthStore.getState().accessToken @@ -113,8 +155,21 @@ apiClient.interceptors.response.use( const isNotRetried = originalRequest._retry !== true const isNotRefreshEndpoint = originalRequest.url?.includes(API_ENDPOINTS.AUTH.REFRESH) !== true + const hadBearerToken = + typeof originalRequest.headers.Authorization === 'string' && + originalRequest.headers.Authorization.startsWith('Bearer ') + // Cold-load hydration: persisted isAuthenticated=true but accessToken + // is missing (it's not persisted across reloads). The first protected + // call has no Bearer header, gets 401, and we should still try a + // refresh via the HttpOnly cookie. + const persistedAuth = useAuthStore.getState().isAuthenticated - if (isUnauthorized && isNotRetried && isNotRefreshEndpoint) { + if ( + isUnauthorized && + isNotRetried && + isNotRefreshEndpoint && + (hadBearerToken || persistedAuth) + ) { if (isRefreshing) { return new Promise((resolve, reject) => { addRefreshSubscriber( diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/errors.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/errors.ts index fde5ec65..1d507781 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/errors.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/api/errors.ts @@ -61,6 +61,8 @@ export class ApiError extends Error { } interface ApiErrorResponse { + success?: boolean + error?: { code?: string; message?: string } detail?: string | { msg: string; type: string }[] message?: string } @@ -75,7 +77,9 @@ export function transformAxiosError(error: AxiosError): ApiError { let message = 'An error occurred' let details: Record | undefined - if (data?.detail) { + if (data?.error?.message) { + message = data.error.message + } else if (data?.detail) { if (typeof data.detail === 'string') { message = data.detail } else if (Array.isArray(data.detail)) { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/app/protected-route.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/app/protected-route.tsx index 486eec78..6e8d8496 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/app/protected-route.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/core/app/protected-route.tsx @@ -4,6 +4,7 @@ // =================== import { Navigate, Outlet, useLocation } from 'react-router-dom' +import { useCurrentUser } from '@/api/hooks' import type { UserRole } from '@/api/types' import { ROUTES } from '@/config' import { useAuthStore } from '@/core/lib' @@ -20,11 +21,18 @@ export function ProtectedRoute({ const location = useLocation() const { isAuthenticated, isLoading, user } = useAuthStore() - if (isLoading) { - return

    + // On cold load, isAuthenticated is restored from localStorage but the + // access token is gone (not persisted). useCurrentUser fires /auth/me; + // the axios interceptor catches the inevitable 401 and refreshes via + // the HttpOnly cookie. While that's in flight we hold the route — no + // flash of protected content before bouncing to /login. + const { isLoading: hydrating, isError: hydrationFailed } = useCurrentUser() + + if (isLoading || (isAuthenticated && hydrating && user === null)) { + return
    Loading…
    } - if (!isAuthenticated) { + if (!isAuthenticated || hydrationFailed) { return ( void setLoading: (loading: boolean) => void setAccessToken: (token: string | null) => void + setUser: (user: UserResponse | null) => void updateUser: (updates: Partial) => void } @@ -64,6 +70,9 @@ export const useAuthStore = create()( setAccessToken: (token) => set({ accessToken: token }, false, 'auth/setAccessToken'), + setUser: (user) => + set({ user, isAuthenticated: user !== null }, false, 'auth/setUser'), + updateUser: (updates) => set( (state) => ({ diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/countryCentroids.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/countryCentroids.ts index 88878957..5fa0f535 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/countryCentroids.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/countryCentroids.ts @@ -23,7 +23,6 @@ const SUPPLEMENTARY_CENTROIDS: Record = { VA: { lat: 41.9029, lng: 12.4534 }, MV: { lat: 3.2028, lng: 73.2207 }, BB: { lat: 13.1939, lng: -59.5432 }, - BS: { lat: 25.0343, lng: -77.3963 }, BM: { lat: 32.3078, lng: -64.7505 }, KY: { lat: 19.3133, lng: -81.2546 }, JM: { lat: 18.1096, lng: -77.2975 }, diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/ethos-tokens.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/ethos-tokens.ts index 7332d2d2..a71b3dbb 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/ethos-tokens.ts +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/ethos-tokens.ts @@ -11,18 +11,18 @@ export const colors = { fg4: '#404040', ok: '#4ade80', amber: '#f59e0b', -} as const; +} as const export const density = { rowPy: 4, rowPx: 8, lineHeightTight: 1.25, letterSpacingLabel: '0.08em', -} as const; +} as const export const typeSizes = { - body: 12, - label: 11, - numL: 20, - numXL: 28, -} as const; + body: 10, + label: 10, + numL: 18, + numXL: 25, +} as const diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/usePriceFlash.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/usePriceFlash.ts new file mode 100644 index 00000000..0cd0a1eb --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/usePriceFlash.ts @@ -0,0 +1,45 @@ +// ©AngelaMos | 2026 +// usePriceFlash.ts + +import { useEffect, useRef, useState } from 'react' + +export type FlashDir = 'up' | 'down' | null + +interface FlashState { + dir: FlashDir + key: number +} + +const FLASH_MS = 600 + +export function usePriceFlash(price: number | null): FlashState { + const prevRef = useRef(null) + const [state, setState] = useState({ dir: null, key: 0 }) + const timerRef = useRef | null>(null) + + useEffect(() => { + if (price === null) return + + const prev = prevRef.current + prevRef.current = price + + if (prev === null || price === prev) return + + if (timerRef.current !== null) clearTimeout(timerRef.current) + + const dir: FlashDir = price > prev ? 'up' : 'down' + setState((s) => ({ dir, key: s.key + 1 })) + + timerRef.current = setTimeout(() => { + setState((s) => ({ ...s, dir: null })) + }, FLASH_MS) + }, [price]) + + useEffect(() => { + return () => { + if (timerRef.current !== null) clearTimeout(timerRef.current) + } + }, []) + + return state +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/useThrottledValue.ts b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/useThrottledValue.ts new file mode 100644 index 00000000..6dfd5058 --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/lib/useThrottledValue.ts @@ -0,0 +1,43 @@ +// ©AngelaMos | 2026 +// useThrottledValue.ts + +import { useEffect, useRef, useState } from 'react' + +const DEFAULT_INTERVAL_MS = 200 + +export function useThrottledValue( + value: T, + intervalMs: number = DEFAULT_INTERVAL_MS +): T { + const [throttled, setThrottled] = useState(value) + const latestRef = useRef(value) + const lastEmitRef = useRef(0) + const timerRef = useRef | null>(null) + + useEffect(() => { + latestRef.current = value + const now = performance.now() + const elapsed = now - lastEmitRef.current + + if (elapsed >= intervalMs) { + lastEmitRef.current = now + setThrottled(value) + return + } + + if (timerRef.current !== null) return + timerRef.current = setTimeout(() => { + timerRef.current = null + lastEmitRef.current = performance.now() + setThrottled(latestRef.current) + }, intervalMs - elapsed) + }, [value, intervalMs]) + + useEffect(() => { + return () => { + if (timerRef.current !== null) clearTimeout(timerRef.current) + } + }, []) + + return throttled +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/main.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/main.tsx index 1b1f2c8a..d37d2419 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/main.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/main.tsx @@ -5,6 +5,9 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' +import '@fontsource-variable/inter/index.css' +import '@fontsource/geist-mono/400.css' +import '@fontsource/geist-mono/500.css' import App from './App' import './styles.scss' diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/admin/index.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/admin/index.tsx index 53fa22a1..6d24d339 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/admin/index.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/admin/index.tsx @@ -37,27 +37,22 @@ export function Component(): React.ReactElement { const handleCreate = (formData: FormData): void => { const email = formData.get('email') as string const password = formData.get('password') as string - const fullName = (formData.get('fullName') as string) || undefined + const rawName = (formData.get('fullName') as string) ?? '' + const name = rawName.trim() || email.split('@')[0] || 'user' const role = formData.get('role') as UserRole - const isActive = formData.get('isActive') === 'on' createUser.mutate( - { email, password, full_name: fullName, role, is_active: isActive }, + { email, password, name, role }, { onSuccess: () => setModal({ type: 'closed' }) } ) } const handleUpdate = (userId: string, formData: FormData): void => { - const email = formData.get('email') as string - const fullName = (formData.get('fullName') as string) || undefined + const name = (formData.get('fullName') as string) || undefined const role = formData.get('role') as UserRole - const isActive = formData.get('isActive') === 'on' updateUser.mutate( - { - id: userId, - data: { email, full_name: fullName, role, is_active: isActive }, - }, + { id: userId, data: { name, role } }, { onSuccess: () => setModal({ type: 'closed' }) } ) } @@ -87,7 +82,6 @@ export function Component(): React.ReactElement {
    Email
    Name
    Role
    -
    Status
    Actions
    @@ -104,7 +98,7 @@ export function Component(): React.ReactElement { {user.email}
    - {user.full_name ?? '—'} + {user.name}
    -
    - - {user.is_active ? 'Active' : 'Inactive'} - -
    -
    @@ -315,7 +298,7 @@ export function Component(): React.ReactElement { name="fullName" type="text" className={styles.input} - defaultValue={modal.user.full_name ?? ''} + defaultValue={modal.user.name} />
    @@ -332,14 +315,6 @@ export function Component(): React.ReactElement {
    -
    -
    {formatUTC(now)}
    +
    +
    + + {showPWAHint && ( +
    + Tap ShareAdd to Home Screen for + fullscreen +
    + )} +
    {isAuthenticated ? (

    Login

    diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/login/login.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/login/login.module.scss index 6d01ed24..4134dcf8 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/login/login.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/login/login.module.scss @@ -6,8 +6,10 @@ @use '@/styles' as *; .page { + position: relative; min-height: 100vh; min-height: 100dvh; + font-size: 16px; @include flex-center; background-color: $bg-default; background-image: radial-gradient( @@ -35,21 +37,22 @@ } .header { - margin-bottom: $space-6; + margin-bottom: $space-7; } .title { - font-size: $font-size-2xl; + font-size: 2.6rem; font-weight: $font-weight-semibold; color: $white; - margin-bottom: $space-2; + margin-bottom: $space-3; } .subtitle { - font-size: $font-size-sm; + font-size: 1.25rem; color: $text-light; } + .form { @include flex-column; gap: $space-5; @@ -61,7 +64,7 @@ } .label { - font-size: $font-size-sm; + font-size: 1.25rem; font-weight: $font-weight-medium; color: $white; } @@ -73,7 +76,7 @@ background-color: transparent; border: 1px solid $border-default; border-radius: $radius-md; - font-size: $font-size-base; + font-size: 1.1rem; color: $white; @include transition-fast; @@ -116,8 +119,8 @@ } svg { - width: 20px; - height: 20px; + width: 17px; + height: 17px; } } @@ -136,7 +139,7 @@ background-color: $white; border: none; border-radius: $radius-md; - font-size: $font-size-base; + font-size: 1.35rem; font-weight: $font-weight-medium; color: $black; cursor: pointer; @@ -153,9 +156,9 @@ } .footer { - margin-top: $space-6; + margin-top: $space-7; text-align: center; - font-size: $font-size-sm; + font-size: $font-size-lg; color: $text-light; } @@ -169,3 +172,29 @@ color: $text-light; } } + +.backButton { + position: absolute; + top: $space-5; + left: $space-5; + display: inline-flex; + align-items: center; + gap: $space-2; + background: transparent; + border: none; + color: $text-muted; + font-size: $font-size-sm; + font-weight: $font-weight-medium; + cursor: pointer; + padding: $space-1 0; + @include transition-fast; + + @include hover { + color: $text-light; + } + + svg { + width: 16px; + height: 16px; + } +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BGPHijackPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BGPHijackPanel.tsx index 028b5214..49a93e3f 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BGPHijackPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BGPHijackPanel.tsx @@ -3,11 +3,13 @@ import { useEffect, useRef, useState } from 'react' import { useBgpHijackData } from '@/api/hooks' -import { Panel } from './Panel' +import { useFreshness } from '@/stores/freshness' import styles from './BGPHijackPanel.module.scss' +import { Panel } from './Panel' const HIJACK_ROW_LIMIT = 6 const FLASH_DURATION_MS = 600 +const STALE_AFTER_MS = 600_000 const MS_PER_HOUR = 3_600_000 const MS_PER_MINUTE = 60_000 const HOURS_PER_DAY = 24 @@ -38,12 +40,23 @@ export function BGPHijackPanel(): React.ReactElement { const recent = items.slice(0, HIJACK_ROW_LIMIT) const now = Date.now() + const lastTickAt = useFreshness((s) => s.ts.bgp) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + return ( diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.module.scss index c6bb247f..0640fdc1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.module.scss @@ -50,10 +50,23 @@ font-variant-numeric: tabular-nums; } -.spark { - display: flex; - align-items: center; - justify-content: center; - padding: 8px; - color: var(--fg-2); +.up { color: var(--ok); } +.down { color: #f87171; } + +@keyframes flash-up { + 0% { color: var(--ok); } + 100% { color: var(--fg-1); } +} + +@keyframes flash-down { + 0% { color: #f87171; } + 100% { color: var(--fg-1); } +} + +.flashUp { + animation: flash-up 600ms ease-out forwards; +} + +.flashDown { + animation: flash-down 600ms ease-out forwards; } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.tsx index f8594086..92d8ce29 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/BTCPanel.tsx @@ -1,75 +1,62 @@ // ©AngelaMos | 2026 // BTCPanel.tsx -import { useEffect } from 'react' -import { useSnapshot } from '@/api/snapshot' -import { usePrices } from '@/stores/prices' +import { useCoinbasePrices } from '@/api/hooks' +import { usePriceFlash } from '@/lib/usePriceFlash' +import { useThrottledValue } from '@/lib/useThrottledValue' import styles from './BTCPanel.module.scss' import { Panel } from './Panel' -import { Sparkline } from './shared/Sparkline' const SYMBOL = 'BTC-USD' -const SPARKLINE_WIDTH = 280 -const SPARKLINE_HEIGHT = 22 const PERCENT_DECIMALS = 2 const PRICE_DECIMALS = 2 const STALE_AFTER_MS = 60_000 - -interface CoinbaseSnapshotTick { - symbol: string - ts: string - price: string - volume_24h?: string -} +const PRICE_THROTTLE_MS = 1_500 export function BTCPanel(): React.ReactElement { - const { data } = useSnapshot() - const latest = usePrices((s) => s.latest[SYMBOL]) - const history = usePrices((s) => s.history[SYMBOL]) - const pushTick = usePrices((s) => s.pushTick) + const { latest, history } = useCoinbasePrices(SYMBOL) - const seed = data?.coinbase_price as CoinbaseSnapshotTick | undefined - useEffect(() => { - if (!seed || seed.symbol !== SYMBOL) return - pushTick({ - symbol: seed.symbol, - ts: new Date(seed.ts).getTime(), - price: seed.price, - volume24h: seed.volume_24h, - }) - }, [seed, pushTick]) - - const priceNum = latest ? Number(latest.price) : null - const closes = (history ?? []).map((b) => Number(b.close)) + const rawPriceNum = latest ? Number(latest.price) : null + const priceNum = useThrottledValue(rawPriceNum, PRICE_THROTTLE_MS) + const closes = history.map((b) => Number(b.close)) const pct1h = computeChangePct(closes) + const { dir: flashDir, key: flashKey } = usePriceFlash(priceNum) const lastTickAt = latest?.ts const isStale = latest === undefined ? undefined : Date.now() - latest.ts > STALE_AFTER_MS + const priceClass = [ + styles.price, + flashDir === 'up' + ? styles.flashUp + : flashDir === 'down' + ? styles.flashDown + : '', + ] + .filter(Boolean) + .join(' ') + return (
    - {fmtPrice(priceNum)} + + {fmtPrice(priceNum)} + USD
    -
    - -
    ) } @@ -83,10 +70,22 @@ function ChangeRow({ label: string pct: number | null }): React.ReactElement { + const isUp = pct !== null && pct >= 0 return (
    {label} - {fmtPct(pct)} + + {pct === null ? ( + '—' + ) : ( + <> + + {isUp ? '△' : '▽'} + + {` ${Math.abs(pct).toFixed(PERCENT_DECIMALS)} %`} + + )} +
    ) } @@ -107,12 +106,6 @@ function computeChangePct(closes: number[]): number | null { return ((last - first) / first) * 100 } -function fmtPct(pct: number | null): string { - if (pct === null) return '—' - const glyph = pct >= 0 ? '△' : '▽' - return `${glyph} ${Math.abs(pct).toFixed(PERCENT_DECIMALS)} %` -} - function fmtPrice(n: number | null): string { if (n === null || !Number.isFinite(n)) return '—' return n.toLocaleString(undefined, { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/CVEVelocityPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/CVEVelocityPanel.tsx index f0390906..84cd9f6e 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/CVEVelocityPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/CVEVelocityPanel.tsx @@ -1,9 +1,10 @@ // ©AngelaMos | 2026 // CVEVelocityPanel.tsx -import { useEffect, useMemo } from 'react' -import { useSnapshot } from '@/api/snapshot' -import { type CveEvent, useCveStore } from '@/stores/cve' +import { useMemo } from 'react' +import { useCveData } from '@/api/hooks' +import type { CveEvent } from '@/api/types' +import { useFreshness } from '@/stores/freshness' import styles from './CVEVelocityPanel.module.scss' import { Panel } from './Panel' import { KPI } from './shared/KPI' @@ -11,6 +12,7 @@ import { Sparkline } from './shared/Sparkline' const RECENT_ROW_LIMIT = 5 const SPARKLINE_HOURS = 24 +const STALE_AFTER_MS = 900_000 const SPARKLINE_WIDTH = 280 const SPARKLINE_HEIGHT = 28 const MS_PER_HOUR = 3_600_000 @@ -18,38 +20,42 @@ const MS_PER_MINUTE = 60_000 const HOURS_PER_DAY = 24 export function CVEVelocityPanel(): React.ReactElement { - const { data } = useSnapshot() - const items = useCveStore((s) => s.items) - const push = useCveStore((s) => s.push) - - const seed = data?.cve_new as CveEvent | undefined - useEffect(() => { - if (seed?.CveID) push(seed) - }, [seed, push]) - - const now = Date.now() + const { items } = useCveData() + const nowMinute = Math.floor(Date.now() / MS_PER_MINUTE) * MS_PER_MINUTE const counts = useMemo(() => { return { - h1: countWithin(items, 1, now), - h6: countWithin(items, 6, now), - h24: countWithin(items, SPARKLINE_HOURS, now), + h1: countWithin(items, 1, nowMinute), + h6: countWithin(items, 6, nowMinute), + h24: countWithin(items, SPARKLINE_HOURS, nowMinute), } - }, [items, now]) + }, [items, nowMinute]) const hourly = useMemo( - () => hourlyBuckets(items, SPARKLINE_HOURS, now), - [items, now] + () => hourlyBuckets(items, SPARKLINE_HOURS, nowMinute), + [items, nowMinute] ) const recent = items.slice(0, RECENT_ROW_LIMIT) + const now = Date.now() + + const lastTickAt = useFreshness((s) => s.ts.cve) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS return (
    diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.module.scss index 00be4c3f..7c694774 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.module.scss @@ -46,3 +46,21 @@ font-family: var(--font-mono); font-variant-numeric: tabular-nums; } + +.tag { + padding: var(--row-py) var(--row-px); + font-family: var(--font-mono); + font-size: var(--type-col); + letter-spacing: var(--letter-spacing-label); + text-transform: uppercase; + color: var(--fg-3); + white-space: nowrap; +} + +.tagBenign { + color: var(--fg-2); +} + +.tagMalicious { + color: var(--amber); +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.tsx index 233ca464..53179a59 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/DShieldPanel.tsx @@ -1,18 +1,21 @@ // ©AngelaMos | 2026 // DShieldPanel.tsx -import { type DShieldDailySummary, type DShieldPort } from '@/api/types' import { useDShieldData } from '@/api/hooks' +import type { DShieldDailySummary, DShieldPort, DShieldSource } from '@/api/types' +import { useFreshness } from '@/stores/freshness' import styles from './DShieldPanel.module.scss' import { Panel } from './Panel' const PORT_ROW_LIMIT = 8 const SOURCE_ROW_LIMIT = 8 +const STALE_AFTER_MS = 300_000 const THOUSAND = 1_000 const MILLION = 1_000_000 export function DShieldPanel(): React.ReactElement { const ds = useDShieldData() + const lastTickAt = useFreshness((s) => s.ts.dshield) const ports = toArray(ds.topports) .filter(isPort) @@ -26,13 +29,22 @@ export function DShieldPanel(): React.ReactElement { .slice(0, SOURCE_ROW_LIMIT) const summary = pickLatestSummary(ds.dailysummary) + const hasData = ports.length > 0 || sources.length > 0 + const isStale = !hasData + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS return (
    @@ -60,6 +72,7 @@ export function DShieldPanel(): React.ReactElement { + @@ -68,6 +81,7 @@ export function DShieldPanel(): React.ReactElement { + ))} @@ -117,3 +131,18 @@ function fmtN(n: number): string { if (n >= THOUSAND) return `${(n / THOUSAND).toFixed(1)}k` return String(n) } + +function renderTag(s: DShieldSource): string { + if (s.actor && s.actor.length > 0) return s.actor.toUpperCase() + if (s.classification && s.classification.length > 0) { + return s.classification.toUpperCase() + } + return '' +} + +function tagClass(s: DShieldSource): string { + const c = (s.classification ?? '').toLowerCase() + if (c === 'malicious') return `${styles.tag} ${styles.tagMalicious}` + if (c === 'benign') return `${styles.tag} ${styles.tagBenign}` + return styles.tag +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.module.scss index d393c3a0..70d205bd 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.module.scss @@ -50,10 +50,23 @@ font-variant-numeric: tabular-nums; } -.spark { - display: flex; - align-items: center; - justify-content: center; - padding: 8px; - color: var(--fg-2); +.up { color: var(--ok); } +.down { color: #f87171; } + +@keyframes flash-up { + 0% { color: var(--ok); } + 100% { color: var(--fg-1); } +} + +@keyframes flash-down { + 0% { color: #f87171; } + 100% { color: var(--fg-1); } +} + +.flashUp { + animation: flash-up 600ms ease-out forwards; +} + +.flashDown { + animation: flash-down 600ms ease-out forwards; } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.tsx index 0f1718c2..9eaeab50 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ETHPanel.tsx @@ -1,75 +1,62 @@ // ©AngelaMos | 2026 // ETHPanel.tsx -import { useEffect } from 'react' -import { useSnapshot } from '@/api/snapshot' -import { usePrices } from '@/stores/prices' +import { useCoinbasePrices } from '@/api/hooks' +import { usePriceFlash } from '@/lib/usePriceFlash' +import { useThrottledValue } from '@/lib/useThrottledValue' import styles from './ETHPanel.module.scss' import { Panel } from './Panel' -import { Sparkline } from './shared/Sparkline' const SYMBOL = 'ETH-USD' -const SPARKLINE_WIDTH = 280 -const SPARKLINE_HEIGHT = 22 const PERCENT_DECIMALS = 2 const PRICE_DECIMALS = 2 const STALE_AFTER_MS = 60_000 - -interface CoinbaseSnapshotTick { - symbol: string - ts: string - price: string - volume_24h?: string -} +const PRICE_THROTTLE_MS = 1_500 export function ETHPanel(): React.ReactElement { - const { data } = useSnapshot() - const latest = usePrices((s) => s.latest[SYMBOL]) - const history = usePrices((s) => s.history[SYMBOL]) - const pushTick = usePrices((s) => s.pushTick) + const { latest, history } = useCoinbasePrices(SYMBOL) - const seed = data?.coinbase_price as CoinbaseSnapshotTick | undefined - useEffect(() => { - if (!seed || seed.symbol !== SYMBOL) return - pushTick({ - symbol: seed.symbol, - ts: new Date(seed.ts).getTime(), - price: seed.price, - volume24h: seed.volume_24h, - }) - }, [seed, pushTick]) - - const priceNum = latest ? Number(latest.price) : null - const closes = (history ?? []).map((b) => Number(b.close)) + const rawPriceNum = latest ? Number(latest.price) : null + const priceNum = useThrottledValue(rawPriceNum, PRICE_THROTTLE_MS) + const closes = history.map((b) => Number(b.close)) const pct1h = computeChangePct(closes) + const { dir: flashDir, key: flashKey } = usePriceFlash(priceNum) const lastTickAt = latest?.ts const isStale = latest === undefined ? undefined : Date.now() - latest.ts > STALE_AFTER_MS + const priceClass = [ + styles.price, + flashDir === 'up' + ? styles.flashUp + : flashDir === 'down' + ? styles.flashDown + : '', + ] + .filter(Boolean) + .join(' ') + return (
    - {fmtPrice(priceNum)} + + {fmtPrice(priceNum)} + USD
    -
    - -
    ) } @@ -83,10 +70,22 @@ function ChangeRow({ label: string pct: number | null }): React.ReactElement { + const isUp = pct !== null && pct >= 0 return (
    {label} - {fmtPct(pct)} + + {pct === null ? ( + '—' + ) : ( + <> + + {isUp ? '△' : '▽'} + + {` ${Math.abs(pct).toFixed(PERCENT_DECIMALS)} %`} + + )} +
    ) } @@ -107,12 +106,6 @@ function computeChangePct(closes: number[]): number | null { return ((last - first) / first) * 100 } -function fmtPct(pct: number | null): string { - if (pct === null) return '—' - const glyph = pct >= 0 ? '△' : '▽' - return `${glyph} ${Math.abs(pct).toFixed(PERCENT_DECIMALS)} %` -} - function fmtPrice(n: number | null): string { if (n === null || !Number.isFinite(n)) return '—' return n.toLocaleString(undefined, { diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/EarthquakePanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/EarthquakePanel.tsx index 95955a7e..d8d505c2 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/EarthquakePanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/EarthquakePanel.tsx @@ -3,11 +3,13 @@ import { useEffect, useRef, useState } from 'react' import { useEarthquakeData } from '@/api/hooks' -import { Panel } from './Panel' +import { useFreshness } from '@/stores/freshness' import styles from './EarthquakePanel.module.scss' +import { Panel } from './Panel' const QUAKE_ROW_LIMIT = 8 const FLASH_DURATION_MS = 600 +const STALE_AFTER_MS = 600_000 const MS_PER_HOUR = 3_600_000 const MS_PER_MINUTE = 60_000 const HOURS_PER_DAY = 24 @@ -38,12 +40,23 @@ export function EarthquakePanel(): React.ReactElement { const recent = items.slice(0, QUAKE_ROW_LIMIT) const now = Date.now() + const lastTickAt = useFreshness((s) => s.ts.quake) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + return (
    Source IP Reports TgtTag
    {s.source} {fmtN(s.reports)} {fmtN(s.targets)}{renderTag(s)}
    @@ -59,15 +72,10 @@ export function EarthquakePanel(): React.ReactElement { return ( - - + ) })} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ISSPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ISSPanel.tsx index 37d691df..bf5b63db 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ISSPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/ISSPanel.tsx @@ -1,7 +1,7 @@ // ©AngelaMos | 2026 // ISSPanel.tsx -import { useSnapshot } from '@/api/snapshot' +import { useIssPosition } from '@/api/hooks' import styles from './ISSPanel.module.scss' import { Panel } from './Panel' @@ -9,18 +9,8 @@ const STALE_AFTER_MS = 30_000 const COORDS_DECIMALS = 2 const ALT_DECIMALS = 0 -interface IssPositionData { - latitude: number - longitude: number - altitude: number - velocity: number - timestamp: number - fetched_at?: string -} - export function ISSPanel(): React.ReactElement { - const { data } = useSnapshot() - const iss = data?.iss_position as IssPositionData | undefined + const iss = useIssPosition() const lastTickAt = iss?.fetched_at ? new Date(iss.fetched_at).getTime() @@ -34,6 +24,8 @@ export function ISSPanel(): React.ReactElement { s.items) - const push = useKevStore((s) => s.push) - - const seed = data?.kev_added as KevEntry | undefined - useEffect(() => { - if (seed?.cveID) push(seed) - }, [seed, push]) - + const { items } = useKevData() const recent = items.slice(0, KEV_ROW_LIMIT) + const lastTickAt = useFreshness((s) => s.ts.kev) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + return (
    {fmtMag(q.properties?.mag)} + {q.properties?.place ?? '—'} - {fmtAgo(q.properties?.time, now)} - {fmtAgo(q.properties?.time, now)}
    diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/OutagePanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/OutagePanel.tsx index a10f4810..b4320d4e 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/OutagePanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/OutagePanel.tsx @@ -3,11 +3,14 @@ import { useEffect, useRef, useState } from 'react' import { useOutageData } from '@/api/hooks' -import { Panel } from './Panel' +import { useFreshness } from '@/stores/freshness' import styles from './OutagePanel.module.scss' +import { Panel } from './Panel' const OUTAGE_ROW_LIMIT = 6 +const REGIME_CC = 'IR' const FLASH_DURATION_MS = 600 +const STALE_AFTER_MS = 1_800_000 const MS_PER_HOUR = 3_600_000 const MS_PER_MINUTE = 60_000 const HOURS_PER_DAY = 24 @@ -38,12 +41,23 @@ export function OutagePanel(): React.ReactElement { const recent = items.slice(0, OUTAGE_ROW_LIMIT) const now = Date.now() + const lastTickAt = useFreshness((s) => s.ts.outage) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + return (
    @@ -64,7 +78,9 @@ export function OutagePanel(): React.ReactElement { className={styles.info} title={o.reason ?? o.outageType ?? ''} > - {fmtCause(o.reason, o.outageType)} + {isRegime(o.locations) + ? 'Regime 👎' + : fmtCause(o.reason, o.outageType)} @@ -79,6 +95,10 @@ export function OutagePanel(): React.ReactElement { OutagePanel.displayName = 'OutagePanel' +function isRegime(locations: string[] | undefined): boolean { + return locations?.[0] === REGIME_CC +} + function fmtCC(locations: string[] | undefined): string { if (!locations || locations.length === 0) return '—' const first = locations[0] ?? '—' @@ -90,8 +110,8 @@ function fmtCause( reason: string | undefined, outageType: string | undefined ): string { - if (reason && reason.trim()) return reason - if (outageType && outageType.trim()) return outageType + if (reason?.trim()) return reason + if (outageType?.trim()) return outageType return '—' } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.module.scss index 1187f67e..a1c0f7e4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.module.scss @@ -2,31 +2,66 @@ // Panel.module.scss .panel { + position: relative; display: flex; flex-direction: column; border-bottom: 1px solid var(--fg-4); min-height: 0; + padding-left: 2px; +} + +.panel::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 2px; + background: var(--rule-strong); } .head { + position: relative; display: flex; align-items: center; justify-content: space-between; - height: 28px; - padding: 0 8px; + min-height: 34px; + padding: 5px 10px 5px 12px; background: var(--bg); - border-bottom: 1px solid var(--fg-4); + border-bottom: 1px solid var(--rule-strong); +} + +.titleBlock { + display: flex; + flex-direction: column; + gap: 1px; + min-width: 0; } .title { + font-family: var(--font-sans); font-size: var(--type-label); + font-weight: 500; letter-spacing: var(--letter-spacing-label); text-transform: uppercase; - color: var(--fg-2); + color: var(--fg-1); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .subtitle { color: var(--fg-3); + font-weight: 400; +} + +.source { + font-family: var(--font-sans); + font-size: var(--type-meta); + letter-spacing: 0.04em; + color: var(--fg-3); + text-transform: lowercase; + font-weight: 400; } .meta { @@ -34,6 +69,7 @@ align-items: center; gap: 8px; color: var(--fg-3); + flex-shrink: 0; } .rawLink { @@ -58,3 +94,16 @@ padding: 4px 0; min-height: 0; } + +.accentBgp { &::before { background: var(--accent-bgp); } } +.accentOutage { &::before { background: var(--accent-outage); } } +.accentKev { &::before { background: var(--accent-kev); } } +.accentRansomware { &::before { background: var(--accent-ransomware); } } +.accentDshield { &::before { background: var(--accent-dshield); } } +.accentQuake { &::before { background: var(--accent-quake); } } +.accentIss { &::before { background: var(--accent-iss); } } +.accentSpacewx { &::before { background: var(--accent-spacewx); } } +.accentCve { &::before { background: var(--accent-cve); } } +.accentWiki { &::before { background: var(--accent-wiki); } } +.accentBtc { &::before { background: var(--accent-btc); } } +.accentEth { &::before { background: var(--accent-eth); } } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.tsx index d9485b86..5d3a7cb4 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/Panel.tsx @@ -6,34 +6,74 @@ import { FiExternalLink } from 'react-icons/fi' import styles from './Panel.module.scss' import { StaleIndicator } from './shared/StaleIndicator' +export type PanelAccent = + | 'bgp' + | 'outage' + | 'kev' + | 'ransomware' + | 'dshield' + | 'quake' + | 'iss' + | 'spacewx' + | 'cve' + | 'wiki' + | 'btc' + | 'eth' + export interface PanelProps { title: string subtitle?: string + source?: string + accent?: PanelAccent rawHref?: string rawLabel?: string isStale?: boolean lastTickAt?: number + batch?: boolean children: ReactNode } export function Panel({ title, subtitle, + source, + accent, rawHref, rawLabel, isStale, lastTickAt, + batch, children, }: PanelProps): React.ReactElement { + const ACCENT_CLASS: Record = { + bgp: styles.accentBgp, + outage: styles.accentOutage, + kev: styles.accentKev, + ransomware: styles.accentRansomware, + dshield: styles.accentDshield, + quake: styles.accentQuake, + iss: styles.accentIss, + spacewx: styles.accentSpacewx, + cve: styles.accentCve, + wiki: styles.accentWiki, + btc: styles.accentBtc, + eth: styles.accentEth, + } + const accentClass = accent ? ACCENT_CLASS[accent] : '' + const panelClass = [styles.panel, accentClass].filter(Boolean).join(' ') + return ( -
    +
    - - {title} - {subtitle && · {subtitle}} + + + {title} + {subtitle && · {subtitle}} + + {source && {source}} - + {rawHref && ( s.items) - const push = useRansomwareStore((s) => s.push) - - const seed = data?.ransomware_victim as RansomwareVictim | undefined - useEffect(() => { - if (seed?.post_title) push(seed) - }, [seed, push]) - + const { items } = useRansomwareData() const seenKeys = useRef>(new Set()) const [flashKeys, setFlashKeys] = useState>(new Set()) @@ -52,12 +42,23 @@ export function RansomwarePanel(): React.ReactElement { const recent = items.slice(0, VICTIM_ROW_LIMIT) const now = Date.now() + const lastTickAt = useFreshness((s) => s.ts.ransomware) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + return (
    {fmtState(o.endDate)} {fmtAgo(o.startDate, now)}
    diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/SpaceWeatherPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/SpaceWeatherPanel.tsx index a17cedf2..9f5afec1 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/SpaceWeatherPanel.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/SpaceWeatherPanel.tsx @@ -1,7 +1,7 @@ // ©AngelaMos | 2026 // SpaceWeatherPanel.tsx -import { useSnapshot } from '@/api/snapshot' +import { useSpaceWeather } from '@/api/hooks' import { Panel } from './Panel' import styles from './SpaceWeatherPanel.module.scss' @@ -23,20 +23,8 @@ const DENSITY_DECIMALS = 2 const XRAY_FLUX_DECIMALS = 1 const XRAY_ELEVATED_PATTERN = /^[MX]/ -interface SpaceWeatherData { - kp?: number - bz_gsm?: number - speed_kms?: number - density?: number - xray_class?: string - xray_flux?: number - ts?: string - pushed?: number -} - export function SpaceWeatherPanel(): React.ReactElement { - const { data } = useSnapshot() - const sw = (data?.space_weather as SpaceWeatherData | undefined) ?? {} + const sw = useSpaceWeather() const lastTickAt = sw.ts ? new Date(sw.ts).getTime() : undefined const isStaleByTime = @@ -44,16 +32,17 @@ export function SpaceWeatherPanel(): React.ReactElement { const kpElevated = sw.kp !== undefined && sw.kp >= KP_ELEVATED_THRESHOLD const xrayElevated = sw.xray_class !== undefined && XRAY_ELEVATED_PATTERN.test(sw.xray_class) - const inAlarm = kpElevated || xrayElevated - return (
    Kp Index diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.module.scss new file mode 100644 index 00000000..2cd0b22e --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.module.scss @@ -0,0 +1,61 @@ +// ©AngelaMos | 2026 +// WikiPanel.module.scss + +.list { + padding: 0 8px 4px; +} + +.empty { + padding: var(--row-py) 0; + font-family: var(--font-mono); + font-size: var(--type-body); + color: var(--fg-3); +} + +.row { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 8px; + padding: var(--row-py) 0; + border-bottom: 1px solid var(--fg-4); + + &:last-child { + border-bottom: none; + } +} + +.headline { + font-size: var(--type-body); + color: var(--fg-1); + line-height: 1.35; + flex: 1; + min-width: 0; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + + &[href] { + text-decoration: none; + + &:hover { + color: var(--fg-1); + text-decoration: underline; + text-underline-offset: 2px; + } + + &:focus-visible { + outline: 1px solid var(--fg-2); + outline-offset: 1px; + } + } +} + +.ts { + font-family: var(--font-mono); + font-size: var(--type-label); + color: var(--fg-3); + flex-shrink: 0; + letter-spacing: var(--letter-spacing-label); +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.tsx new file mode 100644 index 00000000..da1cdebe --- /dev/null +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/WikiPanel.tsx @@ -0,0 +1,72 @@ +// ©AngelaMos | 2026 +// WikiPanel.tsx + +import { useFreshness } from '@/stores/freshness' +import { useTicker } from '@/stores/ticker' +import { Panel } from './Panel' +import styles from './WikiPanel.module.scss' + +const MAX_ITEMS = 6 +const STALE_AFTER_MS = 3_600_000 +const MS_PER_SECOND = 1_000 +const SECONDS_PER_MINUTE = 60 +const SECONDS_PER_HOUR = 3_600 + +export function WikiPanel(): React.ReactElement { + const all = useTicker((s) => s.items) + const items = all + .filter((i) => i.source === 'Wikipedia') + .slice(-MAX_ITEMS) + .reverse() + + const lastTickAt = useFreshness((s) => s.ts.wiki) + const isStale = + items.length === 0 + ? undefined + : lastTickAt !== undefined && Date.now() - lastTickAt > STALE_AFTER_MS + + return ( + + + + ) +} + +WikiPanel.displayName = 'WikiPanel' + +function fmtRel(ts: number): string { + const diff = (Date.now() - ts) / MS_PER_SECOND + if (diff < SECONDS_PER_MINUTE) return `${Math.floor(diff)}s` + if (diff < SECONDS_PER_HOUR) return `${Math.floor(diff / SECONDS_PER_MINUTE)}m` + return `${Math.floor(diff / SECONDS_PER_HOUR)}h` +} diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.module.scss b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.module.scss index f2597471..e5fbeb3d 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.module.scss +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.module.scss @@ -12,10 +12,10 @@ background: var(--ok); } -.stale { +.batch { background: var(--amber); } -.unknown { - background: var(--fg-4); +.stale { + background: var(--fg-3); } diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.tsx index 7b981905..164866ba 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/panels/shared/StaleIndicator.tsx @@ -6,18 +6,23 @@ import styles from './StaleIndicator.module.scss' export interface StaleIndicatorProps { stale?: boolean lastTickAt?: number + batch?: boolean } export function StaleIndicator({ stale, lastTickAt, + batch, }: StaleIndicatorProps): React.ReactElement { - const className = - stale === undefined - ? `${styles.dot} ${styles.unknown}` - : stale - ? `${styles.dot} ${styles.stale}` - : `${styles.dot} ${styles.live}` + let state: 'live' | 'batch' | 'stale' + if (stale === undefined || stale === true) { + state = 'stale' + } else if (batch) { + state = 'batch' + } else { + state = 'live' + } + const className = `${styles.dot} ${styles[state]}` const title = lastTickAt ? `Last update ${new Date(lastTickAt).toISOString().slice(11, 19)} UTC` diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/register/index.tsx b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/register/index.tsx index f0f003f7..ec7fd310 100644 --- a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/register/index.tsx +++ b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/src/pages/register/index.tsx @@ -4,6 +4,7 @@ */ import { useState } from 'react' +import { FiArrowLeft } from 'react-icons/fi' import { LuEye, LuEyeOff } from 'react-icons/lu' import { Link, useNavigate } from 'react-router-dom' import { toast } from 'sonner' @@ -35,6 +36,7 @@ export function Component(): React.ReactElement { const { registerEmail, setRegisterEmail, clearRegisterForm } = useAuthFormStore() + const [name, setName] = useState('') const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') const [showPassword, setShowPassword] = useState(false) @@ -45,6 +47,7 @@ export function Component(): React.ReactElement { const result = registerFormSchema.safeParse({ email: registerEmail, + name, password, confirmPassword, }) @@ -56,11 +59,14 @@ export function Component(): React.ReactElement { } register.mutate( - { email: result.data.email, password: result.data.password }, + { + email: result.data.email, + name: result.data.name, + password: result.data.password, + }, { onSuccess: () => { clearRegisterForm() - toast.success('Account created successfully') navigate(ROUTES.LOGIN) }, } @@ -69,6 +75,15 @@ export function Component(): React.ReactElement { return (
    +

    Sign up

    @@ -76,6 +91,20 @@ export function Component(): React.ReactElement {
    +
    + + setName(e.target.value)} + autoComplete="name" + /> +
    +

    sq@j4#83!c~m&ZwUgy-1jCS+~sK~ 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 z zGNDu|$t}G^e`E|cc{m=AN7RIv1Q4^~Cr+YiZsk;NE+r);)YjILUr~uFR);P*8Kdwr z#lBz*0mz~>$WznVZmc6AA%TjD3KA0&Nfz$sPD^(mDwQf&8;C;yVkS(ZMceiiolZw} zb#*|LlbVWBtrp7%>>mIC0RR8<04rSp000I_L_t&o0N!d1D=fQgKL7v#07*qoM6N<$ Eg84&4aR2}S diff --git a/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/assets/favicon-32x32.png b/PROJECTS/advanced/monitor-the-situation-dashboard/frontend/public/assets/favicon-32x32.png index 338e90d0fd359ba5da2ff517a1a4f32f0f40e78c..16f48dafa6a16ced3df6ee3ea534ea53cb844061 100644 GIT binary patch delta 2435 zcmV-}34HeO4~-L$BYz1(NklBoQL{PvOiogaSt7Uu`w+UVT6eueY3!IjSU@3_{vbK`R78-l-c z`#R^L`+wxT^xV_V*4JNg{_)o*oL8TJ%GsUCIPY7|Mfr`fDMt>vWvUe&BnX8A1j13G z$#!ZDn`ksdB!3bh7LQ@88eVUJj*dREvsD5?4~eKBw~N;Nxk3)TIEyTUrV5!S4pB>w zf#Yy7l5^P%lhf187V@O0(iG?B$V^Q!lgm=nYt(8ciFlk`E>HheYv^A)z@%>Ab-SsV z7L5iptSS|wOg58drcfX&WM)nrWpeAwq+ff1$$dM;7=LR)95S+oTa_s1Cm20G#P+ve zVb``-IriaB4(xi9fSJ${N>u0a08FemnINA>ua6Cf&86Ks>2=`)NR-plyNA!agX zG0Jn4W@o60emy_U%>L~Z4(?tUfY;}xZY!7#2fJ<|+cnHek+MEZ!z@!N7szF%iMk!y zQ*r9W9Dj>D5_mKhkx&r7$4$`Z!6SU3xfGhNtQrQD(hT}+mO>^=UC8z)I#`Hg$Ce2C zefR@G0-+E-zn@?*h}+}A7JW7fwpfur7!)xPL6YhywSo`|byS)bR7HH)mW3g#GBq~I ziQ~sPK03*n=@M2TPTSf+)MRQQ{m8iMIO6iDs(%ot;M8p-q0}dYdfZ-A#f>fEz!zyp zacUSf%p5nkB#5l7M%dxuV8%Mp^PZmdd%W!HU~$`TuMDfF$q znSYZRgBeq0&2^jj-5>wL!;e0Ou6jtWT#Y9dM^Rl1>HVZlMy%eZK}{-SC^^oI7AQr| z5?Y_-;M5+1s)a8aCejuYQQzR6dmkWQ%~Qq1wCW%!3=JLR#TQ?~5^i|x_YdMtaM>gP z%pV(DW>6k?BP`E~jSee1W5g07_>2;Hp?~zQ2d~F88fZOJ>@Pn{=;}0A+zP>~C)xay zUOqUpje)^C=L@|^?E(Ojut;K6317q}G#W$If+RbaV3sC0sh?qXc9u|21yhG|+Jh&o z66v#XcNS<=>!f@)5=*sTMCJUh7698)C{MZ1^+=8gLI=%n5;7#*;W%C0U6hMy^nZYk zud|9jWeNY9w68I!6;!+d8LOgV**4>KvGI(Ih-GkDBqP+>4Vgexe8Y~Ya*mX=hNmtQ zY+HoeDU+^NMGTk(QZ+Ha5e%MyN&HHk^br+zM3k482z2Yb_41#PF0lo-1c--hi%lqh z%){)Mf>jeBL}T*~G%ez7qqDc4>3{KK%(dyn`l|wNv-dnp;PTdq^;x3bK@#<5&+*ru zCO1CTEMAgj$C3#NUVW@VXs1T`lozEM!kZ7Eggfc&>0)B^H04AFu`Dhip;Qy@`nb=j ztE3EzIgt-87`s4&tY{W$uuhxm5YEG(0OH;1p-`6T?pZ=z&!GD%SW=CaV}G3mqzDkr zR>zSrPHM!i{1ScFtZ6n~lI13H^@kROuIh`a=fuI9#DWY>`=dD}PrETz_8LrC;*^ zNFoa^@?AqR9Hd)Be@>im=3+@+3HW)l5@1+&GcICe%5X7dXru*Ci*j1E|=y3h{}BgTnWJeL3B(lRQ#S=+Z58Q}!+3NW}0Ad>sNlVF&jnUTGMKs_eEe;-MPoEZwoeM>Z z@r7YOirXf!OsDN?gJ`%5&F#i%T^CMSs6}ozs*;E52iIWaHGhI0H?lYl&5ASKZQuMZ zit3_a*J+Z2M0M7UWvFC7^5IR^@uy52M?q4-YTL&zf3cC1AM6FkZce!*w*Y9mSh3b6 zBpAfnlH#b{z^K&d>h5M>;94}z)e=`fRVJqL9&gnv>F(O@6lsnr~rev5lbK=F|_9$a>@~Q9sN7Qv#+B!&RGD-rv0iK zrEv{BHB#=I*f4N6yG}oZr=x%+_J~SW^a%{!WQ~8ndmlBilZxtR-m)*^qPMS)WTFin zn~C%|r+?FDFp~Q@WIV@+z7^!gCjuO$j-s5a&e%ij*z*Kx*c1&i`4fJ;@w$jVg@!mG z`4;KCwdDyM#}WMt-*TEgY1p2GwF}eRCVo0}F~h-h4DtT-c7%CFz|b_c zYtd<@#BbY-$dbh|H*t|mnyPZcKH+-_yQ(sp6MPF0wNE9?FUj6YFE?+x1*0p zCnjiL5kc0YsFGLse?9=a?7~xAB_dox5-#anUqTB?nBogj0^;jQy9u<_Tdtg&P#7EE zFOpN!Lh}`WT>BpY00960#tP`{00006Nkl^_n??QOm%DfG4u2{TkCT&=s7Eg)B_(8L zW>Q>SJj84;82Iv^{}>wo(2fkioKWSV)95k}bNlvfYHDgoO-<#(g$tZGaf0&lat{CQ zbwY}cn^R$yHY$KAOJ)$9Hd{6x5)#6?b?Yc9DxzS1JjdS2z)fk1L&iq4M$8dM1t19@ zs{1=7O(pWyuYX^^o`!}7F8T#vr41u)>vkNyyd*aCO-)$m~Todw#BEYd17Z|qNvOQC@d@_KR=%%hYk@G9!^Acli1nW@zUJ6 zq^(}fD2Wgk_Np0S?N(zi%YPe-Lv(H0)bc`tvizO{+geR)jiXk$`!C2j-# zbPmFpz{#f8#mrLyv{YB|@v4Bb@ z&p(dA#undcVKjfCqfZ!?q*`B1V|-AM)HQic0DoLPdxqURb6An}As&v7^u=hfwY4=B zR451zULb#p2RVPnDt;biWo5+1#&YDy5$eA_hm{4~Q)|#{%`%ZUPM82tM@93-_AJJX z9m~DlJLw!4#KXhG$S=3jY54B?bvoMHDctft{ssTS-^T|>0rtlE#>~xDiZ)krpCrb22Xy)gF$d}bE91ttG#xW%kQLf z85#`l^j-Q!Hlnt)!0)Tinfk&DIPKg^uZ!z&HdF%OM6tsc`r(}LI_dOx>h(N)_z)Z6 zJ9a;v^TR)ZUMSeQ?*PSEaa61>R(O;CXg)5<^Qm8$%@{5x2kaI6*DruYf88UC*-Z;afA}cQNx#Hx z*&_NPBI*DA2Quw$%5qxm?71hLuFcktHcKV93Qx&2bCn5z&dyF+E`GzBG94Gk*wL~s zgX-#PIpBmPr=X5|35$Oh(B$gQQ3p3v>8t1#J5gb2jdgbyHcMA<-^~+!^nWaD`+E8I zw9cG;+0h?kuoR=U8{Wf^e~JX%d6vAAA|I#OvuAVe+&Mu7o3}UOU3!H&7dKjj@l2H` z6(UV*5i2i#&`4uXFV1^Gg4);1D1^qD6_W6mr#(1-_kv>ZQC{~D=X!j zQBo8rV!f1(Ndap01P$%eqkp;S=}lZ?7r}qpM47WYj>1R!7bG!m)o$*PMkhlgnoXAT@UN|sJe_h1E8$0L!{g|I5-$pjMyqhqzFQ1?k@DN{G6UsCvXrMkOWTJ zPD!z}`s?CCQiyz^DI$sw9o$J&I#OeRHmfldiex4xCPrv6U(5n9)ZL-ySU&osd5pJK z5)l!>ty{Nsw|~mH;$uuB49o&B$_$Eh zyg6wes?yUal}g#z<;$0ei;JVJt&Om-F!`9emY>Hf`(u)mlZ~RIw$B8hzp?^@$Z8F> z|Bvm`Z&_kuqWrfcC9huM$3!DC<<#SaEPieIs78k~JQDybZ5S@PGRBJJQWBPoZ`iPb zgoFe-Iy$5&(p-MAkjh^zqPDhH9zSdKOaLTh3I`PykGxuPwiPQ@$o}B(?=O)Fj-APF zl?T!>l_wrmqc#5n009609I4^?00006Nkl3eXz#NY&$>0 zDV(wNJ|B1e=aLi(R}XjiM#^E=t$}%eG*)J4EY>a|;X9}$A!(h>=gmp^?ByH>0y@t(^(GSkvbG}&1Jw=JOzG4Il+6YNxZuu3U_B{7I$qs>8SOAqJ&%`M*{cl8Y2v!dm=sub)3JZH2%gst2((sk2crEiVl8p$=K-?gpsic99lSl z-+u8P{`;GoG8FRD6tqB7)DCq~2jtncaE~cMXmTBVqjTV`&4Vnx8p-9|(AV~&k~%(n z`fYbpeIVL-3EzfS)Q8uF6bkbE|Ot+yxvve+mEc^E>5# zSEKMP-V}Cb6Nj8b*r$8_+gzZ8PM?D(w`@jmSSU7a-3(=ACRR6T;4lz(Ltl*gX4M>t zz%=RxZIIzTKBc_VtKz+3(Wl~h%V1X}hjp70_F2AIS00Y9{_x=)XDsyOUw{4@R#H#b zZG0S$tzQpCL^y)v;qVO)hj}mWdA|mdLG5iARFD=0V`abEfWbk%8}=E#kQ4^Ox{0`Y z)o@7jhLyN~#2P)U$6rizL#%5YV*P;16lCXSWAm16$jHh;V_QEq1yVnIV`0Vh*9;}! zvc9mrk^-*Jy>2NEhkK!lI8@xb8qNtG2HY0JVA&Q4%Wf6M5BJ=no5r<``}fY)ATT5t z_D-vil~snxsiTl5mP1~VhTMHENS|zh1!ZwV{@qcK(0+>blS-2@v(OLQ`X!%W)f@q9 z%6{pyYB&{y;6HwIr+qYH5c_v-RHLM_0;|`pg(@lq6H^Q5-Fpb-r4_jH%F8%${5T#P zSdxJ`ZM`(n6PCgcw5i~f7YvU=B}QjDvAR^)lbbkgszP!6)Q^*(k6u=DJc$VSrwQ&cnX~(2XXw!A&d<5!hMh4u)ffF8~SX^)(A+Gy&cbkf_~F@m>b!C9rt1rR5oa4)oPqeH984ZKf$;<95vGnqe_t28M+>g& z)XnoX=t4U8Px~(9ZAsrAP!@wP{{3zIx51y?Tkb{-#{C<0`GOE!#QnDFq5NAJFVU_DJ1B-V@0@*&0+NZ4FuOPjo2f@kdaL_6t4Ty)0UnQ*kT45E?d3|)jGN7BI3s$}ja0rS) z|6KC}_0A}d+xIUp>?+joE@oh4bRM-`GuWmmfw^K9D-?4avskG(fED4hFuQGt_ssdX zIDIYt{9hj}>kRI;{<;bkcDTEtq`Va)Gw1PCZ~>&M30TVa!N#Wet z9F)7sunO#fZ9oU4uDST=`y!@%unrjaFMO6XiSd+w6C}Hfux4izJOY&1ckn!Ndyiss zd}EPMSGj05enB48KT1$$S<#R2Vj z)Gq}a+~QE%GKT%9-oS3=5aO+mPVKVok5xqooV2v7zTBfc z5qA0zIJU>&iJ&~hWmMzzOW%cG7G+C+Y`WGhuLZ8_n5?=OA9&^9Z$CQ!KphbBx2R=4 zljI2pT>z|@GZ??eQJW5*=nCv%442-17#k}y40g`=_Zv^HZQU&V?-B+fgH<6)eD>3; z%UXX0{hw8PBqZ%iHrV*RHYG9G7*>Ho#*sa97x7GLDeQE9#CJXJ68q(v!WY;lGwv{) zkMMnJ)Qwc$*YDnb|1Bsp5!V~n7SENmWg8+35S7`2vH9oVnbS+3$6T{q#9m8#wQdT7 zQ>=%__xiXL_-blV)4m_kmHY5SS`?h( zJz>opROGSF;m^Q6*B@5=4$F2WoU#H@SelMMKfv$azJJs8g&ZAIykS=u0K011qR2{U z^=&9>n?_K66*lP=aEftWY+D&_RtJ$4@rbeU>schW3bIv2~U{@is&Th3d-m^%P~4W zh)+L#6<_@7U3~M^-E$A4{M9*iNU9n@LU|Vws|OHIEV1RiQ06y5M*HKJREo{=JnV`r zL0Jg!DL1ca_-#5{A(C_Tje}?% zJ%|P7!$&yw%$~r+;nV2gca?Wfz%w$DJWwMBM#tdd;cGaT-OS~EV{;iNHKK294tr;g zVvK8z&7Z>D@#iqjaqi{Ic>nts@y#Fa)B~};wyX=;E#qhyK7h$nFXOqZZ{x~4AL8h< zmoRtc68ff(BdwwXkr~DCQN$yLF{yiSJo$uNcv1eo@%hkKwqSgA5hpn3=(&qH@xp8P z?)z^uuNS<;{qvug{92Us&Z1%H00s}7#39Cg$6mOK#TQ=39>(EK{ga4HFGFZbDRu;? z@JtAKJ#rb_Lz6fXXdkms(bR(z=U&3at8d}xnG0B?{C@rGJNIjpyYVUZe=lC(|Cjd# zPeO{;OwVyYp2U&4ZeCRhlxj5|+qeOd(JDN>eJh^Wyb zpJwV`EIO13t4M-8jroH~UT;R*Z`sQ@U--2=#&J3R2A^)*7)d_E7Z%K~EIXNVCwS4{ zg_B>2ME^nu{`A#@W9=XR{qwM-Kl9aT;OXND=e4Wh?eB*G@(%9a9@xTt#MbEH)UGk$ zmJG&0c=3!H*CdSp21uJ}d#B;qxD=J7@j%ToCKU>DfSTwo*eI_7eYiR7~wmx;Je$lfvD z1JW{?VNX__YHaCG#Cso{WUhPf`)!JUb$%$c)q0dyl+b5C1zBhW5|WeA)!Pq0r4E}_ zoIzXds_4axp+i(tIKTy!OK36ZM`{c$P`qD&YQQZ6?9 zoTMVuuphw_$O~if)1O>fHh#CH22OEiN9YtZv6VebnIC5qN}WL7SF@ z!oda%&+NnW*`o*_EvJl^bjpCAuPqrDJLU$#lDy9fk+63mdo1KG^u>3Gz%O(_U~fBpO|6MpT%9D^x-Ap^HO z4N^1GQCwaMzhLGNmE>7Q8G8)Rpm*W~=H}+{-aBvMJFi{F+)ImCHJoVB12I>cyA@2fL&vsIC<7#VNH&LaA)C|BNdIrU794Mhq}&vabBvjX?> zu$$r+chGllA>`@^XtdFg$>m7Tslhn!z%1jw$-^(8t)my0FFcReu3W_E$r-E~TEZ{% zz?M4iKs)Z3>BoEP59jFJSfz5M&0ne;*fc8OKu%Md#+;UUwH0|kJL=ivJf8zc`|xBzkHdS z?!kC}h5QW|_}z~cDp222$8$(U9cx<)jPs8yUf|tpL%33jgv401?C+!e6K=78Mn52) z!nWEKlSkLMk=GA1U>DynI1C&5Uca<3{P2?tv^5`J*O$K@zj1xL79}FnV$t5&jnwQ) zj7=QF{>kIeRrb-Y7U1leW7xAWiAM&F`eWh;h|%~xVh^^p)En9*Nl}m?KCt7ttWvrn zkDSq0%s-c6gond^yZ#v0wd#q6rZ5vjBg05YEkM`64DIM7@~a1-ip|90(OK+0Jb_gv z`eU4X%aiy;4MA{U(l~cG^DG=f7z?r1vW_v!wYL}V$Qw;{V>z!)^~ZE=%}AA@_E=nA zkG_$4ES`87T_cC!8k~yOt`DTuRHhBA8`&V z8LKI)vdQCAAWKiK_1VjqJai5bsrB#-Pr)vg7E*84U_H`d8`=kR^4}{%$6ziWHyQh} zQhw_&58VgbkRCX=#UdbCw&ZV@5hs6J`HMX~-4Kt8nks~=;xM>p4%2gIkX1R1r)33L zuN;7dp=L36y@ny`7#!iOW!!g&I>#(571MAd-}FyExs$uN7uLJIe=q$J`0bjN2vRAq z+ua*wtUFE2oJYfNxJA9nW{l5MH{JL?fV19?tA{_U47Ch#&~@NfzkKtdeb_DdX|FA5`|Q&h$9tzk!Wz^%&lCiO$8ryWsBay{{F$pL=$yyq zsA@RLdtl>R4_jYi3C@Frd5)br1(KK~*wNTN3Pu;N!ZW)IkEO)1 zzl3L1%epJM5DWHxSuoaINqc{%Z;4~wtb?|$8;|;=;c@Okp_rAUZ=%cpIrEbXQQfV7^hykhP=KL@YOdO_!I*^V!9pYeg7}^K)y?=jwffY zV@@RMLf_sG3;b4v{%~aN)5(wV`>t3x__9W#35IP=gyAkbcEw?BP!_hy@{n23hQqAi z_sm~}YeEwq=@c=jN!`pOe!CsN;haqVF8*(yqJUJ^f@6#04;4cT{N}~fn_NFUqIQE* zg~HHBAovecU2sT<#gn0>P^C1`4ozeF^sDg69m3Yq9O}@6@e8cx%neLA3-O*U^Osfr zdc5}P;fKy&R+4`cT#`)%dzILKWY0Luyl1ID&?rO8%4qtmLbxeQQCi2Iy5pA+(>M>e z^jfTCuax<9PQm#3Tb{fZR_twYN+ma8dPj)gn*C+5jI+MHtxs{ex@5e+2JW&(4u?9% zio6RV*D%Fk&Km40)^?r_XFpP57l!s7McvfP*p}6aCt?_nk@s2Izr>4}&J$;7*%`?i zy$5@8LJar~9FXC@M`2B|4B!9w{6oi~M*Lz;JK8{dat1ccF>b-YzX{ICQI~?JBgzq; z+=zzmDNLSt6`qBAv7v;%SH2CljO&F?80QLETXrb0D$U=}uP68|!M!;!W);1@*6e3W z=+d#4_T9hQej3*_)%hFm3H-$3R2z@SA_@=~TaV0=KI}jA0<;YW;F4X4RT=EP@_X8l zuZum1&x@WcXL7gB!Q0@N698-Gje@UrppLGN*oh}KUO4l@ID1ka&h`r(GnKz7Uh&$1 zgE}Fe67uq^GXt@aeD1EuYN*oc(ahfC(*C1xNhssJCtp|`0tYoY2XdHJl&u4EE+hCtSp|IxN62pc)dJgRW zwrL5+V+C>?IW@fOo}h1wUvR9VCsEWKtjN0x&ciO3T%CU^JlVSwmD_>_)Z ze_Q<0Z1zmBK4Q~N-5@VzvuQPK93^mm;u&n?9)ja5*&{xN+>Ut!XSLvqFTOzazHZo) zcXO^&qGx;gJ9|*F6S#m;!srpZ?d^U*qx{ufZ)*jvxQyrHAspx9h*i z87=xWux72orZ>jWtK-C4&KmN^c(ab}~$>|N_2cP~O#}83e zQ;q-q_ZJO!;C}VsyXlTm{-J55h%N1gwzLOvrM>J|V4ni(^-*~(h%4)1&Ax*@sH{`x zG$A~zjy(Z&*sjdO#vt}9s7lzs-;cP8QEUm#fuFV*p0OM;#qiJ+vX`L<9;#e;geAj6 z9tSUS+FpSX@C%86IyM<;x;*k@`*7jX8GQWl6@32lYxwea@8Qp1FVCh5`xBZ}NZegW zsOUptMK_W~&qv)JB-f1~xpu_RccCfmghE$`5cXXJu&=^XTZBi0ir^Yq3{7qu@>?eG zbZ8#@*n8m~mBl^e!8>FuEB4v_RPFd+{5E-X~Oq~dITpIF9 zYtYp{j3dX7;@UeG@Yz4V$^P`EzW@8lKO(ansdYod--FnqRz#EMj4tUy6n|e3$ukIN z??yO#ID*qF5t3d7@3?$Jf54`|EMhJ}Kx`$7n#SN4&%H%uz*n0MpTr{g#AYKfAs->B z6;Nc?u@|HXas2+2@=j#e^dhfu7=^9lDD9j?P4^_fV+h3!y{KyLMgQIjoH%m^pM3hp zedAIge>wXWG}MuZ>>7lzwXF?b!@9=D1sxE?BUSinaFhB z<4o*|Vn2trfWPY~fts>O;Q8j%521=aqj`9qJuQdPKXHUTsf+AOIfuz3=lHvi)9Bm3 zfFsYo$UdWc-vxo+hdLX<9w8-rX<~}okyPG=Jf3A$4|`82n`%C5**nubG{xr_^2jHa zbnhP3dot>$hW$ag z%nzIQ^7~jjJ@xYIc;V_boW1xuM%b@1W$5==MCa%sw2dA{ZsQQb)2SDl1We5z#Qd?N zh)K)B4zFN@WY)knwtyUADZF`?RhgyirD-FkBbYdN0y9U>V1DsDCKk>zmv|nBPQS$d znwK$q@gi3QQ1F*p6Nx*pTB}80yM)=(7cp}19PiwIWK^&>inv1K(h-xA1En?#nv^1Ja}S3bW$qqVh#>Z; zdBst8;&V~kF~t1;Fit&t5sT~vS~&e87S3MAxr=Y%%A42l25W0S`{(7`PNV&gMestfvdN&(tkbiOk^zGv)>Y7F!YZa|~=h^Rc3J0l!i`>JZ^Ote-QOiofQK>#(LATt x-ccMpb_TD#^)4>GehtUZzf2u^7H2P9#V>xry6;2s4{Q(mpMU=&frpmB{{#OR;|u@* literal 15406 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 PF3$VcyAf_(|vF4m*6XzVs%$Q)}i*3&JgPvbJ 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

_prtY4c2?xyu4{=hs$ zgC}xphqi9Imv+m7Mm*re!M}5NY=eJ43{4}CLkb1d&o#E-(%v;T$N+{3}|LCS(n#hpl@bqad*WN$MKcbMk$QA+J+7c;Z32zwK}*y88}}Fxf(lKL3%O zpdFLo@do(!;Q2JTmGs^nLaXPl4Z-1hrw%6$x=jR{$56Vtz{9dgO-_djvi) zAP1f;2zfiK@pwd>P;mJmE%n57g~E}(w%W-G{KIgFSVv$LTt@FuAZMj1QKum&(PvY< zB_8g%+JBCV!y->52!o!R@tvjMyMiS12bΠC_S0HpIU9)z;wj!^9R1Y9Qp2>e;q$ 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�z>`!{!Z^Ofsdf9oC#8BGLnBw!j0b55LEVe@!N!w&ni`!WC)%C1of-UT?7 z^=9NQS0Cr6(|SsVIn7Y zzVkhm%!!gqYu15rBZCHCL$<(lwteQ(2G4)|JQto^XS`u#eaL%|$(SS*R9av2ZJ2Jg zO!pvtTeF&LeJni|)NjXJz%*aTTtfGTF1?v^IA=JmCoiMUd*8*iRJDF0vMEz>;9x{z zmPBF|r?-^aQBa9gSn@}GbZIhzg4RGIO5@3T4ZU$-b=^32GUM#U5f`3X;p~$=PG9mo z@!U|MDAQH;pH2A7Czn!V^8WH=4mlI|Q#A^n-o)aP|6T19f-h#n0lBDvnoR$wubBzapY zTC@g>hffRk_`1o{G(345Ua!=l!QnO4jlTa)qv?C@VZU*WU?-K%LQBkPhL4s~n z)WWH#X7arDn8~;}JUnDNo$%~01qun*G8k#taq{FL=Q03V86K@d{DTaWEPO2_Oh(`! z!P)g2IvrJ*JXy!BoD|w)fws+b*0C;6Ik6{f@(%Yjd(AIbP-u*zhk7WP4NJmi#_7kM zLdmCm{IfI8A2mpxV?dlHssp9_i6kY`mklYjAUqs=k0mLYs6MmmyWsC>$2wjw36E^O z_V_^7J!a%q5y?a*V*=d^wG?>R*7@^}a5^)VD)W8uTj2a56;$Vr~hdMaWyd zY4k=o37_E^Si+A38hPk#(7Q@dx0DAxSN)d*zg=znM9DD{=IO(l>>l%8mqAh3iFG=EmER*T1*qn}6>bZ~e)V zSH4&9+Mi5#{qHZhsr)N{GUZjl%YQIoaYOh{JNh^{6Px3J^;1Hgig5~(b4U(+WEl4sJ(qs|gg^Vx!{SFg$2Ur6z{ zoUJw@m$6jHex`7KkRWy_%Ss{DDOEj@Ay5)x#6nQMVmg^h$8-hZpeK$H@VDoTCJZnL6mb}|NfNjfPaDeoklN3UOXcmDl@L5kR*uBSRu zSW?TF7|bM$1HF{ku2{1TTl^>>c*mOPkP@jko%>f*GBgKyu*Y|H-2Gsq2*8ewJpVz) zXjUX4lPDK~`PGVYY4ov?(3Q}S2@7CSz(JBat52cMvnwHd?NgwBcn%=trX&h0YLG?4vd%2_CS1F5z>BY36C82n`jl!Ss;Yt0q}_Eg z!gt(x?_Bgek>NRkz9K7%XY%BunbsIxi9t#cgp1SCL3!_EEYsN8kr8C&5oo)q-Df|u zMa9vL1=nsax&Fc)H(uK3#>IJ`EennsYZ;{5jgzxZ?h z$N%YH@bJMS3g4gF^F!ZjYMIYpUhtFPF-v!QwkKf&L z=YxjhM`E90U;RtK_cNtax+YUt$?yB6nY*Zz(3RlXNbs&i<7QBpF;PZCYEep59&zfB zyd_In28Gj0E2u0|NDa)&lEb|vvq{Znwc_~669x&Z*?b`-IAf3}*T@6!6_Q6+C<EEGg}`-RGb1YP!ZkAcN=o(I*Db#$>Wra_!}Xl*k@SMF9L)>yn}h*%Go_`Q5nk z=g{?vqTn9d4{GT`Uj1C8e0l8cTk#Tn~?BPrg!s}tfx3!(PC z_^exHj_>y3&odpRByuyQW{)yY2-^ zs*Gc)Ev&WeZG#(nIc&%>_;TEm3PIe^+nVig!Y-ZC2Pu4&x3<#rIYZoGnnQ0p)oU)m z)&AILr)P(r%qOF3;Gh2pl|(|!h0kG-fjC_h9Nkzl-`Bn@)WinffB#+n@&Eh3=Epz$ z0sXF_cAgP0r8KC*#Tb77$MsEE000mGNklS=e*j2RaAjoXj zNnUAY=rX;+wf!#9Z3lV@`rf@?DYcwTimRY3DxJSU2vUmteqW~PIh|uyVp|E^rlPjM zq>iG4(f18GHAwrCdL^<0icm7GYG(4j z_ZbWdfo3WAETKLsVkvzO`FlMT(@A0bp9#hg@xLCZ6%_~;g+mf91Kzf(N*xKzST1Hv zG)@{?cH52GI-Wu@4?}dls`#D@R(@~xJlr9YOEFG4|GE_fHId!6WFJr6ewlv*F zG}w`>k(yLm==}Zqf}0*vzg{rXPCOm7IN84waJv`(9#w(i=2POIpNozZ76!lrtq!qj2jBS5<0o{od{TZ(42R900 zLz3|_2>&*3>9U?fhj!v;!S~x!$XPgPoWJoC7>#1hLj7dXro|NcUmR450z@nh$5ftwPF7(5-{y4Wb|bjBCXC=cM3r_ zQd(WP)ppvFVvm_oP)Z3+6<({V!Yco|p(l=3@wi3dK1vzAj+NrF$m$Y_foOGtD{B5zVQlT~OXIAkffA$C+t z!=ofOUt6-+FGt#B(Z*ze_vZ!o-`nv(QM&VofxMehB+*}c4y~7ZB%@(Q@EpFvPs{w- zA&qZQsn^%TXFjqu@U0fgOe_2%V=_Rp`MgxFzU?_6 zTG(g6_yv~*hJ-*h#Rq=0(G5FAMG{wTXiqOACR|K=aeaQwPk!)MeE9CWY}RYaP~iOM zBV^rtjw7fmJqjzo|2$|Zo)>;P|Ge-rb4h`(hyvj&>POx9u2y$BNWeS;F-I=N-=$>l zl;a1z41g``M?vAk!10}qv->-CXN`nWPpII^3rpVo&P#mb4_@N+Z(rrrclLSndslet z53lg*H)kAP7h^|R{w826=9dzPnL+1sLgM%ONaHAmWeWCnpI+1+tI5~dE`TB&(wBYF40n5D^*#>o*WKdMpbww-+%>Sv+ zqAYO;F=FO@+UVu?e#WnGfS>no75dx>y1t`r8g{#_)^(sN3#OBbN_d(=sCf|LzFzXg z+~}xfz|5xgIA#$8YNTVGjz&=*kD!`GTnIOc1oZOw(`-jyHT0H=Rw}x&WES^fTXXiX z=l-n?cW<3>@^DMHljxN(DxE}-!q~f3^5Pr&Tzg?AA>Js0u*Uz4Ohb^=pK23=@w*X%tm%KjMu*DivN%o-dqS~yz-4DZ+vTymtLI#pr&c%b02dcRMfCCQHpep@Ouj+%JWOlq-)jT>A z6C@vRuXhEZMUTXaGUCLGr-eyPx9sS3mzVC^ZLh$6g%{UC3pD=0R2nYms!uv z;(Y0v_Qt_ivict+zn29eqcok10NYTU3^Yo{r!JdC3rFs89!q9&8xmPNSjnOQ=6aE- z_b>@6fVKv3S9GMIpa`G)^w~MXN46UNzIt)hqr?0{l1x$=^unxe7||}!+O}Vi;{{M8 zEYd>{#dlFYG0r7eVxFObC`hl6O6}wB+0p4++iPxUSecjd*>|VFx{v<;ij^+WK=x(mjW9QY{Tzg}6MJoL$u zYE2Yhb`wYH?d{7UAC?)J!`!DK-;4PA7Zdun%xtCdC?w^`MHW$clF611?AvBGFJ2bOE3F?wk(pXqEVLT!Uum^u5a4I- z70Q;XY!6lN`Q${58LZIeaN;2UsKIcYWjOr#9j+PM9|mlze@Bmo9qW09&^R{6Ttz%4 zi3H2dMLDM;$X{WBnGIz2FcqQ1XhO>|@ZD>%*}vnV$g>9NRwJ{IenL_}f@2cy(@4db zC#*tEdiaL%PNe9oESE11 z8x&U)|D@5;gn+MVVwqN4=qU{;``Wh~n=FVr(UGuR>C7~+FZ=}1PH*#c7k(4Tzp#FEw(g?6zccuppvCYur%{v8XE$J7so+DHECL zV^cr&+;?VH9Ud`lv#39h%Up0V3DlfEB4JnqpRFnQ)jJKyr z*0OHH+ckfxJ!GUkQ4;xjn`)D-c4iNYgm&~9Xn#0Y@j+q8Le4IohI&oKzvAG)botzb zJ@GL?Ztr(NZ|{4dl>H&}{`J&b0|r3~gm**brXQ)yt(ml42Y*KwVh>xDB-uMgXf^rZq18^{Y!rP(7bv74s9&2PS)(9Ciy6(aDMr$nX_ z$}^KdbN%+c6hjQDb?j+SF=go+UisMR)NbB)kF7iWPzVs|C^(RRae*^aEL9bzf)7sQ z(DHyQgi?F_dWk_Cbcsu89XI&kRW)~8nZA|FsNAodE;8`KI?aFr?^)Y1F`M{^BaymF zc4##u(RWHVtXbpn6b)RoPf^91R$OPDs5()X><(!ob;%U2%v+f)PB$!@siv>h^^cOx z6vi@eKtiiK7V@Uv4QkMMn8CP>8(j2Eg3)>rMA{J5248-!xZkl^n5sn%m_dRoO!9B`@oc{QK*X)kOb>q=EFM!T93$CKrC{YzL-%;%s-5J$Nh& z?ShRHrjD4|0V4~2Ldz#!aQ;)Lq?P>B?no{Lw3cKL$$yd3of6qA{o1qoD?46;$xGT1 zwU!rKcQ8iW5rF=5uaO!bDv|+iQ9u1yz;QUz{>=Gi9G?YP+1#A5)S$R~R5M&ln~s9R zdbbm0ysgDY5EeMRErw-t`@Jv<8?|xduLs@atek81zF$c~Ww?1xJ)S{f5^EGH<~*MW zx@cb+YWDXcX^Vbab%wqqr2laN%4)#^n^Cgy)g{F6z%wY^FbOr~5ohk{@;UrxpBBZq zx;2^jYHq^$lOkP){Nulx%1Kzp|7>eF zM;cFv^r!g_*M%aVU_Xxj)z>@6C@KK7Ea^DSu^Z3;1cJhTWB0F7b2aJeqRwfX3Fo)3 zNwg)3|2UB^2#YC@ARTZp71v(ahF*{GX-)(`5OudZKi>W{i5V`%>! zp>tjD5}^0os^Y8hvl*UGrQbG{OO25+>L&}{2h)d8b5>!XZLFa8AWdAn@68Ssdm`TU z+$!n}TZCEFmC4p)4Cnr{OogU1WFPg$6Tj)@!l(kT7~+4 zi`pKL2R2`Zkp$ELpw(2nEK3OA552pg^zMuNy|(3QEY2eE@Dk|q>EbC@Y_k2@ zB&rR-mKT!e;6zQPHpwCTGy~_NCdth4HG#LS`J)yMx*`^` zeL&xTag1BNG?Bm=l}o>R%{yqSOyCeSUGnh~c9JlI#NDG_7d+yUmVu!mRIsWU;?T=R z)=!kPa=KEgw7MiS5bqplVeC6gVo-~vB3Y>sVtEPrhmTN6wGC3;&zqYYwmH(#051>& ztiH^ZlvtEWM0!-gduYXb9+?{oF>}I`S{sfj&IiVs!YX4v+tW2N-FwiZl9r zIu-TK*%)dPegR`I>{{M>AP@T^7e+ChADC11zKJFD)OT5woljYWs~(;*TsMNvM!$)d z9;nk5t1UcL;sX=FpM@sPt%ZC;OPq1A9j{G;!3k0@0OF(9N3(yT)Aa(360AZ+EDU<6F2wx?mh~8`B=%^I10GEU77zsJcrQ$&7h*7sO%QrfQJ<9=G{rH#cukJr?dO|Op++KrL zU19Nmm#)r^K5Nz8X4bHa|?`qg_-kWqsLQ4|A%gsi)iP+JrCz z9?C`^9hAw6P0QW~x3<4qX_L~g>aJpFi=)lyNsJg1%kpS; z0>kOZS!d>sGMJ|K)!W;GTl3aQo9~x{0)JumQyAt89<$hCm7x7u^?Zm*M35oB%$T_k z)50K>sCBAo1#RzpzaAWBcAyBgpsGIb3D_50*V=h#&*$Wr3$~=SA9MozmT|rJ%CfKv#YV2~y(K^!pulB2PO;3l*pIQmNQN|A#Td|-{}D$HxM_fk;!~X@( zn6jwLjLz-0NMsV&P`*+zE&_Uq{PRR%A2(;efVia6;r@QZMIe7-O~%43eUf6Y0t2c+^iLE!b8cu!XA*i#|8PY7JQ7QN871#F@Ojr6|t~@LS^hA-=Qe#Y!yT`uI znd73_F^N0K*=2)|7Su2`vgbAd*BXLwQGFRMxsgHZcpGkki7U!Cuw=+}MS9cEk zWh1PlY-k^OmcDYAFKh_|IF_S|&3i3hO<6^!UIV!k51s^@IjPUSpyLa35#}`al|-mc z4|rDS_Hzp{6fFFh!d|weaqv5}w6c}Jim6?K1ou!b>Su2&|J0<|v*6^9@N{yA0Gk*s zLD|1Q6yhy3HKIZ?fSBkBrA&Y2cdYRS;P5!`@5HzjzxOMO7Txn9nsywh7;1|O_DLN3 zdJBW)E(HmskL7l{dA}&K46;NDhleNWz>5~ph2Q8xWD+1^7#JbnBOm#v_A6zZ=2%7; z=$-8^8`t=bRTDuZ%FrQu&)xy#Zy<&1U7T;Uw+=lRBkJMIFy(4iMu&GIlBNs`e?^h{ z@jW(fD8-S)p_@g}L|-Vbigvb4HCG^;XHTuXcVj7bcC^Rhd=q+T7kK+izUH#)3|W#z zOtv}BFhaWdufI$;D(Jmz@~@I1jziJ9ci1%gTD1O%XUE!hMCV+sKZ6IAe+c=Jo;qK? zJ{3-5(nnG_;L()d1Ofyp0&}zFRRuRwo80Yvi}{bUA!Pp3621*F%kB6VTo<{Hl|+q; zfFEsZLk0FoIA)*bsI-V>nq_p9_bU|ZAtj}kajS7kcs&{zgJ&xF+4WNnejKe z$Lk^a#>eQz&E~q`>L-V9B2hAX7adiohBxCSG3_5EYscfXIRX>si3g*r5Mo0X`SJcm z_W9;BW5)!o;l$`zCN&dnoNE`AQ=?Ir#@t>$`jDGaEEUDWrY^FWQYEQLXsOLzAC8ub z%a!n>e=AhYVFS46jUEjnDZc8wmJIU07@(y7Y^_c!jnx;s(jENrUJ_~!SIlikY4WKc zPD&g)R=;6K@$LT9Ef6(GgpocPTgpU4T4_Ah#cp?N4ZCS$-ou?U^)r>#O<_w$@AFNc zHikd7(TvEnF8KAanB{0eAE zuU~BXdf52L5#@jXIp05!kAuFZO5)r|iK_U91%-wZi|s6{(z08LiXiagJQ+z3WW&;An199dXgoC!lkKM(hrokP|<8yxffy~b48 z?Vq%C4C7AeKYmH0!2VH(a0$ zi0^Rx;##U6^Vu`AmA#;QScfu8V#KdEd!h$-7RibGR@*rR;phH^krb{t+rk)NIX0n} zSyK#kjvX%mHpY8Cy8TE$yD8lWM^8acRd08?J{1T#4*+5JJI|VA0|Dr|n`W!d?!jkL zr~~~sKbnl%mZtuE4xG5H2XtGK0pizw3@#l3+s+g&FasHE@AMW`tbu#gX9E}1l@m>s z8ebQFrPziroXS&;8kQEl)^k2(wZ%RTqX}*9KswWu5>QEDkd!tM5(P~zw7)l!9#-b5 zNH6T(A<(8gpGf5XFg*Q5Hdepv1Vz&u`-y&-^75;n*{xzC0rnB@#NN>=mkt(F_D_vQ zRC7r+0075h9HHx!VoKS6QO%F3HZ>SKG)A9J#jm$&3UtU{dhkTHgk5HPz`ax zL^J2%F0f?1FBAP6Zapk9X|lC<2KnY+;j+)V4S3@o9aN>kD#v5nBf=v(Vf;HNn0U&D z(6><|dUSD|s}>?FLI@oZ&`4>zaln2wTy#)gEsCHNmx~g+U#257nW^Gn@5a%uL^z;M zPS7shnpUo0cm%BY{`Fs433R5yS1R#1C{{XGR%kP>B05>!W-6q#I!5e?F2ojl?$0ZF zu?!w4aO5e{vL-k~&_`0!>khsd;&K=Di?yOD{@+p`(lMgncCrws#okmgErS6PaUiBb zJXyh1*PkU?1H)cz+o!McA>HaGXvf0J0|}cZ)=E5x&u)hGcBY7@n!|{AoH2yNG-f-_ z8O-;ZNFVMSFJU=vx0LF%(ZwXxwlMuv9AAS9QfZ0WmHNbYU?qZ$74sM4#iVANIIsV} zk5eOBAmr2+hlljCoQX_xQ6l?WIlaahWGF2FB++ME>t=RlC;R2FV<)}5vV|B>=*x_g zFwhZ26}Klv;}aEp1gK_5#E`=kel^JHY!{k1!tHBtIF=_bN+NG>6&CT%E01^RSO|31 z6y$PgW}}xTN&XDqAGnc2EcLEhyGc+q^Wo0%BC6NFH)BYZnJMngcexBm* zmg^mxTIHwzJ>H~B8T9n8kbe;LsXNp_9eDsr@OP&P`E=TVH)vb0l<_I*NHHtJ61 z!U4)kdcev2j|%{LBNcRB^yGpN*OTi%%(}fgimh~}BE>>PwQ$7UH5e&6c<-kl0`&=L ze&#d?bv!Fz?q)ww23NA9tt^^J=p~N}aoLbj37Q`W05}Urfc=tKtxauJ+i`))4IQ zm><5xYqBfQ&BV z_|{8hDWz--Qt-@c5*j&Xg9d^`W=!>kqXTcj6b90=v+ssgb@<&8KKOp}o$uqZ>yhQ@ z>H+LuIioyNR6Xd!5%X4lPy+mqYVjUJhn^jsh`3w_&F1Nr#~QG{k8;T*957-RlsitC z^DSwKgo?<)E?-D~K{$ZXUI^(o=GY6u)o1e%)B4B1Vf3-b9Hshk`Dn5`N@1SNWOSt1 zaCDM%KoGSOy(s8dk561s>Q1E_owbqY&cv7_5#n3k=l&uQGU-nOZW9t?MKO>X`LO=s zO(F3|%t&PxIlR02F%dQt;0x+Zts|x4vIB^V)=At^H;+fvF>@_;n=jHebV4c#f|Qg} zu$4#V#R*v(hd~R1Spt6YwT-|13mmCi5?daO0j&&7p!A1CnHEh2c4;= zDnXM{VSe(AL5&9Ic*?FXiox7Qu1Ua7B9?;UBvP%RkOAg5iA912%WluJAMNR-O=+1;MX9rQ*f`~r*ST#jj2)Vhq{gJhWEF*#|ax63W!xUMYx zt#$p8!GWa8-;!purSY1HlijAW32HyfMXAyGSChzVWW9@TO!+4EMx|Z#s}&k0jm!**bnB<3NeFEke$jJf zMZ!@b!Hwu+5FVlg6>Jfk5(7JHx;)-<_L{kb`lBA&?U}l)-=MW`@9+^@+n=7Ug5R3w zDhn!&v8wDe$Il|ZiViR))sKF&fYp|VFbKao`)w!K9lGYtsGksGI-VEKbi8w=WK`#* zn~5W=YD6uJ3(v4e4T&Fmm;2E|`M2N)B`vLTa&Mye%vbY{0&0 zK&8&iD28|>)sRUrDm~9MC8GT2x&@AKnoitR?N}oz3xR z_zsQe4j$-!#?ec;v?!;BP@Y(Lg$t^TMEtxCiuZL|n!Wyq{fa`i#JooIM-EFncH9qv z4^+aUEbtE%Xtg>*zbB~fq;(PuD!=$lZ>+zNeq5r?O*CxvR7Whx3();tulWp96a?vn0ojQH0q8mr#^_X#jf@UTi3<2K zE+1iM5b=hdL0u6F@h6c!KCY##2(LMwSm^xdYTG$~`TQV!2>bS!6SeBwrK0tHdD8YMhGXaJv&2PL`<})s*w!8aie8T1DWXH>Ab ze(7Il+;$D^?A1~<5=S%;hGN)(UaXK_7U{{KAokXIOLesVq3h$}8NyU;`J#Z-8#xzh zWVZ?gf3MhGZ9vd^w_w4U+xXKHJ_9j|3%h*4y&TQqp%FTj&zUtbL(;lFyiBRNt&4)! zOOI4#+aU6dV)N576vE>ESfOcoxWnwbYy=1OG__7IMQ`%x$%Q|3v0&%|@l|?Cf^A@~ z2|Jo@Tgz^=J(0uC9{%2(h)tr?=BX{D5=wWI9xRS8 zw4X0NE~6g&9LBsiz`bqYJ3tcnLQ2u&Lu#=7A&|Dc;$d>LgEaGaN%YLmqq@E^q|h;w zJX$(TnPaBC5^vPgZ||UGqd3YIhp2G$aDx5KagI%D+(}&pM<$>M0SU8SKE?m=Mf4_s zj8cRLIIS=#6VX{rXYF|tt~bkona{7CnqLVJj1#FY7VluGh^Q+sJw{3nQUmrAicy95 z9~8_g-pT{Fe*Mj{na>(OXvWx@lu-^9wMf^}_d}H|`fYwRjexJ;HtzMR=U;6%ARR;q zLzw*e+JO@$VSlqrzIpxhvIWpvl;VgP86YOchBAmX53cj-b|LjlewmXEEqz{?(qXW^ zH9e~_MMAO64;Y=?K!Wo@`=SjN|DYgPX4Z~WKbc}r#JD`xf#i@5ki6&kYZYlHAVlBy zK3Ny+_h)Hc^?=lr zLG8Ja5DVxwXQFnJ#9p@6{wbiQkX(;eyTk{zL!=ZWSNznSMVQv$(UBEGU%QT#Q8 zufj)>&P^&;7o!`Z>9e#ok^Zp-xH9<}-fl1K?vB<~eG)H565}F4T$oglBU?F*{#f@6cnXA~^4u*e+3vNkhKijY=i zXAN+uq;b{`3_XZFvh72Gv@_i72_{@utO0-RN2yE6cXlCK$`c->bCNG%>*^Z_!_^@Q zHeZzx10d}XV)^r})%`yS@2gdH!JfnOxW!}D0Qq}%-;Fs#`?T3~xb!KN@^O%aqm)%9{XwveA3n+c|6C-eAzIZ$xlZ?v#x;;vTMwvhQ zLtHWIyl`NHKS(U2+$sv+VU$E+3IIQbC~QYge)fLyfH*RvpqG=^Q@QKhs=|Ha1Mo%r zt52sx#4)*n-;2kE#Bg@Z6OM%tf?Mj^KM6x$y5UP3M^t_$x>dU8dXwoHu8R38tbes` zAhfI3Q!E?sjjh>ld;X2vBjXrlYi5wAg&ntk9=j`#g&hagTQoSNEJ#KvcTF_Q4En@b-? zs+QpIv_|{jZFeW9F>6;zOoin3bQwMNL%o9f@3Eg;z84&1CwX%QEpRH8#Smgu3FOYs zHb(h3CWWXomR3>l-~`!d0bjfJ+J(*isGW9#1It7t^a z{n%3%H=y7o>ufTqc39%O;T`o9bKJEjx!R0IPjh$Y?e+Hv!3~oGz~X z1A*=N0%~t|==?4s_KU6;sE;S`eJtb@-}s1uAcvUQhl@|DY{tt&f%#Cyt;g3*VTh@v zubs->e0G_M_S~V4v@z7UJRASMXreo>s5F-*GZpwU4+ZhYnZ1?FNtLkhIS(Rt01WUCCT}paKx&I>x2!zu+Ll8H~p7= zp&CCE#oxR0O%?(Dh&AmUyL(L!u-VKWM^!Bo#3e~)e;MNd=I4cm2>|^RM-{*Tu0Af- zR8Z&c8!q>A26Fw>VIE(oA931Wq#G+4RC?Ux0Hvsmm1YIZ)}kN?!2ruK%@(g>*!jPUC{-D74s&GJ2?b{+uyVQXsQt3>U!1|Yv0W8uCnu&|TuPKIvRk zIMJKU>*r-4`nSI_St|Ld(~D@t(s`j2Sa5dhhKbpIxFhkx2ACh6?-N2b;2nqye6=7W zq_&e2BKH|B!|dx|{700o*}Z8x6>s)w-FrMlOc(?o#yEUF%$b@;u#;Ooy6Q?PrNWBE zfwS*)=w^^|zPFh@pIG(#@O{4$ewKQz0KZR4)QK~_U;YUkt$E z*%vIc)x<`C;vMeAb?!P|0i-(aM+uUIJSVp9dewjFf4RTOrR-@JN*{rjXK{XKW4eWA zt^yx72Q4xMRxxfn!{EFTP=2&GO!kZqZOIMXX+X2IE03C_T|GD9w%>IKu0IEsTy{{~ z`?+5LPj6DL?R_l_CKb1IyjOk72F8NElgS;uJQb$zlU;DYVpq&vbTyLIl`y$jWb{>= zYNyE4vyS&u;YAn**^;4ASTZLIM1cY*Pr|5y&`Kw^V0-(Vd^#yKa1~{M?XWx4)_j5f#%j>7^bjEW)f;@BU01VsZhWBVlhDzCR&1J>0=g;A73=*?FDYclf+@Wx@VCSS@{PE7KunQp$`0%GCQ=De!d%FF*I2kjJDmDXfvE>LY9 zss!)~{aR$;vd8~q0$q|JYYl04M*zM*b+u3n^yk$2bf>t(F1KXb9 zypU^6SITiseUgL_ne78_n~u|i1u^NX;rP-wq+5l)vQ7!R%Q_23uIq%}7ki%r|HaP6 z$!HA=#u|ct7s{WG@`an#GufGYx1H*5nYYYT0F`^*Du&S|0#c?4Gt& zCj62Lt#^eR0nMAQ)kL;;0sjqy(oBst)zQJjW2mP`=)L4;%!+yA{_Cl{6uQmU6y}^g zW4?AE=_sci3n%hOK1GP^33lOBkFjVGqC{qy?aVZeMdfp7rfp8#H(JUx&bKaZt!Uo2^12KTg5@{>`14`N|^C zS9?auW&$BHp`ZgvZd%lwMcJjbsK8(N#o(O}?P4ue^pmUF=74R*&Zy`G3x8|70R({O z`QI%4t3MJ7;Qc4hx3N1Z62Ki)8ciJkPOdpVCArOtk)&yomTh5#wlWt4QR4@(NqxHx zc5)h5y*}711}&@+Xo7w2iUjo`MjUTP3E?(M(T}hN1;^MtG(zA@h&nV?n6lHUOmGrZ z)xXlbNTzQ~@#X4P-$>mWc2Z+*8GBgxf;=^+gHZx6&!n!52RvFz9rJb~SSna6R-uyc ze;PPM3;O(tao@aLnql!75h`wn<&#UZ8Y@}DANU=4t4On}ms<_3hK&#Co$LrIn@}~0 zr_%lE)u_lf@(&5Ldo8)kr!kA)@1w9{rl2t4=|s_2YM-uvk`g)mZzK1Bs%Lv6*0L?- zkKGU@#b&9hnv7soxEUY`S2^$vCZbMNuy6<_nF3lu4fS~ zeRQTyh*79auDP5kOppuCo0Ahk6x^XBEOU)PBDBJAp^$)@v7(Auj&Fd+(nIV8ZDFO) zlMnV~t9F6kCx-gm)Q2uJL_&~2$xh}K%O@%gcnMS=KtnDRqG^7&N)Pe9$D)>eHg^*ZjN)wYG0Ok@qy+Q$$R_`yTs;AJpi3N* znhYL#ybW$T(2TYAeVhYir(Hn+iokUwurLbaKzVqjD`JKcBmIc6SQK^e z!QPX`b+-HWLF*2)ww3s65ppwq0F=)JRnD`8ekQjupps>ED%e$4Sn)AD{BN(+l{?7>B_Ape z4CV2&-jm7>{N8sJbi{(I=x7PtrmMycif;vc;jt#H^K&-ir1%#!+4XsOb0nR0nNAHF z9Lk*ls5fEQ=c8D^p`3S?4-`cbp*dcySB!pAW%zfI8UNyHq9nER>;K%li-F!stoDiY zy>^MeVLFJDgo?rAYSsG+Tdsr!`unVnb1sxM@e+IC0?B(AY!mkSn}w$E&(7=U7bkn) zdNQ9B%NSp~{%>#+Uo%eH1vVzhTd5LR0kj1hHUt$S1G67jw1X80&|yIX z$A#vYv9~G5o2Yvas+Bo9rnB#>sPY>-D!-ndLl52+<(p*Zo(~K@G0vsilFODLNG4R+$}#{)TQihoYjH+2%)YCQ;34*xJ~oZV zh?2Ogw$+t~$&SzIzoj24r&8Z6$+M~(94 z-(DXaGugQh~2Kpa&4!L zbZ0<}bGRlcOd@==vnM#{*sP~SSg5xohvf#s$E_%l`OFN}2QYf*m)ezl4!3tl!yXkx zyH==TNlQTq{;*lT8G7m)JIkqjI?55=zgOfDXjz=C<|uyd07!C$w_opbtv~Jjf=uXe z2#a3G!EUtIA_b`7ZnXW2Vu&ih1ZZJ%X@XfEFf>0tRQ5&DoEMu~?~pPX)3$6LF+6i; zW40+9ZQj??WDpy1%6u*4z1kjq61<-)>2X^OT)+$0TF+(ALKCaZ!KuV61+!6fjC%j_6f~auxyGs5T6ABJ#yw5+vTm`=ZPshEO z`hHNtZD15A%M9Z}Jdl9JjcN`47vXt~Zlpj8ScxcA37KwbZOVr^xp@ObTG#KCfg=5Y z-mZ+XAqn#SjoLb_KYxsWlb~o5$(aJ*0ZR0n_-XDpK*W)XgaMW0(aA+wsF(f@o1@F< zM`x}vj9gcp>?tD(Kru|pLAyh3T(Q@dd zd>4{@w4&bsb{pnKSjxLAIa@%2!4xpcthHmEG1K{`>J0DELQ zk`29m79ixF6q!H`l|%r{$(R3UkqAHKGl>r^~^T$H_;(*LtpB zv@m6Cu7q?nl59NH9Rdfzi@2*kc0F=6r0l;^ZFz`wK6-UH3hH3Wo0Ag4T;AJUJtw<;pT-O_}kz%OXapSd&0NjhVgZk z5M#(M(FopXWX|%+rMpU=uWojxx7gn$5-lZFg+nYe$Z7k+C`~tD z=;fd_UVnTlOgaobr)d4HH#;iFQnYGugMagsnIA@Pb7lX^6Y<4`9RNSihN1DT?4z=l zBN$sA&{AsV;nDR@EzW>aKAZ^}h@kndackR`F~MzW&mxdS=9I^XXrY)Bi1dMhiktAI z+~w(so^CS;3=jVG-XPt%(S^#~N`iY~jFA%y5hG!wt*&hhy7Uo>KbvhMDR$7#W}=tm zGT1nm*ir$(bbNwqPF{5d_Jgv2@#rG`H5Hla+-@A0IiJ&@xAG(YOgD!YkmTS1X{(7YEEhx35tmPkz1ZeY zUDSP@y7t~f2_dS<_Nj6Wx+}SvQuKI&*bQW7_IUe+qVH`nvCc(DlLZ)1m9O1YRStXr zd-Ng*^B3?{xze~vCtJvm3exN)%+O2`YE8A}pI{ajgch=TESfH#iO>eq4yue{1C3=! zK8AI~d%wjA!}RUi~t@rF=)C(N=cnRBp9g3M9V`1$dDkH@FcE@Bgs|PN_At zCY@KPr$BP&(NCC=iWUKdSu8d*$c}nRQh)28Gbm^8Q*G`i)>`lSU~-j5=j2(0`;sl? zag#oJONFk-c@^1yo|?142v@g|;aJtcZ8CDe%<@3&1ZCpOavkjUsC%|CW)k=4T&OhC zPn~@i1tbQ9jJD*4arxSCe(&{6EKHSgq7y0cUH8^sqq-Vsh-kl`!C)a`O2;088u5AE zLVz$XS0%O@gc1kV5`$jajWQFqLjV37^ONiU=b&C+u!8v6O7c#sA^uKAiw8v^>R*JHVjeIz>q`IZ(wQQ z4C@w@k$WY1e_>7v{o1RaOY(#t(f4UTmpHfST%jWfL?6o6X+pkb|5RR`1f?22AV$?# zo;Wa%XN3m1Zcw&bl;x$P@Q=zC+qx;_(zd|-+XtENSNYrvMJ0EadIZ91%K zLfC8!2<@K)#(*K|2*)uaqROz7s<*Lv{hQF z&bo*3DC|28Y(ZSA*Tq7_OVc0FyVrF3I=-K|&KM@oM&`{usoqwR{n%2M7Dh2KkP7K7 zdk{_g+_z!x{pIt)gAr5n&5rZ>+fC@IxBKYQ+Ss|WsI%@cL$=ZvgaT1kl+ck$08q1z z5ls`3#weEJ`|oPZBup-7hNOWKho7lWnM9ALW;q$#66<&e7p`5XLM#2Vv=@i?0!+_! z;-GGHKLUD0_~{?snD`UW9Qd5|^q}Fh&kK>oFiRZ{NMWTVAXzTC$R^NVy__(K@5+kQ zRGYRP{U51ZYSaK~2(p~(>S2K)Giz2lhZ3U-=kGxF2HsS9O5&r`0?r^CUSZV3{kio-6RUzW8ErTiGD%j6&VCe`FP7;zklDw14k9eVu5q?%|L`#{w z@>!OUV4OTyS{0TIkbFNOqGNkl?#zg4LMqy<<>W(IN@`G$dp2OfJex?ypiJCl(7PxN zRW(d2fJp}COJk541`v``; zi)Tfgqj7-7L?_LuHMt8z?lN}csCd%8k-$@7rf5%MIvJ0`isUUH4ax2@k0Hv5!wWx7S4WDF+Yt)LLDUCoXi8b`iXR5k+ zFLhs@Z+_@<_w6OzXc=JG5XfCtyjAYiC+tivd4Ck`^A`3SLV#R^J9=Z1Fi_H=HWSu; zMGyr$3cMqT3crjFu0Ee|mAD6wn2Xw`{LW&lq}jcTYRFDh%jR~jTq~K78r#Nz!=m6) z_JyxiCo_g+OEWUo%+|l>E3Pfs>r%Zg^J6{+SJy}OvUGWSBcWpHA0`MGI$LM_V*3o2 z7=TgUt4hh%ASk_rn<2Bsz-sCx*cKNiArXd6V!T?WUs3Ac|9>>S1y@{M*R%@+5AN>P zIE@8&_r`(~Toc?SxVyW%1$PbZ1PH<1-JL#tKkxbe0E031?zPvfS#?#QZf-l%)sRzM zW$pC@YFHtIgOrL(NhB4NoKWG2tQy{vH~94D@1Rc)kB=E+Khwu4(lxk4tgA)|uGwz+ z-WeD36m7&2?fx?53VM~_&S2|GQ6Z0r?P^H@0@D7~x)=S?mQ=t0?4<)(Zekq}NgZI5 zT=THo%`E*wzY4|o8dmM;y?zF>Kwxd+b?E$J@{5hNhxuJkl>!{dqkPJSFmI#7b8Ywp zo10bu+)X;2e^!zA?_R6hMJNBWS-C=N zRzz7?0qH4@w%5xF#2oV0W+5#v1x1mxI=Qx!>M*$7Ci?C2`rhVot-bG5GHk5>?o>Qn zyyBF{^S-K`*!kD6Ki0U%@%greK!cb{b$ADbvBDw`1aC#vLfpY8lp^m@GF{-J`D4S+wFBS3LlX!gvMu5e*g3ELJSlW zBF-C+J~j0OlxPzkA1#-$d#dc}W{|E3 z`~;Y1DADUEOr;meP)r{S%45OPVC3x9#tuy8mI^ku30gs5mKKkGdKo4Nr(}3D+8Gys zPZ2okhL+nc>q$fXSGAdVY!_Ml<>Fn$?eVH2eQ(6~@M$hXt(0KMa{;{WHB}~3_jmqc{o){u0{d{6K<<&gY z8=h4>m=?vSjgH>Ll=M{U&Lf7$t4UZ6$HO(rxI5k-&0y-^X{&)>x?@0Ij=T9dE_t1p zcwIy}vhX7|s4UGvF2E=ZW?RRUm>Nngj!v~cxbg=Oy0OOOAZ^wr!NN4W8IK&#S@VwtC)@ zAtv*Om2wX8>=;OtusHr1Vqp4bro1CF6G?4gY*JNJ;+C74pTbf=L2S{iiomJhrb6&6 zP)r6@=NwqVrG_K1>RfO6^Eef@TeJl;mk!q=pm&mhkbTM-Q7DJ0>#r<*0P}AvEXLBP z$d%uLScp26-HV>zHZRQVP>DFpX{ZwCUZ-G62Hw;RJ*wog6~=1evh0IGWRs0SpWY&| zs5op`3n*-TX5v&~W3(&fOa_|2E)Kv5uCyN_p6DwFPQJ6gr|#qnaf_ zPp8R~GyNu#@+$FDmKVgboGTrsre(LxPeCi9nrVYhjHda?P}%BAsdwCGC)^c(R+!%6 z?!)z|34{XBCOnzPOHB}F8`F>^71Y58_ZoQ#e<0g*Bsj@4wsZR9sjHHB37Nl!y+6gC z2c@ixnD*9f)(H#_EPcyGCQdGoNAO>*AATggIoXq7F23Ehd38OZ6#x2Ncm-MG*D}2J z={FQuVI>vhpD>|~XStx;PG6W8FYO1Kkt$s{Q3U^Vs(HA9|E!lfG5UGw zkog1=Sgi(I*VHH3bqeo6L0#_>5P6}(p{aaFeEDAz_st6jaV9fs@K|bNc#lvdIGU$g z6kaqQqZU~^^pg%7DAkx1>s7|t&~q1=*C-dOjH%_Fqn7@2oMjZL+o8kbZ)|1qY9x@C zR9=R)Gx-#`te)`SNqN2}`>ddB_2rYZ#pCQzUNV<_ zp3krS2P2V#GVlo+`G+yfzZfvM@0w-zjwgG4S{|F8oWArpzCjOT6{!hMtyC04feM#; zgs64zU9TIEaWfnbLuYY0boY)S$6qu9M2@dF!&06}PJ~8dG(n7K-hKYeE-C&7oC0LZ zVQPVr6;7JMa+ClqaPx&GKo$mSk7Dz9(IeNETm*nb9}NM<@SjbHz-3#D$@Pt12+1Q zm%^Pyi6T;0?GP&vUMbzbdrHP8gc1OF|EN z#1O~F7N5EgTK@;oaM&HHy1DS_L<3O?g#^D#!uUCFKv0=sf*p;8dI7Fm@b`s*+CL_r zruDR+rnAC)ZWn!fuE%i=J2^(ctCLJgeLW{<+M$Paqv>DqXm7u=H&ZZV$P$Lx@7zu6 zO7}_Ru6-X2j|d}gdU{0kyNhqQR{wum02}#Lk^gf%Ik-yZZA;~nX|hMgTiDzg%X*qg zT%@e2-AqNPGssYocyOSQo;gY*nI590TQLeRDvR8I=ikdBjcoQ-rv;m8iKzLe!nhU)b7BKtySs(x<^d21 zSo1^`@B?10RsPF@rkrMk8$5*7)R=_*x2)`rNWh9jvQdl7fA!2NOZwNm@G+Mn9bN*) zr&1g#K_>E}v@?LhC(7WXNW;>eq`^9yrxN)69*44^A;Kzpk)!)ww zJ=Z&l?uI&7=i2x_+M)gAU49`VKDR{vcMqr=ZS{MiWTwmC%W-QBBgIlB84L23`WR=0 z(FFbcM}9wgk@?2+J%5QlMh7o{^1HEAX?ss1Epykrw4)0$GurO(Wqe4-!-iyECikC6Ytcs{u_d=JuhjlWnkCKnaJeBxHi!g*6 z8@ZIu&Bh4BZkot=0BV9WhSZXSL%U#QnnsJWRUuK8$xdU6_=X#;`1>AWpr7AAo*aiU z94yff(x0G;Pz@YWcqpQc1y*xKdlLr0qNQ4DTYo_EgNg9|K{Iu1tzmyJRNIRCv>ZtP zV_1qGl+KE^Ov9Nu*M;fvT*J3yl%dAfsPPeL;2xWo zHk4k1uA38PK2643O~$=vuTt@GXcC+CioM~n{gZeCX@24Oi?MMX!9O-)GxVzywV_ou zR!9j?H)c=4+bWx)=d1LT0GsmDfdcNPPd{wJk1o~QmBm0}^)^t(%Q()u=nBov3c<9J zwOrlZZtsTE;Rq`E$FJ@6%O6k6k1B1qxyi|eF!LUywwB2ic!0vfPd0UaUW7z)WbGL! znX`d^syS_vDA+kE0;w?fK;xYll9PnlKaW`mg+7Z`sC^ydx==fRI3iyvZWOKYvzZbx zyJz!iGl@CrO>C$(2xpi&sna%+JH;5!Y{>l?91qUisI{im2byb6IOo-WWgb}&?*lKO ze{PG1^qMfh7En~$BZ|R`t0cx>|G2w6zpVFn$bWzk`iSBLt(?5_5JOQC#7%J)ym&K| z%TKXJI4$S&xK41z9WQ&6FkCV{d&xYngvTojvlXwdi3xc-$pGMhm=EslXkoi62af+e z9~fjGbA$ASUzb0?!{4EpnzLm5GROX+a`E@fyU~ZQHa?YWbW@Kt7j+Y=1FnIhh$j-E zgZWn3GH1WSLu`WUf2+nfY`+OXspZN54DYEE4Sh-qCuSfKUp!_IzfFt#GL-P0|Y?3!=4vrJYg5plJ{95jQcP8vl-6(<@D~hR-F*5}kd^E->6aN?rI3vVDk`QqW z_Bdn){-5cqG!&CC=Gm%;eCHh17w580K~-2Lc4O9IeCwm2YQt8FP%QSnqtDT*8X8G_ zi!Nwht+rk~om!VbDV^PK-Xg7a`}UTEcHPPL4e5+#V@%K;~J+swhNB9M=9O};1>HrcdT#-0yVNv;I6mb2SmXRkj= zO=&s!c=LTROt^LWMh(@d*q3l)NC-3%iDp=m_n=v~Vd;@H%c@lS)g)X>#K?yX50xG9 z_fu2+zI|87PA&qnlk+S2*Tg-?W2q?Ox!Yb0WI{;_RBAExY)-y0a&l;-N+a$^+Z&P( z+7`qv!8vs*z4DU62!cI7`2>j7{?8lkFi>~~FlX2Bq(^U4o98aj!wgFq*Vd4;_GcaP z^@2VpR2L#248_L}SgKvJa9^?v$ZCwl$Kzfq!!MDBnrFl2AOhQmuC@rZ3;_)ZSK*?6- zMBuR}{gR!%M}ni4^@?3g_G&3k#$-QQw^=6WNU%YMG9tH{ zLO=~p$GA9GAw~K(BHlq5W@P-|hY1F=V-$*-3YA1nM_)znMv07$|BG7s+amk8q6R&D zM}dDqNel><70);A9Eo$!7X0IPY34K1*KatMRd;s%riAlFjC$F`ZY%FjdM! zR@N4JB(H0KG#grOF;(p?U>>t@0dTZYZ<&sa{_k-|!LT|ly2BGgAz0(?vkI@=FGKU^ z9MkL6<6+sahy%)5DaN3}?|YpkgR#g@$RC!pkb6A6(vF4>_dQ6WoBwfKXW61d*WCC^M;x_E%*`F$c z+ic_8&dK`R^EeK@>3xsve|LiE&+t^FU3a=3tvy&Q)66m7MQ1QeD0nkSOxD|a(BCQa zxUpLAtA8?Tth~W&J#8a@FsL6PSji?8wL&KcI}=NhNi(N1l>VL0sqm5KU{Tr=5r_Y_ zicfVjVb{CNZkk+u9HWv^Jq8wwWf>I}XaUbBTaVV3#zy=T@~g&1N;@WDZrI?;uF>NE zeoUK2C8dVdjM#0p&fvshMGBl%$iEx+w!vahlNTA3O&+Btio!Ae|7yx%ihuoiJue;S;-y06p&cEEP(Ca+O+>?u|8kPSjIjO@& zvrjWCo~+;wGr=o)GZ#Fv8Y%)1RDQPjpS)9(|I>|?(n^AHSH2xzg&uH~Y@2)J(I`Ni zKZU}N@Kq6p%`mHxcP!oPYk`#(d-r_L3?4flg$~ehk-(j-#sfT!^r*sfwqVKh@BWkC zwI)3o*6lYj`-O|vK#VlmH$xDG53nk_X$kJCU7@al8KkWogkw;r>WX~x5Q?4YqMWFm zOFO8P)lH6t&(CZ;rs^t|8e~bLXsMslkP)hw42paI-jw_~#~UFefr(=h5k%2^(+sK; zNTTP{+zcV04xcMb)+=$W6vlM@FgVG!D-ixMy6S(rBE0GIEzaFA`_w9bud{Ai=4qNq zos>}V`L6;l+oh!omKd$M#<*7=YC?Mo7kwx=F0|FpX&MsF2!8DGAC?jMD>#GqYn8f{ zli*;FX42&%4{49WwTwCd$GhR4YV9W-t14rNu#Kqt6x4U9zn?1EL$Qik{~ zC*T!wZDvk9AY+CJEez-KO|-^~z@m`irX9`NXkk%NR^b!TtI~xeJ=xRTh1H6GFO5rp z)ePNg4lAog+bRXdS7O2=f z8h%*Scf(h&Ux7GGM0{8(TAy0Uf3!RQaat*tuSVKWF3kNVRYLa-b`X1d!f4-z^|hn8 zuMCh+`f@jy2tLm_qy33jfokqp;B=GKelhv!7&uoYxKTjr9F*f|Bo0a>28s>mDDkDHuqxcF z_2B%2P)T(x2>D($rcN3Abukq{FR!x9r1CXbMn5C>=7js{;q=w#wfU1_JJ4Jt(`8oF z3O+`ykxzN8w|TppJQsPo{r&sIFQI%i-Ut%W%!K*iY=s7?M7fx8sL>+mS?C~&ZRwx> z751<|KdEm&rlO~k1|NzkXVpEQjG7uKv0Uu7B6$?9`B6z}oC)A#zKMw!Qpt08FMBoa z?(HQnS}0H!)VH?Ie0)GhJ!caXc?FM|jXV8_s~C@L7%a$L&}ep8BKS`8712YdfG2>R z(E~!|ZGeR45cQv5Ta$jeaU;2F_*2-DGF!2p;Kw9D z*xm7obIqS>qM;haO|>TR2F!`-2SjfraCk=a@7w=Fl)6>c&9vPlcL#bBgc zOf=@?w`r2yd^bYzhdV{*N)w7SkdEVUF-vxe|x=7IlMpz{~g6IX}Ih&NlBj&fs z^8cp=Fyv?rCqPueL>1Wkyk(@Nd#@-7HtMQmr#!X;(1QZtFTf8+Rf9-nUkc@mu-JPL zhhY!i0Ml@OM*_qCrTs~zMP+#ZU~f%bWw+pKi}g`QD)YC}EWzB+#bXW?GNCPf>px!7 z7}LflNp`TGe^waC(Eo-u(3!Pjt)biBR4T_A`|{P$+`nFhrD*uh@6BWN5Z!d_KVn8N z44hwcWe*!^劧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