# *   Copyright (C) 1998-2009, International Business Machines
# *   Corporation and others.  All Rights Reserved.
COLLATION_CLDR_VERSION = 1.7
# 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
#     locale:
#    _____________________________________________________
#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files. 

# Aliases which do not have 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 no.txt no_NO.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\
 ca_ES.txt cs_CZ.txt da_DK.txt de_AT.txt de_BE.txt\
 de_CH.txt de_DE.txt de_LU.txt el_GR.txt en_AU.txt\
 en_BW.txt en_CA.txt en_GB.txt en_HK.txt en_IE.txt\
 en_IN.txt en_MT.txt en_NZ.txt en_PH.txt en_SG.txt\
 en_US.txt en_US_POSIX.txt en_VI.txt en_ZA.txt en_ZW.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_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 fo_FO.txt fr_BE.txt\
 fr_CA.txt fr_CH.txt fr_FR.txt fr_LU.txt ga.txt\
 ga_IE.txt gu_IN.txt he_IL.txt hi_IN.txt hr_HR.txt\
 hu_HU.txt id.txt id_ID.txt is_IS.txt it_CH.txt\
 it_IT.txt ja_JP.txt kk_KZ.txt kl_GL.txt kn_IN.txt\
 ko_KR.txt lt_LT.txt lv_LV.txt mk_MK.txt mr_IN.txt\
 ms.txt ms_BN.txt ms_MY.txt mt_MT.txt nb_NO.txt\
 nl.txt nl_BE.txt nl_NL.txt nn_NO.txt om_ET.txt\
 om_KE.txt pa_Arab.txt pa_Arab_PK.txt pa_Guru.txt pa_Guru_IN.txt\
 pa_IN.txt pl_PL.txt ps_AF.txt pt.txt pt_BR.txt\
 pt_PT.txt ro_RO.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 ta_IN.txt te_IN.txt th_TH.txt\
 tr_TR.txt uk_UA.txt ur_IN.txt ur_PK.txt vi_VN.txt\
 zh_Hans.txt zh_Hans_CN.txt zh_Hans_SG.txt zh_Hant_HK.txt zh_Hant_MO.txt\
 zh_Hant_TW.txt


# Ordinary resources
COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) af.txt ar.txt as.txt az.txt\
 be.txt bg.txt bn.txt bn_IN.txt ca.txt\
 cs.txt cy.txt da.txt de.txt el.txt\
 en.txt en_BE.txt eo.txt es.txt et.txt\
 fa.txt fa_AF.txt fi.txt fo.txt fr.txt\
 gu.txt haw.txt he.txt hi.txt hr.txt\
 hu.txt is.txt it.txt ja.txt kk.txt\
 kl.txt km.txt kn.txt ko.txt kok.txt\
 lt.txt lv.txt mk.txt ml.txt mr.txt\
 mt.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\
 tr.txt uk.txt ur.txt vi.txt zh.txt\
 zh_Hant.txt

