local p = {}
--
-- to enable us to replicate the current functioning of CountryAbbr and CountryAbbr2
-- We need to deal with 
-- 1 alternative names ISO 3166 should do that
-- 2 {{<name>}}
-- 3 [ [<name>] ]
-- 4 [ [<name>|<junk>] ]
-- 5 [ [image:flag of <country>.[svg|gif|png|jpg]|\d+px] ]
--

function p.extractCountry(frame)
   local string= mw.ustring.toNFC (frame.args[1])
   local match=nil;
   match = mw.ustring.match(string, "Flag of ([^\.]*)")
   if (match) then 
      return match
   end 
-- () for Cocos (Keeling) Islands
-- ' For  People's 
-- . for U.S. etc.
   match = mw.ustring.match(string, "(%u[%a\(\)\.' -]+)")
   if (match == "Image") then
       string = mw.ustring.gsub(string, match, "")
       match = mw.ustring.match(string, "[\|\[](%u[%a\(\)\.' -]+)")
   end
   if (match == "20px") then
       string = mw.ustring.gsub(string, match, "")
       match = mw.ustring.match(string, "\[(%u[%a\(\)\.' -]+)")
   end 
   if (match) then 
      return match
   end
   return  string
end

--[[ 


]]

function p.extractSubdivision(frame)
   local string= mw.ustring.toNFC (frame.args[1])
   local match=nil;
-- Needed for {{flag|Greenland}},
   match = mw.ustring.match(string, "Flag of ([^\.]*)")
   if (match) then 
      return match
   end 
-- . needed for Washington D.C. 
-- ' for cote d'azur
-- leading ' for 'Aden
-- ‘ and trailing ' for Şan‘ā'
   match = mw.ustring.match(string, "('?[%u][%a'‘ \.\,-]+[%a\.'\d]+)")
   if (match) then 
      return match
   end
   return  string
end

