├── collector
├── requirements.txt
├── collect.py
├── fb_ads_library_cleanup.py
├── recollect_inactive.py
└── fb_ads_library_api.py
├── webapp
├── public
│ ├── images
│ │ ├── PD.png
│ │ ├── flags.png
│ │ ├── info.png
│ │ ├── flags@2x.png
│ │ ├── dmrc_logo.jpg
│ │ ├── main-logo.png
│ │ ├── sort_icon.png
│ │ ├── main-logo-old.png
│ │ ├── main-logo-oldv2.png
│ │ ├── country_logos
│ │ │ ├── au.png
│ │ │ └── ca.png
│ │ ├── PoliDasboard-SocialLogo.png
│ │ ├── polidashboard_logo_sm.png
│ │ ├── polidashboard with white tagline.png
│ │ └── SML_logo_2012_transparent_black_text.png
│ ├── js
│ │ ├── jquery.customInput.js
│ │ ├── jquery.slicknav.min.js
│ │ └── general.js
│ ├── css
│ │ ├── c3.min.css
│ │ └── daterangepicker.min.css
│ └── maps
│ │ ├── origins.txt
│ │ ├── cy.json
│ │ ├── lu.json
│ │ ├── lv.json
│ │ ├── be.json
│ │ ├── sk.json
│ │ ├── ge.json
│ │ ├── at.json
│ │ ├── za.json
│ │ ├── lt.json
│ │ ├── cd.json
│ │ └── dk.json
├── app.js
├── package.json
├── views
│ ├── facebook_ads.ejs
│ ├── status.ejs
│ ├── index.ejs
│ └── partials
│ │ └── heatmap.ejs
└── countries.json
├── postgresql
├── create_polidashboard_db.sql
├── create_new_partitions.py
└── tables.sql
└── .gitignore
/collector/requirements.txt:
--------------------------------------------------------------------------------
1 | dotenv=0.9.9
2 | psycopg2==2.9.10
3 | requests==2.32.3
4 | sshtunnel==2.4.0
--------------------------------------------------------------------------------
/webapp/public/images/PD.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/PD.png
--------------------------------------------------------------------------------
/webapp/public/images/flags.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/flags.png
--------------------------------------------------------------------------------
/webapp/public/images/info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/info.png
--------------------------------------------------------------------------------
/webapp/public/images/flags@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/flags@2x.png
--------------------------------------------------------------------------------
/webapp/public/images/dmrc_logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/dmrc_logo.jpg
--------------------------------------------------------------------------------
/webapp/public/images/main-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/main-logo.png
--------------------------------------------------------------------------------
/webapp/public/images/sort_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/sort_icon.png
--------------------------------------------------------------------------------
/webapp/public/images/main-logo-old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/main-logo-old.png
--------------------------------------------------------------------------------
/webapp/public/images/main-logo-oldv2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/main-logo-oldv2.png
--------------------------------------------------------------------------------
/webapp/public/images/country_logos/au.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/country_logos/au.png
--------------------------------------------------------------------------------
/webapp/public/images/country_logos/ca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/country_logos/ca.png
--------------------------------------------------------------------------------
/webapp/public/images/PoliDasboard-SocialLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/PoliDasboard-SocialLogo.png
--------------------------------------------------------------------------------
/webapp/public/images/polidashboard_logo_sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/polidashboard_logo_sm.png
--------------------------------------------------------------------------------
/webapp/public/images/polidashboard with white tagline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/polidashboard with white tagline.png
--------------------------------------------------------------------------------
/webapp/public/images/SML_logo_2012_transparent_black_text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smlabto/polidashboard/HEAD/webapp/public/images/SML_logo_2012_transparent_black_text.png
--------------------------------------------------------------------------------
/postgresql/create_polidashboard_db.sql:
--------------------------------------------------------------------------------
1 | \i ./tables.sql
2 | \i ./ad_data_partitions.sql
3 | \i ./ad_creative_content_partitions.sql
4 | \i ./ad_region_partitions.sql
5 | \i ./ad_demographic_partitions.sql
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # — Python artifacts
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # — Collector
6 | collector/__pycache__/
7 | collector/*.pyc
8 |
9 | # — Node modules & lockfiles
10 | webapp/node_modules/
11 | webapp/package-lock.json
12 | webapp/npm-debug.log*
13 |
14 | # — Environment
15 | .env
16 | .env.local
17 |
18 | # — Logs and temp files
19 | *.log
20 | *.tmp
21 |
22 | # — Ignore editor/OS cruft
23 | .DS_Store
24 | *.swp
25 |
26 | # VS Code
27 | .vscode/
28 |
29 |
--------------------------------------------------------------------------------
/webapp/app.js:
--------------------------------------------------------------------------------
1 | var express = require('express')
2 | const path = require('path')
3 | var bodyParser = require('body-parser')
4 | var fs = require('fs')
5 | const https = require("http") //https
6 |
7 | require('dotenv').config({ path: path.join(__dirname, '../../.env') });
8 |
9 | console.log(`path: `, path.join(__dirname, '../../.env'));
10 | process.env.TZ = 'UTC';
11 | const port = process.env.PORT || 8088;
12 |
13 | var app = express()
14 |
15 | app.use('/', express.static(path.join(__dirname, 'public')))
16 | app.set('view engine', 'ejs');
17 | app.set('views', __dirname + '/views')
18 | app.use(bodyParser.urlencoded({ extended: false }))
19 |
20 | var facebookRouter = require('./facebook_routes.js')
21 | app.use('/', facebookRouter)
22 | app.set('trust proxy', true);
23 |
24 | hostURL = process.env.HOST_URL || '127.0.0.1'
25 |
26 | const server = app.listen(port, () => {
27 | console.log(`Server running on port ${port}`);
28 | });
29 |
30 | process.on('SIGINT', () => {
31 | server.close(() => {
32 | console.log('Server shut down gracefully');
33 | process.exit(0);
34 | });
35 | });
36 |
37 | server.setTimeout(300000); // 5 min
38 | server.keepAliveTimeout = 60000; // 1 min
39 | server.headersTimeout = 300000; // 5 min
--------------------------------------------------------------------------------
/webapp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "polidashboard-webapp",
3 | "version": "3.0.0",
4 | "description": "Frontend and API server for PoliDashboard, a web app that tracks political, election-related, and social issue ads on Meta-owned platforms.",
5 | "main": "app.js",
6 | "scripts": {
7 | "start": "node app.js",
8 | "dev": "nodemon app.js",
9 | "test": "echo \"No test suite configured yet\" && exit 0",
10 | "lint": "eslint ."
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/smlabto/polidashboard.git"
15 | },
16 | "bugs": {
17 | "url": "https://github.com/smlabto/polidashboard/issues"
18 | },
19 | "homepage": "https://polidashboard.org",
20 | "author": "Social Media Lab, Toronto Metropolitan University",
21 | "license": "AGPL-3.0",
22 | "engines": {
23 | "node": ">=18.0.0"
24 | },
25 | "dependencies": {
26 | "@huggingface/transformers": "^3.4.0",
27 | "cors": "^2.8.5",
28 | "d3-composite-projections": "^1.4.0",
29 | "datatables.net": "^1.13.6",
30 | "datatables.net-dt": "^1.13.6",
31 | "dotenv": "^16.3.1",
32 | "ejs": "^3.1.6",
33 | "express": "^4.21.2",
34 | "ml-distance": "^4.0.1",
35 | "moment": "^2.30.1",
36 | "mysql2": "^3.13.0",
37 | "natural": "^8.0.1",
38 | "node-fetch": "^3.3.2",
39 | "nodemon": "^2.0.22",
40 | "pg": "^8.13.3",
41 | "pm2": "^5.4.3",
42 | "underscore": "^1.13.1",
43 | "vectorious": "^6.1.14",
44 | "wordcloud": "^1.2.2"
45 | },
46 | "devDependencies": {
47 | "eslint": "^8.0.0"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/webapp/public/js/jquery.customInput.js:
--------------------------------------------------------------------------------
1 | /**
2 | * --------------------------------------------------------------------
3 | * jQuery customInput plugin
4 | * Author: Maggie Costello Wachs maggie@filamentgroup.com, Scott Jehl, scott@filamentgroup.com
5 | * Copyright (c) 2009 Filament Group
6 | * licensed under MIT (filamentgroup.com/examples/mit-license.txt)
7 | * --------------------------------------------------------------------
8 | */
9 | jQuery.fn.customInput = function(){
10 | return $(this).each(function(){
11 | if($(this).is('[type=checkbox],[type=radio]')){
12 | var input = $(this);
13 |
14 | // get the associated label using the input's id
15 | var label = $('label[for='+input.attr('id')+']');
16 |
17 | // wrap the input + label in a div
18 | input.add(label).wrapAll('
');
19 |
20 | // necessary for browsers that don't support the :hover pseudo class on labels
21 | label.hover(
22 | function(){ $(this).addClass('hover'); },
23 | function(){ $(this).removeClass('hover'); }
24 | );
25 |
26 | //bind custom event, trigger it, bind click,focus,blur events
27 | input.bind('updateState', function(){
28 | input.is(':checked') ? label.addClass('checked') : label.removeClass('checked checkedHover checkedFocus');
29 | })
30 | .trigger('updateState')
31 | .click(function(){
32 | $('input[name='+ $(this).attr('name') +']').trigger('updateState');
33 | })
34 | .focus(function(){
35 | label.addClass('focus');
36 | if(input.is(':checked')){ $(this).addClass('checkedFocus'); }
37 | })
38 | .blur(function(){ label.removeClass('focus checkedFocus'); });
39 | }
40 | });
41 | };
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/webapp/public/css/c3.min.css:
--------------------------------------------------------------------------------
1 | .c3 svg{font:10px sans-serif;-webkit-tap-highlight-color:transparent}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc rect{stroke:#fff;stroke-width:1}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:grey;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:1;fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-title{font:14px sans-serif}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #ccc}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#fff}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip .value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:#fff}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max{fill:#777}.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}.c3-chart-arc.c3-target g path{opacity:1}.c3-chart-arc.c3-target.c3-focused g path{opacity:1}.c3-drag-zoom.enabled{pointer-events:all!important;visibility:visible}.c3-drag-zoom.disabled{pointer-events:none!important;visibility:hidden}.c3-drag-zoom .extent{fill-opacity:.1}
--------------------------------------------------------------------------------
/collector/collect.py:
--------------------------------------------------------------------------------
1 | # The primary collection script to collect ads from the Facebook Ads Library.
2 | # This script collects ads from the past 2 days and inserts them into a SQL database.
3 |
4 | # This script should be run via cron job or other scheduling tool daily for each country collected
5 | # If you want data for a period longer than 2 days.
6 |
7 | # More explanation of the script can be found in the README.md file.
8 |
9 | import os
10 | import sys
11 | import json
12 | import requests
13 |
14 | from time import sleep
15 | from datetime import date, datetime, timedelta
16 |
17 | from fb_ads_library_api import FbAdsLibraryTraversal
18 | from push_to_dbs import SQLInserter
19 |
20 | script_dir = os.path.dirname(os.path.abspath(__file__))
21 | api_key = os.environ.get("FACEBOOK_API_KEY")
22 |
23 | if not api_key:
24 | print("API key not set. Please set the FACEBOOK_API_KEY environment variable.")
25 | sys.exit(1)
26 |
27 | if __name__=="__main__":
28 | try:
29 | country = sys.argv[1]
30 | except IndexError:
31 | print('No country given')
32 | exit()
33 |
34 | print('Beginning ad collection for country: ', country, "\nAt: ", datetime.now())
35 |
36 | page_limit = 100
37 |
38 | # Only fetch ads from the last 2 days
39 | after_date = datetime.now() - timedelta(days=2)
40 | after_date = after_date.strftime('%Y-%m-%d')
41 |
42 | n = 0
43 | try:
44 | collector = FbAdsLibraryTraversal(
45 | api_key,
46 | "id,ad_creation_time,ad_creative_bodies,ad_creative_link_captions,ad_creative_link_descriptions,ad_creative_link_titles,ad_delivery_start_time,ad_delivery_stop_time,ad_snapshot_url,currency,delivery_by_region,demographic_distribution,bylines,impressions,languages,page_id,page_name,publisher_platforms,spend,target_locations,target_gender,target_ages,estimated_audience_size",
47 | ".",
48 | country,
49 | after_date=after_date,
50 | page_limit=page_limit,
51 | api_version="v21.0", # Current version as of Oct 2024
52 | )
53 |
54 | sql_inserter = SQLInserter(country)
55 |
56 | n = 0
57 | for ads in collector.generate_ad_archives():
58 | for ad in ads:
59 | print("----- Start of inserting new ad -----")
60 | sql_inserter.insert_ad(ad)
61 |
62 | n += 1
63 |
64 | except Exception as e:
65 | print("Encountered Error!")
66 | print(e)
67 |
68 | print(f'Got {n} ads | on {str(datetime.now())}')
69 | print('Finished ad collection for country: ', country, "\nAt: ", datetime.now())
--------------------------------------------------------------------------------
/webapp/views/facebook_ads.ejs:
--------------------------------------------------------------------------------
1 |
2 |
58 |
59 |
60 |
62 |
63 |
64 |
65 |
66 | <%- include('partials/top_funders') %>
67 | <%- include('partials/heatmap') %>
68 |
69 |
70 |
71 | <%- include('partials/statemap') %>
72 | <%- include('partials/summary') %>
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/postgresql/create_new_partitions.py:
--------------------------------------------------------------------------------
1 | from country_codes import codes
2 | import sys
3 |
4 | def create_partitions(country_code, table_name, sql_file, index_columns, vector_indexes=None):
5 | # Step 1: Create partition
6 | partition_name = f"{table_name}_{country_code.lower()}"
7 |
8 | sql_file.write(f"CREATE TABLE {partition_name} PARTITION OF {table_name} \n")
9 | sql_file.write(f" FOR VALUES IN ('{country_code}');\n\n")
10 |
11 | # Step 2: Create indexes for the partition
12 | for column_list in index_columns:
13 | index_name = f"idx_{partition_name}_" + "_".join("".join(word[0] for word in col.split('_')) for col in column_list)
14 | index_columns_str = ", ".join(column_list)
15 |
16 | # Write CREATE INDEX statement
17 | sql_file.write(f"CREATE INDEX {index_name} ON {partition_name} ({index_columns_str});\n\n")
18 |
19 | # Step 3: Create the default partition
20 | default_partition_name = f"{table_name}_default"
21 | sql_file.write(f"CREATE TABLE {default_partition_name} PARTITION OF {table_name} DEFAULT;\n")
22 |
23 |
24 | def generate_all_partitions(country_code, output_filename):
25 | with open(output_filename, "w") as sql_file:
26 | # Generate partitions for ad_data
27 | table_name = "ad_data"
28 | indexes = [["id"], ["bylines_name"], ["ad_delivery_start_time", "ad_delivery_stop_time"]]
29 | create_partitions(country_code, table_name, sql_file, indexes)
30 |
31 | # Generate partitions for ad_creative_content
32 | table_name = "ad_creative_content"
33 | indexes = [["content_order", "id"], ["ad_delivery_start_time", "ad_delivery_stop_time", "content_order", "id"], ["bylines_name", "ad_delivery_start_time", "ad_delivery_stop_time"]]
34 | create_partitions(country_code, table_name, sql_file, indexes)
35 |
36 | # Generate partitions for ad_region
37 | table_name = "ad_region"
38 | indexes = [["id"], ["id", "region"], ["bylines_name"], ["ad_delivery_start_time", "ad_delivery_stop_time", "region"], ["bylines_name", "ad_delivery_start_time", "ad_delivery_stop_time"]]
39 | create_partitions(country_code, table_name, sql_file, indexes)
40 |
41 | # Generate partitions for ad_demographic
42 | table_name = "ad_demographic"
43 | indexes = [["id"], ["id", "gender", "age_range"], ["bylines_name"], ["ad_delivery_start_time", "ad_delivery_stop_time", "gender", "age_range"], ["bylines_name", "ad_delivery_start_time", "ad_delivery_stop_time"]]
44 | create_partitions(country_code, table_name, sql_file, indexes)
45 |
46 | print(f"SQL file '{output_filename}' has been created successfully.")
47 |
48 |
49 | if __name__ == "__main__":
50 | if len(sys.argv) > 1 <= 2:
51 | country_code = sys.argv[1]
52 | output_filename = "new_partions.sql"
53 | generate_all_partitions(country_code, output_filename)
54 | else:
55 | print("Usage: python create_partitions.py ")
--------------------------------------------------------------------------------
/postgresql/tables.sql:
--------------------------------------------------------------------------------
1 | DROP TABLE IF EXISTS ad_region CASCADE;
2 | DROP TABLE IF EXISTS ad_demographic CASCADE;
3 | DROP TABLE IF EXISTS ad_creative_content CASCADE;
4 |
5 | DROP TABLE IF EXISTS ad_data CASCADE;
6 |
7 | -- Main ad data table, columns don't need indexes as they are not used for filtering
8 | CREATE TABLE ad_data(
9 | id BIGINT,
10 | ad_creation_time TIMESTAMP NULL,
11 | ad_delivery_start_time TIMESTAMP NULL,
12 | ad_delivery_stop_time TIMESTAMP NULL,
13 | ad_delivery_stop_time_raw TIMESTAMP NULL,
14 | latest_collected TIMESTAMP NULL,
15 | ad_snapshot_url VARCHAR(1100),
16 | currency VARCHAR(10),
17 | country VARCHAR(2),
18 | impressions_lower_bound INT,
19 | impressions_upper_bound INT,
20 | page_id BIGINT,
21 | page_name VARCHAR(1000),
22 | bylines_name VARCHAR(1000),
23 | spend_lower_bound INT,
24 | spend_upper_bound INT,
25 | audience_lower_bound INT,
26 | audience_upper_bound INT,
27 | languages TEXT[],
28 | platforms_facebook BOOLEAN,
29 | platforms_instagram BOOLEAN,
30 | platforms_other BOOLEAN,
31 | platforms TEXT[],
32 | PRIMARY KEY (id, country)
33 | ) PARTITION BY LIST (country);
34 |
35 | -- Creative content data, separated from ad_data to allow for multiple creatives per ad
36 | CREATE TABLE ad_creative_content(
37 | id BIGINT,
38 | country VARCHAR(2),
39 | currency VARCHAR(10),
40 | content_order INT,
41 | body TEXT,
42 | caption TEXT,
43 | descript TEXT,
44 | title TEXT,
45 | ad_delivery_start_time TIMESTAMP NULL,
46 | ad_delivery_stop_time TIMESTAMP NULL,
47 | latest_collected TIMESTAMP NULL,
48 | platforms_facebook BOOLEAN,
49 | platforms_instagram BOOLEAN,
50 | platforms_other BOOLEAN,
51 | platforms TEXT[],
52 | page_id BIGINT,
53 | page_name VARCHAR(1000),
54 | bylines_name VARCHAR(1000),
55 | ad_snapshot_url VARCHAR(1100),
56 | PRIMARY KEY (id,country, content_order)
57 | ) PARTITION BY LIST (country);
58 |
59 | -- Region data, filter this table to find ads targeted at specific regions
60 | CREATE TABLE ad_region (
61 | id BIGINT,
62 | country VARCHAR(2),
63 | currency VARCHAR(10),
64 | region VARCHAR(100),
65 | region_percent DECIMAL(7, 6),
66 | region_impressions_lower_bound DECIMAL(16, 6),
67 | region_impressions_upper_bound DECIMAL(16, 6),
68 | region_spend_lower_bound DECIMAL(16, 6),
69 | region_spend_upper_bound DECIMAL(16, 6),
70 | ad_delivery_start_time TIMESTAMP NULL,
71 | ad_delivery_stop_time TIMESTAMP NULL,
72 | latest_collected TIMESTAMP NULL,
73 | platforms_facebook BOOLEAN,
74 | platforms_instagram BOOLEAN,
75 | platforms_other BOOLEAN,
76 | platforms TEXT[],
77 | page_id BIGINT,
78 | page_name VARCHAR(1000),
79 | bylines_name VARCHAR(1000),
80 | PRIMARY KEY (id,country, region)
81 | ) PARTITION BY LIST (country);
82 |
83 | -- Demographic data, filter this table to find ads targeted at specific demographics
84 | CREATE TABLE ad_demographic (
85 | id BIGINT,
86 | country VARCHAR(2),
87 | currency VARCHAR(10),
88 | gender VARCHAR(20),
89 | age_range VARCHAR(50),
90 | age_percent DECIMAL(7, 6),
91 | age_impressions_lower_bound DECIMAL(16, 6),
92 | age_impressions_upper_bound DECIMAL(16, 6),
93 | age_spend_lower_bound DECIMAL(16, 6),
94 | age_spend_upper_bound DECIMAL(16, 6),
95 | ad_delivery_start_time TIMESTAMP NULL,
96 | ad_delivery_stop_time TIMESTAMP NULL,
97 | latest_collected TIMESTAMP NULL,
98 | platforms_facebook BOOLEAN,
99 | platforms_instagram BOOLEAN,
100 | platforms_other BOOLEAN,
101 | platforms TEXT[],
102 | page_id BIGINT,
103 | page_name VARCHAR(1000),
104 | bylines_name VARCHAR(1000),
105 | PRIMARY KEY (id, country, gender, age_range)
106 | ) PARTITION BY LIST (country);
--------------------------------------------------------------------------------
/webapp/views/status.ejs:
--------------------------------------------------------------------------------
1 |
31 |
32 |
87 |
88 |
--------------------------------------------------------------------------------
/webapp/public/maps/origins.txt:
--------------------------------------------------------------------------------
1 | This file describes where the original GeoJSON/TopoJSON came from for each country, including licences
2 | Some maps were modifying using https://mapshaper.org/
3 |
4 |
5 | The following maps are public domain under Copyright (c) 2024 Highsoft AS, Based on data from Natural Earth
6 | copyright url: http://www.naturalearthdata.com
7 | DE: https://code.highcharts.com/mapdata/countries/de/de-all.topo.json
8 | BR: https://code.highcharts.com/mapdata/countries/br/br-all.topo.json
9 | AU: https://code.highcharts.com/mapdata/countries/au/au-all.topo.json
10 | AT: https://code.highcharts.com/mapdata/countries/at/at-all.topo.json
11 | BE: https://code.highcharts.com/mapdata/countries/be/be-all.topo.json
12 | CD: https://code.highcharts.com/mapdata/countries/cd/cd-all.topo.json
13 | GB: https://code.highcharts.com/mapdata/countries/gb/custom/gb-countries.topo.json
14 | DK: https://code.highcharts.com/mapdata/countries/dk/dk-all.topo.json
15 | IN: https://code.highcharts.com/mapdata/countries/in/custom/in-all-andaman-and-nicobar.topo.json
16 | ID: https://code.highcharts.com/mapdata/countries/id/id-all.topo.json
17 | CA: https://code.highcharts.com/mapdata/countries/ca/ca-all.topo.json
18 | PL: https://code.highcharts.com/mapdata/countries/pl/pl-all.topo.json
19 | CZ: https://code.highcharts.com/mapdata/countries/cz/cz-all.topo.json
20 | FI: https://code.highcharts.com/mapdata/countries/fi/fi-all.topo.json
21 | GE: https://code.highcharts.com/mapdata/countries/ge/ge-all.topo.json
22 | EG: https://code.highcharts.com/mapdata/countries/eg/eg-all.topo.json
23 | GR: https://code.highcharts.com/mapdata/countries/gr/gr-all.topo.json
24 | HR: https://code.highcharts.com/mapdata/countries/hr/hr-all.topo.json
25 | LT: https://code.highcharts.com/mapdata/countries/lt/lt-all.topo.json
26 | LU: https://code.highcharts.com/mapdata/countries/lu/lu-all.topo.json
27 | LV: https://code.highcharts.com/mapdata/countries/lv/lv-all.topo.json # Modified to use the post 2021 planning regions (https://en.wikipedia.org/wiki/Planning_regions_of_Latvia_(from_2021))
28 | NG: https://code.highcharts.com/mapdata/countries/ng/ng-all.topo.json
29 | NL: https://code.highcharts.com/mapdata/countries/nl/nl-all.topo.json
30 | PT: https://code.highcharts.com/mapdata/countries/pt/pt-all.topo.json
31 | RO: https://code.highcharts.com/mapdata/countries/ro/ro-all.topo.json
32 | SE: https://code.highcharts.com/mapdata/countries/se/se-all.topo.json
33 | SK: https://code.highcharts.com/mapdata/countries/sk/sk-all.topo.json
34 | ZA: https://code.highcharts.com/mapdata/countries/za/za-all.topo.json
35 | BG: https://code.highcharts.com/mapdata/countries/bg/bg-all.topo.json
36 |
37 | -----
38 |
39 | Original Repo where map of Spain was obtained from: https://github.com/martgnz/es-atlas
40 | License under: https://creativecommons.org/licenses/by/4.0/
41 | ES: https://unpkg.com/es-atlas@0.5.0/es/autonomous_regions.json
42 |
43 | -----
44 |
45 | # Original Repo where map of Italy was obtained from: https://github.com/openpolis/geojson-italy
46 | # Licensed under: https://creativecommons.org/licenses/by/4.0/
47 | IT: https://github.com/openpolis/geojson-italy/blob/master/topojson/limits_IT_regions.topo.json
48 |
49 | -----
50 |
51 | # Sourced from this repo: https://github.com/stefanb/gurs-rpe
52 | # Licensed under: https://creativecommons.org/licenses/by/4.0/
53 | SI: https://github.com/cufarvid/slovenia-topo/blob/main/data/regions.json
54 |
55 | -----
56 |
57 | The following Map(s) data © OpenStreetMap contributors, licensed under the Open Database License (ODbL): https://www.openstreetmap.org/copyright
58 | EE: https://code.highcharts.com/mapdata/countries/ee/ee-all.topo.json
59 |
60 | ----
61 |
62 | # Miscellaneous sources
63 | IE: https://gist.githubusercontent.com/carsonfarmer/9791524/raw/b27ca0d78d46a84664fe7ef709eed4f7621f7a25/irish-counties.topojson
64 | HU: https://github.com/wuerdo/geoHungary/blob/master/counties.geojson
65 | PH: https://github.com/macoymejia/geojsonph/blob/master/Regions/Regions.50m.json
66 | CY: https://github.com/dtrihinas/cyprus-geojson/blob/master/cyprus.geojson # Modified with mapshaper (https://mapshaper.org/) adding FID's
67 | US: https://d3js.org/us-10m.v1.json
68 |
--------------------------------------------------------------------------------
/webapp/public/maps/cy.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","arcs":[[[1531,430],[-83,-75],[-98,16],[-159,-99],[-8,-16],[-9,4],[-13,-25],[-10,-32],[-47,-2],[-29,-6],[-20,-25],[-6,44],[-11,24],[9,18],[28,-7],[5,-21],[28,5],[-4,20],[2,40],[-42,10],[-21,-5],[-15,-28],[-13,-15],[-6,17],[-21,3],[-20,-20],[-61,55],[-4,46],[-52,-1],[-8,-21],[-15,-5],[-28,-38],[-51,8],[-6,-75],[-18,-10],[-36,5],[-6,-18],[-21,-3],[-78,37],[82,223],[19,41],[-31,40],[70,139],[15,109],[-14,109],[36,43],[61,-40],[91,-15],[124,62],[47,19],[35,-29],[21,-58],[51,-33],[15,-98],[31,26],[32,9],[42,-3],[4,-79],[33,0],[32,-5],[110,-96],[20,-22],[8,-93],[14,-62],[-82,-67],[45,-4],[42,8],[7,23],[-13,48]],[[724,897],[16,-107],[-18,-111],[-69,-140],[32,-37],[-104,-264],[-65,24],[-22,32],[-23,7],[-25,23],[-44,9],[-38,24],[-27,-12],[-51,67],[-35,7],[-27,51],[-22,-17],[-12,18],[13,19],[-18,66],[-12,82],[-9,42],[-42,23],[-63,113],[21,32],[-34,76],[-3,36],[19,9],[-58,174],[-4,129],[20,31],[190,-151],[159,195],[61,125],[38,-15],[15,-257],[138,-113],[-8,-119],[111,-71]],[[1766,973],[79,-23],[66,40],[-4,69],[27,5],[-21,128],[31,30],[29,-3],[19,-17],[30,-52],[72,4],[101,-25],[-3,-34],[28,-37],[-16,-21],[1,-36],[-36,-8],[-47,-44],[-10,-64],[-8,-69],[-6,-56],[6,-27],[-39,-56],[-19,-62],[-68,10],[-20,-6],[-17,-33],[-55,-42],[-4,-20],[-70,-14],[-43,-22],[-11,-29],[-19,-2],[-49,-41],[-44,-2],[-28,-35],[-51,16],[-21,-10],[-28,103],[-9,90],[-130,120],[-65,4],[-2,78],[47,51],[58,32],[73,-14],[39,-8],[37,5],[108,74],[40,40],[52,13]],[[1766,973],[-54,-14],[-39,-39],[-106,-73],[-37,-7],[-113,24],[-60,-33],[-50,-51],[-41,2],[-31,-6],[-30,-29],[-15,100],[-50,31],[-20,60],[-36,27],[-173,-81],[-93,15],[-57,41],[-37,-43],[-112,70],[7,123],[-137,112],[-14,258],[18,23],[36,3],[18,27],[13,-7],[33,22],[36,-23],[48,-14],[49,-5],[65,-50],[65,-48],[72,48],[36,27],[62,218],[79,-16],[80,8],[32,-27],[70,42],[96,7],[71,-36],[83,-5],[71,-36],[149,15],[9,56],[6,48],[47,1],[149,-12],[23,-61],[5,-114],[-3,-101],[45,-54],[-6,-78],[-50,-96],[-35,2],[-30,-32],[23,-128],[-26,-4],[4,-71],[-66,-37],[-79,21]],[[1962,1727],[-197,10],[-13,-102],[-150,-13],[-72,32],[-83,5],[-71,36],[-96,-7],[-70,-42],[-32,27],[-80,-8],[-79,16],[-26,336],[241,-128],[49,45],[95,-45],[44,19],[74,-38],[30,27],[160,-38],[254,19],[124,20],[31,12],[18,-3],[-4,-76],[-63,-27],[-84,-77]],[[2515,965],[-55,37],[-36,-24],[-21,35],[36,11],[10,42],[-42,0],[0,43],[-59,59],[36,38],[57,-11],[23,29],[32,0],[40,49],[-48,90],[-22,-15],[-6,-75],[-32,-49],[-50,14],[-43,-54],[-46,-18],[-30,18],[-36,-35],[-23,19],[8,64],[-40,-24],[-4,-53],[32,-30],[-174,22],[-38,77],[45,97],[6,74],[-46,53],[2,203],[-30,80],[85,72],[65,24],[4,78],[184,152],[104,-24],[443,216],[65,149],[85,-16],[169,103],[23,62],[76,21],[62,53],[29,-32],[95,80],[123,53],[-30,-136],[-222,-114],[-27,-82],[-36,-43],[-148,-146],[-190,-110],[-112,-141],[-34,-117],[-87,-19],[-77,11],[-97,-155],[8,-211],[70,-111],[45,-97],[62,-67],[82,-160],[24,-73],[-11,-13],[-202,78],[-76,-51]],[[743,223],[8,78],[51,-5],[50,51],[50,-3],[59,-88],[47,13],[46,22],[51,-11],[0,-27],[-21,-21],[-38,26],[2,-105],[108,52],[-40,-103],[63,-80],[-8,-22],[-93,35],[-74,-5],[-5,115],[-76,130],[-52,-14],[-128,-38]],[[2515,965],[-76,-57],[-76,91],[-102,3],[-55,-5],[24,67],[-36,40],[6,40],[-42,14],[50,72],[22,-83],[72,8],[99,77],[51,11],[12,113],[28,7],[42,-90],[-19,-35],[-72,-24],[-27,-24],[-32,18],[-34,-45],[61,-97],[49,-2],[-13,-51],[-48,-5],[27,-49],[43,49],[46,-43]]],"transform":{"scale":[0.0006492672398949149,0.00042003491611421266],"translate":[32.27336883544922,34.557466483188996]},"objects":{"default":{"type":"GeometryCollection","geometries":[{"arcs":[[0]],"type":"Polygon","properties":{"district":"Limassol","population":"239842","area":"1393.3","name":"Limassol District"},"id":"CY.LI"},{"arcs":[[1]],"type":"Polygon","properties":{"district":"Paphos","population":"90295","area":"1389.8","name":"Paphos District"},"id":"CY.PA"},{"arcs":[[2]],"type":"Polygon","properties":{"district":"Larnaca","population":"145365","area":"1120.1","name":"Larnaca District"},"id":"CY.LA"},{"arcs":[[3]],"type":"Polygon","properties":{"district":"Nicosia","population":"334120","area":"2710.0","name":"Nicosia District"},"id":"CY.NI"},{"arcs":[[4]],"type":"Polygon","properties":{"district":"Kerynia","area":643.9,"population":"NA","name":"Kyrenia District"},"id":"CY.KY"},{"arcs":[[5]],"type":"Polygon","properties":{"district":"Famagusta","population":"47338","area":"1985.3","name":"Famagusta District"},"id":"CY.FA"},{"arcs":[[6]],"type":"Polygon","properties":{"district":"British Overseas Territory (Akrotiri)","population":"NA","area":"NA","name":null},"id":"BOT"},{"arcs":[[7]],"type":"Polygon","properties":{"district":"British Overseas Territory (Dhekelia)","population":"NA","area":"NA","name":null},"id":"BOT"}]}}}
--------------------------------------------------------------------------------
/webapp/public/maps/lu.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2]],"id":"LU.DI","properties":{"hc-group":"admin1","hc-key":"lu-di","hc-a2":"DI","labelrank":"9","hasc":"LU.DI","alt-name":"Dikrech|Dikkrich","woe-id":"20070542","subregion":null,"fips":"LU01","postal-code":"DI","name":"Diekirch","country":"Luxembourg","type-en":"District","region":null,"longitude":"6.00481","woe-name":"Diekirch","latitude":"49.9763","woe-label":"Diekirch, LU, Luxembourg","type":"District","hc-middle-lon":5.964,"hc-middle-lat":49.917}},{"type":"Polygon","arcs":[[-2,3,4]],"id":"LU.GR","properties":{"hc-group":"admin1","hc-key":"lu-gr","hc-a2":"GR","labelrank":"9","hasc":"LU.GR","alt-name":"Gréivemaacher","woe-id":"20070559","subregion":null,"fips":"LU02","postal-code":"GR","name":"Grevenmacher","country":"Luxembourg","type-en":"District","region":null,"longitude":"6.33835","woe-name":"Grevenmacher","latitude":"49.6474","woe-label":"Grevenmacher, LU, Luxembourg","type":"District","hc-middle-lon":6.335,"hc-middle-lat":49.691}},{"type":"Polygon","arcs":[[-5,5,-3]],"id":"LU.LU","properties":{"hc-group":"admin1","hc-key":"lu-lu","hc-a2":"LU","labelrank":"9","hasc":"LU.LU","alt-name":"Lëtzebuerg|Luxemburg","woe-id":"20070560","subregion":null,"fips":"LU03","postal-code":"LU","name":"Luxembourg","country":"Luxembourg","type-en":"District","region":null,"longitude":"6.05114","woe-name":"Luxembourg","latitude":"49.6376","woe-label":"Luxemburg, LU, Luxembourg","type":"District","hc-middle-lon":6.051,"hc-middle-lat":49.624}}],"hc-recommended-transform":{"default":{"crs":"+proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-189.681,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +units=m +no_defs","scale":0.00857903610807,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":47427.7193684,"yoffset":137895.737378}}}},"arcs":[[[1796,3605],[-78,112],[-163,-15],[-325,76],[-81,46],[-23,222],[-19,63],[-300,412],[-84,86],[-161,70],[-137,16],[-129,44],[-134,155],[-77,171],[-18,162],[57,130],[151,71],[-123,79],[65,121],[-2,80],[334,-25],[-118,124],[-282,149],[-149,50],[51,130],[439,528],[129,228],[100,91],[89,42],[188,30],[106,69],[138,186],[-51,76],[-90,76],[15,188],[79,73],[257,78],[93,68],[31,108],[-15,286],[77,84],[185,111],[77,78],[31,93],[25,221],[47,87],[210,132],[472,160],[189,136],[102,195],[51,188],[108,126],[271,19],[195,108],[82,-62],[42,-129],[77,-101],[168,-56],[143,-14],[289,31],[110,48],[81,60],[99,10],[163,-110],[57,-125],[-15,-129],[28,-108],[190,-58],[-88,-197],[-62,-187],[-80,-384],[127,-8],[-47,-44],[-118,-159],[137,-55],[83,-112],[79,-284],[-35,-152],[55,-111],[219,-231],[193,-382],[101,-120],[137,188],[217,-244],[418,-698],[198,-139],[430,-133],[186,-83],[111,-170]],[[7374,5551],[-235,-21],[-94,-28],[-73,-54],[-75,-112],[-24,-65],[28,-57],[109,-52],[-13,-107],[-248,-295]],[[6749,4760],[-403,127],[-263,171],[-117,95],[-349,61],[-124,-4],[-426,-82],[-119,21],[-114,38],[-184,84],[-148,22],[-122,-1],[-212,-70],[-118,-100],[-59,-147],[-133,-122],[-63,-97],[-157,-124],[-27,-79],[-7,-192],[-46,-149],[-17,-149],[3,-144],[-439,-99],[-319,-109],[-193,-37],[-548,-12],[-249,-57]],[[7374,5551],[90,-186],[102,-7],[190,81],[112,-2],[215,-94],[365,-243],[216,-95],[221,-42],[609,0],[391,-80],[51,-2],[63,-49],[-27,-19],[-2,-114],[-18,-10],[-61,-296],[0,-97],[34,-60],[-6,-53],[-123,-76],[-9,-121],[28,-112],[61,-98],[91,-84],[-110,30],[-60,-20],[-43,-66],[112,-100],[-934,-421],[-197,-192],[23,-45],[158,-92],[13,-90],[-35,-62],[-95,-98],[-130,-184],[-330,-285],[-192,-210],[-72,-150],[0,-431],[-107,-572],[39,-412],[0,-101],[-255,19],[-336,130],[-606,316]],[[6810,656],[-51,227],[-156,462],[-12,185],[88,115],[409,277],[96,35],[230,36],[32,83],[-21,65],[-134,96],[-49,50],[77,92],[266,155],[-217,283],[-120,358],[-92,81],[-172,83],[-174,33],[-971,17],[578,639],[103,69],[162,70],[88,-11],[190,6],[148,318],[-25,41],[-133,82],[-201,157]],[[6810,656],[-370,108],[-362,27],[-729,-56],[82,-125],[-357,-23],[-91,-25],[-67,-84],[1,-87],[-29,-74],[-154,-40],[-123,-131],[-186,-49],[-1082,-46],[-222,-51],[-174,390],[-239,169],[-806,134],[-318,105],[-223,145],[-398,371],[301,101],[292,218],[120,212],[-214,82],[142,95],[101,136],[163,315],[101,82],[125,83],[72,118],[-71,193],[-91,54],[-256,21],[-86,46],[-44,100],[56,92],[25,164],[110,105],[-13,74]]],"bbox":[5.7149271464777085,49.44132435891241,6.5022249483184815,50.17497463070069],"transform":{"scale":[0.00007873765394947225,0.00007337236441526932],"translate":[5.7149271464777085,49.44132435891241]},"title":"Luxembourg","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/js/jquery.slicknav.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | SlickNav Responsive Mobile Menu
3 | (c) 2014 Josh Cope
4 | licensed under MIT
5 | */
6 | (function(e,t,n){function o(t,n){this.element=t;this.settings=e.extend({},r,n);this._defaults=r;this._name=i;this.init()}var r={label:"MENU",duplicate:true,duration:200,easingOpen:"swing",easingClose:"swing",closedSymbol:"►",openedSymbol:"▼",prependTo:"body",parentTag:"a",closeOnClick:false,allowParentLinks:false,init:function(){},open:function(){},close:function(){}},i="slicknav",s="slicknav";o.prototype.init=function(){var n=this;var r=e(this.element);var i=this.settings;if(i.duplicate){n.mobileNav=r.clone();n.mobileNav.removeAttr("id");n.mobileNav.find("*").each(function(t,n){e(n).removeAttr("id")})}else n.mobileNav=r;var o=s+"_icon";if(i.label==""){o+=" "+s+"_no-text"}if(i.parentTag=="a"){i.parentTag='a href="#"'}n.mobileNav.attr("class",s+"_nav");var u=e('');n.btn=e("<"+i.parentTag+' aria-haspopup="true" tabindex="0" class="'+s+"_btn "+s+'_collapsed">');e(u).append(n.btn);e(i.prependTo).prepend(u);u.append(n.mobileNav);var a=n.mobileNav.find("li");e(a).each(function(){var t=e(this);data={};data.children=t.children("ul").attr("role","menu");t.data("menu",data);if(data.children.length>0){var r=t.contents();var o=[];e(r).each(function(){if(!e(this).is("ul")){o.push(this)}else{return false}});var u=e(o).wrapAll("<"+i.parentTag+' role="menuitem" aria-haspopup="true" tabindex="-1" class="'+s+'_item"/>').parent();t.addClass(s+"_collapsed");t.addClass(s+"_parent");e(o).last().after(''+i.closedSymbol+"")}else if(t.children().length==0){t.addClass(s+"_txtnode")}t.children("a").attr("role","menuitem").click(function(){if(i.closeOnClick)e(n.btn).click()})});e(a).each(function(){var t=e(this).data("menu");n._visibilityToggle(t.children,false,null,true)});n._visibilityToggle(n.mobileNav,false,"init",true);n.mobileNav.attr("role","menu");e(t).mousedown(function(){n._outlines(false)});e(t).keyup(function(){n._outlines(true)});e(n.btn).click(function(e){e.preventDefault();n._menuToggle()});n.mobileNav.on("click","."+s+"_item",function(t){t.preventDefault();n._itemClick(e(this))});e(n.btn).keydown(function(e){var t=e||event;if(t.keyCode==13){e.preventDefault();n._menuToggle()}});n.mobileNav.on("keydown","."+s+"_item",function(t){var r=t||event;if(r.keyCode==13){t.preventDefault();n._itemClick(e(t.target))}});if(i.allowParentLinks){e("."+s+"_item a").click(function(e){e.stopImmediatePropagation()})}};o.prototype._menuToggle=function(e){var t=this;var n=t.btn;var r=t.mobileNav;if(n.hasClass(s+"_collapsed")){n.removeClass(s+"_collapsed");n.addClass(s+"_open")}else{n.removeClass(s+"_open");n.addClass(s+"_collapsed")}n.addClass(s+"_animating");t._visibilityToggle(r,true,n)};o.prototype._itemClick=function(e){var t=this;var n=t.settings;var r=e.data("menu");if(!r){r={};r.arrow=e.children("."+s+"_arrow");r.ul=e.next("ul");r.parent=e.parent();e.data("menu",r)}if(r.parent.hasClass(s+"_collapsed")){r.arrow.html(n.openedSymbol);r.parent.removeClass(s+"_collapsed");r.parent.addClass(s+"_open");r.parent.addClass(s+"_animating");t._visibilityToggle(r.ul,true,e)}else{r.arrow.html(n.closedSymbol);r.parent.addClass(s+"_collapsed");r.parent.removeClass(s+"_open");r.parent.addClass(s+"_animating");t._visibilityToggle(r.ul,true,e)}};o.prototype._visibilityToggle=function(t,n,r,i){var o=this;var u=o.settings;var a=o._getActionItems(t);var f=0;if(n)f=u.duration;if(t.hasClass(s+"_hidden")){t.removeClass(s+"_hidden");t.slideDown(f,u.easingOpen,function(){e(r).removeClass(s+"_animating");e(r).parent().removeClass(s+"_animating");if(!i){u.open(r)}});t.attr("aria-hidden","false");a.attr("tabindex","0");o._setVisAttr(t,false)}else{t.addClass(s+"_hidden");t.slideUp(f,this.settings.easingClose,function(){t.attr("aria-hidden","true");a.attr("tabindex","-1");o._setVisAttr(t,true);t.hide();e(r).removeClass(s+"_animating");e(r).parent().removeClass(s+"_animating");if(!i)u.close(r);else if(r=="init")u.init()})}};o.prototype._setVisAttr=function(t,n){var r=this;var i=t.children("li").children("ul").not("."+s+"_hidden");if(!n){i.each(function(){var t=e(this);t.attr("aria-hidden","false");var i=r._getActionItems(t);i.attr("tabindex","0");r._setVisAttr(t,n)})}else{i.each(function(){var t=e(this);t.attr("aria-hidden","true");var i=r._getActionItems(t);i.attr("tabindex","-1");r._setVisAttr(t,n)})}};o.prototype._getActionItems=function(e){var t=e.data("menu");if(!t){t={};var n=e.children("li");var r=n.children("a");t.links=r.add(n.children("."+s+"_item"));e.data("menu",t)}return t.links};o.prototype._outlines=function(t){if(!t){e("."+s+"_item, ."+s+"_btn").css("outline","none")}else{e("."+s+"_item, ."+s+"_btn").css("outline","")}};o.prototype.toggle=function(){$this._menuToggle()};o.prototype.open=function(){$this=this;if($this.btn.hasClass(s+"_collapsed")){$this._menuToggle()}};o.prototype.close=function(){$this=this;if($this.btn.hasClass(s+"_open")){$this._menuToggle()}};e.fn[i]=function(t){var n=arguments;if(t===undefined||typeof t==="object"){return this.each(function(){if(!e.data(this,"plugin_"+i)){e.data(this,"plugin_"+i,new o(this,t))}})}else if(typeof t==="string"&&t[0]!=="_"&&t!=="init"){var r;this.each(function(){var s=e.data(this,"plugin_"+i);if(s instanceof o&&typeof s[t]==="function"){r=s[t].apply(s,Array.prototype.slice.call(n,1))}});return r!==undefined?r:this}}})(jQuery,document,window)
--------------------------------------------------------------------------------
/webapp/public/maps/lv.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","arcs":[[[5121,2184],[-9,-51],[-116,-26],[-273,-79],[-94,-1],[17,54],[33,20],[-45,29],[-5,26],[-35,4],[-37,45],[-13,93],[55,36],[-41,70],[-57,0],[-43,16]],[[4458,2420],[5,89],[14,58],[-30,92],[-46,35],[-40,12],[6,64],[-11,51],[22,-2],[53,-37],[14,17],[-5,43],[17,9],[68,-32],[149,21],[28,3],[115,86],[42,-19],[62,-8],[36,28],[45,14],[102,-15],[134,39],[-6,67],[12,22],[25,21],[2,36],[-45,87],[46,37],[-72,98],[-158,34],[-17,122],[-48,71],[-43,24],[29,40],[11,24],[4,74],[-59,72],[19,42],[-28,22],[-63,135],[-101,2],[-4,33],[-74,-49],[17,-93],[-23,-48],[-59,-19],[14,-45],[47,-32],[35,-139],[-40,-9],[-27,-30],[-56,-15],[5,-62],[48,7],[21,-23],[-11,-103],[-121,30],[-20,-33],[-56,-41],[-53,176],[-90,-10],[-28,10],[-29,3],[-24,38]],[[4218,3544],[61,70],[27,64],[11,92],[-5,117],[-13,119],[-17,161],[-7,136],[-21,51],[20,146],[-21,166],[-56,92],[-18,43],[-13,150],[-1,84],[23,54],[55,-22],[64,17],[35,78],[65,45],[67,59],[61,3],[52,-5],[76,8],[19,16],[42,87],[73,-30],[45,6],[57,43],[96,14],[33,22],[93,94],[56,25],[59,2],[33,-22],[44,-155],[38,-14],[41,20],[24,32],[-8,37],[-36,62],[18,56],[45,-22],[42,-78],[29,7],[51,-27],[29,-35],[47,-56],[50,-31],[44,-10],[22,-25],[11,-48],[27,-35],[57,-21],[52,10],[80,20],[19,-33],[27,-93],[32,-30],[264,-22],[28,-42],[-15,-48],[15,-76],[138,-115],[42,-48],[119,-192],[43,-50],[68,-44],[99,-43],[87,-106],[54,28],[46,-23],[32,52],[78,56],[42,14],[98,-5],[22,6],[25,23],[28,66],[43,40],[29,-27],[64,0],[73,-38],[71,-100],[30,-14],[101,-7],[194,-70],[41,26],[221,2],[-4,-139],[-18,-87],[32,-35],[131,-61],[67,-76]],[[8442,3905],[-7,-54],[-20,-29],[-91,-52],[-57,-90],[-45,1],[-40,34],[-33,0],[-69,-25],[-65,50],[-36,-17],[-63,-71],[-34,5],[-35,-34],[-80,-18],[-33,-62],[-154,-197],[-36,-44],[-33,-71],[-29,-35],[-87,-73],[14,-35],[-15,-46],[54,-12],[18,-19],[-7,-70],[53,-43],[39,-98],[-4,-29],[-36,-44],[-12,-15],[-20,-21],[-25,-30],[-156,-256],[-13,-61],[20,-171],[-49,-26],[-26,-41],[18,-44],[-27,-37],[-20,7],[-98,-6]],[[7103,2026],[-40,8],[-16,38],[13,74],[-89,11],[-47,14],[-105,64],[-33,5],[-42,-74],[-63,-40],[-13,56],[-25,13],[-46,-16],[-34,40],[-9,36],[-75,26],[-91,-56],[-45,-1],[-26,24],[-23,60],[-65,-64],[-20,72],[24,29],[-36,36],[-90,36],[-10,85],[30,49],[-10,43],[-97,90],[-24,-5],[1,-58],[-21,-43],[-48,-27],[-30,43],[-80,31],[-54,0],[-70,24],[-86,-87],[-58,-33],[-47,3],[3,-20],[-38,10],[-38,-8],[-48,-42],[44,-30],[-18,-62],[-75,26],[-23,-23],[-30,13],[-34,26],[-65,52],[-86,-23],[33,-60],[-48,-45],[-2,-95],[12,-37],[-7,-39],[38,9]],[[8442,3905],[16,-19],[129,-79],[38,-54],[7,-53],[-5,-131],[-22,-120],[-38,-36],[-117,-56],[-24,-36],[18,-42],[62,-40],[1,-85],[-29,-75],[-10,-96],[-83,-181],[-26,-81],[20,-5],[21,-6],[104,59],[53,15],[56,-16],[105,-102],[6,-33],[-67,-147],[21,-39],[124,-89],[13,-39],[7,-154],[39,-62],[101,-50],[29,-44],[-41,-53],[-7,-27],[14,-43],[65,-84],[14,-45],[-5,-79],[14,-101],[50,-157],[1,-59],[-28,-58],[-30,-159],[-26,-45],[-47,33],[-75,-37],[-88,-53],[-53,-11],[-34,-29],[-39,-85],[-86,-67],[-39,-43],[-5,-55],[-21,-39],[-20,-37],[-125,-85],[-34,-102],[-10,-110],[-21,-85],[-36,-4],[-158,15],[-80,36],[-31,39],[-85,-92],[-24,-10],[-36,19],[-77,69],[-79,25],[-164,-23],[-27,-17],[-73,-93],[-72,-138],[-25,-30],[-100,-54],[-30,-2],[-100,32],[-31,-18],[-26,-48],[-72,6],[-71,20],[-174,88],[-79,62],[-65,124],[-29,71],[-32,50],[-125,113],[-78,91],[-184,126],[-94,111]],[[6058,862],[52,42],[29,55],[-28,52],[-8,42],[106,-98],[32,-43],[16,3],[67,57],[23,-18],[41,-28],[63,78],[26,-7],[29,25],[-16,51],[83,74],[47,9],[87,-39],[5,-64],[36,-67],[-6,94],[-16,66],[-33,47],[-47,64],[-89,35],[-5,20],[11,114],[-17,16],[0,57],[-25,63],[-9,87],[-60,59],[-27,1],[82,53],[47,66],[11,35],[73,90],[66,9],[54,-96],[12,-54],[63,34],[57,54],[51,16],[52,-14],[71,-2],[-2,40],[41,86]],[[6058,862],[-38,43],[-72,52],[-25,40],[-33,98],[-16,7],[-74,-6],[-84,36],[-86,-16],[-133,23],[-301,54],[-45,34],[-37,70],[-22,74],[-54,70],[-27,67],[-32,140],[-33,97],[-23,39],[-26,9],[-17,-17],[-7,-51],[-18,-21],[-40,10],[-160,-72],[-49,-41],[-83,-115],[-43,-52],[-115,-63],[-42,13],[-79,60],[-41,16],[-38,-7],[-151,-82],[-74,1],[-43,24],[-117,96],[-139,45],[-58,7],[-86,-21],[-38,7],[-2,39],[-22,20],[-121,-2],[-41,-12],[-75,-46],[-45,4],[-131,57],[-112,42],[-145,-35],[-23,-15],[10,-24],[-63,-70],[-63,-15],[-57,45],[-76,181],[-40,24],[-44,-9],[-37,-26]],[[2372,1688],[-49,12],[-43,37],[-76,14],[27,72],[-8,46],[-51,41],[14,167],[55,-8],[53,14],[-24,45],[2,43],[46,3],[30,22],[23,63],[-39,64],[-29,14],[-6,41],[32,5],[98,32],[104,-3],[53,-36],[70,-10],[49,19],[61,-15],[55,44],[70,-2],[35,12],[32,78],[-13,38],[9,38],[67,43],[42,-19],[54,16],[43,38],[-30,158],[56,24]],[[3184,2838],[150,-12],[55,-34],[47,-52],[34,-70],[44,-51],[-12,-65],[-5,-64],[57,-34],[34,20],[106,17],[36,-39],[69,4],[2,-21],[12,-26],[-9,-34],[42,-16],[67,-15],[55,-32],[36,5],[31,52],[58,15],[34,5],[8,-25],[38,-35],[77,-32],[75,29],[84,71],[49,21]],[[2587,3994],[66,-38],[59,-18],[9,-64],[28,-56],[28,-95],[20,-124],[30,-39],[35,-214],[14,-36],[40,-22],[59,-71],[103,-42],[108,-22],[88,-113]],[[3274,3040],[-99,-47],[-33,-42],[5,-16],[19,-4],[18,-93]],[[2372,1688],[-47,-33],[-177,-75],[-41,6],[-56,60],[-36,20],[-80,19],[-373,-13],[-95,59],[-56,4],[-140,-67],[-22,-11],[-287,-139],[-66,-31],[-111,-5],[-46,-25],[-93,-73],[-83,-65],[-76,-10],[-39,-21],[-91,-90],[-32,-51],[-30,-138],[-19,-45],[-50,-14],[-74,0],[-48,-13],[-31,173],[-56,145],[-14,51],[-3,64],[15,72],[-14,136],[-1,91],[27,67],[17,64],[5,69],[-12,81],[30,0],[15,-85],[11,-27],[-18,-31],[18,-15],[0,-49],[-18,-30],[39,-48],[22,37],[-13,48],[3,105],[-10,56],[-6,23],[-6,17],[-63,44],[-14,43],[10,21],[13,95],[13,38],[32,95],[15,75],[8,197],[-15,127],[15,40],[104,70],[12,21],[83,51],[69,96],[63,57],[40,37],[28,44],[24,66],[15,83],[2,93],[-18,88],[17,77],[-2,151],[11,89],[35,73],[39,31],[39,104],[8,20],[89,119],[41,80],[98,189],[37,43],[53,29],[231,16],[55,16],[245,133],[363,196],[83,19],[46,21],[31,-11],[-13,-26],[-12,-87],[-4,-95],[16,-81],[70,-102],[279,-242],[90,-112],[56,-49],[46,-39]],[[3713,3097],[80,57],[55,87],[49,14],[48,32],[123,80],[35,60],[50,27],[0,25],[65,65]],[[3274,3040],[67,-26],[80,-8],[214,53],[78,38]]],"transform":{"scale":[0.0007964466106923517,0.0004325552605081823],"translate":[20.970816188208598,55.66710303471137]},"objects":{"default":{"type":"GeometryCollection","geometries":[{"arcs":[[0,1,2,3,4]],"type":"Polygon","id":"Vidzeme"},{"arcs":[[-4,5,6]],"type":"Polygon","id":"Latgale"},{"arcs":[[7,8,9,-1,-5,-7]],"type":"Polygon","id":"Semigallia"},{"arcs":[[10,11,-9,12]],"type":"Polygon","id":"Kurzeme"},{"arcs":[[13,-2,-10,-12,14]],"type":"Polygon","id":"Riga"}]}}}
--------------------------------------------------------------------------------
/webapp/public/css/daterangepicker.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Minified by jsDelivr using clean-css v4.2.1.
3 | * Original file: /npm/daterangepicker@3.1.0/daterangepicker.css
4 | *
5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
6 | */
7 | .daterangepicker{position:absolute;color:inherit;background-color:#fff;border-radius:4px;border:1px solid #ddd;width:278px;max-width:none;padding:0;margin-top:7px;top:100px;left:20px;z-index:3001;display:none;font-family:arial;font-size:15px;line-height:1em}.daterangepicker:after,.daterangepicker:before{position:absolute;display:inline-block;border-bottom-color:rgba(0,0,0,.2);content:''}.daterangepicker:before{top:-7px;border-right:7px solid transparent;border-left:7px solid transparent;border-bottom:7px solid #ccc}.daterangepicker:after{top:-6px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensleft:before{right:9px}.daterangepicker.opensleft:after{right:10px}.daterangepicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.daterangepicker.openscenter:after{left:0;right:0;width:0;margin-left:auto;margin-right:auto}.daterangepicker.opensright:before{left:9px}.daterangepicker.opensright:after{left:10px}.daterangepicker.drop-up{margin-top:-7px}.daterangepicker.drop-up:before{top:initial;bottom:-7px;border-bottom:initial;border-top:7px solid #ccc}.daterangepicker.drop-up:after{top:initial;bottom:-6px;border-bottom:initial;border-top:6px solid #fff}.daterangepicker.single .daterangepicker .ranges,.daterangepicker.single .drp-calendar{float:none}.daterangepicker.single .drp-selected{display:none}.daterangepicker.show-calendar .drp-calendar{display:block}.daterangepicker.show-calendar .drp-buttons{display:block}.daterangepicker.auto-apply .drp-buttons{display:none}.daterangepicker .drp-calendar{display:none;max-width:270px}.daterangepicker .drp-calendar.left{padding:8px 0 8px 8px}.daterangepicker .drp-calendar.right{padding:8px}.daterangepicker .drp-calendar.single .calendar-table{border:none}.daterangepicker .calendar-table .next span,.daterangepicker .calendar-table .prev span{color:#fff;border:solid #000;border-width:0 2px 2px 0;border-radius:0;display:inline-block;padding:3px}.daterangepicker .calendar-table .next span{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}.daterangepicker .calendar-table .prev span{transform:rotate(135deg);-webkit-transform:rotate(135deg)}.daterangepicker .calendar-table td,.daterangepicker .calendar-table th{white-space:nowrap;text-align:center;vertical-align:middle;min-width:32px;width:32px;height:24px;line-height:24px;font-size:12px;border-radius:4px;border:1px solid transparent;white-space:nowrap;cursor:pointer}.daterangepicker .calendar-table{border:1px solid #fff;border-radius:4px;background-color:#fff}.daterangepicker .calendar-table table{width:100%;margin:0;border-spacing:0;border-collapse:collapse}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background-color:#eee;border-color:transparent;color:inherit}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{background-color:#fff;border-color:transparent;color:#999}.daterangepicker td.in-range{background-color:#ebf4f8;border-color:transparent;color:#000;border-radius:0}.daterangepicker td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#357ebd;border-color:transparent;color:#fff}.daterangepicker th.month{width:auto}.daterangepicker option.disabled,.daterangepicker td.disabled{color:#999;cursor:not-allowed;text-decoration:line-through}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.secondselect{width:50px;margin:0 auto;background:#eee;border:1px solid #eee;padding:2px;outline:0;font-size:12px}.daterangepicker .calendar-time{text-align:center;margin:4px auto 0 auto;line-height:30px;position:relative}.daterangepicker .calendar-time select.disabled{color:#ccc;cursor:not-allowed}.daterangepicker .drp-buttons{clear:both;text-align:right;padding:8px;border-top:1px solid #ddd;display:none;line-height:12px;vertical-align:middle}.daterangepicker .drp-selected{display:inline-block;font-size:12px;padding-right:8px}.daterangepicker .drp-buttons .btn{margin-left:8px;font-size:12px;font-weight:700;padding:4px 8px}.daterangepicker.show-ranges.single.rtl .drp-calendar.left{border-right:1px solid #ddd}.daterangepicker.show-ranges.single.ltr .drp-calendar.left{border-left:1px solid #ddd}.daterangepicker.show-ranges.rtl .drp-calendar.right{border-right:1px solid #ddd}.daterangepicker.show-ranges.ltr .drp-calendar.left{border-left:1px solid #ddd}.daterangepicker .ranges{float:none;text-align:left;margin:0}.daterangepicker.show-calendar .ranges{margin-top:8px}.daterangepicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.daterangepicker .ranges li{font-size:12px;padding:8px 12px;cursor:pointer}.daterangepicker .ranges li:hover{background-color:#eee}.daterangepicker .ranges li.active{background-color:#08c;color:#fff}@media (min-width:564px){.daterangepicker{width:auto}.daterangepicker .ranges ul{width:140px}.daterangepicker.single .ranges ul{width:100%}.daterangepicker.single .drp-calendar.left{clear:none}.daterangepicker.single .drp-calendar,.daterangepicker.single .ranges{float:left}.daterangepicker{direction:ltr;text-align:left}.daterangepicker .drp-calendar.left{clear:left;margin-right:0}.daterangepicker .drp-calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.daterangepicker .drp-calendar.right{margin-left:0}.daterangepicker .drp-calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.daterangepicker .drp-calendar.left .calendar-table{padding-right:8px}.daterangepicker .drp-calendar,.daterangepicker .ranges{float:left}}@media (min-width:730px){.daterangepicker .ranges{width:auto}.daterangepicker .ranges{float:left}.daterangepicker.rtl .ranges{float:right}.daterangepicker .drp-calendar.left{clear:none!important}}
8 | /*# sourceMappingURL=/sm/977d76daee7276d0fb7eb98d2d7dcb01c5e058f63c51d94902d4394e65335f6e.map */
--------------------------------------------------------------------------------
/collector/fb_ads_library_cleanup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | # Copyright (c) Facebook, Inc. and its affiliates.
4 | # All rights reserved.
5 | #
6 | # This source code is licensed under the license found in the
7 | # LICENSE file in the root directory of the original source tree.
8 | # Found here: https://github.com/facebookresearch/Ad-Library-API-Script-Repository/tree/main
9 | #
10 | # Modified by the Social Media Lab to serve the Polidashboard application.
11 | # This file is to be used with recollect_inactive.py
12 |
13 | import json
14 | import re
15 | import sys
16 | from datetime import datetime
17 | from time import sleep
18 | import requests
19 |
20 | def get_ad_archive_id(data):
21 | """
22 | Extract ad_archive_id from ad_snapshot_url
23 | """
24 | return re.search(r"/\?id=([0-9]+)", data["ad_snapshot_url"]).group(1)
25 |
26 |
27 | class FbAdsLibraryTraversal:
28 | default_url_pattern = (
29 | "https://graph.facebook.com/{}/ads_archive?unmask_removed_content=true&ad_type=POLITICAL_AND_ISSUE_ADS&access_token={}&"
30 | + "fields={}&search_terms={}&ad_reached_countries={}&search_page_ids={}&"
31 | + "ad_active_status={}&limit={}&"
32 | + "ad_delivery_date_min={}&"
33 | + "ad_delivery_date_max={}" # Adding max date to be able to query ad range more accurately to reduce API calls
34 | )
35 | default_api_version = "v21.0"
36 |
37 | def __init__(
38 | self,
39 | access_token,
40 | fields,
41 | search_term,
42 | country,
43 | search_page_ids="",
44 | ad_active_status="INACTIVE", # In this case we only care to look at inactive ads, if the ad is active then the main collect.py should pick it up
45 | after_date="1970-01-01",
46 | max_date=datetime.now().strftime('%Y-%m-%d'),
47 | cutoff_after_date="2023-10-10",
48 | page_limit=100,
49 | api_version=None,
50 | retry_limit=3,
51 | ):
52 | self.page_count = 0
53 | self.access_token = access_token
54 | self.fields = fields
55 | self.search_term = search_term
56 | self.country = country
57 | self.after_date = after_date
58 | self.max_date = max_date
59 | self.cutoff_after_date = cutoff_after_date
60 | self.search_page_ids = search_page_ids
61 | self.ad_active_status = ad_active_status
62 | self.page_limit = page_limit
63 | self.retry_limit = retry_limit
64 | if api_version is None:
65 | self.api_version = self.default_api_version
66 | else:
67 | self.api_version = api_version
68 | print ("set to api v=",api_version)
69 |
70 | def generate_ad_archives(self):
71 | next_page_url = self.default_url_pattern.format(
72 | self.api_version,
73 | self.access_token,
74 | self.fields,
75 | self.search_term,
76 | self.country,
77 | self.search_page_ids,
78 | self.ad_active_status,
79 | self.page_limit,
80 | self.after_date,
81 | self.max_date
82 | )
83 | return self.__class__._get_ad_archives_from_url(
84 | next_page_url, cutoff_after_date = self.cutoff_after_date, country=self.country, retry_limit=self.retry_limit
85 | )
86 |
87 | @staticmethod
88 | def _get_ad_archives_from_url(
89 | next_page_url, cutoff_after_date="2023-10-10", country="unknown", retry_limit=3
90 | ):
91 | last_error_url = None
92 | last_retry_count = 0
93 | start_time_cutoff_after = datetime.strptime(cutoff_after_date, "%Y-%m-%d").timestamp()
94 | time_to_regain_access = 0
95 |
96 | while next_page_url is not None:
97 | # This is the amount of time it takes for API to stay at a stable rate
98 | print(f"sleeping inside of ad archive for: 130 seconds")
99 | sleep(130)
100 |
101 | response = requests.get(next_page_url)
102 | response_data = json.loads(response.text)
103 |
104 | try:
105 | response_headers = list(json.loads(response.headers['x-business-use-case-usage']).values())[0][0]
106 | except:
107 | pass
108 |
109 | try:
110 | response_headers = list(json.loads(response.headers['x-business-use-case-usage']).values())[0][0]
111 | time_to_regain_access = response_headers['estimated_time_to_regain_access']
112 | except Exception as ex:
113 | print(ex)
114 | response_headers = {}
115 |
116 | if "error" in response_data:
117 | estimated_time = '1'
118 | try:
119 | estimated_time = response_headers.get('estimated_time_to_regain_access', '30')
120 | except (json.JSONDecodeError, KeyError, IndexError):
121 | estimated_time = '30'
122 | if next_page_url == last_error_url:
123 | # failed again
124 | if last_retry_count >= retry_limit:
125 | raise Exception(
126 | "Error message: [{}], failed on URL: [{}], Estimated time to regain access: [{}]".format(
127 | json.dumps(response_data["error"]), next_page_url, estimated_time
128 | )
129 | )
130 | else:
131 | last_error_url = next_page_url
132 | last_retry_count = 0
133 | last_retry_count += 1
134 | continue
135 |
136 | # Removed any filtering because we have already modified the request URL to get exactly what we need
137 | filtered = list(
138 | filter(
139 | lambda ad_archive: ("ad_delivery_start_time" in ad_archive),
140 | response_data["data"],
141 | )
142 | )
143 |
144 | if len(filtered) == 0:
145 | print(" if no data after the after_date, break")
146 | next_page_url = None
147 | break
148 | yield filtered
149 |
150 | if "paging" in response_data:
151 | next_page_url = response_data["paging"]["next"]
152 | else:
153 | next_page_url = None
154 |
155 | # Added to kill script to prevent API call runaway, where the limit has already been reached, and the script still attempts to call the API
156 | # Which contributes to increasing the API limit even more, without this the script would need to be killed manually.
157 | try:
158 | if int(response_headers['total_time']) >= 100:
159 | sys.exit()
160 | except:
161 | pass
162 |
163 | @classmethod
164 | def generate_ad_archives_from_url(cls, failure_url, after_date="1970-01-01"):
165 | """
166 | if we failed from error, later we can just continue from the last failure url
167 | """
168 | return cls._get_ad_archives_from_url(failure_url, after_date=after_date)
169 |
--------------------------------------------------------------------------------
/webapp/public/maps/be.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "Topology",
3 | "arcs": [
4 | [[3680,4688],[31,-57],[-2,-31],[-30,-34],[77,-55],[30,-105],[-41,-5],[-15,-30],[63,-52],[-155,-92],[-41,-10],[-44,8],[-52,39],[-53,119],[-34,-20],[-74,43],[23,51],[50,9],[12,56],[-20,38],[37,78],[71,40],[84,-16],[49,55],[34,-29]],
5 | [[1242,4168],[-32,64],[-32,33],[-51,16],[-154,-51]],[[973,4230],[-18,121],[-31,22],[-112,-50],[37,-66],[-72,-32],[-8,-31],[-55,-11],[-29,27],[-65,-39],[48,-169]],
6 | [[668,4002],[-154,78],[-37,32],[-46,111],[-73,74],[-28,67],[-26,15],[-54,-4],[-58,15],[-28,60],[-32,24],[14,86],[-39,145],[11,31],[56,68],[-6,67],[-31,48],[-69,84],[-19,64],[-19,147],[-30,75],[39,31],[73,27],[264,216],[402,255],[391,275],[435,151],[17,-127],[-10,-159],[28,-84],[61,-63],[45,-22],[61,-8],[92,16],[4,111],[22,24],[136,28],[97,-6],[237,-84],[37,-26],[10,-114],[53,-49],[229,2],[44,16],[88,74],[242,130],[95,81],[76,113],[26,124],[38,-38],[29,-94],[91,-107],[10,-41],[-18,-47],[34,24],[28,64],[-65,30],[-23,43],[-4,106],[-43,65],[56,-2],[108,-55],[90,-6],[37,21],[10,56],[-12,33],[-58,86],[17,83],[-23,27],[101,65],[103,39],[82,6],[15,-27],[-2,-55],[-20,-75],[37,-28],[81,8],[93,-14],[45,26],[150,198],[65,35],[62,-17],[52,-52],[5,-49],[-20,-99],[14,-57],[-86,42],[-21,-4],[-11,-39],[41,-19],[136,-5],[111,-48],[42,13],[48,51],[75,118],[32,91],[29,9],[64,-49],[38,-78],[-7,-55],[-21,-53],[-7,-72],[12,-33],[67,-78],[39,-124],[35,-20],[109,3],[35,-47],[0,-118],[47,-6],[60,16],[230,-10],[40,16],[82,62],[39,20],[41,-6],[45,-31],[37,-49],[20,-140],[43,-41],[110,-36],[67,-59],[113,18],[57,-24],[67,-83],[91,14],[23,-59],[-27,-30],[-7,-36],[45,-52],[-38,-21],[-42,-1],[14,-48],[-40,-90],[-39,10],[-14,-77],[26,-38],[-30,-81],[-76,-132],[42,13],[38,-13],[-56,-118],[-34,-49],[-45,-19],[-140,-168],[5,-75],[30,-51],[33,-23]],[[6076,4361],[-94,-105],[-169,-53],[5,-55],[-53,-50],[-31,-8],[-38,44],[-16,-58],[-42,-5],[-53,22],[-24,66],[-26,13],[-89,-34],[-39,-37],[-9,-37],[-61,36],[-63,-41],[-15,37],[-13,-31],[-116,15],[22,-54],[-25,-33],[-129,42],[-51,-9],[-30,15],[-32,44],[2,59],[-48,31],[-72,63],[-96,-82],[-29,-5],[-25,22],[7,61],[-147,-17],[9,35],[-47,6],[-41,75],[-81,30],[-51,-20],[-18,-42],[-7,25],[-34,-21],[-101,28],[-9,-86],[36,-50],[-38,-49],[-65,-4],[-9,73],[-47,-54],[-85,-22],[-4,-41],[-61,38],[-1,56],[-72,-11],[-68,-59],[-94,-16],[-11,-49],[-37,3],[-37,54],[-14,-17],[21,-33],[-43,-1],[-5,-51],[-42,-28],[-53,20],[-38,-30],[-63,56],[-53,-1],[-42,64],[-37,-1],[-15,-35],[-46,1],[-16,-34],[-52,19],[-28,-56],[-13,23],[-46,-26],[-37,13],[-39,-35],[-116,4],[-42,17],[-38,76],[14,54],[-20,58],[-109,-27],[-26,29],[-77,-10],[-34,104],[-83,-38],[-21,44],[-55,-35],[-79,-165],[-54,41],[-129,2],[-12,105],[-78,-24],[-70,32],[-88,-71],[-87,-100],[-7,-25],[-31,7],[-48,38],[3,45],[-41,65],[-83,-13],[-79,49],[-111,-58]],[[6222,4198],[39,48],[19,-8],[59,-62],[169,4],[21,-7]],[[6529,4173],[38,-51],[-46,-75],[-17,-8],[-47,27],[-69,-11],[-82,118],[-50,-15],[-34,40]],[[6529,4173],[22,-8],[140,-4],[39,7],[-1,-24],[32,-19],[2,-94],[25,-3],[77,23],[32,-3],[37,-42],[119,-196],[-27,-18],[24,-48],[40,-22],[132,-4],[5,-20],[-35,-71],[-104,-82],[-36,-63],[32,-44],[-13,-39],[38,-10],[-16,-29],[33,-55],[34,-15],[75,29],[39,-22],[119,-24],[-26,-48],[16,-64],[38,-45],[-2,-55],[-27,-123],[3,-38],[66,-130],[5,-45],[-25,-28],[-50,-11],[-70,16],[-27,-17],[-32,-57],[5,-63],[-35,-36],[-124,-47],[-20,-32],[-62,-62],[25,-32],[9,-76],[-26,-41],[-55,-15],[-15,-65],[28,-38],[-24,-44],[-29,14],[-10,88],[-26,27],[-44,-28],[-74,0],[-17,9],[-31,70],[-30,-25],[-41,-5],[-17,-31],[-23,-94],[-29,-32],[-72,-39],[-32,-33],[-16,-97],[-52,-67],[3,-70],[-19,-42],[-52,-37],[-2,-46],[22,-38],[-21,-45],[-73,-56],[-20,-55],[-68,-130],[-7,-31],[65,-48],[18,-31],[-50,6],[-10,-49],[18,-19],[-31,-49],[14,-82],[21,-37],[40,-15],[37,-38],[46,-99],[7,-71],[62,-29],[24,4],[14,-45],[-28,-89],[19,-35],[54,-18],[10,-48],[-45,-69],[-41,-109],[-21,-24],[32,-20],[-18,-50],[-44,-54],[-46,-25],[-66,36],[-42,-9],[-48,-49],[-127,42],[-49,-28],[-34,-71],[-46,0],[-60,31],[-36,-17],[-100,-76],[-41,12],[-11,30],[7,95],[-7,31],[-94,188],[-36,36],[-94,41],[-25,-42],[-47,2],[-14,42],[7,47],[24,24],[-14,50],[-78,95],[-41,-1],[-87,-27],[-46,14],[-64,61],[-82,132],[-24,25],[-68,23],[-39,24],[-72,79],[-40,21],[-36,-2],[-83,-32],[-95,-1],[-17,25],[0,124],[-24,56],[43,145],[2,72],[-30,60],[-92,42],[-25,47],[7,53],[76,205],[0,93],[37,89],[32,-22],[18,185],[-18,26],[-61,-14],[-22,10],[-8,49],[-53,-26],[-206,-231],[-17,-58],[15,-60],[-16,-106],[-31,-91],[-22,-15],[-80,-15],[-271,-148],[-70,-7],[-291,89],[-148,-23],[-26,8],[-109,64],[16,-2],[-15,144],[24,43],[80,73],[48,25],[-25,79],[-33,144],[-19,10],[-59,-22],[-28,14],[5,61],[56,221],[20,32],[65,63],[4,35],[-35,46],[-44,23],[-24,-10],[-13,-60],[-36,19],[-52,125],[-81,66],[-65,77],[-37,20],[-41,-4],[-124,-58],[-44,-1],[-109,67],[-80,11],[-110,-18],[-86,-149],[-68,71],[-18,135],[-1,155],[-16,128],[-30,63],[-40,40],[-86,34],[-125,0],[-24,20],[18,37],[-8,45],[-56,8],[-65,-59],[-86,-35],[-80,4],[-86,50],[-55,64],[-10,38],[-3,107],[-52,186],[-15,96],[27,55],[-37,111],[-54,13],[-15,20],[-51,115]],[[6076,4361],[83,-41],[-23,-115],[36,-22],[50,15]],[[973,4230],[-101,-35],[-45,-31],[-35,-42],[-58,-109],[-26,-22],[-40,11]]
7 | ],
8 | "transform": {"scale":[0.0005160364880245644,0.0003010333266714523],
9 | "translate": [2.521800404103959,49.49526825106939]},
10 | "objects": {
11 | "default": {
12 | "type":"GeometryCollection",
13 | "geometries": [
14 | {
15 | "arcs": [[0]],
16 | "type": "Polygon",
17 | "properties": {
18 | "hc-group":"admin1",
19 | "hc-key":"be-3530",
20 | "hc-a2":"BR",
21 | "labelrank":"9",
22 | "iso_3166_2":"BE-BRU",
23 | "hasc":"BE.BU",
24 | "alt-name":"Bruselas|Brussel Hoofstadt|Brusselse Hoofdstedelijke Gewest|Brüssel|Bruxelas|Région de Bruxelles-Capitale",
25 | "country":"Belgium",
26 | "type-en":"Capital Region",
27 | "region":"Capital Region",
28 | "woe-id":"55965974",
29 | "longitude":"4.36266",
30 | "subregion":null,
31 | "woe-name":"Brussels",
32 | "fips":"BE11",
33 | "latitude":"50.8332",
34 | "woe-label":"Capital Region of Brussels, BE, Belgium",
35 | "postal-code":null,
36 | "type":"Hoofdstedelijk Gewest|Région Capitale",
37 | "name":"Brussels",
38 | "hc-middle-lon":4.363,
39 | "hc-middle-lat":50.84,
40 | "id":"BRU"
41 | },
42 | "id": "BRU"
43 | },
44 | {
45 | "arcs": [[[1,2,3,4],[-1]],[[5,6]]],
46 | "type": "MultiPolygon",
47 | "properties": {
48 | "id": "VLG"
49 | },
50 | "id": "VLG"
51 | },
52 | {
53 | "arcs": [[[7,-5,8,-7]],[[9,-3]]],
54 | "type": "MultiPolygon",
55 | "properties": {
56 | "id":"WAL"
57 | },
58 | "id":"WAL"
59 | }
60 | ]
61 | }
62 | }
63 | }
--------------------------------------------------------------------------------
/webapp/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | PoliDashboard
10 |
11 |
12 |
13 |
14 |
15 | PoliDashboard
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
172 |
173 |
174 |
175 |
176 |
177 | <%- include(child) %>
178 |
179 |
185 |
186 |
187 |
188 |
189 |
190 |
--------------------------------------------------------------------------------
/collector/recollect_inactive.py:
--------------------------------------------------------------------------------
1 | # The Meta Ad Library API can omit ads in follow-up queries, so our daily collector sometimes
2 | # 'misses' ads that later become inactive. Those ads then remain marked “active” in PoliDashboard
3 | # because they fall outside the collector’s 2-day window.
4 | #
5 | # recollect_inactive.py fixes this by:
6 | # 1. Finding ads with no stop date (ad_delivery_stop_time_raw) and last collected over 2 days ago (as per our DB).
7 | # 2. Grouping them by page ID and their original date range.
8 | # 3. Re-querying each page ID for the missing ads using a custom traversal.
9 | #
10 | # Because this is slow, run it for each country via cron (e.g. every two weeks).
11 |
12 | import os
13 | import re
14 | import sys
15 | import json
16 | import datetime
17 |
18 | from time import sleep
19 | from datetime import date, datetime, timedelta
20 | from fb_ads_library_cleanup import FbAdsLibraryTraversal
21 | from push_to_dbs import SQLInserter
22 |
23 | # If working in a team of multiple developers, a separate API token is ideal to not disrupt live collection
24 | # Although on smaller datasets use of the same token is fine.
25 | api_key = os.environ.get("FACEBOOK_API_KEY_CLEANUP")
26 |
27 | if not api_key:
28 | print("API key not set. Please set the FACEBOOK_API_KEY_CLEANUP environment variable.")
29 | sys.exit(1)
30 |
31 |
32 | # Pull the list of country codes directly from the countries.json file in the webapp
33 | file_path = os.path.abspath(os.path.join('..', 'webapp', 'countries.json'))
34 |
35 | # Load JSON data
36 | with open(file_path, 'r', encoding='utf-8') as f:
37 | countries = json.load(f)
38 |
39 | # Extract 'code' values as a list
40 | country_codes = [country['code'] for country in countries]
41 |
42 |
43 | all_ids_from_country = []
44 | page_limit = 120
45 |
46 | def process_pages(page_ids, newest_ad_time, oldest_ad_time, ads_looked_at):
47 | if page_ids == []:
48 | return
49 |
50 | page_ids = ",".join([str(x) for x in page_ids])
51 |
52 | collector = FbAdsLibraryTraversal(
53 | api_key,
54 | "id,ad_creation_time,ad_creative_bodies,ad_creative_link_captions,ad_creative_link_descriptions,ad_creative_link_titles,ad_delivery_start_time,ad_delivery_stop_time,ad_snapshot_url,currency,delivery_by_region,demographic_distribution,bylines,impressions,languages,page_id,page_name,publisher_platforms,spend,target_locations,target_gender,target_ages,estimated_audience_size",
55 | ".",
56 | country,
57 | after_date=oldest_ad_time,
58 | page_limit=page_limit,
59 | api_version="v21.0", # Current version as of Oct 2024
60 | search_page_ids=page_ids,
61 | max_date=newest_ad_time
62 | )
63 |
64 | for ads in collector.generate_ad_archives():
65 | for ad in ads:
66 | # Only update ads if we need to to avoid slow down
67 | if ad['id'] in ads_looked_at:
68 | sql_inserter.insert_ad(ad)
69 | else:
70 | if ad['id'] in all_ids_from_country:
71 | sql_inserter.insert_ad(ad)
72 |
73 |
74 | if __name__=="__main__":
75 |
76 | try:
77 | input_country = sys.argv[1]
78 | country_codes = [input_country]
79 | except IndexError:
80 | print('No country given, collecting from all countries')
81 |
82 |
83 | # The pipeline criteria for the ads are:
84 | # 1. The ad must have a funding entity (ads without funding entities are not compatible with PoliDashboard, so skip them)
85 | # 2. The last time we collected the ad (latest_collected) must be less than 3 days ago, this ensure we fetch ads that are outside of the collection window of the main collector
86 | # 3. The ad_delivery_stop_time_raw is NULL, this indicates that when we last collected it, the ad was definitely ACTIVE as only ACTIVE ads can have this field be NULL
87 |
88 | for country in country_codes:
89 | print(f"Begin cleanup process for country: {country}")
90 |
91 | sql_inserter = SQLInserter(country)
92 |
93 | # First ensure there are actually ads that need checking
94 | sql_inserter.cursor.execute(
95 | f"""
96 | SELECT COUNT(*)
97 | FROM ad_data_{country.lower()}
98 | WHERE bylines_name IS NOT NULL
99 | AND ad_delivery_stop_time_raw IS NULL
100 | AND latest_collected < %s
101 | """,
102 | (
103 | datetime.now() - timedelta(days=3),
104 | )
105 | )
106 | result = sql_inserter.cursor.fetchone()
107 | inactive_count = result[0]
108 |
109 | if inactive_count == 0:
110 | print(f"Country '{country}': No ads matching the cleanup criteria.")
111 | continue
112 |
113 | print(f"Number of documents matching criteria for cleanup: {inactive_count}")
114 |
115 | # Grab the list of all ids for tracking purposes
116 | sql_inserter.cursor.execute(
117 | f"""
118 | SELECT id
119 | FROM ad_data_{country.lower()}
120 | WHERE bylines_name IS NOT NULL
121 | AND ad_delivery_stop_time_raw IS NULL
122 | AND latest_collected < %s
123 | ORDER BY ad_delivery_start_time DESC
124 | """,
125 | (
126 | datetime.now() - timedelta(days=3), # Less than 3 days ago
127 | )
128 | )
129 |
130 | # Used for checking if there are returned in a request that we need but didn't track in our batch
131 | all_ids_from_country = [str(row[0]) for row in sql_inserter.cursor.fetchall()]
132 |
133 | sql_inserter.cursor.execute(
134 | f"""
135 | SELECT page_id, ad_delivery_start_time, id
136 | FROM ad_data_{country.lower()}
137 | WHERE bylines_name IS NOT NULL
138 | AND ad_delivery_stop_time_raw IS NULL
139 | AND latest_collected < %s
140 | ORDER BY ad_delivery_start_time DESC
141 | """,
142 | (
143 | datetime.now() - timedelta(days=3), # Less than 3 days ago
144 | )
145 | )
146 |
147 | rows = sql_inserter.cursor.fetchall()
148 |
149 | # A max of 10 ids can be processed per request:
150 | previous_page_id = None
151 | page_ids = []
152 | ad_ids_looked_at = []
153 |
154 | newest_ad_time = None
155 | oldest_ad_time = None
156 |
157 | for row in rows:
158 | page_id = row[0]
159 | ad_delivery_start_time = row[1]
160 | ad_id = row[2]
161 |
162 | if page_id is None or page_id is not previous_page_id:
163 | page_ids.append(page_id)
164 | previous_page_id = page_id
165 |
166 | # Figure out which ad is newest and which is oldest so we can set an optimal time range to request
167 | if newest_ad_time is None or ad_delivery_start_time > newest_ad_time:
168 | newest_ad_time = ad_delivery_start_time
169 |
170 | if oldest_ad_time is None or ad_delivery_start_time < oldest_ad_time:
171 | oldest_ad_time = ad_delivery_start_time
172 |
173 | ad_ids_looked_at.append(str(ad_id))
174 |
175 | if len(page_ids) >= 10:
176 | process_pages(
177 | page_ids,
178 | newest_ad_time.strftime('%Y-%m-%d'),
179 | oldest_ad_time.strftime('%Y-%m-%d'),
180 | ad_ids_looked_at
181 | )
182 |
183 | # Reset vars
184 | page_ids = []
185 | ad_ids_looked_at = []
186 | previous_page_id = None
187 | newest_ad_time = None
188 | oldest_ad_time = None
189 |
190 | continue
191 |
192 | # Process any leftover page ids...
193 | if page_ids:
194 | process_pages(
195 | page_ids,
196 | newest_ad_time.strftime('%Y-%m-%d'),
197 | oldest_ad_time.strftime('%Y-%m-%d'),
198 | ad_ids_looked_at
199 | )
200 |
201 | all_ids_from_country = []
202 |
203 | print("Done!")
--------------------------------------------------------------------------------
/webapp/countries.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Australia",
4 | "code": "au",
5 | "first date": "10-10-2023",
6 | "currency": "AUD",
7 | "currency symbol": "$",
8 | "regions": {}
9 | },
10 | {
11 | "name": "Austria",
12 | "code": "at",
13 | "first date": "10-10-2023",
14 | "currency": "EUR",
15 | "currency symbol": "€",
16 | "regions": {}
17 | },
18 | {
19 | "name": "Belgium",
20 | "code": "be",
21 | "first date": "10-10-2023",
22 | "currency": "EUR",
23 | "currency symbol": "€",
24 | "regions": {}
25 | },
26 | {
27 | "name": "Brazil",
28 | "code": "br",
29 | "first date": "10-10-2023",
30 | "currency": "BRL",
31 | "currency symbol": "R$",
32 | "regions": {}
33 | },
34 | {
35 | "name": "Bulgaria",
36 | "code": "bg",
37 | "first date": "15-10-2023",
38 | "currency": "EUR",
39 | "currency symbol": "€",
40 | "regions": {}
41 | },
42 | {
43 | "name": "Canada",
44 | "code": "ca",
45 | "first date": "10-10-2023",
46 | "currency symbol": "$",
47 | "currency": "CAD",
48 | "regions": {}
49 | },
50 | {
51 | "name": "Croatia",
52 | "code": "hr",
53 | "first date": "10-10-2023",
54 | "currency": "EUR",
55 | "currency symbol": "€",
56 | "regions": {}
57 | },
58 | {
59 | "name": "Cyprus",
60 | "code": "cy",
61 | "first date": "15-10-2023",
62 | "currency": "EUR",
63 | "currency symbol": "€",
64 | "regions": {}
65 | },
66 | {
67 | "name": "Czechia",
68 | "code": "cz",
69 | "first date": "10-10-2023",
70 | "currency": "CZK",
71 | "currency symbol": "CZK",
72 | "regions": {}
73 | },
74 | {
75 | "name": "Denmark",
76 | "code": "dk",
77 | "first date": "10-10-2023",
78 | "currency": "DKK",
79 | "currency symbol": "Kr.",
80 | "regions": {}
81 | },
82 | {
83 | "name": "Estonia",
84 | "code": "ee",
85 | "first date": "10-10-2023",
86 | "currency": "EUR",
87 | "currency symbol": "€",
88 | "regions": {}
89 | },
90 | {
91 | "name": "Egypt",
92 | "code": "eg",
93 | "first date": "03-10-2024",
94 | "currency": "EGP",
95 | "currency symbol": "E£",
96 | "regions": {}
97 | },
98 | {
99 | "name": "Finland",
100 | "code": "fi",
101 | "first date": "10-10-2023",
102 | "currency": "EUR",
103 | "currency symbol": "€",
104 | "regions": {}
105 | },
106 | {
107 | "name": "France",
108 | "code": "fr",
109 | "first date": "10-10-2023",
110 | "currency": "EUR",
111 | "currency symbol": "€",
112 | "regions": {}
113 | },
114 | {
115 | "name": "Germany",
116 | "code": "de",
117 | "first date": "10-10-2023",
118 | "currency": "EUR",
119 | "currency symbol": "€",
120 | "regions": {}
121 | },
122 | {
123 | "name": "Greece",
124 | "code": "gr",
125 | "first date": "10-10-2023",
126 | "currency": "EUR",
127 | "currency symbol": "€",
128 | "regions": {}
129 | },
130 | {
131 | "name": "Hungary",
132 | "code": "hu",
133 | "first date": "10-10-2023",
134 | "currency": "HUF",
135 | "currency symbol": "Ft",
136 | "regions": {}
137 | },
138 | {
139 | "name": "Ireland",
140 | "code": "ie",
141 | "first date": "10-10-2023",
142 | "currency": "EUR",
143 | "currency symbol": "€",
144 | "regions": {}
145 | },
146 | {
147 | "name": "India",
148 | "code": "in",
149 | "first date": "10-10-2023",
150 | "currency": "INR",
151 | "currency symbol": "₹",
152 | "regions": {}
153 | },
154 | {
155 | "name": "Indonesia",
156 | "code": "id",
157 | "first date": "10-10-2023",
158 | "currency": "IDR",
159 | "currency symbol": "Rp",
160 | "regions": {}
161 | },
162 | {
163 | "name": "Italy",
164 | "code": "it",
165 | "first date": "10-10-2023",
166 | "currency": "EUR",
167 | "currency symbol": "€",
168 | "regions": {}
169 | },
170 | {
171 | "name": "Latvia",
172 | "code": "lv",
173 | "first date": "10-10-2023",
174 | "currency": "EUR",
175 | "currency symbol": "€",
176 | "regions": {}
177 | },
178 | {
179 | "name": "Lithuania",
180 | "code": "lt",
181 | "first date": "10-10-2023",
182 | "currency": "EUR",
183 | "currency symbol": "€",
184 | "regions": {}
185 | },
186 | {
187 | "name": "Luxembourg",
188 | "code": "lu",
189 | "first date": "10-10-2023",
190 | "currency": "EUR",
191 | "currency symbol": "€",
192 | "regions": {}
193 | },
194 | {
195 | "name": "Malta",
196 | "code": "mt",
197 | "first date": "10-10-2023",
198 | "currency": "EUR",
199 | "currency symbol": "€",
200 | "regions": {}
201 | },
202 | {
203 | "name": "Nigeria",
204 | "code": "ng",
205 | "first date": "03-10-2024",
206 | "currency": "NGN",
207 | "currency symbol": "₦",
208 | "regions": {}
209 | },
210 | {
211 | "name": "Netherlands",
212 | "code": "nl",
213 | "first date": "10-10-2023",
214 | "currency": "EUR",
215 | "currency symbol": "€",
216 | "regions": {}
217 | },
218 | {
219 | "name": "Philippines",
220 | "code": "ph",
221 | "first date": "10-10-2023",
222 | "currency": "PHP",
223 | "currency symbol": "₱",
224 | "regions": {}
225 | },
226 | {
227 | "name": "Poland",
228 | "code": "pl",
229 | "first date": "10-10-2023",
230 | "currency": "PLN",
231 | "currency symbol": "zł",
232 | "regions": {}
233 | },
234 | {
235 | "name": "Portugal",
236 | "code": "pt",
237 | "first date": "10-10-2023",
238 | "currency": "EUR",
239 | "currency symbol": "€",
240 | "regions": {}
241 | },
242 | {
243 | "name": "Romania",
244 | "code": "ro",
245 | "first date": "10-10-2023",
246 | "currency": "RON",
247 | "currency symbol": "lei",
248 | "regions": {}
249 | },
250 | {
251 | "name": "Slovakia",
252 | "code": "sk",
253 | "first date": "10-10-2023",
254 | "currency": "EUR",
255 | "currency symbol": "€",
256 | "regions": {}
257 | },
258 | {
259 | "name": "Slovenia",
260 | "code": "si",
261 | "first date": "10-10-2023",
262 | "currency": "EUR",
263 | "currency symbol": "€",
264 | "regions": {}
265 | },
266 | {
267 | "name": "Spain",
268 | "code": "es",
269 | "first date": "10-10-2023",
270 | "currency": "EUR",
271 | "currency symbol": "€",
272 | "regions": {}
273 | },
274 | {
275 | "name": "South Africa",
276 | "code": "za",
277 | "first date": "03-10-2024",
278 | "currency": "ZAR",
279 | "currency symbol": "R",
280 | "regions": {}
281 | },
282 | {
283 | "name": "Sweden",
284 | "code": "se",
285 | "first date": "10-10-2023",
286 | "currency": "SEK",
287 | "currency symbol": "SEK",
288 | "regions": {}
289 | },
290 | {
291 | "name": "United Kingdom",
292 | "code": "gb",
293 | "first date": "10-10-2023",
294 | "currency": "GBP",
295 | "currency symbol": "£",
296 | "regions": {}
297 | },
298 | {
299 | "name": "United States",
300 | "code": "us",
301 | "first date": "10-10-2023",
302 | "currency": "USD",
303 | "currency symbol": "$",
304 | "regions": {}
305 | }
306 | ]
--------------------------------------------------------------------------------
/collector/fb_ads_library_api.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | # Copyright (c) Facebook, Inc. and its affiliates.
4 | # All rights reserved.
5 | #
6 | # This source code is licensed under the license found in the
7 | # LICENSE file in the root directory of the original source tree.
8 | # Found here: https://github.com/facebookresearch/Ad-Library-API-Script-Repository/tree/main
9 | #
10 | # Modified by the Social Media Lab to serve the Polidashboard application.
11 |
12 | import json
13 | import re
14 | from datetime import datetime
15 |
16 | import requests
17 | import sys
18 | from time import sleep
19 |
20 | def get_ad_archive_id(data):
21 | """
22 | Extract ad_archive_id from ad_snapshot_url
23 | """
24 | return re.search(r"/\?id=([0-9]+)", data["ad_snapshot_url"]).group(1)
25 |
26 |
27 | class FbAdsLibraryTraversal:
28 | default_url_pattern = (
29 | "https://graph.facebook.com/{}/ads_archive?unmask_removed_content=true&ad_type=POLITICAL_AND_ISSUE_ADS&access_token={}&"
30 | + "fields={}&search_terms={}&ad_reached_countries={}&search_page_ids={}&"
31 | + "ad_active_status={}&limit={}&"
32 | + "ad_delivery_date_min={}"
33 | )
34 | default_api_version = "v14.0"
35 |
36 | def __init__(
37 | self,
38 | access_token,
39 | fields,
40 | search_term,
41 | country,
42 | search_page_ids="",
43 | ad_active_status="ALL",
44 | after_date="1970-01-01",
45 | cutoff_after_date="2023-10-10",
46 | page_limit=100,
47 | api_version=None,
48 | retry_limit=3,
49 | ):
50 | self.page_count = 0
51 | self.access_token = access_token
52 | self.fields = fields
53 | self.search_term = search_term
54 | self.country = country
55 | self.after_date = after_date
56 | self.cutoff_after_date = cutoff_after_date
57 | self.search_page_ids = search_page_ids
58 | self.ad_active_status = ad_active_status
59 | self.page_limit = page_limit
60 | self.retry_limit = retry_limit
61 | if api_version is None:
62 | self.api_version = self.default_api_version
63 | else:
64 | self.api_version = api_version
65 | print ("set to api v=",api_version)
66 |
67 | def generate_ad_archives(self):
68 | next_page_url = self.default_url_pattern.format(
69 | self.api_version,
70 | self.access_token,
71 | self.fields,
72 | self.search_term,
73 | self.country,
74 | self.search_page_ids,
75 | self.ad_active_status,
76 | self.page_limit,
77 | self.after_date
78 | )
79 | return self.__class__._get_ad_archives_from_url(
80 | next_page_url, cutoff_after_date = self.cutoff_after_date, country=self.country, retry_limit=self.retry_limit
81 | )
82 |
83 | @staticmethod
84 | def _get_ad_archives_from_url(
85 | next_page_url, cutoff_after_date="2023-10-10", country="unknown", retry_limit=5
86 | ):
87 | last_error_url = None
88 | last_retry_count = 0
89 | start_time_cutoff_after = datetime.strptime(cutoff_after_date, "%Y-%m-%d").timestamp()
90 | time_to_regain_access = 0
91 | print("inside _get_ad_archives_from_ur ")
92 | while next_page_url is not None:
93 | if time_to_regain_access > 0:
94 | print(f"sleeping inside of ad archive for: {time_to_regain_access + 1} minutes")
95 | sleep((time_to_regain_access + 1) * 60)
96 | else:
97 | print(f"sleeping inside of ad archive for just 70 seconds to catch some air!")
98 | sleep(70)
99 |
100 | try:
101 | response = requests.get(next_page_url)
102 | response_data = json.loads(response.text)
103 | except Exception as response_error:
104 | print("There was a error with the response, sleep ~1 minute and try again")
105 | print(response_error)
106 | sleep(65)
107 | continue
108 |
109 | business_use_case_usage = response.headers.get('x-business-use-case-usage', '{}')
110 | estimated_time = 0
111 | try:
112 | usage_data = json.loads(business_use_case_usage)
113 | # Extract 'estimated_time_to_regain_access' (assuming you are targeting the first key and the first dictionary item)
114 | key = next(iter(usage_data)) # Get the first key (e.g., '1651268252335870')
115 | estimated_time = usage_data[key][0].get('estimated_time_to_regain_access', 30)
116 | except (json.JSONDecodeError, KeyError, IndexError):
117 | estimated_time = 0
118 | except StopIteration:
119 | print("Ecountered Stop iteration error")
120 | estimated_time = 0
121 |
122 | print("Estimated time: " + str(estimated_time))
123 | estimated_time = int(estimated_time)
124 | if estimated_time > 0:
125 | sleep(int(estimated_time) * 60)
126 |
127 | try:
128 | usage_data = json.loads(business_use_case_usage)
129 | # Extract 'estimated_time_to_regain_access' (assuming you are targeting the first key and the first dictionary item)
130 | key = next(iter(usage_data))
131 | response_headers = usage_data[key][0]
132 |
133 | time_to_regain_access = response_headers['estimated_time_to_regain_access']
134 | if int(time_to_regain_access) == 0:
135 | if int(response_headers['total_time']) > 100:
136 | time_to_regain_access = 60 # make it 60 minutes
137 |
138 | if int(time_to_regain_access) > 0:
139 | continue # Go straight to sleeping since we have hit regain access limit
140 |
141 | except Exception as ex:
142 | print("Error in parsing response headers: ", ex)
143 |
144 | if "error" in response_data:
145 | if next_page_url == last_error_url:
146 | # failed again
147 | if last_retry_count >= retry_limit:
148 | print("Failed retry limit...")
149 | raise Exception(
150 | "Error message: [{}], failed on URL: [{}], Estimated time to regain access: [{}]".format(
151 | json.dumps(response_data["error"]), next_page_url, estimated_time
152 | )
153 | )
154 | else:
155 | last_error_url = next_page_url
156 | last_retry_count = 0
157 | last_retry_count += 1
158 | continue
159 |
160 | filtered = list(
161 | filter(
162 | lambda ad_archive: ("ad_delivery_start_time" in ad_archive)
163 | and (
164 | datetime.strptime(
165 | ad_archive["ad_delivery_start_time"], "%Y-%m-%d"
166 | ).timestamp()
167 | >= start_time_cutoff_after
168 | ),
169 | response_data["data"],
170 | )
171 | )
172 | # print("after filtered....")
173 | if len(filtered) == 0:
174 | print(" if no data after the after_date, break")
175 | next_page_url = None
176 | break
177 | yield filtered
178 |
179 | if "paging" in response_data:
180 | next_page_url = response_data["paging"]["next"]
181 | else:
182 | next_page_url = None
183 |
184 | # Added to kill script to prevent API call runaway, where the limit has already been reached, and the script still attempts to call the API
185 | # Which contributes to increasing the API limit even more, without this the script would need to be killed manually.
186 | try:
187 | if int(response_headers['total_time']) >= 100:
188 | sys.exit()
189 | except:
190 | pass
191 |
192 | @classmethod
193 | def generate_ad_archives_from_url(cls, failure_url, after_date="1970-01-01"):
194 | """
195 | if we failed from error, later we can just continue from the last failure url
196 | """
197 | return cls._get_ad_archives_from_url(failure_url, after_date=after_date)
--------------------------------------------------------------------------------
/webapp/public/js/general.js:
--------------------------------------------------------------------------------
1 | jQuery(document).ready(function() {
2 | var $ = jQuery;
3 | var screenRes = $(window).width(),
4 | screenHeight = $(window).height(),
5 | html = $('html');
6 |
7 | // IE<8 Warning
8 | if (html.hasClass("ie6") || html.hasClass("ie7")) {
9 | $("body").empty().html('Please, Update your Browser to at least IE8');
10 | }
11 |
12 | // Disable Empty Links
13 | $("[href=#]").click(function(event){
14 | event.preventDefault();
15 | });
16 |
17 | // Comment list odd/even
18 | $(".comment-list li:even , .product-list .product-item:even").addClass("even");
19 | $(".comment-list li:odd , .product-list .product-item:odd").addClass("odd");
20 |
21 | // First/Last child
22 |
23 | $(".add-comment .input_styled:last , .widget-adv-filter .input-date:last , .widget-login .field_text:last ").addClass("last");
24 | $(".add-comment .input_styled:first , .widget-adv-filter .input-date:first").addClass("first");
25 |
26 | // Body Wrap
27 | $(".body-wrap").css("min-height", screenHeight);
28 | $(window).resize(function() {
29 | screenHeight = $(window).height();
30 | $(".body-wrap").css("min-height", screenHeight);
31 | });
32 |
33 | // Hide Product items
34 | $("body").on("click",".product-remove a", function(){
35 | $(this).parent().parent().hide();
36 | });
37 |
38 | // Remove outline in IE
39 | $("a, input, textarea").attr("hideFocus", "true").css("outline", "none");
40 |
41 |
42 | // styled Select, Radio, Checkbox
43 | if ($(".select_styled").length) {
44 | cuSel({changedEl: ".select_styled", visRows: 6, itemPadding: 19});
45 |
46 | $('.field_select').each(function() {
47 | $(this).on('change', 'input', function() {
48 | $(this).closest('.cusel').addClass('hasValue');
49 | });
50 | });
51 | }
52 | if ($("div,p").hasClass("input_styled")) {
53 | $(".input_styled input").customInput();
54 | }
55 |
56 | // Dropdown Menu
57 | $('.menu li').hover(function() {
58 | $(this).addClass('hover');
59 | }, function() {
60 | $(this).removeClass('hover');
61 | });
62 |
63 | // Menu
64 | $(".menu ul").parents("li").addClass("parent");
65 |
66 | $(".menu li").hover(function(){
67 | $(this).addClass('hover');
68 | },function(){
69 | $(this).removeClass('hover');
70 | });
71 |
72 | // Tabs
73 | var $tabs_on_page = $('.tabs').length;
74 | var $bookmarks = 0;
75 |
76 | for(var i = 1; i <= $tabs_on_page; i++){
77 | $('.tabs').eq(i-1).addClass('tab-id'+i);
78 | $bookmarks = $('.tab-id'+i+' li').length;
79 | $('.tab-id'+i).addClass('bookmarks'+$bookmarks);
80 | }
81 |
82 | $('.tabs li, .payment-form .btn').click(function() {
83 | setTimeout(function () {
84 | for(var i = 1; i <= $tabs_on_page; i++){
85 | $bookmarks = $('.tab-id'+i+' li').length;
86 | for(var j = 1; j <= $bookmarks; j++){
87 | $('.tab-id'+i).removeClass('active-bookmark'+j);
88 |
89 | if($('.tab-id'+i+' li').eq(j-1).hasClass('active')){
90 | $('.tab-id'+i).addClass('active-bookmark'+j);
91 | }
92 | }
93 | }
94 | }, 0)
95 | });
96 |
97 | // Toggles
98 | $('.toggle-link').click(function(){
99 | $(this).parents('.toggle').removeClass('collapsed');
100 |
101 | if(!$(this).hasClass('collapsed')) {
102 | $(this).parents('.toggle').addClass('collapsed');
103 | }
104 | });
105 |
106 | // Payment Form
107 | $('.payment-form #billing .btn-next, .payment-form #payment .btn-prev').click(function() {
108 | $('a[href="#shipping"]').tab('show');
109 | });
110 | $('.payment-form #shipping .btn-prev').click(function() {
111 | $('a[href="#billing"]').tab('show');
112 | });
113 | $('.payment-form #shipping .btn-next').click(function() {
114 | $('a[href="#payment"]').tab('show');
115 | });
116 |
117 | // Smooth Scroling of ID anchors
118 | function filterPath(string) {
119 | return string
120 | .replace(/^\//,'')
121 | .replace(/(index|default).[a-zA-Z]{3,4}$/,'')
122 | .replace(/\/$/,'');
123 | }
124 | var locationPath = filterPath(location.pathname);
125 | var scrollElem = scrollableElement('html', 'body');
126 |
127 | $('a[href*=#].anchor').each(function() {
128 | $(this).click(function(event) {
129 | var thisPath = filterPath(this.pathname) || locationPath;
130 | if ( locationPath == thisPath
131 | && (location.hostname == this.hostname || !this.hostname)
132 | && this.hash.replace(/#/,'') ) {
133 | var $target = $(this.hash), target = this.hash;
134 | if (target && $target.length != 0) {
135 | var targetOffset = $target.offset().top;
136 | event.preventDefault();
137 | $(scrollElem).animate({scrollTop: targetOffset}, 400, function() {
138 | location.hash = target;
139 | });
140 | }
141 | }
142 | });
143 | });
144 |
145 | // use the first element that is "scrollable"
146 | function scrollableElement(els) {
147 | for (var i = 0, argLength = arguments.length; i 0) {
151 | return el;
152 | } else {
153 | $scrollElement.scrollTop(1);
154 | var isScrollable = $scrollElement.scrollTop()> 0;
155 | $scrollElement.scrollTop(0);
156 | if (isScrollable) {
157 | return el;
158 | }
159 | }
160 | }
161 | return [];
162 | }
163 |
164 | // Audio Player
165 | var $players_on_page = $('.jp-audio').length;
166 | var $song_title = '';
167 |
168 | if($players_on_page > 0){
169 | for(var i = 1; i <= $players_on_page; i++){
170 | $('.jp-audio').eq(i-1).addClass('jp-audio'+i);
171 | }
172 |
173 | setTimeout(function () {
174 | for(var i = 1; i <= $players_on_page; i++){
175 | $song_title = $('.jp-audio'+i+' .jp-playlist ul li.jp-playlist-current .jp-playlist-item').html();
176 | $('.jp-audio'+i+' .song-title').html($song_title);
177 |
178 | var star = $(".rating span.star");
179 |
180 | star.hover(
181 | function() {
182 | $(this).addClass("over");
183 | $(this).prevAll().addClass("over");
184 | }
185 | , function() {
186 | $(this).removeClass("over");
187 | $(this).prevAll().removeClass("over");
188 | }
189 | );
190 | star.click( function() {
191 | $(this).parent().children(".star").removeClass("voted");
192 | $(this).prevAll().addClass("voted");
193 | $(this).addClass("voted");
194 | });
195 | }
196 | }, 1000);
197 |
198 | function switchSong() {
199 | setTimeout(function () {
200 | for(var i = 1; i <= $players_on_page; i++){
201 | $('.jp-audio'+i+' .jp-previous, .jp-audio'+i+' .jp-next').removeClass('disabled');
202 |
203 | if ($('.jp-audio'+i+' .jp-playlist ul li:last-child').hasClass('jp-playlist-current')) {
204 | $('.jp-audio'+i+' .jp-next').addClass('disabled');
205 | }
206 | if ($('.jp-audio'+i+' .jp-playlist ul li:first-child').hasClass('jp-playlist-current')) {
207 | $('.jp-audio'+i+' .jp-previous').addClass('disabled');
208 | }
209 | $song_title = $('.jp-audio'+i+' .jp-playlist ul li.jp-playlist-current .jp-playlist-item').html();
210 | $('.jp-audio'+i+' .song-title').html($song_title);
211 | }
212 | }, 0)
213 | }
214 |
215 | $('.jp-previous, .jp-next, .jp-playlist ul').click(function() {
216 | switchSong()
217 | });
218 | $(".jp-jplayer").on($.jPlayer.event.ended, function(event) {
219 | switchSong()
220 | });
221 | }
222 |
223 | // Rating Stars
224 | var star = $(".rating span.star");
225 |
226 | star.hover(
227 | function() {
228 | $(this).addClass("over");
229 | $(this).prevAll().addClass("over");
230 | }
231 | , function() {
232 | $(this).removeClass("over");
233 | $(this).prevAll().removeClass("over");
234 | }
235 | );
236 | star.click( function() {
237 | $(this).parent().children(".star").removeClass("voted");
238 | $(this).prevAll().addClass("voted");
239 | $(this).addClass("voted");
240 | });
241 | });
242 |
--------------------------------------------------------------------------------
/webapp/public/maps/sk.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1]],"id":"SK.BL","properties":{"hc-group":"admin1","hc-key":"sk-bl","hc-a2":"BL","labelrank":"7","hasc":"SK.BL","alt-name":"Bratislava","woe-id":"20070505","subregion":"Bratislavský","fips":"LO02","postal-code":"BL","name":"Bratislavský","country":"Slovakia","type-en":"Region","region":null,"longitude":"17.1882","woe-name":"Bratislavský","latitude":"48.2935","woe-label":"Bratislavsky, SK, Slovakia","type":"Kraj","hc-middle-lon":17.187,"hc-middle-lat":48.315}},{"type":"Polygon","arcs":[[2,3,4,5,6,7]],"id":"SK.BC","properties":{"hc-group":"admin1","hc-key":"sk-bc","hc-a2":"BC","labelrank":"7","hasc":"SK.BC","alt-name":"Banská Bystrica","woe-id":"20070495","subregion":"Stredoslovensky","fips":"LO01","postal-code":"BC","name":"Banskobystrický","country":"Slovakia","type-en":"Region","region":null,"longitude":"19.477","woe-name":"Banskobystrický","latitude":"48.5213","woe-label":"Banskobystricky, SK, Slovakia","type":"Kraj","hc-middle-lon":19.457,"hc-middle-lat":48.538}},{"type":"Polygon","arcs":[[-6,8,9,10]],"id":"SK.ZI","properties":{"hc-group":"admin1","hc-key":"sk-zi","hc-a2":"ZI","labelrank":"7","hasc":"SK.ZI","alt-name":"?ilina","woe-id":"20070494","subregion":"Stredoslovensky","fips":"LO08","postal-code":"ZI","name":"?ilinský","country":"Slovakia","type-en":"Region","region":null,"longitude":"19.2076","woe-name":"?ilinský","latitude":"49.1656","woe-label":"Zilinsky, SK, Slovakia","type":"Kraj","hc-middle-lon":19.225,"hc-middle-lat":49.175}},{"type":"Polygon","arcs":[[-4,11,12,13]],"id":"SK.NI","properties":{"hc-group":"admin1","hc-key":"sk-ni","hc-a2":"NI","labelrank":"7","hasc":"SK.NI","alt-name":"Nitra","woe-id":"20070492","subregion":"Zapadoslovensky","fips":"SI04","postal-code":"NI","name":"Nitriansky","country":"Slovakia","type-en":"Region","region":null,"longitude":"18.3966","woe-name":"Nitriansky","latitude":"48.1443","woe-label":"Nitriansky, SK, Slovakia","type":"Kraj","hc-middle-lon":18.345,"hc-middle-lat":48.115}},{"type":"Polygon","arcs":[[-5,-14,14,15,-9]],"id":"SK.TC","properties":{"hc-group":"admin1","hc-key":"sk-tc","hc-a2":"TC","labelrank":"7","hasc":"SK.TC","alt-name":"Trencín","woe-id":"20070493","subregion":"Zapadoslovensky","fips":"SI06","postal-code":"TC","name":"Trenciansky","country":"Slovakia","type-en":"Region","region":null,"longitude":"18.0952","woe-name":"Trenciansky","latitude":"48.8824","woe-label":"Trenciansky, SK, Slovakia","type":"Kraj","hc-middle-lon":18.25,"hc-middle-lat":48.9}},{"type":"Polygon","arcs":[[-13,16,-2,17,-15]],"id":"SK.TA","properties":{"hc-group":"admin1","hc-key":"sk-ta","hc-a2":"TA","labelrank":"7","hasc":"SK.TA","alt-name":"Trnava","woe-id":"20070504","subregion":"Zapadoslovensky","fips":"SI07","postal-code":"TA","name":"Trnavský","country":"Slovakia","type-en":"Region","region":null,"longitude":"17.6989","woe-name":"Trnavský","latitude":"48.3422","woe-label":"Trnavsky, SK, Slovakia","type":"Kraj","hc-middle-lon":17.667,"hc-middle-lat":48.249}},{"type":"Polygon","arcs":[[-8,18,19]],"id":"SK.KI","properties":{"hc-group":"admin1","hc-key":"sk-ki","hc-a2":"KI","labelrank":"7","hasc":"SK.KI","alt-name":"Ko?ice","woe-id":"20070497","subregion":"Vychodoslovensky","fips":"LO03","postal-code":"KI","name":"Ko?ický","country":"Slovakia","type-en":"Region","region":null,"longitude":"21.2753","woe-name":"Ko?ický","latitude":"48.6623","woe-label":"Kosicky, SK, Slovakia","type":"Kraj","hc-middle-lon":21.231,"hc-middle-lat":48.716}},{"type":"Polygon","arcs":[[-19,-7,-11,20]],"id":"SK.PV","properties":{"hc-group":"admin1","hc-key":"sk-pv","hc-a2":"PV","labelrank":"7","hasc":"SK.PV","alt-name":null,"woe-id":"20070496","subregion":"Vychodoslovensky","fips":"LO05","postal-code":"PV","name":"Pre?ov","country":"Slovakia","type-en":"Region","region":null,"longitude":"21.2037","woe-name":"Pre?ov","latitude":"49.1426","woe-label":"Presovsky, SK, Slovakia","type":"Kraj","hc-middle-lon":21.606,"hc-middle-lat":49.104}}],"hc-recommended-transform":{"default":{"crs":"+proj=utm +zone=34 +datum=WGS84 +units=m +no_defs","scale":0.00166586068118,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":192244.943042,"yoffset":5495519.95172}}}},"arcs":[[[734,1389],[-137,69],[-64,-80],[-41,77],[-97,88],[10,87],[-29,46],[20,155],[17,47],[-57,180],[-70,62],[-45,101],[-12,83],[-9,216],[-27,194],[-7,129],[-60,77],[-31,137],[6,125],[-46,86],[-55,56],[13,135],[15,287],[26,150],[46,135],[22,123],[61,138]],[[183,4292],[113,69],[79,6],[0,49],[138,-93],[97,95],[66,29],[105,210],[80,236],[51,-53],[26,-152],[-51,-184],[-28,-20],[-43,-113],[-8,-76],[95,-194],[-32,-61],[-41,-148],[6,-61],[51,-18],[34,-62],[44,-13],[1,-71],[57,-134],[29,-121],[60,-119],[-33,-169],[9,-84],[95,-158],[-47,-119],[1,-134],[44,-39],[0,-102],[27,-48],[-27,-136],[-29,-5],[-55,-89],[-47,-43],[-69,58],[4,87],[-34,-32],[-9,-68],[19,-74],[-70,-108],[-68,14],[-1,-125],[71,-64],[-55,-92],[-32,-20],[5,-77],[-68,-138],[-9,-139]],[[6358,3854],[-79,-187],[-21,-83],[-68,-429],[-81,-293],[-50,-106],[-41,-42],[-76,98],[-102,-145],[-64,15],[-22,-55],[-16,-134],[-27,-72],[-110,-121],[-107,-95],[-79,-153],[-41,-31],[-37,29],[-67,124],[-43,29],[-63,-49],[-34,55],[14,145],[-31,78],[-41,14],[-82,-33],[-75,152],[-37,11],[-161,-88],[-49,-115],[-16,-210],[-22,-89],[0,-122],[-94,-138],[-236,10],[-125,-146],[-218,55],[-139,-30]],[[3818,1703],[-2,118],[39,134],[40,85],[-4,201],[21,112],[-27,114],[-45,-78],[-26,2],[-126,-91],[-23,-82],[-105,11],[-68,69],[-31,-52],[-13,127],[39,104],[-21,87],[-1,143],[41,100],[23,197],[-68,323],[-57,106],[-50,153],[-38,-8],[-42,-92],[-46,-186],[-57,-37],[-132,-52],[-60,-134],[-18,61],[63,174],[0,209],[-41,106],[-22,177],[21,92],[-18,166],[-73,-6],[39,145],[-42,114]],[[2888,4315],[21,88],[172,43],[11,118],[86,240],[97,-52],[58,163],[41,161],[60,49],[57,244]],[[3491,5369],[97,120],[19,-74],[179,-32],[24,90],[7,147],[-23,44],[-4,263],[43,61],[20,95],[84,-9],[290,86],[35,-74],[-4,-117],[71,24],[25,37],[26,116],[37,43],[58,147],[296,103],[133,-35],[112,-84],[72,-105],[116,66],[65,-28],[168,-8],[56,37],[40,-37]],[[5533,6245],[253,-63],[61,54],[78,-57],[94,-116]],[[6019,6063],[-40,-26],[-91,-282],[5,-233],[-34,-91],[12,-154],[37,-41],[90,-150],[47,-257],[8,-143],[98,-100],[-49,-345],[-29,-139],[9,-124],[48,-84],[0,-45],[116,5],[82,47],[30,-47]],[[3491,5369],[-9,67],[-61,153],[-18,143],[-84,118],[-50,109],[5,228],[-11,103],[40,117],[-35,92],[-124,68],[-72,-33],[-24,63],[-45,-120],[-60,-62],[-63,31],[-25,68],[51,60],[55,126],[54,30],[59,143],[13,67],[2,190],[-38,91],[-38,28],[54,120],[-22,66],[-3,94],[-28,83],[-139,172],[-55,197],[-4,71],[-108,364],[-4,71],[-40,46]],[[2664,8533],[41,65],[5,256],[51,-23],[39,52],[75,184],[57,62],[24,77],[14,145],[35,46],[78,-23],[74,53],[108,-89],[50,5],[71,132],[105,29],[174,-32],[51,-61],[-16,-91],[16,-231],[-7,-177],[9,-61],[79,-6],[68,79],[38,19],[68,-79],[62,14],[54,44],[30,216],[27,3],[0,96],[27,175],[50,124],[62,45],[55,-2],[56,48],[169,372],[24,-20],[30,-104],[54,-84],[22,-108],[32,-272],[37,-211],[67,-65],[70,-3],[-14,-213],[102,-68],[73,-1],[58,47],[17,-24],[25,-193],[11,-261],[-11,-104],[41,-80],[-96,-302],[-8,-72],[23,-63],[44,-32],[81,-13],[64,81]],[[5309,7834],[39,-144],[18,-195],[19,-35],[39,31],[31,-102],[43,-59],[84,42],[6,-64],[-27,-443],[-65,-36],[-1,-35],[85,-228],[23,-148],[28,-48],[-38,-70],[-60,-55]],[[3818,1703],[-65,-21],[-253,-115],[-30,-53],[-47,-200],[-67,-63],[-23,-57],[21,-104],[-22,-337],[12,-101],[51,-104],[67,-103],[-86,-54],[-88,-186],[-43,-54],[-103,11],[-65,58],[-78,12],[-360,-87],[-130,-111],[-66,-12],[-216,45],[-504,-67],[-147,83],[-40,44]],[[1536,127],[21,71],[20,155],[51,6],[54,100],[12,178],[148,278],[-17,67],[9,119],[-16,61],[4,139],[-12,187],[4,168],[-54,46],[-2,83],[-56,-20],[-19,51],[19,94],[-9,82],[-78,176],[51,57],[34,-29],[23,85],[-25,131],[27,16],[32,-63],[49,66],[19,101],[-46,111],[-8,63],[29,170],[-44,85],[26,290],[29,59],[123,460],[39,86],[-117,227],[-89,91],[34,82],[61,310],[60,-35],[81,67],[5,79]],[[2008,4677],[34,74],[24,-1],[6,141],[-32,120],[-6,163],[22,43],[46,-19],[6,-57],[125,-55],[52,-99],[43,-140],[107,-105],[34,-88],[-40,-219],[27,-85],[21,0],[64,-102],[37,-197],[55,-34],[17,43],[23,-55],[93,157],[122,153]],[[2008,4677],[-170,75],[-19,49],[-40,-11],[-54,105],[-2,-40],[-103,2],[-42,49],[-35,112],[-24,25],[-105,-95],[-43,14],[-11,-111],[-56,-35],[-26,30],[-68,-102],[-38,169],[-49,127],[-24,120],[30,131],[-4,71],[-36,102],[-28,26],[-47,118],[-54,-85],[-60,40],[74,159],[21,112]],[[995,5834],[74,67],[79,-141],[65,-21],[337,270],[31,53],[61,210],[27,48],[114,8],[47,137],[25,247],[23,94],[80,61],[94,-15],[57,55],[52,97],[37,125],[11,119],[-2,273],[6,145],[23,177],[32,164],[43,139],[51,100],[237,185],[65,102]],[[1536,127],[-75,84],[-65,163],[-62,81],[-55,-26],[-82,230],[-95,91],[-181,498],[-55,94],[-132,47]],[[183,4292],[10,67],[-16,252],[4,104],[48,145],[89,519],[43,150],[86,173],[25,151],[95,139],[78,35],[85,-44],[200,-208],[65,59]],[[6019,6063],[26,49],[42,163],[53,67],[-27,65],[-47,46],[75,150],[116,104],[34,60],[86,-93],[47,35],[17,115],[15,-56],[102,-157],[59,-24],[25,-86],[31,-13],[61,61],[-3,56],[51,19],[110,-37],[-3,166],[100,-82],[38,-70],[56,25],[34,-62],[37,-11],[49,-66],[69,21],[17,-119],[63,-160],[36,13],[67,-47],[74,13],[36,-34],[48,-94],[36,15],[107,-82],[-33,-131],[70,-142],[44,2],[-1,96],[110,44],[16,73],[-4,122],[25,30],[39,-45],[7,73],[45,-76],[64,48],[31,-216],[69,-255],[111,-89],[102,-26],[69,-67],[42,61],[52,28],[79,103],[9,53],[-16,119],[-13,230],[2,137],[67,-5],[169,-112],[128,-170],[70,-21],[154,22],[10,50],[-13,114],[49,81],[66,182],[77,-34],[57,-299],[112,34],[82,-43]],[[9703,5984],[-16,-75],[6,-269],[-15,-99],[-46,-107],[-14,-303],[-50,-177],[-68,-58],[-34,-68],[-30,-125],[-115,-190],[-25,-88],[-5,-109],[21,-219],[-26,-172],[-2,-390],[-63,-137],[-33,-20],[-105,22],[-64,-26],[-91,-11],[-80,-83],[-75,-23],[-91,-96],[-54,-10],[-54,39],[-89,171],[-112,367],[-23,222],[-16,63],[-94,10],[-28,27],[-54,217],[-117,115],[-91,-60],[-89,-16],[-34,-41],[-46,-169],[-25,-30],[-74,85],[-58,-28],[-136,-133],[-44,21],[-36,72],[-101,64],[-106,5],[-96,119],[-80,26],[-52,97],[-56,28],[-371,-174],[-110,-17],[-50,-40],[-1,-256],[-27,-81]],[[5309,7834],[66,119],[56,13],[49,-52],[90,-172],[58,-57],[35,54],[18,134],[10,190],[22,51],[56,276],[52,11],[83,154],[135,23],[41,259],[39,29],[72,-56],[91,8],[-1,92],[28,13],[148,-152],[39,-18],[41,28],[66,129],[148,2],[156,-374],[27,-41],[98,-16],[89,-151],[73,17],[39,66],[57,170],[36,69],[98,26],[14,49],[-22,81],[-62,100],[36,79],[98,54],[27,-3],[84,-138],[68,69],[54,163],[32,44],[123,-116],[171,-98],[94,29],[26,-15],[58,48],[126,28],[33,-17],[69,-113],[57,-1],[89,-244],[27,-44],[73,140],[36,14],[97,-156],[94,-95],[63,-120],[51,-165],[33,-362],[50,-73],[125,-48],[57,-74],[94,-16],[19,-44],[12,-128],[83,-52],[97,8],[38,-29],[89,-180],[63,-40],[138,-13],[61,-61],[-26,-212],[-7,-216],[-28,-47],[-68,-20],[-30,-48],[-60,-323],[-5,-130],[-72,-159]]],"bbox":[16.844486642291773,47.75000717698358,22.539634039306165,49.60177739169969],"transform":{"scale":[0.0005695716968711263,0.00018519554102571374],"translate":[16.844486642291773,47.75000717698358]},"title":"Slovakia","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/maps/ge.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1]],"id":"GE.AB","properties":{"hc-group":"admin1","hc-key":"ge-ab","hc-a2":"AB","labelrank":"7","hasc":"GE.AB","alt-name":"Sokhumi","woe-id":"20070401","subregion":null,"fips":"GG02","postal-code":"AB","name":"Abkhazia","country":"Georgia","type-en":"Autonomous Republic","region":null,"longitude":"41.0701","woe-name":null,"latitude":"43.1479","woe-label":null,"type":"Avtonomiuri Respublika","hc-middle-lon":41.234,"hc-middle-lat":43.116}},{"type":"Polygon","arcs":[[2,3,4]],"id":"GE.AJ","properties":{"hc-group":"admin1","hc-key":"ge-aj","hc-a2":"AJ","labelrank":"7","hasc":"GE.AJ","alt-name":"Batumi","woe-id":"20070400","subregion":null,"fips":"GG04","postal-code":"AJ","name":"Ajaria","country":"Georgia","type-en":"Autonomous Republic","region":null,"longitude":"42.0537","woe-name":null,"latitude":"41.6552","woe-label":null,"type":"Avtonomiuri Respublika","hc-middle-lon":42.113,"hc-middle-lat":41.658}},{"type":"Polygon","arcs":[[-4,5,6,7,8]],"id":"GE.GU","properties":{"hc-group":"admin1","hc-key":"ge-gu","hc-a2":"GU","labelrank":"7","hasc":"GE.GU","alt-name":"Ozurgeti","woe-id":"-20070376","subregion":null,"fips":"GG65","postal-code":"GU","name":"Guria","country":"Georgia","type-en":"Region","region":null,"longitude":"42.1824","woe-name":null,"latitude":"41.9634","woe-label":null,"type":"Region","hc-middle-lon":42.08,"hc-middle-lat":41.986}},{"type":"Polygon","arcs":[[-7,9,-2,10,11,12]],"id":"GE.SZ","properties":{"hc-group":"admin1","hc-key":"ge-sz","hc-a2":"SZ","labelrank":"7","hasc":"GE.SZ","alt-name":"Zugdidi","woe-id":"-20070392","subregion":null,"fips":"GG71","postal-code":"SZ","name":"Samegrelo-Zemo Svaneti","country":"Georgia","type-en":"Region","region":null,"longitude":"42.3632","woe-name":null,"latitude":"42.5492","woe-label":null,"type":"Region","hc-middle-lon":42.21,"hc-middle-lat":42.711}},{"type":"Polygon","arcs":[[-8,-13,13,14,15]],"id":"GE.IM","properties":{"hc-group":"admin1","hc-key":"ge-im","hc-a2":"IM","labelrank":"7","hasc":"GE.IM","alt-name":"Kutaisi","woe-id":"-20070391","subregion":null,"fips":"GG66","postal-code":"IM","name":"Imereti","country":"Georgia","type-en":"Region","region":null,"longitude":"42.9894","woe-name":null,"latitude":"42.093","woe-label":null,"type":"Region","hc-middle-lon":42.911,"hc-middle-lat":42.148}},{"type":"Polygon","arcs":[[16,17,18]],"id":"GE.KA","properties":{"hc-group":"admin1","hc-key":"ge-ka","hc-a2":"KA","labelrank":"7","hasc":"GE.KA","alt-name":"Telavi","woe-id":"-20070369","subregion":null,"fips":"GG67","postal-code":"KA","name":"Kakheti","country":"Georgia","type-en":"Region","region":null,"longitude":"45.8579","woe-name":null,"latitude":"41.6527","woe-label":null,"type":"Region","hc-middle-lon":45.73,"hc-middle-lat":41.775}},{"type":"Polygon","arcs":[[19,-19,20,21,22,23]],"id":"GE.MM","properties":{"hc-group":"admin1","hc-key":"ge-mm","hc-a2":"MM","labelrank":"7","hasc":"GE.MM","alt-name":"Mtskheta","woe-id":"-20070363","subregion":null,"fips":"GG69","postal-code":"MM","name":"Mtskheta-Mtianeti","country":"Georgia","type-en":"Region","region":null,"longitude":"44.7435","woe-name":null,"latitude":"42.2106","woe-label":null,"type":"Region","hc-middle-lon":44.701,"hc-middle-lat":42.298}},{"type":"Polygon","arcs":[[-14,-12,24,25]],"id":"GE.RK","properties":{"hc-group":"admin1","hc-key":"ge-rk","hc-a2":"RK","labelrank":"7","hasc":"GE.RK","alt-name":"Ambrolauri","woe-id":"-20070380","subregion":null,"fips":"GG70","postal-code":"RK","name":"Racha-Lechkhumi-Kvemo Svaneti","country":"Georgia","type-en":"Region","region":null,"longitude":"43.1304","woe-name":null,"latitude":"42.6296","woe-label":null,"type":"Region","hc-middle-lon":43.149,"hc-middle-lat":42.644}},{"type":"Polygon","arcs":[[-22,26]],"id":"GE.TB","properties":{"hc-group":"admin1","hc-key":"ge-tb","hc-a2":"TB","labelrank":"9","hasc":"GE.TB","alt-name":null,"woe-id":"20070358","subregion":null,"fips":"GG51","postal-code":"TB","name":"Tbilisi","country":"Georgia","type-en":"Independent City","region":null,"longitude":"44.845","woe-name":null,"latitude":"41.7153","woe-label":null,"type":"K'alak'i","hc-middle-lon":44.806,"hc-middle-lat":41.725}},{"type":"Polygon","arcs":[[-18,27,28,29,-23,-27,-21]],"id":"GE.KK","properties":{"hc-group":"admin1","hc-key":"ge-kk","hc-a2":"KK","labelrank":"7","hasc":"GE.KK","alt-name":"Rustavi","woe-id":"-20070355","subregion":null,"fips":"GG68","postal-code":"KK","name":"Kvemo Kartli","country":"Georgia","type-en":"Region","region":null,"longitude":"44.5029","woe-name":null,"latitude":"41.4755","woe-label":null,"type":"Region","hc-middle-lon":44.47,"hc-middle-lat":41.458}},{"type":"Polygon","arcs":[[-29,30,-5,-9,-16,31]],"id":"GE.SJ","properties":{"hc-group":"admin1","hc-key":"ge-sj","hc-a2":"SJ","labelrank":"7","hasc":"GE.SJ","alt-name":"Akhaltsikhe","woe-id":"-20070348","subregion":null,"fips":"GG72","postal-code":"SJ","name":"Samtskhe-Javakheti","country":"Georgia","type-en":"Region","region":null,"longitude":"43.2296","woe-name":null,"latitude":"41.5149","woe-label":null,"type":"Region","hc-middle-lon":43.453,"hc-middle-lat":41.494}},{"type":"Polygon","arcs":[[-30,-32,-15,-26,32,-24]],"id":"GE.SD","properties":{"hc-group":"admin1","hc-key":"ge-sd","hc-a2":"SD","labelrank":"7","hasc":"GE.SD","alt-name":"Gori","woe-id":"-20070403","subregion":null,"fips":"GG73","postal-code":"SD","name":"Shida Kartli","country":"Georgia","type-en":"Region","region":null,"longitude":"43.9997","woe-name":null,"latitude":"42.1586","woe-label":null,"type":"Region","hc-middle-lon":43.987,"hc-middle-lat":41.989}}],"hc-recommended-transform":{"default":{"crs":"+proj=utm +zone=38 +datum=WGS84 +units=m +no_defs","scale":0.00127718047369,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":93873.2068269,"yoffset":4836136.63523}}}},"arcs":[[[2333,5379],[-76,924],[-26,158],[-38,132],[-49,104],[-61,68],[-113,41],[-49,69],[-74,68],[-30,8],[-47,-46],[-35,12],[-67,200],[-35,245],[-62,210],[-26,113],[-37,-2],[-57,-52],[-39,25],[-115,318],[-109,83],[-149,39],[-153,-21],[-77,132],[-75,46],[-119,112],[-56,13],[-39,-97],[-51,188],[-48,110],[6,125],[-23,116],[-57,164],[-128,90],[-47,93],[-172,94],[8,69],[102,509],[55,107],[101,53],[102,-1],[368,-264],[60,-14],[46,23],[97,98],[53,13],[44,-44],[88,-130],[153,-102],[48,-54],[204,-317],[45,-21],[156,39],[51,-21],[94,-121],[52,-42],[106,40],[45,-34],[35,-132],[36,-73],[78,-47],[39,-45],[66,-132],[41,-43],[53,-10],[110,30],[54,-12],[97,-54],[47,-9],[103,22],[88,-28],[93,-71],[96,12],[118,128]],[[3232,8583],[-38,-196],[7,-222],[-21,-111],[-93,-264],[-78,-64],[-145,-52],[-34,-90],[26,-65],[43,-346],[-58,-117],[26,-260],[4,-200],[42,-140],[10,-170],[-13,-71],[-58,-82],[-25,-74],[-118,-222],[-133,-152],[-74,-49],[-53,-131],[-116,-126]],[[3876,2110],[-32,-47],[-15,-65],[-14,-161],[-92,-268],[-31,-39],[-38,-4],[-261,203],[-109,-4],[-47,73],[-69,-26],[-42,26],[-95,-59],[-107,81],[-81,-80],[-46,-132],[-74,-119],[-77,125],[-64,24],[-23,40],[-1,77],[-49,-34],[-63,0],[-159,133],[98,350],[44,118],[90,117],[25,118],[69,229],[7,113],[45,169],[-1,320]],[[2664,3388],[196,-18],[62,-73],[8,-84],[73,-60],[92,-124],[59,34],[72,17],[75,-79],[44,-22],[108,33],[79,99],[40,25],[34,-15],[57,-116],[57,-27]],[[3720,2978],[21,-123],[-1,-136],[-21,-127],[24,-105],[75,-154],[43,-139],[15,-84]],[[2664,3388],[-26,411],[-61,210]],[[2577,4009],[33,103],[27,185],[93,36],[96,5],[185,61],[82,-39],[76,-101],[95,-24],[79,-78]],[[3343,4157],[-34,-104],[36,-104],[101,-42],[70,74],[54,-25],[28,-94],[20,-115],[43,-52],[53,-31],[38,-57],[100,-102],[47,6],[45,-24],[23,-172],[3,-199]],[[3970,3116],[-38,-2],[-33,-45],[-39,-112],[-66,36],[-74,-15]],[[2577,4009],[-45,156],[-31,59],[-22,388],[-79,542],[-56,132],[-11,93]],[[3232,8583],[46,32],[252,41],[102,-28],[84,-110],[83,-142],[91,-99],[49,4],[67,99],[46,1],[70,41],[59,-2],[58,-30],[126,-184],[127,-93],[-15,-180],[13,-43],[74,-99],[160,-294],[29,-32]],[[4753,7465],[-48,-38],[-51,-140],[-34,-59],[-3,-124],[-27,-82],[-41,14],[-93,69],[-109,-28],[-162,143],[-77,-85],[-88,6],[-285,137],[-34,-139],[-35,-32],[-55,-9],[-47,-51],[-36,-137],[81,-137],[167,-187],[68,-134],[-40,-166],[114,-443]],[[3918,5843],[-131,-27],[-45,-91],[-23,-136],[-38,-101],[-1,-115],[-20,-93],[-105,-236],[-64,-211],[-17,-103],[-29,-65],[-14,-164],[2,-208],[-31,-123],[-59,-13]],[[3918,5843],[12,-91],[14,-258],[159,104],[77,-36],[33,65],[36,2],[83,-102],[76,-138],[19,-125],[36,-60],[33,-11],[71,-77],[107,17],[62,51],[53,105],[141,146],[159,-34],[151,24],[127,-91]],[[5367,5334],[53,-65],[59,-16],[83,63],[48,14],[34,-80],[-18,-126],[-1,-129],[-114,-61],[-101,-142],[-12,-117],[9,-125],[-8,-105],[-42,-75],[-47,-215],[-90,-155],[-5,-167],[-23,-141],[-53,-95],[-12,-153]],[[5127,3444],[-445,-360],[-50,25],[-153,-27],[-64,-53],[-67,2],[-129,55],[-157,-80],[-92,110]],[[7923,5985],[31,-117],[50,-40],[63,17],[120,71],[86,-5],[125,-43],[116,-90],[61,-143],[-4,-93],[-172,-882],[15,-91],[105,-113],[164,-226],[103,-54],[21,-40],[42,-206],[37,-66],[71,42],[47,-66],[47,13],[24,-106],[36,-34],[46,-1],[102,44],[39,-8],[39,-62],[65,-155],[43,-39],[88,-14],[36,-40],[37,-97],[-57,-233],[-32,-102],[-64,-156],[-46,-61],[-101,26],[-32,-8],[-29,-61],[-14,-134],[1,-201],[19,-177],[40,-68],[30,88],[21,3],[37,-149],[27,-268],[25,-66],[78,-108],[48,-31],[70,-130],[145,-121],[73,-88],[24,-110],[22,17],[52,-113],[56,-202],[-30,-31],[-5,-101],[-40,-111],[-15,-108],[-20,-261],[-29,-82],[-86,12],[-32,-40],[-38,-166],[-59,29],[-67,157],[-88,58],[-31,37],[-88,159],[-67,155],[-27,19],[-112,-1],[-33,-15],[-77,-101],[-65,-27],[-73,18],[-221,159],[-103,128],[-62,105],[-35,114],[32,82],[55,48],[-36,51],[-97,39],[-214,168],[-70,139],[-71,-20],[-54,4],[-71,74]],[[7970,1579],[-38,264],[-27,78],[-94,35],[-27,34],[-19,183],[51,236],[-40,338],[-27,106],[-57,13],[-48,70],[-72,196]],[[7572,3132],[-20,115],[-47,56],[40,86],[44,54],[82,-105],[119,34],[-53,128],[-142,67],[-15,122],[24,108],[-27,126],[-22,262],[20,92],[23,226],[28,90],[32,200],[75,159],[60,31],[13,154],[-19,157],[15,93],[33,57],[23,101],[-5,120],[21,180],[49,140]],[[6259,6248],[67,109],[27,110],[35,82],[132,5],[60,39],[117,120],[117,36],[64,-16],[62,-39],[55,-62],[85,-181],[37,-232],[31,-9],[25,218],[52,246],[38,99],[66,-25],[162,-228],[54,-38],[111,67],[49,-37],[43,-73],[146,-350],[29,-104]],[[7572,3132],[-74,-9],[-76,34],[-31,-25],[-26,-72],[-18,-111],[-35,-85]],[[7312,2864],[-92,95],[-37,5],[-23,-81],[-43,-54],[-42,3],[-31,-135],[-29,-23],[-18,-65]],[[6997,2609],[-78,-78],[-70,125],[-69,100],[-83,21]],[[6697,2777],[0,102],[29,67],[-5,153],[41,79],[55,5],[20,111],[-40,126],[-49,112],[-30,266],[-52,57],[-107,47],[-51,3],[-87,-143],[-6,102],[-42,44],[-6,65],[13,79],[4,203],[23,193],[36,56],[23,101],[57,114],[-12,124],[-25,106],[2,243],[-41,92],[-10,126],[-26,59],[22,142],[48,116],[-49,111],[-49,173],[-71,39],[-31,82],[-22,116]],[[4753,7465],[29,-31],[425,-233],[56,-29],[103,-97],[87,-186],[28,-35],[138,-66],[67,-66],[16,-115],[-34,-96],[-94,-152],[-5,-117],[43,-103],[66,-36],[74,-10],[60,-31],[34,-51]],[[5846,6011],[-9,-200],[-80,-112],[-32,-116],[-29,-26],[-207,-33],[-122,-190]],[[7312,2864],[-43,-83],[-4,-68],[29,-52],[17,-138],[23,-40],[61,-45],[34,18],[43,94],[15,-97],[-43,-124],[-56,-36],[-57,7],[-43,41],[-73,25],[-122,123],[-44,-4],[-25,110],[-27,14]],[[7970,1579],[-77,33],[-48,-34],[-368,-608],[-71,-110],[-56,-4],[-144,47],[-29,-60],[12,-56],[56,-53],[1,-87],[-39,-11],[-219,10],[-92,59],[-32,-29],[-60,-154],[-30,18],[-21,100],[-56,-83],[-36,-22],[-67,30],[-79,96],[-36,-6],[-37,-68],[-62,10],[-73,101],[-39,34],[-34,-26],[-12,-101],[-54,-78],[-31,-12],[-63,35],[-30,-6],[-95,-71]],[[5949,473],[-15,205],[-35,121],[-10,175],[21,173],[-21,161],[-31,39],[-12,91],[-11,226],[-41,138],[-39,83],[-71,7],[-71,-36],[-66,-5],[-53,19],[32,99],[16,95],[8,396],[35,123],[65,-21],[90,6],[73,154]],[[5813,2722],[345,-65],[93,45],[70,-35],[72,26],[90,86],[51,-83],[35,-27],[104,5],[24,103]],[[5949,473],[-32,-16],[-138,-6],[-64,-54],[-69,-122],[-67,-31],[-242,68],[-64,-4],[-80,-65],[-45,0],[17,103],[-20,95],[-81,121],[-47,25],[-44,-5],[-137,-78],[-22,32],[-36,176],[-29,67],[-63,1],[-40,25],[80,83],[42,95],[-91,75],[-72,127],[-109,149],[-23,48],[-44,167],[-47,87],[-55,43],[-32,120],[-56,-110],[-28,18],[-67,108],[54,118],[26,150],[-28,28],[-209,35],[-111,-36]],[[5127,3444],[42,5],[97,-47],[53,-49],[22,-118],[85,-166],[46,-15],[22,-105],[100,-94],[56,16],[100,3],[63,-152]],[[5846,6011],[47,-57],[49,48],[58,144],[65,59],[142,13],[52,30]]],"bbox":[39.985978142660485,41.04489221593127,46.694799749038935,43.57584549790734],"transform":{"scale":[0.0006709492555634013,0.0002531206402616329],"translate":[39.985978142660485,41.04489221593127]},"title":"Georgia","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/maps/at.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0]],"id":"AT.WI","properties":{"hc-group":"admin1","hc-key":"at-wi","hc-a2":"WI","labelrank":"9","hasc":"AT.WI","alt-name":"Vienna|Viena","woe-id":"2344716","subregion":null,"fips":"AU09","postal-code":"WI","name":"Wien","country":"Austria","type-en":"State","region":null,"longitude":"16.3798","woe-name":"Wien","latitude":"48.2247","woe-label":"Vienna, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":16.41,"hc-middle-lat":48.233}},{"type":"Polygon","arcs":[[1,2]],"id":"AT.VO","properties":{"hc-group":"admin1","hc-key":"at-vo","hc-a2":"VO","labelrank":"6","hasc":"AT.VO","alt-name":null,"woe-id":"2344715","subregion":null,"fips":"AU08","postal-code":"VO","name":"Vorarlberg","country":"Austria","type-en":"State","region":null,"longitude":"9.873749999999999","woe-name":"Vorarlberg","latitude":"47.2617","woe-label":"Vorarlberg, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":9.892,"hc-middle-lat":47.216}},{"type":"Polygon","arcs":[[3,4,5]],"id":"AT.BU","properties":{"hc-group":"admin1","hc-key":"at-bu","hc-a2":"BU","labelrank":"6","hasc":"AT.BU","alt-name":"Burgenlândia","woe-id":"2344708","subregion":null,"fips":"AU01","postal-code":"BU","name":"Burgenland","country":"Austria","type-en":"State","region":null,"longitude":"16.3584","woe-name":"Burgenland","latitude":"47.4281","woe-label":"Burgenland, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":16.712,"hc-middle-lat":47.862}},{"type":"Polygon","arcs":[[-5,6,7,8,9,10]],"id":"AT.ST","properties":{"hc-group":"admin1","hc-key":"at-st","hc-a2":"ST","labelrank":"6","hasc":"AT.ST","alt-name":"Styria|Est¡ria|Estiria","woe-id":"2344713","subregion":null,"fips":"AU06","postal-code":"ST","name":"Steiermark","country":"Austria","type-en":"State","region":null,"longitude":"14.8565","woe-name":"Steiermark","latitude":"47.3901","woe-label":"Styria, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":15.065,"hc-middle-lat":47.298}},{"type":"Polygon","arcs":[[-8,11,12,13]],"id":"AT.KA","properties":{"hc-group":"admin1","hc-key":"at-ka","hc-a2":"KA","labelrank":"6","hasc":"AT.KA","alt-name":"Carinthia|Caríntia|Carintia","woe-id":"2344709","subregion":null,"fips":"AU02","postal-code":"KA","name":"Kärnten","country":"Austria","type-en":"State","region":null,"longitude":"13.8695","woe-name":"Kärnten","latitude":"46.7201","woe-label":"Carinthia, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":14.047,"hc-middle-lat":46.752}},{"type":"Polygon","arcs":[[-10,14,15,16]],"id":"AT.OO","properties":{"hc-group":"admin1","hc-key":"at-oo","hc-a2":"OO","labelrank":"6","hasc":"AT.OO","alt-name":"Upper Austria|Alta-Áustria|Alta Austria|Österreich ober der Enns|Oberösterreich","woe-id":"2344711","subregion":null,"fips":"AU04","postal-code":"OO","name":"Oberösterreich","country":"Austria","type-en":"State","region":null,"longitude":"13.856","woe-name":"Oberösterreich","latitude":"48.2377","woe-label":"Upper Austria, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":13.921,"hc-middle-lat":48.249}},{"type":"Polygon","arcs":[[-9,-14,17,18,19,20,-15]],"id":"AT.SZ","properties":{"hc-group":"admin1","hc-key":"at-sz","hc-a2":"SZ","labelrank":"7","hasc":"AT.SZ","alt-name":"Salzburgo","woe-id":"2344712","subregion":null,"fips":"AU05","postal-code":"SZ","name":"Salzburg","country":"Austria","type-en":"State","region":null,"longitude":"13.0106","woe-name":"Salzburg","latitude":"47.2534","woe-label":"Salzburg, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":13.102,"hc-middle-lat":47.332}},{"type":"MultiPolygon","arcs":[[[-13,21,-18]],[[22,-3,23,-20]]],"id":"AT.TR","properties":{"hc-group":"admin1","hc-key":"at-tr","hc-a2":"TR","labelrank":"6","hasc":"AT.TR","alt-name":"Tyrol","woe-id":"2344714","subregion":null,"fips":"AU07","postal-code":"TR","name":"Tirol","country":"Austria","type-en":"State","region":null,"longitude":"11.38","woe-name":"Tirol","latitude":"47.2082","woe-label":"Tyrol, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":11.187,"hc-middle-lat":47.208}},{"type":"Polygon","arcs":[[-11,-17,24,-6],[-1]],"id":"AT.NO","properties":{"hc-group":"admin1","hc-key":"at-no","hc-a2":"NO","labelrank":"6","hasc":"AT.NO","alt-name":"Lower Austria|Baixa-Áustria|Baja Austria|Niederdonau|Österreich unter der Enns","woe-id":"2344710","subregion":null,"fips":"AU03","postal-code":"NO","name":"Niederösterreich","country":"Austria","type-en":"State","region":null,"longitude":"15.7448","woe-name":"Niederösterreich","latitude":"48.2477","woe-label":"Lower Austria, AT, Austria","type":"Bundesländ|Länd","hc-middle-lon":15.563,"hc-middle-lat":48.151}}],"hc-recommended-transform":{"default":{"crs":"+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs","scale":0.00122132554851,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":-288444.120202,"yoffset":431577.633379}}}},"arcs":[[[9122,7269],[42,44],[34,-86],[24,-119],[-17,-196],[38,-169],[-91,33],[-81,-17],[-39,-84],[-30,2],[-54,52],[-69,-13],[-81,13],[-39,95],[11,109],[-29,103],[25,121],[33,-29],[34,12],[33,62],[88,111],[69,56],[16,48],[40,-9],[43,-139]],[[792,1780],[-75,37],[-81,129],[-140,91],[-48,95],[5,237],[-12,51],[-247,155],[-115,3],[36,90],[9,99],[-13,98],[-31,85],[-40,45],[15,117],[-30,120],[9,53],[-34,75],[42,141],[44,106],[18,128],[65,183],[0,161],[-37,65],[-49,44],[-39,115],[70,-44],[25,42],[56,-45],[26,82],[72,-1],[-35,102],[46,134],[38,25],[34,-47],[7,-132],[26,-26],[34,26],[78,-34],[36,32],[3,-63],[31,-68],[28,-113],[39,43],[64,-186],[5,-85],[-29,-46],[26,-149],[75,-10],[21,41],[58,21],[24,-25],[-1,-69],[-30,-226],[-40,-85],[26,-1]],[[857,3396],[22,-109],[15,-170],[-1,-144],[-20,-94],[-51,-152],[-13,-72],[-18,-211],[6,-140],[-11,-113],[-48,-110],[-1,-69],[30,-97],[25,-135]],[[9887,6589],[22,-56],[-27,-142],[21,-31],[-7,-63],[73,-61],[30,-53],[-82,-135],[14,-32],[-28,-129],[17,-20],[-14,-118],[-35,-70],[-62,-36],[1,-42],[46,-58],[22,-94],[-20,-44],[13,-266],[32,-85],[-26,-24],[-96,-26],[-104,-52],[-50,19],[-19,100],[-69,-142],[-74,22],[-28,46],[-23,114],[-121,102],[-55,14],[-48,-41],[-24,-141],[-76,-93],[-21,34],[-41,-111],[97,-85],[36,15],[87,-68],[43,14],[29,-26],[34,-136],[-7,-76],[40,-59],[9,-107],[-14,-48],[-53,-64],[5,-152],[-68,-105],[-141,-125],[-33,73],[-30,-56],[4,-146],[-16,-28],[59,-220],[-4,-113],[-59,-78],[4,-66],[-20,-83],[5,-64],[29,-13],[-2,-144],[18,-23],[44,42],[38,-50],[-36,-122],[-28,-34],[1,-107],[41,-32],[0,-41],[-90,-94],[56,-23],[25,-76],[-100,-30],[-29,44],[-81,-7],[-67,16],[-18,-100],[-37,-46],[-3,-66],[-94,-145],[-47,-130],[-125,-149]],[[8530,1742],[-1,58],[-31,94],[20,174],[47,82],[64,167],[43,139],[-2,58],[-59,162],[-7,92],[14,221],[-36,276],[-12,203],[-27,200],[-23,108],[2,65],[34,81],[32,-60],[24,27],[75,156]],[[8687,4045],[109,10],[54,68],[68,143],[-3,267],[71,279],[-83,219],[-30,114],[0,233],[45,9],[32,61],[13,79],[3,147],[40,118],[63,97],[84,27],[92,-60],[51,52],[89,146],[32,142],[61,78],[30,1],[55,51],[53,75],[58,34],[81,-99],[27,84],[0,114],[27,42],[41,-34],[37,47]],[[8530,1742],[-53,-27],[-12,-79],[-11,-252],[16,-93],[43,-93],[3,-89],[-39,82],[-54,20],[-89,89],[-73,8],[-89,-72],[-134,26],[-22,25],[-12,-138],[-30,-31],[-48,12],[-48,-46],[-25,-134],[-64,-53],[-59,88],[-39,29],[-240,-24],[-130,28]],[[7321,1018],[-93,215],[-16,91],[-3,127],[-44,310],[25,149],[3,114],[-103,313],[-51,126],[-53,55],[-145,-69],[-161,-23],[-36,28],[-121,-5],[-134,-94],[-167,118],[-87,103],[-85,-11],[-144,-136],[-31,-57],[-31,-114],[-49,-46],[-81,-125],[-47,-19],[-81,120]],[[5586,2188],[50,127],[57,207],[22,116],[-1,124],[75,171],[-7,72],[-39,55],[-54,145],[-17,109],[-49,174],[-18,21],[-76,-46],[-59,-59],[-83,118],[-34,141],[-39,255],[-12,136],[21,155]],[[5323,4209],[122,-46],[65,91],[15,69],[-7,114],[-64,195],[-5,76],[13,177],[38,77],[140,138],[170,-100],[57,17],[60,-138],[23,-138],[34,37],[143,82],[75,-101],[55,-39],[70,18],[92,126],[78,75],[19,65],[189,147],[84,133]],[[6789,5284],[45,-72],[137,2],[59,-98],[60,7],[112,98],[54,-6],[172,112],[56,147],[63,-14],[81,38],[46,-23],[55,-98],[109,-104],[51,-71],[88,-16],[43,-98],[43,-51],[56,-9],[16,-44],[22,-204],[27,-14],[43,48],[42,-50],[-1,-164],[50,-14],[34,-51],[33,-147],[107,-36],[64,-67],[43,38],[43,-201],[45,-77]],[[7321,1018],[-58,11],[-74,-47],[-50,-141],[-43,80],[-48,-58],[-61,-17],[-38,-129],[-43,-231],[-37,-39],[-67,-14],[-39,-128],[-118,-94],[-43,-190],[-22,-21],[-50,151],[-46,-22],[-61,45],[-18,57],[-59,-13],[-278,15],[-90,138],[-41,31],[-88,-9],[-121,114],[-39,13],[-103,-30],[-87,43],[-60,-1],[-158,104],[-56,3],[-38,64],[-80,-13],[-57,20],[-134,-56],[-52,6],[-112,124],[-107,50],[-307,44],[-74,96],[-45,30],[-30,-18],[-59,55]],[[4130,1041],[50,199],[19,167],[28,27],[117,36],[53,46],[29,-7],[46,-70],[17,69],[-79,217],[-74,166],[-18,162],[-67,144],[-33,109],[-5,71],[22,135],[-10,71],[-112,74],[-29,57],[-4,74]],[[4080,2788],[42,93],[28,-18],[112,-125],[123,-49],[63,-39],[105,-134],[85,-44],[99,9],[52,22],[68,67],[64,110],[43,13],[173,-94],[160,-60],[58,-10],[80,-69],[113,-172],[38,-100]],[[5323,4209],[-75,94],[-47,94],[-12,109],[35,146],[-22,148],[48,289],[-16,66],[-80,59],[1,74],[72,12],[17,40],[-31,54],[-237,103],[-32,60],[-27,271],[6,153],[25,63],[72,-14],[14,58],[-76,112],[-90,-80],[-75,-18],[-50,10],[-64,50],[-71,117],[-89,3],[-40,-40],[-14,-74],[-103,-73]],[[4362,6095],[-23,126],[-93,188],[-30,133],[10,78],[102,153],[40,111],[32,45],[73,28],[131,207],[136,104],[180,60],[44,49],[128,216],[18,60],[25,184],[-2,108],[26,143],[1,70],[-22,136],[19,46],[86,43],[136,-73],[64,-114],[57,-53],[23,146],[42,14],[47,184],[-2,240],[21,77],[-40,111],[39,158],[53,-25],[78,-108],[88,-93],[66,-197],[-36,-59],[46,-145],[45,-35],[185,-42],[130,-87],[118,108],[21,41],[30,149],[18,25],[32,-71],[52,-52],[75,37],[30,-60],[42,-9],[33,-97],[42,37]],[[6778,8390],[27,-55],[82,-36],[85,-77],[48,-12],[40,-45],[9,-104],[-35,2],[-5,-110],[36,-119],[31,-23],[8,-123],[31,-70],[15,-188],[-9,-413],[-51,72],[-88,-27],[-58,-119],[-187,-89],[-50,56],[-35,100],[-60,80],[-59,2],[-46,-100],[-20,-238],[14,-145],[-46,-188],[-23,-41],[23,-55],[212,-311],[110,-90],[56,-74],[23,-61],[-1,-72],[-23,-66],[-18,-140],[-3,-134],[-22,-93]],[[4080,2788],[-73,121],[-133,45],[-104,-25],[-22,-20],[-78,-150],[-153,-143]],[[3517,2616],[-31,69],[-62,-25]],[[3424,2660],[-2,163],[-15,89],[-47,120],[-3,110],[22,206],[-4,76],[37,37],[58,6],[147,103],[46,56],[35,-1],[67,-46],[84,49],[29,73],[30,124],[87,30],[60,101],[28,119],[57,182],[-29,151],[1,123],[-90,154],[-34,114]],[[3988,4799],[46,81],[71,46],[143,-30],[-13,-67],[81,-143],[-36,-35],[-16,-87],[7,-94],[65,-68],[71,-147],[79,-105],[35,20],[51,-21],[37,86],[-12,185],[16,72],[-2,88],[44,147],[4,92],[-14,103],[-58,149],[-73,-29],[-73,26],[-22,43],[33,102],[13,103],[84,264],[-34,96],[-45,199],[-90,144],[-18,76]],[[4130,1041],[-67,15],[-76,-20],[-82,80],[-71,24],[-53,44],[-45,80],[-37,205],[-97,89],[10,172],[-13,130],[-21,28],[-72,18],[-31,73],[-59,36],[19,39],[-39,280],[13,67],[79,88],[29,127]],[[3424,2660],[-22,-8],[-132,-138],[-94,-8],[-114,-98],[-45,-73],[-60,-18],[-40,-61],[-39,13],[-43,61],[-114,33],[-107,-41],[-33,54],[-49,-11],[-55,-116],[-40,5],[-87,59],[-92,-30],[-114,-88],[-85,-167],[-48,-351],[-76,-193],[-87,19],[-66,-37],[-74,61],[-38,-14],[-53,53],[-49,16],[42,93],[-14,39],[-100,118],[-44,6],[-133,-72],[-53,12],[-43,67],[-4,82],[17,129],[-8,64],[-55,99],[-28,87],[-35,39],[-38,-45],[-56,-161],[0,-71],[-80,1],[-44,-214],[-100,-75]],[[857,3396],[84,21],[87,93],[50,109],[29,114],[60,77],[41,133],[12,86],[-12,161],[-30,45],[14,187],[-21,118],[52,31],[0,-134],[37,-52],[56,-15],[32,31],[45,99],[32,-2],[173,-129],[16,-50],[50,4],[89,54],[45,-58],[-54,-83],[77,-93],[65,-139],[-6,-87],[32,-72],[136,-3],[26,14],[86,117],[61,-4],[-3,-103],[60,18],[62,131],[102,36],[6,67],[-30,28],[61,138],[31,14],[61,-26],[90,42],[24,52],[26,163],[42,73],[81,-24],[107,-1],[74,-30],[41,90],[110,46],[301,-26],[48,99],[0,182],[-34,105],[86,100],[-25,-138],[21,-64],[72,42],[76,-31],[73,45],[21,-8],[38,-158],[58,-80],[54,10],[33,38]],[[6778,8390],[12,111],[4,219],[25,76],[69,117],[33,199],[88,-3],[68,-53],[26,4],[15,66],[-17,86],[40,312],[-5,331],[23,136],[29,8],[73,-48],[102,-16],[15,-105],[-9,-106],[126,50],[32,121],[95,-28],[179,-146],[65,-107],[108,-80],[102,-111],[59,-12],[69,61],[52,5],[28,-84],[60,-31],[29,-85],[163,-235],[69,-57],[121,13],[237,-73],[36,37],[65,219],[24,28],[74,11],[174,-101],[25,-145],[88,-27],[92,-91],[97,38],[31,-84],[18,-251],[46,-101],[11,-178],[-9,-68],[-43,-77],[-51,-182],[-19,-105],[-22,-297],[76,-99],[-4,-88],[23,-98],[45,-53],[25,-228],[15,-211],[34,-70],[53,-44],[20,-71]]],"bbox":[9.521156931259416,46.37865484509136,17.14835053194834,49.009776862605385],"transform":{"scale":[0.0007627956396328556,0.00026313851560296267],"translate":[9.521156931259416,46.37865484509136]},"title":"Austria","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/maps/za.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]],[[1,2,3,4,5,6]]],"id":"ZA.EC","properties":{"hc-group":"admin1","hc-key":"za-ec","hc-a2":"EC","labelrank":"2","hasc":"ZA.EC","alt-name":"Oos-Kaap","woe-id":"2346979","subregion":null,"fips":"SF01","postal-code":"EC","name":"Eastern Cape","country":"South Africa","type-en":"Province","region":null,"longitude":"26.6417","woe-name":"Eastern Cape","latitude":"-32.0622","woe-label":"Eastern Cape, ZA, South Africa","type":"Provinsie","hc-middle-lon":26.591,"hc-middle-lat":-32.099}},{"type":"Polygon","arcs":[[7,8,9,10]],"id":"ZA.NP","properties":{"hc-group":"admin1","hc-key":"za-np","hc-a2":"NP","labelrank":"2","hasc":"ZA.NP","alt-name":"Noordelike Provinsie|Northern Transvaal|Northern Province","woe-id":"2346986","subregion":null,"fips":"SF05","postal-code":"NP","name":"Limpopo","country":"South Africa","type-en":"Province","region":null,"longitude":"29.1301","woe-name":"Limpopo","latitude":"-23.5859","woe-label":"Limpopo, ZA, South Africa","type":"Provinsie","hc-middle-lon":29.564,"hc-middle-lat":-23.686}},{"type":"Polygon","arcs":[[11,12,13,14,-3],[-1]],"id":"ZA.NL","properties":{"hc-group":"admin1","hc-key":"za-nl","hc-a2":"NL","labelrank":"2","hasc":"ZA.NL","alt-name":"Natal and Zululand","woe-id":"2346982","subregion":null,"fips":"SF03","postal-code":"NL","name":"KwaZulu-Natal","country":"South Africa","type-en":"Province","region":null,"longitude":"30.8231","woe-name":"KwaZulu-Natal","latitude":"-28.7468","woe-label":"Kwazulu Natal, ZA, South Africa","type":"Provinsie","hc-middle-lon":30.695,"hc-middle-lat":-28.788}},{"type":"Polygon","arcs":[[15,16,-5]],"id":"ZA.WC","properties":{"hc-group":"admin1","hc-key":"za-wc","hc-a2":"WC","labelrank":"2","hasc":"ZA.WC","alt-name":"Wes-Kaap","woe-id":"2346987","subregion":null,"fips":"SF09","postal-code":"WC","name":"Western Cape","country":"South Africa","type-en":"Province","region":null,"longitude":"20.9745","woe-name":"Western Cape","latitude":"-33.5035","woe-label":"Western Cape, ZA, South Africa","type":"Provinsie","hc-middle-lon":20.897,"hc-middle-lat":-33.413}},{"type":"Polygon","arcs":[[17,18,19,-6,-17]],"id":"ZA.NC","properties":{"hc-group":"admin1","hc-key":"za-nc","hc-a2":"NC","labelrank":"2","hasc":"ZA.NC","alt-name":"Noord-Kaap","woe-id":"2346985","subregion":null,"fips":"SF06","postal-code":"NC","name":"Northern Cape","country":"South Africa","type-en":"Province","region":null,"longitude":"20.9961","woe-name":"Northern Cape","latitude":"-29.7437","woe-label":"Northern Cape, ZA, South Africa","type":"Provinsie","hc-middle-lon":21.278,"hc-middle-lat":-30.205}},{"type":"Polygon","arcs":[[20,-11,21,22,-19]],"id":"ZA.NW","properties":{"hc-group":"admin1","hc-key":"za-nw","hc-a2":"NW","labelrank":"2","hasc":"ZA.NW","alt-name":"North-West|Noordwes","woe-id":"2346984","subregion":null,"fips":"SF06","postal-code":"NW","name":"North West","country":"South Africa","type-en":"Province","region":null,"longitude":"25.7403","woe-name":"North West","latitude":"-26.3999","woe-label":"North-west, ZA, South Africa","type":"Provinsie","hc-middle-lon":25.168,"hc-middle-lat":-26.609}},{"type":"Polygon","arcs":[[23,-7,-20,-23,24,25,-13]],"id":"ZA.FS","properties":{"hc-group":"admin1","hc-key":"za-fs","hc-a2":"FS","labelrank":"2","hasc":"ZA.FS","alt-name":"Free State|Vrystaat","woe-id":"2346980","subregion":null,"fips":"SF07","postal-code":"FS","name":"Orange Free State","country":"South Africa","type-en":"Province","region":null,"longitude":"26.4914","woe-name":"Orange Free State","latitude":"-28.5815","woe-label":"Free State, ZA, South Africa","type":"Provinsie","hc-middle-lon":26.867,"hc-middle-lat":-28.561}},{"type":"Polygon","arcs":[[-25,-22,-10,26]],"id":"ZA.GT","properties":{"hc-group":"admin1","hc-key":"za-gt","hc-a2":"GT","labelrank":"2","hasc":"ZA.GT","alt-name":"Pretoria/Witwatersrand/Vaal","woe-id":"2346981","subregion":null,"fips":"SF08","postal-code":"GT","name":"Gauteng","country":"South Africa","type-en":"Province","region":null,"longitude":"28.2074","woe-name":"Gauteng","latitude":"-26.1682","woe-label":"Gauteng, ZA, South Africa","type":"Provinsie","hc-middle-lon":28.182,"hc-middle-lat":-25.962}},{"type":"Polygon","arcs":[[-14,-26,-27,-9,27]],"id":"ZA.MP","properties":{"hc-group":"admin1","hc-key":"za-mp","hc-a2":"MP","labelrank":"2","hasc":"ZA.MP","alt-name":"Eastern Transvaal","woe-id":"2346983","subregion":null,"fips":"SF02","postal-code":"MP","name":"Mpumalanga","country":"South Africa","type-en":"Province","region":null,"longitude":"30.1421","woe-name":"Mpumalanga","latitude":"-25.9893","woe-label":"Mpumalanga, ZA, South Africa","type":"Provinsie","hc-middle-lon":30.013,"hc-middle-lat":-25.892}}],"hc-recommended-transform":{"default":{"crs":"+proj=utm +zone=35 +south +datum=WGS84 +units=m +no_defs","scale":0.000432536046037,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":-532269.970625,"yoffset":7550773.64074}}}},"arcs":[[[8055,3730],[75,1],[27,-57],[148,-211],[-43,-10],[-18,-80],[-35,-29],[-106,56],[-90,-5],[-53,120],[-25,97],[-37,39],[1,52],[33,91],[123,-64]],[[6641,3545],[50,-4],[84,-136],[89,-86],[77,-6],[127,-41],[-2,41],[40,83],[-5,45],[51,45],[-1,94],[42,18],[48,68],[98,34],[70,-12],[135,51],[95,70]],[[7639,3809],[60,-79],[-24,-67],[-132,-126],[-41,21],[-20,-44],[0,-91],[64,-72],[59,-14],[27,58],[60,-70],[131,-50],[95,28],[77,-54],[117,-17],[110,-96],[54,-22],[38,-59],[9,-65],[34,-48]],[[8357,2942],[-113,-169],[-90,-94],[-48,-18],[-147,-159],[-80,-33],[-12,-46],[-79,-100],[-30,-64],[-40,-21],[-30,-66],[-139,-183],[-154,-151],[-42,-67],[-205,-167],[-34,-11],[-37,-78],[-120,-120],[-100,-54],[-75,-82],[-88,-48],[-19,-38],[-177,-124],[-26,-36],[-111,-45],[-167,-85],[-78,-52],[-139,-9],[-119,39],[-83,4],[-104,-25],[-64,-40],[-37,-120],[52,-59],[-65,-21],[-114,12],[-81,41],[-108,16],[-90,-20],[-15,-52],[-53,-64],[10,-42],[-231,22],[-59,41],[-133,41],[-109,11],[-210,47]],[[4364,653],[29,86],[-87,59],[-107,13],[42,54],[111,54],[-34,116],[-76,50],[-108,27],[-141,7],[-170,-10],[-3,59],[104,183],[0,64],[52,99],[118,64],[80,0],[27,31],[-57,79],[-25,128],[4,64],[50,55],[169,24],[43,67],[51,35],[78,-26],[87,43],[38,39],[19,96],[37,40],[-34,50],[13,78]],[[4674,2381],[4,24],[109,31],[101,11],[8,120],[29,119],[125,11],[124,82],[150,65],[82,-21],[58,105],[37,127],[10,104],[-24,36],[-9,113]],[[5478,3308],[87,5],[15,-39],[54,-19],[70,50],[32,59],[28,-19],[127,64],[81,-75],[99,17],[57,-73],[102,-19],[47,26],[44,-27],[105,67],[-16,42],[72,0],[9,28],[101,11],[17,77],[38,4],[-6,58]],[[6048,8023],[40,49],[37,89],[111,112],[83,53],[13,105],[42,209],[-1,37],[41,124],[40,-8],[34,103],[92,49],[43,57],[122,23],[36,114],[55,19],[34,-21],[12,75],[74,36],[31,39],[-5,52],[51,29],[15,71],[71,62],[20,68],[87,69],[112,0],[237,103],[34,58],[-5,55],[54,71],[74,5],[32,26],[94,-9],[48,26],[125,26],[60,-4],[114,-53],[114,-74],[65,-3],[36,-32],[127,22],[76,-17],[125,38],[254,-59],[171,-630],[-9,-204],[15,-61],[59,-75],[59,-196],[71,-100]],[[9368,8551],[-46,-2],[-42,-66],[-48,28],[-20,-26],[-94,19],[-21,-25],[-100,-36],[125,-14],[16,-28],[-57,-201],[-6,-59],[46,-1],[7,-47],[83,-83],[-49,-56],[-94,-39],[2,-69],[54,-16],[-15,-86],[-67,7],[-43,-29],[-86,-12],[9,61],[53,20],[-29,100],[-42,33],[49,79],[-36,3],[-38,69],[-132,60],[-47,55],[-20,-73],[-64,-17],[-46,-60],[-102,36],[-160,-36],[13,-97],[-12,-50],[-110,-93],[-98,-114],[27,-40],[-24,-46],[-51,-18],[-69,14],[-109,141],[-27,-12],[1,98],[43,37],[-4,65],[-116,-57],[-46,-90],[-52,-29],[-38,75],[-46,0],[-16,-40],[-109,-6],[-82,-47],[-17,-62],[-67,-28],[-63,-56],[23,-28],[130,52]],[[7389,7609],[35,-70],[-83,-18],[-57,-41],[-85,4]],[[7199,7484],[-39,72],[-63,20],[-24,66],[76,-7],[6,37],[-75,54],[-81,19],[-36,-14],[-146,26],[-47,-15],[-39,-91],[-23,38],[-74,-2],[-48,41],[-64,13],[-78,111],[-20,99],[-47,-51],[-107,-60],[-86,29],[-105,13],[-27,55],[-4,86]],[[7639,3809],[81,52],[-27,68],[34,126],[64,32],[22,124],[64,37],[17,62],[-76,200],[-63,15],[-50,61],[-89,66],[-74,107]],[[7542,4759],[70,156],[132,31],[27,76],[106,65],[49,70],[61,14],[53,102],[-31,57],[59,187],[-22,124],[49,38],[-31,69],[34,52]],[[8098,5800],[96,69],[124,-11],[91,61],[85,21],[14,-26],[80,-2],[52,26],[105,-45],[41,19],[48,-35],[104,24],[57,72]],[[8995,5973],[172,-61],[269,-4],[-16,169],[29,231],[93,-30],[127,-11],[330,11],[-32,-219],[-99,-313],[-53,-284],[5,-32],[-33,-212],[-75,-151],[-26,-134],[-180,-195],[-54,-6],[11,-47],[-76,-46],[-73,2],[-9,-34],[-119,-155],[-43,-38],[-183,-276],[-80,-181],[2,-84],[-84,-96],[-82,-173],[-137,-265],[-103,-215],[-44,-52],[-75,-130]],[[4364,653],[-128,-25],[-41,-43],[28,-34],[-287,21],[-92,44],[-135,24],[-93,-54],[-82,6],[-74,-28],[-4,-66],[-100,-26],[-38,-29],[-16,-70],[-117,-43],[-114,30],[-101,-52],[-53,-3],[-100,41],[-112,8],[-66,-30],[22,-53],[-109,21],[-84,-12],[-92,-91],[-138,-97],[-62,-60],[8,-26],[-64,-6],[-58,47],[-131,-18],[-149,135],[-59,-5],[36,84],[-51,74],[-79,-6],[-36,57],[-171,-17],[31,168],[-72,58],[-112,3],[-69,-56],[21,-79],[-4,-81],[-39,36],[-14,66],[-41,48],[26,81],[-26,20],[35,81],[70,50],[-35,131],[-67,102],[-8,70],[-99,96],[-43,121],[-73,80],[31,8],[57,-86],[-46,147],[-50,6],[-17,-32],[-43,183],[39,70],[37,18],[68,-61],[44,23],[74,82],[37,123],[-11,116],[20,66],[-23,104],[-21,186],[-64,181],[-99,163],[-70,88],[-13,57],[-64,93]],[[789,2881],[32,-12],[5,84],[38,102],[81,125],[82,-36],[54,31],[54,100],[46,122],[32,-21],[59,44],[106,-84],[66,-93],[58,-23],[-6,-171],[-14,-53],[19,-148],[36,-73],[13,-162],[30,-65],[3,-135],[-26,-114],[95,-22],[49,25],[-8,-56],[49,-58],[89,-42],[9,-115],[-42,-61],[39,-122],[-9,-94],[36,-42],[47,142],[57,15],[59,52],[76,11],[130,133],[28,-7],[17,-67],[-80,-100],[25,-146],[53,-133],[129,-136],[75,27],[97,-12],[48,45],[25,114],[25,31],[154,55],[46,116],[68,65],[72,23],[79,84],[99,23],[84,-24],[71,37],[80,109],[-8,130],[34,31],[90,223],[113,-65],[78,-97],[91,-45],[115,-18],[50,-24],[26,-71],[68,68],[68,110],[66,55],[139,17],[94,-39],[49,-72],[60,58],[37,6],[76,-55]],[[789,2881],[-125,250],[-16,68],[-155,318],[-46,145],[-24,119],[-38,102],[-29,164],[-74,251],[-30,46],[-47,174],[-86,134],[-41,40],[-25,118],[-53,65],[10,42],[112,89],[19,-28],[61,102],[-24,65],[74,95],[4,63],[125,41],[56,-68],[1,-73],[94,-15],[34,-109],[-44,-71],[56,-107],[-10,-88],[108,19],[15,-60],[85,6],[102,-25],[154,-96],[87,18],[53,-15],[212,46],[128,-21],[77,-73],[49,11],[77,58],[-24,79],[25,41],[88,5],[29,27],[53,117],[156,42],[96,66],[-1,2861],[84,-96],[71,-39],[79,-77],[93,-204],[15,-71],[42,-38],[19,-144],[92,-221],[6,-140],[22,-48],[-53,-113],[-80,-120],[-8,-204],[18,-103],[32,-59],[98,68],[164,-48],[159,33],[186,-24],[52,54],[4,85],[96,12],[74,36],[53,78],[68,140],[52,19],[53,72],[70,15],[46,76]],[[3744,6858],[45,-3],[12,-361],[69,-3],[124,-76],[-16,-142],[42,-116],[-38,-24],[-4,-119],[47,-25],[79,-96],[144,-64],[21,-39],[148,-57],[92,37],[1,51],[60,7],[8,82],[30,-47],[-4,-107],[40,-188],[188,49],[13,-83],[-40,-86],[51,-62],[-5,-47],[49,-49],[56,78],[6,76],[44,68],[-9,166],[48,5],[20,-63],[144,-22],[-123,-158],[66,-148],[49,22]],[[5201,5314],[-102,-356],[18,-102],[-134,-331],[-191,-457],[41,-91],[151,-104],[8,-42],[70,-30],[74,-168],[75,-65],[9,-37],[149,-168],[44,-2],[65,-53]],[[3744,6858],[25,71],[36,28],[-7,74],[35,51],[-13,56],[36,53],[25,163],[99,134],[39,-12],[118,49],[118,-14],[139,-136],[34,-12],[110,-126],[49,-20],[77,22],[59,-17],[41,-58],[57,-29],[41,12],[127,-63],[81,-5],[67,20],[87,53],[77,-20],[128,16],[122,97],[46,141],[19,103],[86,232],[25,103],[-6,108],[250,95],[77,-4]],[[7199,7484],[-7,-65],[-97,-37],[-31,26],[6,-90],[-50,-78],[-46,-12],[23,-80],[-53,-87],[-91,-20],[-71,50],[-92,-55],[-30,-169],[-84,-52],[22,-110],[-85,-76],[28,-80],[159,66],[83,-32],[-39,-121],[-4,-122]],[[6740,6340],[-37,-84],[-44,-16],[-61,25],[-77,-77],[-2,28],[-81,-3],[-68,51],[-9,-72],[-37,33],[-130,-67],[-141,-141],[44,-61],[-21,-77],[36,-33],[-90,6],[-69,-31],[-12,-50],[-78,-76],[-53,-92],[-8,50],[-77,14],[-46,32],[-96,-74],[-37,16],[-97,-45],[-110,-88],[-9,-43],[-59,-41],[-46,-102],[-24,-8]],[[7542,4759],[-96,67],[-40,93],[-56,-32],[-85,-6],[-53,-65],[-98,-2],[-83,-121],[-65,-4],[-30,-42],[-70,5],[-22,-65],[-44,-35],[-16,-77],[-52,-59],[1,-42],[-46,-24],[-22,-83],[-44,-69],[-63,-51],[-139,-61],[-7,-32],[53,-65],[67,-181],[41,-43],[28,-77],[42,-9],[-23,-55],[21,-79]],[[6740,6340],[45,32],[18,-30],[145,32],[54,42],[44,-115],[95,-69],[55,-7]],[[7196,6225],[116,-39],[42,-46],[90,39],[108,-57],[52,39],[59,-28],[42,-98],[32,13],[161,-90],[26,-71],[79,-126],[95,39]],[[7389,7609],[135,37],[57,-25],[-16,-67],[-55,-105],[35,-17],[79,30],[142,7],[-6,-69],[-34,3],[-39,-50],[-39,-113],[-34,-38],[-23,-135],[-35,-40],[-27,-101],[-143,20],[-32,-61],[-60,-22],[85,-176],[67,-19],[72,12],[27,-64],[-81,-81],[-114,-37],[-101,-104],[-9,-65],[-36,-37],[-8,-67]],[[9368,8551],[8,-158],[71,-205],[1,-748],[-13,-84],[15,-135],[-23,-28],[-27,-124],[24,-91],[-70,-19],[-248,188],[-71,-10],[-116,-121],[-50,-149],[-41,-87],[-101,-148],[-13,-59],[2,-193],[10,-73],[47,29],[50,-109],[9,-98],[110,-134],[53,-22]]],"bbox":[16.471795984977778,-34.80904950592802,32.89308956547464,-22.12645822043597],"transform":{"scale":[0.0016422935874084268,0.0012683859671459197],"translate":[16.471795984977778,-34.80904950592802]},"title":"South Africa","version":"2.3.0","copyright":"Copyright (c) 2024 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/views/partials/heatmap.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/webapp/public/maps/lt.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]],[[1,2,3]]],"id":"LT.KP","properties":{"hc-group":"admin1","hc-key":"lt-kp","hc-a2":"KP","labelrank":"7","hasc":"LT.KP","alt-name":"Klaip?da|Memel","woe-id":"55848085","subregion":null,"fips":"LH58","postal-code":"KP","name":"Klaipedos","country":"Lithuania","type-en":"County","region":null,"longitude":"21.3879","woe-name":"Klaipedos","latitude":"55.6254","woe-label":"Klaipeda County, LT, Lithuania","type":"Apskritis","hc-middle-lon":21.492,"hc-middle-lat":55.616}},{"type":"Polygon","arcs":[[4,5,6,7]],"id":"LT.AS","properties":{"hc-group":"admin1","hc-key":"lt-as","hc-a2":"AS","labelrank":"7","hasc":"LT.AS","alt-name":"Alytus|Olita|Alitus","woe-id":"55848082","subregion":null,"fips":"LH56","postal-code":"AS","name":"Alytaus","country":"Lithuania","type-en":"County","region":null,"longitude":"24.167","woe-name":"Alytaus","latitude":"54.2544","woe-label":"Alytus County, LT, Lithuania","type":"Apskritis","hc-middle-lon":24.014,"hc-middle-lat":54.223}},{"type":"Polygon","arcs":[[-7,8,9,10,11,12]],"id":"LT.KS","properties":{"hc-group":"admin1","hc-key":"lt-ks","hc-a2":"KS","labelrank":"7","hasc":"LT.KS","alt-name":"Kaunas|Kowno|Kovno","woe-id":"55848084","subregion":null,"fips":"LH57","postal-code":"KS","name":"Kauno","country":"Lithuania","type-en":"County","region":null,"longitude":"23.9879","woe-name":"Kauno","latitude":"55.0673","woe-label":"Kaunas County, LT, Lithuania","type":"Apskritis","hc-middle-lon":23.989,"hc-middle-lat":55.089}},{"type":"Polygon","arcs":[[-9,-6,13,14]],"id":"LT.MA","properties":{"hc-group":"admin1","hc-key":"lt-ma","hc-a2":"MA","labelrank":"7","hasc":"LT.MA","alt-name":"Marijampol?|Mariampol","woe-id":"55848078","subregion":null,"fips":"LH59","postal-code":"MA","name":"Marijampoles","country":"Lithuania","type-en":"County","region":null,"longitude":"23.1751","woe-name":"Marijampoles","latitude":"54.6829","woe-label":"Marijampole County, LT, Lithuania","type":"Apskritis","hc-middle-lon":23.18,"hc-middle-lat":54.675}},{"type":"Polygon","arcs":[[-12,15,16,17,18]],"id":"LT.PA","properties":{"hc-group":"admin1","hc-key":"lt-pa","hc-a2":"PA","labelrank":"7","hasc":"LT.PA","alt-name":"Panev??ys|Ponewiesch|Ponewjesh|Poneviezli","woe-id":"55848086","subregion":null,"fips":"LH60","postal-code":"PA","name":"Panevezio","country":"Lithuania","type-en":"County","region":null,"longitude":"24.9143","woe-name":"Panevezio","latitude":"56.0725","woe-label":"Panevezys County, LT, Lithuania","type":"Apskritis","hc-middle-lon":24.599,"hc-middle-lat":55.979}},{"type":"Polygon","arcs":[[-11,19,20,21,-16]],"id":"LT.SH","properties":{"hc-group":"admin1","hc-key":"lt-sh","hc-a2":"SH","labelrank":"7","hasc":"LT.SH","alt-name":"?iauliai|Schaulen|Shavli","woe-id":"55848079","subregion":null,"fips":"LH61","postal-code":"SH","name":"?iauliai","country":"Lithuania","type-en":"County","region":null,"longitude":"23.2677","woe-name":"?iauliai","latitude":"55.9585","woe-label":"Siauliai County, LT, Lithuania","type":"Apskritis","hc-middle-lon":23.289,"hc-middle-lat":55.982}},{"type":"Polygon","arcs":[[-20,-10,-15,22,-2,23]],"id":"LT.TG","properties":{"hc-group":"admin1","hc-key":"lt-tg","hc-a2":"TG","labelrank":"7","hasc":"LT.TG","alt-name":"Taurag?|Tauroggen","woe-id":"55848087","subregion":null,"fips":"LH62","postal-code":"TG","name":"Taurages","country":"Lithuania","type-en":"County","region":null,"longitude":"22.6458","woe-name":"Taurages","latitude":"55.2657","woe-label":"Taurage County, LT, Lithuania","type":"Apskritis","hc-middle-lon":22.371,"hc-middle-lat":55.346}},{"type":"Polygon","arcs":[[24,-8,-13,-19,25]],"id":"LT.VI","properties":{"hc-group":"admin1","hc-key":"lt-vi","hc-a2":"VI","labelrank":"7","hasc":"LT.VI","alt-name":"Vilnius|Wilna|Vilna|Vilnious","woe-id":"55848083","subregion":null,"fips":"LH65","postal-code":"VI","name":"Vilniaus","country":"Lithuania","type-en":"County","region":null,"longitude":"25.1588","woe-name":"Vilniaus","latitude":"54.7338","woe-label":"Vilnius County, LT, Lithuania","type":"Apskritis","hc-middle-lon":25.08,"hc-middle-lat":54.74}},{"type":"Polygon","arcs":[[-18,26,-26]],"id":"LT.UN","properties":{"hc-group":"admin1","hc-key":"lt-un","hc-a2":"UN","labelrank":"7","hasc":"LT.UN","alt-name":"Utena","woe-id":"55848081","subregion":null,"fips":"LH64","postal-code":"UN","name":"Utenos","country":"Lithuania","type-en":"County","region":null,"longitude":"25.622","woe-name":"Utenos","latitude":"55.5267","woe-label":"Utena County, LT, Lithuania","type":"Apskritis","hc-middle-lon":25.613,"hc-middle-lat":55.484}},{"type":"Polygon","arcs":[[-24,-4,27,-21]],"id":"LT.TL","properties":{"hc-group":"admin1","hc-key":"lt-tl","hc-a2":"TL","labelrank":"7","hasc":"LT.TL","alt-name":"Tel?iai|Telsche|Telschi|Telshe","woe-id":"55848080","subregion":null,"fips":"LH63","postal-code":"TL","name":"Tel?iai","country":"Lithuania","type-en":"County","region":null,"longitude":"22.1086","woe-name":"Tel?iai","latitude":"56.0398","woe-label":"Telsiai County, LT, Lithuania","type":"Apskritis","hc-middle-lon":22.121,"hc-middle-lat":55.906}}],"hc-recommended-transform":{"default":{"crs":"+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs","scale":0.0018751655983,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":304648.437215,"yoffset":6256518.95231}}}},"arcs":[[[110,5431],[-110,39],[128,291],[71,231],[69,319],[29,453],[-14,79],[5,244],[-15,107],[55,-91],[24,-173],[4,-341],[-24,-163],[0,-146],[-55,-190],[32,-78],[-55,-115],[-62,-248],[-82,-146],[0,-72]],[[1622,6720],[-19,-96],[-89,-49],[34,-87],[11,-130],[34,-65],[43,-221],[35,-25],[45,38],[52,-49],[125,-62],[16,-56],[-27,-19],[-13,-109],[-192,-291],[-12,-84],[74,-23],[162,-95],[26,-45],[46,-164],[-7,-107],[23,-22],[63,64],[44,10],[65,-56],[146,-19],[31,-69],[-46,-144],[-3,-110]],[[2289,4635],[-31,5],[-185,-65],[-73,-96],[-85,14],[-37,43],[-21,172],[-65,14],[-59,-54],[-118,66],[-92,95],[-117,34],[-59,85],[-120,123],[-69,45],[-172,7],[-62,66],[-105,240],[-53,69],[-42,-9],[-140,-153],[-6,139],[36,11],[7,72],[-51,121],[-4,130],[-18,4],[-98,-124],[-10,29],[70,209],[41,72],[0,96],[-44,305],[-46,106],[0,149],[-64,222],[-29,181],[-70,160],[-44,63],[-23,173],[-27,331],[0,173],[24,133],[0,336],[-9,138],[65,20],[100,1],[69,25],[25,74],[41,235],[43,86],[123,153],[53,35],[104,16],[238,235],[62,42],[151,7],[478,290]],[[1771,9784],[-6,-40],[-83,-65],[-17,-47],[52,-119],[10,-152],[78,-202],[3,-54],[-48,-23],[-102,-282],[-31,-31],[-106,-5],[-64,-68],[-66,-4],[-99,-115],[-11,-80],[-59,-150],[-101,-105],[9,-72],[-7,-159],[15,-95],[42,-112],[-45,-80],[-90,-96],[-40,-76],[3,-46],[72,-9],[79,52],[2,-69],[41,-78],[-16,-70],[20,-29],[190,36],[16,-26],[-14,-130],[32,-75],[51,-189],[50,-97],[91,-102]],[[6681,1012],[-50,-42],[-5,-95],[-61,-67],[66,-286],[-3,-108],[-53,-90],[-110,-24],[-56,37],[-22,76],[-59,-36],[-109,-29],[-86,-68],[-195,-237],[-62,-43],[-205,28],[-48,150],[-47,79],[-55,26],[-55,-14],[-105,-78],[-50,-18],[-110,-2],[-104,67],[-156,-108],[-70,32],[-56,-44],[-106,-22],[-84,-49],[-55,12],[-153,126],[-59,20],[8,45],[-46,86],[-7,77],[64,117],[-1,88],[-38,267],[-42,165],[-28,57],[-86,73],[-47,114],[-32,36]],[[4103,1330],[22,199],[-3,105],[38,143],[55,78],[110,47],[-31,66],[29,47],[129,66],[2,148],[25,50],[143,154],[35,-1],[73,-116],[89,-31]],[[4819,2285],[18,-24],[158,8],[32,-17],[102,100],[101,51],[-18,136],[33,46],[72,16],[80,-37],[281,70],[51,-60],[55,-26],[151,27]],[[5935,2575],[17,-90],[-16,-95],[37,-72],[-9,-149],[35,-29],[150,-27],[85,24],[92,68],[120,-43],[23,-127],[80,35],[75,-16],[79,79],[140,69],[85,10],[-3,-222],[-77,-35],[-31,-43],[-29,-232],[-61,-108],[-184,-246],[20,-88],[57,-41],[61,-185]],[[4819,2285],[34,79],[1,69],[-30,116],[-74,33],[-87,117],[33,96],[-13,49],[-90,77],[12,35],[76,45],[11,74],[-32,182],[4,78],[-40,148],[-45,41],[55,96],[-40,252],[-83,99],[-56,24],[-82,-41],[-38,162],[-34,52],[-83,29],[5,67],[62,47],[101,-3],[58,110],[67,31],[-10,70],[-32,38],[-113,4],[-88,95],[-35,14]],[[4233,4670],[19,121],[56,141],[-6,151],[42,121],[-34,56],[-43,9],[-96,-29],[-85,84],[-175,-16],[-41,31],[-16,73],[-58,38],[-71,-32],[-55,10],[-31,-31],[-92,-13],[-22,40],[29,89],[-148,160],[-40,-99],[-58,-63],[-25,69],[-81,110],[-5,177],[-36,40],[-59,-13],[-35,43],[-11,111],[-89,74],[-39,98]],[[2928,6220],[53,59],[99,50],[126,24],[54,-93],[44,-15],[263,136],[61,56],[63,140],[35,35],[105,17],[68,-12],[62,-131],[123,98],[129,-142],[95,-51],[46,9],[7,49],[72,54],[98,-86],[-31,-100],[20,-62],[91,-34],[87,146],[77,73],[232,153]],[[5007,6593],[59,-18],[29,-153],[42,-40],[81,12],[101,-139],[6,-187],[48,49],[98,14],[119,80],[71,-98],[71,-1],[16,40],[80,-58],[112,-192]],[[5940,5902],[-39,-176],[-6,-124],[44,-116],[13,-139],[35,-58],[91,-66],[-45,-60],[17,-93],[75,-90],[22,-147],[99,-13],[22,-103],[51,-33],[19,-122],[-118,-128],[-53,-121],[125,-103],[91,-115],[104,-23],[61,-49],[47,-91],[-50,-52],[-52,-112],[-113,-83],[-30,-41],[-46,-215],[-8,-121],[-30,-25],[-82,21],[-31,-60],[-99,-52],[-18,-68],[13,-158],[24,-39],[-28,-136],[-61,6],[-18,-144],[-31,-78]],[[4103,1330],[-34,40],[-137,69],[-201,193],[-114,-33],[-31,57],[17,123],[-89,49],[-28,86],[-35,31],[-57,-8],[-103,71],[-78,-20],[-45,-114],[-32,-34],[-103,244],[-45,135],[-10,153],[12,305],[45,256],[-13,133],[8,67],[37,74],[-4,71],[68,54],[38,73],[79,89],[25,138],[-32,231],[-35,82],[-101,63],[4,84],[-62,79],[-111,6],[-28,20],[-42,135],[-30,177],[-34,103]],[[2802,4612],[48,30],[76,-57],[144,36],[156,87],[86,15],[93,-34],[45,46],[84,40],[542,-135],[157,30]],[[5007,6593],[82,212],[142,52],[11,53],[-20,162],[58,89],[-10,189],[-44,129],[-78,74],[-21,114],[65,10],[23,104],[105,82],[32,158],[-2,101],[-97,100],[-14,161],[11,74],[54,-9],[30,131],[55,117],[32,161],[70,34],[16,114],[-54,44],[-2,80],[25,56],[-4,105]],[[5472,9290],[45,10],[205,137],[53,12],[55,-27],[108,-102],[56,-19],[157,105],[170,284],[67,68],[216,122],[55,-18],[32,123],[60,14],[31,-66],[45,-164],[44,-238],[35,-112],[74,-119],[30,-127],[50,-118],[60,-57],[588,-132],[117,27],[114,-60],[122,-1],[44,-166],[36,-68],[98,-88],[178,-260],[153,-133]],[[8570,8117],[-33,-77],[-3,-111],[-106,-157],[-20,-79],[-46,-91],[-42,-176],[-20,-32],[-79,28],[-117,-200],[-36,64],[-184,-8],[-119,-79],[-38,81],[-73,-23],[-75,140],[-129,-96],[-24,-47],[-2,-95],[-86,14],[-195,-101],[-90,-6],[-2,63],[-86,111],[-107,10],[-83,-39],[-78,2],[-48,-55],[-65,30],[-67,-23],[-111,22],[-5,-97],[53,-96],[-41,-54],[-43,38],[-57,-50],[75,-92],[7,-94],[-49,-55],[-18,-70],[12,-135],[-34,-72]],[[6306,6410],[-50,-36],[53,-88],[-8,-36],[-125,21],[-71,-230],[-62,-86],[-54,-4],[-49,-49]],[[2928,6220],[-41,28],[-9,91],[36,73],[-116,201],[-102,93],[-25,73],[11,93],[-64,65],[-11,80]],[[2607,7017],[83,96],[-11,126],[13,124],[-27,101],[24,51],[105,77],[18,164],[92,59],[25,97],[50,78],[-6,44],[45,47],[-60,86],[-94,-45],[-46,113],[49,72],[-16,146],[19,54],[81,23],[74,62],[-40,102],[9,80],[-34,26],[-89,-25],[-84,-54],[-64,11],[-75,-47],[-67,31],[-18,77],[-36,7],[18,66],[-77,57],[23,229],[104,172],[10,76],[-23,46],[33,89],[86,-3],[72,30],[23,100],[-25,78],[43,57]],[[2814,9797],[45,-32],[75,-102],[56,-11],[240,128],[113,101],[60,14],[56,-40],[101,-306],[77,-77],[86,26],[86,119],[17,65],[196,60],[38,-10],[291,-158],[62,-6],[102,77],[54,21],[165,3],[32,-101],[52,-10],[117,34],[57,-2],[209,-86],[160,-161],[111,-53]],[[2802,4612],[-51,46],[-179,-70],[-283,47]],[[1622,6720],[193,36],[63,-5],[51,72],[20,132],[85,8],[88,62],[183,28],[72,-40],[101,-22],[129,26]],[[9896,5313],[-66,-23],[-75,-85],[-40,-90],[-30,-222],[-63,-66],[-180,105],[-90,-68],[-189,65],[-76,-18],[-54,-112],[-14,-222],[-63,-181],[-83,-156],[-62,-46],[-207,-56],[-124,20],[-85,-59],[-19,-105],[-109,-142],[-18,-75],[11,-178],[-92,-99],[0,-252],[-26,-157],[9,-127],[43,-140],[1,-154],[-56,-104],[-105,-83],[-45,-127],[-11,-260],[-32,-85],[-77,-126],[-32,-85],[-3,-98],[60,-71],[74,7],[102,72],[49,-9],[33,-140],[73,-63],[49,-146],[-25,-55],[-2,-179],[-53,-101],[-84,7],[-46,-62],[-55,-16],[-151,34],[-83,81],[-14,70],[61,50],[4,63],[-38,69],[90,37],[-140,257],[-64,-20],[-69,-136],[-41,-36],[-140,-10],[-108,51],[-52,-58],[-34,-185],[-29,-82],[-70,-105],[-74,-65],[-76,-16],[-134,70],[-78,15],[-88,-18]],[[6306,6410],[235,-234],[53,-119],[-50,-72],[24,-124],[49,-34],[82,-3],[44,-100],[122,50],[7,-136],[32,-16],[130,14],[-4,-78],[108,-139],[86,11],[12,-39],[-49,-116],[18,-64],[54,3],[82,-65],[20,-41],[-49,-29],[-89,-97],[-58,-30],[-16,-185],[16,-35],[69,-23],[55,-47],[25,-138],[80,-3],[135,-55],[279,118],[177,56],[53,-2],[25,-42],[124,-11],[-9,80],[53,76],[-13,63],[46,69],[-105,95],[-126,197],[-13,60],[21,108],[100,121],[44,190],[136,-91],[65,47],[72,-103],[50,17],[39,-68],[70,19],[50,95],[39,32],[107,5],[68,-37],[33,-55],[-24,-93],[31,-92],[63,33],[113,-69],[86,-25],[229,-15],[190,72],[112,100],[78,32],[63,-32],[41,-103]],[[8570,8117],[97,-82],[105,-155],[169,-189],[171,-417],[107,-105],[236,-150],[96,-34],[97,-10],[23,-198],[-21,-190],[-109,-202],[-7,-95],[32,-82],[-5,-46],[-60,-79],[-38,-190],[-68,-209],[34,-65],[130,-53],[103,38],[282,-65],[40,-40],[15,-66],[-19,-64],[-84,-56]],[[1771,9784],[219,131],[77,-7],[128,-98],[505,21],[114,-34]]],"bbox":[20.92455773286996,53.8868307955492,26.80072125788597,56.438727702254724],"transform":{"scale":[0.0005876751200136024,0.0002552152121917714],"translate":[20.92455773286996,53.8868307955492]},"title":"Lithuania","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/maps/cd.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]],[[1,2,3]]],"id":"CD.BC","properties":{"hc-group":"admin1","hc-key":"cd-bc","hc-a2":"BC","labelrank":"6","hasc":"CD.BC","alt-name":"Bas-Zaire|Bas-Zaïre|Kongo-Central|Lower Zaire","woe-id":"2344984","subregion":null,"fips":"CG08","postal-code":"BC","name":"Bas-Congo","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"14.2052","woe-name":"Bas-Congo","latitude":"-5.31907","woe-label":"Bas-Congo, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":14.283,"hc-middle-lat":-5.34}},{"type":"MultiPolygon","arcs":[[[4]],[[5,6,7,8]]],"id":"CD.KV","properties":{"hc-group":"admin1","hc-key":"cd-kv","hc-a2":"KV","labelrank":"6","hasc":"CD.KV","alt-name":"Sud-Kivou|Sud Kivou|Sud Kivu","woe-id":"20069829","subregion":null,"fips":"CG12","postal-code":"KV","name":"Sud-Kivu","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"28.1159","woe-name":"Sud-Kivu","latitude":"-3.10474","woe-label":"South Kivu, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":28.165,"hc-middle-lat":-3.108}},{"type":"Polygon","arcs":[[9,10,11,12,13]],"id":"CD.EQ","properties":{"hc-group":"admin1","hc-key":"cd-eq","hc-a2":"EQ","labelrank":"6","hasc":"CD.EQ","alt-name":"Equator|Equatorial","woe-id":"2344978","subregion":null,"fips":"CG02","postal-code":"EQ","name":"Équateur","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"20.4731","woe-name":"Équateur","latitude":"1.21836","woe-label":"Equateur, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":20.235,"hc-middle-lat":1.23}},{"type":"Polygon","arcs":[[-11,14,15,16,17]],"id":"CD.HC","properties":{"hc-group":"admin1","hc-key":"cd-hc","hc-a2":"HC","labelrank":"6","hasc":"CD.HC","alt-name":"Haut-Zaire|Haut-ZaïreUpper Zaire","woe-id":"2344985","subregion":null,"fips":"CG09","postal-code":"HC","name":"Orientale","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"26.785","woe-name":"Orientale","latitude":"2.40438","woe-label":"Orientale, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":26.079,"hc-middle-lat":1.789}},{"type":"Polygon","arcs":[[18,-14,19,20,-4,21]],"id":"CD.BN","properties":{"hc-group":"admin1","hc-key":"cd-bn","hc-a2":"BN","labelrank":"6","hasc":"CD.BN","alt-name":null,"woe-id":"2344977","subregion":null,"fips":"CG01","postal-code":"BN","name":"Bandundu","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"18.4474","woe-name":"Bandundu","latitude":"-4.61778","woe-label":"Bandundu, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":18.189,"hc-middle-lat":-3.912}},{"type":"Polygon","arcs":[[22,-22,-3]],"id":"CD.KN","properties":{"hc-group":"admin1","hc-key":"cd-kn","hc-a2":"KN","labelrank":"6","hasc":"CD.KN","alt-name":"Kinshasa|Léopoldville","woe-id":"2344982","subregion":null,"fips":"CG06","postal-code":"KN","name":"Kinshasa City","country":"Democratic Republic of the Congo","type-en":"Neutral City","region":null,"longitude":"15.8492","woe-name":"Kinshasa City","latitude":"-4.49522","woe-label":"Kinshasa, CD, Democratic Republic of Congo","type":"Neutral City","hc-middle-lon":15.932,"hc-middle-lat":-4.445}},{"type":"Polygon","arcs":[[-18,23,24,25,-12]],"id":"CD.KR","properties":{"hc-group":"admin1","hc-key":"cd-kr","hc-a2":"KR","labelrank":"6","hasc":"CD.KR","alt-name":"East Kasai|Kasai East","woe-id":"2344980","subregion":null,"fips":"CG04","postal-code":"KR","name":"Kasaï-Oriental","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"24.0842","woe-name":"Kasaï-Oriental","latitude":"-4.40511","woe-label":"Kasai-Oriental, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":23.823,"hc-middle-lat":-4.284}},{"type":"Polygon","arcs":[[-25,26,-7,27,28]],"id":"CD.KT","properties":{"hc-group":"admin1","hc-key":"cd-kt","hc-a2":"KT","labelrank":"6","hasc":"CD.KT","alt-name":"Shaba","woe-id":"2344981","subregion":null,"fips":"CG05","postal-code":"KT","name":"Katanga","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"26.2512","woe-name":"Katanga","latitude":"-8.483739999999999","woe-label":"Katanga, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":26.629,"hc-middle-lat":-8.234}},{"type":"Polygon","arcs":[[-29,29,-20,-13,-26]],"id":"CD.KC","properties":{"hc-group":"admin1","hc-key":"cd-kc","hc-a2":"KC","labelrank":"6","hasc":"CD.KC","alt-name":"Kasai West|West Kasai|West Kassai","woe-id":"2344979","subregion":null,"fips":"CG03","postal-code":"KC","name":"Kasaï-Occidental","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"21.7144","woe-name":"Kasaï-Occidental","latitude":"-4.87578","woe-label":"Kasai-Occidental, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":21.84,"hc-middle-lat":-5.567}},{"type":"Polygon","arcs":[[-27,-24,-17,30,-8]],"id":"CD.1694","properties":{"hc-group":"admin1","hc-key":"cd-1694","hc-a2":"MA","labelrank":"6","hasc":"CD.","alt-name":null,"woe-id":"20069831","subregion":null,"fips":null,"postal-code":null,"name":"Maniema","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"26.0336","woe-name":"Maniema","latitude":"-3.26017","woe-label":"Maniema, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":25.938,"hc-middle-lat":-3.251}},{"type":"Polygon","arcs":[[-31,-16,31,-9]],"id":"CD.1697","properties":{"hc-group":"admin1","hc-key":"cd-1697","hc-a2":"NK","labelrank":"6","hasc":"CD.","alt-name":null,"woe-id":"20069830","subregion":null,"fips":"CG11","postal-code":null,"name":"Nord-Kivu","country":"Democratic Republic of the Congo","type-en":"Province","region":null,"longitude":"28.5939","woe-name":"Nord-Kivu","latitude":"-0.6591280000000001","woe-label":"North Kivu, CD, Democratic Republic of Congo","type":"Province","hc-middle-lon":28.736,"hc-middle-lat":-0.788}}],"hc-recommended-transform":{"default":{"crs":"+proj=utm +zone=34 +south +datum=WGS84 +units=m +no_defs","scale":0.000329409453045,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":-476920.710516,"yoffset":10596013.2984}}}},"arcs":[[[412,4021],[-99,-45],[-33,7],[44,37],[88,1]],[[2041,4028],[-733,-14],[-67,-12],[-291,18],[-40,16],[-159,-13],[-137,5],[-21,-19],[-89,22],[-70,-3],[-60,22],[-53,-8],[-55,-54],[2,-25],[-143,-39],[-125,153],[70,21],[86,-1],[12,300],[-45,57],[75,29],[48,41],[81,107],[121,31],[25,46],[32,-52],[97,-63],[18,-49],[64,69],[30,-16],[74,54],[-1,117],[42,21],[87,-36],[34,41],[65,14],[117,59],[53,-80],[-63,-73],[30,-59],[-3,-111],[63,24],[60,-34],[103,48],[52,89],[116,118]],[[1543,4789],[65,-94],[55,-28],[34,64],[119,-10],[5,-46],[38,-33],[-19,-81],[-50,-25],[58,-59],[77,6],[9,45],[72,-37],[129,-8]],[[2135,4483],[-31,-232],[1,-139],[-64,-84]],[[8854,6118],[4,-157],[-42,-21],[0,59],[38,119]],[[8838,6223],[-22,-13],[-46,-122],[21,-38],[-58,-48],[29,-89],[-37,-33],[26,-149],[57,-27],[-2,-59],[125,-124],[4,-116],[-56,-85],[9,-135],[-29,-49],[15,-31],[-20,-112],[7,-102],[-27,-39],[47,-22],[50,160],[14,-38],[-31,-211],[-28,1],[-26,-137],[8,-122]],[[8868,4483],[-152,0]],[[8716,4483],[-43,50],[-45,117],[-86,162],[-103,93],[-72,37],[-32,-33],[-139,69],[-51,42],[-125,8],[-154,51],[-53,57],[13,150],[-19,84],[21,27],[-11,85],[-34,97],[-64,69],[-47,155],[-2,118],[21,90],[79,-19],[79,-43],[109,65],[29,55],[171,9]],[[8158,6078],[51,20],[54,-45],[65,-5],[124,41],[27,89],[44,-53],[73,3],[39,65],[62,11],[41,50],[40,-34],[60,3]],[[2263,6154],[49,68],[10,57],[107,191],[99,90],[141,38],[60,56],[177,209],[-18,174],[22,100],[51,133],[45,64],[7,60],[-32,85],[8,56],[-22,147],[51,93],[26,122],[31,70],[0,322],[91,192],[78,103],[70,187],[45,34],[15,103],[-25,205],[27,145],[-13,100],[-44,73],[21,35],[76,2],[56,98],[96,109],[38,76],[171,118],[162,3],[56,-21],[34,-51],[60,-14],[176,-108],[65,-90],[-6,-39],[79,-63],[141,23],[112,-35],[66,-51],[46,21],[126,-46],[97,27],[76,-28],[74,-1],[154,-59],[78,9]],[[5373,9346],[159,-87],[12,-43],[68,-26],[127,26],[106,-47],[85,2],[-69,-102],[-111,26],[-63,-62],[-64,-7],[-131,-49],[-12,-71],[63,-21],[2,-101],[34,-48],[102,92],[18,-50],[-46,-118],[-10,-92],[51,-80],[46,-15],[74,16],[175,-109],[7,-76],[-150,34],[-145,-82],[-44,43],[-82,-77],[-41,-12],[-96,53],[-58,-228],[-90,-83],[74,-19],[102,-76],[94,-180],[26,-175],[32,-41],[41,-120],[76,-117],[134,-183],[-48,-63],[-86,16],[-82,-63],[109,-14],[53,-36],[73,26],[100,-103],[-132,-80],[18,-43],[85,-71],[85,-49],[25,-45],[108,-79],[82,-34],[86,-6],[35,-69],[26,-136]],[[6406,6192],[-177,21],[-135,-12],[-72,-131],[-77,5],[-179,-31],[-55,66],[-85,-9],[-65,54],[-97,25],[-77,-81],[-155,26],[24,-143],[33,-118],[-20,-34],[-36,30],[-9,66],[-31,-7],[-110,-102]],[[5083,5817],[-36,-17],[-184,98],[-13,-63],[-104,-29],[-131,12]],[[4615,5818],[-10,63],[-155,185],[-130,-33],[-91,32],[-45,41],[-131,4],[-57,106],[-62,39],[-62,-69],[-40,10],[-22,97],[-94,172],[-109,146],[-20,100],[-37,34],[-16,-40],[-72,-45],[-8,-52],[43,-68],[-30,-48],[-156,-23],[-84,54],[-89,17],[-137,-129],[-215,-81],[-177,-106],[-56,-44],[-135,8],[37,-45],[-1,-64],[-128,0],[-63,75]],[[5373,9346],[83,115],[-12,46],[54,23],[50,124],[36,-8],[23,60],[46,1],[16,-40],[80,-6],[51,-55],[64,-26],[94,73],[131,52],[69,-3],[74,56],[38,-7],[125,68],[-2,46],[48,-12],[96,-76],[63,-19],[88,38],[66,-21],[24,35],[93,7],[1,82],[29,66],[114,34],[128,-96],[106,-3],[53,38],[86,-58],[52,-1],[37,-48],[157,16],[55,-27],[50,60],[81,27],[171,-70],[-3,-30],[61,-60],[47,-5],[65,-83],[3,-74],[127,-25],[19,-69],[27,12],[40,-50],[66,2],[53,-40],[76,50],[108,98],[32,-41],[89,10],[98,-79],[69,21],[73,104],[3,39],[89,-8],[94,-45],[-11,-80],[56,-33],[26,-57],[100,-71],[43,-82],[168,-44],[19,-91],[-10,-43],[107,32],[78,-83],[8,-67],[-56,-78],[-31,-111],[58,-77],[-61,-153],[-17,-75],[46,-13],[40,-57],[60,33],[37,-55],[64,6],[48,-69],[-17,-29],[-122,-94],[-48,-18],[-153,-162],[-69,-56],[-51,-127],[28,-23],[-109,-42],[-9,-63],[-39,-60],[-86,-29]],[[9324,7593],[-65,58],[-152,-71],[-86,15],[-10,-68],[48,-30],[-40,-26],[-133,34],[-70,-37],[-104,10],[-122,-24],[-130,81],[-143,-21],[-163,-86],[153,-60],[10,-81],[40,-56],[-27,-79],[10,-132],[-72,-46],[-80,-104],[-45,-30]],[[8143,6840],[-142,47],[-43,-12],[-129,48],[-75,80],[-75,32],[-5,-25],[-194,-65],[-80,90],[-83,59],[-21,-54],[148,-131],[-72,-105],[13,-128],[-60,-40],[-24,-159],[-64,-126],[-76,51],[1,-114],[-28,-133],[-118,4],[-47,-26],[-85,-94],[-132,-11],[-6,58],[-44,27],[-78,-12],[-202,10]],[[6422,6111],[-9,64],[-7,17]],[[1930,5047],[86,170],[33,40],[59,136],[-19,27],[-8,189],[25,131],[-25,186],[28,84],[154,144]],[[4615,5818],[-29,-104],[-58,-76],[-92,-240],[-13,-121],[19,-312],[-41,-61],[-117,-45],[-18,-51],[-40,0],[-69,58],[-50,-3],[42,-113],[-28,-50],[-5,-92],[71,-207],[-23,-110],[18,-153],[-38,-100],[-75,-79],[-42,-8],[-99,-82],[17,-209],[99,-144],[23,-97]],[[4067,3419],[-232,0],[-23,-167],[19,-87],[-46,-53],[-36,3],[12,-83],[-24,-73],[12,-71],[-306,-1],[-18,37],[-117,1],[-4,-35],[-174,-1],[-41,-59],[-61,3],[-42,30],[-59,-18],[-129,-1],[-4,36],[-53,54],[-114,174],[-71,130],[-45,24],[-35,126],[22,24],[-23,67],[-50,32],[-34,65],[-11,98],[-28,66],[17,111],[-64,68],[-4,73],[-147,37],[-113,-1]],[[2135,4483],[-10,110],[84,139],[36,14],[30,83],[-13,53],[-70,80],[-99,56],[-111,4],[-52,25]],[[1543,4789],[28,45],[133,68],[57,93],[169,52]],[[6422,6111],[22,-90],[99,-162],[31,-30],[188,11],[-12,-74],[15,-108],[-37,-88],[0,-53],[-68,-157],[-66,-57],[9,-121],[-19,-75],[100,-106],[23,-41],[8,-93],[-18,-60],[20,-29],[-84,-108],[78,-105],[29,-75],[25,-5],[611,-2]],[[7376,4483],[-33,-86],[-63,-115],[29,-67],[-39,-73],[52,-81],[3,-118],[-19,-130],[-94,-21],[-11,35],[-90,17],[-60,-54],[-82,-27],[-84,14],[-40,-38],[54,-66],[72,-6],[-28,-88],[-82,-30],[-76,47],[-89,4],[-39,-68],[-233,-150],[-110,42],[-23,59],[-34,1],[-1,-87],[-31,-12],[-56,-75],[11,-72],[-31,-96],[-5,-110],[13,-54],[-55,-4],[-36,-34],[-144,-11],[-116,11],[-28,-19],[-35,75]],[[5743,2996],[29,222],[-6,157],[22,73],[-83,65],[-76,84],[-4,51],[81,190],[-57,80],[-13,108],[24,47],[147,16],[57,19],[19,-30],[53,43],[112,44],[-7,108],[-136,64],[-25,31],[-88,-19],[-152,148],[22,88],[91,39],[-30,107],[-136,23],[-96,105],[-134,83],[-62,76],[-89,-17],[-50,52],[73,11],[11,26],[-39,89],[-73,34],[-4,65],[38,57],[75,202],[-18,67],[-86,113],[-13,61],[-37,39]],[[7376,4483],[1340,0]],[[8868,4483],[-9,-36],[43,-118],[102,-170],[-32,-116],[-70,-47],[7,-75],[70,-80],[62,-165],[23,3],[6,-101],[66,-66],[72,-103],[111,-48],[73,-64],[37,-73],[9,-124],[35,-118],[130,-114],[36,-54],[-7,-43],[-868,-134],[-197,-215],[-38,-59],[-66,-50],[-14,-149],[8,-88],[66,2],[14,73],[38,-47],[64,-175],[-28,-78],[-2,-102],[-26,-40],[31,-41],[3,-119],[34,-66],[-72,-89],[-45,-141],[-19,-145],[-44,-52],[50,-177],[29,-49],[133,-87],[96,-91],[46,-90],[118,6],[127,-47],[-28,63],[16,49],[170,44],[-1,-672],[-90,-3],[22,73],[-49,36],[-213,-111],[-24,26],[-68,-6],[-47,124],[-124,166],[-44,-21],[-58,82],[21,36],[-91,116],[-132,38],[-68,5],[-66,58],[-102,-18],[-62,61],[-52,136],[-98,61],[-28,127],[-90,-22],[-22,-138],[-49,-50],[-93,-28],[-148,56],[-61,-15],[-69,20],[-91,-2],[-75,60],[-66,-4],[-54,39],[-56,-26],[-86,69],[-37,133],[23,60],[-24,44],[-81,-31],[-95,-5],[-121,-31],[-77,-63],[-63,-10],[-84,44],[56,55],[-5,83],[-47,38],[-89,4],[-5,66],[-87,19],[-60,-77],[-178,34],[-64,-6],[-92,-52],[-96,-15],[-97,26],[-53,-24],[-100,32],[-36,-46],[-121,-67],[3,91],[-42,120],[76,44],[2,213],[-58,127],[-22,105],[-55,30],[-38,68],[-67,69],[-32,120],[25,62],[10,228],[39,231],[-44,143],[-49,69],[7,110],[28,86]],[[5044,3077],[132,-69],[89,-16],[126,10],[57,34],[47,-73],[101,-22],[147,55]],[[5044,3077],[19,94],[-40,99],[-663,-3],[2,77],[46,121],[-147,-1],[-20,-45],[-174,0]],[[8143,6840],[47,-61],[-38,-108],[-106,-27],[-26,17],[-120,-48],[-5,-42],[38,-60],[-65,-9],[18,-43],[109,-127],[44,-67],[92,-84],[27,-103]],[[9324,7593],[-29,-34],[7,-152],[-57,-87],[-17,-87],[-46,-38],[-19,-114],[-75,-22],[-37,-32],[-37,-110],[-44,-40],[0,-50],[32,-4],[0,-48],[114,58],[21,47],[-8,-197],[-29,-30],[12,-250],[-76,-63],[-40,-1],[-72,-91],[-72,36],[-14,-61]]],"bbox":[12.210541940287778,-13.433316535866382,31.26934708825509,5.374921569340684],"transform":{"scale":[0.0019060711219089223,0.001881011911711878],"translate":[12.210541940287778,-13.433316535866382]},"title":"Democratic Republic of the Congo","version":"2.3.0","copyright":"Copyright (c) 2024 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------
/webapp/public/maps/dk.json:
--------------------------------------------------------------------------------
1 | {"type":"Topology","objects":{"default":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3,4,5,6,7,8]]],"id":"DK.6326","properties":{"hc-group":"admin1","hc-key":"dk-6326","hc-a2":"MI","labelrank":"7","hasc":"DK.","alt-name":"Central","woe-id":"28362580","subregion":null,"fips":null,"postal-code":null,"name":"Midtjylland","country":"Denmark","type-en":"Region","region":null,"longitude":"9.26862","woe-name":"Midtjylland","latitude":"56.2367","woe-label":"Midtjylland, DK, Denmark","type":"Region","hc-middle-lon":9.507,"hc-middle-lat":56.312}},{"type":"MultiPolygon","arcs":[[[9]],[[10]],[[11]],[[12]],[[13]],[[14,-9]]],"id":"DK.3564","properties":{"hc-group":"admin1","hc-key":"dk-3564","hc-a2":"SY","labelrank":"7","hasc":"DK.","alt-name":"Southern","woe-id":"28362581","subregion":null,"fips":null,"postal-code":null,"name":"Syddanmark","country":"Denmark","type-en":"Region","region":null,"longitude":"9.129200000000001","woe-name":"Syddanmark","latitude":"55.349","woe-label":"Syddanmark, DK, Denmark","type":"Region","hc-middle-lon":9.103,"hc-middle-lat":55.465}},{"type":"MultiPolygon","arcs":[[[15]],[[16]],[[17,-5,18,-7]]],"id":"DK.3568","properties":{"hc-group":"admin1","hc-key":"dk-3568","hc-a2":"NO","labelrank":"7","hasc":"DK.","alt-name":"North","woe-id":"28362579","subregion":null,"fips":null,"postal-code":null,"name":"Nordjylland","country":"Denmark","type-en":"Region","region":null,"longitude":"9.732989999999999","woe-name":"Nordjylland","latitude":"56.8261","woe-label":"Nordjylland, DK, Denmark","type":"Region","hc-middle-lon":10.068,"hc-middle-lat":57.3}},{"type":"MultiPolygon","arcs":[[[19]],[[20]],[[21]],[[22,23]],[[24,25]]],"id":"DK.6325","properties":{"hc-group":"admin1","hc-key":"dk-6325","hc-a2":"HO","labelrank":"7","hasc":"DK.","alt-name":"Capital Region","woe-id":"28362583","subregion":null,"fips":null,"postal-code":null,"name":"Hovedstaden","country":"Denmark","type-en":"Region","region":null,"longitude":"12.3198","woe-name":"Hovedstaden","latitude":"55.8486","woe-label":"Hovedstaden, DK, Denmark","type":"Region","hc-middle-lon":12.289,"hc-middle-lat":55.881}},{"type":"MultiPolygon","arcs":[[[26]],[[27]],[[28]],[[29,-26,30,-24]]],"id":"DK.3563","properties":{"hc-group":"admin1","hc-key":"dk-3563","hc-a2":"SJ","labelrank":"7","hasc":"DK.","alt-name":"Sjaelland|Zealand","woe-id":"28362582","subregion":null,"fips":null,"postal-code":null,"name":"Sjælland","country":"Denmark","type-en":"Region","region":null,"longitude":"11.7483","woe-name":"Sjælland","latitude":"55.4417","woe-label":"Sjaelland, DK, Denmark","type":"Region","hc-middle-lon":11.712,"hc-middle-lat":55.451}}],"hc-recommended-transform":{"default":{"crs":"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs","scale":0.00155831624948,"jsonres":15.5,"jsonmarginX":-999,"jsonmarginY":9851,"xoffset":442861.310439,"yoffset":6402126.29055}}}},"arcs":[[[3154,3697],[-10,-9],[-96,19],[-5,30],[75,17],[17,73],[21,-26],[-2,-104]],[[3581,4119],[24,-43],[39,65],[4,-20],[-57,-109],[-6,-161],[-14,-55],[-46,-54],[-49,18],[-38,73],[-13,115],[8,64],[60,65],[30,88],[-1,54],[-18,53],[-55,39],[-18,33],[4,78],[36,68],[18,-6],[11,-132],[22,-55],[69,-48],[-18,-65],[8,-65]],[[4940,6637],[-53,-8],[-44,53],[12,63],[121,16],[61,28],[0,-23],[-44,-34],[-53,-95]],[[116,3873],[-57,517],[-11,68],[32,-33],[36,-241],[25,-83],[-13,-108],[13,-87],[64,44],[68,68],[86,68],[57,75],[-1,105],[-43,101],[-52,86],[-1,98],[-16,112],[-36,72],[-49,44],[-110,63],[-42,-22],[1,-134],[-10,-135],[1,-73],[-21,8],[-17,88],[-7,228],[4,71],[35,196],[4,73],[-16,1088],[16,107],[64,272],[50,124],[26,-73],[-43,-151],[44,-21],[30,-87],[58,-13],[-4,-108],[22,-41],[15,29],[-9,48],[44,18],[69,2],[63,-16],[111,-111],[38,38],[35,69],[42,-148],[7,-96],[51,-68],[40,-12],[87,24],[23,45],[21,233],[-69,52],[-15,72],[-24,16],[19,52],[65,5],[92,191],[79,38],[79,4],[-31,23],[-62,2],[-15,18],[14,56],[37,76],[112,120],[26,9],[74,-19],[27,40],[57,-12],[28,-26],[21,-112],[61,-109],[18,-67],[-40,-11],[-41,-82],[-36,-13],[5,-51],[-53,-77],[-14,-45],[5,-139],[10,-30],[47,38],[18,103],[70,7],[-21,41],[-27,-17],[48,128],[-9,-71],[88,1],[50,-22],[42,3],[9,-71],[-45,-100],[42,-81],[65,-70],[29,67],[20,-22],[16,64],[-31,21],[-47,-41],[-33,7],[10,151],[36,190]],[[1746,6601],[154,-98],[35,72]],[[1935,6575],[-1,75]],[[1934,6650],[41,-4],[21,-29],[-9,-75],[39,-54],[161,-2],[28,-33],[-37,-52],[-10,-69],[27,-11],[46,31],[70,-99],[63,21],[61,-32],[60,11],[47,68],[90,54],[85,12],[97,74],[47,82],[66,68],[47,66]],[[2974,6677],[70,-17],[58,4],[72,44],[26,-69],[7,-103],[-24,-90],[-96,-90],[-83,-104],[-15,-132],[4,-81],[-33,-67],[60,20],[2,205],[15,42],[59,55],[47,77],[26,22],[29,-24],[13,-107],[49,-54],[106,-75],[116,-16],[337,65],[46,-6],[68,-62],[45,-99],[88,-109],[-33,-60],[-18,-72],[-8,-157],[-15,-71],[-130,-229],[-67,-57],[-32,-84],[4,-98],[-20,-95],[-45,-12],[-50,45],[-32,73],[51,24],[4,82],[-84,48],[-67,-121],[-46,-65],[35,-207],[-61,-39],[-31,35],[-25,91],[49,43],[-23,52],[-58,21],[-85,-39],[-24,26],[-52,92],[31,4],[75,60],[69,-64],[18,44],[-23,51],[1,39],[42,104],[-40,10],[-49,55],[-36,-21],[-20,20],[-12,-68],[-44,-34],[-37,-103],[-35,-56],[-76,-79],[-35,-58],[-20,-75],[10,-46],[46,-107],[9,-80],[-6,-60],[-43,-117],[59,24],[7,-22],[-36,-99],[-2,-174],[-8,-51],[-87,-128],[22,-73],[-24,-53],[-45,13],[-38,111],[-31,29],[-138,-8],[-49,-65],[-37,-18],[-73,6],[-35,-11],[35,-50],[203,-56],[14,-13],[-40,-152],[3,-25],[57,-5],[0,-21],[-58,-42],[-17,-34],[17,-52],[-19,-24],[-34,26],[-155,-57],[-71,-48],[-42,-5],[-87,43],[-50,56],[-29,8]],[[2240,3581],[8,63],[-24,46],[-78,20],[-18,36],[13,56],[-33,25],[-72,3],[-88,155],[-26,90],[-72,113],[-80,75],[-133,55],[-54,-15],[-38,-98],[-66,-104],[-49,-34],[-46,-86],[-82,-22],[-119,161],[-69,8],[-52,-32],[-37,-121],[8,-74],[-69,-37],[-24,11],[-99,88],[-46,15],[-63,-21],[-45,23],[-43,-22],[7,-53],[-89,-126],[-44,-2],[-129,99],[-273,-3]],[[3196,1030],[58,-3],[-3,78],[21,-38],[16,-94],[16,-19],[49,7],[-15,80],[70,-80],[-1,-49],[28,-22],[-111,-32],[-48,-54],[-32,19],[-244,342],[-31,120],[21,-30],[119,-86],[36,-42],[51,-97]],[[2408,1609],[84,-128],[45,-30],[63,-13],[45,-36],[37,-54],[55,-119],[55,-217],[0,-31],[-60,-5],[-77,-63],[-43,36],[-66,27],[-23,44],[37,23],[128,-88],[1,21],[-68,76],[-65,30],[-28,-5],[-34,-37],[-56,4],[-48,50],[-28,82],[5,102],[23,-9],[66,-85],[28,8],[-17,86],[-59,53],[-9,25],[16,51],[-111,-14],[-65,28],[-8,29],[39,64],[-72,-18],[-24,41],[125,76],[50,10],[59,-14]],[[3887,1158],[-136,-581],[-15,-39],[-53,-15],[-17,30],[-35,185],[-35,63],[-44,46],[56,15],[41,73],[21,68],[21,-21],[36,16],[-10,66],[-24,-18],[-25,18],[20,75],[30,57],[79,117],[35,31],[80,149],[10,89],[47,155],[55,120],[32,-19],[-68,-388],[-27,-103],[-74,-189]],[[450,2734],[53,-10],[20,-26],[-18,-107],[25,-124],[12,-27],[-35,-18],[-38,50],[-33,77],[-43,149],[-10,68],[15,44],[47,17],[5,-93]],[[3179,3272],[99,-86],[52,-93],[63,-24],[42,-38],[-44,12],[-24,-53],[27,-36],[-5,-44],[-41,-17],[-53,-96],[23,-52],[51,2],[27,70],[17,-6],[91,61],[53,21],[-10,63],[-38,29],[-2,43],[45,-49],[18,35],[-27,158],[29,-43],[-10,152],[27,2],[42,-59],[67,-140],[7,-73],[41,-55],[9,-44],[-16,-43],[-107,-70],[-98,12],[-41,-26],[5,-59],[44,15],[3,58],[123,-36],[22,-24],[139,-257],[45,-163],[9,-52],[-54,55],[-23,-9],[-10,-56],[45,-115],[15,-115],[-14,-115],[-21,-64],[-6,-86],[-40,-76],[-35,-105],[-40,-29],[-119,5],[-50,-21],[-68,-87],[-30,4],[-56,40],[-95,10],[-68,50],[-71,2],[-110,89],[-42,6],[-11,-93],[-55,70],[-52,19],[-54,-18],[-25,17],[108,105],[19,45],[-60,137],[-28,15],[-77,-23],[-51,51],[-17,-28],[5,-49],[49,-96],[-5,-52],[-57,7],[4,76],[-23,103],[10,88],[-78,35],[-34,32],[-23,61],[16,84],[-19,107],[4,108],[-15,15],[-63,-4],[-38,32],[-35,55],[73,29],[15,34],[-78,44],[48,-1],[-40,57],[-76,19],[-48,76],[38,-2],[80,-76],[36,11],[-140,158],[-52,14],[11,33],[48,33],[52,87],[77,19],[26,-6],[18,-78],[68,-46],[74,32],[140,122],[183,77],[63,57],[84,16],[10,-65],[25,33],[-5,65],[63,-19]],[[2240,3581],[-130,2],[-34,20],[-9,-45],[29,-17],[102,-3],[91,-108],[41,-97],[28,-9],[136,0],[-24,-36],[-73,-73],[-40,-64],[-65,-36],[-7,-72],[-89,-28],[-52,-36],[-48,23],[-31,-60],[-52,-21],[-24,-28],[52,-18],[96,38],[82,-56],[5,-35],[-21,-81],[-88,-43],[30,-107],[-10,-86],[63,-74],[-15,-54],[66,-159],[35,-30],[6,-51],[-37,-161],[-59,-28],[-84,19],[-53,-65],[-73,-42],[-11,-42],[35,-44],[-41,2],[-37,-26],[74,-19],[39,-40],[34,-67],[-38,-62],[-49,-47],[-66,-17],[-25,-24],[29,-46],[81,41],[48,1],[48,45],[31,-17],[87,-112],[77,-28],[30,-63],[33,-263],[-35,-14],[-37,19],[-11,-40],[35,-20],[23,-42],[2,-95],[-37,-1],[-33,73],[-58,-6],[-46,26],[17,44],[-35,75],[49,31],[-8,37],[-34,25],[-40,-16],[-58,-152],[-34,0],[-93,-112],[-29,-105],[-43,-6],[-29,35],[-75,-51],[-125,-4],[-24,13],[-22,112],[-24,27],[-300,91],[-111,58],[-113,25],[-130,-53],[-102,23],[1,76],[19,87],[-12,79],[-36,158],[5,101],[53,244],[-150,34],[-23,-28],[-3,-122],[-61,-80],[-44,-11],[-19,35],[-16,78],[16,233],[26,62],[59,11],[60,-23],[30,-39],[-59,-65],[4,-35],[162,-39],[29,15],[-3,59],[-27,108],[-18,134],[-10,134],[15,81],[1,67],[-16,79],[-23,209],[-21,60],[-35,36],[-51,16],[-95,2],[-68,28],[-58,68],[-128,242],[30,49],[-59,17],[-56,-37],[-12,-74],[42,-57],[-40,-42],[71,-39],[32,-48],[14,-53],[-18,-10],[-169,179],[-35,25],[-84,19],[-22,28],[-1,46],[79,269],[27,121],[18,130],[3,128],[-11,99]],[[1158,7501],[13,-114],[-17,-102],[-29,-65],[-8,62],[-21,25],[-34,-34],[-10,-45],[15,-51],[12,-104],[36,-46],[-38,-79],[-21,-72],[-38,-71],[-58,-59],[-8,-53],[-166,-56],[-38,104],[-50,71],[-44,23],[-58,-18],[11,52],[44,41],[-12,73],[39,35],[101,17],[35,57],[-67,19],[43,107],[-4,78],[78,28],[83,18],[42,29],[31,-13],[28,44],[47,121],[33,-26],[37,76],[18,-8],[-25,-64]],[[4386,8662],[11,-39],[-12,-59],[-65,22],[-109,-32],[39,-70],[-4,-50],[-33,-46],[-55,-115],[-44,-12],[-28,28],[-37,84],[-89,37],[-49,61],[1,19],[47,12],[83,94],[90,17],[25,33],[104,0],[58,37],[39,1],[28,-22]],[[1934,6650],[-12,-32],[13,-43]],[[1746,6601],[-30,81],[-21,27],[-85,-37],[-44,-49],[-31,-3],[-12,40],[16,39],[66,49],[22,96],[-38,37],[-44,79],[-12,108],[51,104],[-9,72],[-60,62],[52,141],[73,106],[40,23],[13,53],[210,87],[46,-2],[166,-84],[-20,-57],[31,-31],[33,18],[101,201],[102,62],[68,-22],[151,22],[-84,95],[-71,48],[-26,-1],[-78,-116],[-30,-18],[-52,57],[-27,-9],[-49,-56],[-58,-30],[-123,-2],[-324,-142],[-55,12],[-158,162],[-3,-63],[-99,-65],[-40,38],[-25,-5],[-48,-57],[-23,3],[-64,-79],[-12,42],[-28,17],[-56,-24],[20,-28],[-51,-57],[-70,-46],[-51,18],[-67,-27],[-23,-84],[-59,-100],[-13,-124],[-60,-114],[-48,-12],[-63,-63],[-11,-41],[12,-157],[-22,-49],[56,7],[24,-45],[-45,-47],[-50,36],[-36,1],[-45,-37],[-1,-24],[68,23],[64,-42],[99,53],[21,-10],[0,-110],[31,-71],[-35,-68],[-39,-15],[-23,-37],[-74,102],[-28,84],[-32,37],[-101,52],[-30,39],[-47,92],[-15,113],[-69,59],[-23,2],[20,-116],[4,-111],[-21,-3],[-11,65],[-2,145],[16,130],[32,96],[254,505],[76,97],[118,225],[44,52],[51,-1],[119,-51],[65,-5],[128,36],[57,35],[68,92],[26,14],[354,-63],[129,19],[128,58],[122,99],[107,144],[305,680],[54,96],[97,131],[49,113],[52,75],[69,16],[131,-11],[127,26],[116,62],[101,88],[173,214],[94,83],[80,24],[42,-12],[33,-32],[-76,-35],[-74,-85],[-116,-215],[-42,-189],[39,-141],[71,-130],[54,-154],[-42,-138],[1,-163],[30,-322],[-24,-48],[-72,-64],[-35,-51],[-50,-127],[-22,-86],[-16,-135],[-53,-201],[-38,-40],[-68,1],[-45,-16],[-120,98],[-87,115],[-59,30],[-47,58],[-35,13],[-28,-19],[-41,-80],[79,72],[29,-16],[140,-179],[47,-28],[54,-60],[31,-14],[115,-2],[26,-19],[-40,-61],[-28,-175],[26,-211],[16,-194],[35,-134],[29,-59],[-31,-28],[-52,23],[-63,0],[-47,-42],[-51,55],[-31,8],[-68,-52],[-57,-24],[-43,-44],[-52,-23],[-65,-59],[-197,-35],[-1,-21],[64,-14],[214,79],[72,50],[4,30],[50,-17],[47,36],[15,63],[69,-12],[-11,-42],[25,-5]],[[9627,2088],[54,-55],[66,1],[38,-87],[119,-106],[66,-29],[29,-39],[-20,-42],[15,-75],[-58,-160],[9,-83],[-58,-84],[-70,24],[-57,5],[-78,40],[-98,78],[-111,40],[-114,119],[-22,39],[18,67],[12,323],[17,66],[27,63],[34,133],[20,-16],[57,-105],[52,-70],[53,-47]],[[6630,3271],[-10,-7],[-46,88],[13,85],[27,27],[24,-32],[4,-105],[-12,-56]],[[6353,3095],[-31,-10],[-30,59],[-21,87],[0,70],[16,40],[51,69],[39,118],[18,30],[93,-301],[-48,-85],[-48,-29],[-39,-48]],[[5328,3656],[-19,75],[16,82],[23,71],[22,28],[75,36],[24,89],[-63,195],[10,59],[26,-3],[50,-66],[39,-30],[-9,-92],[56,-179],[25,-130],[4,-121],[-36,-67],[-51,23],[-24,-4]],[[5496,3622],[-91,60],[-22,-22],[-55,-4]],[[5642,3803],[-33,186],[-4,156],[-34,168],[-22,43],[-57,15],[-108,-55],[-41,-10],[-24,28],[24,77],[73,78],[136,104],[216,230],[113,78],[119,-6],[122,-87],[101,0],[77,-74],[41,-23],[74,-77],[-19,-49],[-58,-99],[-21,-53],[-57,-184],[60,-120],[30,-169],[38,-99],[-22,-215],[21,-65],[-30,-48],[-57,-139],[-53,-47],[-23,-76],[-31,-13],[-59,42],[-28,1],[-63,-47]],[[6043,3254],[-60,38],[-92,-1],[-18,17],[-54,-23],[-44,25],[-11,68],[7,51],[-13,33],[49,49],[88,68],[-40,82],[19,23],[-103,24],[-77,94],[-52,1]],[[4480,1213],[117,-112],[43,-120],[68,-36],[252,-183],[-31,115],[31,35],[38,-1],[49,24],[-17,73],[7,76],[108,-127],[9,-45],[34,-56],[44,-30],[-19,-21],[20,-56],[71,-76],[16,-30],[10,-93],[-70,-113],[57,-32],[-6,-67],[-45,-67],[-63,-26],[-220,62],[-72,-22],[-68,-40],[-54,-64],[-32,7],[-132,101],[-86,97],[-155,128],[-71,20],[-76,45],[-76,24],[-31,35],[-14,47],[9,53],[36,26],[83,-4],[27,66],[-43,29],[-84,143],[0,54],[19,49],[59,91],[20,-12],[203,54],[35,-21]],[[4906,1244],[-25,-54],[-59,100],[72,18],[22,-37],[-10,-27]],[[6296,1362],[22,-108],[-16,-52],[-56,-10],[-168,47],[-50,-10],[-49,-28],[-49,-51],[-75,-132],[-26,-20],[-42,8],[-90,58],[20,20],[0,56],[28,29],[-28,42],[50,58],[28,9],[-11,43],[79,-43],[77,43],[-8,57],[19,50],[-46,43],[-21,54],[21,32],[26,0],[30,-70],[48,-27],[116,-10],[124,-33],[47,-55]],[[5496,3622],[-21,-89],[-50,-60],[-18,-44],[29,-8],[40,23],[33,44],[4,50],[22,12],[45,-36],[11,-40],[-44,19],[4,-36],[69,-47],[11,66],[33,100],[4,70],[-26,157]],[[6043,3254],[-39,-28],[-118,-155],[-72,-185],[39,-164],[68,-78],[112,-18],[85,-79],[46,-96],[9,-100],[20,-84],[-29,-43],[-74,-66],[-297,-89],[-59,-61],[-28,-52],[-17,-65],[8,-53],[-22,-38],[-27,16],[11,68],[-16,43],[-29,12],[-59,-58],[-3,-32],[48,-53],[119,-14],[53,-23],[13,-73],[-18,-44],[-51,-39],[-4,-24],[53,-150],[-1,-60],[-19,-33],[-84,-25],[-48,-48],[-33,-8],[-49,27],[-77,93],[-47,10],[-19,-44],[6,-60],[-23,-67],[7,-80],[41,-24],[17,18],[-11,41],[49,23],[34,-87],[84,-86],[79,16],[104,-168],[0,-20],[-125,-131],[-21,-30],[-55,-137],[-95,-155],[-1,-100],[16,-178],[-4,-113],[-28,-3],[-29,48],[-84,238],[2,65],[56,129],[-49,26],[10,84],[-104,153],[-23,124],[-62,89],[-11,164],[-43,49],[0,24],[55,54],[33,-1],[43,-54],[48,57],[15,-23],[49,53],[-42,140],[-16,31],[-96,58],[-26,7],[-38,43],[-90,6],[-70,81],[76,-21],[149,-88],[75,-22],[-32,73],[-87,84],[-38,79],[123,29],[5,37],[-31,33],[-81,-7],[-24,41],[33,65],[-24,62],[-32,-1],[-65,-86],[-70,33],[-152,41],[-98,56],[-77,-44],[-98,1],[29,-44],[-84,19],[-22,46],[-10,85],[41,-20],[27,64],[-63,-24],[-1,95],[-112,127],[-13,29],[50,22],[3,32],[-32,23],[-36,-2],[-27,-65],[-31,15],[-20,93],[59,-3],[60,64],[46,20],[13,75],[-51,232],[-37,65],[-51,21],[-41,-29],[4,82],[69,29],[15,45],[-4,60],[-19,60],[-63,99],[-68,52],[-155,52],[0,24],[223,-24],[-23,53],[-122,76],[-35,73],[-24,15],[-74,6],[-22,37],[223,-43],[46,10],[89,44],[49,9],[-58,-39],[22,-56],[37,-43],[41,-15],[36,25],[-59,65],[19,23],[38,-25],[50,2],[72,54],[48,15],[39,44],[16,135],[-38,95],[71,-37],[33,17],[30,43],[49,-13],[39,85],[8,125],[-48,104],[-41,21],[-90,9],[-114,53],[-32,35],[-12,55],[181,-109],[37,11],[219,-42],[25,-31],[59,5],[100,38],[81,46],[10,-59],[-52,-96],[17,-34],[-33,-25],[-23,15],[9,44],[-45,-4],[-32,-39],[70,-154],[26,-87],[-20,-62],[-65,10],[-21,-10],[-43,-64],[-26,0],[23,-33],[71,10],[66,48],[26,-4],[24,-77],[10,-73],[-114,-26],[-36,-33],[18,-24],[84,1],[24,24],[59,-94],[10,-42],[-21,-86],[43,59],[63,167]]],"bbox":[8.094008386949522,54.568681356352016,15.151542519572724,57.75117023811088],"transform":{"scale":[0.0007058239956618863,0.00031828071624751117],"translate":[8.094008386949522,54.568681356352016]},"title":"Denmark","version":"2.1.0","copyright":"Copyright (c) 2023 Highsoft AS, Based on data from Natural Earth","copyrightShort":"Natural Earth","copyrightUrl":"http://www.naturalearthdata.com"}
--------------------------------------------------------------------------------