/*
 * Copyright 2012 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.i18n.client.impl.cldr;

import com.google.gwt.core.client.JavaScriptObject;

// DO NOT EDIT - GENERATED FROM CLDR DATA

/**
 * Localized names for the "sr_Cyrl_BA" locale.
 */
public class LocalizedNamesImpl_sr_Cyrl_BA extends LocalizedNamesImpl_sr {

  @Override
  public String[] loadSortedRegionCodes() {
    return new String[] {
        "XA",
        "XB",
        "AF",
        "AZ",
        "AL",
        "DZ",
        "VI",
        "AS",
        "AI",
        "AO",
        "AD",
        "AQ",
        "AG",
        "AR",
        "AW",
        "AU",
        "AT",
        "BD",
        "BB",
        "BS",
        "BH",
        "BE",
        "BZ",
        "BJ",
        "BM",
        "BY",
        "CX",
        "BO",
        "BA",
        "BW",
        "BR",
        "VG",
        "IO",
        "BN",
        "BG",
        "BF",
        "BI",
        "BT",
        "WF",
        "VU",
        "VA",
        "VE",
        "VN",
        "GA",
        "GM",
        "GH",
        "GP",
        "GY",
        "GT",
        "GN",
        "GW",
        "GG",
        "GI",
        "GD",
        "GL",
        "GE",
        "GR",
        "GU",
        "DK",
        "DG",
        "DM",
        "DO",
        "EZ",
        "EU",
        "EG",
        "EC",
        "GQ",
        "ER",
        "EE",
        "ET",
        "ZM",
        "EH",
        "ZW",
        "IL",
        "IN",
        "ID",
        "IQ",
        "IR",
        "IE",
        "IS",
        "IT",
        "JM",
        "JP",
        "YE",
        "AM",
        "JO",
        "KR",
        "GS",
        "SS",
        "ZA",
        "CV",
        "KZ",
        "KY",
        "KH",
        "CM",
        "CA",
        "IC",
        "BQ",
        "QA",
        "KE",
        "CN",
        "CY",
        "KG",
        "KI",
        "CC",
        "CO",
        "KM",
        "CG",
        "CD",
        "XK",
        "CR",
        "CU",
        "KW",
        "CK",
        "CW",
        "LA",
        "LS",
        "LV",
        "LB",
        "LR",
        "LY",
        "LT",
        "LI",
        "LU",
        "MG",
        "HU",
        "YT",
        "MK",
        "MW",
        "MV",
        "MY",
        "ML",
        "MT",
        "UM",
        "MA",
        "MQ",
        "MH",
        "MR",
        "MU",
        "MX",
        "MM",
        "FM",
        "MZ",
        "MD",
        "MC",
        "MN",
        "MS",
        "NA",
        "NR",
        "NP",
        "NE",
        "NG",
        "NI",
        "NU",
        "NC",
        "NZ",
        "NO",
        "DE",
        "CI",
        "QO",
        "AX",
        "OM",
        "TC",
        "AC",
        "BV",
        "CP",
        "IM",
        "NF",
        "HM",
        "PK",
        "PW",
        "PS",
        "PA",
        "PG",
        "PY",
        "PE",
        "PN",
        "PL",
        "PR",
        "PT",
        "RE",
        "RW",
        "RO",
        "RU",
        "SV",
        "WS",
        "SM",
        "ST",
        "MO",
        "HK",
        "SA",
        "SZ",
        "SJ",
        "SH",
        "LC",
        "BL",
        "VC",
        "KN",
        "MF",
        "SX",
        "PM",
        "KP",
        "MP",
        "SC",
        "SN",
        "EA",
        "SL",
        "SG",
        "SY",
        "US",
        "SK",
        "SI",
        "SB",
        "SO",
        "RS",
        "SD",
        "SR",
        "TW",
        "TH",
        "TZ",
        "TJ",
        "TL",
        "TG",
        "TK",
        "TO",
        "TT",
        "TA",
        "TV",
        "TN",
        "TM",
        "TR",
        "UG",
        "UZ",
        "UN",
        "AE",
        "GB",
        "UA",
        "UY",
        "FO",
        "PH",
        "FI",
        "FJ",
        "FK",
        "FR",
        "GF",
        "PF",
        "TF",
        "HT",
        "NL",
        "HN",
        "HR",
        "CF",
        "ME",
        "TD",
        "CZ",
        "CL",
        "JE",
        "DJ",
        "CH",
        "SE",
        "ES",
        "LK",
    };
  }

  @Override
  protected void loadNameMapJava() {
    super.loadNameMapJava();
    namesMap.put("BY", "Бјелорусија");
    namesMap.put("CG", "Конго");
    namesMap.put("CV", "Кабо Верде");
    namesMap.put("CZ", "Чешка Република");
    namesMap.put("DE", "Њемачка");
    namesMap.put("KN", "Свети Китс и Невис");
    namesMap.put("MO", "САР Макао");
    namesMap.put("PM", "Свети Пјер и Микелон");
    namesMap.put("RE", "Реунион");
    namesMap.put("UM", "Мања удаљена острва САД");
    namesMap.put("VC", "Свети Винсент и Гренадини");
    namesMap.put("VG", "Британска Дјевичанска Острва");
    namesMap.put("VI", "Америчка Дјевичанска Острва");
  }

  @Override
  protected JavaScriptObject loadNameMapNative() {
    return overrideMap(super.loadNameMapNative(), loadMyNameMap());
  }

  private native JavaScriptObject loadMyNameMap() /*-{
    return {
        "BY": "Бјелорусија",
        "CG": "Конго",
        "CV": "Кабо Верде",
        "CZ": "Чешка Република",
        "DE": "Њемачка",
        "KN": "Свети Китс и Невис",
        "MO": "САР Макао",
        "PM": "Свети Пјер и Микелон",
        "RE": "Реунион",
        "UM": "Мања удаљена острва САД",
        "VC": "Свети Винсент и Гренадини",
        "VG": "Британска Дјевичанска Острва",
        "VI": "Америчка Дјевичанска Острва"
    };
  }-*/;
}