local countries = {
	["Andorra"] = "AD",
	["United Arab Emirates"] = "AE",
	["UAE"] = "AE",
	["Afghanistan"] = "AF",
	["Antigua and Barbuda"] = "AG",
	["Anguilla"] = "AI",
	["Albania"] = "AL",
	["Armenia"] = "AM",
	["Angola"] = "AO",
	["Antarctica"] = "AQ",
	["Argentina"] = "AR",
	["American Samoa"] = "AS",
	["Austria"] = "AT",
	["Australia"] = "AU",
	["Aruba"] = "AW",
	["Åland Islands"] = "AX",
	["Aland Islands"] = "AX",
	["Azerbaijan"] = "AZ",
	["Nagorno-Karabakh"] = "AZ", -- disputed
	["Nagorno-Karabakh Republic"] = "AZ", -- disputed
	["Bosnia and Herzegovina"] = "BA",
	["Bosnia"] = "BA",
	["Barbados"] = "BB",
	["Bangladesh"] = "BD",
	["Belgium"] = "BE",
	["Burkina Faso"] = "BF",
	["Bulgaria"] = "BG",
	["Bahrain"] = "BH",
	["Burundi"] = "BI",
	["Benin"] = "BJ",
	["Saint Barthélemy"] = "BL",
	["Saint Barthelemy"] = "BL",
	["St. Barthélemy"] = "BL",
	["St. Barthelemy"] = "BL",
	["St Barthélemy"] = "BL",
	["St Barthelemy"] = "BL",
	["Bermuda"] = "BM",
	["Brunei"] = "BN",
	["Brunei Darussalam"] = "BN",
	["Bolivia"] = "BO",
	["Bolivia, Plurinational State of"] = "BO",
	["Bonaire, Sint Eustatius and Saba"] = "BQ",
	["Brazil"] = "BR",
	["Bahamas"] = "BS",
	["The Bahamas"] = "BS",
	["the Bahamas"] = "BS",
	["Bhutan"] = "BT",
	["Bouvet Island"] = "BV",
	["Botswana"] = "BW",
	["Belarus"] = "BY",
	["Belize"] = "BZ",
	["Canada"] = "CA",
	["Cocos (Keeling) Islands"] = "CC",
	["Cocos Islands"] = "CC",
	["Keeling Islands"] = "CC",
	["Congo, the Democratic Republic of the"] = "CD",
	["Democratic Republic of the Congo"] = "CD",
	["DR Congo"] = "CD",
	["Congo-Kinshasa"] = "CD",
	["DROC"] = "CD",
	["DRC"] = "CD",
	["Central African Republic"] = "CF",
	["CAR"] = "CF",
	["Congo"] = "CG",
	["Republic of the Congo"] = "CG",
	["Congo Republic"] = "CG",
	["Congo-Brazzaville"] = "CG",
	["West Congo"] = "CG",
	["Switzerland"] = "CH",
	["Côte d'Ivoire"] = "CI",
	["Ivory Coast"] = "CI",
	["Cook Islands"] = "CK",
	["Chile"] = "CL",
	["Cameroon"] = "CM",
	["China"] = "CN",
	["PRC"] = "CN",
	["People's Republic of China"] = "CN",
	["Colombia"] = "CO",
	["Costa Rica"] = "CR",
	["Cuba"] = "CU",
	["Cape Verde"] = "CV",
	["Curaçao"] = "CW",
	["Curacao"] = "CW",
	["Christmas Island"] = "CX",
	["Cyprus"] = "CY",
	["Republic of Cyprus"] = "CY",
	["Northern Cyprus"] = "CY", -- disputed
	["Turkish Republic of Northern Cyprus"] = "CY", -- disputed
	["Czech Republic"] = "CZ",
	["Germany"] = "DE",
	["Djibouti"] = "DJ",
	["Denmark"] = "DK",
	["Dominica"] = "DM",
	["Dominican Republic"] = "DO",
	["Algeria"] = "DZ",
	["Ecuador"] = "EC",
	["Estonia"] = "EE",
	["Egypt"] = "EG",
	["Western Sahara"] = "EH",
	["Eritrea"] = "ER",
	["Spain"] = "ES",
	["Ethiopia"] = "ET",
	["Finland"] = "FI",
	["Fiji"] = "FJ",
	["Falkland Islands (Malvinas)"] = "FK",
	["Falklands"] = "FK",
	["Falkland Islands"] = "FK",
	["Malvinas"] = "FK",
	["Malvinas Islands"] = "FK",
	["Micronesia, Federated States of"] = "FM",
	["Micronesia"] = "FM",
	["Faroe Islands"] = "FO",
	["France"] = "FR",
	["Gabon"] = "GA",
	["United Kingdom"] = "GB",
	["the United Kingdom"] = "GB",
	["U. K."] = "GB",
	["U.K."] = "GB",
	["the U.K."] = "GB",
	["UK"] = "GB",
	["the UK"] = "GB",
	["Great Britain"] = "GB",
	["England"] = "GB-ENG",
	["Scotland"] = "GB-SCT",
	["Wales"] = "GB-WLS",
	["Northern Ireland"] = "GB-NIR",
	["England and Wales"] = "GB-EAW",
	["Grenada"] = "GD",
	["Georgia"] = "GE",
	["South Ossetia"] = "GE", -- disputed
	["Tskhinvali Region"] = "GE", -- disputed
	["Abkhazia"] = "GE-AB", -- disputed
	["Republic of Abkhazia"] = "GE-AB", -- disputed
	["French Guiana"] = "GF",
	["Guernsey"] = "GG",
	["Ghana"] = "GH",
	["Gibraltar"] = "GI",
	["Greenland"] = "GL",
	["Gambia"] = "GM",
	["Guinea"] = "GN",
	["Guadeloupe"] = "GP",
	["Equatorial Guinea"] = "GQ",
	["Greece"] = "GR",
	["South Georgia and the South Sandwich Islands"] = "GS",
	["Guatemala"] = "GT",
	["Guam"] = "GU",
	["Guinea-Bissau"] = "GW",
	["Guyana"] = "GY",
	["Hong Kong"] = "HK",
	["Heard Island and McDonald Islands"] = "HM",
	["Heard and McDonald Islands"] = "HM",
	["Honduras"] = "HN",
	["Croatia"] = "HR",
	["Haiti"] = "HT",
	["Hungary"] = "HU",
	["Indonesia"] = "ID",
	["Ireland"] = "IE",
	["Israel"] = "IL",
	["Isle of Man"] = "IM",
	["India"] = "IN",
	["British Indian Ocean Territory"] = "IO",
	["Iraq"] = "IQ",
	["Iran, Islamic Republic of"] = "IR",
	["Iran"] = "IR",
	["Iceland"] = "IS",
	["Italy"] = "IT",
	["Jersey"] = "JE",
	["Jamaica"] = "JM",
	["Jordan"] = "JO",
	["Japan"] = "JP",
	["Kenya"] = "KE",
	["Kyrgyzstan"] = "KG",
	["Cambodia"] = "KH",
	["Kiribati"] = "KI",
	["Comoros"] = "KM",
	["The Comoros"] = "KM",
	["the Comoros"] = "KM",
	["Saint Kitts and Nevis"] = "KN",
	["St. Kitts and Nevis"] = "KN",
	["St Kitts and Nevis"] = "KN",
	["Korea, Democratic People's Republic of"] = "KP",
	["Democratic People's Republic of Korea"] = "KP",
	["North Korea"] = "KP",
	["Korea, Republic of"] = "KR",
	["Republic of Korea"] = "KR",
	["South Korea"] = "KR",
	["Kuwait"] = "KW",
	["Cayman Islands"] = "KY",
	["The Cayman Islands"] = "KY",
	["the Cayman Islands"] = "KY",
	["Kazakhstan"] = "KZ",
	["Lao People's Democratic Republic"] = "LA",
	["Laos"] = "LA",
	["Lao"] = "LA",
	["Lebanon"] = "LB",
	["Saint Lucia"] = "LC",
	["St. Lucia"] = "LC",
	["St Lucia"] = "LC",
	["Liechtenstein"] = "LI",
	["Sri Lanka"] = "LK",
	["Liberia"] = "LR",
	["Lesotho"] = "LS",
	["Lithuania"] = "LT",
	["Luxembourg"] = "LU",
	["Latvia"] = "LV",
	["Libyan Arab Jamahiriya"] = "LY",
	["Libya"] = "LY",
	["Morocco"] = "MA",
	["Monaco"] = "MC",
	["Moldova, Republic of"] = "MD",
	["Moldova"] = "MD",
	["Transnistria"] = "MD", -- disputed
	["Montenegro"] = "ME",
	["Saint Martin (French part)"] = "MF",
	["Saint Martin (France)"] = "MF",
	["Collectivity of Saint Martin"] = "MF",
	["Collectivity of St. Martin"] = "MF",
	["Collectivity of St Martin"] = "MF",
	["Saint-Martin"] = "MF",
	["Madagascar"] = "MG",
	["Marshall Islands"] = "MH",
	["Macedonia"] = "MK",
	["Mali"] = "ML",
	["Myanmar"] = "MM",
	["Burma"] = "MM",
	["Mongolia"] = "MN",
	["Macau"] = "MO",
	["Macao"] = "MO",
	["Northern Mariana Islands"] = "MP",
	["Martinique"] = "MQ",
	["Mauritania"] = "MR",
	["Montserrat"] = "MS",
	["Malta"] = "MT",
	["Mauritius"] = "MU",
	["Maldives"] = "MV",
	["Malawi"] = "MW",
	["Mexico"] = "MX",
	["Malaysia"] = "MY",
	["Mozambique"] = "MZ",
	["Namibia"] = "NA",
	["New Caledonia"] = "NC",
	["Niger"] = "NE",
	["Norfolk Island"] = "NF",
	["Nigeria"] = "NG",
	["Nicaragua"] = "NI",
	["Netherlands"] = "NL",
	["The Netherlands"] = "NL",
	["the Netherlands"] = "NL",
	["Norway"] = "NO",
	["Nepal"] = "NP",
	["Nauru"] = "NR",
	["Niue"] = "NU",
	["New Zealand"] = "NZ",
	["Aotearoa"] = "NZ",
	["Oman"] = "OM",
	["Panama"] = "PA",
	["Peru"] = "PE",
	["French Polynesia"] = "PF",
	["Papua New Guinea"] = "PG",
	["Philippines"] = "PH",
	["The Philippines"] = "PH",
	["the Philippines"] = "PH",
	["Pakistan"] = "PK",
	["Poland"] = "PL",
	["Saint Pierre and Miquelon"] = "PM",
	["St. Pierre and Miquelon"] = "PM",
	["St Pierre and Miquelon"] = "PM",
	["Pitcairn"] = "PN",
	["Puerto Rico"] = "PR",
	["State of Palestine"] = "PS",
	["Palestine"] = "PS",
	["Portugal"] = "PT",
	["Palau"] = "PW",
	["Paraguay"] = "PY",
	["Qatar"] = "QA",
	["Réunion"] = "RE",
	["Reunion"] = "RE",
	["Romania"] = "RO",
	["Serbia"] = "RS",
	["Kosovo"] = "RS", -- disputed
	["Russian Federation"] = "RU",
	["Russia"] = "RU",
	["Rwanda"] = "RW",
	["Saudi Arabia"] = "SA",
	["Solomon Islands"] = "SB",
	["Seychelles"] = "SC",
	["Sudan"] = "SD",
	["Sweden"] = "SE",
	["Singapore"] = "SG",
	["Saint Helena, Ascension and Tristan da Cunha"] = "SH",
	["Slovenia"] = "SI",
	["Svalbard and Jan Mayen"] = "SJ",
	["Slovakia"] = "SK",
	["Sierra Leone"] = "SL",
	["San Marino"] = "SM",
	["Senegal"] = "SN",
	["Somalia"] = "SO",
	["Somaliland"] = "SO", -- disputed
	["Suriname"] = "SR",
	["South Sudan"] = "SS",
	["São Tomé and Príncipe"] = "ST",
	["Sao Tome and Principe"] = "ST",
	["El Salvador"] = "SV",
	["Sint Maarten"] = "SX",
	["Saint Martin (Dutch part)"] = "SX",
	["Saint Martin (Netherlands)"] = "SX",
	["Syrian Arab Republic"] = "SY",
	["Syria"] = "SY",
	["Swaziland"] = "SZ",
	["Turks and Caicos Islands"] = "TC",
	["Chad"] = "TD",
	["French Southern Territories"] = "TF",
	["Togo"] = "TG",
	["Thailand"] = "TH",
	["Tajikistan"] = "TJ",
	["Tokelau"] = "TK",
	["Timor-Leste"] = "TL",
	["East Timor"] = "TL",
	["Turkmenistan"] = "TM",
	["Tunisia"] = "TN",
	["Tonga"] = "TO",
	["Turkey"] = "TR",
	["Trinidad and Tobago"] = "TT",
	["Tuvalu"] = "TV",
	["Taiwan"] = "TW",
	["Republic of China"] = "TW",
	["Tanzania, United Republic of"] = "TZ",
	["Tanzania"] = "TZ",
	["Ukraine"] = "UA",
	["The Ukraine"] = "UA",
	["the Ukraine"] = "UA",
	["Uganda"] = "UG",
	["United States Minor Outlying Islands"] = "UM",
	["United States"] = "US",
	["the United States"] = "US",
	["United States of America"] = "US",
	["the United States of America"] = "US",
	["U. S."] = "US",
	["U.S."] = "US",
	["the U.S."] = "US",
	["US"] = "US",
	["the US"] = "US",
	["Uruguay"] = "UY",
	["Uzbekistan"] = "UZ",
	["Holy See (Vatican City State)"] = "VA",
	["Holy See"] = "VA",
	["Vatican City State"] = "VA",
	["Vatican City"] = "VA",
	["Saint Vincent and the Grenadines"] = "VC",
	["St. Vincent and the Grenadines"] = "VC",
	["St Vincent and the Grenadines"] = "VC",
	["Venezuela, Bolivarian Republic of"] = "VE",
	["Venezuela"] = "VE",
	["Virgin Islands, British"] = "VG",
	["British Virgin Islands"] = "VG",
	["UK Virgin Islands"] = "VG",
	["Virgin Islands of the United Kingdom"] = "VG",
	["Virgin Islands of the UK"] = "VG",
	["Virgin Islands, U. S."] = "VI",
	["Virgin Islands, U.S."] = "VI",
	["Virgin Islands, US"] = "VI",
	["United States Virgin Islands"] = "VI",
	["American Virgin Islands"] = "VI",
	["U. S. Virgin Islands"] = "VI",
	["U.S. Virgin Islands"] = "VI",
	["US Virgin Islands"] = "VI",
	["Virgin Islands of the United States"] = "VI",
	["Virgin Islands of the U.S."] = "VI",
	["Virgin Islands of the US"] = "VI",
	["Vietnam"] = "VN",
	["Viet Nam"] = "VN",
	["Vanuatu"] = "VU",
	["Wallis and Futuna"] = "WF",
	["Samoa"] = "WS",
	["Yemen"] = "YE",
	["Mayotte"] = "YT",
	["South Africa"] = "ZA",
	["Zambia"] = "ZM",
	["Zimbabwe"] = "ZW",
	["ABW"] = "AW",
  	["AFG"] = "AF",
  	["AGO"] = "AO",
  	["AIA"] = "AI",
  	["ALA"] = "AX",
  	["ALB"] = "AL",
  	["AND"] = "AD",
  	["ARE"] = "AE",
  	["ARG"] = "AR",
  	["ARM"] = "AM",
  	["ASM"] = "AS",
  	["ATA"] = "AQ",
  	["ATF"] = "TF",
  	["ATG"] = "AG",
  	["AUS"] = "AU",
  	["AUT"] = "AT",
  	["AZE"] = "AZ",
  	["BDI"] = "BI",
  	["BEL"] = "BE",
  	["BEN"] = "BJ",
  	["BFA"] = "BF",
  	["BGD"] = "BD",
  	["BGR"] = "BG",
  	["BHR"] = "BH",
  	["BHS"] = "BS",
  	["BIH"] = "BA",
  	["BLM"] = "BL",
  	["BLR"] = "BY",
  	["BLZ"] = "BZ",
  	["BMU"] = "BM",
  	["BOL"] = "BO",
  	["BRA"] = "BR",
  	["BRB"] = "BB",
  	["BRN"] = "BN",
  	["BTN"] = "BT",
  	["BVT"] = "BV",
  	["BWA"] = "BW",
  	["CAF"] = "CF",
  	["CAN"] = "CA",
  	["CCK"] = "CC",
  	["CHE"] = "CH",
  	["CHL"] = "CL",
  	["CHN"] = "CN",
  	["CIV"] = "CI",
  	["CMR"] = "CM",
  	["COD"] = "CG",
  	["COG"] = "CG",
  	["COK"] = "CK",
  	["COL"] = "CO",
  	["COM"] = "KM",
  	["CRI"] = "CR",
  	["CUB"] = "CU",
  	["CUW"] = "CW",
  	["CXR"] = "CX",
  	["CYM"] = "KY",
  	["CYP"] = "CY",
  	["CZE"] = "CZ",
  	["DEU"] = "DE",
  	["DJI"] = "DJ",
  	["DMA"] = "DM",
  	["DNK"] = "DK",
  	["DOM"] = "DO",
  	["DZA"] = "DZ",
  	["ECU"] = "EC",
  	["EGY"] = "EG",
  	["ERI"] = "ER",
  	["ESH"] = "EH",
  	["ESP"] = "ES",
  	["EST"] = "EE",
  	["ETH"] = "ET",
  	["FIN"] = "FI",
  	["FJI"] = "FJ",
  	["FLK"] = "FK",
  	["FRA"] = "FR",
  	["FRO"] = "FO",
  	["FSM"] = "FM",
  	["GAB"] = "GA",
  	["GBR"] = "GB",
  	["GEO"] = "GE",
  	["GGY"] = "GG",
  	["GHA"] = "GH",
  	["GIB"] = "GI",
  	["GIN"] = "GN",
  	["GLP"] = "GP",
  	["GMB"] = "GM",
  	["GNB"] = "GW",
  	["GNQ"] = "GQ",
  	["GRC"] = "GR",
  	["GRD"] = "GD",
  	["GRL"] = "GL",
  	["GTM"] = "GT",
  	["GUF"] = "GF",
  	["GUM"] = "GU",
  	["GUY"] = "GY",
  	["HKG"] = "HK",
  	["HMD"] = "HM",
  	["HND"] = "HN",
  	["HRV"] = "HR",
  	["HTI"] = "HT",
  	["HUN"] = "HU",
  	["IDN"] = "ID",
  	["IMN"] = "IM",
  	["IND"] = "IN",
  	["IOT"] = "IO",
  	["IRL"] = "IE",
  	["IRN"] = "IR",
  	["IRQ"] = "IQ",
  	["ISL"] = "IS",
  	["ISR"] = "IL",
  	["ITA"] = "IT",
  	["JAM"] = "JM",
  	["JEY"] = "JE",
  	["JOR"] = "JO",
  	["JPN"] = "JP",
  	["KAZ"] = "KZ",
  	["KEN"] = "KE",
  	["KGZ"] = "KG",
  	["KHM"] = "KH",
  	["KIR"] = "KI",
  	["KNA"] = "KN",
  	["KWT"] = "KW",
  	["LAO"] = "LA",
  	["LBN"] = "LB",
  	["LBR"] = "LR",
  	["LBY"] = "LY",
  	["LCA"] = "LC",
  	["LIE"] = "LI",
  	["LKA"] = "LK",
  	["LSO"] = "LS",
  	["LTU"] = "LT",
  	["LUX"] = "LU",
  	["LVA"] = "LV",
  	["MAC"] = "MO",
  	["MAF"] = "MF",
  	["MAR"] = "MA",
  	["MCO"] = "MC",
  	["MDA"] = "MD",
  	["MDG"] = "MG",
  	["MDV"] = "MV",
  	["MEX"] = "MX",
  	["MHL"] = "MH",
  	["MKD"] = "MK",
  	["MLI"] = "ML",
  	["MLT"] = "MT",
  	["MMR"] = "MM",
  	["MNE"] = "ME",
  	["MNG"] = "MN",
  	["MNP"] = "MP",
  	["MOZ"] = "MZ",
  	["MRT"] = "MR",
  	["MSR"] = "MS",
  	["MTQ"] = "MQ",
  	["MUS"] = "MU",
  	["MWI"] = "MW",
  	["MYS"] = "MY",
  	["MYT"] = "YT",
  	["NAM"] = "NA",
  	["NCL"] = "NC",
  	["NER"] = "NE",
  	["NFK"] = "NF",
  	["NGA"] = "NG",
  	["NIC"] = "NI",
  	["NIU"] = "NU",
  	["NLD"] = "NL",
  	["NOR"] = "NO",
  	["NPL"] = "NP",
  	["NRU"] = "NR",
  	["NZL"] = "NZ",
  	["OMN"] = "OM",
  	["PAK"] = "PK",
  	["PAN"] = "PA",
  	["PCN"] = "PN",
  	["PER"] = "PE",
  	["PHL"] = "PH",
  	["PLW"] = "PW",
  	["PNG"] = "PG",
  	["POL"] = "PL",
  	["PRI"] = "PR",
  	["PRT"] = "PT",
  	["PRY"] = "PY",
  	["PSE"] = "PS",
  	["PYF"] = "PF",
  	["QAT"] = "QA",
  	["REU"] = "RE",
  	["ROU"] = "RO",
  	["RUS"] = "RU",
  	["RWA"] = "RW",
  	["SAU"] = "SA",
  	["SDN"] = "SD",
  	["SEN"] = "SN",
  	["SGP"] = "SG",
  	["SGS"] = "GS",
  	["SJM"] = "SJ",
  	["SLB"] = "SB",
  	["SLE"] = "SL",
  	["SLV"] = "SV",
  	["SMR"] = "SM",
  	["SOM"] = "SO",
  	["SPM"] = "PM",
  	["SRB"] = "RS",
  	["SSD"] = "SS",
  	["STP"] = "ST",
  	["SUR"] = "SR",
  	["SVK"] = "SK",
  	["SVN"] = "SI",
  	["SWE"] = "SE",
  	["SWZ"] = "SZ",
  	["SXM"] = "SX",
  	["SYC"] = "SC",
  	["SYR"] = "SY",
  	["TCA"] = "TC",
  	["TCD"] = "TD",
  	["TGO"] = "TG",
  	["THA"] = "TH",
  	["TJK"] = "TJ",
  	["TKL"] = "TK",
  	["TKM"] = "TM",
  	["TLS"] = "TL",
  	["TON"] = "TO",
  	["TTO"] = "TT",
  	["TUN"] = "TN",
  	["TUR"] = "TR",
  	["TUV"] = "TV",
  	["TWN"] = "TW",
  	["TZA"] = "TZ",
  	["UGA"] = "UG",
  	["UKR"] = "UA",
  	["UMI"] = "UM",
  	["URY"] = "UY",
  	["USA"] = "US",
  	["UZB"] = "UZ",
  	["VAT"] = "VA",
  	["VCT"] = "VC",
  	["VEN"] = "VE",
  	["VNM"] = "VN",
  	["VUT"] = "VU",
  	["WLF"] = "WF",
  	["WSM"] = "WS",
  	["YEM"] = "YE",
  	["ZAF"] = "ZA",
  	["ZMB"] = "ZM",
  	["ZWE"] = "ZW"
	}

