/*
 * 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[] {
        "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": "Америчка Дјевичанска Острва"
    };
  }-*/;
}
