pax_global_header00006660000000000000000000000064144467040600014517gustar00rootroot0000000000000052 comment=986f11510104ee8d537aa0ac9f6a1e241c59b747 ruby-kdl-1.0.3/000077500000000000000000000000001444670406000132515ustar00rootroot00000000000000ruby-kdl-1.0.3/.github/000077500000000000000000000000001444670406000146115ustar00rootroot00000000000000ruby-kdl-1.0.3/.github/workflows/000077500000000000000000000000001444670406000166465ustar00rootroot00000000000000ruby-kdl-1.0.3/.github/workflows/ruby.yml000066400000000000000000000017201444670406000203520ustar00rootroot00000000000000# This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by # separate terms of service, privacy policy, and support # documentation. # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby name: Ruby on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: strategy: matrix: ruby: [2.4, 2.5, 2.6, 2.7, 3.0, 3.1, head] runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: submodules: true - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # install and cache dependencies - name: Build parser run: bundle exec racc lib/kdl/kdl.yy - name: Run tests run: bundle exec rake test ruby-kdl-1.0.3/.gitignore000066400000000000000000000001661444670406000152440ustar00rootroot00000000000000/.bundle/ /.yardoc /_yardoc/ /coverage/ /doc/ /pkg/ /spec/reports/ /tmp/ Gemfile.lock lib/kdl/kdl.tab.rb kdl.output ruby-kdl-1.0.3/.gitmodules000066400000000000000000000001221444670406000154210ustar00rootroot00000000000000[submodule "test/kdl-org"] path = test/kdl-org url = git@github.com:kdl-org/kdl ruby-kdl-1.0.3/CODE_OF_CONDUCT.md000066400000000000000000000153051444670406000160540ustar00rootroot00000000000000# Code of Conduct ## When Something Happens If you see behavoir that makes you feel unsafe or unwelcome or otherwise uncomfortable, follow these steps: 1. Let the person know that what they did is not appropriate and ask them to stop and/or edit their message(s) or commits. 2. That person should immediately stop the behavior and correct the issue. 3. If this doesn’t happen, or if you're uncomfortable speaking up, [contact the maintainers](#contacting-maintainers). 4. As soon as available, a maintainer will look into the issue, and take [further action (see below)](#further-enforcement), starting with a warning, then temporary block, then long-term repo or organization ban. **The maintainer team will prioritize the well-being and comfort of those affected over the comfort of the offending party.** See [some examples below](#enforcement-examples). ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers of this project pledge to making participation in our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, technical preferences, nationality, personal appearance, race, religion, or sexual identity and orientation. This commitment means that inappropriate behavior can lead to intervention. This includes our intention to address issues with [missing stairs](https://en.wikipedia.org/wiki/Missing_stair) who may not have explicitly violated any written-down rules but might still be disrupting the community. ## Scope This Code of Conduct applies both within spaces involving this project and in other spaces involving community members. This includes the repository, its Pull Requests and Issue tracker, its Twitter community, private email communications in the context of the project, and any events where members of the project are participating, as well as adjacent communities and venues affecting the project's members. Depending on the violation, the maintainers may decide that violations of this code of conduct that have happened outside of the scope of the community may deem an individual unwelcome, and take appropriate action to maintain the comfort and safety of its members. ## Contacting Maintainers - [Dan Smith ](mailto:danini@hey.com) ## Further Enforcement If you've already followed the [initial enforcement steps](#enforcement), these are the steps maintainers will take for further enforcement, as needed: 1. Repeat the request to stop. 2. If the person doubles down, they will have offending messages removed or edited by a maintainers given an official warning. The PR or Issue may be locked. 3. If the behavior continues or is repeated later, the person will be blocked from participating for 24 hours. 4. If the behavior continues or is repeated after the temporary block, a long-term (6-12mo) ban will be used. On top of this, maintainers may remove any offending messages, images, contributions, etc, as they deem necessary. Maintainers reserve full rights to skip any of these steps, at their discretion, if the violation is considered to be a serious and/or immediate threat to the health and well-being of members of the community. These include any threats, serious physical or verbal attacks, and other such behavior that would be completely unacceptable in any social setting that puts our members at risk. Members expelled from events or venues with any sort of paid attendance will not be refunded. ## Who Watches the Watchers? Maintainers and other leaders who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. These may include anything from removal from the maintainer team to a permanent ban from the community. Additionally, as a project hosted on both GitHub, [their Community Guidielines may be applied to maintainers of this project](https://help.github.com/articles/github-community-guidelines/), externally of this project's procedures. ## Enforcement Examples ### The Best Case The vast majority of situations work out like this. This interaction is common, and generally positive. > Alex: "Yeah I used X and it was really crazy!" > Patt (not a maintainer): "Hey, could you not use that word? What about 'ridiculous' instead?" > Alex: "oh sorry, sure." -> edits old comment to say "it was really confusing!" ### The Maintainer Case Sometimes, though, you need to get maintainers involved. Maintainers will do their best to resolve conflicts, but people who were harmed by something **will take priority**. > Patt: "Honestly, sometimes I just really hate using $library and anyone who uses it probably sucks at their job." > Alex: "Whoa there, could you dial it back a bit? There's a CoC thing about attacking folks' tech use like that." > Patt: "I'm not attacking anyone, what's your problem?" > Alex: "@maintainers hey uh. Can someone look at this issue? Patt is getting a bit aggro. I tried to nudge them about it, but nope." > KeeperOfCommitBits: (on issue) "Hey Patt, maintainer here. Could you tone it down? This sort of attack is really not okay in this space." > Patt: "Leave me alone I haven't said anything bad wtf is wrong with you." > KeeperOfCommitBits: (deletes user's comment), "@patt I mean it. Please refer to the CoC over at (URL to this CoC) if you have questions, but you can consider this an actual warning. I'd appreciate it if you reworded your messages in this thread, since they made folks there uncomfortable. Let's try and be kind, yeah?" > Patt: "@keeperofbits Okay sorry. I'm just frustrated and I'm kinda burnt out and I guess I got carried away. I'll DM Alex a note apologizing and edit my messages. Sorry for the trouble." > KeeperOfCommitBits: "@patt Thanks for that. I hear you on the stress. Burnout sucks :/. Have a good one!" ### The Nope Case > PepeTheFrog🐸: "Hi, I am a literal actual nazi and I think white supremacists are quite fashionable." > Patt: "NOOOOPE. OH NOPE NOPE." > Alex: "JFC NO. NOPE. @keeperofbits NOPE NOPE LOOK HERE" > KeeperOfCommitBits: "👀 Nope. NOPE NOPE NOPE. 🔥" > PepeTheFrog🐸 has been banned from all organization or user repositories belonging to KeeperOfCommitBits. ## Attribution This Code of Conduct was generated using [WeAllJS Code of Conduct Generator](https://npm.im/weallbehave), which is based on the [WeAllJS Code of Conduct](https://wealljs.org/code-of-conduct), which is itself based on [Contributor Covenant](http://contributor-covenant.org), version 1.4, available at [http://contributor-covenant.org/version/1/4](http://contributor-covenant.org/version/1/4), and the LGBTQ in Technology Slack [Code of Conduct](http://lgbtq.technology/coc.html). ruby-kdl-1.0.3/Gemfile000066400000000000000000000002101444670406000145350ustar00rootroot00000000000000source "https://rubygems.org" # Specify your gem's dependencies in kdl.gemspec gemspec gem "rake", "~> 12.0" gem "minitest", "~> 5.0" ruby-kdl-1.0.3/LICENSE.txt000066400000000000000000000020671444670406000151010ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2020 Daniel Smith 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. ruby-kdl-1.0.3/README.md000066400000000000000000000035541444670406000145370ustar00rootroot00000000000000# KDL [![Actions Status](https://github.com/danini-the-panini/kdl-rb/workflows/Ruby/badge.svg)](https://github.com/danini-the-panini/kdl-rb/actions) This is a Ruby implementation of the [KDL Document Language](https://kdl.dev) ## Installation Add this line to your application's Gemfile: ```ruby gem 'kdl' ``` And then execute: $ bundle install Or install it yourself as: $ gem install kdl ## Usage ```ruby require 'kdl' KDL.parse_document(a_string) #=> KDL::Document ``` You can optionally provide your own type annotation handlers: ```ruby KDL.parse_document(a_string, type_parsers: { 'foo' => -> (value, type) { Foo.new(value.value, type: type) } }) ``` The `foo` proc will be called with instances of Value or Node with the type annotation `(foo)`. Parsers are expected to have a `call` method that takes the Value or Node, and the type annotation itself, as arguments, and is expected to return either an instance of Value or Node (depending on the input type) or `nil` to return the original value as is. Take a look at [the built in parsers](lib/kdl/types) as a reference. ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/danini-the-panini/kdl-rb. ## License The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). ruby-kdl-1.0.3/Rakefile000066400000000000000000000006101444670406000147130ustar00rootroot00000000000000require 'bundler/gem_tasks' require 'rake/testtask' file 'lib/kdl/kdl.tab.rb' => ['lib/kdl/kdl.yy'] do raise "racc command failed" unless system 'bin/racc lib/kdl/kdl.yy' end task :racc => 'lib/kdl/kdl.tab.rb' Rake::TestTask.new(:test => :racc) do |t| t.libs << 'test' t.libs << 'lib' t.test_files = FileList['test/**/*_test.rb'] t.options = '--pride' end task :default => :test ruby-kdl-1.0.3/bin/000077500000000000000000000000001444670406000140215ustar00rootroot00000000000000ruby-kdl-1.0.3/bin/console000077500000000000000000000005521444670406000154130ustar00rootroot00000000000000#!/usr/bin/env ruby require "bundler/setup" require "kdl" # You can add fixtures and/or initialization code here to make experimenting # with your gem easier. You can also use a different console, if you like. # (If you use this, don't forget to add pry to your Gemfile!) # require "pry" # Pry.start system 'bin/rake racc' require "irb" IRB.start(__FILE__) ruby-kdl-1.0.3/bin/kdl000077500000000000000000000001741444670406000145230ustar00rootroot00000000000000#!/usr/bin/env ruby require "bundler/setup" require "kdl" system 'bin/rake racc' puts KDL.parse_document(ARGF.read).to_s ruby-kdl-1.0.3/bin/racc000077500000000000000000000014231444670406000146570ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'racc' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath) bundle_binstub = File.expand_path("../bundle", __FILE__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("racc", "racc") ruby-kdl-1.0.3/bin/rake000077500000000000000000000014231444670406000146710ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true # # This file was generated by Bundler. # # The application 'rake' is installed as part of a gem, and # this file is here to facilitate running it. # require "pathname" ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath) bundle_binstub = File.expand_path("../bundle", __FILE__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("rake", "rake") ruby-kdl-1.0.3/bin/setup000077500000000000000000000002211444670406000151020ustar00rootroot00000000000000#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' set -vx bundle install # Do any other automated setup that you need to do here bin/rake racc ruby-kdl-1.0.3/kdl.gemspec000066400000000000000000000022771444670406000154000ustar00rootroot00000000000000require_relative 'lib/kdl/version' Gem::Specification.new do |spec| spec.name = "kdl" spec.version = KDL::VERSION spec.authors = ["Danielle Smith"] spec.email = ["danini@hey.com"] spec.summary = %q{KDL Document Language} spec.description = %q{Ruby implementation of the KDL Document Language Spec} spec.homepage = "https://kdl.dev" spec.license = "MIT" spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0") spec.metadata["homepage_uri"] = spec.homepage spec.metadata["source_code_uri"] = "https://github.com/danini-the-panini/kdl-rb" spec.metadata["changelog_uri"] = "https://github.com/danini-the-panini/kdl-rb/releases" # Specify which files should be added to the gem when it is released. # The `git ls-files -z` loads the files in the RubyGem that have been added into git. spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } end + ['lib/kdl/kdl.tab.rb'] spec.bindir = "exe" spec.require_paths = ["lib"] spec.add_development_dependency 'racc', '~> 1.5' spec.add_dependency 'simpleidn', '~> 0.2.1' end ruby-kdl-1.0.3/lib/000077500000000000000000000000001444670406000140175ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl.rb000066400000000000000000000004341444670406000151170ustar00rootroot00000000000000require "kdl/version" require "kdl/tokenizer" require "kdl/document" require "kdl/value" require "kdl/node" require "kdl/string_dumper" require "kdl/types" require "kdl/kdl.tab" module KDL def self.parse_document(input, options = {}) Parser.new.parse(input, options) end end ruby-kdl-1.0.3/lib/kdl/000077500000000000000000000000001444670406000145715ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/document.rb000066400000000000000000000004431444670406000167350ustar00rootroot00000000000000module KDL class Document attr_accessor :nodes def initialize(nodes) @nodes = nodes end def to_s @nodes.map(&:to_s).join("\n") + "\n" end def ==(other) return false unless other.is_a?(Document) nodes == other.nodes end end end ruby-kdl-1.0.3/lib/kdl/kdl.tab.rb000066400000000000000000000274131444670406000164440ustar00rootroot00000000000000# # DO NOT MODIFY!!!! # This file is automatically generated by Racc 1.6.0 # from Racc grammar file "". # require 'racc/parser.rb' module KDL class Parser < Racc::Parser module_eval(<<'...end kdl.yy/module_eval...', 'kdl.yy', 70) def parse(str, options = {}) if options.fetch(:parse_types, true) @type_parsers = ::KDL::Types::MAPPING.merge(options.fetch(:type_parsers, {})) else @type_parsers = {} end @tokenizer = ::KDL::Tokenizer.new(str) do_parse end private def next_token @tokenizer.next_token end ...end kdl.yy/module_eval... ##### State transition tables begin ### racc_action_table = [ -49, 9, 18, 19, 20, 18, 19, 20, 5, 6, 24, -49, 60, -49, 17, 64, 7, 17, -49, 16, 63, 18, 49, 50, 54, 55, 58, 59, 57, 39, 39, 39, 63, 17, 18, 19, 20, 66, 45, 36, 36, 36, 5, 6, 39, -29, 17, 18, 19, 20, 7, 16, -30, 68, 36, 5, 6, 74, 78, 17, 18, 19, 20, 7, 16, nil, 35, 6, 18, 19, 20, 79, 17, 34, 7, 31, 36, 16, 18, 49, 50, 54, 55, 58, 59, 57, nil, nil, 60, 39, 17, 70, 71, 54, 55, 58, 59, 57, 31, 36, 5, 6, 17, 5, 6, 5, 6, 34, 7, nil, 34, 7, nil, 7, 5, 6, 5, 6, 5, 6, nil, nil, 7, nil, 7, nil, 7, 70, 71, 54, 55, 58, 59, 57, 18, 19, 20 ] racc_action_check = [ 35, 1, 2, 2, 2, 38, 38, 38, 0, 0, 9, 35, 30, 35, 2, 36, 0, 38, 35, 2, 35, 29, 29, 29, 29, 29, 29, 29, 29, 29, 16, 31, 39, 29, 3, 3, 3, 41, 29, 29, 16, 31, 3, 3, 45, 49, 3, 72, 72, 72, 3, 3, 50, 51, 45, 72, 72, 63, 72, 72, 73, 73, 73, 72, 72, nil, 14, 14, 13, 13, 13, 73, 73, 14, 14, 14, 14, 73, 67, 67, 67, 67, 67, 67, 67, 67, nil, nil, 67, 47, 67, 68, 68, 68, 68, 68, 68, 68, 47, 47, 27, 27, 68, 28, 28, 32, 32, 27, 27, nil, 28, 28, nil, 32, 34, 34, 60, 60, 62, 62, nil, nil, 34, nil, 60, nil, 62, 53, 53, 53, 53, 53, 53, 53, 17, 17, 17 ] racc_action_pointer = [ -2, 1, 0, 32, nil, nil, nil, nil, nil, 10, nil, nil, nil, 66, 56, nil, 20, 132, nil, nil, nil, nil, nil, nil, nil, nil, nil, 90, 93, 19, 0, 21, 95, nil, 104, 0, 5, nil, 3, 12, nil, 22, nil, nil, nil, 34, nil, 79, nil, 29, 36, 37, nil, 124, nil, nil, nil, nil, nil, nil, 106, nil, 108, 47, nil, nil, nil, 76, 88, nil, nil, nil, 45, 58, nil, nil, nil, nil, nil, nil ] racc_action_default = [ -54, -55, -1, -2, -3, -49, -50, -51, -52, -55, -6, -7, -8, -55, -54, -13, -54, -55, -28, -29, -30, -4, -5, -53, 80, -9, -10, -55, -55, -48, -55, -54, -23, -24, -25, -42, -43, -47, -55, -42, -48, -55, -11, -12, -14, -54, -16, -55, -22, -34, -35, -55, -32, -55, -36, -37, -38, -39, -40, -41, -54, -21, -26, -44, -45, -18, -27, -55, -55, -33, -34, -35, -55, -55, -46, -15, -17, -31, -20, -19 ] racc_goto_table = [ 21, 22, 23, 2, 3, 4, 41, 53, 29, 44, 38, 46, 26, 1, 25, 27, 28, 69, 51, nil, nil, nil, nil, 47, nil, 42, 43, nil, nil, nil, nil, 23, nil, nil, nil, 65, nil, nil, 62, 67, nil, 47, nil, nil, nil, 53, 53, 75, 77, 76, nil, nil, nil, nil, nil, nil, 51, nil, nil, nil, nil, 23, nil, 73, 72, 4, nil, nil, nil, 21, 22, 23 ] racc_goto_check = [ 5, 6, 21, 2, 3, 4, 13, 8, 14, 15, 16, 17, 10, 1, 7, 11, 12, 19, 13, nil, nil, nil, nil, 14, nil, 10, 10, nil, nil, nil, nil, 21, nil, nil, nil, 5, nil, nil, 3, 16, nil, 14, nil, nil, nil, 8, 8, 15, 15, 17, nil, nil, nil, nil, nil, nil, 13, nil, nil, nil, nil, 21, nil, 2, 3, 4, nil, nil, nil, 5, 6, 21 ] racc_goto_pointer = [ nil, 13, 3, 4, 5, -3, -2, 1, -22, nil, -2, 1, 2, -11, -6, -20, -6, -18, nil, -36, nil, -1 ] racc_goto_default = [ nil, nil, nil, 32, 37, 10, 11, 12, 13, 14, nil, 61, 48, 15, 40, nil, 30, nil, 33, 52, 56, 8 ] racc_reduce_table = [ 0, 0, :racc_error, 1, 22, :_reduce_1, 1, 22, :_reduce_2, 1, 23, :_reduce_3, 2, 23, :_reduce_4, 2, 23, :_reduce_5, 2, 23, :_reduce_6, 2, 23, :_reduce_7, 1, 26, :_reduce_8, 2, 26, :_reduce_9, 2, 28, :_reduce_10, 3, 28, :_reduce_11, 3, 28, :_reduce_12, 1, 30, :_reduce_13, 3, 30, :_reduce_14, 5, 30, :_reduce_15, 3, 30, :_reduce_16, 5, 30, :_reduce_17, 3, 27, :_reduce_none, 4, 32, :_reduce_19, 4, 32, :_reduce_20, 2, 33, :_reduce_none, 2, 33, :_reduce_none, 1, 31, :_reduce_none, 1, 31, :_reduce_none, 1, 39, :_reduce_none, 2, 39, :_reduce_none, 3, 29, :_reduce_27, 1, 34, :_reduce_28, 1, 34, :_reduce_29, 1, 34, :_reduce_30, 3, 38, :_reduce_31, 1, 36, :_reduce_none, 2, 36, :_reduce_33, 1, 40, :_reduce_34, 1, 40, :_reduce_35, 1, 40, :_reduce_36, 1, 40, :_reduce_37, 1, 40, :_reduce_38, 1, 40, :_reduce_39, 1, 41, :_reduce_40, 1, 41, :_reduce_41, 1, 35, :_reduce_none, 1, 35, :_reduce_none, 2, 35, :_reduce_none, 2, 35, :_reduce_none, 3, 35, :_reduce_none, 1, 37, :_reduce_none, 1, 37, :_reduce_none, 1, 42, :_reduce_none, 1, 42, :_reduce_none, 1, 42, :_reduce_none, 1, 24, :_reduce_none, 2, 24, :_reduce_none, 0, 25, :_reduce_54 ] racc_reduce_n = 55 racc_shift_n = 80 racc_token_table = { false => 0, :error => 1, :IDENT => 2, :STRING => 3, :RAWSTRING => 4, :INTEGER => 5, :FLOAT => 6, :TRUE => 7, :FALSE => 8, :NULL => 9, :WS => 10, :NEWLINE => 11, :LBRACE => 12, :RBRACE => 13, :LPAREN => 14, :RPAREN => 15, :EQUALS => 16, :SEMICOLON => 17, :EOF => 18, :SLASHDASH => 19, :ESCLINE => 20 } racc_nt_base = 21 racc_use_result_var = false Racc_arg = [ racc_action_table, racc_action_check, racc_action_default, racc_action_pointer, racc_goto_table, racc_goto_check, racc_goto_default, racc_goto_pointer, racc_nt_base, racc_reduce_table, racc_token_table, racc_shift_n, racc_reduce_n, racc_use_result_var ] Racc_token_to_s_table = [ "$end", "error", "IDENT", "STRING", "RAWSTRING", "INTEGER", "FLOAT", "TRUE", "FALSE", "NULL", "WS", "NEWLINE", "LBRACE", "RBRACE", "LPAREN", "RPAREN", "EQUALS", "SEMICOLON", "EOF", "SLASHDASH", "ESCLINE", "$start", "document", "nodes", "linespaces", "none", "node", "empty_node", "untyped_node", "type", "node_decl", "node_term", "node_children", "empty_children", "identifier", "ws", "value", "ws_star", "property", "semicolon_term", "untyped_value", "boolean", "linespace" ] Racc_debug_parser = false ##### State transition tables end ##### # reduce 0 omitted module_eval(<<'.,.,', 'kdl.yy', 14) def _reduce_1(val, _values) KDL::Document.new(val[0]) end .,., module_eval(<<'.,.,', 'kdl.yy', 15) def _reduce_2(val, _values) KDL::Document.new([]) end .,., module_eval(<<'.,.,', 'kdl.yy', 17) def _reduce_3(val, _values) [] end .,., module_eval(<<'.,.,', 'kdl.yy', 18) def _reduce_4(val, _values) [val[1]] end .,., module_eval(<<'.,.,', 'kdl.yy', 19) def _reduce_5(val, _values) [] end .,., module_eval(<<'.,.,', 'kdl.yy', 20) def _reduce_6(val, _values) [*val[0], val[1]] end .,., module_eval(<<'.,.,', 'kdl.yy', 21) def _reduce_7(val, _values) val[0] end .,., module_eval(<<'.,.,', 'kdl.yy', 22) def _reduce_8(val, _values) val[0] end .,., module_eval(<<'.,.,', 'kdl.yy', 23) def _reduce_9(val, _values) val[1].as_type(val[0], @type_parsers.fetch(val[0], nil)) end .,., module_eval(<<'.,.,', 'kdl.yy', 24) def _reduce_10(val, _values) val[0].tap { |x| x.children = [] } end .,., module_eval(<<'.,.,', 'kdl.yy', 25) def _reduce_11(val, _values) val[0].tap { |x| x.children = val[1] } end .,., module_eval(<<'.,.,', 'kdl.yy', 26) def _reduce_12(val, _values) val[0].tap { |x| x.children = [] } end .,., module_eval(<<'.,.,', 'kdl.yy', 27) def _reduce_13(val, _values) KDL::Node.new(val[0]) end .,., module_eval(<<'.,.,', 'kdl.yy', 28) def _reduce_14(val, _values) val[0].tap { |x| x.arguments << val[2] } end .,., module_eval(<<'.,.,', 'kdl.yy', 29) def _reduce_15(val, _values) val[0] end .,., module_eval(<<'.,.,', 'kdl.yy', 30) def _reduce_16(val, _values) val[0].tap { |x| x.properties[val[2][0]] = val[2][1] } end .,., module_eval(<<'.,.,', 'kdl.yy', 31) def _reduce_17(val, _values) val[0] end .,., # reduce 18 omitted module_eval(<<'.,.,', 'kdl.yy', 33) def _reduce_19(val, _values) val[2] end .,., module_eval(<<'.,.,', 'kdl.yy', 34) def _reduce_20(val, _values) [] end .,., # reduce 21 omitted # reduce 22 omitted # reduce 23 omitted # reduce 24 omitted # reduce 25 omitted # reduce 26 omitted module_eval(<<'.,.,', 'kdl.yy', 40) def _reduce_27(val, _values) val[1] end .,., module_eval(<<'.,.,', 'kdl.yy', 42) def _reduce_28(val, _values) val[0].value end .,., module_eval(<<'.,.,', 'kdl.yy', 43) def _reduce_29(val, _values) val[0].value end .,., module_eval(<<'.,.,', 'kdl.yy', 44) def _reduce_30(val, _values) val[0].value end .,., module_eval(<<'.,.,', 'kdl.yy', 46) def _reduce_31(val, _values) [val[0], val[2]] end .,., # reduce 32 omitted module_eval(<<'.,.,', 'kdl.yy', 49) def _reduce_33(val, _values) val[1].as_type(val[0], @type_parsers.fetch(val[0], nil)) end .,., module_eval(<<'.,.,', 'kdl.yy', 51) def _reduce_34(val, _values) KDL::Value::String.new(val[0].value) end .,., module_eval(<<'.,.,', 'kdl.yy', 52) def _reduce_35(val, _values) KDL::Value::String.new(val[0].value) end .,., module_eval(<<'.,.,', 'kdl.yy', 53) def _reduce_36(val, _values) KDL::Value::Int.new(val[0].value) end .,., module_eval(<<'.,.,', 'kdl.yy', 54) def _reduce_37(val, _values) KDL::Value::Float.new(val[0].value, format: val[0].meta[:format]) end .,., module_eval(<<'.,.,', 'kdl.yy', 55) def _reduce_38(val, _values) KDL::Value::Boolean.new(val[0]) end .,., module_eval(<<'.,.,', 'kdl.yy', 56) def _reduce_39(val, _values) KDL::Value::Null end .,., module_eval(<<'.,.,', 'kdl.yy', 58) def _reduce_40(val, _values) true end .,., module_eval(<<'.,.,', 'kdl.yy', 59) def _reduce_41(val, _values) false end .,., # reduce 42 omitted # reduce 43 omitted # reduce 44 omitted # reduce 45 omitted # reduce 46 omitted # reduce 47 omitted # reduce 48 omitted # reduce 49 omitted # reduce 50 omitted # reduce 51 omitted # reduce 52 omitted # reduce 53 omitted module_eval(<<'.,.,', 'kdl.yy', 66) def _reduce_54(val, _values) nil end .,., def _reduce_none(val, _values) val[0] end end # class Parser end # module KDL ruby-kdl-1.0.3/lib/kdl/kdl.yy000066400000000000000000000061351444670406000157330ustar00rootroot00000000000000class KDL::Parser options no_result_var token IDENT STRING RAWSTRING INTEGER FLOAT TRUE FALSE NULL WS NEWLINE LBRACE RBRACE LPAREN RPAREN EQUALS SEMICOLON EOF SLASHDASH ESCLINE rule document : nodes { KDL::Document.new(val[0]) } | linespaces { KDL::Document.new([])} nodes : none { [] } | linespaces node { [val[1]] } | linespaces empty_node { [] } | nodes node { [*val[0], val[1]] } | nodes empty_node { val[0] } node : untyped_node { val[0] } | type untyped_node { val[1].as_type(val[0], @type_parsers.fetch(val[0], nil)) } untyped_node : node_decl node_term { val[0].tap { |x| x.children = [] } } | node_decl node_children node_term { val[0].tap { |x| x.children = val[1] } } | node_decl empty_children node_term { val[0].tap { |x| x.children = [] } } node_decl : identifier { KDL::Node.new(val[0]) } | node_decl ws value { val[0].tap { |x| x.arguments << val[2] } } | node_decl ws SLASHDASH ws_star value { val[0] } | node_decl ws property { val[0].tap { |x| x.properties[val[2][0]] = val[2][1] } } | node_decl ws SLASHDASH ws_star property { val[0] } empty_node : SLASHDASH ws_star node node_children : ws_star LBRACE nodes RBRACE { val[2] } | ws_star LBRACE linespaces RBRACE { [] } empty_children: SLASHDASH node_children | ws empty_children node_term: linespaces | semicolon_term semicolon_term: SEMICOLON | SEMICOLON linespaces type : LPAREN identifier RPAREN { val[1] } identifier: IDENT { val[0].value } | STRING { val[0].value } | RAWSTRING { val[0].value } property: identifier EQUALS value { [val[0], val[2]] } value : untyped_value | type untyped_value { val[1].as_type(val[0], @type_parsers.fetch(val[0], nil)) } untyped_value : STRING { KDL::Value::String.new(val[0].value) } | RAWSTRING { KDL::Value::String.new(val[0].value) } | INTEGER { KDL::Value::Int.new(val[0].value) } | FLOAT { KDL::Value::Float.new(val[0].value, format: val[0].meta[:format]) } | boolean { KDL::Value::Boolean.new(val[0]) } | NULL { KDL::Value::Null } boolean : TRUE { true } | FALSE { false } ws: WS | ESCLINE | WS ESCLINE | ESCLINE WS | WS ESCLINE WS ws_star: none | ws linespace: WS | NEWLINE | EOF linespaces: linespace | linespaces linespace none: { nil } ---- inner def parse(str, options = {}) if options.fetch(:parse_types, true) @type_parsers = ::KDL::Types::MAPPING.merge(options.fetch(:type_parsers, {})) else @type_parsers = {} end @tokenizer = ::KDL::Tokenizer.new(str) do_parse end private def next_token @tokenizer.next_token end ruby-kdl-1.0.3/lib/kdl/node.rb000066400000000000000000000027671444670406000160570ustar00rootroot00000000000000module KDL class Node attr_accessor :name, :arguments, :properties, :children, :type def initialize(name, arguments = [], properties = {}, children = [], type: nil) @name = name @arguments = arguments @properties = properties @children = children @type = type end def to_s(level = 0) indent = ' ' * level s = "#{indent}#{type ? "(#{id_to_s type})" : ''}#{id_to_s name}" unless arguments.empty? s += " #{arguments.map(&:to_s).join(' ')}" end unless properties.empty? s += " #{properties.map { |k, v| "#{id_to_s k}=#{v}" }.join(' ')}" end unless children.empty? s += " {\n" s += children.map { |c| "#{c.to_s(level + 1)}\n" }.join("\n") s += "#{indent}}" end s end def ==(other) return false unless other.is_a?(Node) name == other.name && arguments == other.arguments && properties == other.properties && children == other.children end def as_type(type, parser = nil) if parser.nil? @type = type self else result = parser.call(self, type) return self.as_type(type) if result.nil? unless result.is_a?(::KDL::Node) raise ArgumentError, "expected parser to return an instance of ::KDL::Node, got `#{result.class}'" end result end end private def id_to_s(id) StringDumper.stringify_identifier(id) end end end ruby-kdl-1.0.3/lib/kdl/string_dumper.rb000066400000000000000000000017471444670406000200110ustar00rootroot00000000000000module KDL module StringDumper class << self def call(string) %("#{string.each_char.map { |char| escape(char) }.join}") end def stringify_identifier(ident) if bare_identifier?(ident) ident else call(ident) end end private def print?(char) ' ' <= char && char <= '\x7e' end def escape(char) case char when "\n" then '\n' when "\r" then '\r' when "\t" then '\t' when '\\' then '\\\\' when '"' then '\"' when "\b" then '\b' when "\f" then '\f' else char end end def unicode_escape(char) "\\u{#{char.codepoints.first.to_s(16)}}" end def bare_identifier?(name) escape_chars = '\\\/(){}<>;\[\]=,"' name =~ /^([^0-9\-+\s#{escape_chars}][^\s#{escape_chars}]*|[\-+](?!true|false|null)[^0-9\s#{escape_chars}][^\s#{escape_chars}]*)$/ end end end end ruby-kdl-1.0.3/lib/kdl/tokenizer.rb000066400000000000000000000260511444670406000171340ustar00rootroot00000000000000require 'bigdecimal' module KDL class Tokenizer class Error < StandardError def initialize(message, line, column) super("#{message} (#{line}:#{column})") end end class Token attr_reader :type, :value, :line, :column, :meta def initialize(type, value, line, column, meta = {}) @type = type @value = value @line = line @column = column @meta = meta end def ==(other) return false unless other.is_a?(Token) type == other.type && value == other.value && line == other.line && column == other.column end def to_s "#{value.inspect} (#{line}:#{column})" end alias inspect to_s end attr_reader :index SYMBOLS = { '{' => :LBRACE, '}' => :RBRACE, '=' => :EQUALS, '=' => :EQUALS, ';' => :SEMICOLON } WHITEPACE = ["\u0009", "\u0020", "\u00A0", "\u1680", "\u2000", "\u2001", "\u2002", "\u2003", "\u2004", "\u2005", "\u2006", "\u2007", "\u2008", "\u2009", "\u200A", "\u202F", "\u205F", "\u3000" ] NEWLINES = ["\u000A", "\u0085", "\u000C", "\u2028", "\u2029"] NON_IDENTIFIER_CHARS = Regexp.escape "#{SYMBOLS.keys.join('')}()/\\<>[]\"," IDENTIFIER_CHARS = /[^#{NON_IDENTIFIER_CHARS}\x0-\x20]/ INITIAL_IDENTIFIER_CHARS = /[^#{NON_IDENTIFIER_CHARS}0-9\x0-\x20]/ ALLOWED_IN_TYPE = [:ident, :string, :rawstring] NOT_ALLOWED_AFTER_TYPE = [:single_line_comment, :multi_line_comment] def initialize(str, start = 0) @str = str @context = nil @rawstring_hashes = nil @index = start @buffer = "" @done = false @previous_context = nil @line = 1 @column = 1 @type_context = false @last_token = nil end def next_token @context = nil @previous_context = nil @line_at_start = @line @column_at_start = @column loop do c = @str[@index] case @context when nil case c when '"' self.context = :string @buffer = '' traverse(1) when 'r' if @str[@index + 1] == '"' self.context = :rawstring traverse(2) @rawstring_hashes = 0 @buffer = '' next elsif @str[@index + 1] == '#' i = @index + 1 @rawstring_hashes = 0 while @str[i] == '#' @rawstring_hashes += 1 i += 1 end if @str[i] == '"' self.context = :rawstring @index = i + 1 @buffer = '' next end end self.context = :ident @buffer = c traverse(1) when /[0-9\-+]/ n = @str[@index + 1] if c == '0' && n =~ /[box]/ traverse(2) @buffer = '' self.context = case n when 'b' then :binary when 'o' then :octal when 'x' then :hexadecimal end else self.context = :decimal @buffer = c traverse(1) end when '\\' t = Tokenizer.new(@str, @index + 1) la = t.next_token if la[0] == :NEWLINE || la[0] == :EOF || (la[0] == :WS && (lan = t.next_token[0]) == :NEWLINE || lan == :EOF) @index = t.index new_line return token(:ESCLINE, "\\#{la[1].value}") else raise_error "Unexpected '\\' (#{la[0]})" end when *SYMBOLS.keys return token(SYMBOLS[c], c).tap { traverse(1) } when "\r" n = @str[@index + 1] if n == "\n" return token(:NEWLINE, "#{c}#{n}").tap do traverse(2) new_line end else return token(:NEWLINE, c).tap do traverse(1) new_line end end when *NEWLINES return token(:NEWLINE, c).tap do traverse(1) new_line end when "/" if @str[@index + 1] == '/' self.context = :single_line_comment traverse(2) elsif @str[@index + 1] == '*' self.context = :multi_line_comment @comment_nesting = 1 traverse(2) elsif @str[@index + 1] == '-' return token(:SLASHDASH, '/-').tap { traverse(2) } else self.context = :ident @buffer = c traverse(1) end when *WHITEPACE self.context = :whitespace @buffer = c traverse(1) when nil return [false, token(:EOF, :EOF)[1]] if @done @done = true return token(:EOF, :EOF) when INITIAL_IDENTIFIER_CHARS self.context = :ident @buffer = c traverse(1) when '(' @type_context = true return token(:LPAREN, c).tap { traverse(1) } when ')' @type_context = false return token(:RPAREN, c).tap { traverse(1) } else raise_error "Unexpected character #{c.inspect}" end when :ident case c when IDENTIFIER_CHARS traverse(1) @buffer += c else case @buffer when 'true' then return token(:TRUE, true) when 'false' then return token(:FALSE, false) when 'null' then return token(:NULL, nil) else return token(:IDENT, @buffer) end end when :string case c when '\\' @buffer += c @buffer += @str[@index + 1] traverse(2) when '"' return token(:STRING, convert_escapes(@buffer)).tap { traverse(1) } when nil raise_error "Unterminated string literal" else @buffer += c traverse(1) end when :rawstring raise_error "Unterminated rawstring literal" if c.nil? if c == '"' h = 0 while @str[@index + 1 + h] == '#' && h < @rawstring_hashes h += 1 end if h == @rawstring_hashes return token(:RAWSTRING, @buffer).tap { traverse(1 + h) } end end @buffer += c traverse(1) when :decimal case c when /[0-9.\-+_eE]/ traverse(1) @buffer += c else return parse_decimal(@buffer) end when :hexadecimal case c when /[0-9a-fA-F_]/ traverse(1) @buffer += c else return parse_hexadecimal(@buffer) end when :octal case c when /[0-7_]/ traverse(1) @buffer += c else return parse_octal(@buffer) end when :binary case c when /[01_]/ traverse(1) @buffer += c else return parse_binary(@buffer) end when :single_line_comment if NEWLINES.include?(c) || c == "\r" self.context = nil @column_at_start = @column next elsif c.nil? @done = true return token(:EOF, :EOF) else traverse(1) end when :multi_line_comment if c == '/' && @str[@index + 1] == '*' @comment_nesting += 1 traverse(2) elsif c == '*' && @str[@index + 1] == '/' @comment_nesting -= 1 traverse(2) if @comment_nesting == 0 revert_context end else traverse(1) end when :whitespace if WHITEPACE.include?(c) traverse(1) @buffer += c elsif c == "/" && @str[@index + 1] == '*' self.context = :multi_line_comment @comment_nesting = 1 traverse(2) else return token(:WS, @buffer) end end end end private def token(type, value, **meta) @last_token = [type, Token.new(type, value, @line_at_start, @column_at_start, meta)] end def traverse(n = 1) @column += n @index += n end def raise_error(message) raise Error.new(message, @line, @column) end def new_line @column = 1 @line += 1 end def context=(val) if @type_context && !ALLOWED_IN_TYPE.include?(val) raise_error "#{val} context not allowed in type declaration" elsif @last_token && @last_token[0] == :RPAREN && NOT_ALLOWED_AFTER_TYPE.include?(val) raise_error 'Comments are not allowed after a type declaration' end @previous_context = @context @context = val end def revert_context @context = @previous_context @previous_context = nil end def parse_decimal(s) return parse_float(s) if s =~ /[.E]/i token(:INTEGER, Integer(munch_underscores(s), 10), format: '%d') rescue if s[0] =~ INITIAL_IDENTIFIER_CHARS && s[1..-1].each_char.all? { |c| c =~ IDENTIFIER_CHARS } token(:IDENT, s) else raise end end def parse_float(s) match, _, fraction, exponent = *s.match(/^([-+]?[\d_]+)(?:\.([\d_]+))?(?:[eE]([-+]?[\d_]+))?$/) raise_error "Invalid floating point value #{s}" if match.nil? s = munch_underscores(s) decimals = fraction.nil? ? 0 : fraction.size value = Float(s) scientific = value.abs >= 100 || (exponent && exponent.to_i.abs >= 2) if value.infinite? || (value.zero? && exponent.to_i < 0) token(:FLOAT, BigDecimal(s)) else token(:FLOAT, value, format: scientific ? "%.#{decimals}E" : nil) end end def parse_hexadecimal(s) token(:INTEGER, Integer(munch_underscores(s), 16)) end def parse_octal(s) token(:INTEGER, Integer(munch_underscores(s), 8)) end def parse_binary(s) token(:INTEGER, Integer(munch_underscores(s), 2)) end def munch_underscores(s) s.chomp('_').squeeze('_') end def convert_escapes(string) string.gsub(/\\[^u]/) do |m| case m when '\n' then "\n" when '\r' then "\r" when '\t' then "\t" when '\\\\' then "\\" when '\"' then "\"" when '\b' then "\b" when '\f' then "\f" when '\/' then "/" else raise_error "Unexpected escape #{m.inspect}" end end.gsub(/\\u\{[0-9a-fA-F]{0,6}\}/) do |m| i = Integer(m[3..-2], 16) if i < 0 || i > 0x10FFFF raise_error "Invalid code point #{u}" end i.chr(Encoding::UTF_8) end end end end ruby-kdl-1.0.3/lib/kdl/types.rb000066400000000000000000000007171444670406000162670ustar00rootroot00000000000000module KDL module Types MAPPING = {} end end require 'kdl/types/date_time' require 'kdl/types/duration' require 'kdl/types/currency' require 'kdl/types/country' require 'kdl/types/ip' require 'kdl/types/url' require 'kdl/types/uuid' require 'kdl/types/regex' require 'kdl/types/base64' require 'kdl/types/decimal' require 'kdl/types/hostname' require 'kdl/types/email' require 'kdl/types/irl' require 'kdl/types/url_template' KDL::Types::MAPPING.freeze ruby-kdl-1.0.3/lib/kdl/types/000077500000000000000000000000001444670406000157355ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/base64.rb000066400000000000000000000007231444670406000173500ustar00rootroot00000000000000require 'base64' module KDL module Types class Base64 < Value RGX = /^[A-Za-z0-9+\/=]+$/.freeze def self.call(value, type = 'base64') return nil unless value.is_a? ::KDL::Value::String unless RGX.match?(value.value) raise ArgumentError, "invalid base64: #{value.value}" end data = ::Base64.decode64(value.value) new(data, type: type) end end MAPPING['base64'] = Base64 end end ruby-kdl-1.0.3/lib/kdl/types/country.rb000066400000000000000000000040461444670406000177710ustar00rootroot00000000000000require 'kdl/types/country/iso3166_countries' require 'kdl/types/country/iso3166_subdivisions' module KDL module Types class Country < Value attr_reader :name, :alpha2, :alpha3, :numeric_code def initialize(value, format: nil, type: 'country-3') super @name = value.fetch(:name, '') @alpha3 = value.fetch(:alpha3, nil) @alpha2 = value.fetch(:alpha2, nil) @numeric_code = value.fetch(:numeric_code, nil) end def self.call(value, type = 'country-3') return nil unless value.is_a? ::KDL::Value::String country = COUNTRIES3[value.value.upcase] raise ArgumentError, 'invalid country-3' if country.nil? new(country, type: type) end end Country3 = Country MAPPING['country-3'] = Country3 class Country2 < Country def initialize(value, format: nil, type: 'country-2') super end def self.call(value, type = 'country-2') return nil unless value.is_a? ::KDL::Value::String country = COUNTRIES2[value.value.upcase] raise ArgumentError, 'invalid country-3' if country.nil? new(country, type: type) end end MAPPING['country-2'] = Country2 class CountrySubdivision < Value attr_reader :country, :name def initialize(value, type: 'country-subdivision', country:, name:, **kwargs) super(value, type: type, **kwargs) @country = country @name = name end def self.call(value, type = 'country-subdivision') return nil unless value.is_a? ::KDL::Value::String country2 = value.value.split('-').first country = Country::COUNTRIES2[country2.upcase] raise ArgumentError, 'invalid country' unless country subdivision = COUNTRY_SUBDIVISIONS.dig(country2.upcase, value.value) raise ArgumentError, 'invalid country subdivision' unless subdivision new(value.value, type: type, name: subdivision, country: country) end end MAPPING['country-subdivision'] = CountrySubdivision end end ruby-kdl-1.0.3/lib/kdl/types/country/000077500000000000000000000000001444670406000174405ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/country/iso3166_countries.rb000066400000000000000000001006531444670406000231770ustar00rootroot00000000000000module KDL module Types class Country < Value # From: https://en.wikipedia.org/wiki/ISO_3166-1#Current_codes COUNTRIES3 = { 'AFG' => { alpha3: 'AFG', alpha2: 'AF', numeric_code: 4, name: 'Afghanistan' }.freeze, 'ALA' => { alpha3: 'ALA', alpha2: 'AX', numeric_code: 248, name: 'Åland Islands' }.freeze, 'ALB' => { alpha3: 'ALB', alpha2: 'AL', numeric_code: 8, name: 'Albania' }.freeze, 'DZA' => { alpha3: 'DZA', alpha2: 'DZ', numeric_code: 12, name: 'Algeria' }.freeze, 'ASM' => { alpha3: 'ASM', alpha2: 'AS', numeric_code: 16, name: 'American Samoa' }.freeze, 'AND' => { alpha3: 'AND', alpha2: 'AD', numeric_code: 20, name: 'Andorra' }.freeze, 'AGO' => { alpha3: 'AGO', alpha2: 'AO', numeric_code: 24, name: 'Angola' }.freeze, 'AIA' => { alpha3: 'AIA', alpha2: 'AI', numeric_code: 660, name: 'Anguilla' }.freeze, 'ATA' => { alpha3: 'ATA', alpha2: 'AQ', numeric_code: 10, name: 'Antarctica' }.freeze, 'ATG' => { alpha3: 'ATG', alpha2: 'AG', numeric_code: 28, name: 'Antigua and Barbuda' }.freeze, 'ARG' => { alpha3: 'ARG', alpha2: 'AR', numeric_code: 32, name: 'Argentina' }.freeze, 'ARM' => { alpha3: 'ARM', alpha2: 'AM', numeric_code: 51, name: 'Armenia' }.freeze, 'ABW' => { alpha3: 'ABW', alpha2: 'AW', numeric_code: 533, name: 'Aruba' }.freeze, 'AUS' => { alpha3: 'AUS', alpha2: 'AU', numeric_code: 36, name: 'Australia' }.freeze, 'AUT' => { alpha3: 'AUT', alpha2: 'AT', numeric_code: 40, name: 'Austria' }.freeze, 'AZE' => { alpha3: 'AZE', alpha2: 'AZ', numeric_code: 31, name: 'Azerbaijan' }.freeze, 'BHS' => { alpha3: 'BHS', alpha2: 'BS', numeric_code: 44, name: 'Bahamas' }.freeze, 'BHR' => { alpha3: 'BHR', alpha2: 'BH', numeric_code: 48, name: 'Bahrain' }.freeze, 'BGD' => { alpha3: 'BGD', alpha2: 'BD', numeric_code: 50, name: 'Bangladesh' }.freeze, 'BRB' => { alpha3: 'BRB', alpha2: 'BB', numeric_code: 52, name: 'Barbados' }.freeze, 'BLR' => { alpha3: 'BLR', alpha2: 'BY', numeric_code: 112, name: 'Belarus' }.freeze, 'BEL' => { alpha3: 'BEL', alpha2: 'BE', numeric_code: 56, name: 'Belgium' }.freeze, 'BLZ' => { alpha3: 'BLZ', alpha2: 'BZ', numeric_code: 84, name: 'Belize' }.freeze, 'BEN' => { alpha3: 'BEN', alpha2: 'BJ', numeric_code: 204, name: 'Benin' }.freeze, 'BMU' => { alpha3: 'BMU', alpha2: 'BM', numeric_code: 60, name: 'Bermuda' }.freeze, 'BTN' => { alpha3: 'BTN', alpha2: 'BT', numeric_code: 64, name: 'Bhutan' }.freeze, 'BOL' => { alpha3: 'BOL', alpha2: 'BO', numeric_code: 68, name: 'Bolivia (Plurinational State of)' }.freeze, 'BES' => { alpha3: 'BES', alpha2: 'BQ', numeric_code: 535, name: 'Bonaire, Sint Eustatius and Saba[d]' }.freeze, 'BIH' => { alpha3: 'BIH', alpha2: 'BA', numeric_code: 70, name: 'Bosnia and Herzegovina' }.freeze, 'BWA' => { alpha3: 'BWA', alpha2: 'BW', numeric_code: 72, name: 'Botswana' }.freeze, 'BVT' => { alpha3: 'BVT', alpha2: 'BV', numeric_code: 74, name: 'Bouvet Island' }.freeze, 'BRA' => { alpha3: 'BRA', alpha2: 'BR', numeric_code: 76, name: 'Brazil' }.freeze, 'IOT' => { alpha3: 'IOT', alpha2: 'IO', numeric_code: 86, name: 'British Indian Ocean Territory' }.freeze, 'BRN' => { alpha3: 'BRN', alpha2: 'BN', numeric_code: 96, name: 'Brunei Darussalam' }.freeze, 'BGR' => { alpha3: 'BGR', alpha2: 'BG', numeric_code: 100, name: 'Bulgaria' }.freeze, 'BFA' => { alpha3: 'BFA', alpha2: 'BF', numeric_code: 854, name: 'Burkina Faso' }.freeze, 'BDI' => { alpha3: 'BDI', alpha2: 'BI', numeric_code: 108, name: 'Burundi' }.freeze, 'CPV' => { alpha3: 'CPV', alpha2: 'CV', numeric_code: 132, name: 'Cabo Verde' }.freeze, 'KHM' => { alpha3: 'KHM', alpha2: 'KH', numeric_code: 116, name: 'Cambodia' }.freeze, 'CMR' => { alpha3: 'CMR', alpha2: 'CM', numeric_code: 120, name: 'Cameroon' }.freeze, 'CAN' => { alpha3: 'CAN', alpha2: 'CA', numeric_code: 124, name: 'Canada' }.freeze, 'CYM' => { alpha3: 'CYM', alpha2: 'KY', numeric_code: 136, name: 'Cayman Islands' }.freeze, 'CAF' => { alpha3: 'CAF', alpha2: 'CF', numeric_code: 140, name: 'Central African Republic' }.freeze, 'TCD' => { alpha3: 'TCD', alpha2: 'TD', numeric_code: 148, name: 'Chad' }.freeze, 'CHL' => { alpha3: 'CHL', alpha2: 'CL', numeric_code: 152, name: 'Chile' }.freeze, 'CHN' => { alpha3: 'CHN', alpha2: 'CN', numeric_code: 156, name: 'China' }.freeze, 'CXR' => { alpha3: 'CXR', alpha2: 'CX', numeric_code: 162, name: 'Christmas Island' }.freeze, 'CCK' => { alpha3: 'CCK', alpha2: 'CC', numeric_code: 166, name: 'Cocos (Keeling) Islands' }.freeze, 'COL' => { alpha3: 'COL', alpha2: 'CO', numeric_code: 170, name: 'Colombia' }.freeze, 'COM' => { alpha3: 'COM', alpha2: 'KM', numeric_code: 174, name: 'Comoros' }.freeze, 'COG' => { alpha3: 'COG', alpha2: 'CG', numeric_code: 178, name: 'Congo' }.freeze, 'COD' => { alpha3: 'COD', alpha2: 'CD', numeric_code: 180, name: 'Congo, Democratic Republic of the' }.freeze, 'COK' => { alpha3: 'COK', alpha2: 'CK', numeric_code: 184, name: 'Cook Islands' }.freeze, 'CRI' => { alpha3: 'CRI', alpha2: 'CR', numeric_code: 188, name: 'Costa Rica' }.freeze, 'CIV' => { alpha3: 'CIV', alpha2: 'CI', numeric_code: 384, name: 'Côte d\'Ivoire' }.freeze, 'HRV' => { alpha3: 'HRV', alpha2: 'HR', numeric_code: 191, name: 'Croatia' }.freeze, 'CUB' => { alpha3: 'CUB', alpha2: 'CU', numeric_code: 192, name: 'Cuba' }.freeze, 'CUW' => { alpha3: 'CUW', alpha2: 'CW', numeric_code: 531, name: 'Curaçao' }.freeze, 'CYP' => { alpha3: 'CYP', alpha2: 'CY', numeric_code: 196, name: 'Cyprus' }.freeze, 'CZE' => { alpha3: 'CZE', alpha2: 'CZ', numeric_code: 203, name: 'Czechia' }.freeze, 'DNK' => { alpha3: 'DNK', alpha2: 'DK', numeric_code: 208, name: 'Denmark' }.freeze, 'DJI' => { alpha3: 'DJI', alpha2: 'DJ', numeric_code: 262, name: 'Djibouti' }.freeze, 'DMA' => { alpha3: 'DMA', alpha2: 'DM', numeric_code: 212, name: 'Dominica' }.freeze, 'DOM' => { alpha3: 'DOM', alpha2: 'DO', numeric_code: 214, name: 'Dominican Republic' }.freeze, 'ECU' => { alpha3: 'ECU', alpha2: 'EC', numeric_code: 218, name: 'Ecuador' }.freeze, 'EGY' => { alpha3: 'EGY', alpha2: 'EG', numeric_code: 818, name: 'Egypt' }.freeze, 'SLV' => { alpha3: 'SLV', alpha2: 'SV', numeric_code: 222, name: 'El Salvador' }.freeze, 'GNQ' => { alpha3: 'GNQ', alpha2: 'GQ', numeric_code: 226, name: 'Equatorial Guinea' }.freeze, 'ERI' => { alpha3: 'ERI', alpha2: 'ER', numeric_code: 232, name: 'Eritrea' }.freeze, 'EST' => { alpha3: 'EST', alpha2: 'EE', numeric_code: 233, name: 'Estonia' }.freeze, 'SWZ' => { alpha3: 'SWZ', alpha2: 'SZ', numeric_code: 748, name: 'Eswatini' }.freeze, 'ETH' => { alpha3: 'ETH', alpha2: 'ET', numeric_code: 231, name: 'Ethiopia' }.freeze, 'FLK' => { alpha3: 'FLK', alpha2: 'FK', numeric_code: 238, name: 'Falkland Islands (Malvinas)' }.freeze, 'FRO' => { alpha3: 'FRO', alpha2: 'FO', numeric_code: 234, name: 'Faroe Islands' }.freeze, 'FJI' => { alpha3: 'FJI', alpha2: 'FJ', numeric_code: 242, name: 'Fiji' }.freeze, 'FIN' => { alpha3: 'FIN', alpha2: 'FI', numeric_code: 246, name: 'Finland' }.freeze, 'FRA' => { alpha3: 'FRA', alpha2: 'FR', numeric_code: 250, name: 'France' }.freeze, 'GUF' => { alpha3: 'GUF', alpha2: 'GF', numeric_code: 254, name: 'French Guiana' }.freeze, 'PYF' => { alpha3: 'PYF', alpha2: 'PF', numeric_code: 258, name: 'French Polynesia' }.freeze, 'ATF' => { alpha3: 'ATF', alpha2: 'TF', numeric_code: 260, name: 'French Southern Territories' }.freeze, 'GAB' => { alpha3: 'GAB', alpha2: 'GA', numeric_code: 266, name: 'Gabon' }.freeze, 'GMB' => { alpha3: 'GMB', alpha2: 'GM', numeric_code: 270, name: 'Gambia' }.freeze, 'GEO' => { alpha3: 'GEO', alpha2: 'GE', numeric_code: 268, name: 'Georgia' }.freeze, 'DEU' => { alpha3: 'DEU', alpha2: 'DE', numeric_code: 276, name: 'Germany' }.freeze, 'GHA' => { alpha3: 'GHA', alpha2: 'GH', numeric_code: 288, name: 'Ghana' }.freeze, 'GIB' => { alpha3: 'GIB', alpha2: 'GI', numeric_code: 292, name: 'Gibraltar' }.freeze, 'GRC' => { alpha3: 'GRC', alpha2: 'GR', numeric_code: 300, name: 'Greece' }.freeze, 'GRL' => { alpha3: 'GRL', alpha2: 'GL', numeric_code: 304, name: 'Greenland' }.freeze, 'GRD' => { alpha3: 'GRD', alpha2: 'GD', numeric_code: 308, name: 'Grenada' }.freeze, 'GLP' => { alpha3: 'GLP', alpha2: 'GP', numeric_code: 312, name: 'Guadeloupe' }.freeze, 'GUM' => { alpha3: 'GUM', alpha2: 'GU', numeric_code: 316, name: 'Guam' }.freeze, 'GTM' => { alpha3: 'GTM', alpha2: 'GT', numeric_code: 320, name: 'Guatemala' }.freeze, 'GGY' => { alpha3: 'GGY', alpha2: 'GG', numeric_code: 831, name: 'Guernsey' }.freeze, 'GIN' => { alpha3: 'GIN', alpha2: 'GN', numeric_code: 324, name: 'Guinea' }.freeze, 'GNB' => { alpha3: 'GNB', alpha2: 'GW', numeric_code: 624, name: 'Guinea-Bissau' }.freeze, 'GUY' => { alpha3: 'GUY', alpha2: 'GY', numeric_code: 328, name: 'Guyana' }.freeze, 'HTI' => { alpha3: 'HTI', alpha2: 'HT', numeric_code: 332, name: 'Haiti' }.freeze, 'HMD' => { alpha3: 'HMD', alpha2: 'HM', numeric_code: 334, name: 'Heard Island and McDonald Islands' }.freeze, 'VAT' => { alpha3: 'VAT', alpha2: 'VA', numeric_code: 336, name: 'Holy See' }.freeze, 'HND' => { alpha3: 'HND', alpha2: 'HN', numeric_code: 340, name: 'Honduras' }.freeze, 'HKG' => { alpha3: 'HKG', alpha2: 'HK', numeric_code: 344, name: 'Hong Kong' }.freeze, 'HUN' => { alpha3: 'HUN', alpha2: 'HU', numeric_code: 348, name: 'Hungary' }.freeze, 'ISL' => { alpha3: 'ISL', alpha2: 'IS', numeric_code: 352, name: 'Iceland' }.freeze, 'IND' => { alpha3: 'IND', alpha2: 'IN', numeric_code: 356, name: 'India' }.freeze, 'IDN' => { alpha3: 'IDN', alpha2: 'ID', numeric_code: 360, name: 'Indonesia' }.freeze, 'IRN' => { alpha3: 'IRN', alpha2: 'IR', numeric_code: 364, name: 'Iran (Islamic Republic of)' }.freeze, 'IRQ' => { alpha3: 'IRQ', alpha2: 'IQ', numeric_code: 368, name: 'Iraq' }.freeze, 'IRL' => { alpha3: 'IRL', alpha2: 'IE', numeric_code: 372, name: 'Ireland' }.freeze, 'IMN' => { alpha3: 'IMN', alpha2: 'IM', numeric_code: 833, name: 'Isle of Man' }.freeze, 'ISR' => { alpha3: 'ISR', alpha2: 'IL', numeric_code: 376, name: 'Israel' }.freeze, 'ITA' => { alpha3: 'ITA', alpha2: 'IT', numeric_code: 380, name: 'Italy' }.freeze, 'JAM' => { alpha3: 'JAM', alpha2: 'JM', numeric_code: 388, name: 'Jamaica' }.freeze, 'JPN' => { alpha3: 'JPN', alpha2: 'JP', numeric_code: 392, name: 'Japan' }.freeze, 'JEY' => { alpha3: 'JEY', alpha2: 'JE', numeric_code: 832, name: 'Jersey' }.freeze, 'JOR' => { alpha3: 'JOR', alpha2: 'JO', numeric_code: 400, name: 'Jordan' }.freeze, 'KAZ' => { alpha3: 'KAZ', alpha2: 'KZ', numeric_code: 398, name: 'Kazakhstan' }.freeze, 'KEN' => { alpha3: 'KEN', alpha2: 'KE', numeric_code: 404, name: 'Kenya' }.freeze, 'KIR' => { alpha3: 'KIR', alpha2: 'KI', numeric_code: 296, name: 'Kiribati' }.freeze, 'PRK' => { alpha3: 'PRK', alpha2: 'KP', numeric_code: 408, name: 'Korea (Democratic People\'s Republic of)' }.freeze, 'KOR' => { alpha3: 'KOR', alpha2: 'KR', numeric_code: 410, name: 'Korea, Republic of' }.freeze, 'KWT' => { alpha3: 'KWT', alpha2: 'KW', numeric_code: 414, name: 'Kuwait' }.freeze, 'KGZ' => { alpha3: 'KGZ', alpha2: 'KG', numeric_code: 417, name: 'Kyrgyzstan' }.freeze, 'LAO' => { alpha3: 'LAO', alpha2: 'LA', numeric_code: 418, name: 'Lao People\'s Democratic Republic' }.freeze, 'LVA' => { alpha3: 'LVA', alpha2: 'LV', numeric_code: 428, name: 'Latvia' }.freeze, 'LBN' => { alpha3: 'LBN', alpha2: 'LB', numeric_code: 422, name: 'Lebanon' }.freeze, 'LSO' => { alpha3: 'LSO', alpha2: 'LS', numeric_code: 426, name: 'Lesotho' }.freeze, 'LBR' => { alpha3: 'LBR', alpha2: 'LR', numeric_code: 430, name: 'Liberia' }.freeze, 'LBY' => { alpha3: 'LBY', alpha2: 'LY', numeric_code: 434, name: 'Libya' }.freeze, 'LIE' => { alpha3: 'LIE', alpha2: 'LI', numeric_code: 438, name: 'Liechtenstein' }.freeze, 'LTU' => { alpha3: 'LTU', alpha2: 'LT', numeric_code: 440, name: 'Lithuania' }.freeze, 'LUX' => { alpha3: 'LUX', alpha2: 'LU', numeric_code: 442, name: 'Luxembourg' }.freeze, 'MAC' => { alpha3: 'MAC', alpha2: 'MO', numeric_code: 446, name: 'Macao' }.freeze, 'MDG' => { alpha3: 'MDG', alpha2: 'MG', numeric_code: 450, name: 'Madagascar' }.freeze, 'MWI' => { alpha3: 'MWI', alpha2: 'MW', numeric_code: 454, name: 'Malawi' }.freeze, 'MYS' => { alpha3: 'MYS', alpha2: 'MY', numeric_code: 458, name: 'Malaysia' }.freeze, 'MDV' => { alpha3: 'MDV', alpha2: 'MV', numeric_code: 462, name: 'Maldives' }.freeze, 'MLI' => { alpha3: 'MLI', alpha2: 'ML', numeric_code: 466, name: 'Mali' }.freeze, 'MLT' => { alpha3: 'MLT', alpha2: 'MT', numeric_code: 470, name: 'Malta' }.freeze, 'MHL' => { alpha3: 'MHL', alpha2: 'MH', numeric_code: 584, name: 'Marshall Islands' }.freeze, 'MTQ' => { alpha3: 'MTQ', alpha2: 'MQ', numeric_code: 474, name: 'Martinique' }.freeze, 'MRT' => { alpha3: 'MRT', alpha2: 'MR', numeric_code: 478, name: 'Mauritania' }.freeze, 'MUS' => { alpha3: 'MUS', alpha2: 'MU', numeric_code: 480, name: 'Mauritius' }.freeze, 'MYT' => { alpha3: 'MYT', alpha2: 'YT', numeric_code: 175, name: 'Mayotte' }.freeze, 'MEX' => { alpha3: 'MEX', alpha2: 'MX', numeric_code: 484, name: 'Mexico' }.freeze, 'FSM' => { alpha3: 'FSM', alpha2: 'FM', numeric_code: 583, name: 'Micronesia (Federated States of)' }.freeze, 'MDA' => { alpha3: 'MDA', alpha2: 'MD', numeric_code: 498, name: 'Moldova, Republic of' }.freeze, 'MCO' => { alpha3: 'MCO', alpha2: 'MC', numeric_code: 492, name: 'Monaco' }.freeze, 'MNG' => { alpha3: 'MNG', alpha2: 'MN', numeric_code: 496, name: 'Mongolia' }.freeze, 'MNE' => { alpha3: 'MNE', alpha2: 'ME', numeric_code: 499, name: 'Montenegro' }.freeze, 'MSR' => { alpha3: 'MSR', alpha2: 'MS', numeric_code: 500, name: 'Montserrat' }.freeze, 'MAR' => { alpha3: 'MAR', alpha2: 'MA', numeric_code: 504, name: 'Morocco' }.freeze, 'MOZ' => { alpha3: 'MOZ', alpha2: 'MZ', numeric_code: 508, name: 'Mozambique' }.freeze, 'MMR' => { alpha3: 'MMR', alpha2: 'MM', numeric_code: 104, name: 'Myanmar' }.freeze, 'NAM' => { alpha3: 'NAM', alpha2: 'NA', numeric_code: 516, name: 'Namibia' }.freeze, 'NRU' => { alpha3: 'NRU', alpha2: 'NR', numeric_code: 520, name: 'Nauru' }.freeze, 'NPL' => { alpha3: 'NPL', alpha2: 'NP', numeric_code: 524, name: 'Nepal' }.freeze, 'NLD' => { alpha3: 'NLD', alpha2: 'NL', numeric_code: 528, name: 'Netherlands' }.freeze, 'NCL' => { alpha3: 'NCL', alpha2: 'NC', numeric_code: 540, name: 'New Caledonia' }.freeze, 'NZL' => { alpha3: 'NZL', alpha2: 'NZ', numeric_code: 554, name: 'New Zealand' }.freeze, 'NIC' => { alpha3: 'NIC', alpha2: 'NI', numeric_code: 558, name: 'Nicaragua' }.freeze, 'NER' => { alpha3: 'NER', alpha2: 'NE', numeric_code: 562, name: 'Niger' }.freeze, 'NGA' => { alpha3: 'NGA', alpha2: 'NG', numeric_code: 566, name: 'Nigeria' }.freeze, 'NIU' => { alpha3: 'NIU', alpha2: 'NU', numeric_code: 570, name: 'Niue' }.freeze, 'NFK' => { alpha3: 'NFK', alpha2: 'NF', numeric_code: 574, name: 'Norfolk Island' }.freeze, 'MKD' => { alpha3: 'MKD', alpha2: 'MK', numeric_code: 807, name: 'North Macedonia' }.freeze, 'MNP' => { alpha3: 'MNP', alpha2: 'MP', numeric_code: 580, name: 'Northern Mariana Islands' }.freeze, 'NOR' => { alpha3: 'NOR', alpha2: 'NO', numeric_code: 578, name: 'Norway' }.freeze, 'OMN' => { alpha3: 'OMN', alpha2: 'OM', numeric_code: 512, name: 'Oman' }.freeze, 'PAK' => { alpha3: 'PAK', alpha2: 'PK', numeric_code: 586, name: 'Pakistan' }.freeze, 'PLW' => { alpha3: 'PLW', alpha2: 'PW', numeric_code: 585, name: 'Palau' }.freeze, 'PSE' => { alpha3: 'PSE', alpha2: 'PS', numeric_code: 275, name: 'Palestine, State of' }.freeze, 'PAN' => { alpha3: 'PAN', alpha2: 'PA', numeric_code: 591, name: 'Panama' }.freeze, 'PNG' => { alpha3: 'PNG', alpha2: 'PG', numeric_code: 598, name: 'Papua New Guinea' }.freeze, 'PRY' => { alpha3: 'PRY', alpha2: 'PY', numeric_code: 600, name: 'Paraguay' }.freeze, 'PER' => { alpha3: 'PER', alpha2: 'PE', numeric_code: 604, name: 'Peru' }.freeze, 'PHL' => { alpha3: 'PHL', alpha2: 'PH', numeric_code: 608, name: 'Philippines' }.freeze, 'PCN' => { alpha3: 'PCN', alpha2: 'PN', numeric_code: 612, name: 'Pitcairn' }.freeze, 'POL' => { alpha3: 'POL', alpha2: 'PL', numeric_code: 616, name: 'Poland' }.freeze, 'PRT' => { alpha3: 'PRT', alpha2: 'PT', numeric_code: 620, name: 'Portugal' }.freeze, 'PRI' => { alpha3: 'PRI', alpha2: 'PR', numeric_code: 630, name: 'Puerto Rico' }.freeze, 'QAT' => { alpha3: 'QAT', alpha2: 'QA', numeric_code: 634, name: 'Qatar' }.freeze, 'REU' => { alpha3: 'REU', alpha2: 'RE', numeric_code: 638, name: 'Réunion' }.freeze, 'ROU' => { alpha3: 'ROU', alpha2: 'RO', numeric_code: 642, name: 'Romania' }.freeze, 'RUS' => { alpha3: 'RUS', alpha2: 'RU', numeric_code: 643, name: 'Russian Federation' }.freeze, 'RWA' => { alpha3: 'RWA', alpha2: 'RW', numeric_code: 646, name: 'Rwanda' }.freeze, 'BLM' => { alpha3: 'BLM', alpha2: 'BL', numeric_code: 652, name: 'Saint Barthélemy' }.freeze, 'SHN' => { alpha3: 'SHN', alpha2: 'SH', numeric_code: 654, name: 'Saint Helena, Ascension and Tristan da Cunha[e]' }.freeze, 'KNA' => { alpha3: 'KNA', alpha2: 'KN', numeric_code: 659, name: 'Saint Kitts and Nevis' }.freeze, 'LCA' => { alpha3: 'LCA', alpha2: 'LC', numeric_code: 662, name: 'Saint Lucia' }.freeze, 'MAF' => { alpha3: 'MAF', alpha2: 'MF', numeric_code: 663, name: 'Saint Martin (French part)' }.freeze, 'SPM' => { alpha3: 'SPM', alpha2: 'PM', numeric_code: 666, name: 'Saint Pierre and Miquelon' }.freeze, 'VCT' => { alpha3: 'VCT', alpha2: 'VC', numeric_code: 670, name: 'Saint Vincent and the Grenadines' }.freeze, 'WSM' => { alpha3: 'WSM', alpha2: 'WS', numeric_code: 882, name: 'Samoa' }.freeze, 'SMR' => { alpha3: 'SMR', alpha2: 'SM', numeric_code: 674, name: 'San Marino' }.freeze, 'STP' => { alpha3: 'STP', alpha2: 'ST', numeric_code: 678, name: 'Sao Tome and Principe' }.freeze, 'SAU' => { alpha3: 'SAU', alpha2: 'SA', numeric_code: 682, name: 'Saudi Arabia' }.freeze, 'SEN' => { alpha3: 'SEN', alpha2: 'SN', numeric_code: 686, name: 'Senegal' }.freeze, 'SRB' => { alpha3: 'SRB', alpha2: 'RS', numeric_code: 688, name: 'Serbia' }.freeze, 'SYC' => { alpha3: 'SYC', alpha2: 'SC', numeric_code: 690, name: 'Seychelles' }.freeze, 'SLE' => { alpha3: 'SLE', alpha2: 'SL', numeric_code: 694, name: 'Sierra Leone' }.freeze, 'SGP' => { alpha3: 'SGP', alpha2: 'SG', numeric_code: 702, name: 'Singapore' }.freeze, 'SXM' => { alpha3: 'SXM', alpha2: 'SX', numeric_code: 534, name: 'Sint Maarten (Dutch part)' }.freeze, 'SVK' => { alpha3: 'SVK', alpha2: 'SK', numeric_code: 703, name: 'Slovakia' }.freeze, 'SVN' => { alpha3: 'SVN', alpha2: 'SI', numeric_code: 705, name: 'Slovenia' }.freeze, 'SLB' => { alpha3: 'SLB', alpha2: 'SB', numeric_code: 90, name: 'Solomon Islands' }.freeze, 'SOM' => { alpha3: 'SOM', alpha2: 'SO', numeric_code: 706, name: 'Somalia' }.freeze, 'ZAF' => { alpha3: 'ZAF', alpha2: 'ZA', numeric_code: 710, name: 'South Africa' }.freeze, 'SGS' => { alpha3: 'SGS', alpha2: 'GS', numeric_code: 239, name: 'South Georgia and the South Sandwich Islands' }.freeze, 'SSD' => { alpha3: 'SSD', alpha2: 'SS', numeric_code: 728, name: 'South Sudan' }.freeze, 'ESP' => { alpha3: 'ESP', alpha2: 'ES', numeric_code: 724, name: 'Spain' }.freeze, 'LKA' => { alpha3: 'LKA', alpha2: 'LK', numeric_code: 144, name: 'Sri Lanka' }.freeze, 'SDN' => { alpha3: 'SDN', alpha2: 'SD', numeric_code: 729, name: 'Sudan' }.freeze, 'SUR' => { alpha3: 'SUR', alpha2: 'SR', numeric_code: 740, name: 'Suriname' }.freeze, 'SJM' => { alpha3: 'SJM', alpha2: 'SJ', numeric_code: 744, name: 'Svalbard and Jan Mayen[f]' }.freeze, 'SWE' => { alpha3: 'SWE', alpha2: 'SE', numeric_code: 752, name: 'Sweden' }.freeze, 'CHE' => { alpha3: 'CHE', alpha2: 'CH', numeric_code: 756, name: 'Switzerland' }.freeze, 'SYR' => { alpha3: 'SYR', alpha2: 'SY', numeric_code: 760, name: 'Syrian Arab Republic' }.freeze, 'TWN' => { alpha3: 'TWN', alpha2: 'TW', numeric_code: 158, name: 'Taiwan, Province of China' }.freeze, 'TJK' => { alpha3: 'TJK', alpha2: 'TJ', numeric_code: 762, name: 'Tajikistan' }.freeze, 'TZA' => { alpha3: 'TZA', alpha2: 'TZ', numeric_code: 834, name: 'Tanzania, United Republic of' }.freeze, 'THA' => { alpha3: 'THA', alpha2: 'TH', numeric_code: 764, name: 'Thailand' }.freeze, 'TLS' => { alpha3: 'TLS', alpha2: 'TL', numeric_code: 626, name: 'Timor-Leste' }.freeze, 'TGO' => { alpha3: 'TGO', alpha2: 'TG', numeric_code: 768, name: 'Togo' }.freeze, 'TKL' => { alpha3: 'TKL', alpha2: 'TK', numeric_code: 772, name: 'Tokelau' }.freeze, 'TON' => { alpha3: 'TON', alpha2: 'TO', numeric_code: 776, name: 'Tonga' }.freeze, 'TTO' => { alpha3: 'TTO', alpha2: 'TT', numeric_code: 780, name: 'Trinidad and Tobago' }.freeze, 'TUN' => { alpha3: 'TUN', alpha2: 'TN', numeric_code: 788, name: 'Tunisia' }.freeze, 'TUR' => { alpha3: 'TUR', alpha2: 'TR', numeric_code: 792, name: 'Turkey' }.freeze, 'TKM' => { alpha3: 'TKM', alpha2: 'TM', numeric_code: 795, name: 'Turkmenistan' }.freeze, 'TCA' => { alpha3: 'TCA', alpha2: 'TC', numeric_code: 796, name: 'Turks and Caicos Islands' }.freeze, 'TUV' => { alpha3: 'TUV', alpha2: 'TV', numeric_code: 798, name: 'Tuvalu' }.freeze, 'UGA' => { alpha3: 'UGA', alpha2: 'UG', numeric_code: 800, name: 'Uganda' }.freeze, 'UKR' => { alpha3: 'UKR', alpha2: 'UA', numeric_code: 804, name: 'Ukraine' }.freeze, 'ARE' => { alpha3: 'ARE', alpha2: 'AE', numeric_code: 784, name: 'United Arab Emirates' }.freeze, 'GBR' => { alpha3: 'GBR', alpha2: 'GB', numeric_code: 826, name: 'United Kingdom of Great Britain and Northern Ireland' }.freeze, 'USA' => { alpha3: 'USA', alpha2: 'US', numeric_code: 840, name: 'United States of America' }.freeze, 'UMI' => { alpha3: 'UMI', alpha2: 'UM', numeric_code: 581, name: 'United States Minor Outlying Islands[h]' }.freeze, 'URY' => { alpha3: 'URY', alpha2: 'UY', numeric_code: 858, name: 'Uruguay' }.freeze, 'UZB' => { alpha3: 'UZB', alpha2: 'UZ', numeric_code: 860, name: 'Uzbekistan' }.freeze, 'VUT' => { alpha3: 'VUT', alpha2: 'VU', numeric_code: 548, name: 'Vanuatu' }.freeze, 'VEN' => { alpha3: 'VEN', alpha2: 'VE', numeric_code: 862, name: 'Venezuela (Bolivarian Republic of)' }.freeze, 'VNM' => { alpha3: 'VNM', alpha2: 'VN', numeric_code: 704, name: 'Viet Nam' }.freeze, 'VGB' => { alpha3: 'VGB', alpha2: 'VG', numeric_code: 92, name: 'Virgin Islands (British)' }.freeze, 'VIR' => { alpha3: 'VIR', alpha2: 'VI', numeric_code: 850, name: 'Virgin Islands (U.S.)' }.freeze, 'WLF' => { alpha3: 'WLF', alpha2: 'WF', numeric_code: 876, name: 'Wallis and Futuna' }.freeze, 'ESH' => { alpha3: 'ESH', alpha2: 'EH', numeric_code: 732, name: 'Western Sahara' }.freeze, 'YEM' => { alpha3: 'YEM', alpha2: 'YE', numeric_code: 887, name: 'Yemen' }.freeze, 'ZMB' => { alpha3: 'ZMB', alpha2: 'ZM', numeric_code: 894, name: 'Zambia' }.freeze, 'ZWE' => { alpha3: 'ZWE', alpha2: 'ZW', numeric_code: 716, name: 'Zimbabwe' }.freeze }.freeze COUNTRIES2 = { 'AF' => COUNTRIES3['AFG'], 'AX' => COUNTRIES3['ALA'], 'AL' => COUNTRIES3['ALB'], 'DZ' => COUNTRIES3['DZA'], 'AS' => COUNTRIES3['ASM'], 'AD' => COUNTRIES3['AND'], 'AO' => COUNTRIES3['AGO'], 'AI' => COUNTRIES3['AIA'], 'AQ' => COUNTRIES3['ATA'], 'AG' => COUNTRIES3['ATG'], 'AR' => COUNTRIES3['ARG'], 'AM' => COUNTRIES3['ARM'], 'AW' => COUNTRIES3['ABW'], 'AU' => COUNTRIES3['AUS'], 'AT' => COUNTRIES3['AUT'], 'AZ' => COUNTRIES3['AZE'], 'BS' => COUNTRIES3['BHS'], 'BH' => COUNTRIES3['BHR'], 'BD' => COUNTRIES3['BGD'], 'BB' => COUNTRIES3['BRB'], 'BY' => COUNTRIES3['BLR'], 'BE' => COUNTRIES3['BEL'], 'BZ' => COUNTRIES3['BLZ'], 'BJ' => COUNTRIES3['BEN'], 'BM' => COUNTRIES3['BMU'], 'BT' => COUNTRIES3['BTN'], 'BO' => COUNTRIES3['BOL'], 'BQ' => COUNTRIES3['BES'], 'BA' => COUNTRIES3['BIH'], 'BW' => COUNTRIES3['BWA'], 'BV' => COUNTRIES3['BVT'], 'BR' => COUNTRIES3['BRA'], 'IO' => COUNTRIES3['IOT'], 'BN' => COUNTRIES3['BRN'], 'BG' => COUNTRIES3['BGR'], 'BF' => COUNTRIES3['BFA'], 'BI' => COUNTRIES3['BDI'], 'CV' => COUNTRIES3['CPV'], 'KH' => COUNTRIES3['KHM'], 'CM' => COUNTRIES3['CMR'], 'CA' => COUNTRIES3['CAN'], 'KY' => COUNTRIES3['CYM'], 'CF' => COUNTRIES3['CAF'], 'TD' => COUNTRIES3['TCD'], 'CL' => COUNTRIES3['CHL'], 'CN' => COUNTRIES3['CHN'], 'CX' => COUNTRIES3['CXR'], 'CC' => COUNTRIES3['CCK'], 'CO' => COUNTRIES3['COL'], 'KM' => COUNTRIES3['COM'], 'CG' => COUNTRIES3['COG'], 'CD' => COUNTRIES3['COD'], 'CK' => COUNTRIES3['COK'], 'CR' => COUNTRIES3['CRI'], 'CI' => COUNTRIES3['CIV'], 'HR' => COUNTRIES3['HRV'], 'CU' => COUNTRIES3['CUB'], 'CW' => COUNTRIES3['CUW'], 'CY' => COUNTRIES3['CYP'], 'CZ' => COUNTRIES3['CZE'], 'DK' => COUNTRIES3['DNK'], 'DJ' => COUNTRIES3['DJI'], 'DM' => COUNTRIES3['DMA'], 'DO' => COUNTRIES3['DOM'], 'EC' => COUNTRIES3['ECU'], 'EG' => COUNTRIES3['EGY'], 'SV' => COUNTRIES3['SLV'], 'GQ' => COUNTRIES3['GNQ'], 'ER' => COUNTRIES3['ERI'], 'EE' => COUNTRIES3['EST'], 'SZ' => COUNTRIES3['SWZ'], 'ET' => COUNTRIES3['ETH'], 'FK' => COUNTRIES3['FLK'], 'FO' => COUNTRIES3['FRO'], 'FJ' => COUNTRIES3['FJI'], 'FI' => COUNTRIES3['FIN'], 'FR' => COUNTRIES3['FRA'], 'GF' => COUNTRIES3['GUF'], 'PF' => COUNTRIES3['PYF'], 'TF' => COUNTRIES3['ATF'], 'GA' => COUNTRIES3['GAB'], 'GM' => COUNTRIES3['GMB'], 'GE' => COUNTRIES3['GEO'], 'DE' => COUNTRIES3['DEU'], 'GH' => COUNTRIES3['GHA'], 'GI' => COUNTRIES3['GIB'], 'GR' => COUNTRIES3['GRC'], 'GL' => COUNTRIES3['GRL'], 'GD' => COUNTRIES3['GRD'], 'GP' => COUNTRIES3['GLP'], 'GU' => COUNTRIES3['GUM'], 'GT' => COUNTRIES3['GTM'], 'GG' => COUNTRIES3['GGY'], 'GN' => COUNTRIES3['GIN'], 'GW' => COUNTRIES3['GNB'], 'GY' => COUNTRIES3['GUY'], 'HT' => COUNTRIES3['HTI'], 'HM' => COUNTRIES3['HMD'], 'VA' => COUNTRIES3['VAT'], 'HN' => COUNTRIES3['HND'], 'HK' => COUNTRIES3['HKG'], 'HU' => COUNTRIES3['HUN'], 'IS' => COUNTRIES3['ISL'], 'IN' => COUNTRIES3['IND'], 'ID' => COUNTRIES3['IDN'], 'IR' => COUNTRIES3['IRN'], 'IQ' => COUNTRIES3['IRQ'], 'IE' => COUNTRIES3['IRL'], 'IM' => COUNTRIES3['IMN'], 'IL' => COUNTRIES3['ISR'], 'IT' => COUNTRIES3['ITA'], 'JM' => COUNTRIES3['JAM'], 'JP' => COUNTRIES3['JPN'], 'JE' => COUNTRIES3['JEY'], 'JO' => COUNTRIES3['JOR'], 'KZ' => COUNTRIES3['KAZ'], 'KE' => COUNTRIES3['KEN'], 'KI' => COUNTRIES3['KIR'], 'KP' => COUNTRIES3['PRK'], 'KR' => COUNTRIES3['KOR'], 'KW' => COUNTRIES3['KWT'], 'KG' => COUNTRIES3['KGZ'], 'LA' => COUNTRIES3['LAO'], 'LV' => COUNTRIES3['LVA'], 'LB' => COUNTRIES3['LBN'], 'LS' => COUNTRIES3['LSO'], 'LR' => COUNTRIES3['LBR'], 'LY' => COUNTRIES3['LBY'], 'LI' => COUNTRIES3['LIE'], 'LT' => COUNTRIES3['LTU'], 'LU' => COUNTRIES3['LUX'], 'MO' => COUNTRIES3['MAC'], 'MG' => COUNTRIES3['MDG'], 'MW' => COUNTRIES3['MWI'], 'MY' => COUNTRIES3['MYS'], 'MV' => COUNTRIES3['MDV'], 'ML' => COUNTRIES3['MLI'], 'MT' => COUNTRIES3['MLT'], 'MH' => COUNTRIES3['MHL'], 'MQ' => COUNTRIES3['MTQ'], 'MR' => COUNTRIES3['MRT'], 'MU' => COUNTRIES3['MUS'], 'YT' => COUNTRIES3['MYT'], 'MX' => COUNTRIES3['MEX'], 'FM' => COUNTRIES3['FSM'], 'MD' => COUNTRIES3['MDA'], 'MC' => COUNTRIES3['MCO'], 'MN' => COUNTRIES3['MNG'], 'ME' => COUNTRIES3['MNE'], 'MS' => COUNTRIES3['MSR'], 'MA' => COUNTRIES3['MAR'], 'MZ' => COUNTRIES3['MOZ'], 'MM' => COUNTRIES3['MMR'], 'NA' => COUNTRIES3['NAM'], 'NR' => COUNTRIES3['NRU'], 'NP' => COUNTRIES3['NPL'], 'NL' => COUNTRIES3['NLD'], 'NC' => COUNTRIES3['NCL'], 'NZ' => COUNTRIES3['NZL'], 'NI' => COUNTRIES3['NIC'], 'NE' => COUNTRIES3['NER'], 'NG' => COUNTRIES3['NGA'], 'NU' => COUNTRIES3['NIU'], 'NF' => COUNTRIES3['NFK'], 'MK' => COUNTRIES3['MKD'], 'MP' => COUNTRIES3['MNP'], 'NO' => COUNTRIES3['NOR'], 'OM' => COUNTRIES3['OMN'], 'PK' => COUNTRIES3['PAK'], 'PW' => COUNTRIES3['PLW'], 'PS' => COUNTRIES3['PSE'], 'PA' => COUNTRIES3['PAN'], 'PG' => COUNTRIES3['PNG'], 'PY' => COUNTRIES3['PRY'], 'PE' => COUNTRIES3['PER'], 'PH' => COUNTRIES3['PHL'], 'PN' => COUNTRIES3['PCN'], 'PL' => COUNTRIES3['POL'], 'PT' => COUNTRIES3['PRT'], 'PR' => COUNTRIES3['PRI'], 'QA' => COUNTRIES3['QAT'], 'RE' => COUNTRIES3['REU'], 'RO' => COUNTRIES3['ROU'], 'RU' => COUNTRIES3['RUS'], 'RW' => COUNTRIES3['RWA'], 'BL' => COUNTRIES3['BLM'], 'SH' => COUNTRIES3['SHN'], 'KN' => COUNTRIES3['KNA'], 'LC' => COUNTRIES3['LCA'], 'MF' => COUNTRIES3['MAF'], 'PM' => COUNTRIES3['SPM'], 'VC' => COUNTRIES3['VCT'], 'WS' => COUNTRIES3['WSM'], 'SM' => COUNTRIES3['SMR'], 'ST' => COUNTRIES3['STP'], 'SA' => COUNTRIES3['SAU'], 'SN' => COUNTRIES3['SEN'], 'RS' => COUNTRIES3['SRB'], 'SC' => COUNTRIES3['SYC'], 'SL' => COUNTRIES3['SLE'], 'SG' => COUNTRIES3['SGP'], 'SX' => COUNTRIES3['SXM'], 'SK' => COUNTRIES3['SVK'], 'SI' => COUNTRIES3['SVN'], 'SB' => COUNTRIES3['SLB'], 'SO' => COUNTRIES3['SOM'], 'ZA' => COUNTRIES3['ZAF'], 'GS' => COUNTRIES3['SGS'], 'SS' => COUNTRIES3['SSD'], 'ES' => COUNTRIES3['ESP'], 'LK' => COUNTRIES3['LKA'], 'SD' => COUNTRIES3['SDN'], 'SR' => COUNTRIES3['SUR'], 'SJ' => COUNTRIES3['SJM'], 'SE' => COUNTRIES3['SWE'], 'CH' => COUNTRIES3['CHE'], 'SY' => COUNTRIES3['SYR'], 'TW' => COUNTRIES3['TWN'], 'TJ' => COUNTRIES3['TJK'], 'TZ' => COUNTRIES3['TZA'], 'TH' => COUNTRIES3['THA'], 'TL' => COUNTRIES3['TLS'], 'TG' => COUNTRIES3['TGO'], 'TK' => COUNTRIES3['TKL'], 'TO' => COUNTRIES3['TON'], 'TT' => COUNTRIES3['TTO'], 'TN' => COUNTRIES3['TUN'], 'TR' => COUNTRIES3['TUR'], 'TM' => COUNTRIES3['TKM'], 'TC' => COUNTRIES3['TCA'], 'TV' => COUNTRIES3['TUV'], 'UG' => COUNTRIES3['UGA'], 'UA' => COUNTRIES3['UKR'], 'AE' => COUNTRIES3['ARE'], 'GB' => COUNTRIES3['GBR'], 'US' => COUNTRIES3['USA'], 'UM' => COUNTRIES3['UMI'], 'UY' => COUNTRIES3['URY'], 'UZ' => COUNTRIES3['UZB'], 'VU' => COUNTRIES3['VUT'], 'VE' => COUNTRIES3['VEN'], 'VN' => COUNTRIES3['VNM'], 'VG' => COUNTRIES3['VGB'], 'VI' => COUNTRIES3['VIR'], 'WF' => COUNTRIES3['WLF'], 'EH' => COUNTRIES3['ESH'], 'YE' => COUNTRIES3['YEM'], 'ZM' => COUNTRIES3['ZMB'], 'ZW' => COUNTRIES3['ZWE'] }.freeze # TODO: iso3166-2 subdivision codes?? end end end ruby-kdl-1.0.3/lib/kdl/types/country/iso3166_subdivisions.rb000066400000000000000000004015161444670406000237070ustar00rootroot00000000000000module KDL module Types class CountrySubdivision < Value # From: https://en.wikipedia.org/wiki/ISO_3166-2#Current_codes COUNTRY_SUBDIVISIONS = { "AD" => { "AD-07" => "Andorra la Vella", "AD-02" => "Canillo", "AD-03" => "Encamp", "AD-08" => "Escaldes-Engordany", "AD-04" => "La Massana", "AD-05" => "Ordino", "AD-06" => "Sant Julià de Lòria" }, "AE" => { "AE-AZ" => "Abū Z̧aby", "AE-AJ" => "‘Ajmān", "AE-FU" => "Al Fujayrah", "AE-SH" => "Ash Shāriqah", "AE-DU" => "Dubayy", "AE-RK" => "Ra’s al Khaymah", "AE-UQ" => "Umm al Qaywayn" }, "AF" => { "AF-BDS" => "Badakhshān", "AF-BDG" => "Bādghīs", "AF-BGL" => "Baghlān", "AF-BAL" => "Balkh", "AF-BAM" => "Bāmyān", "AF-DAY" => "Dāykundī", "AF-FRA" => "Farāh", "AF-FYB" => "Fāryāb", "AF-GHA" => "Ghaznī", "AF-GHO" => "Ghōr", "AF-HEL" => "Helmand", "AF-HER" => "Herāt", "AF-JOW" => "Jowzjān", "AF-KAB" => "Kābul", "AF-KAN" => "Kandahār", "AF-KAP" => "Kāpīsā", "AF-KHO" => "Khōst", "AF-KNR" => "Kunaṟ", "AF-KDZ" => "Kunduz", "AF-LAG" => "Laghmān", "AF-LOG" => "Lōgar", "AF-NAN" => "Nangarhār", "AF-NIM" => "Nīmrōz", "AF-NUR" => "Nūristān", "AF-PKA" => "Paktīkā", "AF-PIA" => "Paktiyā", "AF-PAN" => "Panjshayr", "AF-PAR" => "Parwān", "AF-SAM" => "Samangān", "AF-SAR" => "Sar-e Pul", "AF-TAK" => "Takhār", "AF-URU" => "Uruzgān", "AF-WAR" => "Wardak", "AF-ZAB" => "Zābul" }, "AG" => { "AG-03" => "Saint George", "AG-04" => "Saint John", "AG-05" => "Saint Mary", "AG-06" => "Saint Paul", "AG-07" => "Saint Peter", "AG-08" => "Saint Philip", "AG-10" => "Barbuda", "AG-11" => "Redonda" }, "AL" => { "AL-01" => "Berat", "AL-09" => "Dibër", "AL-02" => "Durrës", "AL-03" => "Elbasan", "AL-04" => "Fier", "AL-05" => "Gjirokastër", "AL-06" => "Korçë", "AL-07" => "Kukës", "AL-08" => "Lezhë", "AL-10" => "Shkodër", "AL-11" => "Tiranë", "AL-12" => "Vlorë" }, "AM" => { "AM-ER" => "Erevan", "AM-AG" => "Aragac̣otn", "AM-AR" => "Ararat", "AM-AV" => "Armavir", "AM-GR" => "Geġark'unik'", "AM-KT" => "Kotayk'", "AM-LO" => "Loṙi", "AM-SH" => "Širak", "AM-SU" => "Syunik'", "AM-TV" => "Tavuš", "AM-VD" => "Vayoć Jor" }, "AO" => { "AO-BGO" => "Bengo", "AO-BGU" => "Benguela", "AO-BIE" => "Bié", "AO-CAB" => "Cabinda", "AO-CNN" => "Cunene", "AO-HUA" => "Huambo", "AO-HUI" => "Huíla", "AO-CCU" => "Cuando Cubango", "AO-CNO" => "Cuanza-Norte", "AO-CUS" => "Cuanza-Sul", "AO-LUA" => "Luanda", "AO-LNO" => "Lunda-Norte", "AO-LSU" => "Lunda-Sul", "AO-MAL" => "Malange", "AO-MOX" => "Moxico", "AO-NAM" => "Namibe", "AO-UIG" => "Uíge", "AO-ZAI" => "Zaire" }, "AR" => { "AR-C" => "Ciudad Autónoma de Buenos Aires", "AR-B" => "Buenos Aires", "AR-K" => "Catamarca", "AR-H" => "Chaco", "AR-U" => "Chubut", "AR-X" => "Córdoba", "AR-W" => "Corrientes", "AR-E" => "Entre Ríos", "AR-P" => "Formosa", "AR-Y" => "Jujuy", "AR-L" => "La Pampa", "AR-F" => "La Rioja", "AR-M" => "Mendoza", "AR-N" => "Misiones", "AR-Q" => "Neuquén", "AR-R" => "Río Negro", "AR-A" => "Salta", "AR-J" => "San Juan", "AR-D" => "San Luis", "AR-Z" => "Santa Cruz", "AR-S" => "Santa Fe", "AR-G" => "Santiago del Estero", "AR-V" => "Tierra del Fuego", "AR-T" => "Tucumán" }, "AT" => { "AT-1" => "Burgenland", "AT-2" => "Kärnten", "AT-3" => "Niederösterreich", "AT-4" => "Oberösterreich", "AT-5" => "Salzburg", "AT-6" => "Steiermark", "AT-7" => "Tirol", "AT-8" => "Vorarlberg", "AT-9" => "Wien" }, "AU" => { "AU-NSW" => "New South Wales", "AU-QLD" => "Queensland", "AU-SA" => "South Australia", "AU-TAS" => "Tasmania", "AU-VIC" => "Victoria", "AU-WA" => "Western Australia", "AU-ACT" => "Australian Capital Territory", "AU-NT" => "Northern Territory" }, "AZ" => { "AZ-NX" => "Naxçıvan" }, "BA" => { "BA-BIH" => "Federacija Bosne i Hercegovine", "BA-SRP" => "Republika Srpska", "BA-BRC" => "Brčko distrikt" }, "BB" => { "BB-01" => "Christ Church", "BB-02" => "Saint Andrew", "BB-03" => "Saint George", "BB-04" => "Saint James", "BB-05" => "Saint John", "BB-06" => "Saint Joseph", "BB-07" => "Saint Lucy", "BB-08" => "Saint Michael", "BB-09" => "Saint Peter", "BB-10" => "Saint Philip", "BB-11" => "Saint Thomas" }, "BD" => { "BD-A" => "Barishal", "BD-B" => "Chattogram", "BD-C" => "Dhaka", "BD-D" => "Khulna", "BD-H" => "Mymensingh", "BD-E" => "Rajshahi", "BD-F" => "Rangpur", "BD-G" => "Sylhet" }, "BE" => { "BE-BRU" => "Brussels Hoofdstedelijk Gewest", "BE-VLG" => "Vlaams Gewest", "BE-WAL" => "Waals Gewest [note 3]" }, "BF" => { "BF-01" => "Boucle du Mouhoun", "BF-02" => "Cascades", "BF-03" => "Centre", "BF-04" => "Centre-Est", "BF-05" => "Centre-Nord", "BF-06" => "Centre-Ouest", "BF-07" => "Centre-Sud", "BF-08" => "Est", "BF-09" => "Hauts-Bassins", "BF-10" => "Nord", "BF-11" => "Plateau-Central", "BF-12" => "Sahel", "BF-13" => "Sud-Ouest" }, "BG" => { "BG-01" => "Blagoevgrad", "BG-02" => "Burgas", "BG-08" => "Dobrich", "BG-07" => "Gabrovo", "BG-26" => "Haskovo", "BG-09" => "Kardzhali", "BG-10" => "Kyustendil", "BG-11" => "Lovech", "BG-12" => "Montana", "BG-13" => "Pazardzhik", "BG-14" => "Pernik", "BG-15" => "Pleven", "BG-16" => "Plovdiv", "BG-17" => "Razgrad", "BG-18" => "Ruse", "BG-27" => "Shumen", "BG-19" => "Silistra", "BG-20" => "Sliven", "BG-21" => "Smolyan", "BG-23" => "Sofia", "BG-22" => "Sofia (stolitsa)", "BG-24" => "Stara Zagora", "BG-25" => "Targovishte", "BG-03" => "Varna", "BG-04" => "Veliko Tarnovo", "BG-05" => "Vidin", "BG-06" => "Vratsa", "BG-28" => "Yambol" }, "BH" => { "BH-13" => "Al ‘Āşimah", "BH-14" => "Al Janūbīyah", "BH-15" => "Al Muḩarraq", "BH-17" => "Ash Shamālīyah" }, "BI" => { "BI-BB" => "Bubanza", "BI-BM" => "Bujumbura Mairie", "BI-BL" => "Bujumbura Rural", "BI-BR" => "Bururi", "BI-CA" => "Cankuzo", "BI-CI" => "Cibitoke", "BI-GI" => "Gitega", "BI-KR" => "Karuzi", "BI-KY" => "Kayanza", "BI-KI" => "Kirundo", "BI-MA" => "Makamba", "BI-MU" => "Muramvya", "BI-MY" => "Muyinga", "BI-MW" => "Mwaro", "BI-NG" => "Ngozi", "BI-RM" => "Rumonge", "BI-RT" => "Rutana", "BI-RY" => "Ruyigi" }, "BJ" => { "BJ-AL" => "Alibori", "BJ-AK" => "Atacora", "BJ-AQ" => "Atlantique", "BJ-BO" => "Borgou", "BJ-CO" => "Collines", "BJ-KO" => "Couffo", "BJ-DO" => "Donga", "BJ-LI" => "Littoral", "BJ-MO" => "Mono", "BJ-OU" => "Ouémé", "BJ-PL" => "Plateau", "BJ-ZO" => "Zou" }, "BN" => { "BN-BE" => "Belait", "BN-BM" => "Brunei-Muara", "BN-TE" => "Temburong", "BN-TU" => "Tutong" }, "BO" => { "BO-C" => "Cochabamba", "BO-H" => "Chuquisaca", "BO-B" => "El Beni", "BO-L" => "La Paz", "BO-O" => "Oruro", "BO-N" => "Pando", "BO-P" => "Potosí", "BO-S" => "Santa Cruz", "BO-T" => "Tarija" }, "BQ" => { "BQ-BO" => "Bonaire", "BQ-SA" => "Saba", "BQ-SE" => "Sint Eustatius" }, "BR" => { "BR-AC" => "Acre", "BR-AL" => "Alagoas", "BR-AP" => "Amapá", "BR-AM" => "Amazonas", "BR-BA" => "Bahia", "BR-CE" => "Ceará", "BR-DF" => "Distrito Federal", "BR-ES" => "Espírito Santo", "BR-GO" => "Goiás", "BR-MA" => "Maranhão", "BR-MT" => "Mato Grosso", "BR-MS" => "Mato Grosso do Sul", "BR-MG" => "Minas Gerais", "BR-PA" => "Pará", "BR-PB" => "Paraíba", "BR-PR" => "Paraná", "BR-PE" => "Pernambuco", "BR-PI" => "Piauí", "BR-RJ" => "Rio de Janeiro", "BR-RN" => "Rio Grande do Norte", "BR-RS" => "Rio Grande do Sul", "BR-RO" => "Rondônia", "BR-RR" => "Roraima", "BR-SC" => "Santa Catarina", "BR-SP" => "São Paulo", "BR-SE" => "Sergipe", "BR-TO" => "Tocantins" }, "BS" => { "BS-AK" => "Acklins", "BS-BY" => "Berry Islands", "BS-BI" => "Bimini", "BS-BP" => "Black Point", "BS-CI" => "Cat Island", "BS-CO" => "Central Abaco", "BS-CS" => "Central Andros", "BS-CE" => "Central Eleuthera", "BS-FP" => "City of Freeport", "BS-CK" => "Crooked Island and Long Cay", "BS-EG" => "East Grand Bahama", "BS-EX" => "Exuma", "BS-GC" => "Grand Cay", "BS-HI" => "Harbour Island", "BS-HT" => "Hope Town", "BS-IN" => "Inagua", "BS-LI" => "Long Island", "BS-MC" => "Mangrove Cay", "BS-MG" => "Mayaguana", "BS-MI" => "Moore's Island", "BS-NP" => "New Providence", "BS-NO" => "North Abaco", "BS-NS" => "North Andros", "BS-NE" => "North Eleuthera", "BS-RI" => "Ragged Island", "BS-RC" => "Rum Cay", "BS-SS" => "San Salvador", "BS-SO" => "South Abaco", "BS-SA" => "South Andros", "BS-SE" => "South Eleuthera", "BS-SW" => "Spanish Wells", "BS-WG" => "West Grand Bahama" }, "BT" => { "BT-33" => "Bumthang", "BT-12" => "Chhukha", "BT-22" => "Dagana", "BT-GA" => "Gasa", "BT-13" => "Haa", "BT-44" => "Lhuentse", "BT-42" => "Monggar", "BT-11" => "Paro", "BT-43" => "Pema Gatshel", "BT-23" => "Punakha", "BT-45" => "Samdrup Jongkhar", "BT-14" => "Samtse", "BT-31" => "Sarpang", "BT-15" => "Thimphu", "BT-41" => "Trashigang", "BT-TY" => "Trashi Yangtse", "BT-32" => "Trongsa", "BT-21" => "Tsirang", "BT-24" => "Wangdue Phodrang", "BT-34" => "Zhemgang" }, "BW" => { "BW-CE" => "Central", "BW-CH" => "Chobe", "BW-FR" => "Francistown", "BW-GA" => "Gaborone", "BW-GH" => "Ghanzi", "BW-JW" => "Jwaneng", "BW-KG" => "Kgalagadi", "BW-KL" => "Kgatleng", "BW-KW" => "Kweneng", "BW-LO" => "Lobatse", "BW-NE" => "North East", "BW-NW" => "North West", "BW-SP" => "Selibe Phikwe", "BW-SE" => "South East", "BW-SO" => "Southern", "BW-ST" => "Sowa Town" }, "BY" => { "BY-BR" => "Brestskaya voblasts'", "BY-HO" => "Homyel'skaya voblasts'", "BY-HR" => "Hrodzyenskaya voblasts'", "BY-MA" => "Mahilyowskaya voblasts'", "BY-MI" => "Minskaya voblasts'", "BY-VI" => "Vitsyebskaya voblasts'", "BY-HM" => "Horad Minsk" }, "BZ" => { "BZ-BZ" => "Belize", "BZ-CY" => "Cayo", "BZ-CZL" => "Corozal", "BZ-OW" => "Orange Walk", "BZ-SC" => "Stann Creek", "BZ-TOL" => "Toledo" }, "CA" => { "CA-AB" => "Alberta", "CA-BC" => "British Columbia", "CA-MB" => "Manitoba", "CA-NB" => "New Brunswick", "CA-NL" => "Newfoundland and Labrador", "CA-NS" => "Nova Scotia", "CA-ON" => "Ontario", "CA-PE" => "Prince Edward Island", "CA-QC" => "Quebec", "CA-SK" => "Saskatchewan", "CA-NT" => "Northwest Territories", "CA-NU" => "Nunavut", "CA-YT" => "Yukon" }, "CD" => { "CD-KN" => "Kinshasa", "CD-BC" => "Kongo Central", "CD-EQ" => "Équateur", "CD-KE" => "Kasaï Oriental", "CD-MA" => "Maniema", "CD-NK" => "Nord-Kivu", "CD-SK" => "Sud-Kivu", "CD-BU" => "Bas-Uélé", "CD-HK" => "Haut-Katanga", "CD-HL" => "Haut-Lomami", "CD-HU" => "Haut-Uélé", "CD-IT" => "Ituri", "CD-KC" => "Kasaï Central", "CD-KG" => "Kwango", "CD-KL" => "Kwilu", "CD-KS" => "Kasaï", "CD-LO" => "Lomami", "CD-LU" => "Lualaba", "CD-MN" => "Mai-Ndombe", "CD-MO" => "Mongala", "CD-NU" => "Nord-Ubangi", "CD-SA" => "Sankuru", "CD-SU" => "Sud-Ubangi", "CD-TA" => "Tanganyika", "CD-TO" => "Tshopo", "CD-TU" => "Tshuapa" }, "CF" => { "CF-BGF" => "Bangui", "CF-BB" => "Bamingui-Bangoran", "CF-BK" => "Basse-Kotto", "CF-HK" => "Haute-Kotto", "CF-HM" => "Haut-Mbomou", "CF-HS" => "Haute-Sangha/Mambéré-Kadéï", "CF-KG" => "Kémo-Gribingui", "CF-LB" => "Lobaye", "CF-MB" => "Mbomou", "CF-NM" => "Nana-Mambéré", "CF-MP" => "Ombella-Mpoko", "CF-UK" => "Ouaka", "CF-AC" => "Ouham", "CF-OP" => "Ouham-Pendé", "CF-VK" => "Vakaga", "CF-KB" => "Gribingui", "CF-SE" => "Sangha" }, "CG" => { "CG-BZV" => "Brazzaville", "CG-11" => "Bouenza", "CG-8" => "Cuvette", "CG-15" => "Cuvette-Ouest", "CG-5" => "Kouilou", "CG-2" => "Lékoumou", "CG-7" => "Likouala", "CG-9" => "Niari", "CG-14" => "Plateaux", "CG-16" => "Pointe-Noire", "CG-12" => "Pool", "CG-13" => "Sangha" }, "CH" => { "CH-AG" => "Aargau (de)", "CH-AR" => "Appenzell Ausserrhoden (de)", "CH-AI" => "Appenzell Innerrhoden (de)", "CH-BL" => "Basel-Landschaft (de)", "CH-BS" => "Basel-Stadt (de)", "CH-BE" => "Bern (de), Berne (fr)", "CH-FR" => "Fribourg (fr), Freiburg (de)", "CH-GE" => "Genève (fr)", "CH-GL" => "Glarus (de)", "CH-GR" => "Graubünden (de), Grigioni (it), Grischun (rm)", "CH-JU" => "Jura (fr)", "CH-LU" => "Luzern (de)", "CH-NE" => "Neuchâtel (fr)", "CH-NW" => "Nidwalden (de)", "CH-OW" => "Obwalden (de)", "CH-SG" => "Sankt Gallen (de)", "CH-SH" => "Schaffhausen (de)", "CH-SZ" => "Schwyz (de)", "CH-SO" => "Solothurn (de)", "CH-TG" => "Thurgau (de)", "CH-TI" => "Ticino (it)", "CH-UR" => "Uri (de)", "CH-VS" => "Valais (fr), Wallis (de)", "CH-VD" => "Vaud (fr)", "CH-ZG" => "Zug (de)", "CH-ZH" => "Zürich (de)" }, "CI" => { "CI-AB" => "Abidjan", "CI-BS" => "Bas-Sassandra", "CI-CM" => "Comoé", "CI-DN" => "Denguélé", "CI-GD" => "Gôh-Djiboua", "CI-LC" => "Lacs", "CI-LG" => "Lagunes", "CI-MG" => "Montagnes", "CI-SM" => "Sassandra-Marahoué", "CI-SV" => "Savanes", "CI-VB" => "Vallée du Bandama", "CI-WR" => "Woroba", "CI-YM" => "Yamoussoukro", "CI-ZZ" => "Zanzan" }, "CL" => { "CL-AI" => "Aisén del General Carlos Ibañez del Campo", "CL-AN" => "Antofagasta", "CL-AP" => "Arica y Parinacota", "CL-AR" => "La Araucanía", "CL-AT" => "Atacama", "CL-BI" => "Biobío", "CL-CO" => "Coquimbo", "CL-LI" => "Libertador General Bernardo O'Higgins", "CL-LL" => "Los Lagos", "CL-LR" => "Los Ríos", "CL-MA" => "Magallanes", "CL-ML" => "Maule", "CL-NB" => "Ñuble", "CL-RM" => "Región Metropolitana de Santiago", "CL-TA" => "Tarapacá", "CL-VS" => "Valparaíso" }, "CM" => { "CM-AD" => "Adamaoua", "CM-CE" => "Centre", "CM-ES" => "East", "CM-EN" => "Far North", "CM-LT" => "Littoral", "CM-NO" => "North", "CM-NW" => "North-West", "CM-SU" => "South", "CM-SW" => "South-West", "CM-OU" => "West" }, "CN" => { "CN-AH" => "Anhui Sheng", "CN-BJ" => "Beijing Shi", "CN-CQ" => "Chongqing Shi", "CN-FJ" => "Fujian Sheng", "CN-GD" => "Guangdong Sheng", "CN-GS" => "Gansu Sheng", "CN-GX" => "Guangxi Zhuangzu Zizhiqu", "CN-GZ" => "Guizhou Sheng", "CN-HA" => "Henan Sheng", "CN-HB" => "Hubei Sheng", "CN-HE" => "Hebei Sheng", "CN-HI" => "Hainan Sheng", "CN-HK" => "Hong Kong SAR (en)Xianggang Tebiexingzhengqu (zh)", "CN-HL" => "Heilongjiang Sheng", "CN-HN" => "Hunan Sheng", "CN-JL" => "Jilin Sheng", "CN-JS" => "Jiangsu Sheng", "CN-JX" => "Jiangxi Sheng", "CN-LN" => "Liaoning Sheng", "CN-MO" => "Macao SAR (en)Macau SAR (pt)Aomen Tebiexingzhengqu (zh)", "CN-NM" => "Nei Mongol Zizhiqu", "CN-NX" => "Ningxia Huizi Zizhiqu", "CN-QH" => "Qinghai Sheng", "CN-SC" => "Sichuan Sheng", "CN-SD" => "Shandong Sheng", "CN-SH" => "Shanghai Shi", "CN-SN" => "Shaanxi Sheng", "CN-SX" => "Shanxi Sheng", "CN-TJ" => "Tianjin Shi", "CN-TW" => "Taiwan Sheng", "CN-XJ" => "Xinjiang Uygur Zizhiqu", "CN-XZ" => "Xizang Zizhiqu", "CN-YN" => "Yunnan Sheng", "CN-ZJ" => "Zhejiang Sheng" }, "CO" => { "CO-DC" => "Distrito Capital de Bogotá", "CO-AMA" => "Amazonas", "CO-ANT" => "Antioquia", "CO-ARA" => "Arauca", "CO-ATL" => "Atlántico", "CO-BOL" => "Bolívar", "CO-BOY" => "Boyacá", "CO-CAL" => "Caldas", "CO-CAQ" => "Caquetá", "CO-CAS" => "Casanare", "CO-CAU" => "Cauca", "CO-CES" => "Cesar", "CO-COR" => "Córdoba", "CO-CUN" => "Cundinamarca", "CO-CHO" => "Chocó", "CO-GUA" => "Guainía", "CO-GUV" => "Guaviare", "CO-HUI" => "Huila", "CO-LAG" => "La Guajira", "CO-MAG" => "Magdalena", "CO-MET" => "Meta", "CO-NAR" => "Nariño", "CO-NSA" => "Norte de Santander", "CO-PUT" => "Putumayo", "CO-QUI" => "Quindío", "CO-RIS" => "Risaralda", "CO-SAP" => "San Andrés, Providencia y Santa Catalina", "CO-SAN" => "Santander", "CO-SUC" => "Sucre", "CO-TOL" => "Tolima", "CO-VAC" => "Valle del Cauca", "CO-VAU" => "Vaupés", "CO-VID" => "Vichada" }, "CR" => { "CR-A" => "Alajuela", "CR-C" => "Cartago", "CR-G" => "Guanacaste", "CR-H" => "Heredia", "CR-L" => "Limón", "CR-P" => "Puntarenas", "CR-SJ" => "San José" }, "CU" => { "CU-15" => "Artemisa", "CU-09" => "Camagüey", "CU-08" => "Ciego de Ávila", "CU-06" => "Cienfuegos", "CU-12" => "Granma", "CU-14" => "Guantánamo", "CU-11" => "Holguín", "CU-03" => "La Habana", "CU-10" => "Las Tunas", "CU-04" => "Matanzas", "CU-16" => "Mayabeque", "CU-01" => "Pinar del Río", "CU-07" => "Sancti Spíritus", "CU-13" => "Santiago de Cuba", "CU-05" => "Villa Clara", "CU-99" => "Isla de la Juventud" }, "CV" => { "CV-B" => "Ilhas de Barlavento", "CV-S" => "Ilhas de Sotavento" }, "CY" => { "CY-04" => "Ammochostos", "CY-06" => "Keryneia", "CY-03" => "Larnaka", "CY-01" => "Lefkosia", "CY-02" => "Lemesos", "CY-05" => "Pafos" }, "CZ" => { "CZ-31" => "Jihočeský kraj", "CZ-64" => "Jihomoravský kraj", "CZ-41" => "Karlovarský kraj", "CZ-52" => "Královéhradecký kraj", "CZ-51" => "Liberecký kraj", "CZ-80" => "Moravskoslezský kraj", "CZ-71" => "Olomoucký kraj", "CZ-53" => "Pardubický kraj", "CZ-32" => "Plzeňský kraj", "CZ-10" => "Praha, Hlavní město", "CZ-20" => "Středočeský kraj", "CZ-42" => "Ústecký kraj", "CZ-63" => "Kraj Vysočina", "CZ-72" => "Zlínský kraj" }, "DE" => { "DE-BW" => "Baden-Württemberg", "DE-BY" => "Bayern", "DE-BE" => "Berlin", "DE-BB" => "Brandenburg", "DE-HB" => "Bremen", "DE-HH" => "Hamburg", "DE-HE" => "Hessen", "DE-MV" => "Mecklenburg-Vorpommern", "DE-NI" => "Niedersachsen", "DE-NW" => "Nordrhein-Westfalen", "DE-RP" => "Rheinland-Pfalz", "DE-SL" => "Saarland", "DE-SN" => "Sachsen", "DE-ST" => "Sachsen-Anhalt", "DE-SH" => "Schleswig-Holstein", "DE-TH" => "Thüringen" }, "DJ" => { "DJ-AS" => "Ali Sabieh", "DJ-AR" => "Arta", "DJ-DI" => "Dikhil", "DJ-OB" => "Obock", "DJ-TA" => "Tadjourah", "DJ-DJ" => "Djibouti" }, "DK" => { "DK-84" => "Hovedstaden", "DK-82" => "Midtjylland", "DK-81" => "Nordjylland", "DK-85" => "Sjælland", "DK-83" => "Syddanmark" }, "DM" => { "DM-02" => "Saint Andrew", "DM-03" => "Saint David", "DM-04" => "Saint George", "DM-05" => "Saint John", "DM-06" => "Saint Joseph", "DM-07" => "Saint Luke", "DM-08" => "Saint Mark", "DM-09" => "Saint Patrick", "DM-10" => "Saint Paul", "DM-11" => "Saint Peter" }, "DO" => { "DO-33" => "Cibao Nordeste", "DO-34" => "Cibao Noroeste", "DO-35" => "Cibao Norte", "DO-36" => "Cibao Sur", "DO-37" => "El Valle", "DO-38" => "Enriquillo", "DO-39" => "Higuamo", "DO-40" => "Ozama", "DO-41" => "Valdesia", "DO-42" => "Yuma" }, "DZ" => { "DZ-01" => "Adrar", "DZ-44" => "Aïn Defla", "DZ-46" => "Aïn Témouchent", "DZ-16" => "Alger", "DZ-23" => "Annaba", "DZ-05" => "Batna", "DZ-08" => "Béchar", "DZ-06" => "Béjaïa", "DZ-07" => "Biskra", "DZ-09" => "Blida", "DZ-34" => "Bordj Bou Arréridj", "DZ-10" => "Bouira", "DZ-35" => "Boumerdès", "DZ-02" => "Chlef", "DZ-25" => "Constantine", "DZ-17" => "Djelfa", "DZ-32" => "El Bayadh", "DZ-39" => "El Oued", "DZ-36" => "El Tarf", "DZ-47" => "Ghardaïa", "DZ-24" => "Guelma", "DZ-33" => "Illizi", "DZ-18" => "Jijel", "DZ-40" => "Khenchela", "DZ-03" => "Laghouat", "DZ-28" => "M'sila", "DZ-29" => "Mascara", "DZ-26" => "Médéa", "DZ-43" => "Mila", "DZ-27" => "Mostaganem", "DZ-45" => "Naama", "DZ-31" => "Oran", "DZ-30" => "Ouargla", "DZ-04" => "Oum el Bouaghi", "DZ-48" => "Relizane", "DZ-20" => "Saïda", "DZ-19" => "Sétif", "DZ-22" => "Sidi Bel Abbès", "DZ-21" => "Skikda", "DZ-41" => "Souk Ahras", "DZ-11" => "Tamanrasset", "DZ-12" => "Tébessa", "DZ-14" => "Tiaret", "DZ-37" => "Tindouf", "DZ-42" => "Tipaza", "DZ-38" => "Tissemsilt", "DZ-15" => "Tizi Ouzou", "DZ-13" => "Tlemcen" }, "EC" => { "EC-A" => "Azuay", "EC-B" => "Bolívar", "EC-F" => "Cañar", "EC-C" => "Carchi", "EC-H" => "Chimborazo", "EC-X" => "Cotopaxi", "EC-O" => "El Oro", "EC-E" => "Esmeraldas", "EC-W" => "Galápagos", "EC-G" => "Guayas", "EC-I" => "Imbabura", "EC-L" => "Loja", "EC-R" => "Los Ríos", "EC-M" => "Manabí", "EC-S" => "Morona Santiago", "EC-N" => "Napo", "EC-D" => "Orellana", "EC-Y" => "Pastaza", "EC-P" => "Pichincha", "EC-SE" => "Santa Elena", "EC-SD" => "Santo Domingo de los Tsáchilas", "EC-U" => "Sucumbíos", "EC-T" => "Tungurahua", "EC-Z" => "Zamora Chinchipe" }, "EE" => { "EE-37" => "Harjumaa", "EE-39" => "Hiiumaa", "EE-45" => "Ida-Virumaa", "EE-50" => "Jõgevamaa", "EE-52" => "Järvamaa", "EE-56" => "Läänemaa", "EE-60" => "Lääne-Virumaa", "EE-64" => "Põlvamaa", "EE-68" => "Pärnumaa", "EE-71" => "Raplamaa", "EE-74" => "Saaremaa", "EE-79" => "Tartumaa", "EE-81" => "Valgamaa", "EE-84" => "Viljandimaa", "EE-87" => "Võrumaa" }, "EG" => { "EG-DK" => "Ad Daqahlīyah", "EG-BA" => "Al Baḩr al Aḩmar", "EG-BH" => "Al Buḩayrah", "EG-FYM" => "Al Fayyūm", "EG-GH" => "Al Gharbīyah", "EG-ALX" => "Al Iskandarīyah", "EG-IS" => "Al Ismā'īlīyah", "EG-GZ" => "Al Jīzah", "EG-MNF" => "Al Minūfīyah", "EG-MN" => "Al Minyā", "EG-C" => "Al Qāhirah", "EG-KB" => "Al Qalyūbīyah", "EG-LX" => "Al Uqşur", "EG-WAD" => "Al Wādī al Jadīd", "EG-SUZ" => "As Suways", "EG-SHR" => "Ash Sharqīyah", "EG-ASN" => "Aswān", "EG-AST" => "Asyūţ", "EG-BNS" => "Banī Suwayf", "EG-PTS" => "Būr Sa‘īd", "EG-DT" => "Dumyāţ", "EG-JS" => "Janūb Sīnā'", "EG-KFS" => "Kafr ash Shaykh", "EG-MT" => "Maţrūḩ", "EG-KN" => "Qinā", "EG-SIN" => "Shamāl Sīnā'", "EG-SHG" => "Sūhāj" }, "ER" => { "ER-MA" => "Al Awsaţ", "ER-DU" => "Al Janūbī", "ER-AN" => "Ansabā", "ER-DK" => "Janūbī al Baḩrī al Aḩmar", "ER-GB" => "Qāsh-Barkah", "ER-SK" => "Shimālī al Baḩrī al Aḩmar" }, "ES" => { "ES-AN" => "Andalucía", "ES-AR" => "Aragón", "ES-AS" => "Asturias, Principado de", "ES-CN" => "Canarias", "ES-CB" => "Cantabria", "ES-CL" => "Castilla y León", "ES-CM" => "Castilla-La Mancha", "ES-CT" => "Catalunya (ca) [Cataluña]", "ES-CE" => "Ceuta", "ES-EX" => "Extremadura", "ES-GA" => "Galicia (gl) [Galicia]", "ES-IB" => "Illes Balears (ca) [Islas Baleares]", "ES-RI" => "La Rioja", "ES-MD" => "Madrid, Comunidad de", "ES-ML" => "Melilla", "ES-MC" => "Murcia, Región de", "ES-NC" => "Navarra, Comunidad Foral deNafarroako Foru Komunitatea (eu)", "ES-PV" => "País VascoEuskal Herria (eu)", "ES-VC" => "Valenciana, Comunitat (ca) [Valenciana, Comunidad]" }, "ET" => { "ET-AA" => "Ādīs Ābeba", "ET-DD" => "Dirē Dawa", "ET-AF" => "Āfar", "ET-AM" => "Āmara", "ET-BE" => "Bīnshangul Gumuz", "ET-GA" => "Gambēla Hizboch", "ET-HA" => "Hārerī Hizb", "ET-OR" => "Oromīya", "ET-SO" => "Sumalē", "ET-TI" => "Tigray", "ET-SN" => "YeDebub Bihēroch Bihēreseboch na Hizboch" }, "FI" => { "FI-01" => "Ahvenanmaan maakunta", "FI-02" => "Etelä-Karjala", "FI-03" => "Etelä-Pohjanmaa", "FI-04" => "Etelä-Savo", "FI-05" => "Kainuu", "FI-06" => "Kanta-Häme", "FI-07" => "Keski-Pohjanmaa", "FI-08" => "Keski-Suomi", "FI-09" => "Kymenlaakso", "FI-10" => "Lappi", "FI-11" => "Pirkanmaa", "FI-12" => "Pohjanmaa", "FI-13" => "Pohjois-Karjala", "FI-14" => "Pohjois-Pohjanmaa", "FI-15" => "Pohjois-Savo", "FI-16" => "Päijät-Häme", "FI-17" => "Satakunta", "FI-18" => "Uusimaa", "FI-19" => "Varsinais-Suomi" }, "FJ" => { "FJ-C" => "Central", "FJ-E" => "Eastern", "FJ-N" => "Northern", "FJ-W" => "Western", "FJ-R" => "Rotuma" }, "FM" => { "FM-TRK" => "Chuuk", "FM-KSA" => "Kosrae", "FM-PNI" => "Pohnpei", "FM-YAP" => "Yap" }, "FR" => { "FR-ARA" => "Auvergne-Rhône-Alpes", "FR-BFC" => "Bourgogne-Franche-Comté", "FR-BRE" => "Bretagne", "FR-CVL" => "Centre-Val de Loire", "FR-20R" => "Corse", "FR-GES" => "Grand-Est", "FR-GP" => "Guadeloupe", "FR-GF" => "Guyane (française)", "FR-HDF" => "Hauts-de-France", "FR-IDF" => "Île-de-France", "FR-MQ" => "Martinique", "FR-YT" => "Mayotte", "FR-NOR" => "Normandie", "FR-NAQ" => "Nouvelle-Aquitaine", "FR-OCC" => "Occitanie", "FR-PDL" => "Pays-de-la-Loire", "FR-PAC" => "Provence-Alpes-Côte-d’Azur", "FR-RE" => "La Réunion" }, "GA" => { "GA-1" => "Estuaire", "GA-2" => "Haut-Ogooué", "GA-3" => "Moyen-Ogooué", "GA-4" => "Ngounié", "GA-5" => "Nyanga", "GA-6" => "Ogooué-Ivindo", "GA-7" => "Ogooué-Lolo", "GA-8" => "Ogooué-Maritime", "GA-9" => "Woleu-Ntem" }, "GB" => { "GB-ENG" => "England", "GB-NIR" => "Northern Ireland", "GB-SCT" => "Scotland", "GB-WLS" => "Wales [Cymru GB-CYM]" }, "GD" => { "GD-01" => "Saint Andrew", "GD-02" => "Saint David", "GD-03" => "Saint George", "GD-04" => "Saint John", "GD-05" => "Saint Mark", "GD-06" => "Saint Patrick", "GD-10" => "Southern Grenadine Islands" }, "GE" => { "GE-AB" => "Abkhazia", "GE-AJ" => "Ajaria", "GE-TB" => "Tbilisi", "GE-GU" => "Guria", "GE-IM" => "Imereti", "GE-KA" => "K'akheti", "GE-KK" => "Kvemo Kartli", "GE-MM" => "Mtskheta-Mtianeti", "GE-RL" => "Rach'a-Lechkhumi-Kvemo Svaneti", "GE-SZ" => "Samegrelo-Zemo Svaneti", "GE-SJ" => "Samtskhe-Javakheti", "GE-SK" => "Shida Kartli" }, "GH" => { "GH-AF" => "Ahafo", "GH-AH" => "Ashanti", "GH-BO" => "Bono", "GH-BE" => "Bono East", "GH-CP" => "Central", "GH-EP" => "Eastern", "GH-AA" => "Greater Accra", "GH-NE" => "North East", "GH-NP" => "Northern", "GH-OT" => "Oti", "GH-SV" => "Savannah", "GH-UE" => "Upper East", "GH-UW" => "Upper West", "GH-TV" => "Volta", "GH-WP" => "Western", "GH-WN" => "Western North" }, "GL" => { "GL-AV" => "Avannaata Kommunia", "GL-KU" => "Kommune Kujalleq", "GL-QT" => "Kommune Qeqertalik", "GL-SM" => "Kommuneqarfik Sermersooq", "GL-QE" => "Qeqqata Kommunia" }, "GM" => { "GM-B" => "Banjul", "GM-M" => "Central River", "GM-L" => "Lower River", "GM-N" => "North Bank", "GM-U" => "Upper River", "GM-W" => "Western" }, "GN" => { "GN-B" => "Boké", "GN-F" => "Faranah", "GN-K" => "Kankan", "GN-D" => "Kindia", "GN-L" => "Labé", "GN-M" => "Mamou", "GN-N" => "Nzérékoré", "GN-C" => "Conakry" }, "GQ" => { "GQ-C" => "Región Continental", "GQ-I" => "Región Insular" }, "GR" => { "GR-A" => "Anatolikí Makedonía kai Thráki", "GR-I" => "Attikí", "GR-G" => "Dytikí Elláda", "GR-C" => "Dytikí Makedonía", "GR-F" => "Ionía Nísia", "GR-D" => "Ípeiros", "GR-B" => "Kentrikí Makedonía", "GR-M" => "Kríti", "GR-L" => "Nótio Aigaío", "GR-J" => "Pelopónnisos", "GR-H" => "Stereá Elláda", "GR-E" => "Thessalía", "GR-K" => "Vóreio Aigaío" }, "GT" => { "GT-AV" => "Alta Verapaz", "GT-BV" => "Baja Verapaz", "GT-CM" => "Chimaltenango", "GT-CQ" => "Chiquimula", "GT-PR" => "El Progreso", "GT-ES" => "Escuintla", "GT-GU" => "Guatemala", "GT-HU" => "Huehuetenango", "GT-IZ" => "Izabal", "GT-JA" => "Jalapa", "GT-JU" => "Jutiapa", "GT-PE" => "Petén", "GT-QZ" => "Quetzaltenango", "GT-QC" => "Quiché", "GT-RE" => "Retalhuleu", "GT-SA" => "Sacatepéquez", "GT-SM" => "San Marcos", "GT-SR" => "Santa Rosa", "GT-SO" => "Sololá", "GT-SU" => "Suchitepéquez", "GT-TO" => "Totonicapán", "GT-ZA" => "Zacapa" }, "GW" => { "GW-L" => "Leste", "GW-N" => "Norte", "GW-S" => "Sul" }, "GY" => { "GY-BA" => "Barima-Waini", "GY-CU" => "Cuyuni-Mazaruni", "GY-DE" => "Demerara-Mahaica", "GY-EB" => "East Berbice-Corentyne", "GY-ES" => "Essequibo Islands-West Demerara", "GY-MA" => "Mahaica-Berbice", "GY-PM" => "Pomeroon-Supenaam", "GY-PT" => "Potaro-Siparuni", "GY-UD" => "Upper Demerara-Berbice", "GY-UT" => "Upper Takutu-Upper Essequibo" }, "HN" => { "HN-AT" => "Atlántida", "HN-CH" => "Choluteca", "HN-CL" => "Colón", "HN-CM" => "Comayagua", "HN-CP" => "Copán", "HN-CR" => "Cortés", "HN-EP" => "El Paraíso", "HN-FM" => "Francisco Morazán", "HN-GD" => "Gracias a Dios", "HN-IN" => "Intibucá", "HN-IB" => "Islas de la Bahía", "HN-LP" => "La Paz", "HN-LE" => "Lempira", "HN-OC" => "Ocotepeque", "HN-OL" => "Olancho", "HN-SB" => "Santa Bárbara", "HN-VA" => "Valle", "HN-YO" => "Yoro" }, "HR" => { "HR-21" => "Grad Zagreb", "HR-07" => "Bjelovarsko-bilogorska županija", "HR-12" => "Brodsko-posavska županija", "HR-19" => "Dubrovačko-neretvanska županija", "HR-18" => "Istarska županija", "HR-04" => "Karlovačka županija", "HR-06" => "Koprivničko-križevačka županija", "HR-02" => "Krapinsko-zagorska županija", "HR-09" => "Ličko-senjska županija", "HR-20" => "Međimurska županija", "HR-14" => "Osječko-baranjska županija", "HR-11" => "Požeško-slavonska županija", "HR-08" => "Primorsko-goranska županija", "HR-03" => "Sisačko-moslavačka županija", "HR-17" => "Splitsko-dalmatinska županija", "HR-15" => "Šibensko-kninska županija", "HR-05" => "Varaždinska županija", "HR-10" => "Virovitičko-podravska županija", "HR-16" => "Vukovarsko-srijemska županija", "HR-13" => "Zadarska županija", "HR-01" => "Zagrebačka županija" }, "HT" => { "HT-AR" => "Artibonite", "HT-CE" => "Centre", "HT-GA" => "Grande’Anse", "HT-NI" => "Nippes", "HT-ND" => "Nord", "HT-NE" => "Nord-Est", "HT-NO" => "Nord-Ouest", "HT-OU" => "Ouest", "HT-SD" => "Sud", "HT-SE" => "Sud-Est" }, "HU" => { "HU-BU" => "Budapest", "HU-BK" => "Bács-Kiskun", "HU-BA" => "Baranya", "HU-BE" => "Békés", "HU-BZ" => "Borsod-Abaúj-Zemplén", "HU-CS" => "Csongrád", "HU-FE" => "Fejér", "HU-GS" => "Győr-Moson-Sopron", "HU-HB" => "Hajdú-Bihar", "HU-HE" => "Heves", "HU-JN" => "Jász-Nagykun-Szolnok", "HU-KE" => "Komárom-Esztergom", "HU-NO" => "Nógrád", "HU-PE" => "Pest", "HU-SO" => "Somogy", "HU-SZ" => "Szabolcs-Szatmár-Bereg", "HU-TO" => "Tolna", "HU-VA" => "Vas", "HU-VE" => "Veszprém", "HU-ZA" => "Zala", "HU-BC" => "Békéscsaba", "HU-DE" => "Debrecen", "HU-DU" => "Dunaújváros", "HU-EG" => "Eger", "HU-ER" => "Érd", "HU-GY" => "Győr", "HU-HV" => "Hódmezővásárhely", "HU-KV" => "Kaposvár", "HU-KM" => "Kecskemét", "HU-MI" => "Miskolc", "HU-NK" => "Nagykanizsa", "HU-NY" => "Nyíregyháza", "HU-PS" => "Pécs", "HU-ST" => "Salgótarján", "HU-SN" => "Sopron", "HU-SD" => "Szeged", "HU-SF" => "Székesfehérvár", "HU-SS" => "Szekszárd", "HU-SK" => "Szolnok", "HU-SH" => "Szombathely", "HU-TB" => "Tatabánya", "HU-VM" => "Veszprém", "HU-ZE" => "Zalaegerszeg" }, "ID" => { "ID-JW" => "Jawa", "ID-KA" => "Kalimantan", "ID-ML" => "Maluku", "ID-NU" => "Nusa Tenggara", "ID-PP" => "Papua", "ID-SL" => "Sulawesi", "ID-SM" => "Sumatera" }, "IE" => { "IE-C" => "Connaught", "IE-L" => "Leinster", "IE-M" => "Munster", "IE-U" => "Ulster" }, "IL" => { "IL-D" => "HaDarom", "IL-M" => "HaMerkaz", "IL-Z" => "HaTsafon", "IL-HA" => "H̱efa", "IL-TA" => "Tel Aviv", "IL-JM" => "Yerushalayim" }, "IN" => { "IN-AP" => "Andhra Pradesh", "IN-AR" => "Arunāchal Pradesh", "IN-AS" => "Assam", "IN-BR" => "Bihār", "IN-CT" => "Chhattīsgarh[note 1]", "IN-GA" => "Goa", "IN-GJ" => "Gujarāt", "IN-HR" => "Haryāna", "IN-HP" => "Himāchal Pradesh", "IN-JH" => "Jhārkhand", "IN-KA" => "Karnātaka", "IN-KL" => "Kerala", "IN-MP" => "Madhya Pradesh", "IN-MH" => "Mahārāshtra", "IN-MN" => "Manipur", "IN-ML" => "Meghālaya", "IN-MZ" => "Mizoram", "IN-NL" => "Nāgāland", "IN-OR" => "Odisha[note 2]", "IN-PB" => "Punjab", "IN-RJ" => "Rājasthān", "IN-SK" => "Sikkim", "IN-TN" => "Tamil Nādu", "IN-TG" => "Telangāna[note 3]", "IN-TR" => "Tripura", "IN-UT" => "Uttarākhand[note 4]", "IN-UP" => "Uttar Pradesh", "IN-WB" => "West Bengal", "IN-AN" => "Andaman and Nicobar Islands", "IN-CH" => "Chandigarh", "IN-DH" => "Dādra and Nagar Haveli and Damān and Diu[note 5]", "IN-DL" => "Delhi", "IN-JK" => "Jammu and Kashmīr", "IN-LA" => "Ladākh", "IN-LD" => "Lakshadweep", "IN-PY" => "Puducherry" }, "IQ" => { "IQ-AN" => "Al Anbār", "IQ-BA" => "Al Başrah", "IQ-MU" => "Al Muthanná", "IQ-QA" => "Al Qādisīyah", "IQ-NA" => "An Najaf", "IQ-AR" => "Arbīl", "IQ-SU" => "As Sulaymānīyah", "IQ-BB" => "Bābil", "IQ-BG" => "Baghdād", "IQ-DA" => "Dahūk", "IQ-DQ" => "Dhī Qār", "IQ-DI" => "Diyālá", "IQ-KA" => "Karbalā’", "IQ-KI" => "Kirkūk", "IQ-MA" => "Maysān", "IQ-NI" => "Nīnawá", "IQ-SD" => "Şalāḩ ad Dīn", "IQ-WA" => "Wāsiţ", "IQ-HA" => "Halabja" }, "IR" => { "IR-30" => "Alborz", "IR-24" => "Ardabīl", "IR-04" => "Āz̄ārbāyjān-e Ghārbī", "IR-03" => "Āz̄ārbāyjān-e Shārqī", "IR-18" => "Būshehr", "IR-14" => "Chahār Maḩāl va Bakhtīārī", "IR-10" => "Eşfahān", "IR-07" => "Fārs", "IR-01" => "Gīlān", "IR-27" => "Golestān", "IR-13" => "Hamadān", "IR-22" => "Hormozgān", "IR-16" => "Īlām", "IR-08" => "Kermān", "IR-05" => "Kermānshāh", "IR-29" => "Khorāsān-e Jonūbī", "IR-09" => "Khorāsān-e Raẕavī", "IR-28" => "Khorāsān-e Shomālī", "IR-06" => "Khūzestān", "IR-17" => "Kohgīlūyeh va Bowyer Aḩmad", "IR-12" => "Kordestān", "IR-15" => "Lorestān", "IR-00" => "Markazī", "IR-02" => "Māzandarān", "IR-26" => "Qazvīn", "IR-25" => "Qom", "IR-20" => "Semnān", "IR-11" => "Sīstān va Balūchestān", "IR-23" => "Tehrān", "IR-21" => "Yazd", "IR-19" => "Zanjān" }, "IS" => { "IS-1" => "Höfuðborgarsvæði", "IS-2" => "Suðurnes", "IS-3" => "Vesturland", "IS-4" => "Vestfirðir", "IS-5" => "Norðurland vestra", "IS-6" => "Norðurland eystra", "IS-7" => "Austurland", "IS-8" => "Suðurland" }, "IT" => { "IT-65" => "Abruzzo", "IT-77" => "Basilicata", "IT-78" => "Calabria", "IT-72" => "Campania", "IT-45" => "Emilia-Romagna", "IT-62" => "Lazio", "IT-42" => "Liguria", "IT-25" => "Lombardia", "IT-57" => "Marche", "IT-67" => "Molise", "IT-21" => "Piemonte", "IT-75" => "Puglia", "IT-52" => "Toscana", "IT-55" => "Umbria", "IT-34" => "Veneto" }, "JM" => { "JM-13" => "Clarendon", "JM-09" => "Hanover", "JM-01" => "Kingston", "JM-12" => "Manchester", "JM-04" => "Portland", "JM-02" => "Saint Andrew", "JM-06" => "Saint Ann", "JM-14" => "Saint Catherine", "JM-11" => "Saint Elizabeth", "JM-08" => "Saint James", "JM-05" => "Saint Mary", "JM-03" => "Saint Thomas", "JM-07" => "Trelawny", "JM-10" => "Westmoreland" }, "JO" => { "JO-AJ" => "‘Ajlūn", "JO-AQ" => "Al ‘Aqabah", "JO-AM" => "Al ‘A̅şimah", "JO-BA" => "Al Balqā’", "JO-KA" => "Al Karak", "JO-MA" => "Al Mafraq", "JO-AT" => "Aţ Ţafīlah", "JO-AZ" => "Az Zarqā’", "JO-IR" => "Irbid", "JO-JA" => "Jarash", "JO-MN" => "Ma‘ān", "JO-MD" => "Mādabā" }, "JP" => { "JP-23" => "Aiti", "JP-05" => "Akita", "JP-02" => "Aomori", "JP-38" => "Ehime", "JP-21" => "Gihu", "JP-10" => "Gunma", "JP-34" => "Hirosima", "JP-01" => "Hokkaidô", "JP-18" => "Hukui", "JP-40" => "Hukuoka", "JP-07" => "Hukusima", "JP-28" => "Hyôgo", "JP-08" => "Ibaraki", "JP-17" => "Isikawa", "JP-03" => "Iwate", "JP-37" => "Kagawa", "JP-46" => "Kagosima", "JP-14" => "Kanagawa", "JP-39" => "Kôti", "JP-43" => "Kumamoto", "JP-26" => "Kyôto", "JP-24" => "Mie", "JP-04" => "Miyagi", "JP-45" => "Miyazaki", "JP-20" => "Nagano", "JP-42" => "Nagasaki", "JP-29" => "Nara", "JP-15" => "Niigata", "JP-44" => "Ôita", "JP-33" => "Okayama", "JP-47" => "Okinawa", "JP-27" => "Ôsaka", "JP-41" => "Saga", "JP-11" => "Saitama", "JP-25" => "Siga", "JP-32" => "Simane", "JP-22" => "Sizuoka", "JP-12" => "Tiba", "JP-09" => "Totigi", "JP-36" => "Tokusima", "JP-13" => "Tôkyô", "JP-31" => "Tottori", "JP-16" => "Toyama", "JP-30" => "Wakayama", "JP-06" => "Yamagata", "JP-35" => "Yamaguti", "JP-19" => "Yamanasi" }, "KE" => { "KE-01" => "Baringo", "KE-02" => "Bomet", "KE-03" => "Bungoma", "KE-04" => "Busia", "KE-05" => "Elgeyo/Marakwet", "KE-06" => "Embu", "KE-07" => "Garissa", "KE-08" => "Homa Bay", "KE-09" => "Isiolo", "KE-10" => "Kajiado", "KE-11" => "Kakamega", "KE-12" => "Kericho", "KE-13" => "Kiambu", "KE-14" => "Kilifi", "KE-15" => "Kirinyaga", "KE-16" => "Kisii", "KE-17" => "Kisumu", "KE-18" => "Kitui", "KE-19" => "Kwale", "KE-20" => "Laikipia", "KE-21" => "Lamu", "KE-22" => "Machakos", "KE-23" => "Makueni", "KE-24" => "Mandera", "KE-25" => "Marsabit", "KE-26" => "Meru", "KE-27" => "Migori", "KE-28" => "Mombasa", "KE-29" => "Murang'a", "KE-30" => "Nairobi City", "KE-31" => "Nakuru", "KE-32" => "Nandi", "KE-33" => "Narok", "KE-34" => "Nyamira", "KE-35" => "Nyandarua", "KE-36" => "Nyeri", "KE-37" => "Samburu", "KE-38" => "Siaya", "KE-39" => "Taita/Taveta", "KE-40" => "Tana River", "KE-41" => "Tharaka-Nithi", "KE-42" => "Trans Nzoia", "KE-43" => "Turkana", "KE-44" => "Uasin Gishu", "KE-45" => "Vihiga", "KE-46" => "Wajir", "KE-47" => "West Pokot" }, "KG" => { "KG-GB" => "Bishkek Shaary", "KG-GO" => "Osh Shaary", "KG-B" => "Batken", "KG-C" => "Chüy", "KG-J" => "Jalal-Abad", "KG-N" => "Naryn", "KG-O" => "Osh", "KG-T" => "Talas", "KG-Y" => "Ysyk-Köl" }, "KH" => { "KH-12" => "Phnom Penh", "KH-2" => "Baat Dambang", "KH-1" => "Banteay Mean Choăy", "KH-3" => "Kampong Chaam", "KH-4" => "Kampong Chhnang", "KH-5" => "Kampong Spueu", "KH-6" => "Kampong Thum", "KH-7" => "Kampot", "KH-8" => "Kandaal", "KH-9" => "Kaoh Kong", "KH-10" => "Kracheh", "KH-23" => "Kaeb", "KH-24" => "Pailin", "KH-18" => "Preah Sihanouk", "KH-11" => "Mondol Kiri", "KH-22" => "Otdar Mean Chey", "KH-15" => "Pousaat", "KH-13" => "Preah Vihear", "KH-14" => "Prey Veaeng", "KH-16" => "Rotanak Kiri", "KH-17" => "Siem Reab", "KH-19" => "Stueng Traeng", "KH-20" => "Svaay Rieng", "KH-21" => "Taakaev", "KH-25" => "Tbong Khmum" }, "KI" => { "KI-G" => "Gilbert Islands", "KI-L" => "Line Islands", "KI-P" => "Phoenix Islands" }, "KM" => { "KM-G" => "Grande Comore", "KM-A" => "Anjouan", "KM-M" => "Mohéli" }, "KN" => { "KN-K" => "Saint Kitts", "KN-N" => "Nevis" }, "KP" => { "KP-01" => "Pyongyang", "KP-13" => "Rason", "KP-14" => "Nampo", "KP-02" => "South Pyongan", "KP-03" => "North Pyongan", "KP-04" => "Chagang", "KP-05" => "South Hwanghae", "KP-06" => "North Hwanghae", "KP-07" => "Kangwon", "KP-08" => "South Hamgyong", "KP-09" => "North Hamgyong", "KP-10" => "Ryanggang" }, "KR" => { "KR-11" => "Seoul", "KR-26" => "Busan", "KR-27" => "Daegu", "KR-30" => "Daejeon", "KR-29" => "Gwangju", "KR-28" => "Incheon", "KR-31" => "Ulsan", "KR-43" => "North Chungcheong", "KR-44" => "South Chungcheong", "KR-42" => "Gangwon", "KR-41" => "Gyeonggi", "KR-47" => "North Gyeongsang", "KR-48" => "South Gyeongsang", "KR-45" => "North Jeolla", "KR-46" => "South Jeolla", "KR-49" => "Jeju", "KR-50" => "Sejong" }, "KW" => { "KW-AH" => "Al Aḩmadī", "KW-FA" => "Al Farwānīyah", "KW-JA" => "Al Jahrā’", "KW-KU" => "Al ‘Āşimah", "KW-HA" => "Ḩawallī", "KW-MU" => "Mubārak al Kabīr" }, "KZ" => { "KZ-ALA" => "Almaty", "KZ-ALM" => "Almaty oblysy", "KZ-AKM" => "Aqmola oblysy", "KZ-AKT" => "Aqtöbe oblysy", "KZ-ATY" => "Atyraū oblysy", "KZ-ZAP" => "Batys Qazaqstan oblysy", "KZ-MAN" => "Mangghystaū oblysy", "KZ-AST" => "Nur-Sultan", "KZ-PAV" => "Pavlodar oblysy", "KZ-KAR" => "Qaraghandy oblysy", "KZ-KUS" => "Qostanay oblysy", "KZ-KZY" => "Qyzylorda oblysy", "KZ-VOS" => "Shyghys Qazaqstan oblysy", "KZ-SHY" => "Shymkent", "KZ-SEV" => "Soltüstik Qazaqstan oblysy", "KZ-YUZ" => "Türkistan oblysy", "KZ-ZHA" => "Zhambyl oblysy" }, "LA" => { "LA-VT" => "Viangchan", "LA-AT" => "Attapu", "LA-BK" => "Bokèo", "LA-BL" => "Bolikhamxai", "LA-CH" => "Champasak", "LA-HO" => "Houaphan", "LA-KH" => "Khammouan", "LA-LM" => "Louang Namtha", "LA-LP" => "Louangphabang", "LA-OU" => "Oudômxai", "LA-PH" => "Phôngsali", "LA-SL" => "Salavan", "LA-SV" => "Savannakhét", "LA-VI" => "Viangchan", "LA-XA" => "Xaignabouli", "LA-XE" => "Xékong", "LA-XI" => "Xiangkhouang", "LA-XS" => "Xaisômboun" }, "LB" => { "LB-AK" => "Aakkâr", "LB-BH" => "Baalbek-Hermel", "LB-BI" => "Béqaa", "LB-BA" => "Beyrouth", "LB-AS" => "Liban-Nord", "LB-JA" => "Liban-Sud", "LB-JL" => "Mont-Liban", "LB-NA" => "Nabatîyé" }, "LC" => { "LC-01" => "Anse la Raye", "LC-12" => "Canaries", "LC-02" => "Castries", "LC-03" => "Choiseul", "LC-05" => "Dennery", "LC-06" => "Gros Islet", "LC-07" => "Laborie", "LC-08" => "Micoud", "LC-10" => "Soufrière", "LC-11" => "Vieux Fort" }, "LI" => { "LI-01" => "Balzers", "LI-02" => "Eschen", "LI-03" => "Gamprin", "LI-04" => "Mauren", "LI-05" => "Planken", "LI-06" => "Ruggell", "LI-07" => "Schaan", "LI-08" => "Schellenberg", "LI-09" => "Triesen", "LI-10" => "Triesenberg", "LI-11" => "Vaduz" }, "LK" => { "LK-1" => "Western Province", "LK-2" => "Central Province", "LK-3" => "Southern Province", "LK-4" => "Northern Province", "LK-5" => "Eastern Province", "LK-6" => "North Western Province", "LK-7" => "North Central Province", "LK-8" => "Uva Province", "LK-9" => "Sabaragamuwa Province" }, "LR" => { "LR-BM" => "Bomi", "LR-BG" => "Bong", "LR-GP" => "Gbarpolu", "LR-GB" => "Grand Bassa", "LR-CM" => "Grand Cape Mount", "LR-GG" => "Grand Gedeh", "LR-GK" => "Grand Kru", "LR-LO" => "Lofa", "LR-MG" => "Margibi", "LR-MY" => "Maryland", "LR-MO" => "Montserrado", "LR-NI" => "Nimba", "LR-RI" => "River Cess(local variant is Rivercess)", "LR-RG" => "River Gee", "LR-SI" => "Sinoe" }, "LS" => { "LS-D" => "Berea", "LS-B" => "Botha-Bothe", "LS-C" => "Leribe", "LS-E" => "Mafeteng", "LS-A" => "Maseru", "LS-F" => "Mohale's Hoek", "LS-J" => "Mokhotlong", "LS-H" => "Qacha's Nek", "LS-G" => "Quthing", "LS-K" => "Thaba-Tseka" }, "LT" => { "LT-AL" => "Alytaus apskritis", "LT-KU" => "Kauno apskritis", "LT-KL" => "Klaipėdos apskritis", "LT-MR" => "Marijampolės apskritis", "LT-PN" => "Panevėžio apskritis", "LT-SA" => "Šiaulių apskritis", "LT-TA" => "Tauragės apskritis", "LT-TE" => "Telšių apskritis", "LT-UT" => "Utenos apskritis", "LT-VL" => "Vilniaus apskritis" }, "LU" => { "LU-CA" => "Capellen", "LU-CL" => "Clervaux", "LU-DI" => "Diekirch", "LU-EC" => "Echternach", "LU-ES" => "Esch-sur-Alzette", "LU-GR" => "Grevenmacher", "LU-LU" => "Luxembourg", "LU-ME" => "Mersch", "LU-RD" => "Redange", "LU-RM" => "Remich", "LU-VD" => "Vianden", "LU-WI" => "Wiltz" }, "LV" => { "LV-001" => "Aglonas novads", "LV-002" => "Aizkraukles novads", "LV-003" => "Aizputes novads", "LV-004" => "Aknīstes novads", "LV-005" => "Alojas novads", "LV-006" => "Alsungas novads", "LV-007" => "Alūksnes novads", "LV-008" => "Amatas novads", "LV-009" => "Apes novads", "LV-010" => "Auces novads", "LV-011" => "Ādažu novads", "LV-012" => "Babītes novads", "LV-013" => "Baldones novads", "LV-014" => "Baltinavas novads", "LV-015" => "Balvu novads", "LV-016" => "Bauskas novads", "LV-017" => "Beverīnas novads", "LV-018" => "Brocēnu novads", "LV-019" => "Burtnieku novads", "LV-020" => "Carnikavas novads", "LV-021" => "Cesvaines novads", "LV-022" => "Cēsu novads", "LV-023" => "Ciblas novads", "LV-024" => "Dagdas novads", "LV-025" => "Daugavpils novads", "LV-026" => "Dobeles novads", "LV-027" => "Dundagas novads", "LV-028" => "Durbes novads", "LV-029" => "Engures novads", "LV-030" => "Ērgļu novads", "LV-031" => "Garkalnes novads", "LV-032" => "Grobiņas novads", "LV-033" => "Gulbenes novads", "LV-034" => "Iecavas novads", "LV-035" => "Ikšķiles novads", "LV-036" => "Ilūkstes novads", "LV-037" => "Inčukalna novads", "LV-038" => "Jaunjelgavas novads", "LV-039" => "Jaunpiebalgas novads", "LV-040" => "Jaunpils novads", "LV-041" => "Jelgavas novads", "LV-042" => "Jēkabpils novads", "LV-043" => "Kandavas novads", "LV-044" => "Kārsavas novads", "LV-045" => "Kocēnu novads", "LV-046" => "Kokneses novads", "LV-047" => "Krāslavas novads", "LV-048" => "Krimuldas novads", "LV-049" => "Krustpils novads", "LV-050" => "Kuldīgas novads", "LV-051" => "Ķeguma novads", "LV-052" => "Ķekavas novads", "LV-053" => "Lielvārdes novads", "LV-054" => "Limbažu novads", "LV-055" => "Līgatnes novads", "LV-056" => "Līvānu novads", "LV-057" => "Lubānas novads", "LV-058" => "Ludzas novads", "LV-059" => "Madonas novads", "LV-060" => "Mazsalacas novads", "LV-061" => "Mālpils novads", "LV-062" => "Mārupes novads", "LV-063" => "Mērsraga novads", "LV-064" => "Naukšēnu novads", "LV-065" => "Neretas novads", "LV-066" => "Nīcas novads", "LV-067" => "Ogres novads", "LV-068" => "Olaines novads", "LV-069" => "Ozolnieku novads", "LV-070" => "Pārgaujas novads", "LV-071" => "Pāvilostas novads", "LV-072" => "Pļaviņu novads", "LV-073" => "Preiļu novads", "LV-074" => "Priekules novads", "LV-075" => "Priekuļu novads", "LV-076" => "Raunas novads", "LV-077" => "Rēzeknes novads", "LV-078" => "Riebiņu novads", "LV-079" => "Rojas novads", "LV-080" => "Ropažu novads", "LV-081" => "Rucavas novads", "LV-082" => "Rugāju novads", "LV-083" => "Rundāles novads", "LV-084" => "Rūjienas novads", "LV-085" => "Salas novads", "LV-086" => "Salacgrīvas novads", "LV-087" => "Salaspils novads", "LV-088" => "Saldus novads", "LV-089" => "Saulkrastu novads", "LV-090" => "Sējas novads", "LV-091" => "Siguldas novads", "LV-092" => "Skrīveru novads", "LV-093" => "Skrundas novads", "LV-094" => "Smiltenes novads", "LV-095" => "Stopiņu novads", "LV-096" => "Strenču novads", "LV-097" => "Talsu novads", "LV-098" => "Tērvetes novads", "LV-099" => "Tukuma novads", "LV-100" => "Vaiņodes novads", "LV-101" => "Valkas novads", "LV-102" => "Varakļānu novads", "LV-103" => "Vārkavas novads", "LV-104" => "Vecpiebalgas novads", "LV-105" => "Vecumnieku novads", "LV-106" => "Ventspils novads", "LV-107" => "Viesītes novads", "LV-108" => "Viļakas novads", "LV-109" => "Viļānu novads", "LV-110" => "Zilupes novads", "LV-DGV" => "Daugavpils", "LV-JEL" => "Jelgava", "LV-JKB" => "Jēkabpils", "LV-JUR" => "Jūrmala", "LV-LPX" => "Liepāja", "LV-REZ" => "Rēzekne", "LV-RIX" => "Rīga", "LV-VMR" => "Valmiera", "LV-VEN" => "Ventspils" }, "LY" => { "LY-BU" => "Al Buţnān", "LY-JA" => "Al Jabal al Akhḑar", "LY-JG" => "Al Jabal al Gharbī", "LY-JI" => "Al Jafārah", "LY-JU" => "Al Jufrah", "LY-KF" => "Al Kufrah", "LY-MJ" => "Al Marj", "LY-MB" => "Al Marqab", "LY-WA" => "Al Wāḩāt", "LY-NQ" => "An Nuqāţ al Khams", "LY-ZA" => "Az Zāwiyah", "LY-BA" => "Banghāzī", "LY-DR" => "Darnah", "LY-GT" => "Ghāt", "LY-MI" => "Mişrātah", "LY-MQ" => "Murzuq", "LY-NL" => "Nālūt", "LY-SB" => "Sabhā", "LY-SR" => "Surt", "LY-TB" => "Ţarābulus", "LY-WD" => "Wādī al Ḩayāt", "LY-WS" => "Wādī ash Shāţi’" }, "MA" => { "MA-05" => "Béni Mellal-Khénifra", "MA-06" => "Casablanca-Settat", "MA-12" => "Dakhla-Oued Ed-Dahab (EH)", "MA-08" => "Drâa-Tafilalet", "MA-03" => "Fès-Meknès", "MA-10" => "Guelmim-Oued Noun (EH-partial)", "MA-11" => "Laâyoune-Sakia El Hamra (EH-partial)", "MA-07" => "Marrakech-Safi", "MA-02" => "L'Oriental", "MA-04" => "Rabat-Salé-Kénitra", "MA-09" => "Souss-Massa", "MA-01" => "Tanger-Tétouan-Al Hoceïma" }, "MC" => { "MC-FO" => "Fontvieille", "MC-JE" => "Jardin Exotique", "MC-CL" => "La Colle", "MC-CO" => "La Condamine", "MC-GA" => "La Gare", "MC-SO" => "La Source", "MC-LA" => "Larvotto", "MC-MA" => "Malbousquet", "MC-MO" => "Monaco-Ville", "MC-MG" => "Moneghetti", "MC-MC" => "Monte-Carlo", "MC-MU" => "Moulins", "MC-PH" => "Port-Hercule", "MC-SR" => "Saint-Roman", "MC-SD" => "Sainte-Dévote", "MC-SP" => "Spélugues", "MC-VR" => "Vallon de la Rousse" }, "MD" => { "MD-GA" => "Găgăuzia, Unitatea teritorială autonomă (UTAG)", "MD-BA" => "Bălți", "MD-BD" => "Bender [Tighina]", "MD-CU" => "Chișinău", "MD-AN" => "Anenii Noi", "MD-BS" => "Basarabeasca", "MD-BR" => "Briceni", "MD-CA" => "Cahul", "MD-CT" => "Cantemir", "MD-CL" => "Călărași", "MD-CS" => "Căușeni", "MD-CM" => "Cimișlia", "MD-CR" => "Criuleni", "MD-DO" => "Dondușeni", "MD-DR" => "Drochia", "MD-DU" => "Dubăsari", "MD-ED" => "Edineț", "MD-FA" => "Fălești", "MD-FL" => "Florești", "MD-GL" => "Glodeni", "MD-HI" => "Hîncești", "MD-IA" => "Ialoveni", "MD-LE" => "Leova", "MD-NI" => "Nisporeni", "MD-OC" => "Ocnița", "MD-OR" => "Orhei", "MD-RE" => "Rezina", "MD-RI" => "Rîșcani", "MD-SI" => "Sîngerei", "MD-SO" => "Soroca", "MD-ST" => "Strășeni", "MD-SD" => "Șoldănești", "MD-SV" => "Ștefan Vodă", "MD-TA" => "Taraclia", "MD-TE" => "Telenești", "MD-UN" => "Ungheni", "MD-SN" => "Stînga Nistrului, unitatea teritorială din" }, "ME" => { "ME-01" => "Andrijevica", "ME-02" => "Bar", "ME-03" => "Berane", "ME-04" => "Bijelo Polje", "ME-05" => "Budva", "ME-06" => "Cetinje", "ME-07" => "Danilovgrad", "ME-08" => "Herceg-Novi", "ME-09" => "Kolašin", "ME-10" => "Kotor", "ME-11" => "Mojkovac", "ME-12" => "Nikšić", "ME-13" => "Plav", "ME-14" => "Pljevlja", "ME-15" => "Plužine", "ME-16" => "Podgorica", "ME-17" => "Rožaje", "ME-18" => "Šavnik", "ME-19" => "Tivat", "ME-20" => "Ulcinj", "ME-21" => "Žabljak", "ME-22" => "Gusinje", "ME-23" => "Petnjica", "ME-24" => "Tuzi" }, "MG" => { "MG-T" => "Antananarivo", "MG-D" => "Antsiranana", "MG-F" => "Fianarantsoa", "MG-M" => "Mahajanga", "MG-A" => "Toamasina", "MG-U" => "Toliara" }, "MH" => { "MH-L" => "Ralik chain", "MH-T" => "Ratak chain" }, "MK" => { "MK-801" => "Aerodrom", "MK-802" => "Aračinovo", "MK-201" => "Berovo", "MK-501" => "Bitola", "MK-401" => "Bogdanci", "MK-601" => "Bogovinje", "MK-402" => "Bosilovo", "MK-602" => "Brvenica", "MK-803" => "Butel", "MK-814" => "Centar", "MK-313" => "Centar Župa", "MK-815" => "Čair", "MK-109" => "Čaška", "MK-210" => "Češinovo-Obleševo", "MK-816" => "Čučer-Sandevo", "MK-303" => "Debar", "MK-304" => "Debarca", "MK-203" => "Delčevo", "MK-502" => "Demir Hisar", "MK-103" => "Demir Kapija", "MK-406" => "Dojran", "MK-503" => "Dolneni", "MK-804" => "Gazi Baba", "MK-405" => "Gevgelija", "MK-805" => "Gjorče Petrov", "MK-604" => "Gostivar", "MK-102" => "Gradsko", "MK-807" => "Ilinden", "MK-606" => "Jegunovce", "MK-205" => "Karbinci", "MK-808" => "Karpoš", "MK-104" => "Kavadarci", "MK-307" => "Kičevo", "MK-809" => "Kisela Voda", "MK-206" => "Kočani", "MK-407" => "Konče", "MK-701" => "Kratovo", "MK-702" => "Kriva Palanka", "MK-504" => "Krivogaštani", "MK-505" => "Kruševo", "MK-703" => "Kumanovo", "MK-704" => "Lipkovo", "MK-105" => "Lozovo", "MK-207" => "Makedonska Kamenica", "MK-308" => "Makedonski Brod", "MK-607" => "Mavrovo i Rostuše", "MK-506" => "Mogila", "MK-106" => "Negotino", "MK-507" => "Novaci", "MK-408" => "Novo Selo", "MK-310" => "Ohrid", "MK-208" => "Pehčevo", "MK-810" => "Petrovec", "MK-311" => "Plasnica", "MK-508" => "Prilep", "MK-209" => "Probištip", "MK-409" => "Radoviš", "MK-705" => "Rankovce", "MK-509" => "Resen", "MK-107" => "Rosoman", "MK-811" => "Saraj", "MK-812" => "Sopište", "MK-706" => "Staro Nagoričane", "MK-312" => "Struga", "MK-410" => "Strumica", "MK-813" => "Studeničani", "MK-108" => "Sveti Nikole", "MK-211" => "Štip", "MK-817" => "Šuto Orizari", "MK-608" => "Tearce", "MK-609" => "Tetovo", "MK-403" => "Valandovo", "MK-404" => "Vasilevo", "MK-101" => "Veles", "MK-301" => "Vevčani", "MK-202" => "Vinica", "MK-603" => "Vrapčište", "MK-806" => "Zelenikovo", "MK-204" => "Zrnovci", "MK-605" => "Želino" }, "ML" => { "ML-BKO" => "Bamako", "ML-7" => "Gao", "ML-1" => "Kayes", "ML-8" => "Kidal", "ML-2" => "Koulikoro", "ML-9" => "Ménaka", "ML-5" => "Mopti", "ML-4" => "Ségou", "ML-3" => "Sikasso", "ML-10" => "Taoudénit(local variants are Taoudenni, Taoudéni)", "ML-6" => "Tombouctou" }, "MM" => { "MM-07" => "Ayeyarwady", "MM-02" => "Bago", "MM-03" => "Magway", "MM-04" => "Mandalay", "MM-01" => "Sagaing", "MM-05" => "Tanintharyi", "MM-06" => "Yangon", "MM-14" => "Chin", "MM-11" => "Kachin", "MM-12" => "Kayah", "MM-13" => "Kayin", "MM-15" => "Mon", "MM-16" => "Rakhine", "MM-17" => "Shan", "MM-18" => "Nay Pyi Taw" }, "MN" => { "MN-1" => "Ulaanbaatar", "MN-073" => "Arhangay", "MN-069" => "Bayanhongor", "MN-071" => "Bayan-Ölgiy", "MN-067" => "Bulgan", "MN-037" => "Darhan uul", "MN-061" => "Dornod", "MN-063" => "Dornogovĭ", "MN-059" => "Dundgovĭ", "MN-057" => "Dzavhan", "MN-065" => "Govĭ-Altay", "MN-064" => "Govĭ-Sümber", "MN-039" => "Hentiy", "MN-043" => "Hovd", "MN-041" => "Hövsgöl", "MN-053" => "Ömnögovĭ", "MN-035" => "Orhon", "MN-055" => "Övörhangay", "MN-049" => "Selenge", "MN-051" => "Sühbaatar", "MN-047" => "Töv", "MN-046" => "Uvs" }, "MR" => { "MR-07" => "Adrar", "MR-03" => "Assaba", "MR-05" => "Brakna", "MR-08" => "Dakhlet Nouâdhibou", "MR-04" => "Gorgol", "MR-10" => "Guidimaka", "MR-01" => "Hodh ech Chargui", "MR-02" => "Hodh el Gharbi", "MR-12" => "Inchiri", "MR-09" => "Tagant", "MR-11" => "Tiris Zemmour", "MR-06" => "Trarza" }, "MT" => { "MT-01" => "Attard", "MT-02" => "Balzan", "MT-03" => "Birgu", "MT-04" => "Birkirkara", "MT-05" => "Birżebbuġa", "MT-06" => "Bormla", "MT-07" => "Dingli", "MT-08" => "Fgura", "MT-09" => "Floriana", "MT-10" => "Fontana", "MT-11" => "Gudja", "MT-12" => "Gżira", "MT-13" => "Għajnsielem", "MT-14" => "Għarb", "MT-15" => "Għargħur", "MT-16" => "Għasri", "MT-17" => "Għaxaq", "MT-18" => "Ħamrun", "MT-19" => "Iklin", "MT-20" => "Isla", "MT-21" => "Kalkara", "MT-22" => "Kerċem", "MT-23" => "Kirkop", "MT-24" => "Lija", "MT-25" => "Luqa", "MT-26" => "Marsa", "MT-27" => "Marsaskala", "MT-28" => "Marsaxlokk", "MT-29" => "Mdina", "MT-30" => "Mellieħa", "MT-31" => "Mġarr", "MT-32" => "Mosta", "MT-33" => "Mqabba", "MT-34" => "Msida", "MT-35" => "Mtarfa", "MT-36" => "Munxar", "MT-37" => "Nadur", "MT-38" => "Naxxar", "MT-39" => "Paola", "MT-40" => "Pembroke", "MT-41" => "Pietà", "MT-42" => "Qala", "MT-43" => "Qormi", "MT-44" => "Qrendi", "MT-45" => "Rabat Gozo", "MT-46" => "Rabat Malta", "MT-47" => "Safi", "MT-48" => "Saint Julian's", "MT-49" => "Saint John", "MT-50" => "Saint Lawrence", "MT-51" => "Saint Paul's Bay", "MT-52" => "Sannat", "MT-53" => "Saint Lucia's", "MT-54" => "Santa Venera", "MT-55" => "Siġġiewi", "MT-56" => "Sliema", "MT-57" => "Swieqi", "MT-58" => "Ta' Xbiex", "MT-59" => "Tarxien", "MT-60" => "Valletta", "MT-61" => "Xagħra", "MT-62" => "Xewkija", "MT-63" => "Xgħajra", "MT-64" => "Żabbar", "MT-65" => "Żebbuġ Gozo", "MT-66" => "Żebbuġ Malta", "MT-67" => "Żejtun", "MT-68" => "Żurrieq" }, "MU" => { "MU-AG" => "Agalega Islands", "MU-CC" => "Cargados Carajos Shoals(local variant is Saint Brandon Islands)", "MU-RO" => "Rodrigues Island", "MU-BL" => "Black River", "MU-FL" => "Flacq", "MU-GP" => "Grand Port", "MU-MO" => "Moka", "MU-PA" => "Pamplemousses", "MU-PW" => "Plaines Wilhems", "MU-PL" => "Port Louis", "MU-RR" => "Rivière du Rempart", "MU-SA" => "Savanne" }, "MV" => { "MV-01" => "Addu City", "MV-MLE" => "Male" }, "MW" => { "MW-C" => "Central Region", "MW-N" => "Northern Region", "MW-S" => "Southern Region" }, "MX" => { "MX-CMX" => "Ciudad de México", "MX-AGU" => "Aguascalientes", "MX-BCN" => "Baja California", "MX-BCS" => "Baja California Sur", "MX-CAM" => "Campeche", "MX-COA" => "Coahuila de Zaragoza", "MX-COL" => "Colima", "MX-CHP" => "Chiapas", "MX-CHH" => "Chihuahua", "MX-DUR" => "Durango", "MX-GUA" => "Guanajuato", "MX-GRO" => "Guerrero", "MX-HID" => "Hidalgo", "MX-JAL" => "Jalisco", "MX-MEX" => "México", "MX-MIC" => "Michoacán de Ocampo", "MX-MOR" => "Morelos", "MX-NAY" => "Nayarit", "MX-NLE" => "Nuevo León", "MX-OAX" => "Oaxaca", "MX-PUE" => "Puebla", "MX-QUE" => "Querétaro", "MX-ROO" => "Quintana Roo", "MX-SLP" => "San Luis Potosí", "MX-SIN" => "Sinaloa", "MX-SON" => "Sonora", "MX-TAB" => "Tabasco", "MX-TAM" => "Tamaulipas", "MX-TLA" => "Tlaxcala", "MX-VER" => "Veracruz de Ignacio de la Llave", "MX-YUC" => "Yucatán", "MX-ZAC" => "Zacatecas" }, "MY" => { "MY-14" => "Wilayah Persekutuan Kuala Lumpur", "MY-15" => "Wilayah Persekutuan Labuan", "MY-16" => "Wilayah Persekutuan Putrajaya", "MY-01" => "Johor", "MY-02" => "Kedah", "MY-03" => "Kelantan", "MY-04" => "Melaka", "MY-05" => "Negeri Sembilan", "MY-06" => "Pahang", "MY-08" => "Perak", "MY-09" => "Perlis", "MY-07" => "Pulau Pinang", "MY-12" => "Sabah", "MY-13" => "Sarawak", "MY-10" => "Selangor", "MY-11" => "Terengganu" }, "MZ" => { "MZ-MPM" => "Maputo", "MZ-P" => "Cabo Delgado", "MZ-G" => "Gaza", "MZ-I" => "Inhambane", "MZ-B" => "Manica", "MZ-L" => "Maputo", "MZ-N" => "Nampula", "MZ-A" => "Niassa", "MZ-S" => "Sofala", "MZ-T" => "Tete", "MZ-Q" => "Zambézia" }, "NA" => { "NA-ER" => "Erongo", "NA-HA" => "Hardap", "NA-KA" => "//Karas(local variants are Karas and !Karas)", "NA-KE" => "Kavango East", "NA-KW" => "Kavango West", "NA-KH" => "Khomas", "NA-KU" => "Kunene", "NA-OW" => "Ohangwena", "NA-OH" => "Omaheke", "NA-OS" => "Omusati", "NA-ON" => "Oshana", "NA-OT" => "Oshikoto", "NA-OD" => "Otjozondjupa", "NA-CA" => "Zambezi" }, "NE" => { "NE-8" => "Niamey", "NE-1" => "Agadez", "NE-2" => "Diffa", "NE-3" => "Dosso", "NE-4" => "Maradi", "NE-5" => "Tahoua", "NE-6" => "Tillabéri", "NE-7" => "Zinder" }, "NG" => { "NG-FC" => "Abuja Federal Capital Territory", "NG-AB" => "Abia", "NG-AD" => "Adamawa", "NG-AK" => "Akwa Ibom", "NG-AN" => "Anambra", "NG-BA" => "Bauchi", "NG-BY" => "Bayelsa", "NG-BE" => "Benue", "NG-BO" => "Borno", "NG-CR" => "Cross River", "NG-DE" => "Delta", "NG-EB" => "Ebonyi", "NG-ED" => "Edo", "NG-EK" => "Ekiti", "NG-EN" => "Enugu", "NG-GO" => "Gombe", "NG-IM" => "Imo", "NG-JI" => "Jigawa", "NG-KD" => "Kaduna", "NG-KN" => "Kano", "NG-KT" => "Katsina", "NG-KE" => "Kebbi", "NG-KO" => "Kogi", "NG-KW" => "Kwara", "NG-LA" => "Lagos", "NG-NA" => "Nasarawa", "NG-NI" => "Niger", "NG-OG" => "Ogun", "NG-ON" => "Ondo", "NG-OS" => "Osun", "NG-OY" => "Oyo", "NG-PL" => "Plateau", "NG-RI" => "Rivers", "NG-SO" => "Sokoto", "NG-TA" => "Taraba", "NG-YO" => "Yobe", "NG-ZA" => "Zamfara" }, "NI" => { "NI-BO" => "Boaco", "NI-CA" => "Carazo", "NI-CI" => "Chinandega", "NI-CO" => "Chontales", "NI-ES" => "Estelí", "NI-GR" => "Granada", "NI-JI" => "Jinotega", "NI-LE" => "León", "NI-MD" => "Madriz", "NI-MN" => "Managua", "NI-MS" => "Masaya", "NI-MT" => "Matagalpa", "NI-NS" => "Nueva Segovia", "NI-SJ" => "Río San Juan", "NI-RI" => "Rivas", "NI-AN" => "Costa Caribe Norte", "NI-AS" => "Costa Caribe Sur" }, "NL" => { "NL-DR" => "Drenthe", "NL-FL" => "Flevoland", "NL-FR" => "Fryslân (fy)", "NL-GE" => "Gelderland", "NL-GR" => "Groningen", "NL-LI" => "Limburg", "NL-NB" => "Noord-Brabant", "NL-NH" => "Noord-Holland", "NL-OV" => "Overijssel", "NL-UT" => "Utrecht", "NL-ZE" => "Zeeland", "NL-ZH" => "Zuid-Holland" }, "NO" => { "NO-42" => "Agder", "NO-34" => "Innlandet", "NO-15" => "Møre og Romsdal", "NO-18" => "Nordland", "NO-03" => "Oslo", "NO-11" => "Rogaland", "NO-54" => "Troms og Finnmark / Romsa ja Finnmárku (se) / Tromssan ja Finmarkun (-)", "NO-50" => "Trøndelag / Trööndelage (-)", "NO-38" => "Vestfold og Telemark", "NO-46" => "Vestland", "NO-30" => "Viken", "NO-22" => "Jan Mayen", "NO-21" => "Svalbard" }, "NP" => { "NP-1" => "Madhyamanchal", "NP-2" => "Madhya Pashchimanchal", "NP-3" => "Pashchimanchal", "NP-4" => "Purwanchal", "NP-5" => "Sudur Pashchimanchal" }, "NR" => { "NR-01" => "Aiwo", "NR-02" => "Anabar", "NR-03" => "Anetan", "NR-04" => "Anibare", "NR-05" => "Baitsi (local variant is Baiti)", "NR-06" => "Boe", "NR-07" => "Buada", "NR-08" => "Denigomodu", "NR-09" => "Ewa", "NR-10" => "Ijuw", "NR-11" => "Meneng", "NR-12" => "Nibok", "NR-13" => "Uaboe", "NR-14" => "Yaren" }, "NZ" => { "NZ-AUK" => "Auckland", "NZ-BOP" => "Bay of Plenty", "NZ-CAN" => "Canterbury", "NZ-GIS" => "Gisborne", "NZ-HKB" => "Hawke's Bay", "NZ-MBH" => "Marlborough", "NZ-MWT" => "Manawatu-Wanganui", "NZ-NSN" => "Nelson", "NZ-NTL" => "Northland", "NZ-OTA" => "Otago", "NZ-STL" => "Southland", "NZ-TAS" => "Tasman", "NZ-TKI" => "Taranaki", "NZ-WGN" => "Wellington", "NZ-WTC" => "West Coast", "NZ-CIT" => "Chatham Islands Territory" }, "OM" => { "OM-DA" => "Ad Dākhilīyah", "OM-BS" => "Shamāl al Bāţinah", "OM-BJ" => "Janūb al Bāţinah", "OM-WU" => "Al Wusţá", "OM-SS" => "Shamāl ash Sharqīyah", "OM-SJ" => "Janūb ash Sharqīyah", "OM-ZA" => "Az̧ Z̧āhirah", "OM-BU" => "Al Buraymī", "OM-MA" => "Masqaţ", "OM-MU" => "Musandam", "OM-ZU" => "Z̧ufār" }, "PA" => { "PA-1" => "Bocas del Toro", "PA-4" => "Chiriquí", "PA-2" => "Coclé", "PA-3" => "Colón", "PA-5" => "Darién", "PA-EM" => "Emberá", "PA-KY" => "Guna Yala(local variant is Kuna Yala)", "PA-6" => "Herrera", "PA-7" => "Los Santos", "PA-NB" => "Ngöbe-Buglé[note 1]", "PA-8" => "Panamá", "PA-10" => "Panamá Oeste", "PA-9" => "Veraguas" }, "PE" => { "PE-LMA" => "Municipalidad Metropolitana de Lima", "PE-AMA" => "Amazonas", "PE-ANC" => "Ancash", "PE-APU" => "Apurímac", "PE-ARE" => "Arequipa", "PE-AYA" => "Ayacucho", "PE-CAJ" => "Cajamarca", "PE-CUS" => "Cusco(local variant is Cuzco)", "PE-CAL" => "El Callao", "PE-HUV" => "Huancavelica", "PE-HUC" => "Huánuco", "PE-ICA" => "Ica", "PE-JUN" => "Junín", "PE-LAL" => "La Libertad", "PE-LAM" => "Lambayeque", "PE-LIM" => "Lima", "PE-LOR" => "Loreto", "PE-MDD" => "Madre de Dios", "PE-MOQ" => "Moquegua", "PE-PAS" => "Pasco", "PE-PIU" => "Piura", "PE-PUN" => "Puno", "PE-SAM" => "San Martín", "PE-TAC" => "Tacna", "PE-TUM" => "Tumbes", "PE-UCA" => "Ucayali" }, "PG" => { "PG-NCD" => "National Capital District (Port Moresby)", "PG-CPM" => "Central", "PG-CPK" => "Chimbu", "PG-EHG" => "Eastern Highlands", "PG-EBR" => "East New Britain", "PG-ESW" => "East Sepik", "PG-EPW" => "Enga", "PG-GPK" => "Gulf", "PG-HLA" => "Hela", "PG-JWK" => "Jiwaka", "PG-MPM" => "Madang", "PG-MRL" => "Manus", "PG-MBA" => "Milne Bay", "PG-MPL" => "Morobe", "PG-NIK" => "New Ireland", "PG-NPP" => "Northern", "PG-SAN" => "West Sepik", "PG-SHM" => "Southern Highlands", "PG-WPD" => "Western", "PG-WHM" => "Western Highlands", "PG-WBK" => "West New Britain", "PG-NSB" => "Bougainville" }, "PH" => { "PH-14" => "Autonomous Region in Muslim Mindanao[b]", "PH-05" => "Bicol", "PH-02" => "Cagayan Valley", "PH-40" => "Calabarzon", "PH-13" => "Caraga", "PH-03" => "Central Luzon", "PH-07" => "Central Visayas", "PH-15" => "Cordillera Administrative Region", "PH-11" => "Davao", "PH-08" => "Eastern Visayas", "PH-01" => "Ilocos", "PH-41" => "Mimaropa", "PH-00" => "National Capital Region", "PH-10" => "Northern Mindanao", "PH-12" => "Soccsksargen", "PH-06" => "Western Visayas", "PH-09" => "Zamboanga Peninsula" }, "PK" => { "PK-IS" => "Islamabad", "PK-BA" => "Balochistan", "PK-KP" => "Khyber Pakhtunkhwa", "PK-PB" => "Punjab", "PK-SD" => "Sindh", "PK-JK" => "Azad Jammu and Kashmir(local variant is AJ&K)", "PK-GB" => "Gilgit-Baltistan" }, "PL" => { "PL-02" => "Dolnośląskie", "PL-04" => "Kujawsko-pomorskie", "PL-06" => "Lubelskie", "PL-08" => "Lubuskie", "PL-10" => "Łódzkie", "PL-12" => "Małopolskie", "PL-14" => "Mazowieckie", "PL-16" => "Opolskie", "PL-18" => "Podkarpackie", "PL-20" => "Podlaskie", "PL-22" => "Pomorskie", "PL-24" => "Śląskie", "PL-26" => "Świętokrzyskie", "PL-28" => "Warmińsko-mazurskie", "PL-30" => "Wielkopolskie", "PL-32" => "Zachodniopomorskie" }, "PS" => { "PS-BTH" => "Bethlehem", "PS-DEB" => "Deir El Balah", "PS-GZA" => "Gaza", "PS-HBN" => "Hebron", "PS-JEN" => "Jenin", "PS-JRH" => "Jericho and Al Aghwar", "PS-JEM" => "Jerusalem", "PS-KYS" => "Khan Yunis", "PS-NBS" => "Nablus", "PS-NGZ" => "North Gaza", "PS-QQA" => "Qalqilya", "PS-RFH" => "Rafah", "PS-RBH" => "Ramallah", "PS-SLT" => "Salfit", "PS-TBS" => "Tubas", "PS-TKM" => "Tulkarm" }, "PT" => { "PT-01" => "Aveiro", "PT-02" => "Beja", "PT-03" => "Braga", "PT-04" => "Bragança", "PT-05" => "Castelo Branco", "PT-06" => "Coimbra", "PT-07" => "Évora", "PT-08" => "Faro", "PT-09" => "Guarda", "PT-10" => "Leiria", "PT-11" => "Lisboa", "PT-12" => "Portalegre", "PT-13" => "Porto", "PT-14" => "Santarém", "PT-15" => "Setúbal", "PT-16" => "Viana do Castelo", "PT-17" => "Vila Real", "PT-18" => "Viseu", "PT-20" => "Região Autónoma dos Açores", "PT-30" => "Região Autónoma da Madeira" }, "PW" => { "PW-002" => "[[{{{alias}}}|Aimeliik]]", "PW-004" => "Airai", "PW-010" => "[[{{{alias}}}|Angaur]]", "PW-050" => "Hatohobei", "PW-100" => "Kayangel", "PW-150" => "Koror", "PW-212" => "Melekeok", "PW-214" => "Ngaraard", "PW-218" => "Ngarchelong", "PW-222" => "Ngardmau", "PW-224" => "Ngatpang", "PW-226" => "Ngchesar", "PW-227" => "Ngeremlengui", "PW-228" => "Ngiwal", "PW-350" => "Peleliu", "PW-370" => "Sonsorol" }, "PY" => { "PY-ASU" => "Asunción", "PY-16" => "Alto Paraguay", "PY-10" => "Alto Paraná", "PY-13" => "Amambay", "PY-19" => "Boquerón", "PY-5" => "Caaguazú", "PY-6" => "Caazapá", "PY-14" => "Canindeyú", "PY-11" => "Central", "PY-1" => "Concepción", "PY-3" => "Cordillera", "PY-4" => "Guairá", "PY-7" => "Itapúa", "PY-8" => "Misiones", "PY-12" => "Ñeembucú", "PY-9" => "Paraguarí", "PY-15" => "Presidente Hayes", "PY-2" => "San Pedro" }, "QA" => { "QA-DA" => "Ad Dawḩah", "QA-KH" => "Al Khawr wa adh Dhakhīrah", "QA-WA" => "Al Wakrah", "QA-RA" => "Ar Rayyān", "QA-MS" => "Ash Shamāl", "QA-SH" => "Ash Shīḩānīyah", "QA-ZA" => "Az̧ Z̧a‘āyin", "QA-US" => "Umm Şalāl" }, "RO" => { "RO-AB" => "Alba", "RO-AR" => "Arad", "RO-AG" => "Argeș", "RO-BC" => "Bacău", "RO-BH" => "Bihor", "RO-BN" => "Bistrița-Năsăud", "RO-BT" => "Botoșani", "RO-BV" => "Brașov", "RO-BR" => "Brăila", "RO-BZ" => "Buzău", "RO-CS" => "Caraș-Severin", "RO-CL" => "Călărași", "RO-CJ" => "Cluj", "RO-CT" => "Constanța", "RO-CV" => "Covasna", "RO-DB" => "Dâmbovița", "RO-DJ" => "Dolj", "RO-GL" => "Galați", "RO-GR" => "Giurgiu", "RO-GJ" => "Gorj", "RO-HR" => "Harghita", "RO-HD" => "Hunedoara", "RO-IL" => "Ialomița", "RO-IS" => "Iași", "RO-IF" => "Ilfov", "RO-MM" => "Maramureș", "RO-MH" => "Mehedinți", "RO-MS" => "Mureș", "RO-NT" => "Neamț", "RO-OT" => "Olt", "RO-PH" => "Prahova", "RO-SM" => "Satu Mare", "RO-SJ" => "Sălaj", "RO-SB" => "Sibiu", "RO-SV" => "Suceava", "RO-TR" => "Teleorman", "RO-TM" => "Timiș", "RO-TL" => "Tulcea", "RO-VS" => "Vaslui", "RO-VL" => "Vâlcea", "RO-VN" => "Vrancea", "RO-B" => "București" }, "RS" => { "RS-KM" => "Kosovo-Metohija[a]", "RS-VO" => "Vojvodina" }, "RU" => { "RU-AD" => "Adygeya, Respublika", "RU-AL" => "Altay, Respublika", "RU-BA" => "Bashkortostan, Respublika", "RU-BU" => "Buryatiya, Respublika", "RU-CE" => "Chechenskaya Respublika", "RU-CU" => "Chuvashskaya Respublika", "RU-DA" => "Dagestan, Respublika", "RU-IN" => "Ingushetiya, Respublika", "RU-KB" => "Kabardino-Balkarskaya Respublika", "RU-KL" => "Kalmykiya, Respublika", "RU-KC" => "Karachayevo-Cherkesskaya Respublika", "RU-KR" => "Kareliya, Respublika", "RU-KK" => "Khakasiya, Respublika", "RU-KO" => "Komi, Respublika", "RU-ME" => "Mariy El, Respublika", "RU-MO" => "Mordoviya, Respublika", "RU-SA" => "Saha, Respublika(local variant is Jakutija)", "RU-SE" => "Severnaya Osetiya, Respublika(local variant is Alaniya [Respublika Severnaya Osetiya – Alaniya])", "RU-TA" => "Tatarstan, Respublika", "RU-TY" => "Tyva, Respublika(local variant is Tuva)", "RU-UD" => "Udmurtskaya Respublika", "RU-ALT" => "Altayskiy kray", "RU-KAM" => "Kamchatskiy kray", "RU-KHA" => "Khabarovskiy kray", "RU-KDA" => "Krasnodarskiy kray", "RU-KYA" => "Krasnoyarskiy kray", "RU-PER" => "Permskiy kray", "RU-PRI" => "Primorskiy kray", "RU-STA" => "Stavropol'skiy kray", "RU-ZAB" => "Zabaykal'skiy kray", "RU-AMU" => "Amurskaya oblast'", "RU-ARK" => "Arkhangel'skaya oblast'", "RU-AST" => "Astrakhanskaya oblast'", "RU-BEL" => "Belgorodskaya oblast'", "RU-BRY" => "Bryanskaya oblast'", "RU-CHE" => "Chelyabinskaya oblast'", "RU-IRK" => "Irkutskaya oblast'", "RU-IVA" => "Ivanovskaya oblast'", "RU-KGD" => "Kaliningradskaya oblast'", "RU-KLU" => "Kaluzhskaya oblast'", "RU-KEM" => "Kemerovskaya oblast'", "RU-KIR" => "Kirovskaya oblast'", "RU-KOS" => "Kostromskaya oblast'", "RU-KGN" => "Kurganskaya oblast'", "RU-KRS" => "Kurskaya oblast'", "RU-LEN" => "Leningradskaya oblast'", "RU-LIP" => "Lipetskaya oblast'", "RU-MAG" => "Magadanskaya oblast'", "RU-MOS" => "Moskovskaya oblast'", "RU-MUR" => "Murmanskaya oblast'", "RU-NIZ" => "Nizhegorodskaya oblast'", "RU-NGR" => "Novgorodskaya oblast'", "RU-NVS" => "Novosibirskaya oblast'", "RU-OMS" => "Omskaya oblast'", "RU-ORE" => "Orenburgskaya oblast'", "RU-ORL" => "Orlovskaya oblast'", "RU-PNZ" => "Penzenskaya oblast'", "RU-PSK" => "Pskovskaya oblast'", "RU-ROS" => "Rostovskaya oblast'", "RU-RYA" => "Ryazanskaya oblast'", "RU-SAK" => "Sakhalinskaya oblast'", "RU-SAM" => "Samarskaya oblast'", "RU-SAR" => "Saratovskaya oblast'", "RU-SMO" => "Smolenskaya oblast'", "RU-SVE" => "Sverdlovskaya oblast'", "RU-TAM" => "Tambovskaya oblast'", "RU-TOM" => "Tomskaya oblast'", "RU-TUL" => "Tul'skaya oblast'", "RU-TVE" => "Tverskaya oblast'", "RU-TYU" => "Tyumenskaya oblast'", "RU-ULY" => "Ul'yanovskaya oblast'", "RU-VLA" => "Vladimirskaya oblast'", "RU-VGG" => "Volgogradskaya oblast'", "RU-VLG" => "Vologodskaya oblast'", "RU-VOR" => "Voronezhskaya oblast'", "RU-YAR" => "Yaroslavskaya oblast'", "RU-MOW" => "Moskva", "RU-SPE" => "Sankt-Peterburg", "RU-YEV" => "Yevreyskaya avtonomnaya oblast'", "RU-CHU" => "Chukotskiy avtonomnyy okrug", "RU-KHM" => "Khanty-Mansiyskiy avtonomnyy okrug(local variant is Yugra)", "RU-NEN" => "Nenetskiy avtonomnyy okrug", "RU-YAN" => "Yamalo-Nenetskiy avtonomnyy okrug" }, "RW" => { "RW-01" => "City of Kigali", "RW-02" => "Eastern", "RW-03" => "Northern", "RW-04" => "Western", "RW-05" => "Southern" }, "SA" => { "SA-11" => "Al Bāḩah", "SA-08" => "Al Ḩudūd ash Shamālīyah", "SA-12" => "Al Jawf", "SA-03" => "Al Madīnah al Munawwarah", "SA-05" => "Al Qaşīm", "SA-01" => "Ar Riyāḑ", "SA-04" => "Ash Sharqīyah", "SA-14" => "'Asīr", "SA-06" => "Ḩā'il", "SA-09" => "Jāzān", "SA-02" => "Makkah al Mukarramah", "SA-10" => "Najrān", "SA-07" => "Tabūk" }, "SB" => { "SB-CT" => "Capital Territory (Honiara)", "SB-CE" => "Central", "SB-CH" => "Choiseul", "SB-GU" => "Guadalcanal", "SB-IS" => "Isabel", "SB-MK" => "Makira-Ulawa", "SB-ML" => "Malaita", "SB-RB" => "Rennell and Bellona", "SB-TE" => "Temotu", "SB-WE" => "Western" }, "SC" => { "SC-01" => "Anse aux Pins", "SC-02" => "Anse Boileau", "SC-03" => "Anse Etoile", "SC-05" => "Anse Royale", "SC-04" => "Au Cap", "SC-06" => "Baie Lazare", "SC-07" => "Baie Sainte Anne", "SC-08" => "Beau Vallon", "SC-09" => "Bel Air", "SC-10" => "Bel Ombre", "SC-11" => "Cascade", "SC-12" => "Glacis", "SC-13" => "Grand Anse Mahe", "SC-14" => "Grand Anse Praslin", "SC-15" => "La Digue", "SC-16" => "English River", "SC-26" => "Ile Perseverance I", "SC-27" => "Ile Perseverance II", "SC-24" => "Les Mamelles", "SC-17" => "Mont Buxton", "SC-18" => "Mont Fleuri", "SC-19" => "Plaisance", "SC-20" => "Pointe Larue", "SC-21" => "Port Glaud", "SC-25" => "Roche Caiman", "SC-22" => "Saint Louis", "SC-23" => "Takamaka" }, "SD" => { "SD-RS" => "Al Baḩr al Aḩmar", "SD-GZ" => "Al Jazīrah", "SD-KH" => "Al Kharţūm", "SD-GD" => "Al Qaḑārif", "SD-NR" => "Nahr an Nīl", "SD-NW" => "An Nīl al Abyaḑ", "SD-NB" => "An Nīl al Azraq", "SD-NO" => "Ash Shamālīyah", "SD-DW" => "Gharb Dārfūr", "SD-GK" => "Gharb Kurdufān", "SD-DS" => "Janūb Dārfūr", "SD-KS" => "Janūb Kurdufān", "SD-KA" => "Kassalā", "SD-DN" => "Shamāl Dārfūr", "SD-KN" => "Shamāl Kurdufān", "SD-DE" => "Sharq Dārfūr", "SD-SI" => "Sinnār", "SD-DC" => "Wasaţ Dārfūr(local variant is Zālinjay)" }, "SE" => { "SE-K" => "Blekinge län", "SE-W" => "Dalarnas län", "SE-I" => "Gotlands län", "SE-X" => "Gävleborgs län", "SE-N" => "Hallands län", "SE-Z" => "Jämtlands län", "SE-F" => "Jönköpings län", "SE-H" => "Kalmar län", "SE-G" => "Kronobergs län", "SE-BD" => "Norrbottens län", "SE-M" => "Skåne län", "SE-AB" => "Stockholms län", "SE-D" => "Södermanlands län", "SE-C" => "Uppsala län", "SE-S" => "Värmlands län", "SE-AC" => "Västerbottens län", "SE-Y" => "Västernorrlands län", "SE-U" => "Västmanlands län", "SE-O" => "Västra Götalands län", "SE-T" => "Örebro län", "SE-E" => "Östergötlands län" }, "SG" => { "SG-01" => "Central Singapore", "SG-02" => "North East", "SG-03" => "North West", "SG-04" => "South East", "SG-05" => "South West" }, "SH" => { "SH-AC" => "Ascension", "SH-HL" => "Saint Helena", "SH-TA" => "Tristan da Cunha" }, "SI" => { "SI-001" => "Ajdovščina", "SI-213" => "Ankaran", "SI-195" => "Apače", "SI-002" => "Beltinci", "SI-148" => "Benedikt", "SI-149" => "Bistrica ob Sotli", "SI-003" => "Bled", "SI-150" => "Bloke", "SI-004" => "Bohinj", "SI-005" => "Borovnica", "SI-006" => "Bovec", "SI-151" => "Braslovče", "SI-007" => "Brda", "SI-008" => "Brezovica", "SI-009" => "Brežice", "SI-152" => "Cankova", "SI-011" => "Celje", "SI-012" => "Cerklje na Gorenjskem", "SI-013" => "Cerknica", "SI-014" => "Cerkno", "SI-153" => "Cerkvenjak", "SI-196" => "Cirkulane", "SI-015" => "Črenšovci", "SI-016" => "Črna na Koroškem", "SI-017" => "Črnomelj", "SI-018" => "Destrnik", "SI-019" => "Divača", "SI-154" => "Dobje", "SI-020" => "Dobrepolje", "SI-155" => "Dobrna", "SI-021" => "Dobrova-Polhov Gradec", "SI-156" => "Dobrovnik", "SI-022" => "Dol pri Ljubljani", "SI-157" => "Dolenjske Toplice", "SI-023" => "Domžale", "SI-024" => "Dornava", "SI-025" => "Dravograd", "SI-026" => "Duplek", "SI-027" => "Gorenja vas-Poljane", "SI-028" => "Gorišnica", "SI-207" => "Gorje", "SI-029" => "Gornja Radgona", "SI-030" => "Gornji Grad", "SI-031" => "Gornji Petrovci", "SI-158" => "Grad", "SI-032" => "Grosuplje", "SI-159" => "Hajdina", "SI-160" => "Hoče-Slivnica", "SI-161" => "Hodoš", "SI-162" => "Horjul", "SI-034" => "Hrastnik", "SI-035" => "Hrpelje-Kozina", "SI-036" => "Idrija", "SI-037" => "Ig", "SI-038" => "Ilirska Bistrica", "SI-039" => "Ivančna Gorica", "SI-040" => "Izola", "SI-041" => "Jesenice", "SI-163" => "Jezersko", "SI-042" => "Juršinci", "SI-043" => "Kamnik", "SI-044" => "Kanal", "SI-045" => "Kidričevo", "SI-046" => "Kobarid", "SI-047" => "Kobilje", "SI-048" => "Kočevje", "SI-049" => "Komen", "SI-164" => "Komenda", "SI-050" => "Koper", "SI-197" => "Kosanjevica na Krki", "SI-165" => "Kostel", "SI-051" => "Kozje", "SI-052" => "Kranj", "SI-053" => "Kranjska Gora", "SI-166" => "Križevci", "SI-054" => "Krško", "SI-055" => "Kungota", "SI-056" => "Kuzma", "SI-057" => "Laško", "SI-058" => "Lenart", "SI-059" => "Lendava", "SI-060" => "Litija", "SI-061" => "Ljubljana", "SI-062" => "Ljubno", "SI-063" => "Ljutomer", "SI-208" => "Log-Dragomer", "SI-064" => "Logatec", "SI-065" => "Loška dolina", "SI-066" => "Loški Potok", "SI-167" => "Lovrenc na Pohorju", "SI-067" => "Luče", "SI-068" => "Lukovica", "SI-069" => "Majšperk", "SI-198" => "Makole", "SI-070" => "Maribor", "SI-168" => "Markovci", "SI-071" => "Medvode", "SI-072" => "Mengeš", "SI-073" => "Metlika", "SI-074" => "Mežica", "SI-169" => "Miklavž na Dravskem polju", "SI-075" => "Miren-Kostanjevica", "SI-212" => "Mirna", "SI-170" => "Mirna Peč", "SI-076" => "Mislinja", "SI-199" => "Mokronog-Trebelno", "SI-077" => "Moravče", "SI-078" => "Moravske Toplice", "SI-079" => "Mozirje", "SI-080" => "Murska Sobota", "SI-081" => "Muta", "SI-082" => "Naklo", "SI-083" => "Nazarje", "SI-084" => "Nova Gorica", "SI-085" => "Novo Mesto", "SI-086" => "Odranci", "SI-171" => "Oplotnica", "SI-087" => "Ormož", "SI-088" => "Osilnica", "SI-089" => "Pesnica", "SI-090" => "Piran", "SI-091" => "Pivka", "SI-092" => "Podčetrtek", "SI-172" => "Podlehnik", "SI-093" => "Podvelka", "SI-200" => "Poljčane", "SI-173" => "Polzela", "SI-094" => "Postojna", "SI-174" => "Prebold", "SI-095" => "Preddvor", "SI-175" => "Prevalje", "SI-096" => "Ptuj", "SI-097" => "Puconci", "SI-098" => "Rače-Fram", "SI-099" => "Radeče", "SI-100" => "Radenci", "SI-101" => "Radlje ob Dravi", "SI-102" => "Radovljica", "SI-103" => "Ravne na Koroškem", "SI-176" => "Razkrižje", "SI-209" => "Rečica ob Savinji", "SI-201" => "Renče-Vogrsko", "SI-104" => "Ribnica", "SI-177" => "Ribnica na Pohorju", "SI-106" => "Rogaška Slatina", "SI-105" => "Rogašovci", "SI-107" => "Rogatec", "SI-108" => "Ruše", "SI-178" => "Selnica ob Dravi", "SI-109" => "Semič", "SI-110" => "Sevnica", "SI-111" => "Sežana", "SI-112" => "Slovenj Gradec", "SI-113" => "Slovenska Bistrica", "SI-114" => "Slovenske Konjice", "SI-179" => "Sodražica", "SI-180" => "Solčava", "SI-202" => "Središče ob Dravi", "SI-115" => "Starše", "SI-203" => "Straža", "SI-181" => "Sveta Ana", "SI-204" => "Sveta Trojica v Slovenskih goricah", "SI-182" => "Sveti Andraž v Slovenskih goricah", "SI-116" => "Sveti Jurij ob Ščavnici", "SI-210" => "Sveti Jurij v Slovenskih goricah", "SI-205" => "Sveti Tomaž", "SI-033" => "Šalovci", "SI-183" => "Šempeter-Vrtojba", "SI-117" => "Šenčur", "SI-118" => "Šentilj", "SI-119" => "Šentjernej", "SI-120" => "Šentjur", "SI-211" => "Šentrupert", "SI-121" => "Škocjan", "SI-122" => "Škofja Loka", "SI-123" => "Škofljica", "SI-124" => "Šmarje pri Jelšah", "SI-206" => "Šmarješke Toplice", "SI-125" => "Šmartno ob Paki", "SI-194" => "Šmartno pri Litiji", "SI-126" => "Šoštanj", "SI-127" => "Štore", "SI-184" => "Tabor", "SI-010" => "Tišina", "SI-128" => "Tolmin", "SI-129" => "Trbovlje", "SI-130" => "Trebnje", "SI-185" => "Trnovska Vas", "SI-186" => "Trzin", "SI-131" => "Tržič", "SI-132" => "Turnišče", "SI-133" => "Velenje", "SI-187" => "Velika Polana", "SI-134" => "Velike Lašče", "SI-188" => "Veržej", "SI-135" => "Videm", "SI-136" => "Vipava", "SI-137" => "Vitanje", "SI-138" => "Vodice", "SI-139" => "Vojnik", "SI-189" => "Vransko", "SI-140" => "Vrhnika", "SI-141" => "Vuzenica", "SI-142" => "Zagorje ob Savi", "SI-143" => "Zavrč", "SI-144" => "Zreče", "SI-190" => "Žalec", "SI-146" => "Železniki", "SI-191" => "Žetale", "SI-147" => "Žiri", "SI-192" => "Žirovnica", "SI-193" => "Žužemberk" }, "SK" => { "SK-BC" => "Banskobystrický kraj", "SK-BL" => "Bratislavský kraj", "SK-KI" => "Košický kraj", "SK-NI" => "Nitriansky kraj", "SK-PV" => "Prešovský kraj", "SK-TC" => "Trenčiansky kraj", "SK-TA" => "Trnavský kraj", "SK-ZI" => "Žilinský kraj" }, "SL" => { "SL-W" => "Western Area (Freetown)", "SL-E" => "Eastern", "SL-N" => "Northern", "SL-NW" => "North Western", "SL-S" => "Southern" }, "SM" => { "SM-01" => "Acquaviva", "SM-06" => "Borgo Maggiore", "SM-02" => "Chiesanuova", "SM-07" => "Città di San Marino(local variant is San Marino)", "SM-03" => "Domagnano", "SM-04" => "Faetano", "SM-05" => "Fiorentino", "SM-08" => "Montegiardino", "SM-09" => "Serravalle" }, "SN" => { "SN-DK" => "Dakar", "SN-DB" => "Diourbel", "SN-FK" => "Fatick", "SN-KA" => "Kaffrine", "SN-KL" => "Kaolack", "SN-KE" => "Kédougou", "SN-KD" => "Kolda", "SN-LG" => "Louga", "SN-MT" => "Matam", "SN-SL" => "Saint-Louis", "SN-SE" => "Sédhiou", "SN-TC" => "Tambacounda", "SN-TH" => "Thiès", "SN-ZG" => "Ziguinchor" }, "SO" => { "SO-AW" => "Awdal", "SO-BK" => "Bakool", "SO-BN" => "Banaadir", "SO-BR" => "Bari", "SO-BY" => "Bay", "SO-GA" => "Galguduud", "SO-GE" => "Gedo", "SO-HI" => "Hiiraan", "SO-JD" => "Jubbada Dhexe", "SO-JH" => "Jubbada Hoose", "SO-MU" => "Mudug", "SO-NU" => "Nugaal", "SO-SA" => "Sanaag", "SO-SD" => "Shabeellaha Dhexe", "SO-SH" => "Shabeellaha Hoose", "SO-SO" => "Sool", "SO-TO" => "Togdheer", "SO-WO" => "Woqooyi Galbeed" }, "SR" => { "SR-BR" => "Brokopondo", "SR-CM" => "Commewijne", "SR-CR" => "Coronie", "SR-MA" => "Marowijne", "SR-NI" => "Nickerie", "SR-PR" => "Para", "SR-PM" => "Paramaribo", "SR-SA" => "Saramacca", "SR-SI" => "Sipaliwini", "SR-WA" => "Wanica" }, "SS" => { "SS-EC" => "Central Equatoria", "SS-EE" => "Eastern Equatoria", "SS-JG" => "Jonglei", "SS-LK" => "Lakes", "SS-BN" => "Northern Bahr el Ghazal", "SS-UY" => "Unity", "SS-NU" => "Upper Nile", "SS-WR" => "Warrap", "SS-BW" => "Western Bahr el Ghazal", "SS-EW" => "Western Equatoria" }, "ST" => { "ST-01" => "Água Grande", "ST-02" => "Cantagalo", "ST-03" => "Caué", "ST-04" => "Lembá", "ST-05" => "Lobata", "ST-06" => "Mé-Zóchi", "ST-P" => "Príncipe" }, "SV" => { "SV-AH" => "Ahuachapán", "SV-CA" => "Cabañas", "SV-CH" => "Chalatenango", "SV-CU" => "Cuscatlán", "SV-LI" => "La Libertad", "SV-PA" => "La Paz", "SV-UN" => "La Unión", "SV-MO" => "Morazán", "SV-SM" => "San Miguel", "SV-SS" => "San Salvador", "SV-SV" => "San Vicente", "SV-SA" => "Santa Ana", "SV-SO" => "Sonsonate", "SV-US" => "Usulután" }, "SY" => { "SY-HA" => "Al Ḩasakah", "SY-LA" => "Al Lādhiqīyah", "SY-QU" => "Al Qunayţirah", "SY-RA" => "Ar Raqqah", "SY-SU" => "As Suwaydā'", "SY-DR" => "Dar'ā", "SY-DY" => "Dayr az Zawr", "SY-DI" => "Dimashq", "SY-HL" => "Ḩalab", "SY-HM" => "Ḩamāh", "SY-HI" => "Ḩimş", "SY-ID" => "Idlib", "SY-RD" => "Rīf Dimashq", "SY-TA" => "Ţarţūs" }, "SZ" => { "SZ-HH" => "Hhohho", "SZ-LU" => "Lubombo", "SZ-MA" => "Manzini", "SZ-SH" => "Shiselweni" }, "TD" => { "TD-BA" => "Al Baţḩā’", "TD-LC" => "Al Buḩayrah", "TD-BG" => "Baḩr al Ghazāl", "TD-BO" => "Būrkū", "TD-HL" => "Ḩajjar Lamīs", "TD-EO" => "Inīdī al Gharbī", "TD-EE" => "Inīdī ash Sharqī", "TD-KA" => "Kānim", "TD-LO" => "Lūghūn al Gharbī", "TD-LR" => "Lūghūn ash Sharqī", "TD-ND" => "Madīnat Injamīnā", "TD-MA" => "Māndūl", "TD-MO" => "Māyū Kībbī al Gharbī", "TD-ME" => "Māyū Kībbī ash Sharqī", "TD-GR" => "Qīrā", "TD-SA" => "Salāmāt", "TD-MC" => "Shārī al Awsaţ", "TD-CB" => "Shārī Bāqirmī", "TD-SI" => "Sīlā", "TD-TA" => "Tānjīlī", "TD-TI" => "Tibastī", "TD-OD" => "Waddāy", "TD-WF" => "Wādī Fīrā’" }, "TG" => { "TG-C" => "Centrale", "TG-K" => "Kara", "TG-M" => "Maritime (Région)", "TG-P" => "Plateaux", "TG-S" => "Savanes" }, "TH" => { "TH-10" => "Krung Thep Maha Nakhon(local variant is Bangkok)", "TH-S" => "Phatthaya", "TH-37" => "Amnat Charoen", "TH-15" => "Ang Thong", "TH-38" => "Bueng Kan", "TH-31" => "Buri Ram", "TH-24" => "Chachoengsao", "TH-18" => "Chai Nat", "TH-36" => "Chaiyaphum", "TH-22" => "Chanthaburi", "TH-50" => "Chiang Mai", "TH-57" => "Chiang Rai", "TH-20" => "Chon Buri", "TH-86" => "Chumphon", "TH-46" => "Kalasin", "TH-62" => "Kamphaeng Phet", "TH-71" => "Kanchanaburi", "TH-40" => "Khon Kaen", "TH-81" => "Krabi", "TH-52" => "Lampang", "TH-51" => "Lamphun", "TH-42" => "Loei", "TH-16" => "Lop Buri", "TH-58" => "Mae Hong Son", "TH-44" => "Maha Sarakham", "TH-49" => "Mukdahan", "TH-26" => "Nakhon Nayok", "TH-73" => "Nakhon Pathom", "TH-48" => "Nakhon Phanom", "TH-30" => "Nakhon Ratchasima", "TH-60" => "Nakhon Sawan", "TH-80" => "Nakhon Si Thammarat", "TH-55" => "Nan", "TH-96" => "Narathiwat", "TH-39" => "Nong Bua Lam Phu", "TH-43" => "Nong Khai", "TH-12" => "Nonthaburi", "TH-13" => "Pathum Thani", "TH-94" => "Pattani", "TH-82" => "Phangnga", "TH-93" => "Phatthalung", "TH-56" => "Phayao", "TH-67" => "Phetchabun", "TH-76" => "Phetchaburi", "TH-66" => "Phichit", "TH-65" => "Phitsanulok", "TH-54" => "Phrae", "TH-14" => "Phra Nakhon Si Ayutthaya", "TH-83" => "Phuket", "TH-25" => "Prachin Buri", "TH-77" => "Prachuap Khiri Khan", "TH-85" => "Ranong", "TH-70" => "Ratchaburi", "TH-21" => "Rayong", "TH-45" => "Roi Et", "TH-27" => "Sa Kaeo", "TH-47" => "Sakon Nakhon", "TH-11" => "Samut Prakan", "TH-74" => "Samut Sakhon", "TH-75" => "Samut Songkhram", "TH-19" => "Saraburi", "TH-91" => "Satun", "TH-17" => "Sing Buri", "TH-33" => "Si Sa Ket", "TH-90" => "Songkhla", "TH-64" => "Sukhothai", "TH-72" => "Suphan Buri", "TH-84" => "Surat Thani", "TH-32" => "Surin", "TH-63" => "Tak", "TH-92" => "Trang", "TH-23" => "Trat", "TH-34" => "Ubon Ratchathani", "TH-41" => "Udon Thani", "TH-61" => "Uthai Thani", "TH-53" => "Uttaradit", "TH-95" => "Yala", "TH-35" => "Yasothon" }, "TJ" => { "TJ-DU" => "Dushanbe", "TJ-GB" => "Kŭhistoni Badakhshon", "TJ-KT" => "Khatlon", "TJ-SU" => "Sughd", "TJ-RA" => "nohiyahoi tobei jumhurí" }, "TL" => { "TL-AL" => "Aileu", "TL-AN" => "Ainaro", "TL-BA" => "Baucau", "TL-BO" => "Bobonaro", "TL-CO" => "Cova Lima", "TL-DI" => "Díli", "TL-ER" => "Ermera", "TL-LA" => "Lautém", "TL-LI" => "Liquiça", "TL-MT" => "Manatuto", "TL-MF" => "Manufahi", "TL-OE" => "Oé-Cusse Ambeno(local variant is Oecussi)", "TL-VI" => "Viqueque" }, "TM" => { "TM-A" => "Ahal", "TM-B" => "Balkan", "TM-D" => "Daşoguz", "TM-L" => "Lebap", "TM-M" => "Mary", "TM-S" => "Aşgabat" }, "TN" => { "TN-31" => "Béja", "TN-13" => "Ben Arous", "TN-23" => "Bizerte", "TN-81" => "Gabès", "TN-71" => "Gafsa", "TN-32" => "Jendouba", "TN-41" => "Kairouan", "TN-42" => "Kasserine", "TN-73" => "Kébili", "TN-12" => "L'Ariana", "TN-14" => "La Manouba", "TN-33" => "Le Kef", "TN-53" => "Mahdia", "TN-82" => "Médenine", "TN-52" => "Monastir", "TN-21" => "Nabeul", "TN-61" => "Sfax", "TN-43" => "Sidi Bouzid", "TN-34" => "Siliana", "TN-51" => "Sousse", "TN-83" => "Tataouine", "TN-72" => "Tozeur", "TN-11" => "Tunis", "TN-22" => "Zaghouan" }, "TO" => { "TO-01" => "'Eua", "TO-02" => "Ha'apai", "TO-03" => "Niuas", "TO-04" => "Tongatapu", "TO-05" => "Vava'u" }, "TR" => { "TR-01" => "Adana", "TR-02" => "Adıyaman", "TR-03" => "Afyonkarahisar", "TR-04" => "Ağrı", "TR-68" => "Aksaray", "TR-05" => "Amasya", "TR-06" => "Ankara", "TR-07" => "Antalya", "TR-75" => "Ardahan", "TR-08" => "Artvin", "TR-09" => "Aydın", "TR-10" => "Balıkesir", "TR-74" => "Bartın", "TR-72" => "Batman", "TR-69" => "Bayburt", "TR-11" => "Bilecik", "TR-12" => "Bingöl", "TR-13" => "Bitlis", "TR-14" => "Bolu", "TR-15" => "Burdur", "TR-16" => "Bursa", "TR-17" => "Çanakkale", "TR-18" => "Çankırı", "TR-19" => "Çorum", "TR-20" => "Denizli", "TR-21" => "Diyarbakır", "TR-81" => "Düzce", "TR-22" => "Edirne", "TR-23" => "Elazığ", "TR-24" => "Erzincan", "TR-25" => "Erzurum", "TR-26" => "Eskişehir", "TR-27" => "Gaziantep", "TR-28" => "Giresun", "TR-29" => "Gümüşhane", "TR-30" => "Hakkâri", "TR-31" => "Hatay", "TR-76" => "Iğdır", "TR-32" => "Isparta", "TR-34" => "İstanbul", "TR-35" => "İzmir", "TR-46" => "Kahramanmaraş", "TR-78" => "Karabük", "TR-70" => "Karaman", "TR-36" => "Kars", "TR-37" => "Kastamonu", "TR-38" => "Kayseri", "TR-71" => "Kırıkkale", "TR-39" => "Kırklareli", "TR-40" => "Kırşehir", "TR-79" => "Kilis", "TR-41" => "Kocaeli", "TR-42" => "Konya", "TR-43" => "Kütahya", "TR-44" => "Malatya", "TR-45" => "Manisa", "TR-47" => "Mardin", "TR-33" => "Mersin", "TR-48" => "Muğla", "TR-49" => "Muş", "TR-50" => "Nevşehir", "TR-51" => "Niğde", "TR-52" => "Ordu", "TR-80" => "Osmaniye", "TR-53" => "Rize", "TR-54" => "Sakarya", "TR-55" => "Samsun", "TR-56" => "Siirt", "TR-57" => "Sinop", "TR-58" => "Sivas", "TR-63" => "Şanlıurfa", "TR-73" => "Şırnak", "TR-59" => "Tekirdağ", "TR-60" => "Tokat", "TR-61" => "Trabzon", "TR-62" => "Tunceli", "TR-64" => "Uşak", "TR-65" => "Van", "TR-77" => "Yalova", "TR-66" => "Yozgat", "TR-67" => "Zonguldak" }, "TT" => { "TT-ARI" => "Arima", "TT-CHA" => "Chaguanas", "TT-CTT" => "Couva–Tabaquite–Talparo", "TT-DMN" => "Diego Martin", "TT-MRC" => "Mayaro-Rio Claro", "TT-PED" => "Penal-Debe", "TT-POS" => "Port of Spain", "TT-PRT" => "Princes Town", "TT-PTF" => "Point Fortin", "TT-SFO" => "San Fernando", "TT-SGE" => "Sangre Grande", "TT-SIP" => "Siparia", "TT-SJL" => "San Juan-Laventille", "TT-TOB" => "Tobago", "TT-TUP" => "Tunapuna-Piarco" }, "TV" => { "TV-FUN" => "Funafuti", "TV-NMG" => "Nanumaga", "TV-NMA" => "Nanumea", "TV-NIT" => "Niutao", "TV-NUI" => "Nui", "TV-NKF" => "Nukufetau", "TV-NKL" => "Nukulaelae", "TV-VAI" => "Vaitupu" }, "TW" => { "TW-CHA" => "Changhua", "TW-CYI" => "Chiayi", "TW-CYQ" => "Chiayi", "TW-HSZ" => "Hsinchu", "TW-HSQ" => "Hsinchu", "TW-HUA" => "Hualien", "TW-KHH" => "Kaohsiung", "TW-KEE" => "Keelung", "TW-KIN" => "Kinmen", "TW-LIE" => "Lienchiang", "TW-MIA" => "Miaoli", "TW-NAN" => "Nantou", "TW-NWT" => "New Taipei", "TW-PEN" => "Penghu", "TW-PIF" => "Pingtung", "TW-TXG" => "Taichung", "TW-TNN" => "Tainan", "TW-TPE" => "Taipei", "TW-TTT" => "Taitung", "TW-TAO" => "Taoyuan", "TW-ILA" => "Yilan", "TW-YUN" => "Yunlin" }, "TZ" => { "TZ-01" => "Arusha", "TZ-02" => "Dar es Salaam", "TZ-03" => "Dodoma", "TZ-27" => "Geita", "TZ-04" => "Iringa", "TZ-05" => "Kagera", "TZ-06" => "Kaskazini Pemba", "TZ-07" => "Kaskazini Unguja", "TZ-28" => "Katavi", "TZ-08" => "Kigoma", "TZ-09" => "Kilimanjaro", "TZ-10" => "Kusini Pemba", "TZ-11" => "Kusini Unguja", "TZ-12" => "Lindi", "TZ-26" => "Manyara", "TZ-13" => "Mara", "TZ-14" => "Mbeya", "TZ-15" => "Mjini Magharibi", "TZ-16" => "Morogoro", "TZ-17" => "Mtwara", "TZ-18" => "Mwanza", "TZ-29" => "Njombe", "TZ-19" => "Pwani", "TZ-20" => "Rukwa", "TZ-21" => "Ruvuma", "TZ-22" => "Shinyanga", "TZ-30" => "Simiyu", "TZ-23" => "Singida", "TZ-31" => "Songwe", "TZ-24" => "Tabora", "TZ-25" => "Tanga" }, "UA" => { "UA-71" => "Cherkaska oblast", "UA-74" => "Chernihivska oblast", "UA-77" => "Chernivetska oblast", "UA-12" => "Dnipropetrovska oblast", "UA-14" => "Donetska oblast", "UA-26" => "Ivano-Frankivska oblast", "UA-63" => "Kharkivska oblast", "UA-65" => "Khersonska oblast", "UA-68" => "Khmelnytska oblast", "UA-35" => "Kirovohradska oblast", "UA-32" => "Kyivska oblast", "UA-09" => "Luhanska oblast", "UA-46" => "Lvivska oblast", "UA-48" => "Mykolaivska oblast", "UA-51" => "Odeska oblast", "UA-53" => "Poltavska oblast", "UA-56" => "Rivnenska oblast", "UA-59" => "Sumska oblast", "UA-61" => "Ternopilska oblast", "UA-05" => "Vinnytska oblast", "UA-07" => "Volynska oblast", "UA-21" => "Zakarpatska oblast", "UA-23" => "Zaporizka oblast", "UA-18" => "Zhytomyrska oblast", "UA-43" => "Avtonomna Respublika Krym", "UA-30" => "Kyiv", "UA-40" => "Sevastopol" }, "UG" => { "UG-C" => "Central", "UG-E" => "Eastern", "UG-N" => "Northern", "UG-W" => "Western" }, "UM" => { "UM-81" => "Baker Island", "UM-84" => "Howland Island", "UM-86" => "Jarvis Island", "UM-67" => "Johnston Atoll", "UM-89" => "Kingman Reef", "UM-71" => "Midway Islands", "UM-76" => "Navassa Island", "UM-95" => "Palmyra Atoll", "UM-79" => "Wake Island" }, "US" => { "US-AL" => "Alabama", "US-AK" => "Alaska", "US-AZ" => "Arizona", "US-AR" => "Arkansas", "US-CA" => "California", "US-CO" => "Colorado", "US-CT" => "Connecticut", "US-DE" => "Delaware", "US-FL" => "Florida", "US-GA" => "Georgia", "US-HI" => "Hawaii", "US-ID" => "Idaho", "US-IL" => "Illinois", "US-IN" => "Indiana", "US-IA" => "Iowa", "US-KS" => "Kansas", "US-KY" => "Kentucky", "US-LA" => "Louisiana", "US-ME" => "Maine", "US-MD" => "Maryland", "US-MA" => "Massachusetts", "US-MI" => "Michigan", "US-MN" => "Minnesota", "US-MS" => "Mississippi", "US-MO" => "Missouri", "US-MT" => "Montana", "US-NE" => "Nebraska", "US-NV" => "Nevada", "US-NH" => "New Hampshire", "US-NJ" => "New Jersey", "US-NM" => "New Mexico", "US-NY" => "New York", "US-NC" => "North Carolina", "US-ND" => "North Dakota", "US-OH" => "Ohio", "US-OK" => "Oklahoma", "US-OR" => "Oregon", "US-PA" => "Pennsylvania", "US-RI" => "Rhode Island", "US-SC" => "South Carolina", "US-SD" => "South Dakota", "US-TN" => "Tennessee", "US-TX" => "Texas", "US-UT" => "Utah", "US-VT" => "Vermont", "US-VA" => "Virginia", "US-WA" => "Washington", "US-WV" => "West Virginia", "US-WI" => "Wisconsin", "US-WY" => "Wyoming", "US-DC" => "District of Columbia", "US-AS" => "American Samoa", "US-GU" => "Guam", "US-MP" => "Northern Mariana Islands", "US-PR" => "Puerto Rico", "US-UM" => "United States Minor Outlying Islands", "US-VI" => "U.S. Virgin Islands" }, "UY" => { "UY-AR" => "Artigas", "UY-CA" => "Canelones", "UY-CL" => "Cerro Largo", "UY-CO" => "Colonia", "UY-DU" => "Durazno", "UY-FS" => "Flores", "UY-FD" => "Florida", "UY-LA" => "Lavalleja", "UY-MA" => "Maldonado", "UY-MO" => "Montevideo", "UY-PA" => "Paysandú", "UY-RN" => "Río Negro", "UY-RV" => "Rivera", "UY-RO" => "Rocha", "UY-SA" => "Salto", "UY-SJ" => "San José", "UY-SO" => "Soriano", "UY-TA" => "Tacuarembó", "UY-TT" => "Treinta y Tres" }, "UZ" => { "UZ-TK" => "Toshkent", "UZ-AN" => "Andijon", "UZ-BU" => "Buxoro", "UZ-FA" => "Farg‘ona", "UZ-JI" => "Jizzax", "UZ-NG" => "Namangan", "UZ-NW" => "Navoiy", "UZ-QA" => "Qashqadaryo", "UZ-SA" => "Samarqand", "UZ-SI" => "Sirdaryo", "UZ-SU" => "Surxondaryo", "UZ-TO" => "Toshkent", "UZ-XO" => "Xorazm", "UZ-QR" => "Qoraqalpog‘iston Respublikasi" }, "VC" => { "VC-01" => "Charlotte", "VC-06" => "Grenadines", "VC-02" => "Saint Andrew", "VC-03" => "Saint David", "VC-04" => "Saint George", "VC-05" => "Saint Patrick" }, "VE" => { "VE-W" => "Dependencias Federales", "VE-A" => "Distrito Capital", "VE-Z" => "Amazonas", "VE-B" => "Anzoátegui", "VE-C" => "Apure", "VE-D" => "Aragua", "VE-E" => "Barinas", "VE-F" => "Bolívar", "VE-G" => "Carabobo", "VE-H" => "Cojedes", "VE-Y" => "Delta Amacuro", "VE-I" => "Falcón", "VE-J" => "Guárico", "VE-K" => "Lara", "VE-L" => "Mérida", "VE-M" => "Miranda", "VE-N" => "Monagas", "VE-O" => "Nueva Esparta", "VE-P" => "Portuguesa", "VE-R" => "Sucre", "VE-S" => "Táchira", "VE-T" => "Trujillo", "VE-X" => "Vargas", "VE-U" => "Yaracuy", "VE-V" => "Zulia" }, "VN" => { "VN-44" => "An Giang", "VN-43" => "Bà Rịa - Vũng Tàu", "VN-54" => "Bắc Giang", "VN-53" => "Bắc Kạn", "VN-55" => "Bạc Liêu", "VN-56" => "Bắc Ninh", "VN-50" => "Bến Tre", "VN-31" => "Bình Định", "VN-57" => "Bình Dương", "VN-58" => "Bình Phước", "VN-40" => "Bình Thuận", "VN-59" => "Cà Mau", "VN-04" => "Cao Bằng", "VN-33" => "Đắk Lắk", "VN-72" => "Đắk Nông", "VN-71" => "Điện Biên", "VN-39" => "Đồng Nai", "VN-45" => "Đồng Tháp", "VN-30" => "Gia Lai", "VN-03" => "Hà Giang", "VN-63" => "Hà Nam", "VN-23" => "Hà Tĩnh", "VN-61" => "Hải Dương", "VN-73" => "Hậu Giang", "VN-14" => "Hòa Bình", "VN-66" => "Hưng Yên", "VN-34" => "Khánh Hòa", "VN-47" => "Kiến Giang", "VN-28" => "Kon Tum", "VN-01" => "Lai Châu", "VN-35" => "Lâm Đồng", "VN-09" => "Lạng Sơn", "VN-02" => "Lào Cai", "VN-41" => "Long An", "VN-67" => "Nam Định", "VN-22" => "Nghệ An", "VN-18" => "Ninh Bình", "VN-36" => "Ninh Thuận", "VN-68" => "Phú Thọ", "VN-32" => "Phú Yên", "VN-24" => "Quảng Bình", "VN-27" => "Quảng Nam", "VN-29" => "Quảng Ngãi", "VN-13" => "Quảng Ninh", "VN-25" => "Quảng Trị", "VN-52" => "Sóc Trăng", "VN-05" => "Sơn La", "VN-37" => "Tây Ninh", "VN-20" => "Thái Bình", "VN-69" => "Thái Nguyên", "VN-21" => "Thanh Hóa", "VN-26" => "Thừa Thiên-Huế", "VN-46" => "Tiền Giang", "VN-51" => "Trà Vinh", "VN-07" => "Tuyên Quang", "VN-49" => "Vĩnh Long", "VN-70" => "Vĩnh Phúc", "VN-06" => "Yên Bái", "VN-CT" => "Cần Thơ", "VN-DN" => "Đà Nẵng", "VN-HN" => "Hà Nội", "VN-HP" => "Hải Phòng", "VN-SG" => "Hồ Chí Minh(local variant is Sai Gon)" }, "VU" => { "VU-MAP" => "Malampa", "VU-PAM" => "Pénama", "VU-SAM" => "Sanma", "VU-SEE" => "Shéfa", "VU-TAE" => "Taféa", "VU-TOB" => "Torba" }, "WF" => { "WF-AL" => "Alo", "WF-SG" => "Sigave", "WF-UV" => "Uvea" }, "WS" => { "WS-AA" => "A'ana", "WS-AL" => "Aiga-i-le-Tai", "WS-AT" => "Atua", "WS-FA" => "Fa'asaleleaga", "WS-GE" => "Gaga'emauga", "WS-GI" => "Gagaifomauga", "WS-PA" => "Palauli", "WS-SA" => "Satupa'itea", "WS-TU" => "Tuamasaga", "WS-VF" => "Va'a-o-Fonoti", "WS-VS" => "Vaisigano" }, "YE" => { "YE-SA" => "Amānat al ‘Āşimah [city]", "YE-AB" => "Abyan", "YE-AD" => "‘Adan", "YE-DA" => "Aḑ Ḑāli‘", "YE-BA" => "Al Bayḑā’", "YE-HU" => "Al Ḩudaydah", "YE-JA" => "Al Jawf", "YE-MR" => "Al Mahrah", "YE-MW" => "Al Maḩwīt", "YE-AM" => "‘Amrān", "YE-SU" => "Arkhabīl Suquţrá", "YE-DH" => "Dhamār", "YE-HD" => "Ḩaḑramawt", "YE-HJ" => "Ḩajjah", "YE-IB" => "Ibb", "YE-LA" => "Laḩij", "YE-MA" => "Ma’rib", "YE-RA" => "Raymah", "YE-SD" => "Şāʻdah", "YE-SN" => "Şanʻā’", "YE-SH" => "Shabwah", "YE-TA" => "Tāʻizz" }, "ZA" => { "ZA-EC" => "Eastern Cape", "ZA-FS" => "Free State", "ZA-GP" => "Gauteng", "ZA-KZN" => "Kwazulu-Natal", "ZA-LP" => "Limpopo", "ZA-MP" => "Mpumalanga", "ZA-NC" => "Northern Cape", "ZA-NW" => "North-West", "ZA-WC" => "Western Cape" }, "ZM" => { "ZM-02" => "Central", "ZM-08" => "Copperbelt", "ZM-03" => "Eastern", "ZM-04" => "Luapula", "ZM-09" => "Lusaka", "ZM-05" => "Northern", "ZM-06" => "North-Western", "ZM-07" => "Southern", "ZM-01" => "Western", "ZM-10" => "Muchinga" }, "ZW" => { "ZW-BU" => "Bulawayo", "ZW-HA" => "Harare", "ZW-MA" => "Manicaland", "ZW-MC" => "Mashonaland Central", "ZW-ME" => "Mashonaland East", "ZW-MW" => "Mashonaland West", "ZW-MV" => "Masvingo", "ZW-MN" => "Matabeleland North", "ZW-MS" => "Matabeleland South", "ZW-MI" => "Midlands" } } end end end ruby-kdl-1.0.3/lib/kdl/types/currency.rb000066400000000000000000000012671444670406000201220ustar00rootroot00000000000000require 'kdl/types/currency/iso4217_currencies' module KDL module Types class Currency < Value attr_reader :numeric_code, :minor_unit, :name def initialize(value, format: nil, type: 'currency') super @numeric = value.fetch(:numeric, nil) @minor_unit = value.fetch(:minor_unit, nil) @name = value.fetch(:name, '') end def self.call(value, type = 'currency') return nil unless value.is_a? ::KDL::Value::String currency = CURRENCIES[value.value.upcase] raise ArgumentError, 'invalid currency' if currency.nil? new(currency, type: type) end end MAPPING['currency'] = Currency end end ruby-kdl-1.0.3/lib/kdl/types/currency/000077500000000000000000000000001444670406000175675ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/currency/iso4217_currencies.rb000066400000000000000000000377361444670406000234660ustar00rootroot00000000000000module KDL module Types class Currency < Value # From https://en.wikipedia.org/wiki/ISO_4217#Active_codes CURRENCIES = { 'AED' => { numeric_code: 784, minor_unit: 2, name: 'United Arab Emirates dirham' }.freeze, 'AFN' => { numeric_code: 971, minor_unit: 2, name: 'Afghan afghani' }.freeze, 'ALL' => { numeric_code: 8, minor_unit: 2, name: 'Albanian lek' }.freeze, 'AMD' => { numeric_code: 51, minor_unit: 2, name: 'Armenian dram' }.freeze, 'ANG' => { numeric_code: 532, minor_unit: 2, name: 'Netherlands Antillean guilder' }.freeze, 'AOA' => { numeric_code: 973, minor_unit: 2, name: 'Angolan kwanza' }.freeze, 'ARS' => { numeric_code: 32, minor_unit: 2, name: 'Argentine peso' }.freeze, 'AUD' => { numeric_code: 36, minor_unit: 2, name: 'Australian dollar' }.freeze, 'AWG' => { numeric_code: 533, minor_unit: 2, name: 'Aruban florin' }.freeze, 'AZN' => { numeric_code: 944, minor_unit: 2, name: 'Azerbaijani manat' }.freeze, 'BAM' => { numeric_code: 977, minor_unit: 2, name: 'Bosnia and Herzegovina convertible mark' }.freeze, 'BBD' => { numeric_code: 52, minor_unit: 2, name: 'Barbados dollar' }.freeze, 'BDT' => { numeric_code: 50, minor_unit: 2, name: 'Bangladeshi taka' }.freeze, 'BGN' => { numeric_code: 975, minor_unit: 2, name: 'Bulgarian lev' }.freeze, 'BHD' => { numeric_code: 48, minor_unit: 3, name: 'Bahraini dinar' }.freeze, 'BIF' => { numeric_code: 108, minor_unit: 0, name: 'Burundian franc' }.freeze, 'BMD' => { numeric_code: 60, minor_unit: 2, name: 'Bermudian dollar' }.freeze, 'BND' => { numeric_code: 96, minor_unit: 2, name: 'Brunei dollar' }.freeze, 'BOB' => { numeric_code: 68, minor_unit: 2, name: 'Boliviano' }.freeze, 'BOV' => { numeric_code: 984, minor_unit: 2, name: 'Bolivian Mvdol (funds code)' }.freeze, 'BRL' => { numeric_code: 986, minor_unit: 2, name: 'Brazilian real' }.freeze, 'BSD' => { numeric_code: 44, minor_unit: 2, name: 'Bahamian dollar' }.freeze, 'BTN' => { numeric_code: 64, minor_unit: 2, name: 'Bhutanese ngultrum' }.freeze, 'BWP' => { numeric_code: 72, minor_unit: 2, name: 'Botswana pula' }.freeze, 'BYN' => { numeric_code: 933, minor_unit: 2, name: 'Belarusian ruble' }.freeze, 'BZD' => { numeric_code: 84, minor_unit: 2, name: 'Belize dollar' }.freeze, 'CAD' => { numeric_code: 124, minor_unit: 2, name: 'Canadian dollar' }.freeze, 'CDF' => { numeric_code: 976, minor_unit: 2, name: 'Congolese franc' }.freeze, 'CHE' => { numeric_code: 947, minor_unit: 2, name: 'WIR euro (complementary currency)' }.freeze, 'CHF' => { numeric_code: 756, minor_unit: 2, name: 'Swiss franc' }.freeze, 'CHW' => { numeric_code: 948, minor_unit: 2, name: 'WIR franc (complementary currency)' }.freeze, 'CLF' => { numeric_code: 990, minor_unit: 4, name: 'Unidad de Fomento (funds code)' }.freeze, 'CLP' => { numeric_code: 152, minor_unit: 0, name: 'Chilean peso' }.freeze, 'CNY' => { numeric_code: 156, minor_unit: 2, name: 'Chinese yuan[8]' }.freeze, 'COP' => { numeric_code: 170, minor_unit: 2, name: 'Colombian peso' }.freeze, 'COU' => { numeric_code: 970, minor_unit: 2, name: 'Unidad de Valor Real (UVR) (funds code)' }.freeze, 'CRC' => { numeric_code: 188, minor_unit: 2, name: 'Costa Rican colon' }.freeze, 'CUC' => { numeric_code: 931, minor_unit: 2, name: 'Cuban convertible peso' }.freeze, 'CUP' => { numeric_code: 192, minor_unit: 2, name: 'Cuban peso' }.freeze, 'CVE' => { numeric_code: 132, minor_unit: 2, name: 'Cape Verdean escudo' }.freeze, 'CZK' => { numeric_code: 203, minor_unit: 2, name: 'Czech koruna' }.freeze, 'DJF' => { numeric_code: 262, minor_unit: 0, name: 'Djiboutian franc' }.freeze, 'DKK' => { numeric_code: 208, minor_unit: 2, name: 'Danish krone' }.freeze, 'DOP' => { numeric_code: 214, minor_unit: 2, name: 'Dominican peso' }.freeze, 'DZD' => { numeric_code: 12, minor_unit: 2, name: 'Algerian dinar' }.freeze, 'EGP' => { numeric_code: 818, minor_unit: 2, name: 'Egyptian pound' }.freeze, 'ERN' => { numeric_code: 232, minor_unit: 2, name: 'Eritrean nakfa' }.freeze, 'ETB' => { numeric_code: 230, minor_unit: 2, name: 'Ethiopian birr' }.freeze, 'EUR' => { numeric_code: 978, minor_unit: 2, name: 'Euro' }.freeze, 'FJD' => { numeric_code: 242, minor_unit: 2, name: 'Fiji dollar' }.freeze, 'FKP' => { numeric_code: 238, minor_unit: 2, name: 'Falkland Islands pound' }.freeze, 'GBP' => { numeric_code: 826, minor_unit: 2, name: 'Pound sterling' }.freeze, 'GEL' => { numeric_code: 981, minor_unit: 2, name: 'Georgian lari' }.freeze, 'GHS' => { numeric_code: 936, minor_unit: 2, name: 'Ghanaian cedi' }.freeze, 'GIP' => { numeric_code: 292, minor_unit: 2, name: 'Gibraltar pound' }.freeze, 'GMD' => { numeric_code: 270, minor_unit: 2, name: 'Gambian dalasi' }.freeze, 'GNF' => { numeric_code: 324, minor_unit: 0, name: 'Guinean franc' }.freeze, 'GTQ' => { numeric_code: 320, minor_unit: 2, name: 'Guatemalan quetzal' }.freeze, 'GYD' => { numeric_code: 328, minor_unit: 2, name: 'Guyanese dollar' }.freeze, 'HKD' => { numeric_code: 344, minor_unit: 2, name: 'Hong Kong dollar' }.freeze, 'HNL' => { numeric_code: 340, minor_unit: 2, name: 'Honduran lempira' }.freeze, 'HRK' => { numeric_code: 191, minor_unit: 2, name: 'Croatian kuna' }.freeze, 'HTG' => { numeric_code: 332, minor_unit: 2, name: 'Haitian gourde' }.freeze, 'HUF' => { numeric_code: 348, minor_unit: 2, name: 'Hungarian forint' }.freeze, 'IDR' => { numeric_code: 360, minor_unit: 2, name: 'Indonesian rupiah' }.freeze, 'ILS' => { numeric_code: 376, minor_unit: 2, name: 'Israeli new shekel' }.freeze, 'INR' => { numeric_code: 356, minor_unit: 2, name: 'Indian rupee' }.freeze, 'IQD' => { numeric_code: 368, minor_unit: 3, name: 'Iraqi dinar' }.freeze, 'IRR' => { numeric_code: 364, minor_unit: 2, name: 'Iranian rial' }.freeze, 'ISK' => { numeric_code: 352, minor_unit: 0, name: 'Icelandic króna (plural: krónur)' }.freeze, 'JMD' => { numeric_code: 388, minor_unit: 2, name: 'Jamaican dollar' }.freeze, 'JOD' => { numeric_code: 400, minor_unit: 3, name: 'Jordanian dinar' }.freeze, 'JPY' => { numeric_code: 392, minor_unit: 0, name: 'Japanese yen' }.freeze, 'KES' => { numeric_code: 404, minor_unit: 2, name: 'Kenyan shilling' }.freeze, 'KGS' => { numeric_code: 417, minor_unit: 2, name: 'Kyrgyzstani som' }.freeze, 'KHR' => { numeric_code: 116, minor_unit: 2, name: 'Cambodian riel' }.freeze, 'KMF' => { numeric_code: 174, minor_unit: 0, name: 'Comoro franc' }.freeze, 'KPW' => { numeric_code: 408, minor_unit: 2, name: 'North Korean won' }.freeze, 'KRW' => { numeric_code: 410, minor_unit: 0, name: 'South Korean won' }.freeze, 'KWD' => { numeric_code: 414, minor_unit: 3, name: 'Kuwaiti dinar' }.freeze, 'KYD' => { numeric_code: 136, minor_unit: 2, name: 'Cayman Islands dollar' }.freeze, 'KZT' => { numeric_code: 398, minor_unit: 2, name: 'Kazakhstani tenge' }.freeze, 'LAK' => { numeric_code: 418, minor_unit: 2, name: 'Lao kip' }.freeze, 'LBP' => { numeric_code: 422, minor_unit: 2, name: 'Lebanese pound' }.freeze, 'LKR' => { numeric_code: 144, minor_unit: 2, name: 'Sri Lankan rupee' }.freeze, 'LRD' => { numeric_code: 430, minor_unit: 2, name: 'Liberian dollar' }.freeze, 'LSL' => { numeric_code: 426, minor_unit: 2, name: 'Lesotho loti' }.freeze, 'LYD' => { numeric_code: 434, minor_unit: 3, name: 'Libyan dinar' }.freeze, 'MAD' => { numeric_code: 504, minor_unit: 2, name: 'Moroccan dirham' }.freeze, 'MDL' => { numeric_code: 498, minor_unit: 2, name: 'Moldovan leu' }.freeze, 'MGA' => { numeric_code: 969, minor_unit: 2, name: 'Malagasy ariary' }.freeze, 'MKD' => { numeric_code: 807, minor_unit: 2, name: 'Macedonian denar' }.freeze, 'MMK' => { numeric_code: 104, minor_unit: 2, name: 'Myanmar kyat' }.freeze, 'MNT' => { numeric_code: 496, minor_unit: 2, name: 'Mongolian tögrög' }.freeze, 'MOP' => { numeric_code: 446, minor_unit: 2, name: 'Macanese pataca' }.freeze, 'MRU' => { numeric_code: 929, minor_unit: 2, name: 'Mauritanian ouguiya' }.freeze, 'MUR' => { numeric_code: 480, minor_unit: 2, name: 'Mauritian rupee' }.freeze, 'MVR' => { numeric_code: 462, minor_unit: 2, name: 'Maldivian rufiyaa' }.freeze, 'MWK' => { numeric_code: 454, minor_unit: 2, name: 'Malawian kwacha' }.freeze, 'MXN' => { numeric_code: 484, minor_unit: 2, name: 'Mexican peso' }.freeze, 'MXV' => { numeric_code: 979, minor_unit: 2, name: 'Mexican Unidad de Inversion (UDI) (funds code)' }.freeze, 'MYR' => { numeric_code: 458, minor_unit: 2, name: 'Malaysian ringgit' }.freeze, 'MZN' => { numeric_code: 943, minor_unit: 2, name: 'Mozambican metical' }.freeze, 'NAD' => { numeric_code: 516, minor_unit: 2, name: 'Namibian dollar' }.freeze, 'NGN' => { numeric_code: 566, minor_unit: 2, name: 'Nigerian naira' }.freeze, 'NIO' => { numeric_code: 558, minor_unit: 2, name: 'Nicaraguan córdoba' }.freeze, 'NOK' => { numeric_code: 578, minor_unit: 2, name: 'Norwegian krone' }.freeze, 'NPR' => { numeric_code: 524, minor_unit: 2, name: 'Nepalese rupee' }.freeze, 'NZD' => { numeric_code: 554, minor_unit: 2, name: 'New Zealand dollar' }.freeze, 'OMR' => { numeric_code: 512, minor_unit: 3, name: 'Omani rial' }.freeze, 'PAB' => { numeric_code: 590, minor_unit: 2, name: 'Panamanian balboa' }.freeze, 'PEN' => { numeric_code: 604, minor_unit: 2, name: 'Peruvian sol' }.freeze, 'PGK' => { numeric_code: 598, minor_unit: 2, name: 'Papua New Guinean kina' }.freeze, 'PHP' => { numeric_code: 608, minor_unit: 2, name: 'Philippine peso' }.freeze, 'PKR' => { numeric_code: 586, minor_unit: 2, name: 'Pakistani rupee' }.freeze, 'PLN' => { numeric_code: 985, minor_unit: 2, name: 'Polish złoty' }.freeze, 'PYG' => { numeric_code: 600, minor_unit: 0, name: 'Paraguayan guaraní' }.freeze, 'QAR' => { numeric_code: 634, minor_unit: 2, name: 'Qatari riyal' }.freeze, 'RON' => { numeric_code: 946, minor_unit: 2, name: 'Romanian leu' }.freeze, 'RSD' => { numeric_code: 941, minor_unit: 2, name: 'Serbian dinar' }.freeze, 'RUB' => { numeric_code: 643, minor_unit: 2, name: 'Russian ruble' }.freeze, 'RWF' => { numeric_code: 646, minor_unit: 0, name: 'Rwandan franc' }.freeze, 'SAR' => { numeric_code: 682, minor_unit: 2, name: 'Saudi riyal' }.freeze, 'SBD' => { numeric_code: 90, minor_unit: 2, name: 'Solomon Islands dollar' }.freeze, 'SCR' => { numeric_code: 690, minor_unit: 2, name: 'Seychelles rupee' }.freeze, 'SDG' => { numeric_code: 938, minor_unit: 2, name: 'Sudanese pound' }.freeze, 'SEK' => { numeric_code: 752, minor_unit: 2, name: 'Swedish krona (plural: kronor)' }.freeze, 'SGD' => { numeric_code: 702, minor_unit: 2, name: 'Singapore dollar' }.freeze, 'SHP' => { numeric_code: 654, minor_unit: 2, name: 'Saint Helena pound' }.freeze, 'SLL' => { numeric_code: 694, minor_unit: 2, name: 'Sierra Leonean leone' }.freeze, 'SOS' => { numeric_code: 706, minor_unit: 2, name: 'Somali shilling' }.freeze, 'SRD' => { numeric_code: 968, minor_unit: 2, name: 'Surinamese dollar' }.freeze, 'SSP' => { numeric_code: 728, minor_unit: 2, name: 'South Sudanese pound' }.freeze, 'STN' => { numeric_code: 930, minor_unit: 2, name: 'São Tomé and Príncipe dobra' }.freeze, 'SVC' => { numeric_code: 222, minor_unit: 2, name: 'Salvadoran colón' }.freeze, 'SYP' => { numeric_code: 760, minor_unit: 2, name: 'Syrian pound' }.freeze, 'SZL' => { numeric_code: 748, minor_unit: 2, name: 'Swazi lilangeni' }.freeze, 'THB' => { numeric_code: 764, minor_unit: 2, name: 'Thai baht' }.freeze, 'TJS' => { numeric_code: 972, minor_unit: 2, name: 'Tajikistani somoni' }.freeze, 'TMT' => { numeric_code: 934, minor_unit: 2, name: 'Turkmenistan manat' }.freeze, 'TND' => { numeric_code: 788, minor_unit: 3, name: 'Tunisian dinar' }.freeze, 'TOP' => { numeric_code: 776, minor_unit: 2, name: 'Tongan paʻanga' }.freeze, 'TRY' => { numeric_code: 949, minor_unit: 2, name: 'Turkish lira' }.freeze, 'TTD' => { numeric_code: 780, minor_unit: 2, name: 'Trinidad and Tobago dollar' }.freeze, 'TWD' => { numeric_code: 901, minor_unit: 2, name: 'New Taiwan dollar' }.freeze, 'TZS' => { numeric_code: 834, minor_unit: 2, name: 'Tanzanian shilling' }.freeze, 'UAH' => { numeric_code: 980, minor_unit: 2, name: 'Ukrainian hryvnia' }.freeze, 'UGX' => { numeric_code: 800, minor_unit: 0, name: 'Ugandan shilling' }.freeze, 'USD' => { numeric_code: 840, minor_unit: 2, name: 'United States dollar' }.freeze, 'USN' => { numeric_code: 997, minor_unit: 2, name: 'United States dollar (next day) (funds code)' }.freeze, 'UYI' => { numeric_code: 940, minor_unit: 0, name: 'Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)' }.freeze, 'UYU' => { numeric_code: 858, minor_unit: 2, name: 'Uruguayan peso' }.freeze, 'UYW' => { numeric_code: 927, minor_unit: 4, name: 'Unidad previsional' }.freeze, 'UZS' => { numeric_code: 860, minor_unit: 2, name: 'Uzbekistan som' }.freeze, 'VED' => { numeric_code: 926, minor_unit: 2, name: 'Venezuelan bolívar digital' }.freeze, 'VES' => { numeric_code: 928, minor_unit: 2, name: 'Venezuelan bolívar soberano' }.freeze, 'VND' => { numeric_code: 704, minor_unit: 0, name: 'Vietnamese đồng' }.freeze, 'VUV' => { numeric_code: 548, minor_unit: 0, name: 'Vanuatu vatu' }.freeze, 'WST' => { numeric_code: 882, minor_unit: 2, name: 'Samoan tala' }.freeze, 'XAF' => { numeric_code: 950, minor_unit: 0, name: 'CFA franc BEAC' }.freeze, 'XAG' => { numeric_code: 961, minor_unit: nil, name: 'Silver (one troy ounce)' }.freeze, 'XAU' => { numeric_code: 959, minor_unit: nil, name: 'Gold (one troy ounce)' }.freeze, 'XBA' => { numeric_code: 955, minor_unit: nil, name: 'European Composite Unit (EURCO) (bond market unit)' }.freeze, 'XBB' => { numeric_code: 956, minor_unit: nil, name: 'European Monetary Unit (E.M.U.-6) (bond market unit)' }.freeze, 'XBC' => { numeric_code: 957, minor_unit: nil, name: 'European Unit of Account 9 (E.U.A.-9) (bond market unit)' }.freeze, 'XBD' => { numeric_code: 958, minor_unit: nil, name: 'European Unit of Account 17 (E.U.A.-17) (bond market unit)' }.freeze, 'XCD' => { numeric_code: 951, minor_unit: 2, name: 'East Caribbean dollar' }.freeze, 'XDR' => { numeric_code: 960, minor_unit: nil, name: 'Special drawing rights' }.freeze, 'XOF' => { numeric_code: 952, minor_unit: 0, name: 'CFA franc BCEAO' }.freeze, 'XPD' => { numeric_code: 964, minor_unit: nil, name: 'Palladium (one troy ounce)' }.freeze, 'XPF' => { numeric_code: 953, minor_unit: 0, name: 'CFP franc (franc Pacifique)' }.freeze, 'XPT' => { numeric_code: 962, minor_unit: nil, name: 'Platinum (one troy ounce)' }.freeze, 'XSU' => { numeric_code: 994, minor_unit: nil, name: 'SUCRE' }.freeze, 'XTS' => { numeric_code: 963, minor_unit: nil, name: 'Code reserved for testing' }.freeze, 'XUA' => { numeric_code: 965, minor_unit: nil, name: 'ADB Unit of Account' }.freeze, 'XXX' => { numeric_code: 999, minor_unit: nil, name: 'No currency' }.freeze, 'YER' => { numeric_code: 886, minor_unit: 2, name: 'Yemeni rial' }.freeze, 'ZAR' => { numeric_code: 710, minor_unit: 2, name: 'South African rand' }.freeze, 'ZMW' => { numeric_code: 967, minor_unit: 2, name: 'Zambian kwacha' }.freeze, 'ZWL' => { numeric_code: 932, minor_unit: 2, name: 'Zimbabwean dollar' }.freeze }.freeze end end end ruby-kdl-1.0.3/lib/kdl/types/date_time.rb000066400000000000000000000020721444670406000202160ustar00rootroot00000000000000require 'time' module KDL module Types class DateTime < Value def self.call(value, type = 'date-time') return nil unless value.is_a? ::KDL::Value::String time = ::Time.iso8601(value.value) new(time, type: type) end end MAPPING['date-time'] = DateTime class Time < Value # TODO: this is not a perfect ISO8601 time string REGEX = /^T?((?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9](?:\.[0-9]+)?(?:Z|[+-]\d\d:\d\d)?)$/ def self.call(value, type = 'time') return nil unless value.is_a? ::KDL::Value::String match = REGEX.match(value.value) raise ArgumentError, 'invalid time' if match.nil? time = ::Time.iso8601("#{::Date.today.iso8601}T#{match[1]}") new(time, type: type) end end MAPPING['time'] = Time class Date < Value def self.call(value, type = 'date') return nil unless value.is_a? ::KDL::Value::String date = ::Date.iso8601(value.value) new(date, type: type) end end MAPPING['date'] = Date end end ruby-kdl-1.0.3/lib/kdl/types/decimal.rb000066400000000000000000000004551444670406000176640ustar00rootroot00000000000000module KDL module Types class Decimal < Value def self.call(value, type = 'decimal') return nil unless value.is_a? ::KDL::Value::String big_decimal = BigDecimal(value.value) new(big_decimal, type: type) end end MAPPING['decimal'] = Decimal end end ruby-kdl-1.0.3/lib/kdl/types/duration.rb000066400000000000000000000014471444670406000201150ustar00rootroot00000000000000require 'kdl/types/duration/iso8601_parser' module KDL module Types class Duration < Value attr_reader :years, :months, :weeks, :days, :hours, :minutes, :seconds def initialize(parts = {}, format: nil, type: 'duration') super @years = parts.fetch(:years, 0) @months = parts.fetch(:months, 0) @weeks = parts.fetch(:weeks, 0) @days = parts.fetch(:days, 0) @hours = parts.fetch(:hours, 0) @minutes = parts.fetch(:minutes, 0) @seconds = parts.fetch(:seconds, 0) end def self.call(value, type = 'duration') return nil unless value.is_a? ::KDL::Value::String parts = ISO8601Parser.new(value.value).parse! new(parts, type: type) end end MAPPING['duration'] = Duration end end ruby-kdl-1.0.3/lib/kdl/types/duration/000077500000000000000000000000001444670406000175625ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/duration/iso8601_parser.rb000066400000000000000000000113421444670406000225750ustar00rootroot00000000000000# Shamelessly borrowed from https://github.com/rails/rails/tree/main/activesupport # # Copyright (c) 2005-2021 David Heinemeier Hansson # 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. require 'strscan' module KDL module Types class Duration < Value # Parses a string formatted according to ISO 8601 Duration into the hash. # # See {ISO 8601}[https://en.wikipedia.org/wiki/ISO_8601#Durations] for more information. # # This parser allows negative parts to be present in pattern. class ISO8601Parser # :nodoc: class ParsingError < ::ArgumentError; end PERIOD_OR_COMMA = /\.|,/ PERIOD = '.' COMMA = ',' SIGN_MARKER = /\A-|\+|/ DATE_MARKER = /P/ TIME_MARKER = /T/ DATE_COMPONENT = /(-?\d+(?:[.,]\d+)?)(Y|M|D|W)/ TIME_COMPONENT = /(-?\d+(?:[.,]\d+)?)(H|M|S)/ DATE_TO_PART = { 'Y' => :years, 'M' => :months, 'W' => :weeks, 'D' => :days } TIME_TO_PART = { 'H' => :hours, 'M' => :minutes, 'S' => :seconds } DATE_COMPONENTS = %i[years months days] TIME_COMPONENTS = %i[hours minutes seconds] attr_reader :parts, :scanner attr_accessor :mode, :sign def initialize(string) @scanner = StringScanner.new(string) @parts = {} @mode = :start @sign = 1 end def parse! until finished? case mode when :start if scan(SIGN_MARKER) self.sign = scanner.matched == '-' ? -1 : 1 self.mode = :sign else raise_parsing_error end when :sign if scan(DATE_MARKER) self.mode = :date else raise_parsing_error end when :date if scan(TIME_MARKER) self.mode = :time elsif scan(DATE_COMPONENT) parts[DATE_TO_PART[scanner[2]]] = number * sign else raise_parsing_error end when :time if scan(TIME_COMPONENT) parts[TIME_TO_PART[scanner[2]]] = number * sign else raise_parsing_error end end end validate! parts end private def finished? scanner.eos? end # Parses number which can be a float with either comma or period. def number (PERIOD_OR_COMMA =~ scanner[1]) ? scanner[1].tr(COMMA, PERIOD).to_f : scanner[1].to_i end def scan(pattern) scanner.scan(pattern) end def raise_parsing_error(reason = nil) raise ParsingError, "Invalid ISO 8601 duration: #{scanner.string.inspect} #{reason}".strip end # Checks for various semantic errors as stated in ISO 8601 standard. def validate! raise_parsing_error('is empty duration') if parts.empty? # Mixing any of Y, M, D with W is invalid. if parts.key?(:weeks) && (parts.keys & DATE_COMPONENTS).any? raise_parsing_error('mixing weeks with other date parts not allowed') end # Specifying an empty T part is invalid. if mode == :time && (parts.keys & TIME_COMPONENTS).empty? raise_parsing_error('time part marker is present but time part is empty') end fractions = parts.values.reject(&:zero?).select { |a| (a % 1) != 0 } unless fractions.empty? || (fractions.size == 1 && fractions.last == @parts.values.reject(&:zero?).last) raise_parsing_error '(only last part can be fractional)' end true end end end end end ruby-kdl-1.0.3/lib/kdl/types/email.rb000066400000000000000000000022271444670406000173540ustar00rootroot00000000000000require_relative './email/parser' module KDL module Types class Email < Value attr_reader :local, :domain def initialize(value, local:, domain:, **kwargs) super(value, **kwargs) @local = local @domain = domain end def self.call(value, type = 'email') return nil unless value.is_a? ::KDL::Value::String local, domain = Parser.new(value.value).parse new(value.value, type: type, local: local, domain: domain) end end MAPPING['email'] = Email class IDNEmail < Email attr_reader :unicode_domain def initialize(value, unicode_domain:, **kwargs) super(value, **kwargs) @unicode_domain = unicode_domain end def self.call(value, type = 'email') return nil unless value.is_a? ::KDL::Value::String local, domain, unicode_domain = Email::Parser.new(value.value, idn: true).parse new("#{local}@#{domain}", type: type, local: local, domain: domain, unicode_domain: unicode_domain) end def unicode_value "#{local}@#{unicode_domain}" end end MAPPING['idn-email'] = IDNEmail end end ruby-kdl-1.0.3/lib/kdl/types/email/000077500000000000000000000000001444670406000170245ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/email/parser.rb000066400000000000000000000104761444670406000206550ustar00rootroot00000000000000require_relative '../hostname/validator' module KDL module Types class Email < Value class Parser def initialize(string, idn: false) @string = string @idn = idn @tokenizer = Tokenizer.new(string, idn: idn) end def parse local = '' unicode_domain = nil domain = nil context = :start loop do type, value = @tokenizer.next_token case type when :part case context when :start, :after_dot local += value context = :after_part else raise ArgumentError, "invalid email #{@string} (unexpected part #{value} at #{context})" end when :dot case context when :after_part local += value context = :after_dot else raise ArgumentError, "invalid email #{@string} (unexpected dot at #{context})" end when :at case context when :after_part context = :after_at end when :domain case context when :after_at validator = (@idn ? IDNHostname : Hostname)::Validator.new(value) raise ArgumentError, "invalid hostname #{value}" unless validator.valid? unicode_domain = validator.unicode domain = validator.ascii context = :after_domain else raise ArgumentError, "invalid email #{@string} (unexpected domain at #{context})" end when :end case context when :after_domain if local.size > 64 raise ArgumentError, "invalid email #{@string} (local part length #{local.size} exceeds maximaum of 64)" end return [local, domain, unicode_domain] else raise ArgumentError, "invalid email #{@string} (unexpected end at #{context})" end end end end end class Tokenizer LOCAL_PART_ASCII = %r{[a-zA-Z0-9!#$%&'*+\-/=?^_`{|}~]}.freeze LOCAL_PART_IDN = /[^\x00-\x1f\s".@]/.freeze def initialize(string, idn: false) @string = string @idn = idn @index = 0 @after_at = false end def next_token if @after_at if @index < @string.size domain_start = @index @index = @string.size return [:domain, @string[domain_start..-1]] else return [:end, nil] end end @context = nil @buffer = '' loop do c = @string[@index] return [:end, nil] if c.nil? case @context when nil case c when '.' @index += 1 return [:dot, '.'] when '@' @after_at = true @index += 1 return [:at, '@'] when '"' @context = :quote @index += 1 when local_part_chars @context = :part @buffer += c @index += 1 else raise ArgumentError, "invalid email #{@string} (unexpected #{c})" end when :part case c when local_part_chars @buffer += c @index += 1 when '.', '@' return [:part, @buffer] else raise ArgumentError, "invalid email #{@string} (unexpected #{c})" end when :quote case c when '"' n = @string[@index + 1] raise ArgumentError, "invalid email #{@string} (unexpected #{c})" unless n == '.' || n == '@' @index += 1 return [:part, @buffer] else @buffer += c @index += 1 end end end end def local_part_chars @idn ? LOCAL_PART_IDN : LOCAL_PART_ASCII end end end end end ruby-kdl-1.0.3/lib/kdl/types/hostname.rb000066400000000000000000000017561444670406000201110ustar00rootroot00000000000000require_relative './hostname/validator' module KDL module Types class Hostname < Value def self.call(value, type = 'hostname') return nil unless value.is_a? ::KDL::Value::String validator = Validator.new(value.value) raise ArgumentError, "invalid hostname #{value}" unless validator.valid? new(value.value, type: type) end end MAPPING['hostname'] = Hostname class IDNHostname < Hostname attr_reader :unicode_value def initialize(value, unicode_value:, **kwargs) super(value, **kwargs) @unicode_value = unicode_value end def self.call(value, type = 'idn-hostname') return nil unless value.is_a? ::KDL::Value::String validator = Validator.new(value.value) raise ArgumentError, "invalid hostname #{value}" unless validator.valid? new(validator.ascii, type: type, unicode_value: validator.unicode) end end MAPPING['idn-hostname'] = IDNHostname end end ruby-kdl-1.0.3/lib/kdl/types/hostname/000077500000000000000000000000001444670406000175535ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/hostname/validator.rb000066400000000000000000000021311444670406000220620ustar00rootroot00000000000000require 'simpleidn' module KDL module Types class Hostname < Value class Validator PART_RGX = /^[a-z0-9_][a-z0-9_\-]{0,62}$/i attr_reader :string alias ascii string alias unicode string def initialize(string) @string = string end def valid? return false if @string.length > 253 @string.split('.').all? { |x| valid_part?(x) } end private def valid_part?(part) return false if part.empty? return false if part.start_with?('-') || part.end_with?('-') part =~ PART_RGX end end end class IDNHostname < Hostname class Validator < Hostname::Validator attr_reader :unicode def initialize(string) is_ascii = string.split('.').any? { |x| x.start_with?('xn--') } if is_ascii super(string) @unicode = SimpleIDN.to_unicode(string) else super(SimpleIDN.to_ascii(string)) @unicode = string end end end end end end ruby-kdl-1.0.3/lib/kdl/types/ip.rb000066400000000000000000000011411444670406000166670ustar00rootroot00000000000000module KDL module Types class IP < Value def self.call(value, type = ip_type) return nil unless value.is_a? ::KDL::Value::String ip = ::IPAddr.new(value.value) raise ArgumentError, "invalid #{ip_type} address" unless valid_ip?(ip) new(ip, type: type) end def self.valid_ip?(ip) ip.__send__(:"#{ip_type}?") end end class IPV4 < IP def self.ip_type 'ipv4' end end MAPPING['ipv4'] = IPV4 class IPV6 < IP def self.ip_type 'ipv6' end end MAPPING['ipv6'] = IPV6 end end ruby-kdl-1.0.3/lib/kdl/types/irl.rb000066400000000000000000000022711444670406000170520ustar00rootroot00000000000000require_relative './irl/parser' module KDL module Types class IRLReference < Value attr_reader :unicode_value, :unicode_domain, :unicode_path, :unicode_search, :unicode_hash def initialize(value, unicode_value:, unicode_domain:, unicode_path:, unicode_search:, unicode_hash:, **kwargs) super(value, **kwargs) @unicode_value = unicode_value @unicode_domain = unicode_domain @unicode_path = unicode_path @unicode_search = unicode_search @unicode_hash = unicode_hash end def self.call(value, type = 'irl-reference') return nil unless value.is_a? ::KDL::Value::String ascii_value, params = parser(value.value).parse new(URI.parse(ascii_value), type: type, **params) end def self.parser(string) IRLReference::Parser.new(string) end end MAPPING['irl-reference'] = IRLReference class IRL < IRLReference def self.call(value, type = 'irl') super(value, type) end def self.parser(string) IRL::Parser.new(string) end end MAPPING['irl'] = IRL end end ruby-kdl-1.0.3/lib/kdl/types/irl/000077500000000000000000000000001444670406000165235ustar00rootroot00000000000000ruby-kdl-1.0.3/lib/kdl/types/irl/parser.rb000066400000000000000000000075461444670406000203600ustar00rootroot00000000000000module KDL module Types class IRLReference < Value class Parser RGX = /^(?:(?:([a-z][a-z0-9+.\-]+)):\/\/([^@]+@)?([^\/?#]+)?)?(\/?[^?#]*)?(?:\?([^#]*))?(?:#(.*))?$/i.freeze PERCENT_RGX = /%[a-f0-9]{2}/i.freeze RESERVED_URL_CHARS = %w[! # $ & ' ( ) * + , / : ; = ? @ \[ \] %] UNRESERVED_URL_CHARS = %w[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 - _ . ~].freeze URL_CHARS = RESERVED_URL_CHARS + UNRESERVED_URL_CHARS def initialize(string) @string = string end def parse scheme, auth, domain, path, search, hash = *parse_url if @string.ascii_only? unicode_path = Parser.decode(path) unicode_search = Parser.decode(search) unicode_hash = Parser.decode(hash) else unicode_path = path path = Parser.encode(unicode_path) unicode_search = search search_params = unicode_search ? unicode_search.split('&').map { |x| x.split('=') } : nil search = search_params ? search_params.map { |k, v| "#{Parser.encode(k)}=#{Parser.encode(v)}" }.join('&') : nil unicode_hash = hash hash = Parser.encode(hash) end if domain validator = IDNHostname::Validator.new(domain) domain = validator.ascii unicode_domain = validator.unicode else unicode_domain = domain end unicode_value = Parser.build_uri_string(scheme, auth, unicode_domain, unicode_path, unicode_search, unicode_hash) ascii_value = Parser.build_uri_string(scheme, auth, domain, path, search, hash) [ascii_value, { unicode_value: unicode_value, unicode_domain: unicode_domain, unicode_path: unicode_path, unicode_search: unicode_search, unicode_hash: unicode_hash }] end def parse_url match = RGX.match(@string) raise ArgumentError, "invalid IRL `#{@string}'" if match.nil? _, *parts = *match raise ArgumentError, "invalid IRL `#{@string}'" unless parts.all? { |part| Parser.valid_url_part?(part) } parts end def self.valid_url_part?(string) return true unless string string.chars.all? do |char| !char.ascii_only? || URL_CHARS.include?(char) end end def self.encode(string) return string unless string string.chars .map { |c| c.ascii_only? ? c : percent_encode(c) } .join .force_encoding('utf-8') end def self.decode(string) return string unless string string.gsub(PERCENT_RGX) do |match| char = match[1, 2].to_i(16).chr if RESERVED_URL_CHARS.include?(char) match else char end end.force_encoding('utf-8') end def self.percent_encode(c) c.bytes.map { |b| "%#{b.to_s(16)}" }.join.upcase end def self.build_uri_string(scheme, auth, domain, path, search, hash) string = '' string += "#{scheme}://" if scheme string += auth if auth string += domain if domain string += path if path string += "?#{search}" if search string += "##{hash}" if hash string end end end class IRL < IRLReference class Parser < IRLReference::Parser def parse_url parts = super scheme, * = parts raise ArgumentError, "invalid IRL `#{@string}'" if scheme.nil? || scheme.empty? parts end end end end end ruby-kdl-1.0.3/lib/kdl/types/regex.rb000066400000000000000000000004331444670406000173740ustar00rootroot00000000000000module KDL module Types class Regex < Value def self.call(value, type = 'regex') return nil unless value.is_a? ::KDL::Value::String regex = ::Regexp.new(value.value) new(regex, type: type) end end MAPPING['regex'] = Regex end end ruby-kdl-1.0.3/lib/kdl/types/url.rb000066400000000000000000000012111444670406000170570ustar00rootroot00000000000000module KDL module Types class URLReference < Value def self.call(value, type = 'url-reference') return nil unless value.is_a? ::KDL::Value::String uri = parse_url(value.value) new(uri, type: type) end def self.parse_url(string) URI.parse(string) end end MAPPING['url-reference'] = URLReference class URL < URLReference def self.call(value, type = 'url') super(value, type) end def self.parse_url(string) super.tap do |uri| raise 'invalid URL' if uri.scheme.nil? end end end MAPPING['url'] = URL end end ruby-kdl-1.0.3/lib/kdl/types/url_template.rb000066400000000000000000000175351444670406000207720ustar00rootroot00000000000000require 'uri' module KDL module Types class URLTemplate < Value UNRESERVED = /[a-zA-Z0-9\-._~]/.freeze RESERVED = %r{[:/?#\[\]@!$&'()*+,;=]}.freeze def self.call(value, type = 'url-template') return nil unless value.is_a? ::KDL::Value::String parts = Parser.parse(value.value) new(parts, type: type) end def expand(variables) result = value.map { |v| v.expand(variables) }.join parser = IRLReference::Parser.new(result) uri, * = parser.parse URI(uri) end class Parser def self.parse(string) new(string).parse end def initialize(string) @string = string @index = 0 end def parse result = [] until (token = next_token).nil? result << token end result end def next_token buffer = '' context = nil expansion_type = nil loop do c = @string[@index] case context when nil case c when '{' context = :expansion buffer = '' n = @string[@index + 1] expansion_type = case n when '+' then ReservedExpansion when '#' then FragmentExpansion when '.' then LabelExpansion when '/' then PathExpansion when ';' then ParameterExpansion when '?' then QueryExpansion when '&' then QueryContinuation else StringExpansion end @index += (expansion_type == StringExpansion ? 1 : 2) when nil then return nil else buffer = c @index += 1 context = :literal end when :literal case c when '{', nil then return StringLiteral.new(buffer) else buffer << c @index += 1 end when :expansion case c when '}' @index += 1 return parse_expansion(buffer, expansion_type) when nil raise ArgumentError, 'unterminated expansion' else buffer << c @index += 1 end end end end def parse_expansion(string, type) variables = string.split(',').map do |str| case str when /(.*)\*$/ Variable.new(Regexp.last_match(1), explode: true, allow_reserved: type.allow_reserved?, with_name: type.with_name?, keep_empties: type.keep_empties?) when /(.*):(\d+)/ Variable.new(Regexp.last_match(1), limit: Regexp.last_match(2).to_i, allow_reserved: type.allow_reserved?, with_name: type.with_name?, keep_empties: type.keep_empties?) else Variable.new(str, allow_reserved: type.allow_reserved?, with_name: type.with_name?, keep_empties: type.keep_empties?) end end type.new(variables) end end class Variable attr_reader :name def initialize(name, limit: nil, explode: false, allow_reserved: false, with_name: false, keep_empties: false) @name = name.to_sym @limit = limit @explode = explode @allow_reserved = allow_reserved @with_name = with_name @keep_empties = keep_empties end def expand(value) if @explode case value when Array value.map { |v| prefix(encode(v)) } when Hash value.map { |k, v| prefix(encode(v), k) } else [prefix(encode(value))] end elsif @limit [prefix(limit(value))].compact else [prefix(flatten(value))].compact end end def limit(string) return nil unless string encode(string[0, @limit]) end def flatten(value) case value when String encode(value) when Array, Hash result = value.to_a .flatten .compact .map { |v| encode(v) } result.empty? ? nil : result.join(',') end end def encode(string) return nil unless string string.to_s .chars .map do |c| if UNRESERVED.match?(c) || (@allow_reserved && RESERVED.match?(c)) c else IRLReference::Parser.percent_encode(c) end end .join .force_encoding('utf-8') end def prefix(string, override = nil) return nil unless string key = override || @name if @with_name || override if string.empty? && !@keep_empties encode(key) else "#{encode(key)}=#{string}" end else string end end end class Part def expand_variables(values) @variables.reduce([]) do |list, variable| expanded = variable.expand(values[variable.name]) expanded ? list + expanded : list end end def separator ',' end def prefix '' end def self.allow_reserved? false end def self.with_name? false end def self.keep_empties? false end end class StringLiteral < Part def initialize(value) super() @value = value end def expand(*) @value end end class StringExpansion < Part def initialize(variables) super() @variables = variables end def expand(values) expanded = expand_variables(values) return '' if expanded.empty? prefix + expanded.join(separator) end end class ReservedExpansion < StringExpansion def self.allow_reserved? true end end class FragmentExpansion < StringExpansion def prefix '#' end def self.allow_reserved? true end end class LabelExpansion < StringExpansion def prefix '.' end def separator '.' end end class PathExpansion < StringExpansion def prefix '/' end def separator '/' end end class ParameterExpansion < StringExpansion def prefix ';' end def separator ';' end def self.with_name? true end end class QueryExpansion < StringExpansion def prefix '?' end def separator '&' end def self.with_name? true end def self.keep_empties? true end end class QueryContinuation < QueryExpansion def prefix '&' end end end MAPPING['url-template'] = URLTemplate end end ruby-kdl-1.0.3/lib/kdl/types/uuid.rb000066400000000000000000000006661444670406000172400ustar00rootroot00000000000000module KDL module Types class UUID < Value RGX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ def self.call(value, type = 'uuid') return nil unless value.is_a? ::KDL::Value::String uuid = value.value.downcase raise ArgumentError, "`#{value.value}' is not a valid uuid" unless uuid =~ RGX new(uuid, type: type) end end MAPPING['uuid'] = UUID end end ruby-kdl-1.0.3/lib/kdl/value.rb000066400000000000000000000043331444670406000162350ustar00rootroot00000000000000module KDL class Value attr_reader :value, :format, :type def initialize(value, format: nil, type: nil) @value = value @format = format @type = type end def as_type(type, parser = nil) if parser.nil? self.class.new(value, format: format, type: type) else result = parser.call(self, type) return self.as_type(type) if result.nil? unless result.is_a?(::KDL::Value) raise ArgumentError, "expected parser to return an instance of ::KDL::Value, got `#{result.class}'" end result end end def to_s return stringify_value unless type "(#{StringDumper.stringify_identifier type})#{stringify_value}" end def stringify_value return format % value if format value.to_s end class Int < Value def ==(other) other.is_a?(Int) && value == other.value end end class Float < Value def ==(other) other.is_a?(Float) && value == other.value end def stringify_value return super.upcase unless value.is_a?(BigDecimal) sign, digits, _, exponent = value.split s = sign.negative? ? '-' : '' s += "#{digits[0]}.#{digits[1..-1]}" s += "E#{exponent.negative? ? '' : '+'}#{exponent - 1}" s end end class Boolean < Value def ==(other) other.is_a?(Boolean) && value == other.value end end class String < Value def stringify_value StringDumper.call(value) end def ==(other) other.is_a?(String) && value == other.value end end class NullImpl < Value def initialize(_=nil, format: nil, type: nil) super(nil, type: type) end def stringify_value "null" end def ==(other) other.is_a?(NullImpl) end end Null = NullImpl.new def self.from(value) case value when ::String then String.new(value) when Integer then Int.new(value) when ::Float then Float.new(value) when TrueClass, FalseClass then Boolean.new(value) when NilClass then Null else raise Error("Unsupported value type: #{value.class}") end end end end ruby-kdl-1.0.3/lib/kdl/version.rb000066400000000000000000000000431444670406000166000ustar00rootroot00000000000000module KDL VERSION = "1.0.3" end