master 545c443f6c76 cached
15 files
219.8 KB
74.3k tokens
1 requests
Download .txt
Showing preview only (235K chars total). Download the full file or copy to clipboard to get everything.
Repository: FormatterKit/PostalCodeValidator
Branch: master
Commit: 545c443f6c76
Files: 15
Total size: 219.8 KB

Directory structure:
gitextract_1etc8eer/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── Brewfile
├── LICENSE.md
├── Makefile
├── Package.swift
├── README.md
├── Resources/
│   └── postalData.json
├── Scripts/
│   └── Regions.swift
├── Sources/
│   └── PostalCodeValidator/
│       ├── PostalCodeValidator.swift
│       └── PostalCodeValidator.swift.gyb
└── Tests/
    ├── LinuxMain.swift
    └── PostalCodeValidatorTests/
        ├── PostalCodeValidatorTests.swift
        ├── PostalCodeValidatorTests.swift.gyb
        └── XCTestManifests.swift

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/main.yml
================================================
name: CI

on: [push]

jobs:
  test:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [macOS-latest]

    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Build and Test
        run: swift test


================================================
FILE: .gitignore
================================================
.DS_Store
/.build
/Packages
/*.xcodeproj
.swiftpm
Resources/data/*


================================================
FILE: Brewfile
================================================
tap 'nshipster/formulae'
brew 'gyb'


================================================
FILE: LICENSE.md
================================================
Copyright 2019 Mattt (https://mat.tt)

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.


================================================
FILE: Makefile
================================================
INPUTS = $(patsubst %,Resources/data/%.json,$(shell swift Scripts/Regions.swift))

.DEFAULT_GOAL: all

.PHONY: all
all: Sources/PostalCodeValidator/PostalCodeValidator.swift Tests/PostalCodeValidatorTests/PostalCodeValidatorTests.swift

Sources/PostalCodeValidator/PostalCodeValidator.swift: Resources/postalData.json
Tests/PostalCodeValidatorTests/PostalCodeValidatorTests.swift: Resources/postalData.json

Resources/data/%.json:
	@mkdir -p Resources/data
	@curl -sS "http://i18napis.appspot.com/address/data/$(basename $(notdir $@))" > $@

Resources/postalData.json: $(INPUTS)
	@echo "[" > $@
	@awk 'FNR==1 && NR!=1 {print ",\n"}{print}' Resources/data/* >> $@
	@echo "]" >> $@

%.swift: %.swift.gyb
	@gyb --line-directive '' -o $@ $<

.PHONY:
clean:
	@rm -rf Resources/data
	@rm -f Sources/PostalCodeValidator/PostalCodeValidator.swift


================================================
FILE: Package.swift
================================================
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "PostalCodeValidator",
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "PostalCodeValidator",
            targets: ["PostalCodeValidator"]
        ),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "PostalCodeValidator",
            dependencies: []
        ),
        .testTarget(
            name: "PostalCodeValidatorTests",
            dependencies: ["PostalCodeValidator"]
        ),
    ]
)


================================================
FILE: README.md
================================================
# PostalCodeValidator

[![Build Status][ci status badge]][ci status]
[![License][license badge]][license]
[![Swift Version][swift version badge]][swift version]

A validator for [postal codes](https://en.wikipedia.org/wiki/Postal_code)
with support for 200+ regions.

```swift
import Foundation
import PostalCodeValidator

if let validator = PostalCodeValidator(locale: .current) { // United States (US)
    validator.validate(postalCode: "95014") // true
    validator.validate(postalCode: "22162-1010") // true

    validator.validate(postalCode: "1234567") // false
    validator.validate(postalCode: "INVALID") // false
}

// 248 regions supported
if let validator = PostalCodeValidator(regionCode: "JP") { // Japan (JP)
    validator.validate(postalCode: "154-0023") // true
    validator.validate(postalCode: "12345") // false
}
```

> **Note**: Only the region of a locale is used to determine validation rules.
> To validate the postal code for a particular region,
> you can construct a locale using an identifier with the `"und"` language code.

## Requirements

- Swift 4.0+

## Installation

### Swift Package Manager

Add the PostalCodeValidator package to your target dependencies in `Package.swift`:

```swift
import PackageDescription

let package = Package(
  name: "YourProject",
  dependencies: [
    .package(
        url: "https://github.com/FormatterKit/PostalCodeValidator",
        from: "0.1.0"
    ),
  ]
)
```

Then run the `swift build` command to build your project.

## Known Issues

- Armed forces in Germany (and likely other countries)
  use [special postal codes](https://de.wikipedia.org/wiki/Feldpost_%28Bundeswehr%29),
  which aren't included in the upstream data source.
  This will cause validation of these postal codes to fail.
  _(Thanks for pointing this out, [@timohetzel](https://twitter.com/timohetzel))_

## Additional Details

The CLDR previously maintained a list of postal code formats,
but that information was
[deprecated in v27](http://unicode.org/reports/tr35/tr35-info.html#Postal_Code_Validation).

Following the guidance of the
[twitter-cldr-rb](https://github.com/twitter/twitter-cldr-rb/issues/166) project,
`PostalCodeValidator` sources its information from http://i18napis.appspot.com.
The most recent release of this software uses
information retrieved from the website on November 27, 2019.

## License

MIT

## Contact

Mattt ([@mattt](https://twitter.com/mattt))

[ci status]: https://github.com/FormatterKit/PostalCodeValidator/actions
[ci status badge]: https://github.com/FormatterKit/PostalCodeValidator/workflows/CI/badge.svg
[license]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
[license badge]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
[swift version]: https://swift.org/download/
[swift version badge]: http://img.shields.io/badge/swift%20version-4.0+-orange.svg?style=flat


================================================
FILE: Resources/postalData.json
================================================
[
  {
    "zipex": "ASCN 1ZZ",
    "name": "ASCENSION ISLAND",
    "zip": "ASCN 1ZZ",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "key": "AC",
    "id": "data/AC"
  },
  {
    "lang": "ca",
    "sub_zipexs": "AD500~AD100~AD200~AD700~AD400~AD300~AD600",
    "zipex": "AD100,AD501,AD700",
    "sub_zips": "AD50[01]~AD10[01]~AD20[01]~AD70[01]~AD40[01]~AD30[01]~AD60[01]",
    "zip": "AD[1-7]0\\d",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "languages": "ca",
    "sub_keys": "Parròquia d'Andorra la Vella~Canillo~Encamp~Escaldes-Engordany~La Massana~Ordino~Sant Julià de Lòria",
    "key": "AD",
    "sub_isoids": "07~02~03~08~04~05~06",
    "posturl": "http://www.correos.es/comun/CodigosPostales/1010_s-CodPostal.asp?Provincia=",
    "id": "data/AD",
    "sub_names": "Andorra la Vella~Canillo~Encamp~Escaldes-Engordany~La Massana~Ordino~Sant Julià de Lòria",
    "name": "ANDORRA"
  },
  {
    "lang": "ar",
    "sub_lnames": "Abu Dhabi~Sharjah~Fujairah~Umm Al Quwain~Dubai~Ras al Khaimah~Ajman",
    "name": "UNITED ARAB EMIRATES",
    "require": "AS",
    "state_name_type": "emirate",
    "id": "data/AE",
    "languages": "ar",
    "lfmt": "%N%n%O%n%A%n%S",
    "sub_keys": "أبو ظبي~إمارة الشارقةّ~الفجيرة~ام القيوين~إمارة دبيّ~إمارة رأس الخيمة~عجمان",
    "key": "AE",
    "sub_isoids": "AZ~SH~FU~UQ~DU~RK~AJ",
    "fmt": "%N%n%O%n%A%n%S",
    "sub_names": "أبو ظبي~الشارقة~الفجيرة~ام القيوين~دبي~رأس الخيمة~عجمان"
  },
  {
    "zipex": "1001,2601,3801",
    "key": "AF",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "posturl": "http://postalcode.afghanpost.gov.af/",
    "id": "data/AF",
    "name": "AFGHANISTAN"
  },
  {
    "require": "A",
    "id": "data/AG",
    "key": "AG",
    "name": "ANTIGUA AND BARBUDA"
  },
  {
    "zipex": "2640",
    "name": "ANGUILLA",
    "zip": "(?:AI-)?2640",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "key": "AI",
    "id": "data/AI"
  },
  {
    "zipex": "1001,1017,3501",
    "name": "ALBANIA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z%n%C",
    "key": "AL",
    "id": "data/AL"
  },
  {
    "lang": "hy",
    "sub_zipexs": "0201,0514~0601,0823~0901,1149~1201,1626~0000,0099~1701,2117~2201,2506~2601,3126~3201,3519~3601,3810~3901,4216",
    "zipex": "375010,0002,0010",
    "sub_zips": "0[2-5]~0[6-8]~09|1[01]~1[2-6]~00~1[7-9]|2[01]~2[2-5]~2[6-9]|3[01]~3[2-5]~3[6-8]~39|4[0-2]",
    "zip": "(?:37)?\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z%n%C%n%S",
    "languages": "hy",
    "lfmt": "%N%n%O%n%A%n%Z%n%C%n%S",
    "sub_lnames": "Aragatsotn~Ararat~Armavir~Gegharkunik~Yerevan~Lori~Kotayk~Shirak~Syunik~Vayots Dzor~Tavush",
    "sub_keys": "Արագածոտն~Արարատ~Արմավիր~Գեղարքունիք~Երևան~Լոռի~Կոտայք~Շիրակ~Սյունիք~Վայոց ձոր~Տավուշ",
    "key": "AM",
    "sub_isoids": "AG~AR~AV~GR~ER~LO~KT~SH~SU~VD~TV",
    "id": "data/AM",
    "name": "ARMENIA"
  },
  {
    "id": "data/AO",
    "key": "AO",
    "name": "ANGOLA"
  },
  {
    "id": "data/AQ",
    "key": "AQ",
    "name": "ANTARCTICA"
  },
  {
    "lang": "es",
    "upper": "ACZ",
    "zipex": "C1070AAM,C1000WAM,B1000TBU,X5187XAB",
    "sub_zips": "B?[1-36-8]~K?[45]~H?3~U?[89]~C?1~X?[235-8]~W?3~E?[1-3]~P?[37]~Y?4~L?[3568]~F?5~M?[56]~N?3~Q?[38]~R?[89]~A?[34]~J?5~D?[4-6]~Z?[89]~S?[2368]~G?[2-5]~V?9~T?[45]",
    "zip": "((?:[A-HJ-NP-Z])?\\d{4})([A-Z]{3})?",
    "fmt": "%N%n%O%n%A%n%Z %C%n%S",
    "languages": "es",
    "sub_keys": "Buenos Aires~Catamarca~Chaco~Chubut~Ciudad Autónoma de Buenos Aires~Córdoba~Corrientes~Entre Ríos~Formosa~Jujuy~La Pampa~La Rioja~Mendoza~Misiones~Neuquén~Río Negro~Salta~San Juan~San Luis~Santa Cruz~Santa Fe~Santiago del Estero~Tierra del Fuego~Tucumán",
    "key": "AR",
    "sub_isoids": "B~K~H~U~C~X~W~E~P~Y~L~F~M~N~Q~R~A~J~D~Z~S~G~V~T",
    "posturl": "http://www.correoargentino.com.ar/formularios/cpa",
    "id": "data/AR",
    "sub_names": "Buenos Aires~Catamarca~Chaco~Chubut~Ciudad Autónoma de Buenos Aires~Córdoba~Corrientes~Entre Ríos~Formosa~Jujuy~La Pampa~La Rioja~Mendoza~Misiones~Neuquén~Río Negro~Salta~San Juan~San Luis~Santa Cruz~Santa Fe~Santiago del Estero~Tierra del Fuego~Tucumán",
    "name": "ARGENTINA"
  },
  {
    "upper": "ACNOS",
    "zipex": "96799",
    "key": "AS",
    "zip": "(96799)(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/AS",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "AMERICAN SAMOA"
  },
  {
    "zipex": "1010,3741",
    "key": "AT",
    "zip": "\\d{4}",
    "fmt": "%O%n%N%n%A%n%Z %C",
    "id": "data/AT",
    "posturl": "http://www.post.at/post_subsite_postleitzahlfinder.php",
    "require": "ACZ",
    "name": "AUSTRIA"
  },
  {
    "lang": "en",
    "upper": "CS",
    "sub_zipexs": "0200,2540,2618,2999~1000,2888,3585,3707~0800,0999~4000,9999~5000~7000,7999~3000,8000~6000,0872",
    "zipex": "2060,3171,6430,4000,4006,3001",
    "sub_zips": "29|2540|260|261[0-8]|02|2620~1|2[0-57-8]|26[2-9]|261[189]|3500|358[56]|3644|3707~0[89]~[49]~5|0872~7~[38]~6|0872",
    "zip": "\\d{4}",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/AU",
    "languages": "en",
    "sub_keys": "ACT~NSW~NT~QLD~SA~TAS~VIC~WA",
    "key": "AU",
    "locality_name_type": "suburb",
    "posturl": "http://www1.auspost.com.au/postcodes/",
    "fmt": "%O%n%N%n%A%n%C %S %Z",
    "sub_names": "Australian Capital Territory~New South Wales~Northern Territory~Queensland~South Australia~Tasmania~Victoria~Western Australia",
    "name": "AUSTRALIA"
  },
  {
    "id": "data/AW",
    "key": "AW",
    "name": "ARUBA"
  },
  {
    "postprefix": "AX-",
    "zipex": "22150,22550,22240,22710,22270,22730,22430",
    "key": "AX",
    "zip": "22\\d{3}",
    "fmt": "%O%n%N%n%A%nAX-%Z %C%nÅLAND",
    "id": "data/AX",
    "posturl": "http://www.posten.ax/department.con?iPage=123",
    "require": "ACZ",
    "name": "FINLAND"
  },
  {
    "postprefix": "AZ ",
    "zipex": "1000",
    "name": "AZERBAIJAN",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%nAZ %Z %C",
    "key": "AZ",
    "id": "data/AZ"
  },
  {
    "zipex": "71000",
    "name": "BOSNIA AND HERZEGOVINA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "BA",
    "id": "data/BA"
  },
  {
    "zipex": "BB23026,BB22025",
    "name": "BARBADOS",
    "zip": "BB\\d{5}",
    "fmt": "%N%n%O%n%A%n%C, %S %Z",
    "state_name_type": "parish",
    "key": "BB",
    "id": "data/BB"
  },
  {
    "zipex": "1340,1000",
    "key": "BD",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%C - %Z",
    "posturl": "http://www.bangladeshpost.gov.bd/PostCode.asp",
    "id": "data/BD",
    "name": "BANGLADESH"
  },
  {
    "zipex": "4000,1000",
    "key": "BE",
    "zip": "\\d{4}",
    "fmt": "%O%n%N%n%A%n%Z %C",
    "id": "data/BE",
    "posturl": "http://www.post.be/site/nl/residential/customerservice/search/postal_codes.html",
    "require": "ACZ",
    "name": "BELGIUM"
  },
  {
    "fmt": "%N%n%O%n%A%n%C %X",
    "id": "data/BF",
    "key": "BF",
    "name": "BURKINA FASO"
  },
  {
    "zipex": "1000,1700",
    "key": "BG",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.bgpost.bg/?cid=5",
    "id": "data/BG",
    "name": "BULGARIA (REP.)"
  },
  {
    "zipex": "317",
    "name": "BAHRAIN",
    "zip": "(?:\\d|1[0-2])\\d{2}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "BH",
    "id": "data/BH"
  },
  {
    "id": "data/BI",
    "key": "BI",
    "name": "BURUNDI"
  },
  {
    "upper": "AC",
    "id": "data/BJ",
    "key": "BJ",
    "name": "BENIN"
  },
  {
    "upper": "ACX",
    "zipex": "97100",
    "key": "BL",
    "zip": "9[78][01]\\d{2}",
    "require": "ACZ",
    "id": "data/BL",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "SAINT BARTHELEMY"
  },
  {
    "zipex": "FL 07,HM GX,HM 12",
    "key": "BM",
    "zip": "[A-Z]{2} ?[A-Z0-9]{2}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.landvaluation.bm/",
    "id": "data/BM",
    "name": "BERMUDA"
  },
  {
    "zipex": "BT2328,KA1131,BA1511",
    "key": "BN",
    "zip": "[A-Z]{2} ?\\d{4}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.post.gov.bn/index.php/extensions/postcode-guide",
    "id": "data/BN",
    "name": "BRUNEI DARUSSALAM"
  },
  {
    "upper": "AC",
    "id": "data/BO",
    "key": "BO",
    "name": "BOLIVIA"
  },
  {
    "id": "data/BQ",
    "key": "BQ",
    "name": "BONAIRE, SINT EUSTATIUS, AND SABA"
  },
  {
    "lang": "pt",
    "sublocality_name_type": "neighborhood",
    "sub_zipexs": "69900-000,69999-999~57000-000,57999-999~68900-000,68999-999~69000-000,69400-123~40000-000,48999-999~60000-000,63999-999~70000-000,73500-123~29000-000,29999-999~72800-000,73700-123~65000-000,65999-999~78000-000,78899-999~79000-000,79999-999~30000-000,39999-999~66000-000,68899-999~58000-000,58999-999~80000-000,87999-999~50000-000,56999-999~64000-000,64999-999~20000-000,28999-999~59000-000,59999-999~90000-000,99999-999~76800-000,78900-000,78999-999~69300-000,69399-999~88000-000,89999-999~01000-000,13000-123~49000-000,49999-999~77000-000,77999-999",
    "zipex": "40301-110,70002-900",
    "sub_zips": "699~57~689~69[0-24-8]~4[0-8]~6[0-3]~7[0-1]|72[0-7]|73[0-6]~29~72[89]|73[7-9]|7[4-6]~65~78[0-8]~79~3~6[6-7]|68[0-8]~58~8[0-7]~5[0-6]~64~2[0-8]~59~9~76[89]|789~693~8[89]~[01][1-9]~49~77",
    "zip": "\\d{5}-?\\d{3}",
    "upper": "CS",
    "sub_mores": "true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true",
    "require": "ASCZ",
    "state_name_type": "state",
    "id": "data/BR",
    "languages": "pt",
    "sub_keys": "AC~AL~AP~AM~BA~CE~DF~ES~GO~MA~MT~MS~MG~PA~PB~PR~PE~PI~RJ~RN~RS~RO~RR~SC~SP~SE~TO",
    "key": "BR",
    "sub_isoids": "AC~AL~AP~AM~BA~CE~DF~ES~GO~MA~MT~MS~MG~PA~PB~PR~PE~PI~RJ~RN~RS~RO~RR~SC~SP~SE~TO",
    "posturl": "http://www.buscacep.correios.com.br/",
    "fmt": "%O%n%N%n%A%n%D%n%C-%S%n%Z",
    "sub_names": "Acre~Alagoas~Amapá~Amazonas~Bahia~Ceará~Distrito Federal~Espírito Santo~Goiás~Maranhão~Mato Grosso~Mato Grosso do Sul~Minas Gerais~Pará~Paraíba~Paraná~Pernambuco~Piauí~Rio de Janeiro~Rio Grande do Norte~Rio Grande do Sul~Rondônia~Roraima~Santa Catarina~São Paulo~Sergipe~Tocantins",
    "name": "BRAZIL"
  },
  {
    "lang": "en",
    "name": "BAHAMAS",
    "fmt": "%N%n%O%n%A%n%C, %S",
    "state_name_type": "island",
    "languages": "en",
    "sub_keys": "Abaco~Acklins~Andros~Berry Islands~Bimini~Cat Island~Crooked Island~Eleuthera~Exuma~Grand Bahama~Harbour Island~Inagua~Long Island~Mayaguana~N.P.~Ragged Island~Rum Cay~San Salvador~Spanish Wells",
    "key": "BS",
    "sub_isoids": "~AK~~BY~BI~CI~~~EX~~HI~IN~LI~MG~~RI~RC~SS~SW",
    "id": "data/BS",
    "sub_names": "Abaco Islands~Acklins~Andros Island~Berry Islands~Bimini~Cat Island~Crooked Island~Eleuthera~Exuma and Cays~Grand Bahama~Harbour Island~Inagua~Long Island~Mayaguana~New Providence~Ragged Island~Rum Cay~San Salvador~Spanish Wells"
  },
  {
    "zipex": "11001,31101,35003",
    "key": "BT",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.bhutanpost.bt/searchpostcode.php",
    "id": "data/BT",
    "name": "BHUTAN"
  },
  {
    "id": "data/BV",
    "key": "BV",
    "name": "BOUVET ISLAND"
  },
  {
    "id": "data/BW",
    "key": "BW",
    "name": "BOTSWANA"
  },
  {
    "zipex": "223016,225860,220050",
    "key": "BY",
    "zip": "\\d{6}",
    "fmt": "%S%n%Z %C%n%A%n%O%n%N",
    "posturl": "http://ex.belpost.by/addressbook/",
    "id": "data/BY",
    "name": "BELARUS"
  },
  {
    "id": "data/BZ",
    "key": "BZ",
    "name": "BELIZE"
  },
  {
    "lang": "en",
    "upper": "ACNOSZ",
    "zipex": "H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1",
    "sub_zips": "T~V~R~E~A~X0E|X0G|X1A~B~X0A|X0B|X0C~K|L|M|N|P~C~G|H|J|K1A~S|R8A~Y",
    "zip": "[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d",
    "require": "ACSZ",
    "id": "data/CA",
    "languages": "en~fr",
    "sub_keys": "AB~BC~MB~NB~NL~NT~NS~NU~ON~PE~QC~SK~YT",
    "key": "CA",
    "posturl": "https://www.canadapost.ca/cpo/mc/personal/postalcode/fpc.jsf",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "sub_names": "Alberta~British Columbia~Manitoba~New Brunswick~Newfoundland and Labrador~Northwest Territories~Nova Scotia~Nunavut~Ontario~Prince Edward Island~Quebec~Saskatchewan~Yukon",
    "name": "CANADA"
  },
  {
    "upper": "CS",
    "zipex": "6799",
    "name": "COCOS (KEELING) ISLANDS",
    "zip": "6799",
    "fmt": "%O%n%N%n%A%n%C %S %Z",
    "key": "CC",
    "id": "data/CC"
  },
  {
    "id": "data/CD",
    "key": "CD",
    "name": "CONGO (DEM. REP.)"
  },
  {
    "id": "data/CF",
    "key": "CF",
    "name": "CENTRAL AFRICAN REPUBLIC"
  },
  {
    "id": "data/CG",
    "key": "CG",
    "name": "CONGO (REP.)"
  },
  {
    "postprefix": "CH-",
    "upper": "",
    "zipex": "2544,1211,1556,3030",
    "key": "CH",
    "zip": "\\d{4}",
    "require": "ACZ",
    "id": "data/CH",
    "posturl": "http://www.post.ch/db/owa/pv_plz_pack/pr_main",
    "fmt": "%O%n%N%n%A%nCH-%Z %C",
    "name": "SWITZERLAND"
  },
  {
    "fmt": "%N%n%O%n%X %A %C %X",
    "id": "data/CI",
    "key": "CI",
    "name": "COTE D'IVOIRE"
  },
  {
    "id": "data/CK",
    "key": "CK",
    "name": "COOK ISLANDS"
  },
  {
    "lang": "es",
    "zipex": "8340457,8720019,1230000,8329100",
    "posturl": "http://www.correos.cl/SitePages/home.aspx",
    "zip": "\\d{7}",
    "sub_mores": "true~true~true~true~true~true~true~true~true~true~true~true~true~true~true",
    "fmt": "%N%n%O%n%A%n%Z %C%n%S",
    "languages": "es",
    "sub_keys": "Antofagasta~Araucanía~Arica y Parinacota~Atacama~Aysén~Biobío~Coquimbo~O'Higgins~Los Lagos~Los Ríos~Magallanes~Maule~Región Metropolitana~Tarapacá~Valparaíso",
    "key": "CL",
    "sub_isoids": "AN~AR~AP~AT~AI~BI~CO~LI~LL~LR~MA~ML~RM~TA~VS",
    "id": "data/CL",
    "sub_names": "Antofagasta~Araucanía~Arica y Parinacota~Atacama~Aysén del General Carlos Ibáñez del Campo~Biobío~Coquimbo~Libertador General Bernardo O'Higgins~Los Lagos~Los Ríos~Magallanes y de la Antártica Chilena~Maule~Metropolitana de Santiago~Tarapacá~Valparaíso",
    "name": "CHILE"
  },
  {
    "id": "data/CM",
    "key": "CM",
    "name": "CAMEROON"
  },
  {
    "lang": "zh",
    "sublocality_name_type": "district",
    "sub_xrequires": "~A~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ACS~~~",
    "zipex": "266033,317204,100096,100808",
    "key": "CN",
    "zip": "\\d{6}",
    "upper": "S",
    "sub_mores": "true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true",
    "require": "ACSZ",
    "id": "data/CN",
    "languages": "zh",
    "lfmt": "%N%n%O%n%A%n%D%n%C%n%S, %Z",
    "sub_lnames": "Anhui Sheng~Macau~Beijing Shi~Chongqing Shi~Fujian Sheng~Gansu Sheng~Guangdong Sheng~Guangxi Zhuangzuzizhiqu~Guizhou Sheng~Hainan Sheng~Hebei Sheng~Henan Sheng~Heilongjiang Sheng~Hubei Sheng~Hunan Sheng~Jilin Sheng~Jiangsu Sheng~Jiangxi Sheng~Liaoning Sheng~Neimenggu Zizhiqu~Ningxia Huizuzizhiqu~Qinghai Sheng~Shandong Sheng~Shanxi Sheng~Shaanxi Sheng~Shanghai Shi~Sichuan Sheng~Taiwan~Tianjin Shi~Xizang Zizhiqu~Hong Kong~Xinjiang Weiwuerzizhiqu~Yunnan Sheng~Zhejiang Sheng",
    "sub_keys": "安徽省~澳门~北京市~重庆市~福建省~甘肃省~广东省~广西壮族自治区~贵州省~海南省~河北省~河南省~黑龙江省~湖北省~湖南省~吉林省~江苏省~江西省~辽宁省~内蒙古自治区~宁夏回族自治区~青海省~山东省~山西省~陕西省~上海市~四川省~台湾~天津市~西藏自治区~香港~新疆维吾尔自治区~云南省~浙江省",
    "sub_xzips": "~999078~~~~~~~~~~~~~~~~~~~~~~~~~~\\d{3}(\\d{2})?~~~999077~~~",
    "sub_isoids": "34~92~11~50~35~62~44~45~52~46~13~41~23~42~43~22~32~36~21~15~64~63~37~14~61~31~51~71~12~54~91~65~53~33",
    "posturl": "http://www.ems.com.cn/serviceguide/you_bian_cha_xun.html",
    "fmt": "%Z%n%S%C%D%n%A%n%O%n%N",
    "sub_names": "安徽省~澳门~北京市~重庆市~福建省~甘肃省~广东省~广西~贵州省~海南省~河北省~河南省~黑龙江省~湖北省~湖南省~吉林省~江苏省~江西省~辽宁省~内蒙古~宁夏~青海省~山东省~山西省~陕西省~上海市~四川省~台湾~天津市~西藏~香港~新疆~云南省~浙江省",
    "name": "CHINA"
  },
  {
    "zipex": "111221,130001,760011",
    "key": "CO",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%C, %S, %Z",
    "state_name_type": "department",
    "id": "data/CO",
    "posturl": "http://www.codigopostal.gov.co/",
    "require": "AS",
    "name": "COLOMBIA"
  },
  {
    "zipex": "1000,2010,1001",
    "key": "CR",
    "zip": "\\d{4,5}|\\d{3}-\\d{4}",
    "fmt": "%N%n%O%n%A%n%S, %C%n%Z",
    "id": "data/CR",
    "posturl": "https://www.correos.go.cr/nosotros/codigopostal/busqueda.html",
    "require": "ACS",
    "name": "COSTA RICA"
  },
  {
    "lang": "pt",
    "zipex": "7600",
    "name": "CAPE VERDE",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C%n%S",
    "state_name_type": "island",
    "languages": "pt",
    "sub_keys": "Boa Vista~Brava~Fogo~Maio~Sal~Santiago~Santo Antão~São Nicolau~São Vicente",
    "key": "CV",
    "sub_isoids": "BV~BR~~MA~SL~~~~SV",
    "id": "data/CV"
  },
  {
    "id": "data/CW",
    "key": "CW",
    "name": "CURACAO"
  },
  {
    "upper": "CS",
    "zipex": "6798",
    "name": "CHRISTMAS ISLAND",
    "zip": "6798",
    "fmt": "%O%n%N%n%A%n%C %S %Z",
    "key": "CX",
    "id": "data/CX"
  },
  {
    "zipex": "2008,3304,1900",
    "name": "CYPRUS",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "CY",
    "id": "data/CY"
  },
  {
    "zipex": "100 00,251 66,530 87,110 00,225 99",
    "key": "CZ",
    "zip": "\\d{3} ?\\d{2}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://psc.ceskaposta.cz/CleanForm.action",
    "id": "data/CZ",
    "name": "CZECH REP."
  },
  {
    "zipex": "26133,53225",
    "key": "DE",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/DE",
    "posturl": "http://www.postdirekt.de/plzserver/",
    "require": "ACZ",
    "name": "GERMANY"
  },
  {
    "id": "data/DJ",
    "key": "DJ",
    "name": "DJIBOUTI"
  },
  {
    "zipex": "8660,1566",
    "key": "DK",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/DK",
    "posturl": "http://www.postdanmark.dk/da/Privat/Kundeservice/postnummerkort/Sider/Find-postnummer.aspx",
    "require": "ACZ",
    "name": "DENMARK"
  },
  {
    "id": "data/DM",
    "key": "DM",
    "name": "DOMINICA"
  },
  {
    "zipex": "11903,10101",
    "key": "DO",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://inposdom.gob.do/codigo-postal/",
    "id": "data/DO",
    "name": "DOMINICAN REP."
  },
  {
    "zipex": "40304,16027",
    "name": "ALGERIA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "DZ",
    "id": "data/DZ"
  },
  {
    "upper": "CZ",
    "zipex": "090105,092301",
    "key": "EC",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z%n%C",
    "posturl": "http://www.codigopostal.gob.ec/",
    "id": "data/EC",
    "name": "ECUADOR"
  },
  {
    "zipex": "69501,11212",
    "key": "EE",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.post.ee/?op=sihtnumbriotsing",
    "id": "data/EE",
    "name": "ESTONIA"
  },
  {
    "lang": "ar",
    "sub_zipexs": "81000~71000~21000,23000~41000~85000~84000~22000~12000~35000~43000~44000~31000~63000~11000~13000~32000~61000~72000~62000~42000~46000~34000~82000~45000~83000~33000~51000",
    "zipex": "12411,11599",
    "sub_zips": "81~71~2[13]~41~85~84~22~12~35~43~44~31~63~11~13~32~61~72~62~42~46~34~82~45~83~33~51",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "languages": "ar",
    "lfmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "sub_lnames": "Aswan Governorate~Asyut Governorate~Alexandria Governorate~Ismailia Governorate~Luxor Governorate~Red Sea Governorate~El Beheira Governorate~Giza Governorate~Dakahlia Governorate~Suez Governorate~Ash Sharqia Governorate~Gharbia Governorate~Faiyum Governorate~Cairo Governorate~Qalyubia Governorate~Menofia Governorate~Menia Governorate~New Valley Governorate~Beni Suef Governorate~Port Said Governorate~South Sinai Governorate~Damietta Governorate~Sohag Governorate~North Sinai Governorate~Qena Governorate~Kafr El Sheikh Governorate~Matrouh Governorate",
    "sub_keys": "أسوان~أسيوط~الإسكندرية~الإسماعيلية~الأقصر~البحر الأحمر~البحيرة~الجيزة~الدقهلية~السويس~الشرقية~الغربية~الفيوم~القاهرة~القليوبية~المنوفية~المنيا~الوادي الجديد~بني سويف~بورسعيد~جنوب سيناء~دمياط~سوهاج~شمال سيناء~قنا~كفر الشيخ~مطروح",
    "key": "EG",
    "sub_isoids": "ASN~AST~ALX~IS~LX~BA~BH~GZ~DK~SUZ~SHR~GH~FYM~C~KB~MNF~MN~WAD~BNS~PTS~JS~DT~SHG~SIN~KN~KFS~MT",
    "id": "data/EG",
    "name": "EGYPT"
  },
  {
    "zipex": "70000,72000",
    "name": "WESTERN SAHARA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "EH",
    "id": "data/EH"
  },
  {
    "id": "data/ER",
    "key": "ER",
    "name": "ERITREA"
  },
  {
    "lang": "es",
    "upper": "CS",
    "zipex": "28039,28300,28070",
    "sub_zips": "15~01~02~03~04~33~05~06~08~09~10~11~39~12~51~13~14~16~17~18~19~20~21~22~07~23~26~35~24~25~27~28~29~52~30~31~32~34~36~37~38~40~41~42~43~44~45~46~47~48~49~50",
    "zip": "\\d{5}",
    "require": "ACSZ",
    "id": "data/ES",
    "languages": "es",
    "sub_keys": "A Coruña~Álava~Albacete~Alicante~Almería~Asturias~Ávila~Badajoz~Barcelona~Burgos~Cáceres~Cádiz~Cantabria~Castellón~Ceuta~Ciudad Real~Córdoba~Cuenca~Girona~Granada~Guadalajara~Guipúzcoa~Huelva~Huesca~Islas Baleares~Jaén~La Rioja~Las Palmas~León~Lleida~Lugo~Madrid~Málaga~Melilla~Murcia~Navarra~Ourense~Palencia~Pontevedra~Salamanca~Santa Cruz de Tenerife~Segovia~Sevilla~Soria~Tarragona~Teruel~Toledo~Valencia~Valladolid~Vizcaya~Zamora~Zaragoza",
    "key": "ES",
    "sub_isoids": "C~VI~AB~A~AL~O~AV~BA~B~BU~CC~CA~S~CS~CE~CR~CO~CU~GI~GR~GU~SS~H~HU~PM~J~LO~GC~LE~L~LU~M~MA~ML~MU~NA~OR~P~PO~SA~TF~SG~SE~SO~T~TE~TO~V~VA~BI~ZA~Z",
    "posturl": "http://www.correos.es/contenido/13-MenuRec2/04-MenuRec24/1010_s-CodPostal.asp",
    "fmt": "%N%n%O%n%A%n%Z %C %S",
    "name": "SPAIN"
  },
  {
    "zipex": "1000",
    "name": "ETHIOPIA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "ET",
    "id": "data/ET"
  },
  {
    "postprefix": "FI-",
    "zipex": "00550,00011",
    "key": "FI",
    "zip": "\\d{5}",
    "fmt": "%O%n%N%n%A%nFI-%Z %C",
    "id": "data/FI",
    "posturl": "http://www.verkkoposti.com/e3/postinumeroluettelo",
    "require": "ACZ",
    "name": "FINLAND"
  },
  {
    "id": "data/FJ",
    "key": "FJ",
    "name": "FIJI"
  },
  {
    "upper": "CZ",
    "zipex": "FIQQ 1ZZ",
    "name": "FALKLAND ISLANDS (MALVINAS)",
    "zip": "FIQQ 1ZZ",
    "require": "ACZ",
    "id": "data/FK",
    "key": "FK",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "upper": "ACNOS",
    "zipex": "96941,96944",
    "key": "FM",
    "zip": "(9694[1-4])(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/FM",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "MICRONESIA (Federated State of)"
  },
  {
    "postprefix": "FO",
    "zipex": "100",
    "key": "FO",
    "zip": "\\d{3}",
    "fmt": "%N%n%O%n%A%nFO%Z %C",
    "posturl": "http://www.postur.fo/",
    "id": "data/FO",
    "name": "FAROE ISLANDS"
  },
  {
    "upper": "CX",
    "zipex": "33380,34092,33506",
    "key": "FR",
    "zip": "\\d{2} ?\\d{3}",
    "require": "ACZ",
    "id": "data/FR",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "FRANCE"
  },
  {
    "id": "data/GA",
    "key": "GA",
    "name": "GABON"
  },
  {
    "upper": "CZ",
    "zipex": "EC1Y 8SY,GIR 0AA,M2 5BQ,M34 4AB,CR0 2YR,DN16 9AA,W1A 4ZZ,EC1A 1HQ,OX14 4PG,BS18 8HF,NR25 7HG,RH6 0NP,BH23 6AA,B6 5BA,SO23 9AP,PO1 3AX,BFPO 61",
    "key": "GB",
    "zip": "GIR ?0AA|(?:(?:AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}))|BFPO ?\\d{1,4}",
    "require": "ACZ",
    "id": "data/GB",
    "posturl": "http://www.royalmail.com/postcode-finder",
    "locality_name_type": "post_town",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "name": "UNITED KINGDOM"
  },
  {
    "id": "data/GD",
    "key": "GD",
    "name": "GRENADA (WEST INDIES)"
  },
  {
    "zipex": "0101",
    "key": "GE",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.georgianpost.ge/index.php?page=10",
    "id": "data/GE",
    "name": "GEORGIA"
  },
  {
    "upper": "ACX",
    "zipex": "97300",
    "key": "GF",
    "zip": "9[78]3\\d{2}",
    "require": "ACZ",
    "id": "data/GF",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "FRENCH GUIANA"
  },
  {
    "upper": "CZ",
    "zipex": "GY1 1AA,GY2 2BT",
    "key": "GG",
    "zip": "GY\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}",
    "require": "ACZ",
    "id": "data/GG",
    "posturl": "http://www.guernseypost.com/postcode_finder/",
    "fmt": "%N%n%O%n%A%n%C%nGUERNSEY%n%Z",
    "name": "CHANNEL ISLANDS"
  },
  {
    "id": "data/GH",
    "key": "GH",
    "name": "GHANA"
  },
  {
    "zipex": "GX11 1AA",
    "name": "GIBRALTAR",
    "zip": "GX11 1AA",
    "require": "A",
    "id": "data/GI",
    "key": "GI",
    "fmt": "%N%n%O%n%A%nGIBRALTAR%n%Z"
  },
  {
    "zipex": "3900,3950,3911",
    "name": "GREENLAND",
    "zip": "39\\d{2}",
    "require": "ACZ",
    "id": "data/GL",
    "key": "GL",
    "fmt": "%N%n%O%n%A%n%Z %C"
  },
  {
    "id": "data/GM",
    "key": "GM",
    "name": "GAMBIA"
  },
  {
    "zipex": "001,200,100",
    "name": "GUINEA",
    "zip": "\\d{3}",
    "fmt": "%N%n%O%n%Z %A %C",
    "key": "GN",
    "id": "data/GN"
  },
  {
    "upper": "ACX",
    "zipex": "97100",
    "key": "GP",
    "zip": "9[78][01]\\d{2}",
    "require": "ACZ",
    "id": "data/GP",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "GUADELOUPE"
  },
  {
    "id": "data/GQ",
    "key": "GQ",
    "name": "EQUATORIAL GUINEA"
  },
  {
    "zipex": "151 24,151 10,101 88",
    "key": "GR",
    "zip": "\\d{3} ?\\d{2}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/GR",
    "posturl": "http://www.elta.gr/findapostcode.aspx",
    "require": "ACZ",
    "name": "GREECE"
  },
  {
    "upper": "CZ",
    "zipex": "SIQQ 1ZZ",
    "name": "SOUTH GEORGIA",
    "zip": "SIQQ 1ZZ",
    "require": "ACZ",
    "id": "data/GS",
    "key": "GS",
    "fmt": "%N%n%O%n%A%n%n%C%n%Z"
  },
  {
    "zipex": "09001,01501",
    "name": "GUATEMALA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z- %C",
    "key": "GT",
    "id": "data/GT"
  },
  {
    "upper": "ACNOS",
    "zipex": "96910,96931",
    "key": "GU",
    "zip": "(969(?:[12]\\d|3[12]))(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/GU",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "GUAM"
  },
  {
    "zipex": "1000,1011",
    "name": "GUINEA-BISSAU",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "GW",
    "id": "data/GW"
  },
  {
    "id": "data/GY",
    "key": "GY",
    "name": "GUYANA"
  },
  {
    "lang": "zh-Hant",
    "upper": "S",
    "sub_lnames": "Kowloon~Hong Kong Island~New Territories",
    "name": "HONG KONG",
    "sub_mores": "true~true~true",
    "require": "AS",
    "state_name_type": "area",
    "id": "data/HK",
    "languages": "zh-Hant~en",
    "lfmt": "%N%n%O%n%A%n%C%n%S",
    "sub_keys": "九龍~香港島~新界",
    "key": "HK",
    "locality_name_type": "district",
    "fmt": "%S%n%C%n%A%n%O%n%N"
  },
  {
    "upper": "CS",
    "zipex": "7050",
    "name": "HEARD AND MCDONALD ISLANDS",
    "zip": "\\d{4}",
    "fmt": "%O%n%N%n%A%n%C %S %Z",
    "key": "HM",
    "id": "data/HM"
  },
  {
    "zipex": "31301",
    "name": "HONDURAS",
    "zip": "\\d{5}",
    "require": "ACS",
    "id": "data/HN",
    "key": "HN",
    "fmt": "%N%n%O%n%A%n%C, %S%n%Z"
  },
  {
    "postprefix": "HR-",
    "zipex": "10000,21001,10002",
    "key": "HR",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%nHR-%Z %C",
    "posturl": "http://www.posta.hr/default.aspx?pretpum",
    "id": "data/HR",
    "name": "CROATIA"
  },
  {
    "postprefix": "HT",
    "zipex": "6120,5310,6110,8510",
    "name": "HAITI",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%nHT%Z %C",
    "key": "HT",
    "id": "data/HT"
  },
  {
    "upper": "ACNO",
    "zipex": "1037,2380,1540",
    "key": "HU",
    "zip": "\\d{4}",
    "require": "ACZ",
    "id": "data/HU",
    "posturl": "http://posta.hu/ugyfelszolgalat/iranyitoszam_kereso",
    "fmt": "%N%n%O%n%C%n%A%n%Z",
    "name": "HUNGARY (Rep.)"
  },
  {
    "lang": "id",
    "zipex": "40115",
    "name": "INDONESIA",
    "zip": "\\d{5}",
    "require": "AS",
    "id": "data/ID",
    "languages": "id",
    "sub_keys": "Aceh~Bali~Banten~Bengkulu~Daerah Istimewa Yogyakarta~DKI Jakarta~Gorontalo~Jambi~Jawa Barat~Jawa Tengah~Jawa Timur~Kalimantan Barat~Kalimantan Selatan~Kalimantan Tengah~Kalimantan Timur~Kalimantan Utara~Kepulauan Bangka Belitung~Kepulauan Riau~Lampung~Maluku~Maluku Utara~Nusa Tenggara Barat~Nusa Tenggara Timur~Papua~Papua Barat~Riau~Sulawesi Barat~Sulawesi Selatan~Sulawesi Tengah~Sulawesi Tenggara~Sulawesi Utara~Sumatera Barat~Sumatera Selatan~Sumatera Utara",
    "key": "ID",
    "sub_isoids": "AC~BA~BT~BE~YO~JK~GO~JA~JB~JT~JI~KB~KS~KT~KI~KU~BB~KR~LA~MA~MU~NB~NT~PA~PB~RI~SR~SN~ST~SG~SA~SB~SS~SU",
    "fmt": "%N%n%O%n%A%n%C%n%S %Z"
  },
  {
    "lang": "en",
    "sublocality_name_type": "townland",
    "zipex": "A65 F4E2",
    "posturl": "https://finder.eircode.ie",
    "zip": "[\\dA-Z]{3} ?[\\dA-Z]{4}",
    "zip_name_type": "eircode",
    "fmt": "%N%n%O%n%A%n%D%n%C%n%S %Z",
    "state_name_type": "county",
    "languages": "en",
    "sub_keys": "Co. Carlow~Co. Cavan~Co. Clare~Co. Cork~Co. Donegal~Co. Dublin~Co. Galway~Co. Kerry~Co. Kildare~Co. Kilkenny~Co. Laois~Co. Leitrim~Co. Limerick~Co. Longford~Co. Louth~Co. Mayo~Co. Meath~Co. Monaghan~Co. Offaly~Co. Roscommon~Co. Sligo~Co. Tipperary~Co. Waterford~Co. Westmeath~Co. Wexford~Co. Wicklow",
    "key": "IE",
    "sub_isoids": "CW~CN~CE~C~DL~D~G~KY~KE~KK~LS~LM~LK~LD~LH~MO~MH~MN~OY~RN~SO~TA~WD~WH~WX~WW",
    "id": "data/IE",
    "name": "IRELAND"
  },
  {
    "zipex": "9614303",
    "key": "IL",
    "zip": "\\d{5}(?:\\d{2})?",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.israelpost.co.il/zipcode.nsf/demozip?openform",
    "id": "data/IL",
    "name": "ISRAEL"
  },
  {
    "upper": "CZ",
    "zipex": "IM2 1AA,IM99 1PS",
    "key": "IM",
    "zip": "IM\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}",
    "require": "ACZ",
    "id": "data/IM",
    "posturl": "http://www.gov.im/post/postal/fr_main.asp",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "name": "ISLE OF MAN"
  },
  {
    "lang": "en",
    "zipex": "110034,110001",
    "sub_zips": "744~5[0-3]~79[0-2]~78~8[0-5]~16|1440[3-9]~49~396~396~11~403~3[6-9]~1[23]~17~1[89]~81[4-9]|82|83[0-5]~5[4-9]|53[7-9]~6[7-9]|6010|607008|777~673~4[5-8]|490~4[0-4]~79[56]~79[34]~796~79[78]~7[5-7]~605~1[456]~3[0-4]~737|750~6[0-6]|536~5[0-3]~799~2[0-35-8]|24[0-7]|26[12]~24[46-9]|254|26[23]~7[0-4]",
    "zip": "\\d{6}",
    "zip_name_type": "pin",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/IN",
    "languages": "en",
    "sub_keys": "Andaman and Nicobar Islands~Andhra Pradesh~Arunachal Pradesh~Assam~Bihar~Chandigarh~Chhattisgarh~Dadra and Nagar Haveli~Daman and Diu~Delhi~Goa~Gujarat~Haryana~Himachal Pradesh~Jammu and Kashmir~Jharkhand~Karnataka~Kerala~Lakshadweep~Madhya Pradesh~Maharashtra~Manipur~Meghalaya~Mizoram~Nagaland~Odisha~Puducherry~Punjab~Rajasthan~Sikkim~Tamil Nadu~Telangana~Tripura~Uttar Pradesh~Uttarakhand~West Bengal",
    "key": "IN",
    "sub_isoids": "AN~AP~AR~AS~BR~CH~CT~DN~DD~DL~GA~GJ~HR~HP~JK~JH~KA~KL~LD~MP~MH~MN~ML~MZ~NL~OR~PY~PB~RJ~SK~TN~TG~TR~UP~UT~WB",
    "posturl": "http://cept.gov.in/lbpsd/placesearch.aspx",
    "fmt": "%N%n%O%n%A%n%C %Z%n%S",
    "sub_names": "Andaman & Nicobar~Andhra Pradesh~Arunachal Pradesh~Assam~Bihar~Chandigarh~Chhattisgarh~Dadra & Nagar Haveli~Daman & Diu~Delhi~Goa~Gujarat~Haryana~Himachal Pradesh~Jammu & Kashmir~Jharkhand~Karnataka~Kerala~Lakshadweep~Madhya Pradesh~Maharashtra~Manipur~Meghalaya~Mizoram~Nagaland~Odisha~Puducherry~Punjab~Rajasthan~Sikkim~Tamil Nadu~Telangana~Tripura~Uttar Pradesh~Uttarakhand~West Bengal",
    "name": "INDIA"
  },
  {
    "upper": "CZ",
    "zipex": "BBND 1ZZ",
    "name": "BRITISH INDIAN OCEAN TERRITORY",
    "zip": "BBND 1ZZ",
    "require": "ACZ",
    "id": "data/IO",
    "key": "IO",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "upper": "CS",
    "zipex": "31001",
    "name": "IRAQ",
    "zip": "\\d{5}",
    "require": "ACS",
    "id": "data/IQ",
    "key": "IQ",
    "fmt": "%O%n%N%n%A%n%C, %S%n%Z"
  },
  {
    "sublocality_name_type": "neighborhood",
    "zipex": "11936-12345",
    "name": "IRAN",
    "zip": "\\d{5}-?\\d{5}",
    "fmt": "%O%n%N%n%S%n%C, %D%n%A%n%Z",
    "key": "IR",
    "id": "data/IR"
  },
  {
    "zipex": "320,121,220,110",
    "key": "IS",
    "zip": "\\d{3}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "https://www.postur.is/um-postinn/posthus/gotuskra/",
    "id": "data/IS",
    "name": "ICELAND"
  },
  {
    "lang": "it",
    "upper": "CS",
    "zipex": "00144,47037,39049",
    "sub_zips": "92~15~60~11~52~63~14~83~70~76[01]~32~82~24~13[89]~40~39~25~72~0912[1-9]|0913[0-4]|0901[0289]|0902[03468]|0903[0234]|0904|0803[035]|08043~93~860[1-4]|86100~0901[013-7]~81~95~88[01]~66~22~87~26[01]~88[89]~12|18025~94~638|63900~44~50~71~47[015]~03~16~34[01]7~58~18~860[7-9]|86170~67~19~04~73~23[89]~57~26[89]~55~62~46~54~75~0902[012579]|0903[015-9]|09040~98~20~41~208|20900~80~28[01]~080[1-3]|08100~08037|0804[024-9]~08020|0702|0703[08]~090[7-9]|09170|0801[039]|0803[04]~35~90~43~27~06~61~65~29~56~51~330[7-9]|33170~85~59~97~48~89[01]~42~02~47[89]~00~45~84~070[14]|0703[0-79]|07100~17|12071~53~96~23[01]~74~64~05~10~91~38~31~3401|341[0-689]|34062~330[1-5]|33100~21~30~28[89]~13[01]~37~89[89]~36~01",
    "zip": "\\d{5}",
    "require": "ACSZ",
    "id": "data/IT",
    "languages": "it",
    "sub_keys": "AG~AL~AN~AO~AR~AP~AT~AV~BA~BT~BL~BN~BG~BI~BO~BZ~BS~BR~CA~CL~CB~CI~CE~CT~CZ~CH~CO~CS~CR~KR~CN~EN~FM~FE~FI~FG~FC~FR~GE~GO~GR~IM~IS~AQ~SP~LT~LE~LC~LI~LO~LU~MC~MN~MS~MT~VS~ME~MI~MO~MB~NA~NO~NU~OG~OT~OR~PD~PA~PR~PV~PG~PU~PE~PC~PI~PT~PN~PZ~PO~RG~RA~RC~RE~RI~RN~RM~RO~SA~SS~SV~SI~SR~SO~TA~TE~TR~TO~TP~TN~TV~TS~UD~VA~VE~VB~VC~VR~VV~VI~VT",
    "key": "IT",
    "posturl": "http://www.poste.it/online/cercacap/",
    "fmt": "%N%n%O%n%A%n%Z %C %S",
    "sub_names": "Agrigento~Alessandria~Ancona~Aosta~Arezzo~Ascoli Piceno~Asti~Avellino~Bari~Barletta-Andria-Trani~Belluno~Benevento~Bergamo~Biella~Bologna~Bolzano~Brescia~Brindisi~Cagliari~Caltanissetta~Campobasso~Carbonia-Iglesias~Caserta~Catania~Catanzaro~Chieti~Como~Cosenza~Cremona~Crotone~Cuneo~Enna~Fermo~Ferrara~Firenze~Foggia~Forlì-Cesena~Frosinone~Genova~Gorizia~Grosseto~Imperia~Isernia~L'Aquila~La Spezia~Latina~Lecce~Lecco~Livorno~Lodi~Lucca~Macerata~Mantova~Massa-Carrara~Matera~Medio Campidano~Messina~Milano~Modena~Monza e Brianza~Napoli~Novara~Nuoro~Ogliastra~Olbia-Tempio~Oristano~Padova~Palermo~Parma~Pavia~Perugia~Pesaro e Urbino~Pescara~Piacenza~Pisa~Pistoia~Pordenone~Potenza~Prato~Ragusa~Ravenna~Reggio Calabria~Reggio Emilia~Rieti~Rimini~Roma~Rovigo~Salerno~Sassari~Savona~Siena~Siracusa~Sondrio~Taranto~Teramo~Terni~Torino~Trapani~Trento~Treviso~Trieste~Udine~Varese~Venezia~Verbano-Cusio-Ossola~Vercelli~Verona~Vibo Valentia~Vicenza~Viterbo",
    "name": "ITALY"
  },
  {
    "upper": "CZ",
    "zipex": "JE1 1AA,JE2 2BT",
    "key": "JE",
    "zip": "JE\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}",
    "require": "ACZ",
    "id": "data/JE",
    "posturl": "http://www.jerseypost.com/tools/postcode-address-finder/",
    "fmt": "%N%n%O%n%A%n%C%nJERSEY%n%Z",
    "name": "CHANNEL ISLANDS"
  },
  {
    "lang": "en",
    "name": "JAMAICA",
    "require": "ACS",
    "state_name_type": "parish",
    "id": "data/JM",
    "languages": "en",
    "sub_keys": "Clarendon~Hanover~Kingston~Manchester~Portland~St. Andrew~St. Ann~St. Catherine~St. Elizabeth~St. James~St. Mary~St. Thomas~Trelawny~Westmoreland",
    "key": "JM",
    "sub_isoids": "13~09~01~12~04~02~06~14~11~08~05~03~07~10",
    "fmt": "%N%n%O%n%A%n%C%n%S %X"
  },
  {
    "zipex": "11937,11190",
    "name": "JORDAN",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "JO",
    "id": "data/JO"
  },
  {
    "lang": "ja",
    "upper": "S",
    "zipex": "154-0023,350-1106,951-8073,112-0001,208-0032,231-0012",
    "sub_zips": "0[4-9]|00[1-7]~03|018~02~98~01~99~9[67]~3[01]~32|311|349~37|38[49]~3[3-6]~2[6-9]~1[0-8]|19[0-8]|20~2[1-5]|199~9[45]|389~93~92|939~91|922~40~3[89]|949~50~4[1-9]~4[4-9]|431~51|498|647~52~6[0-2]|520~5[3-9]|618|630~6[5-7]|563~63|64[78]~64|519~68~69|68[45]~7[01]~7[23]~7[45]~77~76~79~78~8[0-3]|871~84~85|81[17]|848~86~87|839~88~89~90",
    "zip": "\\d{3}-?\\d{4}",
    "require": "ACSZ",
    "state_name_type": "prefecture",
    "id": "data/JP",
    "languages": "ja",
    "lfmt": "%N%n%O%n%A%n%C, %S%n%Z",
    "sub_lnames": "Hokkaido~Aomori~Iwate~Miyagi~Akita~Yamagata~Fukushima~Ibaraki~Tochigi~Gunma~Saitama~Chiba~Tokyo~Kanagawa~Niigata~Toyama~Ishikawa~Fukui~Yamanashi~Nagano~Gifu~Shizuoka~Aichi~Mie~Shiga~Kyoto~Osaka~Hyogo~Nara~Wakayama~Tottori~Shimane~Okayama~Hiroshima~Yamaguchi~Tokushima~Kagawa~Ehime~Kochi~Fukuoka~Saga~Nagasaki~Kumamoto~Oita~Miyazaki~Kagoshima~Okinawa",
    "sub_keys": "北海道~青森県~岩手県~宮城県~秋田県~山形県~福島県~茨城県~栃木県~群馬県~埼玉県~千葉県~東京都~神奈川県~新潟県~富山県~石川県~福井県~山梨県~長野県~岐阜県~静岡県~愛知県~三重県~滋賀県~京都府~大阪府~兵庫県~奈良県~和歌山県~鳥取県~島根県~岡山県~広島県~山口県~徳島県~香川県~愛媛県~高知県~福岡県~佐賀県~長崎県~熊本県~大分県~宮崎県~鹿児島県~沖縄県",
    "key": "JP",
    "sub_isoids": "01~02~03~04~05~06~07~08~09~10~11~12~13~14~15~16~17~18~19~20~21~22~23~24~25~26~27~28~29~30~31~32~33~34~35~36~37~38~39~40~41~42~43~44~45~46~47",
    "posturl": "http://search.post.japanpost.jp/zipcode/",
    "fmt": "〒%Z%n%S%C%n%A%n%O%n%N",
    "name": "JAPAN"
  },
  {
    "zipex": "20100,00100",
    "name": "KENYA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "key": "KE",
    "id": "data/KE"
  },
  {
    "zipex": "720001",
    "name": "KYRGYZSTAN",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "KG",
    "id": "data/KG"
  },
  {
    "zipex": "12203,14206,12000",
    "name": "CAMBODIA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "KH",
    "id": "data/KH"
  },
  {
    "upper": "ACNOS",
    "name": "KIRIBATI",
    "fmt": "%N%n%O%n%A%n%S%n%C",
    "state_name_type": "island",
    "key": "KI",
    "id": "data/KI"
  },
  {
    "upper": "AC",
    "id": "data/KM",
    "key": "KM",
    "name": "COMOROS"
  },
  {
    "lang": "en",
    "name": "SAINT KITTS AND NEVIS",
    "require": "ACS",
    "state_name_type": "island",
    "id": "data/KN",
    "languages": "en",
    "sub_keys": "Nevis~St. Kitts",
    "key": "KN",
    "sub_isoids": "N~K",
    "fmt": "%N%n%O%n%A%n%C, %S"
  },
  {
    "lang": "ko",
    "sublocality_name_type": "district",
    "sub_zipexs": "25627~12410~53286~38540~62394~42456~34316~46706~06321~30065~44782~23024~59222~56445~63563~32832~28006",
    "zipex": "03051",
    "sub_zips": "2[456]\\d{2}~1[0-8]\\d{2}~5[0-3]\\d{2}~(?:3[6-9]|40)\\d{2}~6[12]\\d{2}~4[12]\\d{2}~3[45]\\d{2}~4[6-9]\\d{2}~0[1-8]\\d{2}~30[01]\\d~4[45]\\d{2}~2[1-3]\\d{2}~5[7-9]\\d{2}~5[4-6]\\d{2}~63[0-356]\\d~3[1-3]\\d{2}~2[789]\\d{2}",
    "zip": "\\d{5}",
    "upper": "Z",
    "sub_mores": "true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true",
    "require": "ACSZ",
    "state_name_type": "do_si",
    "id": "data/KR",
    "languages": "ko",
    "lfmt": "%N%n%O%n%A%n%D%n%C%n%S%n%Z",
    "sub_lnames": "Gangwon-do~Gyeonggi-do~Gyeongsangnam-do~Gyeongsangbuk-do~Gwangju~Daegu~Daejeon~Busan~Seoul~Sejong~Ulsan~Incheon~Jeollanam-do~Jeollabuk-do~Jeju-do~Chungcheongnam-do~Chungcheongbuk-do",
    "sub_keys": "강원도~경기도~경상남도~경상북도~광주광역시~대구광역시~대전광역시~부산광역시~서울특별시~세종특별자치시~울산광역시~인천광역시~전라남도~전라북도~제주특별자치도~충청남도~충청북도",
    "key": "KR",
    "sub_isoids": "42~41~48~47~29~27~30~26~11~50~31~28~46~45~49~44~43",
    "posturl": "http://www.epost.go.kr/search/zipcode/search5.jsp",
    "fmt": "%S %C%D%n%A%n%O%n%N%n%Z",
    "sub_names": "강원~경기~경남~경북~광주~대구~대전~부산~서울~세종~울산~인천~전남~전북~제주~충남~충북",
    "name": "SOUTH KOREA"
  },
  {
    "zipex": "54541,54551,54404,13009",
    "name": "KUWAIT",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "KW",
    "id": "data/KW"
  },
  {
    "lang": "en",
    "zipex": "KY1-1100,KY1-1702,KY2-2101",
    "posturl": "http://www.caymanpost.gov.ky/",
    "zip": "KY\\d-\\d{4}",
    "require": "AS",
    "state_name_type": "island",
    "id": "data/KY",
    "languages": "en",
    "sub_keys": "Cayman Brac~Grand Cayman~Little Cayman",
    "key": "KY",
    "fmt": "%N%n%O%n%A%n%S %Z",
    "name": "CAYMAN ISLANDS"
  },
  {
    "zipex": "040900,050012",
    "name": "KAZAKHSTAN",
    "zip": "\\d{6}",
    "fmt": "%Z%n%S%n%C%n%A%n%O%n%N",
    "key": "KZ",
    "id": "data/KZ"
  },
  {
    "zipex": "01160,01000",
    "name": "LAO (PEOPLE'S DEM. REP.)",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "LA",
    "id": "data/LA"
  },
  {
    "zipex": "2038 3054,1107 2810,1000",
    "name": "LEBANON",
    "zip": "(?:\\d{4})(?: ?(?:\\d{4}))?",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "LB",
    "id": "data/LB"
  },
  {
    "id": "data/LC",
    "key": "LC",
    "name": "SAINT LUCIA"
  },
  {
    "postprefix": "FL-",
    "zipex": "9496,9491,9490,9485",
    "key": "LI",
    "zip": "948[5-9]|949[0-7]",
    "fmt": "%O%n%N%n%A%nFL-%Z %C",
    "id": "data/LI",
    "posturl": "http://www.post.ch/db/owa/pv_plz_pack/pr_main",
    "require": "ACZ",
    "name": "LIECHTENSTEIN"
  },
  {
    "zipex": "20000,00100",
    "key": "LK",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "posturl": "http://www.slpost.gov.lk/",
    "id": "data/LK",
    "name": "SRI LANKA"
  },
  {
    "zipex": "1000",
    "name": "LIBERIA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "LR",
    "id": "data/LR"
  },
  {
    "zipex": "100",
    "name": "LESOTHO",
    "zip": "\\d{3}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "LS",
    "id": "data/LS"
  },
  {
    "postprefix": "LT-",
    "zipex": "04340,03500",
    "key": "LT",
    "zip": "\\d{5}",
    "fmt": "%O%n%N%n%A%nLT-%Z %C",
    "posturl": "http://www.post.lt/lt/?id=316",
    "id": "data/LT",
    "name": "LITHUANIA"
  },
  {
    "postprefix": "L-",
    "zipex": "4750,2998",
    "key": "LU",
    "zip": "\\d{4}",
    "fmt": "%O%n%N%n%A%nL-%Z %C",
    "id": "data/LU",
    "posturl": "https://www.post.lu/fr/grandes-entreprises/solutions-postales/rechercher-un-code-postal",
    "require": "ACZ",
    "name": "LUXEMBOURG"
  },
  {
    "zipex": "LV-1073,LV-1000",
    "key": "LV",
    "zip": "LV-\\d{4}",
    "fmt": "%N%n%O%n%A%n%C, %Z",
    "posturl": "http://www.pasts.lv/lv/uzzinas/nodalas/",
    "id": "data/LV",
    "name": "LATVIA"
  },
  {
    "id": "data/LY",
    "key": "LY",
    "name": "LIBYA"
  },
  {
    "zipex": "53000,10000,20050,16052",
    "name": "MOROCCO",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "MA",
    "id": "data/MA"
  },
  {
    "postprefix": "MC-",
    "zipex": "98000,98020,98011,98001",
    "name": "MONACO",
    "zip": "980\\d{2}",
    "fmt": "%N%n%O%n%A%nMC-%Z %C %X",
    "key": "MC",
    "id": "data/MC"
  },
  {
    "postprefix": "MD-",
    "zipex": "2012,2019",
    "name": "Rep. MOLDOVA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%nMD-%Z %C",
    "key": "MD",
    "id": "data/MD"
  },
  {
    "zipex": "81257,81258,81217,84314,85366",
    "name": "MONTENEGRO",
    "zip": "8\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "ME",
    "id": "data/ME"
  },
  {
    "upper": "ACX",
    "zipex": "97100",
    "key": "MF",
    "zip": "9[78][01]\\d{2}",
    "require": "ACZ",
    "id": "data/MF",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "SAINT MARTIN"
  },
  {
    "zipex": "501,101",
    "name": "MADAGASCAR",
    "zip": "\\d{3}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "MG",
    "id": "data/MG"
  },
  {
    "upper": "ACNOS",
    "zipex": "96960,96970",
    "key": "MH",
    "zip": "(969[67]\\d)(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/MH",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "MARSHALL ISLANDS"
  },
  {
    "zipex": "1314,1321,1443,1062",
    "name": "MACEDONIA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "MK",
    "id": "data/MK"
  },
  {
    "id": "data/ML",
    "key": "ML",
    "name": "MALI"
  },
  {
    "zipex": "11181",
    "name": "MYANMAR",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C, %Z",
    "key": "MM",
    "id": "data/MM"
  },
  {
    "zipex": "65030,65270",
    "key": "MN",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C%n%S %Z",
    "posturl": "http://www.zipcode.mn/",
    "id": "data/MN",
    "name": "MONGOLIA"
  },
  {
    "name": "MACAO",
    "require": "A",
    "id": "data/MO",
    "lfmt": "%N%n%O%n%A",
    "key": "MO",
    "fmt": "%A%n%O%n%N"
  },
  {
    "upper": "ACNOS",
    "zipex": "96950,96951,96952",
    "key": "MP",
    "zip": "(9695[012])(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/MP",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "NORTHERN MARIANA ISLANDS"
  },
  {
    "upper": "ACX",
    "zipex": "97220",
    "key": "MQ",
    "zip": "9[78]2\\d{2}",
    "require": "ACZ",
    "id": "data/MQ",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "MARTINIQUE"
  },
  {
    "upper": "AC",
    "id": "data/MR",
    "key": "MR",
    "name": "MAURITANIA"
  },
  {
    "id": "data/MS",
    "key": "MS",
    "name": "MONTSERRAT"
  },
  {
    "upper": "CZ",
    "zipex": "NXR 01,ZTN 05,GPO 01,BZN 1130,SPB 6031,VCT 1753",
    "key": "MT",
    "zip": "[A-Z]{3} ?\\d{2,4}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://postcodes.maltapost.com/",
    "id": "data/MT",
    "name": "MALTA"
  },
  {
    "upper": "CZ",
    "zipex": "42602",
    "name": "MAURITIUS",
    "zip": "\\d{3}(?:\\d{2}|[A-Z]{2}\\d{3})",
    "fmt": "%N%n%O%n%A%n%Z%n%C",
    "key": "MU",
    "id": "data/MU"
  },
  {
    "zipex": "20026",
    "key": "MV",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.maldivespost.com/?lid=10",
    "id": "data/MV",
    "name": "MALDIVES"
  },
  {
    "fmt": "%N%n%O%n%A%n%C %X",
    "id": "data/MW",
    "key": "MW",
    "name": "MALAWI"
  },
  {
    "lang": "es",
    "sublocality_name_type": "neighborhood",
    "sub_zipexs": "20000,20999~21000,22999~23000,23999~24000,24999~29000,30999~31000,33999~00000,16999~25000,27999~28000,28999~34000,35999~50000,57999~36000,38999~39000,41999~42000,43999~44000,49999~58000,61999~62000,62999~63000,63999~64000,67999~68000,71999~72000,75999~76000,76999~77000,77999~78000,79999~80000,82999~83000,85999~86000,86999~87000,89999~90000,90999~91000,96999~97000,97999~98000,99999",
    "zipex": "02860,77520,06082",
    "sub_zips": "20~2[12]~23~24~29|30~3[1-3]~0|1[0-6]~2[5-7]~28~3[45]~5[0-7]~3[6-8]~39|4[01]~4[23]~4[4-9]~5[89]|6[01]~62~63~6[4-7]~6[89]|7[01]~7[2-5]~76~77~7[89]~8[0-2]~8[3-5]~86~8[7-9]~90~9[1-6]~97~9[89]",
    "zip": "\\d{5}",
    "upper": "CSZ",
    "require": "ACZ",
    "state_name_type": "state",
    "id": "data/MX",
    "languages": "es",
    "sub_keys": "AGS~BC~BCS~CAMP~CHIS~CHIH~CDMX~COAH~COL~DGO~MEX~GTO~GRO~HGO~JAL~MICH~MOR~NAY~NL~OAX~PUE~QRO~QROO~SLP~SIN~SON~TAB~TAMPS~TLAX~VER~YUC~ZAC",
    "key": "MX",
    "sub_isoids": "AGU~BCN~BCS~CAM~CHP~CHH~DIF~COA~COL~DUR~MEX~GUA~GRO~HID~JAL~MIC~MOR~NAY~NLE~OAX~PUE~QUE~ROO~SLP~SIN~SON~TAB~TAM~TLA~VER~YUC~ZAC",
    "posturl": "http://www.correosdemexico.gob.mx/ServiciosLinea/Paginas/ccpostales.aspx",
    "fmt": "%N%n%O%n%A%n%D%n%Z %C, %S",
    "sub_names": "Aguascalientes~Baja California~Baja California Sur~Campeche~Chiapas~Chihuahua~Ciudad de México~Coahuila~Colima~Durango~Estado de México~Guanajuato~Guerrero~Hidalgo~Jalisco~Michoacán~Morelos~Nayarit~Nuevo León~Oaxaca~Puebla~Querétaro~Quintana Roo~San Luís Potosí~Sinalóa~Sonora~Tabasco~Tamaulipas~Tlaxcala~Veracruz~Yucatán~Zacatecas",
    "name": "MEXICO"
  },
  {
    "lang": "ms",
    "sublocality_name_type": "village_township",
    "sub_zipexs": "79000,86999~05000,09999,34950~15000,18599~50000,60000~87000,87999~75000,78399~70000,73599~25000,28999,39000,49000,69000~30000,36899,39000~01000,02799~10000,14999~62000,62999~88000,91999~93000,98999~40000,48999,63000,68199~20000,24999",
    "zipex": "43000,50754,88990,50670",
    "sub_zips": "79|8[0-6]~0[5-9]|34950~1[5-9]~5|60~87~7[5-8]~7[0-4]~2[5-8]|[346]9~3[0-6]|39000~0[12]~1[0-4]~62~8[89]|9[01]~9[3-8]~4[0-8]|6[3-8]~2[0-4]",
    "zip": "\\d{5}",
    "upper": "CS",
    "require": "ACZ",
    "state_name_type": "state",
    "id": "data/MY",
    "languages": "ms",
    "sub_keys": "Johor~Kedah~Kelantan~Kuala Lumpur~Labuan~Melaka~Negeri Sembilan~Pahang~Perak~Perlis~Pulau Pinang~Putrajaya~Sabah~Sarawak~Selangor~Terengganu",
    "key": "MY",
    "sub_isoids": "01~02~03~14~15~04~05~06~08~09~07~16~12~13~10~11",
    "posturl": "http://www.pos.com.my",
    "fmt": "%N%n%O%n%A%n%D%n%Z %C%n%S",
    "name": "MALAYSIA"
  },
  {
    "zipex": "1102,1119,3212",
    "name": "MOZAMBIQUE",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "MZ",
    "id": "data/MZ"
  },
  {
    "id": "data/NA",
    "key": "NA",
    "name": "NAMIBIA"
  },
  {
    "upper": "ACX",
    "zipex": "98814,98800,98810",
    "key": "NC",
    "zip": "988\\d{2}",
    "require": "ACZ",
    "id": "data/NC",
    "posturl": "http://poste.opt.nc/index.php?option=com_content&view=article&id=80&Itemid=131",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "NEW CALEDONIA"
  },
  {
    "zipex": "8001",
    "name": "NIGER",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "NE",
    "id": "data/NE"
  },
  {
    "upper": "CS",
    "zipex": "2899",
    "name": "NORFOLK ISLAND",
    "zip": "2899",
    "fmt": "%O%n%N%n%A%n%C %S %Z",
    "key": "NF",
    "id": "data/NF"
  },
  {
    "lang": "en",
    "upper": "CS",
    "zipex": "930283,300001,931104",
    "posturl": "http://www.nigeriapostcodes.com/",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%C %Z%n%S",
    "state_name_type": "state",
    "languages": "en",
    "sub_keys": "Abia~Adamawa~Akwa Ibom~Anambra~Bauchi~Bayelsa~Benue~Borno~Cross River~Delta~Ebonyi~Edo~Ekiti~Enugu~Federal Capital Territory~Gombe~Imo~Jigawa~Kaduna~Kano~Katsina~Kebbi~Kogi~Kwara~Lagos~Nasarawa~Niger~Ogun State~Ondo~Osun~Oyo~Plateau~Rivers~Sokoto~Taraba~Yobe~Zamfara",
    "key": "NG",
    "sub_isoids": "AB~AD~AK~AN~BA~BY~BE~BO~CR~DE~EB~ED~EK~EN~FC~GO~IM~JI~KD~KN~KT~KE~KO~KW~LA~NA~NI~OG~ON~OS~OY~PL~RI~SO~TA~YO~ZA",
    "id": "data/NG",
    "name": "NIGERIA"
  },
  {
    "lang": "es",
    "upper": "CS",
    "zipex": "52000",
    "sub_zips": "5[12]~4[56]~2[5-7]~5[56]~3[12]~4[34]~6[56]~2[12]~3[45]~1[0-6]~4[12]~6[1-3]~3[7-9]~7[12]~8[1-3]~9[12]~4[78]",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z%n%C, %S",
    "state_name_type": "department",
    "languages": "es",
    "sub_keys": "Boaco~Carazo~Chinandega~Chontales~Esteli~Granada~Jinotega~Leon~Madriz~Managua~Masaya~Matagalpa~Nueva Segovia~Raan~Raas~Rio San Juan~Rivas",
    "key": "NI",
    "sub_isoids": "BO~CA~CI~CO~ES~GR~JI~LE~MD~MN~MS~MT~NS~AN~AS~SJ~RI",
    "posturl": "http://www.correos.gob.ni/index.php/codigo-postal-2",
    "id": "data/NI",
    "name": "NICARAGUA"
  },
  {
    "zipex": "1234 AB,2490 AA",
    "key": "NL",
    "zip": "\\d{4} ?[A-Z]{2}",
    "fmt": "%O%n%N%n%A%n%Z %C",
    "id": "data/NL",
    "posturl": "http://www.postnl.nl/voorthuis/",
    "require": "ACZ",
    "name": "NETHERLANDS"
  },
  {
    "zipex": "0025,0107,6631",
    "key": "NO",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/NO",
    "posturl": "http://adressesok.posten.no/nb/postal_codes/search",
    "locality_name_type": "post_town",
    "require": "ACZ",
    "name": "NORWAY"
  },
  {
    "zipex": "44601",
    "key": "NP",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.gpo.gov.np/postalcode.aspx",
    "id": "data/NP",
    "name": "NEPAL"
  },
  {
    "lang": "en",
    "name": "NAURU CENTRAL PACIFIC",
    "require": "AS",
    "state_name_type": "district",
    "id": "data/NR",
    "languages": "en",
    "sub_keys": "Aiwo District~Anabar District~Anetan District~Anibare District~Baiti District~Boe District~Buada District~Denigomodu District~Ewa District~Ijuw District~Meneng District~Nibok District~Uaboe District~Yaren District",
    "key": "NR",
    "sub_isoids": "01~02~03~04~05~06~07~08~09~10~11~12~13~14",
    "fmt": "%N%n%O%n%A%n%S"
  },
  {
    "id": "data/NU",
    "key": "NU",
    "name": "NIUE"
  },
  {
    "zipex": "6001,6015,6332,8252,1030",
    "key": "NZ",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%D%n%C %Z",
    "id": "data/NZ",
    "posturl": "http://www.nzpost.co.nz/Cultures/en-NZ/OnlineTools/PostCodeFinder/",
    "require": "ACZ",
    "name": "NEW ZEALAND"
  },
  {
    "zipex": "133,112,111",
    "name": "OMAN",
    "zip": "(?:PC )?\\d{3}",
    "fmt": "%N%n%O%n%A%n%Z%n%C",
    "key": "OM",
    "id": "data/OM"
  },
  {
    "upper": "CS",
    "fmt": "%N%n%O%n%A%n%C%n%S",
    "id": "data/PA",
    "key": "PA",
    "name": "PANAMA (REP.)"
  },
  {
    "zipex": "LIMA 23,LIMA 42,CALLAO 2,02001",
    "key": "PE",
    "zip": "(?:LIMA \\d{1,2}|CALLAO 0?\\d)|[0-2]\\d{4}",
    "fmt": "%N%n%O%n%A%n%C %Z%n%S",
    "posturl": "http://www.serpost.com.pe/cpostal/codigo",
    "id": "data/PE",
    "name": "PERU"
  },
  {
    "upper": "CS",
    "zipex": "98709",
    "name": "FRENCH POLYNESIA",
    "zip": "987\\d{2}",
    "require": "ACSZ",
    "state_name_type": "island",
    "id": "data/PF",
    "key": "PF",
    "fmt": "%N%n%O%n%A%n%Z %C %S"
  },
  {
    "zipex": "111",
    "name": "PAPUA NEW GUINEA",
    "zip": "\\d{3}",
    "require": "ACS",
    "id": "data/PG",
    "key": "PG",
    "fmt": "%N%n%O%n%A%n%C %Z %S"
  },
  {
    "lang": "en",
    "sub_zipexs": "2800,2826~8600,8611~8500,8513~5600,5616~4500,4517~5700,5717~3800,3806,3808~3200,3207~7300,7306~2100,2114~3900,3905~4200,4234~2600,2615~6543,6550~6300,6337~8700,8723~3000,3024~3500,3528~4600,4612~4400,4436~9100,9104~5800,5816~4800,4810~4100,4126~6000,6053~8800,8810~9400,9417~8100,8120~8000,8015~~8200,8210~~6800,6822~5044,5046~3600,3610~2900,2922~2700,2733~5000,5043~3300,3336~3807,3809,3814~2500,2520~4000,4033~9200,9223~9300,9321,9700,9716~6500,6542~9600,9619~4900,4905~5400,5421~~5100,5111~5200,5214~7200,7215~9000,9025~2616,2625~6100,6132~6200,6224~6400,6423~3100,3133~3700,3714~5300,5322~2000,2022~2400,2447~4300,4342~3400,3405~1850,1990~5500,5516~6700,6725~8015~6225,6230~4700,4715~9500,9513~~9800,9811~7400,7416~8400,8427~8300,8319~2300,2318~7500,7509~2200,2213~7100,7124~7000,7043~7000,7043",
    "zipex": "1008,1050,1135,1207,2000,1000",
    "sub_zips": "28[0-2]~86[01]~85[01]~56[01]~45[01]~57[01]~380[0-68]~320~730~21[01]~390~42[0-3]~26(0|1[0-5])~65(4[3-9]|5)~63[0-3]~87[0-2]~30[0-2]~35[0-2]~46[01]~44[0-3]~910~58[01]~48[01]~41[0-2]~60[0-5]~88[01]~94[01]~81[0-2]~80[01]~~82[01]~~68[0-2]~504[4-6]~36[01]~29[0-2]~27[0-3]~50([0-3]|4[0-3])~33[0-3]~38(0[79]|1[0-4])~25[0-2]~40[0-3]~92[0-2]~9(3[0-2]|7[01])~65([0-3]|4[0-2])~96[01]~490~54[0-2]~~51[01]~52[01]~72[01]~90[0-2]~26(1[6-9]|2[0-5])~61[0-3]~62[0-2]~64[0-2]~31[0-3]~37[01]~53[0-2]~20[0-2]~24[0-4]~43[0-4]~340~1[89]~55[01]~67[0-2]~8015~62(2[5-9]|30)~47[01]~95[01]~~98[01]~74[01]~84[02]~83[01]~23[01]~750~22[01]~71[0-2]~70[0-4]~70[0-4]",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%D, %C%n%Z %S",
    "languages": "en",
    "sub_keys": "Abra~Agusan del Norte~Agusan del Sur~Aklan~Albay~Antique~Apayao~Aurora~Basilan~Bataan~Batanes~Batangas~Benguet~Biliran~Bohol~Bukidnon~Bulacan~Cagayan~Camarines Norte~Camarines Sur~Camiguin~Capiz~Catanduanes~Cavite~Cebu~Compostela Valley~Cotabato~Davao del Norte~Davao del Sur~Davao Occidental~Davao Oriental~Dinagat Islands~Eastern Samar~Guimaras~Ifugao~Ilocos Norte~Ilocos Sur~Iloilo~Isabela~Kalinga~La Union~Laguna~Lanao del Norte~Lanao del Sur~Leyte~Maguindanao~Marinduque~Masbate~Metro Manila~Mindoro Occidental~Mindoro Oriental~Misamis Occidental~Misamis Oriental~Mountain Province~Negros Occidental~Negros Oriental~Northern Samar~Nueva Ecija~Nueva Vizcaya~Palawan~Pampanga~Pangasinan~Quezon Province~Quirino~Rizal~Romblon~Samar~Sarangani~Siquijor~Sorsogon~South Cotabato~Southern Leyte~Sultan Kudarat~Sulu~Surigao del Norte~Surigao del Sur~Tarlac~Tawi-Tawi~Zambales~Zamboanga del Norte~Zamboanga del Sur~Zamboanga Sibuguey",
    "key": "PH",
    "sub_isoids": "ABR~AGN~AGS~AKL~ALB~ANT~APA~AUR~BAS~BAN~BTN~BTG~BEN~BIL~BOH~BUK~BUL~CAG~CAN~CAS~CAM~CAP~CAT~CAV~CEB~COM~NCO~DAV~DAS~~DAO~DIN~EAS~GUI~IFU~ILN~ILS~ILI~ISA~KAL~LUN~LAG~LAN~LAS~LEY~MAG~MAD~MAS~00~MDC~MDR~MSC~MSR~MOU~NEC~NER~NSA~NUE~NUV~PLW~PAM~PAN~QUE~QUI~RIZ~ROM~WSA~SAR~SIG~SOR~SCO~SLE~SUK~SLU~SUN~SUR~TAR~TAW~ZMB~ZAN~ZAS~ZSI",
    "posturl": "http://www.philpost.gov.ph/",
    "id": "data/PH",
    "name": "PHILIPPINES"
  },
  {
    "zipex": "44000",
    "key": "PK",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C-%Z",
    "posturl": "http://www.pakpost.gov.pk/postcode/postcode.html",
    "id": "data/PK",
    "name": "PAKISTAN"
  },
  {
    "zipex": "00-950,05-470,48-300,32-015,00-940",
    "key": "PL",
    "zip": "\\d{2}-\\d{3}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/PL",
    "posturl": "http://kody.poczta-polska.pl/",
    "require": "ACZ",
    "name": "POLAND"
  },
  {
    "upper": "ACX",
    "zipex": "97500",
    "name": "ST. PIERRE AND MIQUELON",
    "zip": "9[78]5\\d{2}",
    "require": "ACZ",
    "id": "data/PM",
    "key": "PM",
    "fmt": "%O%n%N%n%A%n%Z %C %X"
  },
  {
    "upper": "CZ",
    "zipex": "PCRN 1ZZ",
    "name": "PITCAIRN",
    "zip": "PCRN 1ZZ",
    "require": "ACZ",
    "id": "data/PN",
    "key": "PN",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "postprefix": "PR",
    "upper": "ACNO",
    "zipex": "00930",
    "key": "PR",
    "zip": "(00[679]\\d{2})(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACZ",
    "id": "data/PR",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C PR %Z",
    "name": "PUERTO RICO"
  },
  {
    "id": "data/PS",
    "key": "PS",
    "name": "PALESTINIAN TERRITORY"
  },
  {
    "zipex": "2725-079,1250-096,1201-950,2860-571,1208-148",
    "key": "PT",
    "zip": "\\d{4}-\\d{3}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/PT",
    "posturl": "http://www.ctt.pt/feapl_2/app/open/tools.jspx?tool=1",
    "require": "ACZ",
    "name": "PORTUGAL"
  },
  {
    "upper": "ACNOS",
    "zipex": "96940",
    "key": "PW",
    "zip": "(969(?:39|40))(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/PW",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "PALAU"
  },
  {
    "zipex": "1536,1538,1209",
    "name": "PARAGUAY",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "PY",
    "id": "data/PY"
  },
  {
    "upper": "AC",
    "id": "data/QA",
    "key": "QA",
    "name": "QATAR"
  },
  {
    "upper": "ACX",
    "zipex": "97400",
    "key": "RE",
    "zip": "9[78]4\\d{2}",
    "require": "ACZ",
    "id": "data/RE",
    "posturl": "http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal",
    "fmt": "%O%n%N%n%A%n%Z %C %X",
    "name": "REUNION"
  },
  {
    "upper": "AC",
    "zipex": "060274,061357,200716",
    "key": "RO",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.posta-romana.ro/zip_codes",
    "id": "data/RO",
    "name": "ROMANIA"
  },
  {
    "zipex": "106314",
    "key": "RS",
    "zip": "\\d{5,6}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.posta.rs/struktura/lat/aplikacije/pronadji/nadji-postu.asp",
    "id": "data/RS",
    "name": "REPUBLIC OF SERBIA"
  },
  {
    "lang": "ru",
    "upper": "AC",
    "zipex": "247112,103375,188300",
    "sub_zips": "65[6-9]~67[56]~16[3-5]~41[4-6]~30[89]~24[1-3]~60[0-2]~40[0-4]~16[0-2]~39[4-7]~679~6(?:7[2-4]|87)~15[3-5]~66[4-9]~36[01]~23[6-8]~24[89]~68[348]~369~65[0-4]~61[0-3]~15[67]~35[0-4]~6(?:6[0-3]|4[78])~64[01]~30[5-7]~18[78]~39[89]~68[56]~1(?:0[1-9]|1|2|3[0-5]|4[0-4])~14[0-4]~18[34]~166~60[3-7]~17[3-5]~63[0-3]~64[4-6]~46[0-2]~30[23]~44[0-2]~61[4-9]~69[0-2]~18[0-2]~385~649~45[0-3]~67[01]~36[78]~386~35[89]~18[56]~16[7-9]~29[5-8]~42[45]~43[01]~67[78]~36[23]~42[0-3]~66[78]~42[67]~655~34[4-7]~39[01]~44[3-6]~19~41[0-3]~69[34]~62[0-4]~299~21[4-6]~35[5-7]~39[23]~17[0-2]~63[4-6]~30[01]~62[5-7]~43[23]~68[0-2]~628~45[4-7]~36[4-6]~42[89]~689~629~15[0-2]",
    "zip": "\\d{6}",
    "require": "ACSZ",
    "state_name_type": "oblast",
    "id": "data/RU",
    "languages": "ru",
    "lfmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "sub_lnames": "Altayskiy kray~Amurskaya oblast'~Arkhangelskaya oblast'~Astrakhanskaya oblast'~Belgorodskaya oblast'~Bryanskaya oblast'~Vladimirskaya oblast'~Volgogradskaya oblast'~Vologodskaya oblast'~Voronezhskaya oblast'~Evreyskaya avtonomnaya oblast'~Zabaykalskiy kray~Ivanovskaya oblast'~Irkutskaya oblast'~Kabardino-Balkarskaya Republits~Kaliningradskaya oblast'~Kaluzhskaya oblast'~Kamchatskiy kray~Karachaevo-Cherkesskaya Republits~Kemerovskaya oblast'~Kirovskaya oblast'~Kostromskaya oblast'~Krasnodarskiy kray~Krasnoyarskiy kray~Kurganskaya oblast'~Kurskaya oblast'~Leningradskaya oblast'~Lipetskaya oblast'~Magadanskaya oblast'~gorod Moskva~Moskovskaya oblast'~Murmanskaya oblast'~Nenetskiy~Nizhegorodskaya oblast'~Novgorodskaya oblast'~Novosibirskaya oblast'~Omskaya oblast'~Orenburgskaya oblast'~Orlovskaya oblast'~Penzenskaya oblast'~Permskiy kray~Primorskiy kray~Pskovskaya oblast'~Respublika Adygeya~Altay Republits~Bashkortostan Republits~Buryatiya Republits~Dagestan Republits~Ingushetiya Republits~Respublika Kalmykiya~Kareliya Republits~Komi Republits~Respublika Krym~Respublika Mariy El~Respublika Mordoviya~Sakha (Yakutiya) Republits~Respublika Severnaya Osetiya-Alaniya~Respublika Tatarstan~Tyva Republits~Respublika Udmurtiya~Khakasiya Republits~Rostovskaya oblast'~Ryazanskaya oblast'~Samarskaya oblast'~gorod Sankt-Peterburg~Saratovskaya oblast'~Sakhalinskaya oblast'~Sverdlovskaya oblast'~gorod Sevastopol'~Smolenskaya oblast'~Stavropolskiy kray~Tambovskaya oblast'~Tverskaya oblast'~Tomskaya oblast'~Tulskaya oblast'~Tyumenskaya oblast'~Ulyanovskaya oblast'~Khabarovskiy kray~Khanty-Mansiyskiy avtonomnyy okrug~Chelyabinskaya oblast'~Chechenskaya Republits~Chuvashia~Chukotskiy~Yamalo-Nenetskiy~Yaroslavskaya oblast'",
    "sub_keys": "Алтайский край~Амурская область~Архангельская область~Астраханская область~Белгородская область~Брянская область~Владимирская область~Волгоградская область~Вологодская область~Воронежская область~Еврейская автономная область~Забайкальский край~Ивановская область~Иркутская область~Кабардино-Балкарская Республика~Калининградская область~Калужская область~Камчатский край~Карачаево-Черкесская Республика~Кемеровская область~Кировская область~Костромская область~Краснодарский край~Красноярский край~Курганская область~Курская область~Ленинградская область~Липецкая область~Магаданская область~город Москва~Московская область~Мурманская область~Ненецкий автономный округ~Нижегородская область~Новгородская область~Новосибирская область~Омская область~Оренбургская область~Орловская область~Пензенская область~Пермский край~Приморский край~Псковская область~Республика Адыгея~Республика Алтай~Республика Башкортостан~Республика Бурятия~Республика Дагестан~Республика Ингушетия~Республика Калмыкия~Республика Карелия~Республика Коми~Автономна Республіка Крим~Республика Марий Эл~Республика Мордовия~Республика Саха (Якутия)~Республика Северная Осетия-Алания~Республика Татарстан~Республика Тыва~Республика Удмуртия~Республика Хакасия~Ростовская область~Рязанская область~Самарская область~город Санкт-Петербург~Саратовская область~Сахалинская область~Свердловская область~город Севастополь~Смоленская область~Ставропольский край~Тамбовская область~Тверская область~Томская область~Тульская область~Тюменская область~Ульяновская область~Хабаровский край~Ханты-Мансийский автономный округ~Челябинская область~Чеченская Республика~Чувашская Республика~Чукотский автономный округ~Ямало-Ненецкий автономный округ~Ярославская область",
    "key": "RU",
    "sub_isoids": "ALT~AMU~ARK~AST~BEL~BRY~VLA~VGG~VLG~VOR~YEV~ZAB~IVA~IRK~KB~KGD~KLU~KAM~KC~KEM~KIR~KOS~KDA~KYA~KGN~KRS~LEN~LIP~MAG~MOW~MOS~MUR~NEN~NIZ~NGR~NVS~OMS~ORE~ORL~PNZ~PER~PRI~PSK~AD~AL~BA~BU~DA~IN~KL~KR~KO~~ME~MO~SA~SE~TA~TY~UD~KK~ROS~RYA~SAM~SPE~SAR~SAK~SVE~~SMO~STA~TAM~TVE~TOM~TUL~TYU~ULY~KHA~KHM~CHE~CE~CU~CHU~YAN~YAR",
    "posturl": "http://info.russianpost.ru/servlet/department",
    "fmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "sub_names": "Алтайский край~Амурская область~Архангельская область~Астраханская область~Белгородская область~Брянская область~Владимирская область~Волгоградская область~Вологодская область~Воронежская область~Еврейская автономная область~Забайкальский край~Ивановская область~Иркутская область~Кабардино-Балкарская Республика~Калининградская область~Калужская область~Камчатский край~Карачаево-Черкесская Республика~Кемеровская область~Кировская область~Костромская область~Краснодарский край~Красноярский край~Курганская область~Курская область~Ленинградская область~Липецкая область~Магаданская область~Москва~Московская область~Мурманская область~Ненецкий автономный округ~Нижегородская область~Новгородская область~Новосибирская область~Омская область~Оренбургская область~Орловская область~Пензенская область~Пермский край~Приморский край~Псковская область~Республика Адыгея~Республика Алтай~Республика Башкортостан~Республика Бурятия~Республика Дагестан~Республика Ингушетия~Республика Калмыкия~Республика Карелия~Республика Коми~Республика Крым~Республика Марий Эл~Республика Мордовия~Республика Саха (Якутия)~Республика Северная Осетия-Алания~Республика Татарстан~Республика Тыва~Республика Удмуртия~Республика Хакасия~Ростовская область~Рязанская область~Самарская область~Санкт-Петербург~Саратовская область~Сахалинская область~Свердловская область~Севастополь~Смоленская область~Ставропольский край~Тамбовская область~Тверская область~Томская область~Тульская область~Тюменская область~Ульяновская область~Хабаровский край~Ханты-Мансийский автономный округ~Челябинская область~Чеченская Республика~Чувашская Республика~Чукотский автономный округ~Ямало-Ненецкий автономный округ~Ярославская область",
    "name": "RUSSIAN FEDERATION"
  },
  {
    "upper": "AC",
    "id": "data/RW",
    "key": "RW",
    "name": "RWANDA"
  },
  {
    "zipex": "11564,11187,11142",
    "name": "SAUDI ARABIA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "key": "SA",
    "id": "data/SA"
  },
  {
    "id": "data/SB",
    "key": "SB",
    "name": "SOLOMON ISLANDS"
  },
  {
    "upper": "S",
    "name": "SEYCHELLES",
    "fmt": "%N%n%O%n%A%n%C%n%S",
    "state_name_type": "island",
    "key": "SC",
    "id": "data/SC"
  },
  {
    "postprefix": "SE-",
    "zipex": "11455,12345,10500",
    "key": "SE",
    "zip": "\\d{3} ?\\d{2}",
    "require": "ACZ",
    "id": "data/SE",
    "posturl": "http://www.posten.se/sv/Kundservice/Sidor/Sok-postnummer-resultat.aspx",
    "locality_name_type": "post_town",
    "fmt": "%O%n%N%n%A%nSE-%Z %C",
    "name": "SWEDEN"
  },
  {
    "zipex": "546080,308125,408600",
    "key": "SG",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%nSINGAPORE %Z",
    "id": "data/SG",
    "posturl": "https://www.singpost.com/find-postal-code",
    "require": "AZ",
    "name": "REP. OF SINGAPORE"
  },
  {
    "upper": "CZ",
    "zipex": "STHL 1ZZ",
    "name": "SAINT HELENA",
    "zip": "(?:ASCN|STHL) 1ZZ",
    "require": "ACZ",
    "id": "data/SH",
    "key": "SH",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "postprefix": "SI-",
    "zipex": "4000,1001,2500",
    "name": "SLOVENIA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%nSI- %Z %C",
    "key": "SI",
    "id": "data/SI"
  },
  {
    "zipex": "9170",
    "key": "SJ",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/SJ",
    "posturl": "http://epab.posten.no/",
    "locality_name_type": "post_town",
    "require": "ACZ",
    "name": "SVALBARD AND JAN MAYEN ISLANDS"
  },
  {
    "zipex": "010 01,023 14,972 48,921 01,975 99",
    "key": "SK",
    "zip": "\\d{3} ?\\d{2}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://psc.posta.sk",
    "id": "data/SK",
    "name": "SLOVAKIA"
  },
  {
    "id": "data/SL",
    "key": "SL",
    "name": "SIERRA LEONE"
  },
  {
    "zipex": "47890,47891,47895,47899",
    "key": "SM",
    "zip": "4789\\d",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "id": "data/SM",
    "posturl": "http://www.poste.it/online/cercacap/",
    "require": "AZ",
    "name": "SAN MARINO"
  },
  {
    "zipex": "12500,46024,16556,10000",
    "name": "SENEGAL",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "SN",
    "id": "data/SN"
  },
  {
    "lang": "so",
    "upper": "ACS",
    "zipex": "JH 09010,AD 11010",
    "name": "SOMALIA",
    "zip": "[A-Z]{2} ?\\d{5}",
    "require": "ACS",
    "id": "data/SO",
    "languages": "so",
    "sub_keys": "AD~BK~BN~BR~BY~GG~GD~HR~JD~JH~MD~NG~SG~SD~SH~SL~TG~WG",
    "key": "SO",
    "sub_isoids": "AW~BK~BN~BR~BY~GA~GE~HI~JD~JH~MU~NU~SA~SD~SH~SO~TO~WO",
    "fmt": "%N%n%O%n%A%n%C, %S %Z",
    "sub_names": "Awdal~Bakool~Banaadir~Bari~Bay~Galguduud~Gedo~Hiiraan~Jubbada Dhexe~Jubbada Hoose~Mudug~Nugaal~Sanaag~Shabeellaha Dhexe~Shabeellaha Hoose~Sool~Togdheer~Woqooyi Galbeed"
  },
  {
    "lang": "nl",
    "upper": "AS",
    "name": "SURINAME",
    "fmt": "%N%n%O%n%A%n%C%n%S",
    "languages": "nl",
    "sub_keys": "Brokopondo~Commewijne~Coronie~Marowijne~Nickerie~Para~Paramaribo~Saramacca~Sipaliwini~Wanica",
    "key": "SR",
    "sub_isoids": "BR~CM~CR~MA~NI~PR~PM~SA~SI~WA",
    "id": "data/SR"
  },
  {
    "id": "data/SS",
    "key": "SS",
    "name": "SOUTH SUDAN"
  },
  {
    "id": "data/ST",
    "key": "ST",
    "name": "SAO TOME AND PRINCIPE"
  },
  {
    "lang": "es",
    "upper": "CSZ",
    "sub_zipexs": "CP 2101~CP 1201~CP 1301~CP 1401~CP 1501~CP 1601~CP 3101~CP 3201~CP 3301~CP 1101~CP 1701~CP 2201~CP 2301~CP 3401",
    "zipex": "CP 1101",
    "sub_zips": "CP 21~CP 12~CP 13~CP 14~CP 15~CP 16~CP 31~CP 32~CP 33~CP 11~CP 17~CP 22~CP 23~CP 34",
    "zip": "CP [1-3][1-7][0-2]\\d",
    "require": "ACS",
    "id": "data/SV",
    "languages": "es",
    "sub_keys": "Ahuachapan~Cabanas~Calatenango~Cuscatlan~La Libertad~La Paz~La Union~Morazan~San Miguel~San Salvador~San Vicente~Santa Ana~Sonsonate~Usulutan",
    "key": "SV",
    "sub_isoids": "AH~CA~CH~CU~LI~PA~UN~MO~SM~SS~SV~SA~SO~US",
    "fmt": "%N%n%O%n%A%n%Z-%C%n%S",
    "sub_names": "Ahuachapán~Cabañas~Chalatenango~Cuscatlán~La Libertad~La Paz~La Unión~Morazán~San Miguel~San Salvador~San Vicente~Santa Ana~Sonsonate~Usulután",
    "name": "EL SALVADOR"
  },
  {
    "id": "data/SX",
    "key": "SX",
    "name": "SINT MAARTEN"
  },
  {
    "upper": "ACZ",
    "zipex": "H100",
    "key": "SZ",
    "zip": "[HLMS]\\d{3}",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "posturl": "http://www.sptc.co.sz/swazipost/codes/index.php",
    "id": "data/SZ",
    "name": "SWAZILAND"
  },
  {
    "zipex": "TDCU 1ZZ",
    "name": "TRISTAN DA CUNHA",
    "zip": "TDCU 1ZZ",
    "fmt": "%N%n%O%n%A%n%C%n%Z",
    "key": "TA",
    "id": "data/TA"
  },
  {
    "upper": "CZ",
    "zipex": "TKCA 1ZZ",
    "name": "TURKS AND CAICOS ISLANDS",
    "zip": "TKCA 1ZZ",
    "require": "ACZ",
    "id": "data/TC",
    "key": "TC",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "id": "data/TD",
    "key": "TD",
    "name": "CHAD"
  },
  {
    "id": "data/TF",
    "key": "TF",
    "name": "FRENCH SOUTHERN TERRITORIES"
  },
  {
    "id": "data/TG",
    "key": "TG",
    "name": "TOGO"
  },
  {
    "lang": "th",
    "upper": "S",
    "zipex": "10150,10210",
    "sub_zips": "81~10~71~46~62~40~~22~24~20~17~36~86~57~50~92~23~63~26~73~48~30~80~60~11~96~55~31~12~77~25~94~13~56~82~93~66~65~76~67~54~83~44~49~58~35~95~45~85~21~70~15~52~51~42~33~47~90~91~10~75~74~27~18~16~64~72~84~32~43~39~14~37~41~53~61~34",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%D %C%n%S %Z",
    "languages": "th",
    "lfmt": "%N%n%O%n%A%n%D, %C%n%S %Z",
    "sub_lnames": "Krabi~Bangkok~Kanchanaburi~Kalasin~Kamphaeng Phet~Khon Kaen~Bueng Kan~Chanthaburi~Chachoengsao~Chon Buri~Chai Nat~Chaiyaphum~Chumpon~Chiang Rai~Chiang Mai~Trang~Trat~Tak~Nakhon Nayok~Nakhon Pathom~Nakhon Phanom~Nakhon Ratchasima~Nakhon Si Thammarat~Nakhon Sawan~Nonthaburi~Narathiwat~Nan~Buri Ram~Pathum Thani~Prachuap Khiri Khan~Prachin Buri~Pattani~Phra Nakhon Si Ayutthaya~Phayao~Phang Nga~Phattalung~Phichit~Phitsanulok~Phetchaburi~Phetchabun~Phrae~Phuket~Maha Sarakham~Mukdahan~Mae Hong Son~Yasothon~Yala~Roi Et~Ranong~Rayong~Ratchaburi~Lop Buri~Lampang~Lamphun~Loei~Si Sa Ket~Sakon Nakhon~Songkhla~Satun~Samut Prakan~Samut Songkhram~Samut Sakhon~Sa Kaeo~Saraburi~Sing Buri~Sukhothai~Suphanburi~Surat Thani~Surin~Nong Khai~Nong Bua Lam Phu~Ang Thong~Amnat Charoen~Udon Thani~Uttaradit~Uthai Thani~Ubon Ratchathani",
    "sub_keys": "กระบี่~กรุงเทพมหานคร~กาญจนบุรี~กาฬสินธุ์~กำแพงเพชร~ขอนแก่น~จังหวัด บึงกาฬ~จันทบุรี~ฉะเชิงเทรา~ชลบุรี~ชัยนาท~ชัยภูมิ~ชุมพร~เชียงราย~เชียงใหม่~ตรัง~ตราด~ตาก~นครนายก~นครปฐม~นครพนม~นครราชสีมา~นครศรีธรรมราช~นครสวรรค์~นนทบุรี~นราธิวาส~น่าน~บุรีรัมย์~ปทุมธานี~ประจวบคีรีขันธ์~ปราจีนบุรี~ปัตตานี~พระนครศรีอยุธยา~พะเยา~พังงา~พัทลุง~พิจิตร~พิษณุโลก~เพชรบุรี~เพชรบูรณ์~แพร่~ภูเก็ต~มหาสารคาม~มุกดาหาร~แม่ฮ่องสอน~ยโสธร~ยะลา~ร้อยเอ็ด~ระนอง~ระยอง~ราชบุรี~ลพบุรี~ลำปาง~ลำพูน~เลย~ศรีสะเกษ~สกลนคร~สงขลา~สตูล~สมุทรปราการ~สมุทรสงคราม~สมุทรสาคร~สระแก้ว~สระบุรี~สิงห์บุรี~สุโขทัย~สุพรรณบุรี~สุราษฎร์ธานี~สุรินทร์~หนองคาย~หนองบัวลำภู~อ่างทอง~อำนาจเจริญ~อุดรธานี~อุตรดิตถ์~อุทัยธานี~อุบลราชธานี",
    "key": "TH",
    "sub_isoids": "81~10~71~46~62~40~38~22~24~20~18~36~86~57~50~92~23~63~26~73~48~30~80~60~12~96~55~31~13~77~25~94~14~56~82~93~66~65~76~67~54~83~44~49~58~35~95~45~85~21~70~16~52~51~42~33~47~90~91~11~75~74~27~19~17~64~72~84~32~43~39~15~37~41~53~61~34",
    "id": "data/TH",
    "name": "THAILAND"
  },
  {
    "zipex": "735450,734025",
    "name": "TAJIKISTAN",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "TJ",
    "id": "data/TJ"
  },
  {
    "id": "data/TK",
    "key": "TK",
    "name": "TOKELAU"
  },
  {
    "id": "data/TL",
    "key": "TL",
    "name": "TIMOR-LESTE"
  },
  {
    "zipex": "744000",
    "name": "TURKMENISTAN",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "TM",
    "id": "data/TM"
  },
  {
    "zipex": "1002,8129,3100,1030",
    "key": "TN",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "posturl": "http://www.poste.tn/codes.php",
    "id": "data/TN",
    "name": "TUNISIA"
  },
  {
    "id": "data/TO",
    "key": "TO",
    "name": "TONGA"
  },
  {
    "lang": "tr",
    "zipex": "01960,06101",
    "posturl": "http://postakodu.ptt.gov.tr/",
    "zip": "\\d{5}",
    "require": "ACZ",
    "id": "data/TR",
    "languages": "tr",
    "locality_name_type": "district",
    "sub_keys": "Adana~Adıyaman~Afyon~Ağrı~Aksaray~Amasya~Ankara~Antalya~Ardahan~Artvin~Aydın~Balıkesir~Bartın~Batman~Bayburt~Bilecik~Bingöl~Bitlis~Bolu~Burdur~Bursa~Çanakkale~Çankırı~Çorum~Denizli~Diyarbakır~Düzce~Edirne~Elazığ~Erzincan~Erzurum~Eskişehir~Gaziantep~Giresun~Gümüşhane~Hakkari~Hatay~Iğdır~Isparta~İstanbul~İzmir~Kahramanmaraş~Karabük~Karaman~Kars~Kastamonu~Kayseri~Kırıkkale~Kırklareli~Kırşehir~Kilis~Kocaeli~Konya~Kütahya~Malatya~Manisa~Mardin~Mersin~Muğla~Muş~Nevşehir~Niğde~Ordu~Osmaniye~Rize~Sakarya~Samsun~Siirt~Sinop~Sivas~Şanlıurfa~Şırnak~Tekirdağ~Tokat~Trabzon~Tunceli~Uşak~Van~Yalova~Yozgat~Zonguldak",
    "key": "TR",
    "sub_isoids": "01~02~03~04~68~05~06~07~75~08~09~10~74~72~69~11~12~13~14~15~16~17~18~19~20~21~81~22~23~24~25~26~27~28~29~30~31~76~32~34~35~46~78~70~36~37~38~71~39~40~79~41~42~43~44~45~47~33~48~49~50~51~52~80~53~54~55~56~57~58~63~73~59~60~61~62~64~65~77~66~67",
    "fmt": "%N%n%O%n%A%n%Z %C/%S",
    "name": "TURKEY"
  },
  {
    "id": "data/TT",
    "key": "TT",
    "name": "TRINIDAD AND TOBAGO"
  },
  {
    "lang": "tyv",
    "upper": "ACS",
    "name": "TUVALU",
    "fmt": "%N%n%O%n%A%n%C%n%S",
    "state_name_type": "island",
    "languages": "tyv",
    "sub_keys": "Funafuti~Nanumanga~Nanumea~Niulakita~Niutao~Nui~Nukufetau~Nukulaelae~Vaitupu",
    "key": "TV",
    "sub_isoids": "FUN~NMG~NMA~~NIT~NUI~NKF~NKL~VAI",
    "id": "data/TV"
  },
  {
    "lang": "zh-Hant",
    "sub_zipexs": "400,408,411,439~100,119~950,966~700,745~260,272~970,983~890,896~540,558~900,947~350,369~320,338~800,815,817,852~200,206~209,212~630,655~207,208,220,253~~302,315~~602,625~500,530~880,885",
    "zipex": "104,106,10603,40867",
    "sub_zips": "4[0-3]~1[01]~9[56]~7[0-4]~2[67]~9[78]~89~5[45]~9[0-4]~3[56]~3[23]~8[02-5]|81[1-579]~20[0-6]~209|21[012]~6[3-5]~20[78]|2[2345]~300~30[2-8]|31~600~60[1-9]|6[12]~5[0123]~88",
    "zip": "\\d{3}(?:\\d{2})?",
    "sub_mores": "true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true",
    "require": "ACSZ",
    "state_name_type": "county",
    "id": "data/TW",
    "languages": "zh-Hant",
    "lfmt": "%N%n%O%n%A%n%C, %S %Z",
    "sub_lnames": "Taichung City~Taipei City~Taitung County~Tainan City~Yilan County~Hualien County~Kinmen County~Nantou County~Pingtung County~Miaoli County~Taoyuan City~Kaohsiung City~Keelung City~Lienchiang County~Yunlin County~New Taipei City~Hsinchu City~Hsinchu County~Chiayi City~Chiayi County~Changhua County~Penghu County",
    "sub_keys": "台中市~台北市~台東縣~台南市~宜蘭縣~花蓮縣~金門縣~南投縣~屏東縣~苗栗縣~桃園市~高雄市~基隆市~連江縣~雲林縣~新北市~新竹市~新竹縣~嘉義市~嘉義縣~彰化縣~澎湖縣",
    "key": "TW",
    "sub_isoids": "TXG~TPE~TTT~TNN~ILA~HUA~~NAN~PIF~MIA~TAO~KHH~KEE~~YUN~NWT~HSZ~HSQ~CYI~CYQ~CHA~PEN",
    "posturl": "http://www.post.gov.tw/post/internet/f_searchzone/index.jsp?ID=190102",
    "fmt": "%Z%n%S%C%n%A%n%O%n%N",
    "name": "TAIWAN"
  },
  {
    "zipex": "6090,34413",
    "name": "TANZANIA (UNITED REP.)",
    "zip": "\\d{4,5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "TZ",
    "id": "data/TZ"
  },
  {
    "lang": "uk",
    "zipex": "15432,01055,01001",
    "sub_zips": "9[5-8]~2[1-4]~4[3-5]~49|5[0-3]~8[3-7]~1[0-3]~8[89]|90~69|7[0-2]~7[6-8]~0[1-6]~0[7-9]~2[5-8]~9[1-4]~79|8[0-2]~5[4-7]~6[5-8]~3[6-9]~3[3-5]~99~4[0-2]~4[6-8]~6[1-4]~7[3-5]~29|3[0-2]~1[89]|20~5[89]|60~1[4-7]",
    "zip": "\\d{5}",
    "require": "ACSZ",
    "state_name_type": "oblast",
    "id": "data/UA",
    "languages": "uk",
    "lfmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "sub_lnames": "Crimea~Vinnyts'ka oblast~Volyns'ka oblast~Dnipropetrovsk oblast~Donetsk oblast~Zhytomyrs'ka oblast~Zakarpats'ka oblast~Zaporiz'ka oblast~Ivano-Frankivs'ka oblast~Kyiv city~Kiev oblast~Kirovohrads'ka oblast~Luhans'ka oblast~Lviv oblast~Mykolaivs'ka oblast~Odessa oblast~Poltavs'ka oblast~Rivnens'ka oblast~Sevastopol' city~Sums'ka oblast~Ternopil's'ka oblast~Kharkiv oblast~Khersons'ka oblast~Khmel'nyts'ka oblast~Cherkas'ka oblast~Chernivets'ka oblast~Chernihivs'ka oblast",
    "sub_keys": "Автономна Республіка Крим~Вінницька область~Волинська область~Дніпропетровська область~Донецька область~Житомирська область~Закарпатська область~Запорізька область~Івано-Франківська область~місто Київ~Київська область~Кіровоградська область~Луганська область~Львівська область~Миколаївська область~Одеська область~Полтавська область~Рівненська область~місто Севастополь~Сумська область~Тернопільська область~Харківська область~Херсонська область~Хмельницька область~Черкаська область~Чернівецька область~Чернігівська область",
    "key": "UA",
    "posturl": "http://services.ukrposhta.com/postindex_new/",
    "fmt": "%N%n%O%n%A%n%C%n%S%n%Z",
    "sub_names": "Автономна Республіка Крим~Вінницька область~Волинська область~Дніпропетровська область~Донецька область~Житомирська область~Закарпатська область~Запорізька область~Івано-Франківська область~Київ~Київська область~Кіровоградська область~Луганська область~Львівська область~Миколаївська область~Одеська область~Полтавська область~Рівненська область~Севастополь~Сумська область~Тернопільська область~Харківська область~Херсонська область~Хмельницька область~Черкаська область~Чернівецька область~Чернігівська область",
    "name": "UKRAINE"
  },
  {
    "id": "data/UG",
    "key": "UG",
    "name": "UGANDA"
  },
  {
    "upper": "ACNOS",
    "zipex": "96898",
    "key": "UM",
    "zip": "96898",
    "zip_name_type": "zip",
    "require": "ACS",
    "state_name_type": "state",
    "id": "data/UM",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "UNITED STATES MINOR OUTLYING ISLANDS"
  },
  {
    "lang": "en",
    "upper": "CS",
    "sub_zipexs": "35000,36999~99500,99999~96799~85000,86999~71600,72999~34000,34099~09000,09999~96200,96699~90000,96199~80000,81999~06000,06999~19700,19999~20000,56999~32000,34999~30000,39901~96910,96932~96700,96899~83200,83999~60000,62999~46000,47999~50000,52999~66000,67999~40000,42799~70000,71599~03900,04999~96960,96979~20600,21999~01000,05544~48000,49999~96941,96944~55000,56799~38600,39799~63000,65999~59000,59999~68000,69999~88900,89999~03000,03899~07000,08999~87000,88499~10000,00544~27000,28999~58000,58999~96950,96952~43000,45999~73000,74999~97000,97999~96940~15000,19699~00600,00999~02800,02999~29000,29999~57000,57999~37000,38599~75000,73344~84000,84999~05000,05999~00800,00899~20100,24699~98000,99499~24700,26999~53000,54999~82000,83414",
    "zipex": "95014,22162-1010",
    "sub_zips": "3[56]~99[5-9]~96799~8[56]~71[6-9]|72~340~09~96[2-6]~9[0-5]|96[01]~8[01]~06~19[7-9]~20[02-5]|569~3[23]|34[1-9]~3[01]|398|39901~969([1-2]\\d|3[12])~967[0-8]|9679[0-8]|968~83[2-9]~6[0-2]~4[67]~5[0-2]~6[67]~4[01]|42[0-7]~70|71[0-5]~039|04~969[67]~20[6-9]|21~01|02[0-7]|05501|05544~4[89]~9694[1-4]~55|56[0-7]~38[6-9]|39[0-7]~6[3-5]~59~6[89]~889|89~03[0-8]~0[78]~87|88[0-4]~1[0-4]|06390|00501|00544~2[78]~58~9695[0-2]~4[3-5]~7[34]~97~969(39|40)~1[5-8]|19[0-6]~00[679]~02[89]~29~57~37|38[0-5]~7[5-9]|885|73301|73344~84~05~008~201|2[23]|24[0-6]~98|99[0-4]~24[7-9]|2[56]~5[34]~82|83[01]|83414",
    "zip": "(\\d{5})(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/US",
    "languages": "en",
    "sub_keys": "AL~AK~AS~AZ~AR~AA~AE~AP~CA~CO~CT~DE~DC~FL~GA~GU~HI~ID~IL~IN~IA~KS~KY~LA~ME~MH~MD~MA~MI~FM~MN~MS~MO~MT~NE~NV~NH~NJ~NM~NY~NC~ND~MP~OH~OK~OR~PW~PA~PR~RI~SC~SD~TN~TX~UT~VT~VI~VA~WA~WV~WI~WY",
    "key": "US",
    "posturl": "https://tools.usps.com/go/ZipLookupAction!input.action",
    "fmt": "%N%n%O%n%A%n%C, %S %Z",
    "sub_names": "Alabama~Alaska~American Samoa~Arizona~Arkansas~Armed Forces (AA)~Armed Forces (AE)~Armed Forces (AP)~California~Colorado~Connecticut~Delaware~District of Columbia~Florida~Georgia~Guam~Hawaii~Idaho~Illinois~Indiana~Iowa~Kansas~Kentucky~Louisiana~Maine~Marshall Islands~Maryland~Massachusetts~Michigan~Micronesia~Minnesota~Mississippi~Missouri~Montana~Nebraska~Nevada~New Hampshire~New Jersey~New Mexico~New York~North Carolina~North Dakota~Northern Mariana Islands~Ohio~Oklahoma~Oregon~Palau~Pennsylvania~Puerto Rico~Rhode Island~South Carolina~South Dakota~Tennessee~Texas~Utah~Vermont~Virgin Islands~Virginia~Washington~West Virginia~Wisconsin~Wyoming",
    "name": "UNITED STATES"
  },
  {
    "lang": "es",
    "upper": "CS",
    "zipex": "11600",
    "sub_zips": "55~9[01]|1[456]~37~70|75204~97~85~94|9060|97005~30~20~1|91600~60~65|60002~40~27~50~80~75|70003~45~33|30203|30204|30302|37007",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C %S",
    "languages": "es",
    "sub_keys": "Artigas~Canelones~Cerro Largo~Colonia~Durazno~Flores~Florida~Lavalleja~Maldonado~Montevideo~Paysandú~Río Negro~Rivera~Rocha~Salto~San José~Soriano~Tacuarembó~Treinta y Tres",
    "key": "UY",
    "sub_isoids": "AR~CA~CL~CO~DU~FS~FD~LA~MA~MO~PA~RN~RV~RO~SA~SJ~SO~TA~TT",
    "posturl": "http://www.correo.com.uy/index.asp?codPag=codPost&switchMapa=codPost",
    "id": "data/UY",
    "name": "URUGUAY"
  },
  {
    "upper": "CS",
    "zipex": "702100,700000",
    "key": "UZ",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%Z %C%n%S",
    "posturl": "http://www.pochta.uz/ru/uslugi/indexsearch.html",
    "id": "data/UZ",
    "name": "UZBEKISTAN"
  },
  {
    "zipex": "00120",
    "name": "VATICAN",
    "zip": "00120",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "VA",
    "id": "data/VA"
  },
  {
    "zipex": "VC0100,VC0110,VC0400",
    "key": "VC",
    "zip": "VC\\d{4}",
    "fmt": "%N%n%O%n%A%n%C %Z",
    "posturl": "http://www.svgpost.gov.vc/?option=com_content&view=article&id=3&Itemid=16",
    "id": "data/VC",
    "name": "SAINT VINCENT AND THE GRENADINES (ANTILLES)"
  },
  {
    "lang": "es",
    "upper": "CS",
    "zipex": "1010,3001,8011,1020",
    "posturl": "http://www.ipostel.gob.ve/index.php/oficinas-postales",
    "zip": "\\d{4}",
    "require": "ACS",
    "state_name_type": "state",
    "id": "data/VE",
    "languages": "es",
    "sub_keys": "Amazonas~Anzoátegui~Apure~Aragua~Barinas~Bolívar~Carabobo~Cojedes~Delta Amacuro~Dependencias Federales~Distrito Federal~Falcón~Guárico~Lara~Mérida~Miranda~Monagas~Nueva Esparta~Portuguesa~Sucre~Táchira~Trujillo~Vargas~Yaracuy~Zulia",
    "key": "VE",
    "sub_isoids": "Z~B~C~D~E~F~G~H~Y~W~A~I~J~K~L~M~N~O~P~R~S~T~X~U~V",
    "fmt": "%N%n%O%n%A%n%C %Z, %S",
    "name": "VENEZUELA"
  },
  {
    "zipex": "VG1110,VG1150,VG1160",
    "name": "VIRGIN ISLANDS (BRITISH)",
    "zip": "VG\\d{4}",
    "require": "A",
    "id": "data/VG",
    "key": "VG",
    "fmt": "%N%n%O%n%A%n%C%n%Z"
  },
  {
    "upper": "ACNOS",
    "zipex": "00802-1222,00850-9802",
    "key": "VI",
    "zip": "(008(?:(?:[0-4]\\d)|(?:5[01])))(?:[ \\-](\\d{4}))?",
    "zip_name_type": "zip",
    "require": "ACSZ",
    "state_name_type": "state",
    "id": "data/VI",
    "posturl": "http://zip4.usps.com/zip4/welcome.jsp",
    "fmt": "%N%n%O%n%A%n%C %S %Z",
    "name": "VIRGIN ISLANDS (U.S.)"
  },
  {
    "lang": "vi",
    "zipex": "119415,136065,720344",
    "posturl": "http://postcode.vnpost.vn/services/search.aspx",
    "zip": "\\d{6}",
    "fmt": "%N%n%O%n%A%n%C%n%S %Z",
    "languages": "vi",
    "lfmt": "%N%n%O%n%A%n%C%n%S %Z",
    "sub_lnames": "An Giang Province~Ba Ria-Vung Tau Province~Bac Lieu Province~Bac Giang Province~Bac Kan Province~Bac Ninh Province~Ben Tre Province~Binh Duong Province~Binh Dinh Province~Binh Phuoc Province~Binh Thuan Province~Ca Mau Province~Cao Bang Province~Can Tho City~Da Nang City~Dak Lak Province~Dak Nong Province~Dien Bien Province~Dong Nai Province~Dong Thap Province~Gia Lai Province~Ha Giang Province~Ha Nam Province~Hanoi City~Ha Tinh Province~Hai Duong Province~Haiphong City~Hau Giang Province~Hoa Binh Province~Hung Yen Province~Khanh Hoa Province~Kien Giang Province~Kon Tum Province~Lai Chau Province~Lang Song Province~Lao Cai Province~Lam Dong Province~Long An Province~Nam Dinh Province~Nghe An Province~Nanh Binh Province~Ninh Thuan Province~Phu Tho Province~Phu Yen Province~Quang Binh Province~Quang Nam Province~Quang Ngai Province~Quang Ninh Province~Quang Tri Province~Soc Trang Province~Son La Province~Tay Ninh Province~Thai Binh Province~Thai Nguyen Province~Thanh Hoa Province~Ho Chi Minh City~Thua Thien-Hue Province~Tien Giang Province~Tra Vinh Province~Tuyen Quang Province~Vinh Long Province~Vinh Phuc Province~Yen Bai Province",
    "sub_keys": "An Giang~Bà Rịa–Vũng Tàu~Bạc Liêu~Bắc Giang~Bắc Kạn~Bắc Ninh~Bến Tre~Bình Dương~Bình Định~Bình Phước~Bình Thuận~Cà Mau~Cao Bằng~Cần Thơ~Đà Nẵng~Đắk Lắk~Đăk Nông~Điện Biên~Đồng Nai~Đồng Tháp~Gia Lai~Hà Giang~Hà Nam~Hà Nội~Hà Tĩnh~Hải Dương~Hải Phòng~Hậu Giang~Hòa Bình~Hưng Yên~Khánh Hòa~Kiên Giang~Kon Tum~Lai Châu~Lạng Sơn~Lào Cai~Lâm Đồng~Long An~Nam Định~Nghệ An~Ninh Bình~Ninh Thuận~Phú Thọ~Phú Yên~Quảng Bình~Quảng Nam~Quảng Ngãi~Quảng Ninh~Quảng Trị~Sóc Trăng~Sơn La~Tây Ninh~Thái Bình~Thái Nguyên~Thanh Hóa~Thành phố Hồ Chí Minh~Thừa Thiên–Huế~Tiền Giang~Trà Vinh~Tuyên Quang~Vĩnh Long~Vĩnh Phúc~Yên Bái",
    "key": "VN",
    "sub_isoids": "44~43~55~54~53~56~50~57~31~58~40~59~04~CT~DN~33~72~71~39~45~30~03~63~HN~23~61~HP~73~14~66~34~47~28~01~09~02~35~41~67~22~18~36~68~32~24~27~29~13~25~52~05~37~20~69~21~SG~26~46~51~07~49~70~06",
    "id": "data/VN",
    "name": "VIET NAM"
  },
  {
    "id": "data/VU",
    "key": "VU",
    "name": "VANUATU"
  },
  {
    "upper": "ACX",
    "zipex": "98600",
    "name": "WALLIS AND FUTUNA ISLANDS",
    "zip": "986\\d{2}",
    "require": "ACZ",
    "id": "data/WF",
    "key": "WF",
    "fmt": "%O%n%N%n%A%n%Z %C %X"
  },
  {
    "id": "data/WS",
    "key": "WS",
    "name": "SAMOA"
  },
  {
    "zipex": "10000",
    "name": "KOSOVO",
    "zip": "[1-7]\\d{4}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "XK",
    "id": "data/XK"
  },
  {
    "id": "data/YE",
    "key": "YE",
    "name": "YEMEN"
  },
  {
    "upper": "ACX",
    "zipex": "97600",
    "name": "MAYOTTE",
    "zip": "976\\d{2}",
    "require": "ACZ",
    "id": "data/YT",
    "key": "YT",
    "fmt": "%O%n%N%n%A%n%Z %C %X"
  },
  {
    "zipex": "0083,1451,0001",
    "key": "ZA",
    "zip": "\\d{4}",
    "fmt": "%N%n%O%n%A%n%D%n%C%n%Z",
    "id": "data/ZA",
    "posturl": "https://www.postoffice.co.za/contactus/postalcode.html",
    "require": "ACZ",
    "name": "SOUTH AFRICA"
  },
  {
    "zipex": "50100,50101",
    "name": "ZAMBIA",
    "zip": "\\d{5}",
    "fmt": "%N%n%O%n%A%n%Z %C",
    "key": "ZM",
    "id": "data/ZM"
  },
  {
    "id": "data/ZW",
    "key": "ZW",
    "name": "ZIMBABWE"
  }
]


================================================
FILE: Scripts/Regions.swift
================================================
import Foundation

print(Locale.isoRegionCodes.joined(separator: "\n"))


================================================
FILE: Sources/PostalCodeValidator/PostalCodeValidator.swift
================================================
// This file was automatically generated and should not be edited.
import Foundation

/// A validator for postal codes.
public final class PostalCodeValidator {
    /**
     * A set of available region codes.
     *
     * Each element of the returned set is an two-letter
     * ISO 3166-2 region code
     * (for example, "US" for the United States of America).
    */
    public class var isoRegionCodes: Set<String> {
        return Set(patternsByRegion.keys)
    }

    private static let patternsByRegion: [String: String] = [
        "AC": #"ASCN 1ZZ"#,
        "AD": #"AD[1-7]0\d"#,
        "AE": #"AD[1-7]0\d"#,
        "AF": #"\d{4}"#,
        "AG": #"\d{4}"#,
        "AI": #"(?:AI-)?2640"#,
        "AL": #"\d{4}"#,
        "AM": #"(?:37)?\d{4}"#,
        "AO": #"(?:37)?\d{4}"#,
        "AQ": #"(?:37)?\d{4}"#,
        "AR": #"((?:[A-HJ-NP-Z])?\d{4})([A-Z]{3})?"#,
        "AS": #"(96799)(?:[ \-](\d{4}))?"#,
        "AT": #"\d{4}"#,
        "AU": #"\d{4}"#,
        "AW": #"\d{4}"#,
        "AX": #"22\d{3}"#,
        "AZ": #"\d{4}"#,
        "BA": #"\d{5}"#,
        "BB": #"BB\d{5}"#,
        "BD": #"\d{4}"#,
        "BE": #"\d{4}"#,
        "BF": #"\d{4}"#,
        "BG": #"\d{4}"#,
        "BH": #"(?:\d|1[0-2])\d{2}"#,
        "BI": #"(?:\d|1[0-2])\d{2}"#,
        "BJ": #"(?:\d|1[0-2])\d{2}"#,
        "BL": #"9[78][01]\d{2}"#,
        "BM": #"[A-Z]{2} ?[A-Z0-9]{2}"#,
        "BN": #"[A-Z]{2} ?\d{4}"#,
        "BO": #"[A-Z]{2} ?\d{4}"#,
        "BQ": #"[A-Z]{2} ?\d{4}"#,
        "BR": #"\d{5}-?\d{3}"#,
        "BS": #"\d{5}-?\d{3}"#,
        "BT": #"\d{5}"#,
        "BV": #"\d{5}"#,
        "BW": #"\d{5}"#,
        "BY": #"\d{6}"#,
        "BZ": #"\d{6}"#,
        "CA": #"[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z] ?\d[ABCEGHJ-NPRSTV-Z]\d"#,
        "CC": #"6799"#,
        "CD": #"6799"#,
        "CF": #"6799"#,
        "CG": #"6799"#,
        "CH": #"\d{4}"#,
        "CI": #"\d{4}"#,
        "CK": #"\d{4}"#,
        "CL": #"\d{7}"#,
        "CM": #"\d{7}"#,
        "CN": #"\d{6}"#,
        "CO": #"\d{6}"#,
        "CR": #"\d{4,5}|\d{3}-\d{4}"#,
        "CV": #"\d{4}"#,
        "CW": #"\d{4}"#,
        "CX": #"6798"#,
        "CY": #"\d{4}"#,
        "CZ": #"\d{3} ?\d{2}"#,
        "DE": #"\d{5}"#,
        "DJ": #"\d{5}"#,
        "DK": #"\d{4}"#,
        "DM": #"\d{4}"#,
        "DO": #"\d{5}"#,
        "DZ": #"\d{5}"#,
        "EC": #"\d{6}"#,
        "EE": #"\d{5}"#,
        "EG": #"\d{5}"#,
        "EH": #"\d{5}"#,
        "ER": #"\d{5}"#,
        "ES": #"\d{5}"#,
        "ET": #"\d{4}"#,
        "FI": #"\d{5}"#,
        "FJ": #"\d{5}"#,
        "FK": #"FIQQ 1ZZ"#,
        "FM": #"(9694[1-4])(?:[ \-](\d{4}))?"#,
        "FO": #"\d{3}"#,
        "FR": #"\d{2} ?\d{3}"#,
        "GA": #"\d{2} ?\d{3}"#,
        "GB": #"GIR ?0AA|(?:(?:AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}))|BFPO ?\d{1,4}"#,
        "GD": #"GIR ?0AA|(?:(?:AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}))|BFPO ?\d{1,4}"#,
        "GE": #"\d{4}"#,
        "GF": #"9[78]3\d{2}"#,
        "GG": #"GY\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}"#,
        "GH": #"GY\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}"#,
        "GI": #"GX11 1AA"#,
        "GL": #"39\d{2}"#,
        "GM": #"39\d{2}"#,
        "GN": #"\d{3}"#,
        "GP": #"9[78][01]\d{2}"#,
        "GQ": #"9[78][01]\d{2}"#,
        "GR": #"\d{3} ?\d{2}"#,
        "GS": #"SIQQ 1ZZ"#,
        "GT": #"\d{5}"#,
        "GU": #"(969(?:[12]\d|3[12]))(?:[ \-](\d{4}))?"#,
        "GW": #"\d{4}"#,
        "GY": #"\d{4}"#,
        "HK": #"\d{4}"#,
        "HM": #"\d{4}"#,
        "HN": #"\d{5}"#,
        "HR": #"\d{5}"#,
        "HT": #"\d{4}"#,
        "HU": #"\d{4}"#,
        "ID": #"\d{5}"#,
        "IE": #"[\dA-Z]{3} ?[\dA-Z]{4}"#,
        "IL": #"\d{5}(?:\d{2})?"#,
        "IM": #"IM\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}"#,
        "IN": #"\d{6}"#,
        "IO": #"BBND 1ZZ"#,
        "IQ": #"\d{5}"#,
        "IR": #"\d{5}-?\d{5}"#,
        "IS": #"\d{3}"#,
        "IT": #"\d{5}"#,
        "JE": #"JE\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}"#,
        "JM": #"JE\d[\dA-Z]? ?\d[ABD-HJLN-UW-Z]{2}"#,
        "JO": #"\d{5}"#,
        "JP": #"\d{3}-?\d{4}"#,
        "KE": #"\d{5}"#,
        "KG": #"\d{6}"#,
        "KH": #"\d{5}"#,
        "KI": #"\d{5}"#,
        "KM": #"\d{5}"#,
        "KN": #"\d{5}"#,
        "KR": #"\d{5}"#,
        "KW": #"\d{5}"#,
        "KY": #"KY\d-\d{4}"#,
        "KZ": #"\d{6}"#,
        "LA": #"\d{5}"#,
        "LB": #"(?:\d{4})(?: ?(?:\d{4}))?"#,
        "LC": #"(?:\d{4})(?: ?(?:\d{4}))?"#,
        "LI": #"948[5-9]|949[0-7]"#,
        "LK": #"\d{5}"#,
        "LR": #"\d{4}"#,
        "LS": #"\d{3}"#,
        "LT": #"\d{5}"#,
        "LU": #"\d{4}"#,
        "LV": #"LV-\d{4}"#,
        "LY": #"LV-\d{4}"#,
        "MA": #"\d{5}"#,
        "MC": #"980\d{2}"#,
        "MD": #"\d{4}"#,
        "ME": #"8\d{4}"#,
        "MF": #"9[78][01]\d{2}"#,
        "MG": #"\d{3}"#,
        "MH": #"(969[67]\d)(?:[ \-](\d{4}))?"#,
        "MK": #"\d{4}"#,
        "ML": #"\d{4}"#,
        "MM": #"\d{5}"#,
        "MN": #"\d{5}"#,
        "MO": #"\d{5}"#,
        "MP": #"(9695[012])(?:[ \-](\d{4}))?"#,
        "MQ": #"9[78]2\d{2}"#,
        "MR": #"9[78]2\d{2}"#,
        "MS": #"9[78]2\d{2}"#,
        "MT": #"[A-Z]{3} ?\d{2,4}"#,
        "MU": #"\d{3}(?:\d{2}|[A-Z]{2}\d{3})"#,
        "MV": #"\d{5}"#,
        "MW": #"\d{5}"#,
        "MX": #"\d{5}"#,
        "MY": #"\d{5}"#,
        "MZ": #"\d{4}"#,
        "NA": #"\d{4}"#,
        "NC": #"988\d{2}"#,
        "NE": #"\d{4}"#,
        "NF": #"2899"#,
        "NG": #"\d{6}"#,
        "NI": #"\d{5}"#,
        "NL": #"\d{4} ?[A-Z]{2}"#,
        "NO": #"\d{4}"#,
        "NP": #"\d{5}"#,
        "NR": #"\d{5}"#,
        "NU": #"\d{5}"#,
        "NZ": #"\d{4}"#,
        "OM": #"(?:PC )?\d{3}"#,
        "PA": #"(?:PC )?\d{3}"#,
        "PE": #"(?:LIMA \d{1,2}|CALLAO 0?\d)|[0-2]\d{4}"#,
        "PF": #"987\d{2}"#,
        "PG": #"\d{3}"#,
        "PH": #"\d{4}"#,
        "PK": #"\d{5}"#,
        "PL": #"\d{2}-\d{3}"#,
        "PM": #"9[78]5\d{2}"#,
        "PN": #"PCRN 1ZZ"#,
        "PR": #"(00[679]\d{2})(?:[ \-](\d{4}))?"#,
        "PS": #"(00[679]\d{2})(?:[ \-](\d{4}))?"#,
        "PT": #"\d{4}-\d{3}"#,
        "PW": #"(969(?:39|40))(?:[ \-](\d{4}))?"#,
        "PY": #"\d{4}"#,
        "QA": #"\d{4}"#,
        "RE": #"9[78]4\d{2}"#,
        "RO": #"\d{6}"#,
        "RS": #"\d{5,6}"#,
        "RU": #"\d{6}"#,
        "RW": #"\d{6}"#,
        "SA": #"\d{5}"#,
        "SB": #"\d{5}"#,
        "SC": #"\d{5}"#,
        "SE": #"\d{3} ?\d{2}"#,
        "SG": #"\d{6}"#,
        "SH": #"(?:ASCN|STHL) 1ZZ"#,
        "SI": #"\d{4}"#,
        "SJ": #"\d{4}"#,
        "SK": #"\d{3} ?\d{2}"#,
        "SL": #"\d{3} ?\d{2}"#,
        "SM": #"4789\d"#,
        "SN": #"\d{5}"#,
        "SO": #"[A-Z]{2} ?\d{5}"#,
        "SR": #"[A-Z]{2} ?\d{5}"#,
        "SS": #"[A-Z]{2} ?\d{5}"#,
        "ST": #"[A-Z]{2} ?\d{5}"#,
        "SV": #"CP [1-3][1-7][0-2]\d"#,
        "SX": #"CP [1-3][1-7][0-2]\d"#,
        "SZ": #"[HLMS]\d{3}"#,
        "TA": #"TDCU 1ZZ"#,
        "TC": #"TKCA 1ZZ"#,
        "TD": #"TKCA 1ZZ"#,
        "TF": #"TKCA 1ZZ"#,
        "TG": #"TKCA 1ZZ"#,
        "TH": #"\d{5}"#,
        "TJ": #"\d{6}"#,
        "TK": #"\d{6}"#,
        "TL": #"\d{6}"#,
        "TM": #"\d{6}"#,
        "TN": #"\d{4}"#,
        "TO": #"\d{4}"#,
        "TR": #"\d{5}"#,
        "TT": #"\d{5}"#,
        "TV": #"\d{5}"#,
        "TW": #"\d{3}(?:\d{2})?"#,
        "TZ": #"\d{4,5}"#,
        "UA": #"\d{5}"#,
        "UG": #"\d{5}"#,
        "UM": #"96898"#,
        "US": #"(\d{5})(?:[ \-](\d{4}))?"#,
        "UY": #"\d{5}"#,
        "UZ": #"\d{6}"#,
        "VA": #"00120"#,
        "VC": #"VC\d{4}"#,
        "VE": #"\d{4}"#,
        "VG": #"VG\d{4}"#,
        "VI": #"(008(?:(?:[0-4]\d)|(?:5[01])))(?:[ \-](\d{4}))?"#,
        "VN": #"\d{6}"#,
        "VU": #"\d{6}"#,
        "WF": #"986\d{2}"#,
        "WS": #"986\d{2}"#,
        "XK": #"[1-7]\d{4}"#,
        "YE": #"[1-7]\d{4}"#,
        "YT": #"976\d{2}"#,
        "ZA": #"\d{4}"#,
        "ZM": #"\d{5}"#,
        "ZW": #"\d{5}"#,
    ]

    /**
     *  The two-letter ISO 3166-2 region code
     *  (for example, "US" for the United States of America).
     */
    var regionCode: String

    private var regularExpression: NSRegularExpression

    /**
     * Creates a postal code validator for the specified region.
     *
     * Returns `nil` if the region isn't supported.
     *
     * - Parameters:
     *   - region: A two-letter ISO 3166-2 region code
     *             (for example, "US" for the United States of America).
     */
    public init?(regionCode: String) {
        guard let pattern = PostalCodeValidator.patternsByRegion[regionCode],
            let regex = try? NSRegularExpression(pattern: #"\A\#(pattern)\Z"#, options: [])
        else { return nil }

        self.regionCode = regionCode
        self.regularExpression = regex
    }

    /**
     * Creates a postal code validator for the region of the specified locale.
     *
     * Returns `nil` if the locale doesn't have a valid region,
     * or the region isn't supported.
     *
     * - Parameters:
     *   - locale: The locale whose `regionCode` property is used to determine
     *             the appropriate postal code validation rules.
     */
    public convenience init?(locale: Locale) {
        guard let regionCode = locale.regionCode else { return nil }

        self.init(regionCode: regionCode)
    }

    /**
     * Returns whether a postal code is valid for the configured region.
     *
     * - Parameters:
     *   - postalCode: The postal code.
     * - Returns: `true` if valid, otherwise `false`.
     */
    public func validate(postalCode: String) -> Bool {
        return regularExpression.rangeOfFirstMatch(in: postalCode, options: [], range: NSRange(postalCode.startIndex..<postalCode.endIndex, in: postalCode)).location != NSNotFound
    }
}


