# *   Copyright (C) 1998-2011, International Business Machines
# *   Corporation and others.  All Rights Reserved.
COLLATION_CLDR_VERSION = 2.0
# A list of txt's to build
# Note:
#
#   If you are thinking of modifying this file, READ THIS.
#
# Instead of changing this file [unless you want to check it back in],
# you should consider creating a 'collocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'collocal.mk' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  COLLATION_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files.

# Aliases without a corresponding xx.xml file (see icu-config.xml & build.xml)
COLLATION_SYNTHETIC_ALIAS = de_.txt de__PHONEBOOK.txt es_.txt es__TRADITIONAL.txt\
 hi_.txt hi__DIRECT.txt in.txt in_ID.txt iw.txt\
 iw_IL.txt mo.txt no.txt no_NO.txt pa_IN.txt\
 sh.txt sh_BA.txt sh_YU.txt sr_BA.txt sr_ME.txt\
 sr_RS.txt zh_.txt zh_CN.txt zh_HK.txt zh_MO.txt\
 zh_SG.txt zh_TW.txt zh_TW_STROKE.txt zh__PINYIN.txt


# All aliases (to not be included under 'installed'), but not including root.
COLLATION_ALIAS_SOURCE = $(COLLATION_SYNTHETIC_ALIAS)


# Empty locales, used for validSubLocale fallback.
COLLATION_EMPTY_SOURCE = af_NA.txt af_ZA.txt ar_AE.txt ar_BH.txt\
 ar_DZ.txt ar_EG.txt ar_IQ.txt ar_JO.txt ar_KW.txt\
 ar_LB.txt ar_LY.txt ar_MA.txt ar_OM.txt ar_QA.txt\
 ar_SA.txt ar_SD.txt ar_SY.txt ar_TN.txt ar_YE.txt\
 as_IN.txt az_Latn.txt az_Latn_AZ.txt be_BY.txt bg_BG.txt\
 bn_BD.txt bn_IN.txt bs_BA.txt ca_ES.txt chr.txt\
 chr_US.txt cs_CZ.txt cy_GB.txt da_DK.txt de_AT.txt\
 de_BE.txt de_CH.txt de_DE.txt de_LI.txt de_LU.txt\
 ee.txt ee_GH.txt ee_TG.txt el_CY.txt el_GR.txt\
 en_AS.txt en_AU.txt en_BB.txt en_BE.txt en_BM.txt\
 en_BW.txt en_BZ.txt en_CA.txt en_GB.txt en_GU.txt\
 en_HK.txt en_IE.txt en_IN.txt en_JM.txt en_MH.txt\
 en_MP.txt en_MT.txt en_MU.txt en_NA.txt en_NZ.txt\
 en_PH.txt en_PK.txt en_SG.txt en_TT.txt en_UM.txt\
 en_VI.txt en_ZA.txt en_ZW.txt es_419.txt es_AR.txt\
 es_BO.txt es_CL.txt es_CO.txt es_CR.txt es_DO.txt\
 es_EC.txt es_ES.txt es_GQ.txt es_GT.txt es_HN.txt\
 es_MX.txt es_NI.txt es_PA.txt es_PE.txt es_PR.txt\
 es_PY.txt es_SV.txt es_US.txt es_UY.txt es_VE.txt\
 et_EE.txt fa_IR.txt fi_FI.txt fil_PH.txt fo_FO.txt\
 fr_BE.txt fr_BF.txt fr_BI.txt fr_BJ.txt fr_BL.txt\
 fr_CD.txt fr_CF.txt fr_CG.txt fr_CH.txt fr_CI.txt\
 fr_CM.txt fr_DJ.txt fr_FR.txt fr_GA.txt fr_GN.txt\
 fr_GP.txt fr_GQ.txt fr_KM.txt fr_LU.txt fr_MC.txt\
 fr_MF.txt fr_MG.txt fr_ML.txt fr_MQ.txt fr_NE.txt\
 fr_RE.txt fr_RW.txt fr_SN.txt fr_TD.txt fr_TG.txt\
 ga.txt ga_IE.txt gu_IN.txt ha_Latn.txt ha_Latn_GH.txt\
 ha_Latn_NE.txt ha_Latn_NG.txt he_IL.txt hi_IN.txt hr_HR.txt\
 hu_HU.txt hy_AM.txt id.txt id_ID.txt ig_NG.txt\
 is_IS.txt it.txt it_CH.txt it_IT.txt ja_JP.txt\
 ka.txt ka_GE.txt kk_KZ.txt kl_GL.txt km_KH.txt\
 kn_IN.txt ko_KR.txt kok_IN.txt ln_CD.txt ln_CG.txt\
 lt_LT.txt lv_LV.txt mk_MK.txt ml_IN.txt mr_IN.txt\
 ms.txt ms_BN.txt ms_MY.txt mt_MT.txt my_MM.txt\
 nb_NO.txt nl.txt nl_AW.txt nl_BE.txt nl_NL.txt\
 nn_NO.txt om_ET.txt om_KE.txt or_IN.txt pa_Arab.txt\
 pa_Arab_PK.txt pa_Guru.txt pa_Guru_IN.txt pl_PL.txt ps_AF.txt\
 pt.txt pt_AO.txt pt_BR.txt pt_GW.txt pt_MZ.txt\
 pt_PT.txt pt_ST.txt ro_MD.txt ro_RO.txt ru_MD.txt\
 ru_RU.txt ru_UA.txt si_LK.txt sk_SK.txt sl_SI.txt\
 sq_AL.txt sr_Cyrl.txt sr_Cyrl_BA.txt sr_Cyrl_ME.txt sr_Cyrl_RS.txt\
 sr_Latn_BA.txt sr_Latn_ME.txt sr_Latn_RS.txt sv_FI.txt sv_SE.txt\
 sw.txt sw_KE.txt sw_TZ.txt ta_IN.txt ta_LK.txt\
 te_IN.txt th_TH.txt tr_TR.txt uk_UA.txt ur_IN.txt\
 ur_PK.txt vi_VN.txt yo_NG.txt zh_Hans.txt zh_Hans_CN.txt\
 zh_Hans_SG.txt zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt zu.txt\
 zu_ZA.txt


# Ordinary resources
COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) af.txt ar.txt as.txt az.txt\
 be.txt bg.txt bn.txt bs.txt ca.txt\
 cs.txt cy.txt da.txt de.txt el.txt\
 en.txt en_US.txt en_US_POSIX.txt eo.txt es.txt\
 et.txt fa.txt fa_AF.txt fi.txt fil.txt\
 fo.txt fr.txt fr_CA.txt gu.txt ha.txt\
 haw.txt he.txt hi.txt hr.txt hu.txt\
 hy.txt ig.txt is.txt ja.txt kk.txt\
 kl.txt km.txt kn.txt ko.txt kok.txt\
 ln.txt lt.txt lv.txt mk.txt ml.txt\
 mr.txt mt.txt my.txt nb.txt nn.txt\
 om.txt or.txt pa.txt pl.txt ps.txt\
 ro.txt ru.txt si.txt sk.txt sl.txt\
 sq.txt sr.txt sr_Latn.txt sv.txt ta.txt\
 te.txt th.txt to.txt tr.txt uk.txt\
 ur.txt vi.txt yo.txt zh.txt zh_Hant.txt

