├── .gitignore ├── Pulumi.yaml ├── package.json ├── tsconfig.json ├── index.ts ├── README.md ├── azure-geo-code-list.ts └── aws-geo-code-list.ts /.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | /node_modules/ 3 | -------------------------------------------------------------------------------- /Pulumi.yaml: -------------------------------------------------------------------------------- 1 | name: geoip-testing-pulumi 2 | description: A minimal TypeScript Pulumi program 3 | runtime: 4 | name: nodejs 5 | options: 6 | packagemanager: npm 7 | config: 8 | pulumi:tags: 9 | value: 10 | pulumi:template: typescript 11 | gcp:project: 12 | value: geoip-testing-446019 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geoip-testing-pulumi", 3 | "main": "index.ts", 4 | "devDependencies": { 5 | "@types/node": "^22.0.0", 6 | "typescript": "^5.0.0" 7 | }, 8 | "dependencies": { 9 | "@pulumi/aws": "^6.66.2", 10 | "@pulumi/azure-native": "^2.80.0", 11 | "@pulumi/gcp": "^8.12.1", 12 | "@pulumi/pulumi": "^3.113.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "outDir": "bin", 5 | "target": "es2020", 6 | "module": "commonjs", 7 | "moduleResolution": "node", 8 | "sourceMap": true, 9 | "experimentalDecorators": true, 10 | "pretty": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "noImplicitReturns": true, 13 | "forceConsistentCasingInFileNames": true 14 | }, 15 | "files": [ 16 | "index.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import * as gcp from "@pulumi/gcp"; 2 | import * as azure from "@pulumi/azure-native"; 3 | import * as aws from "@pulumi/aws"; 4 | import * as azgcl from './azure-geo-code-list'; 5 | import * as awsgcl from './aws-geo-code-list'; 6 | 7 | // GCP creates a new DNS zone and record set for each GCP computing region. 8 | // It cannot discern by states or other boundaries. 9 | async function createGcpResources() { 10 | const available = await gcp.compute.getRegions({}); 11 | const regionNames = available.names; 12 | 13 | // Create a Google Cloud DNS Zone 14 | const dnsZone = new gcp.dns.ManagedZone("test", { 15 | dnsName: "gcp.geoip-test.mindflakes.com.", 16 | description: "GCP zone for testing the GeoIP lookup", 17 | }); 18 | 19 | // Create a Google Cloud DNS Record Set 20 | // We want to test with CNAME records, so we need to create a CNAME record for 21 | // each region 22 | // Just set examples 23 | new gcp.dns.RecordSet("geoip-test", { 24 | managedZone: dnsZone.name, 25 | name: "test.gcp.geoip-test.mindflakes.com.", 26 | type: "CNAME", 27 | ttl: 60, 28 | routingPolicy: { 29 | geos: regionNames.map((region) => { 30 | return { 31 | location: region, 32 | rrdatas: [`test-result-${region}.gcp.geoip-test.mindflakes.com.`], 33 | }; 34 | }) 35 | }, 36 | }); 37 | } 38 | 39 | // Azure is special in that it can only make 200 endpoints per profile. 40 | // We make a top level profile for determining geoip by continent GEO. 41 | // Then we make a sub profile for each GEO with all the endpoints in that continent GEO 42 | // excluding the endpoints with subregions. 43 | async function createAzureResources() { 44 | // Create a new Azure Traffic Manager Profile for each GEO 45 | const continentRegions = azgcl.default.properties.geographicHierarchy.regions; 46 | 47 | // Create an Azure Traffic Manager Profile for continent detection 48 | const continentEndpoints = continentRegions.map((continentRegion) => { 49 | return { 50 | type: "Microsoft.Network/trafficManagerProfiles/externalEndpoints", 51 | // I guess it can't have slashes 52 | name: continentRegion.name.replace(/\//g, '-'), 53 | alwaysServe: azure.network.AlwaysServe.Enabled, 54 | target: `test-result-${continentRegion.code.toLowerCase()}.azure.geoip-test.mindflakes.com`, 55 | endpointStatus: azure.network.EndpointStatus.Enabled, 56 | geoMapping: [ 57 | continentRegion.code, 58 | ] 59 | }; 60 | }); 61 | 62 | new azure.network.Profile("geoip-test-WORLD", { 63 | resourceGroupName: "geoip-test", 64 | location: "global", 65 | trafficRoutingMethod: "Geographic", 66 | dnsConfig: { 67 | relativeName: 'world-geoip-test', 68 | }, 69 | // Unused but needed for bringup 70 | monitorConfig: { 71 | protocol: "http", 72 | port: 80, 73 | path: "/" 74 | }, 75 | endpoints: continentEndpoints, 76 | }); 77 | 78 | // Create an Azure Traffic Manager Profile for each continent GEO. 79 | // There may be regions that have subregions. For those, don't include the region itself but the subregions. 80 | azgcl.default.properties.geographicHierarchy.regions.forEach((continentRegion) => { 81 | const continentCode = continentRegion.code; 82 | type Region = { 83 | readonly code: string; 84 | readonly name: string; 85 | readonly regions: readonly Region[]; 86 | } 87 | // flatMap the region, subregions. 88 | const countryOrStateProvinceRegions = continentRegion.regions.flatMap( 89 | (countryOrStateRegion) => { 90 | if (countryOrStateRegion.regions.length > 0) { 91 | return [countryOrStateRegion as Region, ...countryOrStateRegion.regions]; 92 | } else { 93 | return [countryOrStateRegion]; 94 | } 95 | }); 96 | 97 | const continentRegionTestEndpoints = countryOrStateProvinceRegions.map((countyOrStateProvinceRegion) => { 98 | return { 99 | type: "Microsoft.Network/trafficManagerProfiles/externalEndpoints", 100 | name: countyOrStateProvinceRegion.name, 101 | alwaysServe: azure.network.AlwaysServe.Enabled, 102 | target: `test-result-${countyOrStateProvinceRegion.code.toLowerCase()}.azure.geoip-test.mindflakes.com`, 103 | endpointStatus: azure.network.EndpointStatus.Enabled, 104 | geoMapping: [ 105 | countyOrStateProvinceRegion.code, 106 | ] 107 | }; 108 | }); 109 | 110 | new azure.network.Profile(`geoip-test-${continentCode}`, { 111 | resourceGroupName: "geoip-test", 112 | location: "global", 113 | trafficRoutingMethod: "Geographic", 114 | dnsConfig: { 115 | relativeName: `${continentCode.toLowerCase()}-geoip-test`, 116 | }, 117 | // Unused but needed for bringup 118 | monitorConfig: { 119 | protocol: "http", 120 | port: 80, 121 | path: "/" 122 | }, 123 | endpoints: [ 124 | ...continentRegionTestEndpoints, 125 | // Fallback for unknown regions 126 | { 127 | type: "Microsoft.Network/trafficManagerProfiles/externalEndpoints", 128 | name: 'ERROR', 129 | alwaysServe: azure.network.AlwaysServe.Enabled, 130 | target: `test-result-error-unknown-wrong-continent-maybe.azure.geoip-test.mindflakes.com`, 131 | endpointStatus: azure.network.EndpointStatus.Enabled, 132 | geoMapping: [ 133 | 'WORLD', 134 | ] 135 | } 136 | ], 137 | }); 138 | }); 139 | } 140 | 141 | // Similar limitations to Azure, AWS can only have 100 endpoints per zone. 142 | async function createAwsResources() { 143 | const delegatedSet = new aws.route53.DelegationSet("geoip-test", { 144 | referenceName: "geoip-test", 145 | }); 146 | 147 | // Create an upper zone with the continent Location data. These are identified by having a 148 | const rootHostedZone = new aws.route53.Zone("aws.geoip-test.mindflakes.com", { 149 | name: "aws.geoip-test.mindflakes.com", 150 | delegationSetId: delegatedSet.id 151 | }); 152 | 153 | // Create a record set for each continent 154 | // Continents are identified by having a ContinentName 155 | const continentGeoLocations = awsgcl.default.GeoLocationDetailsList.filter( 156 | (geoLocation) => geoLocation.ContinentName !== undefined 157 | ).filter( 158 | // Skip Antarctica 159 | (geoLocation) => geoLocation.ContinentName !== "Antarctica" 160 | ); 161 | 162 | const continentRecords = continentGeoLocations.map((geoLocation) => 163 | new aws.route53.Record(`geo-ip-test-${geoLocation.ContinentCode.toLowerCase()}`, { 164 | zoneId: rootHostedZone.zoneId, 165 | name: `test`, 166 | type: "CNAME", 167 | ttl: 60, 168 | records: [ 169 | `test-result-${geoLocation.ContinentCode.toLowerCase()}.aws.geoip-test.mindflakes.com`, 170 | ], 171 | geolocationRoutingPolicies: [{ 172 | continent: geoLocation.ContinentCode, 173 | }], 174 | setIdentifier: geoLocation.ContinentName, 175 | }) 176 | ); 177 | // Add a default record for unknown locations 178 | new aws.route53.Record(`geo-ip-test-default`, { 179 | zoneId: rootHostedZone.zoneId, 180 | name: `test`, 181 | type: "CNAME", 182 | ttl: 60, 183 | records: [ 184 | `test-result-error-unknown-wrong-continent-maybe.aws.geoip-test.mindflakes.com`, 185 | ], 186 | geolocationRoutingPolicies: [{ 187 | country: "*", 188 | }], 189 | setIdentifier: "Default", 190 | }); 191 | 192 | continentGeoLocations.forEach((geoLocation) => { 193 | const continentZone = new aws.route53.Zone(`${geoLocation.ContinentCode.toLowerCase()}-geoip-test.aws.geoip-test.mindflakes.com`, { 194 | name: `${geoLocation.ContinentCode.toLowerCase()}-geoip-test.aws.geoip-test.mindflakes.com`, 195 | }); 196 | new aws.route53.Record(`${geoLocation.ContinentName}-ns`, { 197 | zoneId: rootHostedZone.zoneId, 198 | name: `${geoLocation.ContinentCode.toLowerCase()}-geoip-test`, 199 | type: "NS", 200 | ttl: 60, 201 | records: continentZone.nameServers.apply((nameServers) => nameServers), 202 | }); 203 | // Inside of each continent zone, make a record for each country or state 204 | const countryOrStateProvinceGeoLocations = awsgcl.default.GeoLocationDetailsList.filter( 205 | (countryOrStateProvinceGeoLocation) => countryOrStateProvinceGeoLocation.ContinentCode === geoLocation.ContinentCode 206 | ).filter( 207 | (geoLocation) => geoLocation.CountryName !== undefined && geoLocation.CountryCode !== undefined 208 | ) 209 | const countryOrStateProvinceRecords = countryOrStateProvinceGeoLocations.map( 210 | (countryOrStateProvinceGeoLocation) => { 211 | let name = countryOrStateProvinceGeoLocation.CountryName; 212 | let code = countryOrStateProvinceGeoLocation.CountryCode; 213 | if (countryOrStateProvinceGeoLocation.SubdivisionName !== undefined && countryOrStateProvinceGeoLocation.SubdivisionCode !== undefined) { 214 | name = `${countryOrStateProvinceGeoLocation.CountryName}-${countryOrStateProvinceGeoLocation.SubdivisionName}`; 215 | code = `${countryOrStateProvinceGeoLocation.CountryCode}-${countryOrStateProvinceGeoLocation.SubdivisionCode}`; 216 | } 217 | let routingPolicy: { 218 | country: string; 219 | subdivision?: string; 220 | }; 221 | if (countryOrStateProvinceGeoLocation.SubdivisionName !== undefined && countryOrStateProvinceGeoLocation.SubdivisionCode !== undefined) { 222 | routingPolicy = { 223 | country: countryOrStateProvinceGeoLocation.CountryCode, 224 | subdivision: countryOrStateProvinceGeoLocation.SubdivisionCode, 225 | }; 226 | } else { 227 | routingPolicy = { 228 | country: countryOrStateProvinceGeoLocation.CountryCode, 229 | }; 230 | } 231 | new aws.route53.Record(`geo-ip-test-${name}`, { 232 | zoneId: continentZone.zoneId, 233 | name: `test.${geoLocation.ContinentCode.toLowerCase()}-geoip-test.aws.geoip-test.mindflakes.com`, 234 | type: "CNAME", 235 | ttl: 60, 236 | records: [ 237 | `test-result-${code.toLowerCase()}.aws.geoip-test.mindflakes.com`, 238 | ], 239 | geolocationRoutingPolicies: [routingPolicy], 240 | setIdentifier: code, 241 | }) 242 | }); 243 | // Add a default record for unknown locations 244 | new aws.route53.Record(`geo-ip-test-${geoLocation.ContinentName}-default`, { 245 | zoneId: continentZone.zoneId, 246 | name: `test.${geoLocation.ContinentCode.toLowerCase()}-geoip-test.aws.geoip-test.mindflakes.com`, 247 | type: "CNAME", 248 | ttl: 60, 249 | records: [ 250 | `test-result-error-unknown-wrong-continent-maybe.aws.geoip-test.mindflakes.com`, 251 | ], 252 | geolocationRoutingPolicies: [{ 253 | country: "*", 254 | }], 255 | setIdentifier: "Default", 256 | }); 257 | return 258 | }); 259 | 260 | } 261 | 262 | export = async () => { 263 | await Promise.all([ 264 | createGcpResources(), 265 | createAzureResources(), 266 | createAwsResources(), 267 | ]); 268 | } 269 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Taken down due to cost. 2 | 3 | # 🗺️ Cloud GeoIP via DNS Test Tool 4 | 5 | *Hey clouds, where do your DNS servers think I am?* 6 | 7 | Make sure that your ISP's DNS server or a third-party DNS server is returning the correct results from popular cloud providers via DNS-based geolocation. 8 | 9 | While this tool isn’t comprehensive—services can use many other geolocation methods or route traffic differently using non-DNS methods such as Anycast—it is specifically designed to test DNS-based GeoIP routing. DNS-based GeoIP routing works by directing users to region-specific servers based on their IP address as resolved through DNS queries. However, some services use Anycast, a networking technique where the same IP address is advertised from multiple geographic locations, allowing traffic to be routed dynamically to the nearest server based on network topology rather than DNS. Additionally, services may rely on application-level geolocation, such as using a client’s public IP address after a connection is established, to make routing decisions. Despite these complexities, this tool focuses on DNS-based mechanisms, which can still provide valuable insights when diagnosing issues like high latency or unexpected regional behaviors. 10 | 11 | This tool is made up of: 12 | 13 | * Cloud configuration via Pulumi to configure popular cloud providers to use GeoIP routing in their DNS offerings for you to test against. This part is mainly for transparency, showing how DNS records are set up. I've already set up the infrastructure for you which you can test against. 14 | * A simple guide on how to use the `dig` or PowerShell cmdlet to query a CNAME record with geo-routing. This part is for you. 15 | 16 | The rest of this README explains how to use the infrastructure set up to test DNS-based GeoIP routing. 17 | 18 | ## Table of Contents 19 | 20 | - [🗺️ Cloud GeoIP via DNS Testing Tool](#️-cloud-geoip-via-dns-testing-tool) 21 | - [Table of Contents](#table-of-contents) 22 | - [Prerequisites](#prerequisites) 23 | - [Linux/macOS](#linuxmacos) 24 | - [Windows](#windows) 25 | - [Testing](#testing) 26 | - [Pick a Domain](#pick-a-domain) 27 | - [Query the CNAME Record for the Domain](#query-the-cname-record-for-the-domain) 28 | - [Linux/macOS](#linuxmacos-1) 29 | - [Windows](#windows-1) 30 | - [Understanding the Output](#understanding-the-output) 31 | - [Tips for Testing](#tips-for-testing) 32 | - [Test against Different DNS Servers](#test-against-different-dns-servers) 33 | - [Pitfalls](#pitfalls) 34 | - [Development](#development) 35 | - [Trivia and Observations](#trivia-and-observations) 36 | - [Useful Tools](#useful-tools) 37 | 38 | ## Prerequisites 39 | 40 | You’ll need a Linux, Mac, or Windows desktop or laptop with access to a terminal or PowerShell. 41 | 42 | Unfortunately, testing from a mobile device or game console isn’t currently feasible here without significant cost. 43 | 44 | ### Linux/macOS 45 | 46 | Ensure `dig` is installed on your system. It’s part of the `dnsutils` package on most Linux distributions. On macOS, it’s included by default. 47 | 48 | To install on Ubuntu/Debian: 49 | 50 | ```bash 51 | sudo apt-get install dnsutils 52 | ``` 53 | 54 | To install on Red Hat: 55 | 56 | ```bash 57 | sudo dnf install bind-utils 58 | ``` 59 | 60 | ### Windows 61 | 62 | Modern Windows has PowerShell installed. You can use the `Resolve-DnsName` cmdlet to query DNS records. Open PowerShell by searching for it in the Start menu. 63 | 64 | ## Testing 65 | 66 | This “tool” works by querying a domain name that can return different responses based on where you’re resolving from. The tool tests GeoIP via DNS. It does not test via HTTP or non-DNS. 67 | 68 | ### Pick a Domain 69 | 70 | First, pick the domain(s) you want to query based on the cloud provider you want to test against. I suggest testing all the major cloud providers. 71 | 72 | For Azure and AWS, test against the continent-determining domain first to see if it recognizes your continent. Then, use the continent-specific domains to see if it can pinpoint your location more accurately. 73 | 74 | Here are the domains and notes: 75 | 76 | * **Google Cloud Platform (GCP)** 77 | * Note: GCP’s DNS GeoIP is less granular compared to Azure and AWS. It typically has a few regions tied to Google's datacenter locations. 78 | * `test.gcp.geoip-test.mindflakes.com` 79 | * **Azure** 80 | * Note: Azure has extremely fine-grained DNS GeoIP. Unfortunately, I couldn’t combine all options into a single domain because there’s a maximum of 200 routing options per “traffic manager profile.” For Azure tests, you need the correct domain name for the continent you’re testing from. 81 | * **Continent** 82 | * `world-geoip-test.trafficmanager.net` 83 | * **Africa** 84 | * `geo-af-geoip-test.trafficmanager.net` 85 | * **Antarctica (Hi! 🐧)** 86 | * `geo-an-geoip-test.trafficmanager.net` 87 | * **Asia** 88 | * `geo-as-geoip-test.trafficmanager.net` 89 | * **Asia Pacific** 90 | * `geo-ap-geoip-test.trafficmanager.net` 91 | * **Europe** 92 | * `geo-eu-geoip-test.trafficmanager.net` 93 | * **Middle East** 94 | * `geo-me-geoip-test.trafficmanager.net` 95 | * **North America** 96 | * `geo-na-geoip-test.trafficmanager.net` 97 | * **South America** 98 | * `geo-sa-geoip-test.trafficmanager.net` 99 | * **Amazon Web Services (AWS)** 100 | * Note: AWS also has highly granular DNS GeoIP. Unfortunately, I couldn’t combine all options into a single domain for testing because there’s a maximum of 100 routing options per Hosted Zone. For AWS tests, you need the correct domain name for the continent you’re testing from. 101 | * **Continent** 102 | * `test.aws.geoip-test.mindflakes.com` 103 | * **Africa** 104 | * `test.af-geoip-test.aws.geoip-test.mindflakes.com` 105 | * **Asia** 106 | * `test.as-geoip-test.aws.geoip-test.mindflakes.com` 107 | * **Europe** 108 | * `test.eu-geoip-test.aws.geoip-test.mindflakes.com` 109 | * **Oceania** 110 | * `test.oc-geoip-test.aws.geoip-test.mindflakes.com` 111 | * **North America** 112 | * `test.na-geoip-test.aws.geoip-test.mindflakes.com` 113 | * **South America** 114 | * `test.sa-geoip-test.aws.geoip-test.mindflakes.com` 115 | * **Antarctica is omited for cost savings** 116 | 117 | ### Query the CNAME Record for the Domain 118 | 119 | For example, to query the CNAME record for `test.gcp.geoip-test.mindflakes.com`, replace it with whichever domain you wish to test. 120 | 121 | ### Linux/macOS 122 | 123 | ```bash 124 | dig CNAME test.gcp.geoip-test.mindflakes.com 125 | ``` 126 | 127 | Example output: 128 | 129 | ``` 130 | nelson@Mac ~ % dig CNAME test.gcp.geoip-test.mindflakes.com 131 | 132 | ; <<>> DiG 9.10.6 <<>> CNAME test.gcp.geoip-test.mindflakes.com 133 | ;; global options: +cmd 134 | ;; Got answer: 135 | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11583 136 | ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 137 | 138 | ;; OPT PSEUDOSECTION: 139 | ; EDNS: version: 0, flags:; udp: 512 140 | ;; QUESTION SECTION: 141 | ;test.gcp.geoip-test.mindflakes.com. IN CNAME 142 | 143 | ;; ANSWER SECTION: 144 | test.gcp.geoip-test.mindflakes.com. 60 IN CNAME test-result-us-west2.gcp.geoip-test.mindflakes.com. 145 | 146 | ;; Query time: 54 msec 147 | ;; SERVER: 100.100.100.100#53(100.100.100.100) 148 | ;; WHEN: Thu Jan 02 23:42:05 PST 2025 149 | ;; MSG SIZE rcvd: 98 150 | 151 | nelson@Mac ~ % 152 | ``` 153 | 154 | ### Windows 155 | 156 | ```powershell 157 | Resolve-DnsName -Name test.gcp.geoip-test.mindflakes.com -Type CNAME 158 | ``` 159 | 160 | Example output: 161 | 162 | ``` 163 | PS C:\Users\Nelson> Resolve-DnsName -Name test.gcp.geoip-test.mindflakes.com -Type CNAME 164 | 165 | Name Type TTL Section NameHost 166 | ---- ---- --- ------- -------- 167 | test.gcp.geoip-test.mindflakes CNAME 60 Answer test-result-us-west2.gcp.geoip-test.mindflakes.com 168 | .com 169 | 170 | 171 | PS C:\Users\Nelson> 172 | ``` 173 | 174 | ## Understanding the Output 175 | 176 | The output shows the CNAME record that was resolved. This record points to a domain associated with the region the DNS GeoIP system believes you’re closest to. In the example above, the record points to `test-result-us-west2.gcp.geoip-test.mindflakes.com`, indicating GeoIP sees you as nearest to the `us-west2` region in Google Cloud Platform. Google Cloud regions can be found [on their site along with the "machine" name for the region](https://cloud.google.com/about/locations). 177 | 178 | Below is an Azure example. Azure’s GeoIP can be more fine-grained than GCP’s: 179 | 180 | Mac/Linux: 181 | ``` 182 | nelson@Mac ~ % dig CNAME geo-na-geoip-test.trafficmanager.net 183 | 184 | ; <<>> DiG 9.10.6 <<>> CNAME geo-na-geoip-test.trafficmanager.net 185 | ;; global options: +cmd 186 | ;; Got answer: 187 | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16044 188 | ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 189 | 190 | ;; OPT PSEUDOSECTION: 191 | ; EDNS: version: 0, flags:; udp: 512 192 | ;; QUESTION SECTION: 193 | ;geo-na-geoip-test.trafficmanager.net. IN CNAME 194 | 195 | ;; ANSWER SECTION: 196 | geo-na-geoip-test.trafficmanager.net. 0 IN CNAME test-result-us-ca.azure.geoip-test.mindflakes.com. 197 | 198 | ;; Query time: 19 msec 199 | ;; SERVER: 100.100.100.100#53(100.100.100.100) 200 | ;; WHEN: Thu Jan 02 23:47:04 PST 2025 201 | ;; MSG SIZE rcvd: 128 202 | 203 | nelson@Mac ~ % 204 | ``` 205 | 206 | Windows: 207 | ``` 208 | PS C:\Users\Nelson> Resolve-DnsName -Name geo-na-geoip-test.trafficmanager.net -Type CNAME 209 | 210 | Name Type TTL Section NameHost 211 | ---- ---- --- ------- -------- 212 | geo-na-geoip-test.trafficmanag CNAME 0 Answer test-result-us-ca.azure.geoip-test.mindflakes.com 213 | er.net 214 | 215 | 216 | PS C:\Users\Nelson> 217 | ``` 218 | 219 | As you can see, it resolves to `test-result-us-ca.azure.geoip-test.mindflakes.com`, suggesting GeoIP thinks you’re near `us-ca` (California). You can find region code mappings in the [./azure-geo-code-list.ts](./azure-geo-code-list.ts) file. 220 | 221 | Now, an AWS example: 222 | 223 | Mac/Linux: 224 | ``` 225 | nelson@Mac ~ % dig CNAME test.na-geoip-test.aws.geoip-test.mindflakes.com 226 | 227 | ; <<>> DiG 9.10.6 <<>> CNAME test.na-geoip-test.aws.geoip-test.mindflakes.com 228 | ;; global options: +cmd 229 | ;; Got answer: 230 | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41423 231 | ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 232 | 233 | ;; OPT PSEUDOSECTION: 234 | ; EDNS: version: 0, flags:; udp: 512 235 | ;; QUESTION SECTION: 236 | ;test.na-geoip-test.aws.geoip-test.mindflakes.com. IN CNAME 237 | 238 | ;; ANSWER SECTION: 239 | test.na-geoip-test.aws.geoip-test.mindflakes.com. 60 IN CNAME test-result-us-ca.aws.geoip-test.mindflakes.com. 240 | 241 | ;; Query time: 21 msec 242 | ;; SERVER: 100.100.100.100#53(100.100.100.100) 243 | ;; WHEN: Fri Jan 03 13:48:12 PST 2025 244 | ;; MSG SIZE rcvd: 109 245 | 246 | nelson@Mac ~ % 247 | ``` 248 | 249 | Windows: 250 | ``` 251 | PS C:\Users\Nelson> Resolve-DnsName -Name test.na-geoip-test.aws.geoip-test.mindflakes.com -Type CNAME 252 | 253 | Name Type TTL Section NameHost 254 | ---- ---- --- ------- -------- 255 | test.na-geoip-test.aws.geoip-t CNAME 60 Answer test-result-us-ca.aws.geoip-test.mindflakes.com 256 | est.mindflakes.com 257 | 258 | 259 | PS C:\Users\Nelson> 260 | ``` 261 | 262 | Here it points to `test-result-us-ca.aws.geoip-test.mindflakes.com`, indicating you’re near the `us-ca` region in AWS. If needed, refer to the [./aws-geo-code-list.ts](./aws-geo-code-list.ts) file for code mappings. 263 | 264 | Sometimes you’ll see a CNAME that indicates a GeoIP error or fallback. Below is a sample from a GCP Paris VM testing the AWS North America domain: 265 | 266 | ``` 267 | crazysim@instance-20250103-215639:~$ dig CNAME test.na-geoip-test.aws.geoip-test.mindflakes.com 268 | 269 | ; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> CNAME test.na-geoip-test.aws.geoip-test.mindflakes.com 270 | ;; global options: +cmd 271 | ;; Got answer: 272 | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43922 273 | ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 274 | 275 | ;; OPT PSEUDOSECTION: 276 | ; EDNS: version: 0, flags:; udp: 65494 277 | ;; QUESTION SECTION: 278 | ;test.na-geoip-test.aws.geoip-test.mindflakes.com. IN CNAME 279 | 280 | ;; ANSWER SECTION: 281 | test.na-geoip-test.aws.geoip-test.mindflakes.com. 60 IN CNAME test-result-error-unknown-wrong-continent-maybe.aws.geoip-test.mindflakes.com. 282 | 283 | ;; Query time: 28 msec 284 | ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) 285 | ;; WHEN: Fri Jan 03 21:58:24 UTC 2025 286 | ;; MSG SIZE rcvd: 139 287 | 288 | crazysim@instance-20250103-215639:~$ 289 | ``` 290 | 291 | If you encounter this, ensure you’re testing from within the intended continent. It might also be an actual bug in the DNS GeoIP routing system. 292 | 293 | ## Tips for Testing 294 | 295 | ### Test against Different DNS Servers 296 | 297 | You can test against different DNS servers with `dig` or `Resolve-DnsName` from the system configuration. This can help you see how different DNS servers resolve the same domain. 298 | 299 | For example, to test against Google’s public DNS servers on Linux/macOS or Windows: 300 | 301 | ```bash 302 | dig @8.8.8.8 CNAME test.gcp.geoip-test.mindflakes.com 303 | ``` 304 | 305 | ```powershell 306 | Resolve-DnsName -Name test.gcp.geoip-test.mindflakes.com -Type CNAME -Server 8.8.8.8 307 | ``` 308 | 309 | ## Pitfalls 310 | 311 | * **DNS Caching**: DNS records may be cached by your ISP, local network, or computer. If you see unexpected results, try flushing your DNS cache or waiting a few minutes. 312 | * Flushing DNS Cache on Windows: `ipconfig /flushdns` 313 | * Flushing DNS Cache on macOS: `sudo killall -HUP mDNSResponder` 314 | * Flushing DNS Cache on Linux: `sudo systemd-resolve --flush-caches` 315 | * These commands can vary by system; consult your documentation. 316 | * **VPN**: If you’re using a VPN, the GeoIP system will see you as being in the VPN server’s location. This can be useful for testing but may yield misleading results if you’re not trying to appear in that location. 317 | * **DNS not coming out of your normal traffic route**: It's possible for DNS to take a different route to the internet than your non-DNS traffic. This may affect results. 318 | * **It’s not perfect**: DNS-based GeoIP routing is just one of many methods that services use to determine your location. It’s not always accurate and can be affected by factors like IP block reassignment and slow database updates. 319 | 320 | ## Development 321 | 322 | This is a simple Pulumi project specific to my setup that sets up DNS records for GeoIP routing tests. I run `pulumi up` to deploy the infrastructure on my own cloud account. I needed Pulumi installed and configured with multiple cloud providers’ credentials. The estimated cost to run this was about $(0.25+0.50*7)/month, since Google and AWS charges per zone. Other providers charge by query, which should be minimal. We don’t need extra features like monitoring for this test. 323 | 324 | edit: this cost too much on azure. Just use this temporaily. 325 | 326 | I don’t expect most people to fork/run this themselves, but I’m providing the code for transparency. Feel free to fork or reference it if needed for your own specific testing or scenario. 327 | 328 | ## Trivia and Observations 329 | 330 | * Azure has a proper geographical heirarchy for GeoIP routing, with continent, region, and country options. It even has provinces for Canada, Australia, and states for the US. 331 | * AWS is relatively flat and only has subregions for the US states and **Ukraine**'s oblasts. Continental division for the source data had to be enriched from AI. There are no subregions for Canada or Australia. I’m not sure why Ukraine is singled out but it might due to the conflict with Russia and the need for granularity. 332 | * AWS has more "countries" for Antarctica than Azure. Azure has one, while AWS has three. For cost reasons, I am not setting up AWS testing against Antarctica though. 333 | 334 | ## Useful Tools 335 | 336 | * [whatsmydns.net](https://www.whatsmydns.net/) – A site that displays DNS records from various locations around the world. It’s not perfect, but it’s a quick way to see if things look correct globally. 337 | * **Google** 338 | * [Check CNAME](https://www.whatsmydns.net/#CNAME/test.gcp.geoip-test.mindflakes.com) 339 | * **Azure** 340 | * **World** 341 | * [Check CNAME](https://www.whatsmydns.net/#CNAME/world-geoip-test.trafficmanager.net) 342 | * **North America** 343 | * [Check CNAME](https://www.whatsmydns.net/#CNAME/geo-na-geoip-test.trafficmanager.net) 344 | * **AWS** 345 | * **World** 346 | * [Check CNAME](https://www.whatsmydns.net/#CNAME/test.aws.geoip-test.mindflakes.com) 347 | * **North America** 348 | * [Check CNAME](https://www.whatsmydns.net/#CNAME/test.na-geoip-test.aws.geoip-test.mindflakes.com) 349 | -------------------------------------------------------------------------------- /azure-geo-code-list.ts: -------------------------------------------------------------------------------- 1 | // From https://learn.microsoft.com/en-us/rest/api/trafficmanager/geographic-hierarchies/get-default?view=rest-trafficmanager-2022-04-01&tabs=HTTP&tryIt=true&source=docs#code-try-0 2 | 3 | // Countries may change but not enough to warrant pulling a whole client. 4 | 5 | const data = { 6 | "id": "/providers/Microsoft.Network/trafficManagerGeographicHierarchies/default", 7 | "name": "default", 8 | "type": "Microsoft.Network/trafficManagerGeographicHierarchies", 9 | "properties": { 10 | "geographicHierarchy": { 11 | "code": "WORLD", 12 | "name": "World", 13 | "regions": [ 14 | { 15 | "code": "GEO-EU", 16 | "name": "Europe", 17 | "regions": [ 18 | { 19 | "code": "AD", 20 | "name": "Andorra", 21 | "regions": [] 22 | }, 23 | { 24 | "code": "AL", 25 | "name": "Albania", 26 | "regions": [] 27 | }, 28 | { 29 | "code": "AT", 30 | "name": "Austria", 31 | "regions": [] 32 | }, 33 | { 34 | "code": "AX", 35 | "name": "Åland Islands", 36 | "regions": [] 37 | }, 38 | { 39 | "code": "BA", 40 | "name": "Bosnia and Herzegovina", 41 | "regions": [] 42 | }, 43 | { 44 | "code": "BE", 45 | "name": "Belgium", 46 | "regions": [] 47 | }, 48 | { 49 | "code": "BG", 50 | "name": "Bulgaria", 51 | "regions": [] 52 | }, 53 | { 54 | "code": "BY", 55 | "name": "Belarus", 56 | "regions": [] 57 | }, 58 | { 59 | "code": "CH", 60 | "name": "Switzerland", 61 | "regions": [] 62 | }, 63 | { 64 | "code": "CY", 65 | "name": "Cyprus", 66 | "regions": [] 67 | }, 68 | { 69 | "code": "CZ", 70 | "name": "Czech Republic", 71 | "regions": [] 72 | }, 73 | { 74 | "code": "DE", 75 | "name": "Germany", 76 | "regions": [] 77 | }, 78 | { 79 | "code": "DK", 80 | "name": "Denmark", 81 | "regions": [] 82 | }, 83 | { 84 | "code": "EE", 85 | "name": "Estonia", 86 | "regions": [] 87 | }, 88 | { 89 | "code": "ES", 90 | "name": "Spain", 91 | "regions": [] 92 | }, 93 | { 94 | "code": "FI", 95 | "name": "Finland", 96 | "regions": [] 97 | }, 98 | { 99 | "code": "FO", 100 | "name": "Faroe Islands", 101 | "regions": [] 102 | }, 103 | { 104 | "code": "FR", 105 | "name": "France", 106 | "regions": [] 107 | }, 108 | { 109 | "code": "GB", 110 | "name": "United Kingdom", 111 | "regions": [] 112 | }, 113 | { 114 | "code": "GG", 115 | "name": "Guernsey", 116 | "regions": [] 117 | }, 118 | { 119 | "code": "GI", 120 | "name": "Gibraltar", 121 | "regions": [] 122 | }, 123 | { 124 | "code": "GR", 125 | "name": "Greece", 126 | "regions": [] 127 | }, 128 | { 129 | "code": "HR", 130 | "name": "Croatia", 131 | "regions": [] 132 | }, 133 | { 134 | "code": "HU", 135 | "name": "Hungary", 136 | "regions": [] 137 | }, 138 | { 139 | "code": "IE", 140 | "name": "Ireland", 141 | "regions": [] 142 | }, 143 | { 144 | "code": "IM", 145 | "name": "Isle of Man", 146 | "regions": [] 147 | }, 148 | { 149 | "code": "IS", 150 | "name": "Iceland", 151 | "regions": [] 152 | }, 153 | { 154 | "code": "IT", 155 | "name": "Italy", 156 | "regions": [] 157 | }, 158 | { 159 | "code": "JE", 160 | "name": "Jersey", 161 | "regions": [] 162 | }, 163 | { 164 | "code": "LI", 165 | "name": "Liechtenstein", 166 | "regions": [] 167 | }, 168 | { 169 | "code": "LT", 170 | "name": "Lithuania", 171 | "regions": [] 172 | }, 173 | { 174 | "code": "LU", 175 | "name": "Luxembourg", 176 | "regions": [] 177 | }, 178 | { 179 | "code": "LV", 180 | "name": "Latvia", 181 | "regions": [] 182 | }, 183 | { 184 | "code": "MC", 185 | "name": "Monaco", 186 | "regions": [] 187 | }, 188 | { 189 | "code": "MD", 190 | "name": "Moldova", 191 | "regions": [] 192 | }, 193 | { 194 | "code": "ME", 195 | "name": "Montenegro", 196 | "regions": [] 197 | }, 198 | { 199 | "code": "MK", 200 | "name": "North Macedonia", 201 | "regions": [] 202 | }, 203 | { 204 | "code": "MT", 205 | "name": "Malta", 206 | "regions": [] 207 | }, 208 | { 209 | "code": "NL", 210 | "name": "Netherlands", 211 | "regions": [] 212 | }, 213 | { 214 | "code": "NO", 215 | "name": "Norway", 216 | "regions": [] 217 | }, 218 | { 219 | "code": "PL", 220 | "name": "Poland", 221 | "regions": [] 222 | }, 223 | { 224 | "code": "PT", 225 | "name": "Portugal", 226 | "regions": [] 227 | }, 228 | { 229 | "code": "RO", 230 | "name": "Romania", 231 | "regions": [] 232 | }, 233 | { 234 | "code": "RS", 235 | "name": "Serbia", 236 | "regions": [] 237 | }, 238 | { 239 | "code": "RU", 240 | "name": "Russia", 241 | "regions": [] 242 | }, 243 | { 244 | "code": "SE", 245 | "name": "Sweden", 246 | "regions": [] 247 | }, 248 | { 249 | "code": "SI", 250 | "name": "Slovenia", 251 | "regions": [] 252 | }, 253 | { 254 | "code": "SJ", 255 | "name": "Svalbard", 256 | "regions": [] 257 | }, 258 | { 259 | "code": "SK", 260 | "name": "Slovakia", 261 | "regions": [] 262 | }, 263 | { 264 | "code": "SM", 265 | "name": "San Marino", 266 | "regions": [] 267 | }, 268 | { 269 | "code": "UA", 270 | "name": "Ukraine", 271 | "regions": [ 272 | { 273 | "code": "UA-CR", 274 | "name": "Region of Crimea", 275 | "regions": [] 276 | } 277 | ] 278 | }, 279 | { 280 | "code": "VA", 281 | "name": "Vatican City", 282 | "regions": [] 283 | }, 284 | { 285 | "code": "XJ", 286 | "name": "Jan Mayen", 287 | "regions": [] 288 | }, 289 | { 290 | "code": "XK", 291 | "name": "Kosovo", 292 | "regions": [] 293 | } 294 | ] 295 | }, 296 | { 297 | "code": "GEO-ME", 298 | "name": "Middle East", 299 | "regions": [ 300 | { 301 | "code": "AE", 302 | "name": "United Arab Emirates", 303 | "regions": [] 304 | }, 305 | { 306 | "code": "BH", 307 | "name": "Bahrain", 308 | "regions": [] 309 | }, 310 | { 311 | "code": "IL", 312 | "name": "Israel", 313 | "regions": [] 314 | }, 315 | { 316 | "code": "IQ", 317 | "name": "Iraq", 318 | "regions": [] 319 | }, 320 | { 321 | "code": "IR", 322 | "name": "Iran", 323 | "regions": [] 324 | }, 325 | { 326 | "code": "JO", 327 | "name": "Jordan", 328 | "regions": [] 329 | }, 330 | { 331 | "code": "KW", 332 | "name": "Kuwait", 333 | "regions": [] 334 | }, 335 | { 336 | "code": "LB", 337 | "name": "Lebanon", 338 | "regions": [] 339 | }, 340 | { 341 | "code": "OM", 342 | "name": "Oman", 343 | "regions": [] 344 | }, 345 | { 346 | "code": "PS", 347 | "name": "Palestinian Authority", 348 | "regions": [] 349 | }, 350 | { 351 | "code": "QA", 352 | "name": "Qatar", 353 | "regions": [] 354 | }, 355 | { 356 | "code": "SY", 357 | "name": "Syria", 358 | "regions": [] 359 | }, 360 | { 361 | "code": "SA", 362 | "name": "Saudi Arabia", 363 | "regions": [] 364 | }, 365 | { 366 | "code": "TR", 367 | "name": "Turkey", 368 | "regions": [] 369 | }, 370 | { 371 | "code": "YE", 372 | "name": "Yemen", 373 | "regions": [] 374 | } 375 | ] 376 | }, 377 | { 378 | "code": "GEO-NA", 379 | "name": "North America / Central America / Caribbean", 380 | "regions": [ 381 | { 382 | "code": "AG", 383 | "name": "Antigua and Barbuda", 384 | "regions": [] 385 | }, 386 | { 387 | "code": "AI", 388 | "name": "Anguilla", 389 | "regions": [] 390 | }, 391 | { 392 | "code": "AW", 393 | "name": "Aruba", 394 | "regions": [] 395 | }, 396 | { 397 | "code": "BB", 398 | "name": "Barbados", 399 | "regions": [] 400 | }, 401 | { 402 | "code": "BL", 403 | "name": "Saint Barthélemy", 404 | "regions": [] 405 | }, 406 | { 407 | "code": "BM", 408 | "name": "Bermuda", 409 | "regions": [] 410 | }, 411 | { 412 | "code": "BQ", 413 | "name": "Bonaire", 414 | "regions": [] 415 | }, 416 | { 417 | "code": "BS", 418 | "name": "Bahamas", 419 | "regions": [] 420 | }, 421 | { 422 | "code": "BZ", 423 | "name": "Belize", 424 | "regions": [] 425 | }, 426 | { 427 | "code": "CA", 428 | "name": "Canada", 429 | "regions": [ 430 | { 431 | "code": "CA-AB", 432 | "name": "Alberta", 433 | "regions": [] 434 | }, 435 | { 436 | "code": "CA-BC", 437 | "name": "British Columbia", 438 | "regions": [] 439 | }, 440 | { 441 | "code": "CA-MB", 442 | "name": "Manitoba", 443 | "regions": [] 444 | }, 445 | { 446 | "code": "CA-NB", 447 | "name": "New Brunswick", 448 | "regions": [] 449 | }, 450 | { 451 | "code": "CA-NL", 452 | "name": "Newfoundland and Labrador", 453 | "regions": [] 454 | }, 455 | { 456 | "code": "CA-NS", 457 | "name": "Nova Scotia", 458 | "regions": [] 459 | }, 460 | { 461 | "code": "CA-NT", 462 | "name": "Northwest Territories", 463 | "regions": [] 464 | }, 465 | { 466 | "code": "CA-NU", 467 | "name": "Nunavut", 468 | "regions": [] 469 | }, 470 | { 471 | "code": "CA-ON", 472 | "name": "Ontario", 473 | "regions": [] 474 | }, 475 | { 476 | "code": "CA-PE", 477 | "name": "Prince Edward Island", 478 | "regions": [] 479 | }, 480 | { 481 | "code": "CA-QC", 482 | "name": "Québec", 483 | "regions": [] 484 | }, 485 | { 486 | "code": "CA-SK", 487 | "name": "Saskatchewan", 488 | "regions": [] 489 | }, 490 | { 491 | "code": "CA-YT", 492 | "name": "Yukon Territory", 493 | "regions": [] 494 | } 495 | ] 496 | }, 497 | { 498 | "code": "CR", 499 | "name": "Costa Rica", 500 | "regions": [] 501 | }, 502 | { 503 | "code": "CU", 504 | "name": "Cuba", 505 | "regions": [] 506 | }, 507 | { 508 | "code": "CW", 509 | "name": "Curaçao", 510 | "regions": [] 511 | }, 512 | { 513 | "code": "DM", 514 | "name": "Dominica", 515 | "regions": [] 516 | }, 517 | { 518 | "code": "DO", 519 | "name": "Dominican Republic", 520 | "regions": [] 521 | }, 522 | { 523 | "code": "GD", 524 | "name": "Grenada", 525 | "regions": [] 526 | }, 527 | { 528 | "code": "GL", 529 | "name": "Greenland", 530 | "regions": [] 531 | }, 532 | { 533 | "code": "GP", 534 | "name": "Guadeloupe", 535 | "regions": [] 536 | }, 537 | { 538 | "code": "GT", 539 | "name": "Guatemala", 540 | "regions": [] 541 | }, 542 | { 543 | "code": "HN", 544 | "name": "Honduras", 545 | "regions": [] 546 | }, 547 | { 548 | "code": "HT", 549 | "name": "Haiti", 550 | "regions": [] 551 | }, 552 | { 553 | "code": "JM", 554 | "name": "Jamaica", 555 | "regions": [] 556 | }, 557 | { 558 | "code": "KN", 559 | "name": "Saint Kitts and Nevis", 560 | "regions": [] 561 | }, 562 | { 563 | "code": "KY", 564 | "name": "Cayman Islands", 565 | "regions": [] 566 | }, 567 | { 568 | "code": "LC", 569 | "name": "Saint Lucia", 570 | "regions": [] 571 | }, 572 | { 573 | "code": "MF", 574 | "name": "Saint Martin", 575 | "regions": [] 576 | }, 577 | { 578 | "code": "MQ", 579 | "name": "Martinique", 580 | "regions": [] 581 | }, 582 | { 583 | "code": "MS", 584 | "name": "Montserrat", 585 | "regions": [] 586 | }, 587 | { 588 | "code": "MX", 589 | "name": "Mexico", 590 | "regions": [] 591 | }, 592 | { 593 | "code": "NI", 594 | "name": "Nicaragua", 595 | "regions": [] 596 | }, 597 | { 598 | "code": "PA", 599 | "name": "Panama", 600 | "regions": [] 601 | }, 602 | { 603 | "code": "PM", 604 | "name": "Saint Pierre and Miquelon", 605 | "regions": [] 606 | }, 607 | { 608 | "code": "PR", 609 | "name": "Puerto Rico", 610 | "regions": [] 611 | }, 612 | { 613 | "code": "SV", 614 | "name": "El Salvador", 615 | "regions": [] 616 | }, 617 | { 618 | "code": "SX", 619 | "name": "Sint Maarten", 620 | "regions": [] 621 | }, 622 | { 623 | "code": "TC", 624 | "name": "Turks and Caicos Islands", 625 | "regions": [] 626 | }, 627 | { 628 | "code": "TT", 629 | "name": "Trinidad and Tobago", 630 | "regions": [] 631 | }, 632 | { 633 | "code": "UM", 634 | "name": "U.S. Outlying Islands", 635 | "regions": [] 636 | }, 637 | { 638 | "code": "US", 639 | "name": "United States", 640 | "regions": [ 641 | { 642 | "code": "US-AK", 643 | "name": "Alaska", 644 | "regions": [] 645 | }, 646 | { 647 | "code": "US-AL", 648 | "name": "Alabama", 649 | "regions": [] 650 | }, 651 | { 652 | "code": "US-AR", 653 | "name": "Arkansas", 654 | "regions": [] 655 | }, 656 | { 657 | "code": "US-AZ", 658 | "name": "Arizona", 659 | "regions": [] 660 | }, 661 | { 662 | "code": "US-CA", 663 | "name": "California", 664 | "regions": [] 665 | }, 666 | { 667 | "code": "US-CO", 668 | "name": "Colorado", 669 | "regions": [] 670 | }, 671 | { 672 | "code": "US-CT", 673 | "name": "Connecticut", 674 | "regions": [] 675 | }, 676 | { 677 | "code": "US-DC", 678 | "name": "District of Columbia", 679 | "regions": [] 680 | }, 681 | { 682 | "code": "US-DE", 683 | "name": "Delaware", 684 | "regions": [] 685 | }, 686 | { 687 | "code": "US-FL", 688 | "name": "Florida", 689 | "regions": [] 690 | }, 691 | { 692 | "code": "US-GA", 693 | "name": "Georgia", 694 | "regions": [] 695 | }, 696 | { 697 | "code": "US-HI", 698 | "name": "Hawaii", 699 | "regions": [] 700 | }, 701 | { 702 | "code": "US-IA", 703 | "name": "Iowa", 704 | "regions": [] 705 | }, 706 | { 707 | "code": "US-ID", 708 | "name": "Idaho", 709 | "regions": [] 710 | }, 711 | { 712 | "code": "US-IL", 713 | "name": "Illinois", 714 | "regions": [] 715 | }, 716 | { 717 | "code": "US-IN", 718 | "name": "Indiana", 719 | "regions": [] 720 | }, 721 | { 722 | "code": "US-KS", 723 | "name": "Kansas", 724 | "regions": [] 725 | }, 726 | { 727 | "code": "US-KY", 728 | "name": "Kentucky", 729 | "regions": [] 730 | }, 731 | { 732 | "code": "US-LA", 733 | "name": "Louisiana", 734 | "regions": [] 735 | }, 736 | { 737 | "code": "US-MA", 738 | "name": "Massachusetts", 739 | "regions": [] 740 | }, 741 | { 742 | "code": "US-MD", 743 | "name": "Maryland", 744 | "regions": [] 745 | }, 746 | { 747 | "code": "US-ME", 748 | "name": "Maine", 749 | "regions": [] 750 | }, 751 | { 752 | "code": "US-MI", 753 | "name": "Michigan", 754 | "regions": [] 755 | }, 756 | { 757 | "code": "US-MN", 758 | "name": "Minnesota", 759 | "regions": [] 760 | }, 761 | { 762 | "code": "US-MO", 763 | "name": "Missouri", 764 | "regions": [] 765 | }, 766 | { 767 | "code": "US-MS", 768 | "name": "Mississippi", 769 | "regions": [] 770 | }, 771 | { 772 | "code": "US-MT", 773 | "name": "Montana", 774 | "regions": [] 775 | }, 776 | { 777 | "code": "US-NC", 778 | "name": "North Carolina", 779 | "regions": [] 780 | }, 781 | { 782 | "code": "US-ND", 783 | "name": "North Dakota", 784 | "regions": [] 785 | }, 786 | { 787 | "code": "US-NE", 788 | "name": "Nebraska", 789 | "regions": [] 790 | }, 791 | { 792 | "code": "US-NH", 793 | "name": "New Hampshire", 794 | "regions": [] 795 | }, 796 | { 797 | "code": "US-NJ", 798 | "name": "New Jersey", 799 | "regions": [] 800 | }, 801 | { 802 | "code": "US-NM", 803 | "name": "New Mexico", 804 | "regions": [] 805 | }, 806 | { 807 | "code": "US-NV", 808 | "name": "Nevada", 809 | "regions": [] 810 | }, 811 | { 812 | "code": "US-NY", 813 | "name": "New York", 814 | "regions": [] 815 | }, 816 | { 817 | "code": "US-OH", 818 | "name": "Ohio", 819 | "regions": [] 820 | }, 821 | { 822 | "code": "US-OK", 823 | "name": "Oklahoma", 824 | "regions": [] 825 | }, 826 | { 827 | "code": "US-OR", 828 | "name": "Oregon", 829 | "regions": [] 830 | }, 831 | { 832 | "code": "US-PA", 833 | "name": "Pennsylvania", 834 | "regions": [] 835 | }, 836 | { 837 | "code": "US-RI", 838 | "name": "Rhode Island", 839 | "regions": [] 840 | }, 841 | { 842 | "code": "US-SC", 843 | "name": "South Carolina", 844 | "regions": [] 845 | }, 846 | { 847 | "code": "US-SD", 848 | "name": "South Dakota", 849 | "regions": [] 850 | }, 851 | { 852 | "code": "US-TN", 853 | "name": "Tennessee", 854 | "regions": [] 855 | }, 856 | { 857 | "code": "US-TX", 858 | "name": "Texas", 859 | "regions": [] 860 | }, 861 | { 862 | "code": "US-UT", 863 | "name": "Utah", 864 | "regions": [] 865 | }, 866 | { 867 | "code": "US-VA", 868 | "name": "Virginia", 869 | "regions": [] 870 | }, 871 | { 872 | "code": "US-VT", 873 | "name": "Vermont", 874 | "regions": [] 875 | }, 876 | { 877 | "code": "US-WA", 878 | "name": "Washington", 879 | "regions": [] 880 | }, 881 | { 882 | "code": "US-WI", 883 | "name": "Wisconsin", 884 | "regions": [] 885 | }, 886 | { 887 | "code": "US-WV", 888 | "name": "West Virginia", 889 | "regions": [] 890 | }, 891 | { 892 | "code": "US-WY", 893 | "name": "Wyoming", 894 | "regions": [] 895 | } 896 | ] 897 | }, 898 | { 899 | "code": "VC", 900 | "name": "Saint Vincent and the Grenadines", 901 | "regions": [] 902 | }, 903 | { 904 | "code": "VG", 905 | "name": "British Virgin Islands", 906 | "regions": [] 907 | }, 908 | { 909 | "code": "VI", 910 | "name": "U.S. Virgin Islands", 911 | "regions": [] 912 | }, 913 | { 914 | "code": "XE", 915 | "name": "Sint Eustatius", 916 | "regions": [] 917 | }, 918 | { 919 | "code": "XS", 920 | "name": "Saba", 921 | "regions": [] 922 | } 923 | ] 924 | }, 925 | { 926 | "code": "GEO-AS", 927 | "name": "Asia", 928 | "regions": [ 929 | { 930 | "code": "AF", 931 | "name": "Afghanistan", 932 | "regions": [] 933 | }, 934 | { 935 | "code": "AM", 936 | "name": "Armenia", 937 | "regions": [] 938 | }, 939 | { 940 | "code": "AZ", 941 | "name": "Azerbaijan", 942 | "regions": [] 943 | }, 944 | { 945 | "code": "BD", 946 | "name": "Bangladesh", 947 | "regions": [] 948 | }, 949 | { 950 | "code": "BN", 951 | "name": "Brunei", 952 | "regions": [] 953 | }, 954 | { 955 | "code": "BT", 956 | "name": "Bhutan", 957 | "regions": [] 958 | }, 959 | { 960 | "code": "CC", 961 | "name": "Cocos (Keeling) Islands", 962 | "regions": [] 963 | }, 964 | { 965 | "code": "CN", 966 | "name": "China", 967 | "regions": [] 968 | }, 969 | { 970 | "code": "CX", 971 | "name": "Christmas Island", 972 | "regions": [] 973 | }, 974 | { 975 | "code": "GE", 976 | "name": "Georgia", 977 | "regions": [] 978 | }, 979 | { 980 | "code": "HK", 981 | "name": "Hong Kong SAR", 982 | "regions": [] 983 | }, 984 | { 985 | "code": "ID", 986 | "name": "Indonesia", 987 | "regions": [] 988 | }, 989 | { 990 | "code": "IN", 991 | "name": "India", 992 | "regions": [] 993 | }, 994 | { 995 | "code": "IO", 996 | "name": "British Indian Ocean Territory", 997 | "regions": [] 998 | }, 999 | { 1000 | "code": "JP", 1001 | "name": "Japan", 1002 | "regions": [] 1003 | }, 1004 | { 1005 | "code": "KG", 1006 | "name": "Kyrgyzstan", 1007 | "regions": [] 1008 | }, 1009 | { 1010 | "code": "KH", 1011 | "name": "Cambodia", 1012 | "regions": [] 1013 | }, 1014 | { 1015 | "code": "KP", 1016 | "name": "North Korea", 1017 | "regions": [] 1018 | }, 1019 | { 1020 | "code": "KR", 1021 | "name": "Korea", 1022 | "regions": [] 1023 | }, 1024 | { 1025 | "code": "KZ", 1026 | "name": "Kazakhstan", 1027 | "regions": [] 1028 | }, 1029 | { 1030 | "code": "LA", 1031 | "name": "Laos", 1032 | "regions": [] 1033 | }, 1034 | { 1035 | "code": "LK", 1036 | "name": "Sri Lanka", 1037 | "regions": [] 1038 | }, 1039 | { 1040 | "code": "MM", 1041 | "name": "Myanmar", 1042 | "regions": [] 1043 | }, 1044 | { 1045 | "code": "MN", 1046 | "name": "Mongolia", 1047 | "regions": [] 1048 | }, 1049 | { 1050 | "code": "MO", 1051 | "name": "Macao SAR", 1052 | "regions": [] 1053 | }, 1054 | { 1055 | "code": "MV", 1056 | "name": "Maldives", 1057 | "regions": [] 1058 | }, 1059 | { 1060 | "code": "MY", 1061 | "name": "Malaysia", 1062 | "regions": [] 1063 | }, 1064 | { 1065 | "code": "NP", 1066 | "name": "Nepal", 1067 | "regions": [] 1068 | }, 1069 | { 1070 | "code": "PH", 1071 | "name": "Philippines", 1072 | "regions": [] 1073 | }, 1074 | { 1075 | "code": "PK", 1076 | "name": "Pakistan", 1077 | "regions": [] 1078 | }, 1079 | { 1080 | "code": "SG", 1081 | "name": "Singapore", 1082 | "regions": [] 1083 | }, 1084 | { 1085 | "code": "TH", 1086 | "name": "Thailand", 1087 | "regions": [] 1088 | }, 1089 | { 1090 | "code": "TJ", 1091 | "name": "Tajikistan", 1092 | "regions": [] 1093 | }, 1094 | { 1095 | "code": "TL", 1096 | "name": "Timor_Leste", 1097 | "regions": [] 1098 | }, 1099 | { 1100 | "code": "TM", 1101 | "name": "Turkmenistan", 1102 | "regions": [] 1103 | }, 1104 | { 1105 | "code": "TW", 1106 | "name": "Taiwan", 1107 | "regions": [] 1108 | }, 1109 | { 1110 | "code": "UZ", 1111 | "name": "Uzbekistan", 1112 | "regions": [] 1113 | }, 1114 | { 1115 | "code": "VN", 1116 | "name": "Vietnam", 1117 | "regions": [] 1118 | } 1119 | ] 1120 | }, 1121 | { 1122 | "code": "GEO-AF", 1123 | "name": "Africa", 1124 | "regions": [ 1125 | { 1126 | "code": "AO", 1127 | "name": "Angola", 1128 | "regions": [] 1129 | }, 1130 | { 1131 | "code": "BF", 1132 | "name": "Burkina Faso", 1133 | "regions": [] 1134 | }, 1135 | { 1136 | "code": "BI", 1137 | "name": "Burundi", 1138 | "regions": [] 1139 | }, 1140 | { 1141 | "code": "BJ", 1142 | "name": "Benin", 1143 | "regions": [] 1144 | }, 1145 | { 1146 | "code": "BV", 1147 | "name": "Bouvet Island", 1148 | "regions": [] 1149 | }, 1150 | { 1151 | "code": "BW", 1152 | "name": "Botswana", 1153 | "regions": [] 1154 | }, 1155 | { 1156 | "code": "CD", 1157 | "name": "Congo (DRC)", 1158 | "regions": [] 1159 | }, 1160 | { 1161 | "code": "CF", 1162 | "name": "Central African Republic", 1163 | "regions": [] 1164 | }, 1165 | { 1166 | "code": "CG", 1167 | "name": "Congo", 1168 | "regions": [] 1169 | }, 1170 | { 1171 | "code": "CI", 1172 | "name": "Côte d’Ivoire", 1173 | "regions": [] 1174 | }, 1175 | { 1176 | "code": "CM", 1177 | "name": "Cameroon", 1178 | "regions": [] 1179 | }, 1180 | { 1181 | "code": "CV", 1182 | "name": "Cabo Verde", 1183 | "regions": [] 1184 | }, 1185 | { 1186 | "code": "DJ", 1187 | "name": "Djibouti", 1188 | "regions": [] 1189 | }, 1190 | { 1191 | "code": "DZ", 1192 | "name": "Algeria", 1193 | "regions": [] 1194 | }, 1195 | { 1196 | "code": "EG", 1197 | "name": "Egypt", 1198 | "regions": [] 1199 | }, 1200 | { 1201 | "code": "ER", 1202 | "name": "Eritrea", 1203 | "regions": [] 1204 | }, 1205 | { 1206 | "code": "ET", 1207 | "name": "Ethiopia", 1208 | "regions": [] 1209 | }, 1210 | { 1211 | "code": "GA", 1212 | "name": "Gabon", 1213 | "regions": [] 1214 | }, 1215 | { 1216 | "code": "GH", 1217 | "name": "Ghana", 1218 | "regions": [] 1219 | }, 1220 | { 1221 | "code": "GM", 1222 | "name": "Gambia", 1223 | "regions": [] 1224 | }, 1225 | { 1226 | "code": "GN", 1227 | "name": "Guinea", 1228 | "regions": [] 1229 | }, 1230 | { 1231 | "code": "GQ", 1232 | "name": "Equatorial Guinea", 1233 | "regions": [] 1234 | }, 1235 | { 1236 | "code": "GW", 1237 | "name": "Guinea_Bissau", 1238 | "regions": [] 1239 | }, 1240 | { 1241 | "code": "KE", 1242 | "name": "Kenya", 1243 | "regions": [] 1244 | }, 1245 | { 1246 | "code": "KM", 1247 | "name": "Comoros", 1248 | "regions": [] 1249 | }, 1250 | { 1251 | "code": "LR", 1252 | "name": "Liberia", 1253 | "regions": [] 1254 | }, 1255 | { 1256 | "code": "LS", 1257 | "name": "Lesotho", 1258 | "regions": [] 1259 | }, 1260 | { 1261 | "code": "LY", 1262 | "name": "Libya", 1263 | "regions": [] 1264 | }, 1265 | { 1266 | "code": "MA", 1267 | "name": "Morocco", 1268 | "regions": [] 1269 | }, 1270 | { 1271 | "code": "MG", 1272 | "name": "Madagascar", 1273 | "regions": [] 1274 | }, 1275 | { 1276 | "code": "ML", 1277 | "name": "Mali", 1278 | "regions": [] 1279 | }, 1280 | { 1281 | "code": "MR", 1282 | "name": "Mauritania", 1283 | "regions": [] 1284 | }, 1285 | { 1286 | "code": "MU", 1287 | "name": "Mauritius", 1288 | "regions": [] 1289 | }, 1290 | { 1291 | "code": "MW", 1292 | "name": "Malawi", 1293 | "regions": [] 1294 | }, 1295 | { 1296 | "code": "MZ", 1297 | "name": "Mozambique", 1298 | "regions": [] 1299 | }, 1300 | { 1301 | "code": "NA", 1302 | "name": "Namibia", 1303 | "regions": [] 1304 | }, 1305 | { 1306 | "code": "NE", 1307 | "name": "Niger", 1308 | "regions": [] 1309 | }, 1310 | { 1311 | "code": "NG", 1312 | "name": "Nigeria", 1313 | "regions": [] 1314 | }, 1315 | { 1316 | "code": "RE", 1317 | "name": "Réunion", 1318 | "regions": [] 1319 | }, 1320 | { 1321 | "code": "RW", 1322 | "name": "Rwanda", 1323 | "regions": [] 1324 | }, 1325 | { 1326 | "code": "SC", 1327 | "name": "Seychelles", 1328 | "regions": [] 1329 | }, 1330 | { 1331 | "code": "SD", 1332 | "name": "Sudan", 1333 | "regions": [] 1334 | }, 1335 | { 1336 | "code": "SH", 1337 | "name": "St Helena, Ascension, Tristan da Cunha", 1338 | "regions": [] 1339 | }, 1340 | { 1341 | "code": "SL", 1342 | "name": "Sierra Leone", 1343 | "regions": [] 1344 | }, 1345 | { 1346 | "code": "SN", 1347 | "name": "Senegal", 1348 | "regions": [] 1349 | }, 1350 | { 1351 | "code": "SO", 1352 | "name": "Somalia", 1353 | "regions": [] 1354 | }, 1355 | { 1356 | "code": "SS", 1357 | "name": "South Sudan", 1358 | "regions": [] 1359 | }, 1360 | { 1361 | "code": "ST", 1362 | "name": "São Tomé and Príncipe", 1363 | "regions": [] 1364 | }, 1365 | { 1366 | "code": "SZ", 1367 | "name": "Swaziland", 1368 | "regions": [] 1369 | }, 1370 | { 1371 | "code": "TD", 1372 | "name": "Chad", 1373 | "regions": [] 1374 | }, 1375 | { 1376 | "code": "TF", 1377 | "name": "French Southern Territories", 1378 | "regions": [] 1379 | }, 1380 | { 1381 | "code": "TG", 1382 | "name": "Togo", 1383 | "regions": [] 1384 | }, 1385 | { 1386 | "code": "TN", 1387 | "name": "Tunisia", 1388 | "regions": [] 1389 | }, 1390 | { 1391 | "code": "TZ", 1392 | "name": "Tanzania", 1393 | "regions": [] 1394 | }, 1395 | { 1396 | "code": "UG", 1397 | "name": "Uganda", 1398 | "regions": [] 1399 | }, 1400 | { 1401 | "code": "YT", 1402 | "name": "Mayotte", 1403 | "regions": [] 1404 | }, 1405 | { 1406 | "code": "ZA", 1407 | "name": "South Africa", 1408 | "regions": [] 1409 | }, 1410 | { 1411 | "code": "ZM", 1412 | "name": "Zambia", 1413 | "regions": [] 1414 | }, 1415 | { 1416 | "code": "ZW", 1417 | "name": "Zimbabwe", 1418 | "regions": [] 1419 | } 1420 | ] 1421 | }, 1422 | { 1423 | "code": "GEO-AN", 1424 | "name": "Antarctica", 1425 | "regions": [ 1426 | { 1427 | "code": "AQ", 1428 | "name": "Antarctica", 1429 | "regions": [] 1430 | } 1431 | ] 1432 | }, 1433 | { 1434 | "code": "GEO-SA", 1435 | "name": "South America", 1436 | "regions": [ 1437 | { 1438 | "code": "AR", 1439 | "name": "Argentina", 1440 | "regions": [] 1441 | }, 1442 | { 1443 | "code": "BO", 1444 | "name": "Bolivia", 1445 | "regions": [] 1446 | }, 1447 | { 1448 | "code": "BR", 1449 | "name": "Brazil", 1450 | "regions": [] 1451 | }, 1452 | { 1453 | "code": "CL", 1454 | "name": "Chile", 1455 | "regions": [] 1456 | }, 1457 | { 1458 | "code": "CO", 1459 | "name": "Colombia", 1460 | "regions": [] 1461 | }, 1462 | { 1463 | "code": "EC", 1464 | "name": "Ecuador", 1465 | "regions": [] 1466 | }, 1467 | { 1468 | "code": "FK", 1469 | "name": "Falkland Islands", 1470 | "regions": [] 1471 | }, 1472 | { 1473 | "code": "GF", 1474 | "name": "French Guiana", 1475 | "regions": [] 1476 | }, 1477 | { 1478 | "code": "GS", 1479 | "name": "South Georgia and South Sandwich Islands", 1480 | "regions": [] 1481 | }, 1482 | { 1483 | "code": "GY", 1484 | "name": "Guyana", 1485 | "regions": [] 1486 | }, 1487 | { 1488 | "code": "PE", 1489 | "name": "Peru", 1490 | "regions": [] 1491 | }, 1492 | { 1493 | "code": "PY", 1494 | "name": "Paraguay", 1495 | "regions": [] 1496 | }, 1497 | { 1498 | "code": "SR", 1499 | "name": "Suriname", 1500 | "regions": [] 1501 | }, 1502 | { 1503 | "code": "UY", 1504 | "name": "Uruguay", 1505 | "regions": [] 1506 | }, 1507 | { 1508 | "code": "VE", 1509 | "name": "Venezuela", 1510 | "regions": [] 1511 | } 1512 | ] 1513 | }, 1514 | { 1515 | "code": "GEO-AP", 1516 | "name": "Australia / Pacific", 1517 | "regions": [ 1518 | { 1519 | "code": "AS", 1520 | "name": "American Samoa", 1521 | "regions": [] 1522 | }, 1523 | { 1524 | "code": "AU", 1525 | "name": "Australia", 1526 | "regions": [ 1527 | { 1528 | "code": "AU-ACT", 1529 | "name": "Australian Capital Territory", 1530 | "regions": [] 1531 | }, 1532 | { 1533 | "code": "AU-NSW", 1534 | "name": "New South Wales", 1535 | "regions": [] 1536 | }, 1537 | { 1538 | "code": "AU-NT", 1539 | "name": "Northern Territory", 1540 | "regions": [] 1541 | }, 1542 | { 1543 | "code": "AU-QLD", 1544 | "name": "Queensland", 1545 | "regions": [] 1546 | }, 1547 | { 1548 | "code": "AU-SA", 1549 | "name": "South Australia", 1550 | "regions": [] 1551 | }, 1552 | { 1553 | "code": "AU-TAS", 1554 | "name": "Tasmania", 1555 | "regions": [] 1556 | }, 1557 | { 1558 | "code": "AU-VIC", 1559 | "name": "Victoria", 1560 | "regions": [] 1561 | }, 1562 | { 1563 | "code": "AU-WA", 1564 | "name": "Western Australia", 1565 | "regions": [] 1566 | } 1567 | ] 1568 | }, 1569 | { 1570 | "code": "CK", 1571 | "name": "Cook Islands", 1572 | "regions": [] 1573 | }, 1574 | { 1575 | "code": "FJ", 1576 | "name": "Fiji", 1577 | "regions": [] 1578 | }, 1579 | { 1580 | "code": "FM", 1581 | "name": "Micronesia", 1582 | "regions": [] 1583 | }, 1584 | { 1585 | "code": "GU", 1586 | "name": "Guam", 1587 | "regions": [] 1588 | }, 1589 | { 1590 | "code": "HM", 1591 | "name": "Heard Island and McDonald Islands", 1592 | "regions": [] 1593 | }, 1594 | { 1595 | "code": "KI", 1596 | "name": "Kiribati", 1597 | "regions": [] 1598 | }, 1599 | { 1600 | "code": "MH", 1601 | "name": "Marshall Islands", 1602 | "regions": [] 1603 | }, 1604 | { 1605 | "code": "MP", 1606 | "name": "Northern Mariana Islands", 1607 | "regions": [] 1608 | }, 1609 | { 1610 | "code": "NC", 1611 | "name": "New Caledonia", 1612 | "regions": [] 1613 | }, 1614 | { 1615 | "code": "NF", 1616 | "name": "Norfolk Island", 1617 | "regions": [] 1618 | }, 1619 | { 1620 | "code": "NR", 1621 | "name": "Nauru", 1622 | "regions": [] 1623 | }, 1624 | { 1625 | "code": "NU", 1626 | "name": "Niue", 1627 | "regions": [] 1628 | }, 1629 | { 1630 | "code": "NZ", 1631 | "name": "New Zealand", 1632 | "regions": [] 1633 | }, 1634 | { 1635 | "code": "PF", 1636 | "name": "French Polynesia", 1637 | "regions": [] 1638 | }, 1639 | { 1640 | "code": "PG", 1641 | "name": "Papua New Guinea", 1642 | "regions": [] 1643 | }, 1644 | { 1645 | "code": "PN", 1646 | "name": "Pitcairn Islands", 1647 | "regions": [] 1648 | }, 1649 | { 1650 | "code": "PW", 1651 | "name": "Palau", 1652 | "regions": [] 1653 | }, 1654 | { 1655 | "code": "SB", 1656 | "name": "Solomon Islands", 1657 | "regions": [] 1658 | }, 1659 | { 1660 | "code": "TK", 1661 | "name": "Tokelau", 1662 | "regions": [] 1663 | }, 1664 | { 1665 | "code": "TO", 1666 | "name": "Tonga", 1667 | "regions": [] 1668 | }, 1669 | { 1670 | "code": "TV", 1671 | "name": "Tuvalu", 1672 | "regions": [] 1673 | }, 1674 | { 1675 | "code": "VU", 1676 | "name": "Vanuatu", 1677 | "regions": [] 1678 | }, 1679 | { 1680 | "code": "WF", 1681 | "name": "Wallis and Futuna", 1682 | "regions": [] 1683 | }, 1684 | { 1685 | "code": "WS", 1686 | "name": "Samoa", 1687 | "regions": [] 1688 | } 1689 | ] 1690 | } 1691 | ] 1692 | } 1693 | } 1694 | } as const; 1695 | 1696 | export default data; -------------------------------------------------------------------------------- /aws-geo-code-list.ts: -------------------------------------------------------------------------------- 1 | // File started off with `aws route53 list-geo-locations > aws-geo-code-list.ts` 2 | // and then modified to export the data as a module 3 | // Further enriched with o1 model to add ContinentCode (might not be accurate) 4 | 5 | const data = { 6 | "GeoLocationDetailsList": [ 7 | { 8 | "CountryCode": "*", 9 | "CountryName": "Default" 10 | // No continent for the default record 11 | }, 12 | { 13 | "CountryCode": "AD", 14 | "CountryName": "Andorra", 15 | "ContinentCode": "EU" 16 | }, 17 | { 18 | "CountryCode": "AE", 19 | "CountryName": "United Arab Emirates", 20 | "ContinentCode": "AS" 21 | }, 22 | { 23 | "CountryCode": "AF", 24 | "CountryName": "Afghanistan", 25 | "ContinentCode": "AS" 26 | }, 27 | { 28 | "CountryCode": "AG", 29 | "CountryName": "Antigua and Barbuda", 30 | "ContinentCode": "NA" 31 | }, 32 | { 33 | "CountryCode": "AI", 34 | "CountryName": "Anguilla", 35 | "ContinentCode": "NA" 36 | }, 37 | { 38 | "CountryCode": "AL", 39 | "CountryName": "Albania", 40 | "ContinentCode": "EU" 41 | }, 42 | { 43 | "CountryCode": "AM", 44 | "CountryName": "Armenia", 45 | "ContinentCode": "AS" 46 | }, 47 | { 48 | "CountryCode": "AO", 49 | "CountryName": "Angola", 50 | "ContinentCode": "AF" 51 | }, 52 | { 53 | "CountryCode": "AQ", 54 | "CountryName": "Antarctica", 55 | "ContinentCode": "AN" 56 | }, 57 | { 58 | "CountryCode": "AR", 59 | "CountryName": "Argentina", 60 | "ContinentCode": "SA" 61 | }, 62 | { 63 | "CountryCode": "AS", 64 | "CountryName": "American Samoa", 65 | "ContinentCode": "OC" 66 | }, 67 | { 68 | "CountryCode": "AT", 69 | "CountryName": "Austria", 70 | "ContinentCode": "EU" 71 | }, 72 | { 73 | "CountryCode": "AU", 74 | "CountryName": "Australia", 75 | "ContinentCode": "OC" 76 | }, 77 | { 78 | "CountryCode": "AW", 79 | "CountryName": "Aruba", 80 | "ContinentCode": "NA" 81 | }, 82 | { 83 | "CountryCode": "AX", 84 | "CountryName": "Åland", 85 | "ContinentCode": "EU" 86 | }, 87 | { 88 | "CountryCode": "AZ", 89 | "CountryName": "Azerbaijan", 90 | "ContinentCode": "AS" 91 | }, 92 | { 93 | "CountryCode": "BA", 94 | "CountryName": "Bosnia and Herzegovina", 95 | "ContinentCode": "EU" 96 | }, 97 | { 98 | "CountryCode": "BB", 99 | "CountryName": "Barbados", 100 | "ContinentCode": "NA" 101 | }, 102 | { 103 | "CountryCode": "BD", 104 | "CountryName": "Bangladesh", 105 | "ContinentCode": "AS" 106 | }, 107 | { 108 | "CountryCode": "BE", 109 | "CountryName": "Belgium", 110 | "ContinentCode": "EU" 111 | }, 112 | { 113 | "CountryCode": "BF", 114 | "CountryName": "Burkina Faso", 115 | "ContinentCode": "AF" 116 | }, 117 | { 118 | "CountryCode": "BG", 119 | "CountryName": "Bulgaria", 120 | "ContinentCode": "EU" 121 | }, 122 | { 123 | "CountryCode": "BH", 124 | "CountryName": "Bahrain", 125 | "ContinentCode": "AS" 126 | }, 127 | { 128 | "CountryCode": "BI", 129 | "CountryName": "Burundi", 130 | "ContinentCode": "AF" 131 | }, 132 | { 133 | "CountryCode": "BJ", 134 | "CountryName": "Benin", 135 | "ContinentCode": "AF" 136 | }, 137 | { 138 | "CountryCode": "BL", 139 | "CountryName": "Saint Barthélemy", 140 | "ContinentCode": "NA" 141 | }, 142 | { 143 | "CountryCode": "BM", 144 | "CountryName": "Bermuda", 145 | "ContinentCode": "NA" 146 | }, 147 | { 148 | "CountryCode": "BN", 149 | "CountryName": "Brunei", 150 | "ContinentCode": "AS" 151 | }, 152 | { 153 | "CountryCode": "BO", 154 | "CountryName": "Bolivia", 155 | "ContinentCode": "SA" 156 | }, 157 | { 158 | "CountryCode": "BQ", 159 | "CountryName": "Bonaire", 160 | "ContinentCode": "NA" 161 | }, 162 | { 163 | "CountryCode": "BR", 164 | "CountryName": "Brazil", 165 | "ContinentCode": "SA" 166 | }, 167 | { 168 | "CountryCode": "BS", 169 | "CountryName": "Bahamas", 170 | "ContinentCode": "NA" 171 | }, 172 | { 173 | "CountryCode": "BT", 174 | "CountryName": "Bhutan", 175 | "ContinentCode": "AS" 176 | }, 177 | { 178 | "CountryCode": "BW", 179 | "CountryName": "Botswana", 180 | "ContinentCode": "AF" 181 | }, 182 | { 183 | "CountryCode": "BY", 184 | "CountryName": "Belarus", 185 | "ContinentCode": "EU" 186 | }, 187 | { 188 | "CountryCode": "BZ", 189 | "CountryName": "Belize", 190 | "ContinentCode": "NA" 191 | }, 192 | { 193 | "CountryCode": "CA", 194 | "CountryName": "Canada", 195 | "ContinentCode": "NA" 196 | }, 197 | { 198 | "CountryCode": "CC", 199 | "CountryName": "Cocos [Keeling] Islands", 200 | "ContinentCode": "OC" 201 | }, 202 | { 203 | "CountryCode": "CD", 204 | "CountryName": "Congo", 205 | "ContinentCode": "AF" 206 | }, 207 | { 208 | "CountryCode": "CF", 209 | "CountryName": "Central African Republic", 210 | "ContinentCode": "AF" 211 | }, 212 | { 213 | "CountryCode": "CG", 214 | "CountryName": "Republic of the Congo", 215 | "ContinentCode": "AF" 216 | }, 217 | { 218 | "CountryCode": "CH", 219 | "CountryName": "Switzerland", 220 | "ContinentCode": "EU" 221 | }, 222 | { 223 | "CountryCode": "CI", 224 | "CountryName": "Ivory Coast", 225 | "ContinentCode": "AF" 226 | }, 227 | { 228 | "CountryCode": "CK", 229 | "CountryName": "Cook Islands", 230 | "ContinentCode": "OC" 231 | }, 232 | { 233 | "CountryCode": "CL", 234 | "CountryName": "Chile", 235 | "ContinentCode": "SA" 236 | }, 237 | { 238 | "CountryCode": "CM", 239 | "CountryName": "Cameroon", 240 | "ContinentCode": "AF" 241 | }, 242 | { 243 | "CountryCode": "CN", 244 | "CountryName": "China", 245 | "ContinentCode": "AS" 246 | }, 247 | { 248 | "CountryCode": "CO", 249 | "CountryName": "Colombia", 250 | "ContinentCode": "SA" 251 | }, 252 | { 253 | "CountryCode": "CR", 254 | "CountryName": "Costa Rica", 255 | "ContinentCode": "NA" 256 | }, 257 | { 258 | "CountryCode": "CU", 259 | "CountryName": "Cuba", 260 | "ContinentCode": "NA" 261 | }, 262 | { 263 | "CountryCode": "CV", 264 | "CountryName": "Cape Verde", 265 | "ContinentCode": "AF" 266 | }, 267 | { 268 | "CountryCode": "CW", 269 | "CountryName": "Curaçao", 270 | "ContinentCode": "NA" 271 | }, 272 | { 273 | "CountryCode": "CY", 274 | "CountryName": "Cyprus", 275 | "ContinentCode": "EU" 276 | }, 277 | { 278 | "CountryCode": "CZ", 279 | "CountryName": "Czech Republic", 280 | "ContinentCode": "EU" 281 | }, 282 | { 283 | "CountryCode": "DE", 284 | "CountryName": "Germany", 285 | "ContinentCode": "EU" 286 | }, 287 | { 288 | "CountryCode": "DJ", 289 | "CountryName": "Djibouti", 290 | "ContinentCode": "AF" 291 | }, 292 | { 293 | "CountryCode": "DK", 294 | "CountryName": "Denmark", 295 | "ContinentCode": "EU" 296 | }, 297 | { 298 | "CountryCode": "DM", 299 | "CountryName": "Dominica", 300 | "ContinentCode": "NA" 301 | }, 302 | { 303 | "CountryCode": "DO", 304 | "CountryName": "Dominican Republic", 305 | "ContinentCode": "NA" 306 | }, 307 | { 308 | "CountryCode": "DZ", 309 | "CountryName": "Algeria", 310 | "ContinentCode": "AF" 311 | }, 312 | { 313 | "CountryCode": "EC", 314 | "CountryName": "Ecuador", 315 | "ContinentCode": "SA" 316 | }, 317 | { 318 | "CountryCode": "EE", 319 | "CountryName": "Estonia", 320 | "ContinentCode": "EU" 321 | }, 322 | { 323 | "CountryCode": "EG", 324 | "CountryName": "Egypt", 325 | "ContinentCode": "AF" 326 | }, 327 | { 328 | "CountryCode": "ER", 329 | "CountryName": "Eritrea", 330 | "ContinentCode": "AF" 331 | }, 332 | { 333 | "CountryCode": "ES", 334 | "CountryName": "Spain", 335 | "ContinentCode": "EU" 336 | }, 337 | { 338 | "CountryCode": "ET", 339 | "CountryName": "Ethiopia", 340 | "ContinentCode": "AF" 341 | }, 342 | { 343 | "CountryCode": "FI", 344 | "CountryName": "Finland", 345 | "ContinentCode": "EU" 346 | }, 347 | { 348 | "CountryCode": "FJ", 349 | "CountryName": "Fiji", 350 | "ContinentCode": "OC" 351 | }, 352 | { 353 | "CountryCode": "FK", 354 | "CountryName": "Falkland Islands", 355 | "ContinentCode": "SA" 356 | }, 357 | { 358 | "CountryCode": "FM", 359 | "CountryName": "Federated States of Micronesia", 360 | "ContinentCode": "OC" 361 | }, 362 | { 363 | "CountryCode": "FO", 364 | "CountryName": "Faroe Islands", 365 | "ContinentCode": "EU" 366 | }, 367 | { 368 | "CountryCode": "FR", 369 | "CountryName": "France", 370 | "ContinentCode": "EU" 371 | }, 372 | { 373 | "CountryCode": "GA", 374 | "CountryName": "Gabon", 375 | "ContinentCode": "AF" 376 | }, 377 | { 378 | "CountryCode": "GB", 379 | "CountryName": "United Kingdom", 380 | "ContinentCode": "EU" 381 | }, 382 | { 383 | "CountryCode": "GD", 384 | "CountryName": "Grenada", 385 | "ContinentCode": "NA" 386 | }, 387 | { 388 | "CountryCode": "GE", 389 | "CountryName": "Georgia", 390 | "ContinentCode": "AS" 391 | }, 392 | { 393 | "CountryCode": "GF", 394 | "CountryName": "French Guiana", 395 | "ContinentCode": "SA" 396 | }, 397 | { 398 | "CountryCode": "GG", 399 | "CountryName": "Guernsey", 400 | "ContinentCode": "EU" 401 | }, 402 | { 403 | "CountryCode": "GH", 404 | "CountryName": "Ghana", 405 | "ContinentCode": "AF" 406 | }, 407 | { 408 | "CountryCode": "GI", 409 | "CountryName": "Gibraltar", 410 | "ContinentCode": "EU" 411 | }, 412 | { 413 | "CountryCode": "GL", 414 | "CountryName": "Greenland", 415 | "ContinentCode": "NA" 416 | }, 417 | { 418 | "CountryCode": "GM", 419 | "CountryName": "Gambia", 420 | "ContinentCode": "AF" 421 | }, 422 | { 423 | "CountryCode": "GN", 424 | "CountryName": "Guinea", 425 | "ContinentCode": "AF" 426 | }, 427 | { 428 | "CountryCode": "GP", 429 | "CountryName": "Guadeloupe", 430 | "ContinentCode": "NA" 431 | }, 432 | { 433 | "CountryCode": "GQ", 434 | "CountryName": "Equatorial Guinea", 435 | "ContinentCode": "AF" 436 | }, 437 | { 438 | "CountryCode": "GR", 439 | "CountryName": "Greece", 440 | "ContinentCode": "EU" 441 | }, 442 | { 443 | "CountryCode": "GS", 444 | "CountryName": "South Georgia and the South Sandwich Islands", 445 | "ContinentCode": "AN" 446 | }, 447 | { 448 | "CountryCode": "GT", 449 | "CountryName": "Guatemala", 450 | "ContinentCode": "NA" 451 | }, 452 | { 453 | "CountryCode": "GU", 454 | "CountryName": "Guam", 455 | "ContinentCode": "OC" 456 | }, 457 | { 458 | "CountryCode": "GW", 459 | "CountryName": "Guinea-Bissau", 460 | "ContinentCode": "AF" 461 | }, 462 | { 463 | "CountryCode": "GY", 464 | "CountryName": "Guyana", 465 | "ContinentCode": "SA" 466 | }, 467 | { 468 | "CountryCode": "HK", 469 | "CountryName": "Hong Kong", 470 | "ContinentCode": "AS" 471 | }, 472 | { 473 | "CountryCode": "HN", 474 | "CountryName": "Honduras", 475 | "ContinentCode": "NA" 476 | }, 477 | { 478 | "CountryCode": "HR", 479 | "CountryName": "Croatia", 480 | "ContinentCode": "EU" 481 | }, 482 | { 483 | "CountryCode": "HT", 484 | "CountryName": "Haiti", 485 | "ContinentCode": "NA" 486 | }, 487 | { 488 | "CountryCode": "HU", 489 | "CountryName": "Hungary", 490 | "ContinentCode": "EU" 491 | }, 492 | { 493 | "CountryCode": "ID", 494 | "CountryName": "Indonesia", 495 | "ContinentCode": "AS" 496 | }, 497 | { 498 | "CountryCode": "IE", 499 | "CountryName": "Ireland", 500 | "ContinentCode": "EU" 501 | }, 502 | { 503 | "CountryCode": "IL", 504 | "CountryName": "Israel", 505 | "ContinentCode": "AS" 506 | }, 507 | { 508 | "CountryCode": "IM", 509 | "CountryName": "Isle of Man", 510 | "ContinentCode": "EU" 511 | }, 512 | { 513 | "CountryCode": "IN", 514 | "CountryName": "India", 515 | "ContinentCode": "AS" 516 | }, 517 | { 518 | "CountryCode": "IO", 519 | "CountryName": "British Indian Ocean Territory", 520 | "ContinentCode": "AS" 521 | }, 522 | { 523 | "CountryCode": "IQ", 524 | "CountryName": "Iraq", 525 | "ContinentCode": "AS" 526 | }, 527 | { 528 | "CountryCode": "IR", 529 | "CountryName": "Iran", 530 | "ContinentCode": "AS" 531 | }, 532 | { 533 | "CountryCode": "IS", 534 | "CountryName": "Iceland", 535 | "ContinentCode": "EU" 536 | }, 537 | { 538 | "CountryCode": "IT", 539 | "CountryName": "Italy", 540 | "ContinentCode": "EU" 541 | }, 542 | { 543 | "CountryCode": "JE", 544 | "CountryName": "Jersey", 545 | "ContinentCode": "EU" 546 | }, 547 | { 548 | "CountryCode": "JM", 549 | "CountryName": "Jamaica", 550 | "ContinentCode": "NA" 551 | }, 552 | { 553 | "CountryCode": "JO", 554 | "CountryName": "Hashemite Kingdom of Jordan", 555 | "ContinentCode": "AS" 556 | }, 557 | { 558 | "CountryCode": "JP", 559 | "CountryName": "Japan", 560 | "ContinentCode": "AS" 561 | }, 562 | { 563 | "CountryCode": "KE", 564 | "CountryName": "Kenya", 565 | "ContinentCode": "AF" 566 | }, 567 | { 568 | "CountryCode": "KG", 569 | "CountryName": "Kyrgyzstan", 570 | "ContinentCode": "AS" 571 | }, 572 | { 573 | "CountryCode": "KH", 574 | "CountryName": "Cambodia", 575 | "ContinentCode": "AS" 576 | }, 577 | { 578 | "CountryCode": "KI", 579 | "CountryName": "Kiribati", 580 | "ContinentCode": "OC" 581 | }, 582 | { 583 | "CountryCode": "KM", 584 | "CountryName": "Comoros", 585 | "ContinentCode": "AF" 586 | }, 587 | { 588 | "CountryCode": "KN", 589 | "CountryName": "Saint Kitts and Nevis", 590 | "ContinentCode": "NA" 591 | }, 592 | { 593 | "CountryCode": "KP", 594 | "CountryName": "North Korea", 595 | "ContinentCode": "AS" 596 | }, 597 | { 598 | "CountryCode": "KR", 599 | "CountryName": "Republic of Korea", 600 | "ContinentCode": "AS" 601 | }, 602 | { 603 | "CountryCode": "KW", 604 | "CountryName": "Kuwait", 605 | "ContinentCode": "AS" 606 | }, 607 | { 608 | "CountryCode": "KY", 609 | "CountryName": "Cayman Islands", 610 | "ContinentCode": "NA" 611 | }, 612 | { 613 | "CountryCode": "KZ", 614 | "CountryName": "Kazakhstan", 615 | "ContinentCode": "AS" 616 | }, 617 | { 618 | "CountryCode": "LA", 619 | "CountryName": "Laos", 620 | "ContinentCode": "AS" 621 | }, 622 | { 623 | "CountryCode": "LB", 624 | "CountryName": "Lebanon", 625 | "ContinentCode": "AS" 626 | }, 627 | { 628 | "CountryCode": "LC", 629 | "CountryName": "Saint Lucia", 630 | "ContinentCode": "NA" 631 | }, 632 | { 633 | "CountryCode": "LI", 634 | "CountryName": "Liechtenstein", 635 | "ContinentCode": "EU" 636 | }, 637 | { 638 | "CountryCode": "LK", 639 | "CountryName": "Sri Lanka", 640 | "ContinentCode": "AS" 641 | }, 642 | { 643 | "CountryCode": "LR", 644 | "CountryName": "Liberia", 645 | "ContinentCode": "AF" 646 | }, 647 | { 648 | "CountryCode": "LS", 649 | "CountryName": "Lesotho", 650 | "ContinentCode": "AF" 651 | }, 652 | { 653 | "CountryCode": "LT", 654 | "CountryName": "Lithuania", 655 | "ContinentCode": "EU" 656 | }, 657 | { 658 | "CountryCode": "LU", 659 | "CountryName": "Luxembourg", 660 | "ContinentCode": "EU" 661 | }, 662 | { 663 | "CountryCode": "LV", 664 | "CountryName": "Latvia", 665 | "ContinentCode": "EU" 666 | }, 667 | { 668 | "CountryCode": "LY", 669 | "CountryName": "Libya", 670 | "ContinentCode": "AF" 671 | }, 672 | { 673 | "CountryCode": "MA", 674 | "CountryName": "Morocco", 675 | "ContinentCode": "AF" 676 | }, 677 | { 678 | "CountryCode": "MC", 679 | "CountryName": "Monaco", 680 | "ContinentCode": "EU" 681 | }, 682 | { 683 | "CountryCode": "MD", 684 | "CountryName": "Republic of Moldova", 685 | "ContinentCode": "EU" 686 | }, 687 | { 688 | "CountryCode": "ME", 689 | "CountryName": "Montenegro", 690 | "ContinentCode": "EU" 691 | }, 692 | { 693 | "CountryCode": "MF", 694 | "CountryName": "Saint Martin", 695 | "ContinentCode": "NA" 696 | }, 697 | { 698 | "CountryCode": "MG", 699 | "CountryName": "Madagascar", 700 | "ContinentCode": "AF" 701 | }, 702 | { 703 | "CountryCode": "MH", 704 | "CountryName": "Marshall Islands", 705 | "ContinentCode": "OC" 706 | }, 707 | { 708 | "CountryCode": "MK", 709 | "CountryName": "Macedonia", 710 | "ContinentCode": "EU" 711 | }, 712 | { 713 | "CountryCode": "ML", 714 | "CountryName": "Mali", 715 | "ContinentCode": "AF" 716 | }, 717 | { 718 | "CountryCode": "MM", 719 | "CountryName": "Myanmar [Burma]", 720 | "ContinentCode": "AS" 721 | }, 722 | { 723 | "CountryCode": "MN", 724 | "CountryName": "Mongolia", 725 | "ContinentCode": "AS" 726 | }, 727 | { 728 | "CountryCode": "MO", 729 | "CountryName": "Macao", 730 | "ContinentCode": "AS" 731 | }, 732 | { 733 | "CountryCode": "MP", 734 | "CountryName": "Northern Mariana Islands", 735 | "ContinentCode": "OC" 736 | }, 737 | { 738 | "CountryCode": "MQ", 739 | "CountryName": "Martinique", 740 | "ContinentCode": "NA" 741 | }, 742 | { 743 | "CountryCode": "MR", 744 | "CountryName": "Mauritania", 745 | "ContinentCode": "AF" 746 | }, 747 | { 748 | "CountryCode": "MS", 749 | "CountryName": "Montserrat", 750 | "ContinentCode": "NA" 751 | }, 752 | { 753 | "CountryCode": "MT", 754 | "CountryName": "Malta", 755 | "ContinentCode": "EU" 756 | }, 757 | { 758 | "CountryCode": "MU", 759 | "CountryName": "Mauritius", 760 | "ContinentCode": "AF" 761 | }, 762 | { 763 | "CountryCode": "MV", 764 | "CountryName": "Maldives", 765 | "ContinentCode": "AS" 766 | }, 767 | { 768 | "CountryCode": "MW", 769 | "CountryName": "Malawi", 770 | "ContinentCode": "AF" 771 | }, 772 | { 773 | "CountryCode": "MX", 774 | "CountryName": "Mexico", 775 | "ContinentCode": "NA" 776 | }, 777 | { 778 | "CountryCode": "MY", 779 | "CountryName": "Malaysia", 780 | "ContinentCode": "AS" 781 | }, 782 | { 783 | "CountryCode": "MZ", 784 | "CountryName": "Mozambique", 785 | "ContinentCode": "AF" 786 | }, 787 | { 788 | "CountryCode": "NA", 789 | "CountryName": "Namibia", 790 | "ContinentCode": "AF" 791 | }, 792 | { 793 | "CountryCode": "NC", 794 | "CountryName": "New Caledonia", 795 | "ContinentCode": "OC" 796 | }, 797 | { 798 | "CountryCode": "NE", 799 | "CountryName": "Niger", 800 | "ContinentCode": "AF" 801 | }, 802 | { 803 | "CountryCode": "NF", 804 | "CountryName": "Norfolk Island", 805 | "ContinentCode": "OC" 806 | }, 807 | { 808 | "CountryCode": "NG", 809 | "CountryName": "Nigeria", 810 | "ContinentCode": "AF" 811 | }, 812 | { 813 | "CountryCode": "NI", 814 | "CountryName": "Nicaragua", 815 | "ContinentCode": "NA" 816 | }, 817 | { 818 | "CountryCode": "NL", 819 | "CountryName": "Netherlands", 820 | "ContinentCode": "EU" 821 | }, 822 | { 823 | "CountryCode": "NO", 824 | "CountryName": "Norway", 825 | "ContinentCode": "EU" 826 | }, 827 | { 828 | "CountryCode": "NP", 829 | "CountryName": "Nepal", 830 | "ContinentCode": "AS" 831 | }, 832 | { 833 | "CountryCode": "NR", 834 | "CountryName": "Nauru", 835 | "ContinentCode": "OC" 836 | }, 837 | { 838 | "CountryCode": "NU", 839 | "CountryName": "Niue", 840 | "ContinentCode": "OC" 841 | }, 842 | { 843 | "CountryCode": "NZ", 844 | "CountryName": "New Zealand", 845 | "ContinentCode": "OC" 846 | }, 847 | { 848 | "CountryCode": "OM", 849 | "CountryName": "Oman", 850 | "ContinentCode": "AS" 851 | }, 852 | { 853 | "CountryCode": "PA", 854 | "CountryName": "Panama", 855 | "ContinentCode": "NA" 856 | }, 857 | { 858 | "CountryCode": "PE", 859 | "CountryName": "Peru", 860 | "ContinentCode": "SA" 861 | }, 862 | { 863 | "CountryCode": "PF", 864 | "CountryName": "French Polynesia", 865 | "ContinentCode": "OC" 866 | }, 867 | { 868 | "CountryCode": "PG", 869 | "CountryName": "Papua New Guinea", 870 | "ContinentCode": "OC" 871 | }, 872 | { 873 | "CountryCode": "PH", 874 | "CountryName": "Philippines", 875 | "ContinentCode": "AS" 876 | }, 877 | { 878 | "CountryCode": "PK", 879 | "CountryName": "Pakistan", 880 | "ContinentCode": "AS" 881 | }, 882 | { 883 | "CountryCode": "PL", 884 | "CountryName": "Poland", 885 | "ContinentCode": "EU" 886 | }, 887 | { 888 | "CountryCode": "PM", 889 | "CountryName": "Saint Pierre and Miquelon", 890 | "ContinentCode": "NA" 891 | }, 892 | { 893 | "CountryCode": "PN", 894 | "CountryName": "Pitcairn Islands", 895 | "ContinentCode": "OC" 896 | }, 897 | { 898 | "CountryCode": "PR", 899 | "CountryName": "Puerto Rico", 900 | "ContinentCode": "NA" 901 | }, 902 | { 903 | "CountryCode": "PS", 904 | "CountryName": "Palestine", 905 | "ContinentCode": "AS" 906 | }, 907 | { 908 | "CountryCode": "PT", 909 | "CountryName": "Portugal", 910 | "ContinentCode": "EU" 911 | }, 912 | { 913 | "CountryCode": "PW", 914 | "CountryName": "Palau", 915 | "ContinentCode": "OC" 916 | }, 917 | { 918 | "CountryCode": "PY", 919 | "CountryName": "Paraguay", 920 | "ContinentCode": "SA" 921 | }, 922 | { 923 | "CountryCode": "QA", 924 | "CountryName": "Qatar", 925 | "ContinentCode": "AS" 926 | }, 927 | { 928 | "CountryCode": "RE", 929 | "CountryName": "Réunion", 930 | "ContinentCode": "AF" 931 | }, 932 | { 933 | "CountryCode": "RO", 934 | "CountryName": "Romania", 935 | "ContinentCode": "EU" 936 | }, 937 | { 938 | "CountryCode": "RS", 939 | "CountryName": "Serbia", 940 | "ContinentCode": "EU" 941 | }, 942 | { 943 | "CountryCode": "RU", 944 | "CountryName": "Russia", 945 | "ContinentCode": "EU" 946 | }, 947 | { 948 | "CountryCode": "RW", 949 | "CountryName": "Rwanda", 950 | "ContinentCode": "AF" 951 | }, 952 | { 953 | "CountryCode": "SA", 954 | "CountryName": "Saudi Arabia", 955 | "ContinentCode": "AS" 956 | }, 957 | { 958 | "CountryCode": "SB", 959 | "CountryName": "Solomon Islands", 960 | "ContinentCode": "OC" 961 | }, 962 | { 963 | "CountryCode": "SC", 964 | "CountryName": "Seychelles", 965 | "ContinentCode": "AF" 966 | }, 967 | { 968 | "CountryCode": "SD", 969 | "CountryName": "Sudan", 970 | "ContinentCode": "AF" 971 | }, 972 | { 973 | "CountryCode": "SE", 974 | "CountryName": "Sweden", 975 | "ContinentCode": "EU" 976 | }, 977 | { 978 | "CountryCode": "SG", 979 | "CountryName": "Singapore", 980 | "ContinentCode": "AS" 981 | }, 982 | { 983 | "CountryCode": "SH", 984 | "CountryName": "Saint Helena", 985 | "ContinentCode": "AF" 986 | }, 987 | { 988 | "CountryCode": "SI", 989 | "CountryName": "Slovenia", 990 | "ContinentCode": "EU" 991 | }, 992 | { 993 | "CountryCode": "SJ", 994 | "CountryName": "Svalbard and Jan Mayen", 995 | "ContinentCode": "EU" 996 | }, 997 | { 998 | "CountryCode": "SK", 999 | "CountryName": "Slovakia", 1000 | "ContinentCode": "EU" 1001 | }, 1002 | { 1003 | "CountryCode": "SL", 1004 | "CountryName": "Sierra Leone", 1005 | "ContinentCode": "AF" 1006 | }, 1007 | { 1008 | "CountryCode": "SM", 1009 | "CountryName": "San Marino", 1010 | "ContinentCode": "EU" 1011 | }, 1012 | { 1013 | "CountryCode": "SN", 1014 | "CountryName": "Senegal", 1015 | "ContinentCode": "AF" 1016 | }, 1017 | { 1018 | "CountryCode": "SO", 1019 | "CountryName": "Somalia", 1020 | "ContinentCode": "AF" 1021 | }, 1022 | { 1023 | "CountryCode": "SR", 1024 | "CountryName": "Suriname", 1025 | "ContinentCode": "SA" 1026 | }, 1027 | { 1028 | "CountryCode": "SS", 1029 | "CountryName": "South Sudan", 1030 | "ContinentCode": "AF" 1031 | }, 1032 | { 1033 | "CountryCode": "ST", 1034 | "CountryName": "São Tomé and Príncipe", 1035 | "ContinentCode": "AF" 1036 | }, 1037 | { 1038 | "CountryCode": "SV", 1039 | "CountryName": "El Salvador", 1040 | "ContinentCode": "NA" 1041 | }, 1042 | { 1043 | "CountryCode": "SX", 1044 | "CountryName": "Sint Maarten", 1045 | "ContinentCode": "NA" 1046 | }, 1047 | { 1048 | "CountryCode": "SY", 1049 | "CountryName": "Syria", 1050 | "ContinentCode": "AS" 1051 | }, 1052 | { 1053 | "CountryCode": "SZ", 1054 | "CountryName": "Swaziland", 1055 | "ContinentCode": "AF" 1056 | }, 1057 | { 1058 | "CountryCode": "TC", 1059 | "CountryName": "Turks and Caicos Islands", 1060 | "ContinentCode": "NA" 1061 | }, 1062 | { 1063 | "CountryCode": "TD", 1064 | "CountryName": "Chad", 1065 | "ContinentCode": "AF" 1066 | }, 1067 | { 1068 | "CountryCode": "TF", 1069 | "CountryName": "French Southern Territories", 1070 | "ContinentCode": "AN" 1071 | }, 1072 | { 1073 | "CountryCode": "TG", 1074 | "CountryName": "Togo", 1075 | "ContinentCode": "AF" 1076 | }, 1077 | { 1078 | "CountryCode": "TH", 1079 | "CountryName": "Thailand", 1080 | "ContinentCode": "AS" 1081 | }, 1082 | { 1083 | "CountryCode": "TJ", 1084 | "CountryName": "Tajikistan", 1085 | "ContinentCode": "AS" 1086 | }, 1087 | { 1088 | "CountryCode": "TK", 1089 | "CountryName": "Tokelau", 1090 | "ContinentCode": "OC" 1091 | }, 1092 | { 1093 | "CountryCode": "TL", 1094 | "CountryName": "East Timor", 1095 | "ContinentCode": "AS" 1096 | }, 1097 | { 1098 | "CountryCode": "TM", 1099 | "CountryName": "Turkmenistan", 1100 | "ContinentCode": "AS" 1101 | }, 1102 | { 1103 | "CountryCode": "TN", 1104 | "CountryName": "Tunisia", 1105 | "ContinentCode": "AF" 1106 | }, 1107 | { 1108 | "CountryCode": "TO", 1109 | "CountryName": "Tonga", 1110 | "ContinentCode": "OC" 1111 | }, 1112 | { 1113 | "CountryCode": "TR", 1114 | "CountryName": "Turkey", 1115 | "ContinentCode": "AS" 1116 | }, 1117 | { 1118 | "CountryCode": "TT", 1119 | "CountryName": "Trinidad and Tobago", 1120 | "ContinentCode": "NA" 1121 | }, 1122 | { 1123 | "CountryCode": "TV", 1124 | "CountryName": "Tuvalu", 1125 | "ContinentCode": "OC" 1126 | }, 1127 | { 1128 | "CountryCode": "TW", 1129 | "CountryName": "Taiwan", 1130 | "ContinentCode": "AS" 1131 | }, 1132 | { 1133 | "CountryCode": "TZ", 1134 | "CountryName": "Tanzania", 1135 | "ContinentCode": "AF" 1136 | }, 1137 | { 1138 | "CountryCode": "UA", 1139 | "CountryName": "Ukraine", 1140 | "ContinentCode": "EU" 1141 | }, 1142 | { 1143 | "CountryCode": "UA", 1144 | "CountryName": "Ukraine", 1145 | "SubdivisionCode": "05", 1146 | "SubdivisionName": "Vinnytska oblast", 1147 | "ContinentCode": "EU" 1148 | }, 1149 | { 1150 | "CountryCode": "UA", 1151 | "CountryName": "Ukraine", 1152 | "SubdivisionCode": "07", 1153 | "SubdivisionName": "Volynska oblast", 1154 | "ContinentCode": "EU" 1155 | }, 1156 | { 1157 | "CountryCode": "UA", 1158 | "CountryName": "Ukraine", 1159 | "SubdivisionCode": "09", 1160 | "SubdivisionName": "Luhanska oblast", 1161 | "ContinentCode": "EU" 1162 | }, 1163 | { 1164 | "CountryCode": "UA", 1165 | "CountryName": "Ukraine", 1166 | "SubdivisionCode": "11", 1167 | "SubdivisionName": "Crimea", 1168 | "ContinentCode": "EU" 1169 | }, 1170 | { 1171 | "CountryCode": "UA", 1172 | "CountryName": "Ukraine", 1173 | "SubdivisionCode": "12", 1174 | "SubdivisionName": "Dnipropetrovska oblast", 1175 | "ContinentCode": "EU" 1176 | }, 1177 | { 1178 | "CountryCode": "UA", 1179 | "CountryName": "Ukraine", 1180 | "SubdivisionCode": "14", 1181 | "SubdivisionName": "Donetska oblast", 1182 | "ContinentCode": "EU" 1183 | }, 1184 | { 1185 | "CountryCode": "UA", 1186 | "CountryName": "Ukraine", 1187 | "SubdivisionCode": "18", 1188 | "SubdivisionName": "Zhytomyrska oblast", 1189 | "ContinentCode": "EU" 1190 | }, 1191 | { 1192 | "CountryCode": "UA", 1193 | "CountryName": "Ukraine", 1194 | "SubdivisionCode": "20", 1195 | "SubdivisionName": "Sevastopol", 1196 | "ContinentCode": "EU" 1197 | }, 1198 | { 1199 | "CountryCode": "UA", 1200 | "CountryName": "Ukraine", 1201 | "SubdivisionCode": "21", 1202 | "SubdivisionName": "Zakarpatska oblast", 1203 | "ContinentCode": "EU" 1204 | }, 1205 | { 1206 | "CountryCode": "UA", 1207 | "CountryName": "Ukraine", 1208 | "SubdivisionCode": "23", 1209 | "SubdivisionName": "Zaporizka oblast", 1210 | "ContinentCode": "EU" 1211 | }, 1212 | { 1213 | "CountryCode": "UA", 1214 | "CountryName": "Ukraine", 1215 | "SubdivisionCode": "26", 1216 | "SubdivisionName": "Ivano-Frankivska oblast", 1217 | "ContinentCode": "EU" 1218 | }, 1219 | { 1220 | "CountryCode": "UA", 1221 | "CountryName": "Ukraine", 1222 | "SubdivisionCode": "30", 1223 | "SubdivisionName": "Kyiv", 1224 | "ContinentCode": "EU" 1225 | }, 1226 | { 1227 | "CountryCode": "UA", 1228 | "CountryName": "Ukraine", 1229 | "SubdivisionCode": "32", 1230 | "SubdivisionName": "Kyivska oblast", 1231 | "ContinentCode": "EU" 1232 | }, 1233 | { 1234 | "CountryCode": "UA", 1235 | "CountryName": "Ukraine", 1236 | "SubdivisionCode": "35", 1237 | "SubdivisionName": "Kirovohradska oblast", 1238 | "ContinentCode": "EU" 1239 | }, 1240 | { 1241 | "CountryCode": "UA", 1242 | "CountryName": "Ukraine", 1243 | "SubdivisionCode": "46", 1244 | "SubdivisionName": "Lvivska oblast", 1245 | "ContinentCode": "EU" 1246 | }, 1247 | { 1248 | "CountryCode": "UA", 1249 | "CountryName": "Ukraine", 1250 | "SubdivisionCode": "48", 1251 | "SubdivisionName": "Mykolaivska oblast", 1252 | "ContinentCode": "EU" 1253 | }, 1254 | { 1255 | "CountryCode": "UA", 1256 | "CountryName": "Ukraine", 1257 | "SubdivisionCode": "51", 1258 | "SubdivisionName": "Odeska oblast", 1259 | "ContinentCode": "EU" 1260 | }, 1261 | { 1262 | "CountryCode": "UA", 1263 | "CountryName": "Ukraine", 1264 | "SubdivisionCode": "53", 1265 | "SubdivisionName": "Poltavska oblast", 1266 | "ContinentCode": "EU" 1267 | }, 1268 | { 1269 | "CountryCode": "UA", 1270 | "CountryName": "Ukraine", 1271 | "SubdivisionCode": "56", 1272 | "SubdivisionName": "Rivnenska oblast", 1273 | "ContinentCode": "EU" 1274 | }, 1275 | { 1276 | "CountryCode": "UA", 1277 | "CountryName": "Ukraine", 1278 | "SubdivisionCode": "59", 1279 | "SubdivisionName": "Sumska oblast", 1280 | "ContinentCode": "EU" 1281 | }, 1282 | { 1283 | "CountryCode": "UA", 1284 | "CountryName": "Ukraine", 1285 | "SubdivisionCode": "61", 1286 | "SubdivisionName": "Ternopilska oblast", 1287 | "ContinentCode": "EU" 1288 | }, 1289 | { 1290 | "CountryCode": "UA", 1291 | "CountryName": "Ukraine", 1292 | "SubdivisionCode": "63", 1293 | "SubdivisionName": "Kharkivska oblast", 1294 | "ContinentCode": "EU" 1295 | }, 1296 | { 1297 | "CountryCode": "UA", 1298 | "CountryName": "Ukraine", 1299 | "SubdivisionCode": "65", 1300 | "SubdivisionName": "Khersonska oblast", 1301 | "ContinentCode": "EU" 1302 | }, 1303 | { 1304 | "CountryCode": "UA", 1305 | "CountryName": "Ukraine", 1306 | "SubdivisionCode": "68", 1307 | "SubdivisionName": "Khmelnytska oblast", 1308 | "ContinentCode": "EU" 1309 | }, 1310 | { 1311 | "CountryCode": "UA", 1312 | "CountryName": "Ukraine", 1313 | "SubdivisionCode": "71", 1314 | "SubdivisionName": "Cherkaska oblast", 1315 | "ContinentCode": "EU" 1316 | }, 1317 | { 1318 | "CountryCode": "UA", 1319 | "CountryName": "Ukraine", 1320 | "SubdivisionCode": "74", 1321 | "SubdivisionName": "Chernihivska oblast", 1322 | "ContinentCode": "EU" 1323 | }, 1324 | { 1325 | "CountryCode": "UA", 1326 | "CountryName": "Ukraine", 1327 | "SubdivisionCode": "77", 1328 | "SubdivisionName": "Chernivetska oblast", 1329 | "ContinentCode": "EU" 1330 | }, 1331 | { 1332 | "CountryCode": "UG", 1333 | "CountryName": "Uganda", 1334 | "ContinentCode": "AF" 1335 | }, 1336 | { 1337 | "CountryCode": "UM", 1338 | "CountryName": "U.S. Minor Outlying Islands", 1339 | "ContinentCode": "OC" 1340 | }, 1341 | { 1342 | "CountryCode": "US", 1343 | "CountryName": "United States", 1344 | "ContinentCode": "NA" 1345 | }, 1346 | { 1347 | "CountryCode": "US", 1348 | "CountryName": "United States", 1349 | "SubdivisionCode": "AK", 1350 | "SubdivisionName": "Alaska", 1351 | "ContinentCode": "NA" 1352 | }, 1353 | { 1354 | "CountryCode": "US", 1355 | "CountryName": "United States", 1356 | "SubdivisionCode": "AL", 1357 | "SubdivisionName": "Alabama", 1358 | "ContinentCode": "NA" 1359 | }, 1360 | { 1361 | "CountryCode": "US", 1362 | "CountryName": "United States", 1363 | "SubdivisionCode": "AR", 1364 | "SubdivisionName": "Arkansas", 1365 | "ContinentCode": "NA" 1366 | }, 1367 | { 1368 | "CountryCode": "US", 1369 | "CountryName": "United States", 1370 | "SubdivisionCode": "AZ", 1371 | "SubdivisionName": "Arizona", 1372 | "ContinentCode": "NA" 1373 | }, 1374 | { 1375 | "CountryCode": "US", 1376 | "CountryName": "United States", 1377 | "SubdivisionCode": "CA", 1378 | "SubdivisionName": "California", 1379 | "ContinentCode": "NA" 1380 | }, 1381 | { 1382 | "CountryCode": "US", 1383 | "CountryName": "United States", 1384 | "SubdivisionCode": "CO", 1385 | "SubdivisionName": "Colorado", 1386 | "ContinentCode": "NA" 1387 | }, 1388 | { 1389 | "CountryCode": "US", 1390 | "CountryName": "United States", 1391 | "SubdivisionCode": "CT", 1392 | "SubdivisionName": "Connecticut", 1393 | "ContinentCode": "NA" 1394 | }, 1395 | { 1396 | "CountryCode": "US", 1397 | "CountryName": "United States", 1398 | "SubdivisionCode": "DC", 1399 | "SubdivisionName": "District of Columbia", 1400 | "ContinentCode": "NA" 1401 | }, 1402 | { 1403 | "CountryCode": "US", 1404 | "CountryName": "United States", 1405 | "SubdivisionCode": "DE", 1406 | "SubdivisionName": "Delaware", 1407 | "ContinentCode": "NA" 1408 | }, 1409 | { 1410 | "CountryCode": "US", 1411 | "CountryName": "United States", 1412 | "SubdivisionCode": "FL", 1413 | "SubdivisionName": "Florida", 1414 | "ContinentCode": "NA" 1415 | }, 1416 | { 1417 | "CountryCode": "US", 1418 | "CountryName": "United States", 1419 | "SubdivisionCode": "GA", 1420 | "SubdivisionName": "Georgia", 1421 | "ContinentCode": "NA" 1422 | }, 1423 | { 1424 | "CountryCode": "US", 1425 | "CountryName": "United States", 1426 | "SubdivisionCode": "HI", 1427 | "SubdivisionName": "Hawaii", 1428 | "ContinentCode": "NA" 1429 | }, 1430 | { 1431 | "CountryCode": "US", 1432 | "CountryName": "United States", 1433 | "SubdivisionCode": "IA", 1434 | "SubdivisionName": "Iowa", 1435 | "ContinentCode": "NA" 1436 | }, 1437 | { 1438 | "CountryCode": "US", 1439 | "CountryName": "United States", 1440 | "SubdivisionCode": "ID", 1441 | "SubdivisionName": "Idaho", 1442 | "ContinentCode": "NA" 1443 | }, 1444 | { 1445 | "CountryCode": "US", 1446 | "CountryName": "United States", 1447 | "SubdivisionCode": "IL", 1448 | "SubdivisionName": "Illinois", 1449 | "ContinentCode": "NA" 1450 | }, 1451 | { 1452 | "CountryCode": "US", 1453 | "CountryName": "United States", 1454 | "SubdivisionCode": "IN", 1455 | "SubdivisionName": "Indiana", 1456 | "ContinentCode": "NA" 1457 | }, 1458 | { 1459 | "CountryCode": "US", 1460 | "CountryName": "United States", 1461 | "SubdivisionCode": "KS", 1462 | "SubdivisionName": "Kansas", 1463 | "ContinentCode": "NA" 1464 | }, 1465 | { 1466 | "CountryCode": "US", 1467 | "CountryName": "United States", 1468 | "SubdivisionCode": "KY", 1469 | "SubdivisionName": "Kentucky", 1470 | "ContinentCode": "NA" 1471 | }, 1472 | { 1473 | "CountryCode": "US", 1474 | "CountryName": "United States", 1475 | "SubdivisionCode": "LA", 1476 | "SubdivisionName": "Louisiana", 1477 | "ContinentCode": "NA" 1478 | }, 1479 | { 1480 | "CountryCode": "US", 1481 | "CountryName": "United States", 1482 | "SubdivisionCode": "MA", 1483 | "SubdivisionName": "Massachusetts", 1484 | "ContinentCode": "NA" 1485 | }, 1486 | { 1487 | "CountryCode": "US", 1488 | "CountryName": "United States", 1489 | "SubdivisionCode": "MD", 1490 | "SubdivisionName": "Maryland", 1491 | "ContinentCode": "NA" 1492 | }, 1493 | { 1494 | "CountryCode": "US", 1495 | "CountryName": "United States", 1496 | "SubdivisionCode": "ME", 1497 | "SubdivisionName": "Maine", 1498 | "ContinentCode": "NA" 1499 | }, 1500 | { 1501 | "CountryCode": "US", 1502 | "CountryName": "United States", 1503 | "SubdivisionCode": "MI", 1504 | "SubdivisionName": "Michigan", 1505 | "ContinentCode": "NA" 1506 | }, 1507 | { 1508 | "CountryCode": "US", 1509 | "CountryName": "United States", 1510 | "SubdivisionCode": "MN", 1511 | "SubdivisionName": "Minnesota", 1512 | "ContinentCode": "NA" 1513 | }, 1514 | { 1515 | "CountryCode": "US", 1516 | "CountryName": "United States", 1517 | "SubdivisionCode": "MO", 1518 | "SubdivisionName": "Missouri", 1519 | "ContinentCode": "NA" 1520 | }, 1521 | { 1522 | "CountryCode": "US", 1523 | "CountryName": "United States", 1524 | "SubdivisionCode": "MS", 1525 | "SubdivisionName": "Mississippi", 1526 | "ContinentCode": "NA" 1527 | }, 1528 | { 1529 | "CountryCode": "US", 1530 | "CountryName": "United States", 1531 | "SubdivisionCode": "MT", 1532 | "SubdivisionName": "Montana", 1533 | "ContinentCode": "NA" 1534 | }, 1535 | { 1536 | "CountryCode": "US", 1537 | "CountryName": "United States", 1538 | "SubdivisionCode": "NC", 1539 | "SubdivisionName": "North Carolina", 1540 | "ContinentCode": "NA" 1541 | }, 1542 | { 1543 | "CountryCode": "US", 1544 | "CountryName": "United States", 1545 | "SubdivisionCode": "ND", 1546 | "SubdivisionName": "North Dakota", 1547 | "ContinentCode": "NA" 1548 | }, 1549 | { 1550 | "CountryCode": "US", 1551 | "CountryName": "United States", 1552 | "SubdivisionCode": "NE", 1553 | "SubdivisionName": "Nebraska", 1554 | "ContinentCode": "NA" 1555 | }, 1556 | { 1557 | "CountryCode": "US", 1558 | "CountryName": "United States", 1559 | "SubdivisionCode": "NH", 1560 | "SubdivisionName": "New Hampshire", 1561 | "ContinentCode": "NA" 1562 | }, 1563 | { 1564 | "CountryCode": "US", 1565 | "CountryName": "United States", 1566 | "SubdivisionCode": "NJ", 1567 | "SubdivisionName": "New Jersey", 1568 | "ContinentCode": "NA" 1569 | }, 1570 | { 1571 | "CountryCode": "US", 1572 | "CountryName": "United States", 1573 | "SubdivisionCode": "NM", 1574 | "SubdivisionName": "New Mexico", 1575 | "ContinentCode": "NA" 1576 | }, 1577 | { 1578 | "CountryCode": "US", 1579 | "CountryName": "United States", 1580 | "SubdivisionCode": "NV", 1581 | "SubdivisionName": "Nevada", 1582 | "ContinentCode": "NA" 1583 | }, 1584 | { 1585 | "CountryCode": "US", 1586 | "CountryName": "United States", 1587 | "SubdivisionCode": "NY", 1588 | "SubdivisionName": "New York", 1589 | "ContinentCode": "NA" 1590 | }, 1591 | { 1592 | "CountryCode": "US", 1593 | "CountryName": "United States", 1594 | "SubdivisionCode": "OH", 1595 | "SubdivisionName": "Ohio", 1596 | "ContinentCode": "NA" 1597 | }, 1598 | { 1599 | "CountryCode": "US", 1600 | "CountryName": "United States", 1601 | "SubdivisionCode": "OK", 1602 | "SubdivisionName": "Oklahoma", 1603 | "ContinentCode": "NA" 1604 | }, 1605 | { 1606 | "CountryCode": "US", 1607 | "CountryName": "United States", 1608 | "SubdivisionCode": "OR", 1609 | "SubdivisionName": "Oregon", 1610 | "ContinentCode": "NA" 1611 | }, 1612 | { 1613 | "CountryCode": "US", 1614 | "CountryName": "United States", 1615 | "SubdivisionCode": "PA", 1616 | "SubdivisionName": "Pennsylvania", 1617 | "ContinentCode": "NA" 1618 | }, 1619 | { 1620 | "CountryCode": "US", 1621 | "CountryName": "United States", 1622 | "SubdivisionCode": "RI", 1623 | "SubdivisionName": "Rhode Island", 1624 | "ContinentCode": "NA" 1625 | }, 1626 | { 1627 | "CountryCode": "US", 1628 | "CountryName": "United States", 1629 | "SubdivisionCode": "SC", 1630 | "SubdivisionName": "South Carolina", 1631 | "ContinentCode": "NA" 1632 | }, 1633 | { 1634 | "CountryCode": "US", 1635 | "CountryName": "United States", 1636 | "SubdivisionCode": "SD", 1637 | "SubdivisionName": "South Dakota", 1638 | "ContinentCode": "NA" 1639 | }, 1640 | { 1641 | "CountryCode": "US", 1642 | "CountryName": "United States", 1643 | "SubdivisionCode": "TN", 1644 | "SubdivisionName": "Tennessee", 1645 | "ContinentCode": "NA" 1646 | }, 1647 | { 1648 | "CountryCode": "US", 1649 | "CountryName": "United States", 1650 | "SubdivisionCode": "TX", 1651 | "SubdivisionName": "Texas", 1652 | "ContinentCode": "NA" 1653 | }, 1654 | { 1655 | "CountryCode": "US", 1656 | "CountryName": "United States", 1657 | "SubdivisionCode": "UT", 1658 | "SubdivisionName": "Utah", 1659 | "ContinentCode": "NA" 1660 | }, 1661 | { 1662 | "CountryCode": "US", 1663 | "CountryName": "United States", 1664 | "SubdivisionCode": "VA", 1665 | "SubdivisionName": "Virginia", 1666 | "ContinentCode": "NA" 1667 | }, 1668 | { 1669 | "CountryCode": "US", 1670 | "CountryName": "United States", 1671 | "SubdivisionCode": "VT", 1672 | "SubdivisionName": "Vermont", 1673 | "ContinentCode": "NA" 1674 | }, 1675 | { 1676 | "CountryCode": "US", 1677 | "CountryName": "United States", 1678 | "SubdivisionCode": "WA", 1679 | "SubdivisionName": "Washington", 1680 | "ContinentCode": "NA" 1681 | }, 1682 | { 1683 | "CountryCode": "US", 1684 | "CountryName": "United States", 1685 | "SubdivisionCode": "WI", 1686 | "SubdivisionName": "Wisconsin", 1687 | "ContinentCode": "NA" 1688 | }, 1689 | { 1690 | "CountryCode": "US", 1691 | "CountryName": "United States", 1692 | "SubdivisionCode": "WV", 1693 | "SubdivisionName": "West Virginia", 1694 | "ContinentCode": "NA" 1695 | }, 1696 | { 1697 | "CountryCode": "US", 1698 | "CountryName": "United States", 1699 | "SubdivisionCode": "WY", 1700 | "SubdivisionName": "Wyoming", 1701 | "ContinentCode": "NA" 1702 | }, 1703 | { 1704 | "CountryCode": "UY", 1705 | "CountryName": "Uruguay", 1706 | "ContinentCode": "SA" 1707 | }, 1708 | { 1709 | "CountryCode": "UZ", 1710 | "CountryName": "Uzbekistan", 1711 | "ContinentCode": "AS" 1712 | }, 1713 | { 1714 | "CountryCode": "VA", 1715 | "CountryName": "Vatican City", 1716 | "ContinentCode": "EU" 1717 | }, 1718 | { 1719 | "CountryCode": "VC", 1720 | "CountryName": "Saint Vincent and the Grenadines", 1721 | "ContinentCode": "NA" 1722 | }, 1723 | { 1724 | "CountryCode": "VE", 1725 | "CountryName": "Venezuela", 1726 | "ContinentCode": "SA" 1727 | }, 1728 | { 1729 | "CountryCode": "VG", 1730 | "CountryName": "British Virgin Islands", 1731 | "ContinentCode": "NA" 1732 | }, 1733 | { 1734 | "CountryCode": "VI", 1735 | "CountryName": "U.S. Virgin Islands", 1736 | "ContinentCode": "NA" 1737 | }, 1738 | { 1739 | "CountryCode": "VN", 1740 | "CountryName": "Vietnam", 1741 | "ContinentCode": "AS" 1742 | }, 1743 | { 1744 | "CountryCode": "VU", 1745 | "CountryName": "Vanuatu", 1746 | "ContinentCode": "OC" 1747 | }, 1748 | { 1749 | "CountryCode": "WF", 1750 | "CountryName": "Wallis and Futuna", 1751 | "ContinentCode": "OC" 1752 | }, 1753 | { 1754 | "CountryCode": "WS", 1755 | "CountryName": "Samoa", 1756 | "ContinentCode": "OC" 1757 | }, 1758 | { 1759 | "CountryCode": "XK", 1760 | "CountryName": "Kosovo", 1761 | "ContinentCode": "EU" 1762 | }, 1763 | { 1764 | "CountryCode": "YE", 1765 | "CountryName": "Yemen", 1766 | "ContinentCode": "AS" 1767 | }, 1768 | { 1769 | "CountryCode": "YT", 1770 | "CountryName": "Mayotte", 1771 | "ContinentCode": "AF" 1772 | }, 1773 | { 1774 | "CountryCode": "ZA", 1775 | "CountryName": "South Africa", 1776 | "ContinentCode": "AF" 1777 | }, 1778 | { 1779 | "CountryCode": "ZM", 1780 | "CountryName": "Zambia", 1781 | "ContinentCode": "AF" 1782 | }, 1783 | { 1784 | "CountryCode": "ZW", 1785 | "CountryName": "Zimbabwe", 1786 | "ContinentCode": "AF" 1787 | }, 1788 | 1789 | // These are the “continent” rows from the original data 1790 | // left as-is (not countries, so they already have ContinentCode). 1791 | { 1792 | "ContinentCode": "AF", 1793 | "ContinentName": "Africa" 1794 | }, 1795 | { 1796 | "ContinentCode": "AN", 1797 | "ContinentName": "Antarctica" 1798 | }, 1799 | { 1800 | "ContinentCode": "AS", 1801 | "ContinentName": "Asia" 1802 | }, 1803 | { 1804 | "ContinentCode": "EU", 1805 | "ContinentName": "Europe" 1806 | }, 1807 | { 1808 | "ContinentCode": "NA", 1809 | "ContinentName": "North America" 1810 | }, 1811 | { 1812 | "ContinentCode": "OC", 1813 | "ContinentName": "Oceania" 1814 | }, 1815 | { 1816 | "ContinentCode": "SA", 1817 | "ContinentName": "South America" 1818 | } 1819 | ], 1820 | "IsTruncated": false, 1821 | "MaxItems": "500" 1822 | }; 1823 | 1824 | export default data; --------------------------------------------------------------------------------