function p.main(frame)
	local country = mw.ustring.gsub(mw.ustring.toNFC(frame.args[1] or ''), '^%s*(.-)%s*$', '%1')
	local match1 = ''
	if country and country ~= '' then
		match1 = mw.ustring.match(country, "Flag of the ([^\.]*)") or mw.ustring.match(country, "Flag of ([^\.]*)") or mw.ustring.match(country, "^[Tt]he %A*(%u[%a%(%)%.' %-]+)") or mw.ustring.match(country, "(%u[%a%(%)%.' %-]+)") or ""
		if (match1 == "Image") or (match1 == "File") then
			country = mw.ustring.gsub(country, match1, "")
			match1 = mw.ustring.match(country, "[%|%[](%u[%a%(%)%.' %-]+)") or ""
		end
		if mw.ustring.match(match1, "^%d*x?%d+px$") then
			country = mw.ustring.gsub(country, match1, "")
			match1 = mw.ustring.match(country, "%[(%u[%a%(%)%.' %-]+)") or ""
		end
	end
	local code = countries[match1] or countries[mw.ustring.gsub(match1, " %(.*%)$", "")] or countries[mw.ustring.gsub(match1, ",.*$", "")] or countries[mw.ustring.gsub(match1, " %(.*$", "")]
	if not code then
		if match1 ~= '' and mw.title.new('Template:ISO 3166 code ' .. match1).exists then
			code = frame:expandTemplate{ title = 'Template:ISO 3166 code ' .. match1 }
		else
			if frame.args.nocat and frame.args.nocat == 'true' then
				return ''
			end
			local ns = mw.title.getCurrentTitle().namespace
			if ns == 0 then
				return '[[ವರ್ಗ:Wikipedia page with obscure country]]'
			else
				return '[[ವರ್ಗ:Wikipedia page with obscure country|'.. frame:expandTemplate{ title = 'Namespace Greek' } ..']]'
			end
		end
	end
	local subdivision = mw.ustring.gsub(mw.ustring.toNFC(frame.args[2] or ''), '^%s*(.-)%s*$', '%1')
	if not subdivision or subdivision == '' then return code end
	local countrytables = {
		["AD"] = true,
		["AE"] = true,
		["AF"] = true,
		["AG"] = true,
		["AL"] = true,
		["AM"] = true,
		["AO"] = true,
		["AR"] = true,
		["AT"] = true,
		["AU"] = true,
		["AZ"] = true,
		["BA"] = true,
		["BB"] = true,
		["BD"] = true,
		["BE"] = true,
		["BF"] = true,
		["BG"] = true,
		["BH"] = true,
		["BI"] = true,
		["BJ"] = true,
		["BN"] = true,
		["BO"] = true,
		["BQ"] = true,
		["BR"] = true,
		["BS"] = true,
		["BT"] = true,
		["BW"] = true,
		["BY"] = true,
		["BZ"] = true,
		["CA"] = true,
		["CD"] = true,
		["CF"] = true,
		["CG"] = true,
		["CH"] = true,
		["CI"] = true,
		["CL"] = true,
		["CM"] = true,
		["CN"] = true,
		["CO"] = true,
		["CR"] = true,
		["CU"] = true,
		["CV"] = true,
		["CY"] = true,
		["CZ"] = true,
		["DE"] = true,
		["DJ"] = true,
		["DK"] = true,
		["DM"] = true,
		["DO"] = true,
		["DZ"] = true,
		["EC"] = true,
		["EE"] = true,
		["EG"] = true,
		["ER"] = true,
		["ES"] = true,
		["ET"] = true,
		["FI"] = true,
		["FJ"] = true,
		["FM"] = true,
		["FR"] = true,
		["GA"] = true,
		["GB"] = true,
		["GD"] = true,
		["GE"] = true,
		["GH"] = true,
		["GL"] = true,
		["GM"] = true,
		["GN"] = true,
		["GQ"] = true,
		["GR"] = true,
		["GT"] = true,
		["GW"] = true,
		["GY"] = true,
		["HN"] = true,
		["HR"] = true,
		["HT"] = true,
		["HU"] = true,
		["ID"] = true,
		["IE"] = true,
		["IL"] = true,
		["IN"] = true,
		["IQ"] = true,
		["IR"] = true,
		["IS"] = true,
		["IT"] = true,
		["JM"] = true,
		["JO"] = true,
		["JP"] = true,
		["KE"] = true,
		["KG"] = true,
		["KH"] = true,
		["KI"] = true,
		["KM"] = true,
		["KN"] = true,
		["KP"] = true,
		["KR"] = true,
		["KW"] = true,
		["KZ"] = true,
		["LA"] = true,
		["LB"] = true,
		["LC"] = true,
		["LI"] = true,
		["LK"] = true,
		["LR"] = true,
		["LS"] = true,
		["LT"] = true,
		["LU"] = true,
		["LV"] = true,
		["LY"] = true,
		["MA"] = true,
		["MC"] = true,
		["MD"] = true,
		["ME"] = true,
		["MG"] = true,
		["MH"] = true,
		["MK"] = true,
		["ML"] = true,
		["MM"] = true,
		["MN"] = true,
		["MR"] = true,
		["MT"] = true,
		["MU"] = true,
		["MV"] = true,
		["MW"] = true,
		["MX"] = true,
		["MY"] = true,
		["MZ"] = true,
		["NA"] = true,
		["NE"] = true,
		["NG"] = true,
		["NI"] = true,
		["NL"] = true,
		["NO"] = true,
		["NP"] = true,
		["NR"] = true,
		["NZ"] = true,
		["OM"] = true,
		["PA"] = true,
		["PE"] = true,
		["PG"] = true,
		["PH"] = true,
		["PK"] = true,
		["PL"] = true,
		["PS"] = true,
		["PT"] = true,
		["PW"] = true,
		["PY"] = true,
		["QA"] = true,
		["RO"] = true,
		["RS"] = true,
		["RU"] = true,
		["RW"] = true,
		["SA"] = true,
		["SB"] = true,
		["SC"] = true,
		["SD"] = true,
		["SE"] = true,
		["SG"] = true,
		["SH"] = true,
		["SI"] = true,
		["SK"] = true,
		["SL"] = true,
		["SM"] = true,
		["SN"] = true,
		["SO"] = true,
		["SR"] = true,
		["SS"] = true,
		["ST"] = true,
		["SV"] = true,
		["SY"] = true,
		["SZ"] = true,
		["TD"] = true,
		["TG"] = true,
		["TH"] = true,
		["TJ"] = true,
		["TL"] = true,
		["TM"] = true,
		["TN"] = true,
		["TO"] = true,
		["TR"] = true,
		["TT"] = true,
		["TV"] = true,
		["TW"] = true,
		["TZ"] = true,
		["UA"] = true,
		["UG"] = true,
		["UM"] = true,
		["US"] = true,
		["UY"] = true,
		["UZ"] = true,
		["VC"] = true,
		["VE"] = true,
		["VN"] = true,
		["VU"] = true,
		["WF"] = true,
		["WS"] = true,
		["YE"] = true,
		["ZA"] = true,
		["ZM"] = true,
		["ZW"] = true,
		}
	local match2 = mw.ustring.match(subdivision, "Flag of the ([^\.]*)") or mw.ustring.match(subdivision, "Flag of ([^\.]*)") or mw.ustring.match(subdivision, "[Tt]he %A*([ǁ'‘ʻ]?%u[%aZ̧z̄'‘‘ %.%,%-]+[%a%.'%d]+)") or mw.ustring.match(subdivision, "([ǁ'‘ʻ]?%u[%aZ̧z̄'‘‘ %.%,%-]+[%a%.'%d]+)") or ""
	if (match2 == "Image") or (match2 == "File") then
		subdivision = mw.ustring.gsub(subdivision, match2, "")
		match2 = mw.ustring.match(subdivision, "[\|\[]([ǁ'‘ʻ]?%u[%aZ̧z̄'‘ʻ %.%,%-]+[%a%.'%d]+)") or ""
	end
	if mw.ustring.match(match2, "^%d*x?%d+px$") then
		subdivision = mw.ustring.gsub(subdivision, match2, "")
		match2 = mw.ustring.match2(subdivision, "%[([ǁ'‘ʻ]?%u[%aZ̧z̄'‘ʻ %.%,%-]+[%a%.'%d]+)") or ""
	end
	local code1 = mw.ustring.sub(code, 1, 2)
	if countrytables[code1] then
		local tmp = mw.loadData('Module:Country extract/' .. code1)
		local code2 = tmp[match2] or tmp[mw.ustring.gsub(match2, " %(.*%)$", "")] or tmp[mw.ustring.gsub(match2, ",.*$", "")] or tmp[mw.ustring.gsub(match2, " %(.*$", "")]
		if code2 then return code2 end
		
		local legacytemplate = 'Template:ISO 3166 code ' .. match1
		if mw.title.new(legacytemplate).exists then
			tmp = nil
			for k, v in ipairs({
				frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, " %(.*%)$", "") } },
				frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, ",.*$", "") } },
				frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, " %(.*$", "") } },
				frame:expandTemplate{ title = legacytemplate, args = { match2 } }
			}) do
				if v ~= code and v ~= '' then
					tmp = v
					break
				end
			end
			if tmp then return tmp end
		end
		if frame.args.nocat and frame.args.nocat == 'true' then
			return code
		end
		local ns = mw.title.getCurrentTitle().namespace
		if ns == 0 then
			return code .. '[[ವರ್ಗ:Wikipedia page with obscure country or subdivision]]'
		else
			return code .. '[[ವರ್ಗ:Wikipedia page with obscure country or subdivision|'.. frame:expandTemplate{ title = 'Namespace Greek' } ..']]'
		end
	end
	return code
end

return p