================================================
FILE: Sources/PostalCodeValidator/PostalCodeValidator.swift.gyb
================================================
% warning = "This file was automatically generated and should not be edited."
// ${warning}
import Foundation

%{
# encoding=utf8
import os
import sys
import json
reload(sys)
sys.setdefaultencoding('utf8')
}%
% with open(os.getcwd() + "/../../Resources/postalData.json") as file:
    %{ data = json.load(file) }%
/// A validator for postal codes.
public final class PostalCodeValidator {
    /**
     * A set of available region codes.
     *
     * Each element of the returned set is an two-letter
     * ISO 3166-2 region code
     * (for example, "US" for the United States of America).
    */
    public class var isoRegionCodes: Set<String> {
        return Set(patternsByRegion.keys)
    }

    private static let patternsByRegion: [String: String] = [
    % for region in data:
        % if region:
            %{
               try:
                  code = region['key']
                  pattern = region['zip']
               except KeyError:
                  pass }%
        "${code}": #"${pattern}"#,
        % end
    % end
% end
    ]

    /**
     *  The two-letter ISO 3166-2 region code
     *  (for example, "US" for the United States of America).
     */
    var regionCode: String

    private var regularExpression: NSRegularExpression

    /**
     * Creates a postal code validator for the specified region.
     *
     * Returns `nil` if the region isn't supported.
     *
     * - Parameters:
     *   - region: A two-letter ISO 3166-2 region code
     *             (for example, "US" for the United States of America).
     */
    public init?(regionCode: String) {
        guard let pattern = PostalCodeValidator.patternsByRegion[regionCode],
            let regex = try? NSRegularExpression(pattern: #"\A\#(pattern)\Z"#, options: [])
        else { return nil }

        self.regionCode = regionCode
        self.regularExpression = regex
    }

    /**
     * Creates a postal code validator for the region of the specified locale.
     *
     * Returns `nil` if the locale doesn't have a valid region,
     * or the region isn't supported.
     *
     * - Parameters:
     *   - locale: The locale whose `regionCode` property is used to determine
     *             the appropriate postal code validation rules.
     */
    public convenience init?(locale: Locale) {
        guard let regionCode = locale.regionCode else { return nil }

        self.init(regionCode: regionCode)
    }

    /**
     * Returns whether a postal code is valid for the configured region.
     *
     * - Parameters:
     *   - postalCode: The postal code.
     * - Returns: `true` if valid, otherwise `false`.
     */
    public func validate(postalCode: String) -> Bool {
        return regularExpression.rangeOfFirstMatch(in: postalCode, options: [], range: NSRange(postalCode.startIndex..<postalCode.endIndex, in: postalCode)).location != NSNotFound
    }
}


================================================
FILE: Tests/LinuxMain.swift
================================================
import XCTest

import PostalCodeValidatorTests

var tests = [XCTestCaseEntry]()
tests += PostalCodeValidatorTests.allTests()
XCTMain(tests)


================================================
FILE: Tests/PostalCodeValidatorTests/PostalCodeValidatorTests.swift
================================================
// This file was automatically generated and should not be edited.
import Foundation
@testable import PostalCodeValidator
import XCTest

final class PostalCodeValidatorTests: XCTestCase {
    func testValidateACPostalCode() { // ASCENSION ISLAND
        let locale = Locale(identifier: "und-AC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"ASCN 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateADPostalCode() { // ANDORRA
        let locale = Locale(identifier: "und-AD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"AD100"#))
        XCTAssertTrue(validator!.validate(postalCode: #"AD501"#))
        XCTAssertTrue(validator!.validate(postalCode: #"AD700"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAEPostalCode() { // UNITED ARAB EMIRATES
        let locale = Locale(identifier: "und-AE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAFPostalCode() { // AFGHANISTAN
        let locale = Locale(identifier: "und-AF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2601"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3801"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAGPostalCode() { // ANTIGUA AND BARBUDA
        let locale = Locale(identifier: "und-AG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAIPostalCode() { // ANGUILLA
        let locale = Locale(identifier: "und-AI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2640"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateALPostalCode() { // ALBANIA
        let locale = Locale(identifier: "und-AL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1017"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3501"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAMPostalCode() { // ARMENIA
        let locale = Locale(identifier: "und-AM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"375010"#))
        XCTAssertTrue(validator!.validate(postalCode: #"0002"#))
        XCTAssertTrue(validator!.validate(postalCode: #"0010"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAOPostalCode() { // ANGOLA
        let locale = Locale(identifier: "und-AO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAQPostalCode() { // ANTARCTICA
        let locale = Locale(identifier: "und-AQ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateARPostalCode() { // ARGENTINA
        let locale = Locale(identifier: "und-AR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"C1070AAM"#))
        XCTAssertTrue(validator!.validate(postalCode: #"C1000WAM"#))
        XCTAssertTrue(validator!.validate(postalCode: #"B1000TBU"#))
        XCTAssertTrue(validator!.validate(postalCode: #"X5187XAB"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateASPostalCode() { // AMERICAN SAMOA
        let locale = Locale(identifier: "und-AS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96799"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateATPostalCode() { // AUSTRIA
        let locale = Locale(identifier: "und-AT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1010"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3741"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAUPostalCode() { // AUSTRALIA
        let locale = Locale(identifier: "und-AU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2060"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3171"#))
        XCTAssertTrue(validator!.validate(postalCode: #"6430"#))
        XCTAssertTrue(validator!.validate(postalCode: #"4000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"4006"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAWPostalCode() { // ARUBA
        let locale = Locale(identifier: "und-AW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAXPostalCode() { // FINLAND
        let locale = Locale(identifier: "und-AX")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"22150"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22550"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22240"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22710"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22270"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22730"#))
        XCTAssertTrue(validator!.validate(postalCode: #"22430"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateAZPostalCode() { // AZERBAIJAN
        let locale = Locale(identifier: "und-AZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBAPostalCode() { // BOSNIA AND HERZEGOVINA
        let locale = Locale(identifier: "und-BA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"71000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBBPostalCode() { // BARBADOS
        let locale = Locale(identifier: "und-BB")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"BB23026"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BB22025"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBDPostalCode() { // BANGLADESH
        let locale = Locale(identifier: "und-BD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1340"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBEPostalCode() { // BELGIUM
        let locale = Locale(identifier: "und-BE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"4000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBFPostalCode() { // BURKINA FASO
        let locale = Locale(identifier: "und-BF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBGPostalCode() { // BULGARIA (REP.)
        let locale = Locale(identifier: "und-BG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1700"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBHPostalCode() { // BAHRAIN
        let locale = Locale(identifier: "und-BH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"317"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBIPostalCode() { // BURUNDI
        let locale = Locale(identifier: "und-BI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBJPostalCode() { // BENIN
        let locale = Locale(identifier: "und-BJ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBLPostalCode() { // SAINT BARTHELEMY
        let locale = Locale(identifier: "und-BL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBMPostalCode() { // BERMUDA
        let locale = Locale(identifier: "und-BM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"FL 07"#))
        XCTAssertTrue(validator!.validate(postalCode: #"HM GX"#))
        XCTAssertTrue(validator!.validate(postalCode: #"HM 12"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBNPostalCode() { // BRUNEI DARUSSALAM
        let locale = Locale(identifier: "und-BN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"BT2328"#))
        XCTAssertTrue(validator!.validate(postalCode: #"KA1131"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BA1511"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBOPostalCode() { // BOLIVIA
        let locale = Locale(identifier: "und-BO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBQPostalCode() { // BONAIRE, SINT EUSTATIUS, AND SABA
        let locale = Locale(identifier: "und-BQ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBRPostalCode() { // BRAZIL
        let locale = Locale(identifier: "und-BR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"40301-110"#))
        XCTAssertTrue(validator!.validate(postalCode: #"70002-900"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBSPostalCode() { // BAHAMAS
        let locale = Locale(identifier: "und-BS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBTPostalCode() { // BHUTAN
        let locale = Locale(identifier: "und-BT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"31101"#))
        XCTAssertTrue(validator!.validate(postalCode: #"35003"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBVPostalCode() { // BOUVET ISLAND
        let locale = Locale(identifier: "und-BV")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBWPostalCode() { // BOTSWANA
        let locale = Locale(identifier: "und-BW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBYPostalCode() { // BELARUS
        let locale = Locale(identifier: "und-BY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"223016"#))
        XCTAssertTrue(validator!.validate(postalCode: #"225860"#))
        XCTAssertTrue(validator!.validate(postalCode: #"220050"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateBZPostalCode() { // BELIZE
        let locale = Locale(identifier: "und-BZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCAPostalCode() { // CANADA
        let locale = Locale(identifier: "und-CA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"H3Z 2Y7"#))
        XCTAssertTrue(validator!.validate(postalCode: #"V8X 3X4"#))
        XCTAssertTrue(validator!.validate(postalCode: #"T0L 1K0"#))
        XCTAssertTrue(validator!.validate(postalCode: #"T0H 1A0"#))
        XCTAssertTrue(validator!.validate(postalCode: #"K1A 0B1"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCCPostalCode() { // COCOS (KEELING) ISLANDS
        let locale = Locale(identifier: "und-CC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"6799"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCDPostalCode() { // CONGO (DEM. REP.)
        let locale = Locale(identifier: "und-CD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCFPostalCode() { // CENTRAL AFRICAN REPUBLIC
        let locale = Locale(identifier: "und-CF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCGPostalCode() { // CONGO (REP.)
        let locale = Locale(identifier: "und-CG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCHPostalCode() { // SWITZERLAND
        let locale = Locale(identifier: "und-CH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2544"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1211"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1556"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3030"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCIPostalCode() { // COTE D'IVOIRE
        let locale = Locale(identifier: "und-CI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCKPostalCode() { // COOK ISLANDS
        let locale = Locale(identifier: "und-CK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCLPostalCode() { // CHILE
        let locale = Locale(identifier: "und-CL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"8340457"#))
        XCTAssertTrue(validator!.validate(postalCode: #"8720019"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1230000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"8329100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCMPostalCode() { // CAMEROON
        let locale = Locale(identifier: "und-CM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCNPostalCode() { // CHINA
        let locale = Locale(identifier: "und-CN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"266033"#))
        XCTAssertTrue(validator!.validate(postalCode: #"317204"#))
        XCTAssertTrue(validator!.validate(postalCode: #"100096"#))
        XCTAssertTrue(validator!.validate(postalCode: #"100808"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCOPostalCode() { // COLOMBIA
        let locale = Locale(identifier: "und-CO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"111221"#))
        XCTAssertTrue(validator!.validate(postalCode: #"130001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"760011"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCRPostalCode() { // COSTA RICA
        let locale = Locale(identifier: "und-CR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2010"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCVPostalCode() { // CAPE VERDE
        let locale = Locale(identifier: "und-CV")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"7600"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCWPostalCode() { // CURACAO
        let locale = Locale(identifier: "und-CW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCXPostalCode() { // CHRISTMAS ISLAND
        let locale = Locale(identifier: "und-CX")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"6798"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCYPostalCode() { // CYPRUS
        let locale = Locale(identifier: "und-CY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2008"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3304"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1900"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateCZPostalCode() { // CZECH REP.
        let locale = Locale(identifier: "und-CZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"100 00"#))
        XCTAssertTrue(validator!.validate(postalCode: #"251 66"#))
        XCTAssertTrue(validator!.validate(postalCode: #"530 87"#))
        XCTAssertTrue(validator!.validate(postalCode: #"110 00"#))
        XCTAssertTrue(validator!.validate(postalCode: #"225 99"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDEPostalCode() { // GERMANY
        let locale = Locale(identifier: "und-DE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"26133"#))
        XCTAssertTrue(validator!.validate(postalCode: #"53225"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDJPostalCode() { // DJIBOUTI
        let locale = Locale(identifier: "und-DJ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDKPostalCode() { // DENMARK
        let locale = Locale(identifier: "und-DK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"8660"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1566"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDMPostalCode() { // DOMINICA
        let locale = Locale(identifier: "und-DM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDOPostalCode() { // DOMINICAN REP.
        let locale = Locale(identifier: "und-DO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11903"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateDZPostalCode() { // ALGERIA
        let locale = Locale(identifier: "und-DZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"40304"#))
        XCTAssertTrue(validator!.validate(postalCode: #"16027"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateECPostalCode() { // ECUADOR
        let locale = Locale(identifier: "und-EC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"090105"#))
        XCTAssertTrue(validator!.validate(postalCode: #"092301"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateEEPostalCode() { // ESTONIA
        let locale = Locale(identifier: "und-EE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"69501"#))
        XCTAssertTrue(validator!.validate(postalCode: #"11212"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateEGPostalCode() { // EGYPT
        let locale = Locale(identifier: "und-EG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"12411"#))
        XCTAssertTrue(validator!.validate(postalCode: #"11599"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateEHPostalCode() { // WESTERN SAHARA
        let locale = Locale(identifier: "und-EH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"70000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"72000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateERPostalCode() { // ERITREA
        let locale = Locale(identifier: "und-ER")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateESPostalCode() { // SPAIN
        let locale = Locale(identifier: "und-ES")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"28039"#))
        XCTAssertTrue(validator!.validate(postalCode: #"28300"#))
        XCTAssertTrue(validator!.validate(postalCode: #"28070"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateETPostalCode() { // ETHIOPIA
        let locale = Locale(identifier: "und-ET")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFIPostalCode() { // FINLAND
        let locale = Locale(identifier: "und-FI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"00550"#))
        XCTAssertTrue(validator!.validate(postalCode: #"00011"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFJPostalCode() { // FIJI
        let locale = Locale(identifier: "und-FJ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFKPostalCode() { // FALKLAND ISLANDS (MALVINAS)
        let locale = Locale(identifier: "und-FK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"FIQQ 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFMPostalCode() { // MICRONESIA (Federated State of)
        let locale = Locale(identifier: "und-FM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96941"#))
        XCTAssertTrue(validator!.validate(postalCode: #"96944"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFOPostalCode() { // FAROE ISLANDS
        let locale = Locale(identifier: "und-FO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateFRPostalCode() { // FRANCE
        let locale = Locale(identifier: "und-FR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"33380"#))
        XCTAssertTrue(validator!.validate(postalCode: #"34092"#))
        XCTAssertTrue(validator!.validate(postalCode: #"33506"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGAPostalCode() { // GABON
        let locale = Locale(identifier: "und-GA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGBPostalCode() { // UNITED KINGDOM
        let locale = Locale(identifier: "und-GB")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"EC1Y 8SY"#))
        XCTAssertTrue(validator!.validate(postalCode: #"GIR 0AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"M2 5BQ"#))
        XCTAssertTrue(validator!.validate(postalCode: #"M34 4AB"#))
        XCTAssertTrue(validator!.validate(postalCode: #"CR0 2YR"#))
        XCTAssertTrue(validator!.validate(postalCode: #"DN16 9AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"W1A 4ZZ"#))
        XCTAssertTrue(validator!.validate(postalCode: #"EC1A 1HQ"#))
        XCTAssertTrue(validator!.validate(postalCode: #"OX14 4PG"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BS18 8HF"#))
        XCTAssertTrue(validator!.validate(postalCode: #"NR25 7HG"#))
        XCTAssertTrue(validator!.validate(postalCode: #"RH6 0NP"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BH23 6AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"B6 5BA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"SO23 9AP"#))
        XCTAssertTrue(validator!.validate(postalCode: #"PO1 3AX"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BFPO 61"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGDPostalCode() { // GRENADA (WEST INDIES)
        let locale = Locale(identifier: "und-GD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGEPostalCode() { // GEORGIA
        let locale = Locale(identifier: "und-GE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"0101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGFPostalCode() { // FRENCH GUIANA
        let locale = Locale(identifier: "und-GF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97300"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGGPostalCode() { // CHANNEL ISLANDS
        let locale = Locale(identifier: "und-GG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"GY1 1AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"GY2 2BT"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGHPostalCode() { // GHANA
        let locale = Locale(identifier: "und-GH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGIPostalCode() { // GIBRALTAR
        let locale = Locale(identifier: "und-GI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"GX11 1AA"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGLPostalCode() { // GREENLAND
        let locale = Locale(identifier: "und-GL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"3900"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3950"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3911"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGMPostalCode() { // GAMBIA
        let locale = Locale(identifier: "und-GM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGNPostalCode() { // GUINEA
        let locale = Locale(identifier: "und-GN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"200"#))
        XCTAssertTrue(validator!.validate(postalCode: #"100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGPPostalCode() { // GUADELOUPE
        let locale = Locale(identifier: "und-GP")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGQPostalCode() { // EQUATORIAL GUINEA
        let locale = Locale(identifier: "und-GQ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGRPostalCode() { // GREECE
        let locale = Locale(identifier: "und-GR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"151 24"#))
        XCTAssertTrue(validator!.validate(postalCode: #"151 10"#))
        XCTAssertTrue(validator!.validate(postalCode: #"101 88"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGSPostalCode() { // SOUTH GEORGIA
        let locale = Locale(identifier: "und-GS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"SIQQ 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGTPostalCode() { // GUATEMALA
        let locale = Locale(identifier: "und-GT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"09001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"01501"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGUPostalCode() { // GUAM
        let locale = Locale(identifier: "und-GU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96910"#))
        XCTAssertTrue(validator!.validate(postalCode: #"96931"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGWPostalCode() { // GUINEA-BISSAU
        let locale = Locale(identifier: "und-GW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1011"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateGYPostalCode() { // GUYANA
        let locale = Locale(identifier: "und-GY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHKPostalCode() { // HONG KONG
        let locale = Locale(identifier: "und-HK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHMPostalCode() { // HEARD AND MCDONALD ISLANDS
        let locale = Locale(identifier: "und-HM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"7050"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHNPostalCode() { // HONDURAS
        let locale = Locale(identifier: "und-HN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"31301"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHRPostalCode() { // CROATIA
        let locale = Locale(identifier: "und-HR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"10000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"21001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10002"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHTPostalCode() { // HAITI
        let locale = Locale(identifier: "und-HT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"6120"#))
        XCTAssertTrue(validator!.validate(postalCode: #"5310"#))
        XCTAssertTrue(validator!.validate(postalCode: #"6110"#))
        XCTAssertTrue(validator!.validate(postalCode: #"8510"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateHUPostalCode() { // HUNGARY (Rep.)
        let locale = Locale(identifier: "und-HU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1037"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2380"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1540"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIDPostalCode() { // INDONESIA
        let locale = Locale(identifier: "und-ID")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"40115"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIEPostalCode() { // IRELAND
        let locale = Locale(identifier: "und-IE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"A65 F4E2"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateILPostalCode() { // ISRAEL
        let locale = Locale(identifier: "und-IL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"9614303"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIMPostalCode() { // ISLE OF MAN
        let locale = Locale(identifier: "und-IM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"IM2 1AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"IM99 1PS"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateINPostalCode() { // INDIA
        let locale = Locale(identifier: "und-IN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"110034"#))
        XCTAssertTrue(validator!.validate(postalCode: #"110001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIOPostalCode() { // BRITISH INDIAN OCEAN TERRITORY
        let locale = Locale(identifier: "und-IO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"BBND 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIQPostalCode() { // IRAQ
        let locale = Locale(identifier: "und-IQ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"31001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateIRPostalCode() { // IRAN
        let locale = Locale(identifier: "und-IR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11936-12345"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateISPostalCode() { // ICELAND
        let locale = Locale(identifier: "und-IS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"320"#))
        XCTAssertTrue(validator!.validate(postalCode: #"121"#))
        XCTAssertTrue(validator!.validate(postalCode: #"220"#))
        XCTAssertTrue(validator!.validate(postalCode: #"110"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateITPostalCode() { // ITALY
        let locale = Locale(identifier: "und-IT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"00144"#))
        XCTAssertTrue(validator!.validate(postalCode: #"47037"#))
        XCTAssertTrue(validator!.validate(postalCode: #"39049"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateJEPostalCode() { // CHANNEL ISLANDS
        let locale = Locale(identifier: "und-JE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"JE1 1AA"#))
        XCTAssertTrue(validator!.validate(postalCode: #"JE2 2BT"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateJMPostalCode() { // JAMAICA
        let locale = Locale(identifier: "und-JM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateJOPostalCode() { // JORDAN
        let locale = Locale(identifier: "und-JO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11937"#))
        XCTAssertTrue(validator!.validate(postalCode: #"11190"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateJPPostalCode() { // JAPAN
        let locale = Locale(identifier: "und-JP")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"154-0023"#))
        XCTAssertTrue(validator!.validate(postalCode: #"350-1106"#))
        XCTAssertTrue(validator!.validate(postalCode: #"951-8073"#))
        XCTAssertTrue(validator!.validate(postalCode: #"112-0001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"208-0032"#))
        XCTAssertTrue(validator!.validate(postalCode: #"231-0012"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKEPostalCode() { // KENYA
        let locale = Locale(identifier: "und-KE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"20100"#))
        XCTAssertTrue(validator!.validate(postalCode: #"00100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKGPostalCode() { // KYRGYZSTAN
        let locale = Locale(identifier: "und-KG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"720001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKHPostalCode() { // CAMBODIA
        let locale = Locale(identifier: "und-KH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"12203"#))
        XCTAssertTrue(validator!.validate(postalCode: #"14206"#))
        XCTAssertTrue(validator!.validate(postalCode: #"12000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKIPostalCode() { // KIRIBATI
        let locale = Locale(identifier: "und-KI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKMPostalCode() { // COMOROS
        let locale = Locale(identifier: "und-KM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKNPostalCode() { // SAINT KITTS AND NEVIS
        let locale = Locale(identifier: "und-KN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKRPostalCode() { // SOUTH KOREA
        let locale = Locale(identifier: "und-KR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"03051"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKWPostalCode() { // KUWAIT
        let locale = Locale(identifier: "und-KW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"54541"#))
        XCTAssertTrue(validator!.validate(postalCode: #"54551"#))
        XCTAssertTrue(validator!.validate(postalCode: #"54404"#))
        XCTAssertTrue(validator!.validate(postalCode: #"13009"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKYPostalCode() { // CAYMAN ISLANDS
        let locale = Locale(identifier: "und-KY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"KY1-1100"#))
        XCTAssertTrue(validator!.validate(postalCode: #"KY1-1702"#))
        XCTAssertTrue(validator!.validate(postalCode: #"KY2-2101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateKZPostalCode() { // KAZAKHSTAN
        let locale = Locale(identifier: "und-KZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"040900"#))
        XCTAssertTrue(validator!.validate(postalCode: #"050012"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLAPostalCode() { // LAO (PEOPLE'S DEM. REP.)
        let locale = Locale(identifier: "und-LA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"01160"#))
        XCTAssertTrue(validator!.validate(postalCode: #"01000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLBPostalCode() { // LEBANON
        let locale = Locale(identifier: "und-LB")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2038 3054"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1107 2810"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLCPostalCode() { // SAINT LUCIA
        let locale = Locale(identifier: "und-LC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLIPostalCode() { // LIECHTENSTEIN
        let locale = Locale(identifier: "und-LI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"9496"#))
        XCTAssertTrue(validator!.validate(postalCode: #"9491"#))
        XCTAssertTrue(validator!.validate(postalCode: #"9490"#))
        XCTAssertTrue(validator!.validate(postalCode: #"9485"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLKPostalCode() { // SRI LANKA
        let locale = Locale(identifier: "und-LK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"20000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"00100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLRPostalCode() { // LIBERIA
        let locale = Locale(identifier: "und-LR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLSPostalCode() { // LESOTHO
        let locale = Locale(identifier: "und-LS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLTPostalCode() { // LITHUANIA
        let locale = Locale(identifier: "und-LT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"04340"#))
        XCTAssertTrue(validator!.validate(postalCode: #"03500"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLUPostalCode() { // LUXEMBOURG
        let locale = Locale(identifier: "und-LU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"4750"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2998"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLVPostalCode() { // LATVIA
        let locale = Locale(identifier: "und-LV")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"LV-1073"#))
        XCTAssertTrue(validator!.validate(postalCode: #"LV-1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateLYPostalCode() { // LIBYA
        let locale = Locale(identifier: "und-LY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMAPostalCode() { // MOROCCO
        let locale = Locale(identifier: "und-MA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"53000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"20050"#))
        XCTAssertTrue(validator!.validate(postalCode: #"16052"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMCPostalCode() { // MONACO
        let locale = Locale(identifier: "und-MC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"98000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"98020"#))
        XCTAssertTrue(validator!.validate(postalCode: #"98011"#))
        XCTAssertTrue(validator!.validate(postalCode: #"98001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMDPostalCode() { // Rep. MOLDOVA
        let locale = Locale(identifier: "und-MD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2012"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2019"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMEPostalCode() { // MONTENEGRO
        let locale = Locale(identifier: "und-ME")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"81257"#))
        XCTAssertTrue(validator!.validate(postalCode: #"81258"#))
        XCTAssertTrue(validator!.validate(postalCode: #"81217"#))
        XCTAssertTrue(validator!.validate(postalCode: #"84314"#))
        XCTAssertTrue(validator!.validate(postalCode: #"85366"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMFPostalCode() { // SAINT MARTIN
        let locale = Locale(identifier: "und-MF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMGPostalCode() { // MADAGASCAR
        let locale = Locale(identifier: "und-MG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"501"#))
        XCTAssertTrue(validator!.validate(postalCode: #"101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMHPostalCode() { // MARSHALL ISLANDS
        let locale = Locale(identifier: "und-MH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96960"#))
        XCTAssertTrue(validator!.validate(postalCode: #"96970"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMKPostalCode() { // MACEDONIA
        let locale = Locale(identifier: "und-MK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1314"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1321"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1443"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1062"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMLPostalCode() { // MALI
        let locale = Locale(identifier: "und-ML")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMMPostalCode() { // MYANMAR
        let locale = Locale(identifier: "und-MM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11181"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMNPostalCode() { // MONGOLIA
        let locale = Locale(identifier: "und-MN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"65030"#))
        XCTAssertTrue(validator!.validate(postalCode: #"65270"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMOPostalCode() { // MACAO
        let locale = Locale(identifier: "und-MO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMPPostalCode() { // NORTHERN MARIANA ISLANDS
        let locale = Locale(identifier: "und-MP")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96950"#))
        XCTAssertTrue(validator!.validate(postalCode: #"96951"#))
        XCTAssertTrue(validator!.validate(postalCode: #"96952"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMQPostalCode() { // MARTINIQUE
        let locale = Locale(identifier: "und-MQ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97220"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMRPostalCode() { // MAURITANIA
        let locale = Locale(identifier: "und-MR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMSPostalCode() { // MONTSERRAT
        let locale = Locale(identifier: "und-MS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMTPostalCode() { // MALTA
        let locale = Locale(identifier: "und-MT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"NXR 01"#))
        XCTAssertTrue(validator!.validate(postalCode: #"ZTN 05"#))
        XCTAssertTrue(validator!.validate(postalCode: #"GPO 01"#))
        XCTAssertTrue(validator!.validate(postalCode: #"BZN 1130"#))
        XCTAssertTrue(validator!.validate(postalCode: #"SPB 6031"#))
        XCTAssertTrue(validator!.validate(postalCode: #"VCT 1753"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMUPostalCode() { // MAURITIUS
        let locale = Locale(identifier: "und-MU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"42602"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMVPostalCode() { // MALDIVES
        let locale = Locale(identifier: "und-MV")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"20026"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMWPostalCode() { // MALAWI
        let locale = Locale(identifier: "und-MW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMXPostalCode() { // MEXICO
        let locale = Locale(identifier: "und-MX")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"02860"#))
        XCTAssertTrue(validator!.validate(postalCode: #"77520"#))
        XCTAssertTrue(validator!.validate(postalCode: #"06082"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMYPostalCode() { // MALAYSIA
        let locale = Locale(identifier: "und-MY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"43000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"50754"#))
        XCTAssertTrue(validator!.validate(postalCode: #"88990"#))
        XCTAssertTrue(validator!.validate(postalCode: #"50670"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateMZPostalCode() { // MOZAMBIQUE
        let locale = Locale(identifier: "und-MZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1102"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1119"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3212"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNAPostalCode() { // NAMIBIA
        let locale = Locale(identifier: "und-NA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNCPostalCode() { // NEW CALEDONIA
        let locale = Locale(identifier: "und-NC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"98814"#))
        XCTAssertTrue(validator!.validate(postalCode: #"98800"#))
        XCTAssertTrue(validator!.validate(postalCode: #"98810"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNEPostalCode() { // NIGER
        let locale = Locale(identifier: "und-NE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"8001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNFPostalCode() { // NORFOLK ISLAND
        let locale = Locale(identifier: "und-NF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2899"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNGPostalCode() { // NIGERIA
        let locale = Locale(identifier: "und-NG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"930283"#))
        XCTAssertTrue(validator!.validate(postalCode: #"300001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"931104"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNIPostalCode() { // NICARAGUA
        let locale = Locale(identifier: "und-NI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"52000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNLPostalCode() { // NETHERLANDS
        let locale = Locale(identifier: "und-NL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1234 AB"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2490 AA"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNOPostalCode() { // NORWAY
        let locale = Locale(identifier: "und-NO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"0025"#))
        XCTAssertTrue(validator!.validate(postalCode: #"0107"#))
        XCTAssertTrue(validator!.validate(postalCode: #"6631"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNPPostalCode() { // NEPAL
        let locale = Locale(identifier: "und-NP")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"44601"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNRPostalCode() { // NAURU CENTRAL PACIFIC
        let locale = Locale(identifier: "und-NR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNUPostalCode() { // NIUE
        let locale = Locale(identifier: "und-NU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateNZPostalCode() { // NEW ZEALAND
        let locale = Locale(identifier: "und-NZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"6001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"6015"#))
        XCTAssertTrue(validator!.validate(postalCode: #"6332"#))
        XCTAssertTrue(validator!.validate(postalCode: #"8252"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1030"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateOMPostalCode() { // OMAN
        let locale = Locale(identifier: "und-OM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"133"#))
        XCTAssertTrue(validator!.validate(postalCode: #"112"#))
        XCTAssertTrue(validator!.validate(postalCode: #"111"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePAPostalCode() { // PANAMA (REP.)
        let locale = Locale(identifier: "und-PA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePEPostalCode() { // PERU
        let locale = Locale(identifier: "und-PE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"LIMA 23"#))
        XCTAssertTrue(validator!.validate(postalCode: #"LIMA 42"#))
        XCTAssertTrue(validator!.validate(postalCode: #"CALLAO 2"#))
        XCTAssertTrue(validator!.validate(postalCode: #"02001"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePFPostalCode() { // FRENCH POLYNESIA
        let locale = Locale(identifier: "und-PF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"98709"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePGPostalCode() { // PAPUA NEW GUINEA
        let locale = Locale(identifier: "und-PG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"111"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePHPostalCode() { // PHILIPPINES
        let locale = Locale(identifier: "und-PH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1008"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1050"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1135"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1207"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePKPostalCode() { // PAKISTAN
        let locale = Locale(identifier: "und-PK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"44000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePLPostalCode() { // POLAND
        let locale = Locale(identifier: "und-PL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"00-950"#))
        XCTAssertTrue(validator!.validate(postalCode: #"05-470"#))
        XCTAssertTrue(validator!.validate(postalCode: #"48-300"#))
        XCTAssertTrue(validator!.validate(postalCode: #"32-015"#))
        XCTAssertTrue(validator!.validate(postalCode: #"00-940"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePMPostalCode() { // ST. PIERRE AND MIQUELON
        let locale = Locale(identifier: "und-PM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97500"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePNPostalCode() { // PITCAIRN
        let locale = Locale(identifier: "und-PN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"PCRN 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePRPostalCode() { // PUERTO RICO
        let locale = Locale(identifier: "und-PR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"00930"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePSPostalCode() { // PALESTINIAN TERRITORY
        let locale = Locale(identifier: "und-PS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePTPostalCode() { // PORTUGAL
        let locale = Locale(identifier: "und-PT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"2725-079"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1250-096"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1201-950"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2860-571"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1208-148"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePWPostalCode() { // PALAU
        let locale = Locale(identifier: "und-PW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"96940"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidatePYPostalCode() { // PARAGUAY
        let locale = Locale(identifier: "und-PY")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1536"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1538"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1209"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateQAPostalCode() { // QATAR
        let locale = Locale(identifier: "und-QA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateREPostalCode() { // REUNION
        let locale = Locale(identifier: "und-RE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"97400"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateROPostalCode() { // ROMANIA
        let locale = Locale(identifier: "und-RO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"060274"#))
        XCTAssertTrue(validator!.validate(postalCode: #"061357"#))
        XCTAssertTrue(validator!.validate(postalCode: #"200716"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateRSPostalCode() { // REPUBLIC OF SERBIA
        let locale = Locale(identifier: "und-RS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"106314"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateRUPostalCode() { // RUSSIAN FEDERATION
        let locale = Locale(identifier: "und-RU")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"247112"#))
        XCTAssertTrue(validator!.validate(postalCode: #"103375"#))
        XCTAssertTrue(validator!.validate(postalCode: #"188300"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateRWPostalCode() { // RWANDA
        let locale = Locale(identifier: "und-RW")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSAPostalCode() { // SAUDI ARABIA
        let locale = Locale(identifier: "und-SA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11564"#))
        XCTAssertTrue(validator!.validate(postalCode: #"11187"#))
        XCTAssertTrue(validator!.validate(postalCode: #"11142"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSBPostalCode() { // SOLOMON ISLANDS
        let locale = Locale(identifier: "und-SB")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSCPostalCode() { // SEYCHELLES
        let locale = Locale(identifier: "und-SC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSEPostalCode() { // SWEDEN
        let locale = Locale(identifier: "und-SE")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"11455"#))
        XCTAssertTrue(validator!.validate(postalCode: #"12345"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10500"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSGPostalCode() { // REP. OF SINGAPORE
        let locale = Locale(identifier: "und-SG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"546080"#))
        XCTAssertTrue(validator!.validate(postalCode: #"308125"#))
        XCTAssertTrue(validator!.validate(postalCode: #"408600"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSHPostalCode() { // SAINT HELENA
        let locale = Locale(identifier: "und-SH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"STHL 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSIPostalCode() { // SLOVENIA
        let locale = Locale(identifier: "und-SI")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"4000"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1001"#))
        XCTAssertTrue(validator!.validate(postalCode: #"2500"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSJPostalCode() { // SVALBARD AND JAN MAYEN ISLANDS
        let locale = Locale(identifier: "und-SJ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"9170"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSKPostalCode() { // SLOVAKIA
        let locale = Locale(identifier: "und-SK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"010 01"#))
        XCTAssertTrue(validator!.validate(postalCode: #"023 14"#))
        XCTAssertTrue(validator!.validate(postalCode: #"972 48"#))
        XCTAssertTrue(validator!.validate(postalCode: #"921 01"#))
        XCTAssertTrue(validator!.validate(postalCode: #"975 99"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSLPostalCode() { // SIERRA LEONE
        let locale = Locale(identifier: "und-SL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSMPostalCode() { // SAN MARINO
        let locale = Locale(identifier: "und-SM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"47890"#))
        XCTAssertTrue(validator!.validate(postalCode: #"47891"#))
        XCTAssertTrue(validator!.validate(postalCode: #"47895"#))
        XCTAssertTrue(validator!.validate(postalCode: #"47899"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSNPostalCode() { // SENEGAL
        let locale = Locale(identifier: "und-SN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"12500"#))
        XCTAssertTrue(validator!.validate(postalCode: #"46024"#))
        XCTAssertTrue(validator!.validate(postalCode: #"16556"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSOPostalCode() { // SOMALIA
        let locale = Locale(identifier: "und-SO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"JH 09010"#))
        XCTAssertTrue(validator!.validate(postalCode: #"AD 11010"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSRPostalCode() { // SURINAME
        let locale = Locale(identifier: "und-SR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSSPostalCode() { // SOUTH SUDAN
        let locale = Locale(identifier: "und-SS")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSTPostalCode() { // SAO TOME AND PRINCIPE
        let locale = Locale(identifier: "und-ST")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSVPostalCode() { // EL SALVADOR
        let locale = Locale(identifier: "und-SV")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"CP 1101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSXPostalCode() { // SINT MAARTEN
        let locale = Locale(identifier: "und-SX")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateSZPostalCode() { // SWAZILAND
        let locale = Locale(identifier: "und-SZ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"H100"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTAPostalCode() { // TRISTAN DA CUNHA
        let locale = Locale(identifier: "und-TA")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"TDCU 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTCPostalCode() { // TURKS AND CAICOS ISLANDS
        let locale = Locale(identifier: "und-TC")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"TKCA 1ZZ"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTDPostalCode() { // CHAD
        let locale = Locale(identifier: "und-TD")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTFPostalCode() { // FRENCH SOUTHERN TERRITORIES
        let locale = Locale(identifier: "und-TF")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTGPostalCode() { // TOGO
        let locale = Locale(identifier: "und-TG")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTHPostalCode() { // THAILAND
        let locale = Locale(identifier: "und-TH")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"10150"#))
        XCTAssertTrue(validator!.validate(postalCode: #"10210"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTJPostalCode() { // TAJIKISTAN
        let locale = Locale(identifier: "und-TJ")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"735450"#))
        XCTAssertTrue(validator!.validate(postalCode: #"734025"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTKPostalCode() { // TOKELAU
        let locale = Locale(identifier: "und-TK")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTLPostalCode() { // TIMOR-LESTE
        let locale = Locale(identifier: "und-TL")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTMPostalCode() { // TURKMENISTAN
        let locale = Locale(identifier: "und-TM")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"744000"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTNPostalCode() { // TUNISIA
        let locale = Locale(identifier: "und-TN")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"1002"#))
        XCTAssertTrue(validator!.validate(postalCode: #"8129"#))
        XCTAssertTrue(validator!.validate(postalCode: #"3100"#))
        XCTAssertTrue(validator!.validate(postalCode: #"1030"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTOPostalCode() { // TONGA
        let locale = Locale(identifier: "und-TO")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTRPostalCode() { // TURKEY
        let locale = Locale(identifier: "und-TR")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)

        XCTAssertTrue(validator!.validate(postalCode: #"01960"#))
        XCTAssertTrue(validator!.validate(postalCode: #"06101"#))

        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTTPostalCode() { // TRINIDAD AND TOBAGO
        let locale = Locale(identifier: "und-TT")
        let validator = PostalCodeValidator(locale: locale)
        XCTAssertNotNil(validator)


        XCTAssertFalse(validator!.validate(postalCode:#"XXXXXXXXXXX"#))
    }

    func testValidateTVPostalCode
Download .txt
gitextract_1etc8eer/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── Brewfile
├── LICENSE.md
├── Makefile
├── Package.swift
├── README.md
├── Resources/
│   └── postalData.json
├── Scripts/
│   └── Regions.swift
├── Sources/
│   └── PostalCodeValidator/
│       ├── PostalCodeValidator.swift
│       └── PostalCodeValidator.swift.gyb
└── Tests/
    ├── LinuxMain.swift
    └── PostalCodeValidatorTests/
        ├── PostalCodeValidatorTests.swift
        ├── PostalCodeValidatorTests.swift.gyb
        └── XCTestManifests.swift
Condensed preview — 15 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (251K chars).
[
  {
    "path": ".github/workflows/main.yml",
    "chars": 244,
    "preview": "name: CI\n\non: [push]\n\njobs:\n  test:\n    runs-on: ${{ matrix.os }}\n\n    strategy:\n      matrix:\n        os: [macOS-latest"
  },
  {
    "path": ".gitignore",
    "chars": 67,
    "preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\n.swiftpm\nResources/data/*\n"
  },
  {
    "path": "Brewfile",
    "chars": 36,
    "preview": "tap 'nshipster/formulae'\nbrew 'gyb'\n"
  },
  {
    "path": "LICENSE.md",
    "chars": 1062,
    "preview": "Copyright 2019 Mattt (https://mat.tt)\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of t"
  },
  {
    "path": "Makefile",
    "chars": 839,
    "preview": "INPUTS = $(patsubst %,Resources/data/%.json,$(shell swift Scripts/Regions.swift))\n\n.DEFAULT_GOAL: all\n\n.PHONY: all\nall: "
  },
  {
    "path": "Package.swift",
    "chars": 1112,
    "preview": "// swift-tools-version:4.0\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
  },
  {
    "path": "README.md",
    "chars": 2883,
    "preview": "# PostalCodeValidator\n\n[![Build Status][ci status badge]][ci status]\n[![License][license badge]][license]\n[![Swift Versi"
  },
  {
    "path": "Resources/postalData.json",
    "chars": 89948,
    "preview": "[\n  {\n    \"zipex\": \"ASCN 1ZZ\",\n    \"name\": \"ASCENSION ISLAND\",\n    \"zip\": \"ASCN 1ZZ\",\n    \"fmt\": \"%N%n%O%n%A%n%C%n%Z\",\n "
  },
  {
    "path": "Scripts/Regions.swift",
    "chars": 72,
    "preview": "import Foundation\n\nprint(Locale.isoRegionCodes.joined(separator: \"\\n\"))\n"
  },
  {
    "path": "Sources/PostalCodeValidator/PostalCodeValidator.swift",
    "chars": 10564,
    "preview": "// This file was automatically generated and should not be edited.\nimport Foundation\n\n/// A validator for postal codes.\n"
  },
  {
    "path": "Sources/PostalCodeValidator/PostalCodeValidator.swift.gyb",
    "chars": 2874,
    "preview": "% warning = \"This file was automatically generated and should not be edited.\"\n// ${warning}\nimport Foundation\n\n%{\n# enco"
  },
  {
    "path": "Tests/LinuxMain.swift",
    "chars": 140,
    "preview": "import XCTest\n\nimport PostalCodeValidatorTests\n\nvar tests = [XCTestCaseEntry]()\ntests += PostalCodeValidatorTests.allTes"
  },
  {
    "path": "Tests/PostalCodeValidatorTests/PostalCodeValidatorTests.swift",
    "chars": 113649,
    "preview": "// This file was automatically generated and should not be edited.\nimport Foundation\n@testable import PostalCodeValidato"
  },
  {
    "path": "Tests/PostalCodeValidatorTests/PostalCodeValidatorTests.swift.gyb",
    "chars": 1379,
    "preview": "% warning = \"This file was automatically generated and should not be edited.\"\n// ${warning}\nimport Foundation\n@testable "
  },
  {
    "path": "Tests/PostalCodeValidatorTests/XCTestManifests.swift",
    "chars": 172,
    "preview": "import XCTest\n\n#if !os(macOS)\n    public func allTests() -> [XCTestCaseEntry] {\n        return [\n            testCase(Po"
  }
]

About this extraction

This page contains the full source code of the FormatterKit/PostalCodeValidator GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 15 files (219.8 KB), approximately 74.3k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!