-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkb_install
203 lines (167 loc) · 54.8 KB
/
kb_install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# kb_install.py
#
# Copyright 2014 Muhammad Saad <muhammad.saad3@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
from optparse import OptionParser
import os
import shutil
import time
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
parser = OptionParser()
parser.add_option("-f", "--file",
action="store", type="string", dest="filename",
help="Keyboard layout file", metavar="FILE")
parser.add_option("-n", "--name",
action="store", type="string", dest="kbname",
help="Keyboard layout name. Preferrably short and lowercase (e.g; pk)", metavar="NAME")
parser.add_option("-s", "--short-description",
action="store", type="string", dest="shortdesc",
help="Short description of the layout to show in keyboard layout indicators (e.g; ur, ps,..)")
parser.add_option("-d", "--description",
action="store", type="string", dest="description",
help="Description of the keyboard layout (e.g; Urdu, Pashto,..)")
parser.add_option("-l", "--langcode",
action="store", type="string", dest="langcode",
help="ISO 639-2 language code for the layout's language (e.g; urd, pus,..)", metavar="LANGCODE")
parser.add_option("-F", "--force",
action="store_true", dest="forced", default=False,
help="Force operation. Override safe mode.")
(options, args) = parser.parse_args()
def print_missing():
if options.filename == None:
print "Missing Option: Keyboard layout file"
if options.kbname == None:
print "Missing Option: Keyboard layout name"
if options.shortdesc == None:
print "Missing Option: Short description"
if options.description == None:
print "Missing Option: Description"
if options.langcode == None:
print "Missing Option: Language code"
required_options = [ options.filename, options.kbname, options.shortdesc, options.description, options.langcode ]
if None in required_options:
print "Error: A required option is missing.\nDetails:"
print_missing()
print "Refer to the command's help (--help)"
exit(1)
codelist_iso639_1 = ['aa','ab','ae','af','ak','am','an','ar','as','av','ay','az','ba','be','bg','bi','bm','bn','bo','br','bs','ca','ce','ch','co','cr','cs','cu','cv','cy','da','de','dv','dz','ee','el','en','eo','es','et','eu','fa','ff','fi','fj','fo','fr','fy','ga','gd','gl','gn','gu','gv','ha','he','hi','ho','hr','ht','hu','hy','hz','ia','id','ie','ig','ii','ik','io','is','it','iu','ja','jv','ka','kg','ki','kj','kk','kl','km','kn','ko','kr','ks','ku','kv','kw','ky','la','lb','lg','li','ln','lo','lt','lu','lv','mg','mh','mi','mk','ml','mn','mo','mr','ms','mt','my','na','nb','nd','ne','ng','nl','nn','no','nr','nv','ny','oc','oj','om','or','os','pa','pi','pl','ps','pt','qu','rm','rn','ro','ru','rw','sa','sc','sd','se','sg','sh','si','sk','sl','sm','sn','so','sq','sr','ss','st','su','sv','sw','ta','te','tg','th','ti','tk','tl','tn','to','tr','ts','tt','tw','ty','ug','uk','ur','uz','ve','vi','vo','wa','wo','xh','yi','yo','za','zh','zu']
codelist_iso639_2 = ['abk', 'ace', 'ach', 'ada', 'ady', 'afa', 'afh', 'afr', 'ain', 'aka', 'akk', 'alb', 'ale', 'alg', 'alt', 'amh', 'ang', 'anp', 'apa', 'ara', 'arc', 'arg', 'arm', 'arn', 'arp', 'art', 'arw', 'asm', 'ast', 'ath', 'aus', 'ava', 'ave', 'awa', 'aym', 'aze', 'bad', 'bai', 'bak', 'bal', 'bam', 'ban', 'baq', 'bas', 'bat', 'bej', 'bel', 'bem', 'ben', 'ber', 'bho', 'bih', 'bik', 'bin', 'bis', 'bla', 'bnt', 'bos', 'bra', 'bre', 'btk', 'bua', 'bug', 'bul', 'bur', 'byn', 'cad', 'cai', 'car', 'cat', 'cau', 'ceb', 'cel', 'cha', 'chb', 'che', 'chg', 'chi', 'chk', 'chm', 'chn', 'cho', 'chp', 'chr', 'chu', 'chv', 'chy', 'cmc', 'cop', 'cor', 'cos', 'cpe', 'cpf', 'cpp', 'cre', 'crh', 'crp', 'csb', 'cus', 'cze', 'dak', 'dan', 'dar', 'day', 'del', 'den', 'dgr', 'din', 'div', 'doi', 'dra', 'dsb', 'dua', 'dum', 'dut', 'dyu', 'dzo', 'efi', 'egy', 'eka', 'elx', 'eng', 'enm', 'epo', 'est', 'ewe', 'ewo', 'fan', 'fao', 'fat', 'fij', 'fil', 'fin', 'fiu', 'fon', 'fre', 'frm', 'fro', 'frr', 'frs', 'fry', 'ful', 'fur', 'gaa', 'gay', 'gba', 'gem', 'geo', 'ger', 'gez', 'gil', 'gla', 'gle', 'glg', 'glv', 'gmh', 'goh', 'gon', 'gor', 'got', 'grb', 'grc', 'gre', 'grn', 'gsw', 'guj', 'gwi', 'hai', 'hat', 'hau', 'haw', 'heb', 'her', 'hil', 'him', 'hin', 'hit', 'hmn', 'hmo', 'hrv', 'hsb', 'hun', 'hup', 'iba', 'ibo', 'ice', 'ido', 'iii', 'ijo', 'iku', 'ile', 'ilo', 'ina', 'inc', 'ind', 'ine', 'inh', 'ipk', 'ira', 'iro', 'ita', 'jav', 'jbo', 'jpn', 'jpr', 'jrb', 'kaa', 'kab', 'kac', 'kal', 'kam', 'kan', 'kar', 'kas', 'kau', 'kaw', 'kaz', 'kbd', 'kha', 'khi', 'khm', 'kho', 'kik', 'kin', 'kir', 'kmb', 'kok', 'kom', 'kon', 'kor', 'kos', 'kpe', 'krc', 'krl', 'kro', 'kru', 'kua', 'kum', 'kur', 'kut', 'lad', 'lah', 'lam', 'lao', 'lat', 'lav', 'lez', 'lim', 'lin', 'lit', 'lol', 'loz', 'ltz', 'lua', 'lub', 'lug', 'lui', 'lun', 'luo', 'lus', 'mac', 'mad', 'mag', 'mah', 'mai', 'mak', 'mal', 'man', 'mao', 'map', 'mar', 'mas', 'may', 'mdf', 'mdr', 'men', 'mga', 'mic', 'min', 'mis', 'mkh', 'mlg', 'mlt', 'mnc', 'mni', 'mno', 'moh', 'mon', 'mos', 'mul', 'mun', 'mus', 'mwl', 'mwr', 'myn', 'myv', 'nah', 'nai', 'nap', 'nau', 'nav', 'nbl', 'nde', 'ndo', 'nds', 'nep', 'new', 'nia', 'nic', 'niu', 'nno', 'nob', 'nog', 'non', 'nor', 'nqo', 'nso', 'nub', 'nwc', 'nya', 'nym', 'nyn', 'nyo', 'nzi', 'oci', 'oji', 'ori', 'orm', 'osa', 'oss', 'ota', 'oto', 'paa', 'pag', 'pal', 'pam', 'pan', 'pap', 'pau', 'peo', 'per', 'phi', 'phn', 'pli', 'pol', 'pon', 'por', 'pra', 'pro', 'pus', 'qaa', 'que', 'raj', 'rap', 'rar', 'roa', 'roh', 'rom', 'rum', 'run', 'rup', 'rus', 'sad', 'sag', 'sah', 'sai', 'sal', 'sam', 'san', 'sas', 'sat', 'scn', 'sco', 'sel', 'sem', 'sga', 'sgn', 'shn', 'sid', 'sin', 'sio', 'sit', 'sla', 'slo', 'slv', 'sma', 'sme', 'smi', 'smj', 'smn', 'smo', 'sms', 'sna', 'snd', 'snk', 'sog', 'som', 'son', 'sot', 'spa', 'srd', 'srn', 'srp', 'srr', 'ssa', 'ssw', 'suk', 'sun', 'sus', 'sux', 'swa', 'swe', 'syc', 'syr', 'tah', 'tai', 'tam', 'tat', 'tel', 'tem', 'ter', 'tet', 'tgk', 'tgl', 'tha', 'tib', 'tig', 'tir', 'tiv', 'tkl', 'tlh', 'tli', 'tmh', 'tog', 'ton', 'tpi', 'tsi', 'tsn', 'tso', 'tuk', 'tum', 'tup', 'tur', 'tut', 'tvl', 'twi', 'tyv', 'udm', 'uga', 'uig', 'ukr', 'umb', 'und', 'urd', 'uzb', 'vai', 'ven', 'vie', 'vol', 'vot', 'wak', 'wal', 'war', 'was', 'wel', 'wen', 'wln', 'wol', 'xal', 'xho', 'yao', 'yap', 'yid', 'yor', 'ypk', 'zap', 'zbl', 'zen', 'zgh', 'zha', 'znd', 'zul', 'zun', 'zxx', 'zza']
codelist_iso639_3 = ['aaa','aab','aac','aad','aae','aaf','aai','aak','aal','aam','aan','aao','aap','aaq','aar','aas','aat','aau','aaw','aax','aay','aaz','aba','abb','abc','abd','abe','abf','abg','abh','abi','abj','abk','abl','abm','abn','abo','abp','abq','abr','abs','abt','abu','abv','abw','abx','aby','abz','aca','acb','acc','acd','ace','acf','ach','aci','ack','acl','acm','acn','acp','acq','acr','acs','act','acu','acv','acw','acx','acy','acz','ada','adb','add','ade','adf','adg','adh','adi','adj','adl','adn','ado','adp','adq','adr','ads','adt','adu','adw','adx','ady','aea','aeb','aec','aed','aee','aek','ael','aem','aen','aeq','aer','aes','aew','aex','aey','afb','afe','afh','afi','afn','afo','afr','afs','aft','afu','afz','aga','agb','agc','agd','age','agf','agg','agh','agi','agj','agk','agl','agm','agn','ago','agp','agq','agr','ags','agt','agu','agv','agw','agx','agy','agz','aha','ahb','ahe','ahg','ahh','ahi','ahk','ahl','ahm','ahn','aho','ahp','ahr','ahs','aht','aia','aib','aic','aid','aie','aif','aig','aih','aii','aij','aik','ail','aim','ain','aio','aip','aiq','air','ais','ait','aix','aiy','aiz','aja','ajg','aji','ajp','ajt','aju','ajw','ajz','aka','akb','akc','akd','ake','akf','akg','akh','aki','akj','akk','akl','akm','akn','ako','akp','akq','akr','aks','akt','aku','akv','akw','akx','aky','akz','ala','alc','ald','ale','alf','alh','ali','alj','alk','all','alm','aln','alo','alp','alq','alr','als','alt','alu','alw','alx','aly','alz','ama','amb','amc','amd','ame','amf','amg','amh','ami','amj','amk','aml','amm','amn','amo','amp','amq','amr','ams','amt','amu','amv','amw','amx','amy','amz','ana','anb','anc','and','ane','anf','ang','anh','ani','anj','ank','anl','anm','ann','ano','anp','anq','anr','ans','ant','anu','anv','anw','anx','any','anz','aoa','aob','aoc','aod','aoe','aof','aog','aoh','aoi','aoj','aok','aol','aom','aon','aor','aos','aot','aox','aoz','apb','apc','apd','ape','apg','aph','api','apj','apk','apl','apm','apn','apo','app','apq','apr','aps','apt','apu','apw','apx','apy','apz','aqc','aqg','aqm','aqn','aqp','aqr','ara','arb','arc','ard','are','arf','arg','arh','ari','arj','ark','arl','arn','aro','arp','arq','arr','ars','aru','arv','arw','arx','ary','arz','asa','asb','asc','asd','ase','asf','asg','ash','asi','asj','ask','asl','asm','asn','aso','asp','asq','asr','ass','ast','asu','asv','asw','asx','asy','asz','ata','atb','atc','atd','ate','atf','atg','ati','atj','atk','atl','atm','atn','ato','atp','atq','atr','ats','att','atu','atv','atw','atx','aty','atz','aua','auc','aud','aue','aug','auh','aui','auj','auk','aul','aum','aun','auo','aup','auq','aur','aut','auu','auv','auw','aux','auy','auz','ava','avb','avd','ave','avi','avl','avn','avo','avs','avt','avu','avv','awa','awb','awc','awe','awh','awi','awk','awm','awn','awo','awr','aws','awt','awu','awv','aww','awx','awy','axb','axg','axk','axm','axx','aya','ayb','ayc','ayd','aye','ayg','ayh','ayi','ayk','ayl','aym','ayn','ayo','ayp','ayq','ayr','ays','ayt','ayu','ayx','ayy','ayz','azb','aze','azg','azj','azm','azo','azr','azt','azz','baa','bab','bac','bae','baf','bag','bah','baj','bak','bal','bam','ban','bao','bap','bar','bas','bau','bav','baw','bax','bay','baz','bba','bbb','bbc','bbd','bbe','bbf','bbg','bbh','bbi','bbj','bbk','bbl','bbm','bbn','bbo','bbp','bbq','bbr','bbs','bbt','bbu','bbv','bbw','bbx','bby','bbz','bca','bcb','bcc','bcd','bce','bcf','bcg','bch','bci','bcj','bck','bcl','bcm','bcn','bco','bcp','bcq','bcr','bcs','bct','bcu','bcv','bcw','bcx','bcy','bcz','bda','bdb','bdc','bdd','bde','bdg','bdh','bdi','bdj','bdk','bdl','bdm','bdn','bdo','bdp','bdq','bdr','bds','bdt','bdu','bdv','bdw','bdx','bdy','bdz','bea','beb','bec','bed','bee','bef','beg','beh','bei','bej','bek','bel','bem','ben','beo','bep','beq','bes','bet','beu','bev','bew','bex','bey','bez','bfa','bfb','bfc','bfd','bfe','bff','bfg','bfh','bfi','bfj','bfk','bfl','bfm','bfn','bfo','bfp','bfq','bfr','bfs','bft','bfu','bfw','bfy','bfz','bga','bgb','bgc','bgd','bge','bgf','bgg','bgh','bgi','bgj','bgk','bgl','bgm','bgn','bgo','bgp','bgq','bgr','bgs','bgt','bgu','bgv','bgw','bgx','bgy','bgz','bha','bhb','bhc','bhd','bhe','bhf','bhg','bhh','bhi','bhj','bhk','bhl','bhm','bhn','bho','bhp','bhq','bhr','bhs','bht','bhu','bhv','bhw','bhx','bhy','bhz','bia','bib','bic','bid','bie','bif','big','bii','bij','bik','bil','bim','bin','bio','bip','biq','bir','bis','bit','biu','biv','biw','bix','biy','biz','bja','bjb','bjc','bjd','bje','bjf','bjg','bjh','bji','bjj','bjk','bjl','bjm','bjn','bjo','bjq','bjr','bjs','bjt','bju','bjv','bjw','bjx','bjy','bjz','bka','bkb','bkc','bkd','bke','bkf','bkg','bkh','bki','bkj','bkk','bkl','bkm','bkn','bko','bkp','bkq','bkr','bks','bkt','bku','bkv','bkw','bkx','bky','bkz','bla','blb','blc','bld','ble','blf','blg','blh','bli','blj','blk','bll','blm','bln','blo','blp','blq','blr','bls','blt','blu','blv','blw','blx','bly','blz','bma','bmb','bmc','bmd','bme','bmf','bmg','bmh','bmi','bmj','bmk','bml','bmm','bmn','bmo','bmp','bmq','bmr','bms','bmt','bmu','bmv','bmw','bmx','bmy','bmz','bna','bnb','bnc','bnd','bne','bnf','bng','bnh','bni','bnj','bnk','bnl','bnm','bnn','bno','bnp','bnq','bnr','bns','bnu','bnv','bnw','bnx','bny','bnz','boa','bob','boc','bod','boe','bof','bog','boh','boi','boj','bok','bol','bom','bon','boo','bop','boq','bor','bos','bot','bou','bov','bow','box','boy','boz','bpa','bpb','bpd','bpg','bph','bpi','bpj','bpk','bpl','bpm','bpn','bpo','bpp','bpq','bpr','bps','bpt','bpu','bpv','bpw','bpx','bpy','bpz','bqa','bqb','bqc','bqd','bqe','bqf','bqg','bqh','bqi','bqj','bqk','bql','bqm','bqn','bqo','bqp','bqq','bqr','bqs','bqt','bqu','bqv','bqw','bqx','bqy','bqz','bra','brb','brc','brd','bre','brf','brg','brh','bri','brj','brk','brl','brm','brn','bro','brp','brq','brr','brs','brt','bru','brv','brw','brx','bry','brz','bsa','bsb','bsc','bsd','bse','bsf','bsg','bsh','bsi','bsj','bsk','bsl','bsm','bsn','bso','bsp','bsq','bsr','bss','bst','bsu','bsv','bsw','bsx','bsy','bsz','bta','btb','btc','btd','bte','btf','btg','bth','bti','btj','btl','btm','btn','bto','btp','btq','btr','bts','btt','btu','btv','btw','btx','bty','btz','bua','bub','buc','bud','bue','buf','bug','buh','bui','buj','buk','bul','bum','bun','buo','bup','buq','bus','but','buu','buv','buw','bux','buy','buz','bva','bvb','bvc','bvd','bve','bvf','bvg','bvh','bvi','bvj','bvk','bvl','bvm','bvn','bvo','bvq','bvr','bvs','bvt','bvu','bvv','bvw','bvx','bvz','bwa','bwb','bwc','bwd','bwe','bwf','bwg','bwh','bwi','bwj','bwk','bwl','bwm','bwn','bwo','bwp','bwq','bwr','bws','bwt','bwu','bwv','bww','bwx','bwy','bwz','bxa','bxb','bxc','bxd','bxe','bxf','bxg','bxh','bxi','bxj','bxk','bxl','bxm','bxn','bxo','bxp','bxq','bxr','bxs','bxt','bxu','bxv','bxw','bxx','bxz','bya','byb','byc','byd','bye','byf','byg','byh','byi','byj','byk','byl','bym','byn','byo','byp','byq','byr','bys','byt','byu','byv','byw','byx','byy','byz','bza','bzb','bzd','bze','bzf','bzg','bzh','bzj','bzk','bzl','bzm','bzn','bzo','bzp','bzq','bzr','bzs','bzt','bzu','bzv','bzw','bzx','bzy','bzz','caa','cab','cac','cad','cae','caf','cag','cah','caj','cak','cal','cam','can','cao','cap','caq','car','cas','cat','cav','caw','cax','cay','caz','cbb','cbc','cbd','cbe','cbg','cbh','cbi','cbj','cbk','cbl','cbm','cbn','cbo','cbr','cbs','cbt','cbu','cbv','cby','cca','ccc','ccd','cce','ccg','cch','ccj','ccl','ccm','cco','ccp','ccq','ccr','ccx','ccy','cda','cde','cdf','cdg','cdh','cdi','cdj','cdm','cdn','cdo','cdr','cds','cdz','cea','ceb','ceg','ces','cet','cfa','cfd','cfg','cga','cgc','cgg','cgk','cha','chb','chc','chd','che','chf','chg','chh','chj','chk','chl','chm','chn','cho','chp','chq','chr','chs','cht','chu','chv','chw','chx','chy','chz','cia','cib','cic','cid','cie','cih','cik','cim','cin','cip','cir','cit','ciw','ciy','cja','cje','cjh','cji','cjk','cjm','cjn','cjo','cjp','cjr','cjs','cjv','cjy','cka','ckb','ckc','ckd','cke','ckf','ckh','cki','ckj','ckk','ckl','cko','ckq','ckr','cks','ckt','cku','ckv','ckw','ckx','cky','ckz','cla','clc','cld','cle','clh','cli','clk','cll','clm','clo','clu','clw','cly','cma','cme','cmg','cmi','cmk','cml','cmm','cmn','cmo','cmr','cms','cmt','cna','cnb','cnc','cng','cnh','cni','cnk','cnl','cnm','cno','cns','cnt','cnu','cnw','cnx','coa','cob','coc','cod','coe','cof','cog','coh','coj','cok','col','com','con','coo','cop','coq','cor','cos','cot','cou','cov','cow','cox','coy','coz','cpa','cpb','cpc','cpg','cpi','cpn','cps','cpu','cpx','cpy','cqu','cra','crb','crc','crd','cre','crf','crg','crh','cri','crj','crk','crl','crm','crn','cro','crq','crr','crs','crt','cru','crv','crw','crx','cry','crz','csa','csb','csc','csd','cse','csf','csg','csh','csi','csk','csl','csm','csn','cso','csq','csr','css','cst','csw','csy','csz','cta','ctc','ctd','cte','cti','ctl','ctm','ctn','cto','ctp','cts','ctu','ctz','cua','cub','cuc','cug','cuh','cui','cuj','cuk','cul','cum','cun','cuo','cup','cuq','cur','cut','cuu','cuv','cuw','cux','cvn','cwa','cwb','cwd','cwe','cwg','cwt','cya','cyb','cym','cyo','czh','czk','czn','czo','czt','daa','dac','dad','dae','daf','dag','dah','dai','daj','dak','dal','dan','dao','dap','daq','dar','das','dat','dau','dav','daw','dax','daz','dba','dbb','dbd','dbe','dbf','dbg','dbi','dbj','dbl','dbm','dbn','dbo','dbp','dbq','dbr','dbu','dbv','dby','dcc','dcr','ddd','dde','ddg','ddi','ddj','ddn','ddo','dds','ddw','dec','ded','dee','def','deg','deh','dei','dek','del','dem','den','dep','deq','der','des','deu','dev','dez','dga','dgc','dgd','dge','dgg','dgh','dgi','dgk','dgn','dgo','dgr','dgs','dgu','dgx','dgz','dha','dhd','dhg','dhi','dhl','dhm','dhn','dho','dhr','dhs','dhu','dhv','dhw','dia','dib','dic','did','dif','dig','dih','dii','dij','dik','dil','dim','din','dio','dip','diq','dir','dis','dit','diu','div','diw','dix','diy','diz','djb','djc','djd','dje','djf','dji','djj','djk','djl','djm','djn','djo','djr','dju','djw','dka','dkk','dkl','dkr','dks','dkx','dlg','dlm','dln','dma','dmc','dme','dmg','dmk','dml','dmm','dmo','dmr','dms','dmu','dmv','dmx','dmy','dna','dnd','dne','dng','dni','dnk','dnn','dnr','dnt','dnu','dnw','dny','doa','dob','doc','doe','dof','doh','doi','dok','dol','don','doo','dop','doq','dor','dos','dot','dov','dow','dox','doy','doz','dpp','drb','drd','dre','drg','drh','dri','drl','drn','dro','drq','drr','drs','drt','dru','drw','dry','dsb','dse','dsh','dsi','dsl','dsn','dso','dsq','dta','dtb','dtk','dtm','dtp','dtr','dts','dtt','dua','dub','duc','dud','due','duf','dug','duh','dui','duj','duk','dul','dum','dun','duo','dup','duq','dur','dus','duu','duv','duw','dux','duy','duz','dva','dwa','dws','dww','dya','dyb','dyd','dyg','dyi','dyk','dyn','dyo','dyu','dyy','dza','dzd','dzg','dzl','dzn','dzo','ebg','ebo','ebr','ebu','ecr','ecs','ecy','eee','efa','efe','efi','ega','ego','egy','ehu','eip','eit','eiv','eja','eka','eke','ekg','eki','ekm','eko','ekp','ekr','eky','ele','elh','eli','elk','ell','elm','elo','elp','elu','elx','ema','emb','eme','emg','emi','emk','eml','emm','emn','emo','emp','ems','emu','emw','emy','ena','enb','enc','end','enf','eng','enh','eni','enm','enn','eno','enq','enr','env','enw','eot','epi','epo','erg','erh','eri','erk','ero','err','ers','ert','erw','ese','esh','esi','esk','esl','esm','esn','eso','esq','ess','est','esu','etb','etc','eth','etn','eto','etr','ets','ett','etu','etx','etz','eur','eus','eve','evh','evn','ewe','ewo','ext','eya','eze','faa','fab','fad','faf','fag','fah','fai','faj','fak','fal','fam','fan','fao','fap','far','fas','fat','fau','fax','fay','faz','fcs','fer','ffm','fgr','fia','fie','fij','fil','fin','fip','fir','fit','fiw','fiz','fkv','fla','flh','fli','fll','flm','fln','flr','fly','fmp','fmu','fng','fni','fod','foi','fom','fon','for','fos','fpe','fqs','fra','frc','frd','frk','frm','fro','frp','frq','frr','frs','frt','fry','fse','fsl','fss','fub','fuc','fud','fue','fuf','fuh','fui','fuj','ful','fum','fun','fuq','fur','fut','fuu','fuv','fuy','fvr','fwa','fwe','gaa','gab','gad','gae','gaf','gag','gah','gai','gaj','gak','gal','gam','gan','gao','gap','gaq','gar','gas','gat','gau','gav','gaw','gax','gay','gaz','gba','gbb','gbc','gbd','gbe','gbf','gbg','gbh','gbi','gbj','gbk','gbl','gbm','gbn','gbo','gbp','gbq','gbr','gbs','gbu','gbv','gbx','gby','gbz','gcc','gcd','gce','gcf','gcl','gcn','gcr','gct','gda','gdb','gdc','gdd','gde','gdf','gdg','gdh','gdi','gdj','gdk','gdl','gdm','gdn','gdo','gdq','gdr','gdu','gdx','gea','geb','gec','ged','geg','geh','gei','gej','gek','gel','gen','geq','ges','gew','gex','gey','gez','gfk','gft','gga','ggb','ggd','gge','ggg','ggh','ggk','ggl','ggn','ggo','ggr','ggt','ggu','ggw','gha','ghc','ghe','ghh','ghk','ghl','ghn','gho','ghr','ghs','ght','gia','gib','gic','gid','gig','gil','gim','gin','gio','gip','giq','gir','gis','git','giw','gix','giy','giz','gji','gjk','gjn','gju','gka','gke','gkn','gkp','gla','glc','gld','gle','glg','glh','gli','glj','glk','glo','glr','glu','glv','glw','gly','gma','gmb','gmd','gmh','gmn','gmo','gmu','gmx','gmy','gna','gnb','gnc','gnd','gng','gnh','gni','gnk','gnl','gnm','gnn','gno','gnq','gnr','gnt','gnu','gnw','gnz','goa','gob','goc','god','goe','gog','goh','goi','goj','gok','gol','gom','gon','goo','gop','goq','gor','gos','got','gou','gow','gox','goy','goz','gpa','gpn','gqa','gqi','gqn','gqr','gra','grb','grc','grd','grg','grh','gri','grj','grm','grn','gro','grq','grr','grs','grt','gru','grv','grw','grx','gry','grz','gsc','gse','gsg','gsl','gsm','gsn','gsp','gss','gsw','gta','gti','gua','gub','guc','gud','gue','guf','gug','guh','gui','guj','guk','gul','gum','gun','guo','gup','guq','gur','gus','gut','guu','guv','guw','gux','guz','gva','gvc','gve','gvf','gvj','gvl','gvm','gvn','gvo','gvp','gvr','gvs','gvy','gwa','gwb','gwc','gwd','gwe','gwf','gwg','gwi','gwj','gwn','gwr','gwt','gwu','gww','gwx','gxx','gya','gyb','gyd','gye','gyf','gyg','gyi','gym','gyn','gyr','gyy','gza','gzi','gzn','haa','hab','hac','had','hae','haf','hag','hah','hai','haj','hak','hal','ham','han','hao','hap','haq','har','has','hat','hau','hav','haw','hax','hay','haz','hba','hbb','hbn','hbo','hbs','hbu','hca','hch','hdn','hds','hdy','hea','heb','hed','heg','heh','hei','hem','her','hgm','hgw','hhr','hia','hib','hid','hif','hig','hih','hii','hij','hik','hil','hin','hio','hir','hit','hiw','hix','hka','hke','hla','hlb','hld','hlt','hlu','hma','hmb','hmc','hmd','hme','hmf','hmg','hmh','hmi','hmj','hmk','hml','hmm','hmn','hmo','hmp','hmq','hmr','hms','hmt','hmu','hmv','hmw','hmy','hmz','hna','hnd','hne','hnh','hni','hnn','hno','hns','hnu','hoa','hob','hoc','hod','hoe','hoh','hoi','hoj','hol','hom','hoo','hop','hor','hos','hot','hov','how','hoy','hoz','hpo','hps','hra','hre','hrk','hro','hrr','hrt','hru','hrv','hrz','hsb','hsf','hsh','hsl','hsn','hss','hti','hto','hts','htu','htx','hub','huc','hud','hue','huf','hug','huh','hui','huj','huk','hul','hum','hun','huo','hup','huq','hur','hus','hut','huu','huv','huw','hux','huy','huz','hva','hvc','hve','hvk','hvn','hvv','hwa','hwc','hwo','hya','hye','iai','ian','iap','iar','iba','ibb','ibd','ibe','ibg','ibi','ibl','ibm','ibn','ibo','ibr','ibu','iby','ica','ich','icl','icr','ida','idb','idc','idd','ide','idi','ido','idr','ids','idt','idu','ifa','ifb','ife','iff','ifk','ifm','ifu','ify','igb','ige','igg','igl','igm','ign','igo','igs','igw','ihb','ihi','ihp','iii','ijc','ije','ijj','ijn','ijs','ike','iki','ikk','ikl','iko','ikp','ikt','iku','ikv','ikw','ikx','ikz','ila','ilb','ile','ilg','ili','ilk','ill','ilo','ilu','ilv','ilw','ime','imi','iml','imn','imo','imr','ims','imy','ina','inb','ind','ing','inh','inj','inl','inm','inn','ino','inp','ins','int','inz','ior','iou','iow','ipi','ipk','ipo','iqu','ire','irh','iri','irk','irn','irr','iru','irx','iry','isa','isc','isd','ise','isg','ish','isi','isl','ism','isn','iso','isr','ist','isu','ita','itb','ite','iti','itk','itl','itm','ito','itr','its','itt','itu','itv','itw','itx','ity','itz','ium','ivb','ivv','iwk','iwm','iwo','iws','ixc','ixi','ixj','ixl','iya','iyo','iyx','izh','izi','jaa','jab','jac','jad','jae','jaf','jah','jai','jaj','jak','jal','jam','jao','jap','jaq','jar','jas','jat','jau','jav','jax','jay','jaz','jbe','jbj','jbn','jbo','jbt','jbu','jcs','jct','jda','jdg','jdt','jeb','jee','jeg','jeh','jei','jek','jel','jen','jer','jet','jeu','jgb','jge','jgo','jhi','jia','jib','jic','jid','jie','jig','jih','jii','jil','jim','jio','jiq','jit','jiu','jiv','jiy','jko','jku','jle','jma','jmb','jmc','jmd','jmi','jml','jmr','jms','jmx','jna','jnd','jng','jni','jnj','jnl','jns','job','jod','jor','jos','jow','jpn','jpr','jqr','jra','jrb','jrr','jrt','jru','jsl','jua','jub','juc','jud','juh','juk','jul','jum','jun','juo','jup','jur','jut','juu','juw','juy','jvn','jwi','jya','jye','jyy','kaa','kab','kac','kad','kae','kag','kah','kai','kaj','kak','kal','kam','kan','kao','kap','kaq','kas','kat','kau','kav','kaw','kax','kay','kaz','kba','kbb','kbc','kbd','kbe','kbf','kbg','kbh','kbj','kbk','kbl','kbm','kbn','kbo','kbp','kbq','kbr','kbs','kbt','kbu','kbv','kbw','kbx','kby','kbz','kca','kcb','kcc','kcd','kce','kcf','kcg','kch','kci','kcj','kck','kcl','kcm','kcn','kco','kcp','kcq','kcr','kcs','kct','kcu','kcv','kcw','kcx','kcy','kcz','kda','kdc','kdd','kde','kdf','kdg','kdh','kdi','kdj','kdk','kdl','kdm','kdn','kdp','kdq','kdr','kds','kdt','kdu','kdv','kdw','kdx','kdy','kdz','kea','keb','kec','ked','kee','kef','keg','kei','kej','kek','kel','kem','ken','keo','kep','keq','ker','kes','ket','keu','kev','kew','kex','key','kez','kfa','kfb','kfc','kfd','kfe','kff','kfg','kfh','kfi','kfj','kfk','kfl','kfm','kfn','kfo','kfp','kfq','kfr','kfs','kft','kfu','kfv','kfw','kfx','kfy','kfz','kga','kgb','kgc','kgd','kge','kgf','kgg','kgh','kgi','kgj','kgk','kgl','kgm','kgn','kgo','kgp','kgq','kgr','kgs','kgt','kgu','kgv','kgw','kgx','kgy','kha','khb','khc','khd','khe','khf','khg','khh','khj','khk','khl','khm','khn','kho','khp','khq','khr','khs','kht','khu','khv','khw','khx','khy','khz','kia','kib','kic','kid','kie','kif','kig','kih','kii','kij','kik','kil','kim','kin','kio','kip','kiq','kir','kis','kit','kiu','kiv','kiw','kiy','kiz','kja','kjb','kjc','kjd','kje','kjf','kjg','kjh','kji','kjj','kjk','kjl','kjm','kjn','kjo','kjp','kjq','kjr','kjs','kjt','kju','kjx','kjy','kjz','kka','kkb','kkc','kkd','kke','kkg','kkh','kki','kkj','kkk','kkl','kkm','kkn','kko','kkp','kkq','kkr','kks','kkt','kku','kkv','kkw','kkx','kky','kkz','kla','klb','klc','kld','kle','klf','klg','klh','kli','klj','klk','kll','klm','kln','klo','klp','klq','klr','kls','klt','klu','klv','klw','klx','kly','klz','kma','kmb','kmc','kmd','kme','kmf','kmg','kmh','kmi','kmj','kmk','kml','kmm','kmn','kmo','kmp','kmq','kmr','kms','kmt','kmu','kmv','kmw','kmx','kmy','kmz','kna','knb','knc','knd','kne','knf','kng','knh','kni','knj','knk','knl','knm','knn','kno','knp','knq','knr','kns','knt','knu','knv','knw','knx','kny','knz','koa','kob','koc','kod','koe','kof','kog','koh','koi','koj','kok','kol','kom','kon','koo','kop','koq','kor','kos','kot','kou','kov','kow','kox','koy','koz','kpa','kpb','kpc','kpd','kpe','kpf','kpg','kph','kpi','kpj','kpk','kpl','kpm','kpn','kpo','kpp','kpq','kpr','kps','kpt','kpu','kpv','kpw','kpx','kpy','kpz','kqa','kqb','kqc','kqd','kqe','kqf','kqg','kqh','kqi','kqj','kqk','kql','kqm','kqn','kqo','kqp','kqq','kqr','kqs','kqt','kqu','kqv','kqw','kqx','kqy','kqz','kra','krb','krc','krd','kre','krf','krg','krh','kri','krj','krk','krl','krm','krn','krp','krq','krr','krs','krt','kru','krv','krw','krx','kry','krz','ksa','ksb','ksc','ksd','kse','ksf','ksg','ksh','ksi','ksj','ksk','ksl','ksm','ksn','kso','ksp','ksq','ksr','kss','kst','ksu','ksv','ksw','ksx','ksy','ksz','kta','ktb','ktc','ktd','kte','ktf','ktg','kth','kti','ktj','ktk','ktl','ktm','ktn','kto','ktp','ktq','ktr','kts','ktt','ktu','ktv','ktw','ktx','kty','ktz','kua','kub','kud','kue','kuf','kug','kuh','kui','kuj','kuk','kul','kum','kun','kuo','kup','kuq','kur','kus','kut','kuu','kuv','kuw','kux','kuy','kuz','kva','kvb','kvc','kvd','kve','kvf','kvg','kvh','kvi','kvj','kvk','kvl','kvm','kvn','kvo','kvp','kvq','kvr','kvs','kvt','kvu','kvv','kvw','kvx','kvy','kvz','kwa','kwb','kwc','kwd','kwe','kwf','kwg','kwh','kwi','kwj','kwk','kwl','kwm','kwn','kwo','kwp','kwq','kwr','kws','kwt','kwu','kwv','kww','kwx','kwy','kwz','kxa','kxb','kxc','kxd','kxe','kxf','kxg','kxh','kxi','kxj','kxk','kxl','kxm','kxn','kxo','kxp','kxq','kxr','kxs','kxt','kxu','kxv','kxw','kxx','kxy','kxz','kya','kyb','kyc','kyd','kye','kyf','kyg','kyh','kyi','kyj','kyk','kyl','kym','kyn','kyo','kyp','kyq','kyr','kys','kyt','kyu','kyv','kyw','kyx','kyy','kyz','kza','kzb','kzc','kzd','kze','kzf','kzg','kzh','kzi','kzj','kzk','kzl','kzm','kzn','kzo','kzp','kzq','kzr','kzs','kzt','kzu','kzv','kzw','kzx','kzy','kzz','laa','lac','lad','lae','laf','lag','lah','lai','laj','lak','lal','lam','lan','lao','lap','laq','lar','las','lat','lau','lav','law','lax','lay','laz','lba','lbb','lbc','lbe','lbf','lbg','lbi','lbj','lbm','lbn','lbo','lbq','lbr','lbs','lbt','lbu','lbv','lbw','lbx','lby','lbz','lcc','lcd','lce','lcf','lch','lcl','lcm','lcp','lcq','lcs','ldb','ldd','ldg','ldh','ldi','ldj','ldk','ldl','ldm','ldn','ldo','ldp','ldq','lea','leb','lec','led','lee','lef','leg','leh','lei','lej','lek','lel','lem','len','leo','lep','leq','ler','les','let','leu','lev','lew','lex','ley','lez','lfa','lga','lgb','lgg','lgh','lgi','lgk','lgl','lgm','lgn','lgq','lgr','lgt','lgu','lgz','lha','lhh','lhl','lhm','lhn','lhp','lhs','lht','lhu','lia','lib','lic','lid','lie','lif','lig','lih','lii','lij','lik','lil','lim','lin','lio','lip','liq','lir','lis','lit','liu','liv','liw','lix','liy','liz','lje','lji','ljl','ljp','lka','lke','lkh','lki','lkj','lkl','lkn','lkr','lkt','lky','lla','llb','llc','lld','lle','llf','llg','lli','llk','lll','llm','lln','llo','llp','llq','lls','llu','llx','lma','lmb','lmc','lmd','lme','lmf','lmg','lmh','lmi','lmj','lmk','lml','lmm','lmn','lmo','lmp','lmq','lmr','lms','lmt','lmu','lmv','lmw','lmx','lmy','lmz','lna','lnb','lnc','lnd','lng','lnh','lni','lnj','lnl','lnm','lnn','lno','lns','lnt','lnu','lnz','loa','lob','loc','lod','loe','lof','log','loh','loi','loj','lok','lol','lom','lon','loo','lop','loq','lor','los','lot','lou','lov','low','lox','loy','loz','lpa','lpe','lpo','lpx','lra','lrc','lre','lrg','lrk','lrl','lrn','lro','lrr','lrv','lsa','lsd','lse','lsg','lsi','lsl','lso','lsr','lss','ltc','lti','ltu','ltz','lua','lub','luc','lud','lue','luf','lug','lui','luj','luk','lul','lum','lun','luo','lup','luq','lur','lus','lut','luu','luv','luw','luy','luz','lva','lvk','lvu','lwa','lwe','lwh','lwl','lwo','lwt','lww','lya','lyn','lzl','lzz','maa','mab','mad','mae','maf','mag','mah','mai','maj','mak','mal','mam','man','maq','mar','mas','mat','mau','mav','maw','max','maz','mba','mbb','mbc','mbd','mbe','mbf','mbg','mbh','mbi','mbj','mbk','mbl','mbm','mbn','mbo','mbp','mbq','mbr','mbs','mbt','mbu','mbv','mbw','mbx','mby','mbz','mca','mcb','mcc','mcd','mce','mcf','mcg','mch','mci','mcj','mck','mcl','mcm','mcn','mco','mcp','mcq','mcr','mcs','mct','mcu','mcv','mcw','mcx','mcy','mcz','mda','mdb','mdc','mdd','mde','mdf','mdg','mdh','mdi','mdj','mdk','mdl','mdm','mdn','mdo','mdp','mdq','mdr','mds','mdt','mdu','mdv','mdw','mdx','mdy','mdz','mea','meb','mec','med','mee','mef','meg','meh','mei','mej','mek','mel','mem','men','meo','mep','meq','mer','mes','met','meu','mev','mew','mey','mez','mfa','mfb','mfc','mfd','mfe','mff','mfg','mfh','mfi','mfj','mfk','mfl','mfm','mfn','mfo','mfp','mfq','mfr','mfs','mft','mfu','mfv','mfw','mfx','mfy','mfz','mga','mgb','mgc','mgd','mge','mgf','mgg','mgh','mgi','mgj','mgk','mgl','mgm','mgn','mgo','mgp','mgq','mgr','mgs','mgt','mgu','mgv','mgw','mgx','mgy','mgz','mha','mhb','mhc','mhd','mhe','mhf','mhg','mhh','mhi','mhj','mhk','mhl','mhm','mhn','mho','mhp','mhq','mhr','mhs','mht','mhu','mhv','mhw','mhx','mhy','mhz','mia','mib','mic','mid','mie','mif','mig','mih','mii','mij','mik','mil','mim','min','mio','mip','miq','mir','mit','miu','miv','miw','mix','miy','miz','mja','mjc','mjd','mje','mjg','mjh','mji','mjj','mjk','mjl','mjm','mjn','mjo','mjp','mjq','mjr','mjs','mjt','mju','mjv','mjw','mjx','mjy','mjz','mka','mkb','mkc','mkd','mke','mkf','mkg','mki','mkj','mkk','mkl','mkm','mkn','mko','mkp','mkq','mkr','mks','mkt','mku','mkv','mkw','mkx','mky','mkz','mla','mlb','mlc','mld','mle','mlf','mlg','mlh','mli','mlj','mlk','mll','mlm','mln','mlo','mlp','mlq','mlr','mls','mlt','mlu','mlv','mlw','mlx','mly','mlz','mma','mmb','mmc','mmd','mme','mmf','mmg','mmh','mmi','mmj','mmk','mml','mmm','mmn','mmo','mmp','mmq','mmr','mms','mmt','mmu','mmv','mmw','mmx','mmy','mmz','mna','mnb','mnc','mnd','mne','mnf','mng','mnh','mni','mnj','mnk','mnl','mnm','mnn','mnp','mnq','mnr','mns','mnt','mnu','mnv','mnw','mnx','mny','mnz','moa','mob','moc','mod','moe','mof','mog','moh','moi','moj','mok','mol','mom','mon','moo','mop','moq','mor','mos','mot','mou','mov','mow','mox','moy','moz','mpa','mpb','mpc','mpd','mpe','mpf','mpg','mph','mpi','mpj','mpk','mpl','mpm','mpn','mpo','mpp','mpq','mpr','mps','mpt','mpu','mpv','mpw','mpx','mpy','mpz','mqa','mqb','mqc','mqd','mqe','mqf','mqg','mqh','mqi','mqj','mqk','mql','mqm','mqn','mqo','mqp','mqq','mqr','mqs','mqt','mqu','mqv','mqw','mqx','mqy','mqz','mra','mrb','mrc','mrd','mre','mrf','mrg','mrh','mri','mrj','mrk','mrl','mrm','mrn','mro','mrp','mrq','mrr','mrs','mrt','mru','mrv','mrw','mrx','mry','mrz','msa','msb','msc','msd','mse','msf','msg','msh','msi','msj','msk','msl','msm','msn','mso','msp','msq','msr','mss','mst','msu','msv','msw','msx','msy','msz','mta','mtb','mtc','mtd','mte','mtf','mtg','mth','mti','mtj','mtk','mtl','mtm','mtn','mto','mtp','mtq','mtr','mts','mtt','mtu','mtv','mtw','mtx','mty','mtz','mua','mub','muc','mud','mue','mug','muh','mui','muj','muk','mul','mum','muo','mup','muq','mur','mus','mut','muu','muv','muw','mux','muy','muz','mva','mvb','mvc','mvd','mve','mvf','mvg','mvh','mvi','mvj','mvk','mvl','mvm','mvn','mvo','mvp','mvq','mvr','mvs','mvt','mvu','mvv','mvw','mvx','mvy','mvz','mwa','mwb','mwc','mwd','mwe','mwf','mwg','mwh','mwi','mwj','mwk','mwl','mwm','mwn','mwo','mwp','mwq','mwr','mws','mwt','mwu','mwv','mww','mwx','mwy','mwz','mxa','mxb','mxc','mxd','mxe','mxf','mxg','mxh','mxi','mxj','mxk','mxl','mxm','mxn','mxo','mxp','mxq','mxr','mxs','mxt','mxu','mxv','mxw','mxx','mxy','mxz','mya','myb','myc','myd','mye','myf','myg','myh','myi','myj','myk','myl','mym','myo','myp','myq','myr','mys','myt','myu','myv','myw','myx','myy','myz','mza','mzb','mzc','mzd','mze','mzf','mzg','mzh','mzi','mzj','mzk','mzl','mzm','mzn','mzo','mzp','mzq','mzr','mzs','mzt','mzu','mzv','mzw','mzx','mzy','mzz','nab','nac','nad','nae','naf','nag','naj','nak','nal','nam','nan','nao','nap','naq','nar','nas','nat','nau','nav','naw','nax','nay','naz','nba','nbb','nbc','nbd','nbe','nbf','nbg','nbh','nbi','nbj','nbk','nbl','nbm','nbn','nbo','nbp','nbq','nbr','nbs','nbt','nbu','nbv','nbw','nbx','nby','nca','ncb','ncc','ncd','nce','ncf','ncg','nch','nci','ncj','nck','ncl','ncm','ncn','nco','ncp','ncr','ncs','nct','ncu','ncx','ncz','nda','ndb','ndc','ndd','nde','ndf','ndg','ndh','ndi','ndj','ndk','ndl','ndm','ndn','ndo','ndp','ndq','ndr','nds','ndt','ndu','ndv','ndw','ndx','ndy','ndz','nea','neb','nec','ned','nee','nef','neg','neh','nei','nej','nek','nem','nen','neo','nep','neq','ner','nes','net','nev','new','nex','ney','nez','nfa','nfd','nfg','nfk','nfl','nfr','nfu','nga','ngb','ngc','ngd','nge','ngg','ngh','ngi','ngj','ngk','ngl','ngm','ngn','ngo','ngp','ngq','ngr','ngs','ngt','ngu','ngv','ngw','ngx','ngy','ngz','nhb','nhc','nhd','nhe','nhf','nhg','nhh','nhi','nhj','nhk','nhm','nhn','nho','nhp','nhq','nhr','nhs','nht','nhu','nhv','nhw','nhx','nhy','nhz','nia','nib','nid','nie','nif','nig','nih','nii','nij','nik','nil','nim','nin','nio','nir','nis','nit','niu','niv','niw','nix','niy','niz','nja','njb','njd','njh','nji','njj','njl','njm','njn','njo','njr','njs','njt','nju','njx','njy','nka','nkb','nkc','nkd','nke','nkf','nkg','nkh','nki','nkj','nkk','nkm','nkn','nko','nkp','nkr','nks','nku','nkw','nkx','nky','nkz','nla','nlc','nld','nle','nlg','nli','nlj','nlk','nll','nln','nlo','nlr','nlu','nlv','nlx','nly','nma','nmb','nmc','nmd','nme','nmf','nmg','nmh','nmi','nmj','nmk','nml','nmm','nmn','nmo','nmp','nmq','nmr','nms','nmt','nmu','nmv','nmw','nmx','nmy','nmz','nna','nnb','nnc','nnd','nne','nnf','nng','nnh','nni','nnj','nnk','nnl','nnm','nnn','nno','nnp','nnq','nnr','nns','nnt','nnu','nnv','nnw','nnx','nny','nnz','noa','nob','noc','nod','noe','nof','nog','noh','noi','nok','nom','non','noo','nop','noq','nor','nos','not','nou','nov','now','noy','noz','npa','npb','nph','npn','npo','nps','npu','npy','nqg','nqk','nqm','nqn','nqo','nra','nrb','nrc','nre','nrg','nri','nrl','nrm','nrn','nrp','nrr','nrt','nrx','nrz','nsa','nsc','nse','nsg','nsh','nsi','nsk','nsl','nsm','nsn','nso','nsp','nsq','nsr','nss','nst','nsw','nsx','nsz','nte','nti','ntj','ntk','ntm','nto','ntp','ntr','nts','ntw','nty','ntz','nua','nuc','nud','nue','nuf','nug','nuh','nui','nuj','nul','num','nun','nuo','nup','nuq','nur','nus','nut','nuu','nuv','nuw','nux','nuy','nuz','nvh','nvm','nwa','nwb','nwc','nwe','nwi','nwm','nwr','nwx','nwy','nxa','nxd','nxe','nxg','nxi','nxj','nxl','nxm','nxn','nxr','nxu','nxx','nya','nyb','nyc','nyd','nye','nyf','nyg','nyh','nyi','nyj','nyk','nyl','nym','nyn','nyo','nyp','nyq','nys','nyt','nyu','nyv','nyw','nyx','nyy','nza','nzb','nzi','nzk','nzm','nzs','nzu','nzy','oaa','oac','oar','oav','obi','obl','obm','obo','obr','obt','obu','oca','occ','och','oci','oco','ocu','oda','odk','odt','odu','ofo','ofs','ofu','ogb','ogc','oge','ogg','ogn','ogo','ogu','oht','ohu','oia','oin','ojb','ojc','ojg','oji','ojp','ojs','ojv','ojw','oka','okb','okd','oke','okh','oki','okj','okk','okl','okm','okn','oko','okr','oks','oku','okx','ola','old','ole','olm','olo','oma','omb','omc','ome','omg','omi','omk','oml','omn','omo','omp','omr','omt','omu','omw','omx','ona','onb','one','ong','oni','onj','onk','onn','ono','onr','ons','ont','onu','onw','onx','ood','oog','oon','oor','oos','opa','ope','opk','opm','opo','opt','opy','ora','orc','ore','org','orh','ori','ork','orm','orn','oro','orr','ors','ort','oru','orv','orw','orx','orz','osa','osc','osi','oso','osp','oss','ost','osu','osx','ota','otb','otd','ote','oti','otk','otl','otm','otn','otq','otr','ots','ott','otu','otw','otx','oty','otz','oua','oub','oue','oui','oum','oun','owi','owl','oyb','oyd','oym','oyy','ozm','pab','pac','pad','pae','paf','pag','pah','pai','paj','pak','pal','pam','pan','pao','pap','paq','par','pas','pat','pau','pav','paw','pax','pay','paz','pbb','pbc','pbe','pbf','pbg','pbh','pbi','pbl','pbn','pbo','pbp','pbr','pbs','pbt','pbu','pbv','pby','pbz','pca','pcb','pcc','pcd','pce','pcf','pcg','pch','pci','pcj','pck','pcl','pcm','pcn','pcp','pcr','pcw','pda','pdc','pdi','pdn','pdo','pdt','pdu','pea','peb','pec','ped','pee','pef','peg','peh','pei','pej','pek','pel','pem','pen','peo','pep','peq','pes','pev','pex','pey','pez','pfa','pfe','pfl','pga','pgg','pgi','pgk','pgn','pgs','pgu','pgy','pha','phd','phg','phh','phk','phl','phm','phn','pho','phq','phr','pht','phu','phv','phw','pia','pib','pic','pid','pie','pif','pig','pih','pii','pij','pil','pim','pin','pio','pip','pir','pis','pit','piu','piv','piw','pix','piy','piz','pjt','pkb','pkc','pkg','pkh','pkn','pko','pkp','pks','pkt','pku','pla','plb','plc','pld','ple','plg','plh','pli','plj','plk','pll','plm','pln','plo','plp','plq','plr','pls','plt','plu','plv','plw','ply','plz','pma','pmb','pmc','pme','pmi','pmj','pmk','pml','pmm','pmn','pmo','pmq','pmr','pms','pmt','pmu','pmw','pmx','pmz','pna','pnb','pnc','pne','png','pnh','pni','pnm','pnn','pno','pnp','pnq','pnr','pns','pnt','pnu','pnv','pnw','pnx','pny','pnz','poa','pob','poc','pod','poe','pof','pog','poh','poi','poj','pok','pol','pom','pon','poo','pop','poq','por','pos','pot','pou','pov','pow','pox','poy','ppa','ppe','ppi','ppk','ppl','ppm','ppn','ppo','ppp','ppq','ppr','pps','ppt','ppu','ppv','pqa','pqm','prb','prc','prd','pre','prg','prh','pri','prk','prl','prm','prn','pro','prp','prq','prr','prs','prt','pru','prv','prw','prx','pry','prz','psa','psc','psd','pse','psg','psh','psi','psl','psm','psn','pso','psp','psq','psr','pss','pst','psw','psy','pta','pth','pti','ptn','pto','ptp','ptr','ptt','ptu','ptv','ptw','pua','pub','puc','pud','pue','puf','pug','pui','puj','puk','pum','pun','puo','pup','puq','pur','pus','put','puu','puw','pux','puy','puz','pwa','pwg','pwm','pwn','pwo','pwr','pww','pxm','pye','pym','pyn','pyu','pyx','pyy','qua','qub','quc','qud','que','quf','qug','quh','qui','quj','quk','qul','qum','qun','qup','quq','qur','qus','qut','quu','quv','quw','qux','quy','quz','qva','qvc','qve','qvh','qvi','qvj','qvl','qvm','qvn','qvo','qvp','qvs','qvw','qvy','qvz','qwa','qwc','qwh','qwm','qws','qwt','qxa','qxc','qxh','qxi','qxl','qxn','qxo','qxp','qxq','qxr','qxs','qxt','qxu','qxw','qya','raa','rab','rac','rad','rae','raf','rag','rah','rai','raj','rak','ral','ram','ran','rao','rap','raq','rar','ras','rat','rau','rav','raw','rax','ray','raz','rbb','rcf','rdb','rea','reb','ree','reg','rei','rej','rel','rem','ren','rer','res','ret','rey','rga','rge','rgk','rgr','rgs','rgu','rhp','ria','rie','rif','ril','rim','rin','rir','rit','riu','rjb','rjg','rji','rka','rkb','rkh','rkm','rma','rmb','rmc','rmd','rme','rmf','rmg','rmh','rmi','rmk','rml','rmm','rmn','rmo','rmp','rmr','rms','rmt','rmu','rmv','rmw','rmx','rmy','rna','rnd','rng','rnn','rnp','rnw','rob','roc','rod','roe','rof','rog','roh','rol','rom','ron','roo','rop','ror','rou','row','rpn','rpt','rri','rro','rsb','rsi','rsl','rth','rtm','rtw','rub','ruc','rue','ruf','rug','ruh','rui','ruk','run','ruo','rup','ruq','rus','rut','ruu','ruy','ruz','rwa','rwk','rwm','rwo','rwr','rws','ryn','rys','ryu','saa','sab','sac','sad','sae','saf','sag','sah','saj','sak','sam','san','sao','sap','saq','sar','sas','sat','sau','sav','saw','sax','say','saz','sba','sbb','sbc','sbd','sbe','sbf','sbg','sbh','sbi','sbj','sbk','sbl','sbm','sbn','sbo','sbp','sbq','sbr','sbs','sbt','sbu','sbv','sbw','sbx','sby','sbz','sca','scb','sce','scf','scg','sch','sci','sck','scl','scn','sco','scp','scq','scs','scu','scv','scw','scx','sda','sdb','sdc','sdd','sde','sdf','sdg','sdh','sdi','sdj','sdl','sdm','sdn','sdo','sdp','sdr','sds','sdt','sdu','sdx','sdz','sea','seb','sec','sed','see','sef','seg','seh','sei','sej','sek','sel','sen','seo','sep','seq','ser','ses','set','seu','sev','sew','sey','sez','sfs','sfw','sga','sgb','sge','sgg','sgh','sgi','sgl','sgm','sgo','sgp','sgr','sgt','sgu','sgw','sgx','sgz','sha','shb','shc','she','shg','shh','shi','shj','shk','shl','shm','shn','sho','shp','shq','shr','shs','sht','shu','shv','shw','shx','shy','shz','sia','sib','sic','sid','sie','sif','sig','sih','sii','sij','sik','sil','sim','sin','sip','siq','sir','sis','siu','siv','siw','six','siy','siz','sja','sjb','sjd','sje','sjg','sjk','sjl','sjm','sjn','sjo','sjp','sjr','sjs','sjt','sju','sjw','ska','skb','skc','skd','ske','skf','skg','skh','ski','skj','skk','skl','skm','skn','sko','skp','skq','skr','sks','skt','sku','skv','skw','skx','sky','skz','slb','slc','sld','sle','slf','slg','slh','sli','slj','slk','sll','slm','sln','slp','slq','slr','sls','slt','slu','slv','slw','slx','sly','slz','sma','smb','smc','smd','sme','smf','smg','smh','smj','smk','sml','smm','smn','smo','smp','smq','smr','sms','smt','smu','smv','smw','smx','smy','smz','sna','snb','snc','snd','sne','snf','sng','snh','sni','snj','snk','snl','snm','snn','sno','snp','snq','snr','sns','snu','snv','snw','snx','sny','snz','soa','sob','soc','sod','soe','sog','soh','soi','soj','sok','sol','som','soo','sop','soq','sor','sos','sot','sou','sov','sow','sox','soy','soz','spa','spb','spc','spd','spe','spg','spi','spk','spl','spm','spo','spp','spq','spr','sps','spt','spu','spx','spy','sqa','sqh','sqi','sqm','sqn','sqo','sqq','sqs','sqt','squ','sra','srb','src','srd','sre','srf','srg','srh','sri','srj','srk','srl','srm','srn','sro','srp','srq','srr','srs','srt','sru','srv','srw','srx','sry','srz','ssb','ssd','sse','ssf','ssg','ssh','ssi','ssj','ssk','ssl','ssm','ssn','sso','ssp','ssq','ssr','sss','sst','ssu','ssv','ssw','ssx','ssy','ssz','sta','stb','stc','std','ste','stf','stg','sth','sti','stj','stk','stl','stm','stn','sto','stp','stq','str','sts','stt','stu','stw','sua','sub','suc','sue','suf','sug','suh','sui','suj','suk','sul','sum','sun','suq','sur','sus','sut','suu','suv','suw','sux','suy','suz','sva','svb','svc','sve','svk','svr','svs','svx','swa','swb','swc','swe','swf','swg','swh','swi','swj','swk','swl','swm','swn','swp','swq','swr','sws','swt','swu','swv','sww','swx','swy','sxc','sxe','sxg','sxk','sxl','sxm','sxn','sxo','sxr','sxs','sxu','sxw','sya','syb','syc','syi','syk','syl','sym','syn','syo','syr','sys','syw','sza','szb','szc','szd','sze','szg','szk','szn','szp','szv','szw','taa','tab','tac','tad','tae','taf','tag','tah','taj','tak','tal','tam','tan','tao','tap','taq','tar','tas','tat','tau','tav','taw','tax','tay','taz','tba','tbb','tbc','tbd','tbe','tbf','tbg','tbh','tbi','tbj','tbk','tbl','tbm','tbn','tbo','tbp','tbr','tbs','tbt','tbu','tbv','tbw','tbx','tby','tbz','tca','tcb','tcc','tcd','tce','tcf','tcg','tch','tci','tck','tcl','tcm','tcn','tco','tcp','tcq','tcs','tct','tcu','tcx','tcy','tcz','tda','tdb','tdc','tdd','tdf','tdg','tdh','tdi','tdj','tdk','tdl','tdn','tdo','tdq','tdr','tds','tdt','tdu','tdv','tdx','tdy','tea','teb','ted','tee','tef','teg','teh','tei','tek','tel','tem','ten','teo','tep','teq','ter','tes','tet','teu','tev','tew','tex','tey','tfi','tfn','tfo','tfr','tft','tga','tgb','tgc','tgd','tge','tgf','tgg','tgh','tgi','tgk','tgl','tgo','tgp','tgq','tgr','tgs','tgt','tgu','tgv','tgw','tgx','tgy','tha','thc','thd','the','thf','thh','thi','thk','thl','thm','thp','thq','thr','ths','tht','thu','thv','thw','thx','thy','thz','tia','tic','tid','tie','tif','tig','tih','tii','tij','tik','til','tim','tin','tio','tip','tiq','tir','tis','tit','tiu','tiv','tiw','tix','tiy','tiz','tja','tjg','tji','tjm','tjn','tjo','tjs','tju','tka','tkb','tkd','tke','tkf','tkk','tkl','tkm','tkn','tkp','tkq','tkr','tks','tkt','tkw','tkx','tkz','tla','tlb','tlc','tld','tle','tlf','tlg','tlh','tli','tlj','tlk','tll','tlm','tln','tlo','tlp','tlq','tlr','tls','tlt','tlu','tlv','tlw','tlx','tly','tlz','tma','tmb','tmc','tmd','tme','tmf','tmg','tmh','tmi','tmj','tmk','tml','tmm','tmn','tmo','tmp','tmq','tmr','tms','tmt','tmu','tmv','tmw','tmx','tmy','tmz','tna','tnb','tnc','tnd','tne','tnf','tng','tnh','tni','tnj','tnk','tnl','tnm','tnn','tno','tnp','tnq','tnr','tns','tnt','tnu','tnv','tnw','tnx','tny','tnz','tob','toc','tod','toe','tof','tog','toh','toi','toj','tol','tom','ton','too','top','toq','tor','tos','tot','tou','tov','tow','tox','toy','toz','tpa','tpc','tpe','tpg','tpi','tpj','tpk','tpl','tpm','tpn','tpo','tpp','tpq','tpr','tpt','tpu','tpv','tpw','tpx','tpy','tpz','tqb','tql','tqm','tqn','tqo','tqp','tqq','tqr','tqt','tqu','tqw','tra','trb','trc','trd','tre','trf','trg','trh','tri','trj','trl','trm','trn','tro','trp','trq','trr','trs','trt','tru','trv','trw','trx','try','trz','tsa','tsb','tsc','tsd','tse','tsf','tsg','tsh','tsi','tsj','tsk','tsl','tsm','tsn','tso','tsp','tsq','tsr','tss','tsu','tsv','tsw','tsx','tsz','tta','ttb','ttc','ttd','tte','ttf','ttg','tth','tti','ttj','ttk','ttl','ttm','ttn','tto','ttp','ttq','ttr','tts','ttt','ttu','ttv','ttw','ttx','tty','ttz','tua','tub','tuc','tud','tue','tuf','tug','tuh','tui','tuj','tuk','tul','tum','tun','tuo','tuq','tur','tus','tuu','tuv','tux','tuy','tuz','tva','tvd','tve','tvk','tvl','tvm','tvn','tvo','tvs','tvt','tvw','tvy','twa','twb','twc','twd','twe','twf','twg','twh','twi','twl','twn','two','twp','twq','twr','twt','twu','tww','twx','twy','txa','txb','txc','txe','txg','txh','txi','txm','txn','txo','txq','txr','txs','txt','txu','txx','txy','tya','tye','tyh','tyi','tyj','tyl','tyn','typ','tyr','tys','tyt','tyu','tyv','tyx','tyz','tza','tzb','tzc','tze','tzh','tzj','tzm','tzn','tzo','tzs','tzt','tzu','tzx','tzz','uam','uan','uar','uba','ubi','ubm','ubr','ubu','uby','uda','ude','udi','udj','udl','udm','udu','ues','ufi','uga','ugb','uge','ugn','ugo','ugy','uha','uhn','uig','uis','uiv','uji','uka','ukg','ukh','ukl','ukp','ukq','ukr','uks','uku','ukw','ula','ulb','ulc','ulf','uli','ulk','ull','ulm','uln','uma','umb','umc','umd','umg','umi','umm','umo','ump','umr','ums','umu','una','und','une','ung','unk','unm','unp','unz','uok','upi','upv','ura','urb','urc','urd','ure','urf','urg','urh','uri','urk','url','urm','urn','uro','urp','urr','urt','uru','urv','urw','urx','ury','urz','usa','ush','usi','usk','usp','usu','uta','ute','utp','utr','utu','uum','uun','uur','uuu','uve','uvh','uvl','uwa','uya','uzb','uzn','uzs','vaa','vae','vaf','vag','vah','vai','vaj','val','vam','van','vao','vap','var','vas','vau','vav','vay','vbb','vec','ved','vel','vem','ven','veo','vep','ver','vgr','vic','vid','vie','vif','vig','vil','vin','vis','vit','viv','vka','vki','vkj','vkk','vkl','vkm','vko','vkp','vkt','vku','vky','vlp','vlr','vls','vma','vmb','vmc','vmd','vme','vmf','vmg','vmh','vmi','vmj','vmk','vml','vmm','vmo','vmp','vmq','vmr','vms','vmu','vmv','vmw','vmx','vmy','vmz','vnk','vnm','vnp','vol','vor','vot','vrs','vrt','vsi','vsl','vum','vun','vut','waa','wab','wac','wad','wae','waf','wag','wah','wai','waj','wal','wam','wan','wao','wap','waq','war','was','wat','wau','wav','waw','wax','way','waz','wba','wbb','wbe','wbf','wbh','wbi','wbj','wbk','wbl','wbm','wbp','wbq','wbr','wbt','wbv','wbw','wca','wci','wdd','wdg','wdj','wdu','wea','wec','wed','weh','wei','wem','weo','wep','wer','wes','wet','weu','wew','wfg','wga','wgg','wgi','wgo','wgw','wgy','wha','whg','whk','whu','wib','wic','wie','wif','wig','wih','wii','wij','wik','wil','wim','win','wir','wit','wiu','wiv','wiw','wiy','wja','wji','wka','wkd','wkw','wla','wlc','wlg','wli','wlk','wll','wlm','wln','wlo','wlr','wls','wlu','wlv','wlw','wlx','wly','wma','wmb','wmc','wme','wmh','wmi','wmm','wmn','wmo','wms','wmt','wmw','wnb','wnc','wnd','wne','wng','wni','wnk','wnm','wno','wnp','wnu','woa','wob','woc','wod','woe','wof','wog','woi','wok','wol','wom','won','woo','wor','wos','wow','woy','wpc','wra','wrb','wrd','wre','wrg','wrh','wri','wrl','wrm','wrn','wrp','wrr','wrs','wru','wrv','wrw','wrx','wry','wrz','wsa','wsi','wsk','wsr','wss','wsu','wsv','wtf','wti','wtk','wtm','wtw','wua','wub','wud','wuh','wul','wum','wun','wur','wut','wuu','wuv','wux','wuy','wwa','wwo','wwr','www','wxa','wya','wyb','wyr','wyy','xac','xad','xae','xag','xah','xai','xal','xam','xan','xao','xap','xaq','xar','xas','xat','xau','xav','xaw','xay','xba','xbc','xbi','xbm','xbo','xbr','xbw','xbx','xcb','xcc','xce','xcg','xch','xcl','xcm','xcn','xco','xcr','xct','xcu','xcv','xcw','xcy','xdc','xdm','xdy','xeb','xed','xeg','xel','xem','xep','xer','xes','xet','xeu','xfa','xga','xgf','xgl','xgr','xha','xhc','xhd','xhe','xho','xhr','xht','xhu','xhv','xia','xib','xii','xil','xin','xip','xir','xiv','xiy','xka','xkb','xkc','xkd','xke','xkf','xkg','xkh','xki','xkj','xkk','xkl','xkm','xkn','xko','xkp','xkq','xkr','xks','xkt','xku','xkv','xkw','xkx','xky','xkz','xla','xlb','xlc','xld','xle','xlg','xli','xln','xlo','xlp','xls','xlu','xly','xma','xmb','xmc','xmd','xme','xmf','xmg','xmh','xmi','xmj','xmk','xml','xmm','xmo','xmp','xmq','xmr','xms','xmt','xmu','xmv','xmw','xmx','xmy','xmz','xna','xnb','xng','xnh','xnn','xno','xnr','xns','xod','xog','xoi','xok','xom','xon','xoo','xop','xor','xow','xpc','xpe','xpg','xpi','xpm','xpn','xpo','xpp','xpr','xps','xpu','xpy','xqt','xra','xrb','xre','xri','xrm','xrn','xrr','xrt','xrw','xsa','xsb','xsc','xsd','xse','xsh','xsi','xsj','xsk','xsl','xsm','xsn','xso','xsp','xsq','xsr','xss','xst','xsu','xsv','xsy','xta','xtb','xtc','xtd','xte','xtg','xti','xtj','xtl','xtm','xtn','xto','xtp','xtr','xts','xtt','xtu','xty','xtz','xua','xub','xuf','xug','xuj','xum','xuo','xup','xur','xut','xuu','xve','xvi','xvn','xvo','xvs','xwc','xwe','xwg','xwl','xwo','xwr','xxk','xzh','xzm','yaa','yab','yac','yad','yae','yaf','yag','yah','yai','yaj','yak','yal','yam','yao','yap','yaq','yar','yas','yat','yau','yav','yaw','yax','yay','yaz','yba','ybb','ybd','ybe','ybh','ybi','ybj','ybl','ybm','ybn','ybo','ybx','yby','ycl','ycn','ydd','ydg','ydk','yds','yea','yec','yee','yei','yej','yel','yen','yer','yes','yet','yeu','yev','yey','ygm','ygr','ygw','yhd','yia','yib','yid','yif','yig','yih','yii','yij','yik','yil','yim','yin','yio','yip','yiq','yir','yis','yit','yiu','yiv','yix','yiy','yiz','yka','ykg','yki','ykk','ykm','yko','ykr','yky','yla','yle','ylg','yli','yll','ylm','ylo','ylr','ylu','yly','yma','ymb','yme','ymg','ymh','ymj','ymk','yml','ymm','ymn','ymp','yms','ymt','ynd','yng','ynh','ynk','ynl','ynn','yno','yns','ynu','yob','yog','yoi','yok','yom','yon','yor','yos','yox','yoy','ypl','ypw','yra','yrb','yre','yri','yrk','yrl','yrn','yrs','yrw','ysc','ysl','ysn','yso','ysp','ysr','yss','yua','yub','yuc','yud','yue','yuf','yug','yui','yuj','yuk','yul','yum','yun','yup','yuq','yur','yus','yut','yuu','yuw','yux','yuy','yuz','yva','yvt','ywa','ywl','ywm','ywn','ywq','ywr','ywt','ywu','yww','yym','yyu','zaa','zab','zac','zad','zae','zaf','zag','zah','zai','zaj','zak','zal','zam','zao','zap','zaq','zar','zas','zat','zau','zav','zaw','zax','zay','zaz','zca','zdj','zea','zeg','zen','zga','zgr','zha','zhb','zhi','zho','zhw','zia','zib','zik','zim','zin','zir','ziw','ziz','zka','zkb','zkg','zkh','zkk','zko','zkp','zkr','zkt','zku','zkv','zkz','zma','zmb','zmc','zmd','zme','zmf','zmg','zmh','zmi','zmj','zmk','zml','zmm','zmn','zmo','zmp','zmq','zmr','zms','zmt','zmu','zmv','zmw','zmx','zmy','zmz','zna','zne','zng','znk','zns','zoc','zoh','zom','zoo','zoq','zor','zos','zpa','zpb','zpc','zpd','zpe','zpf','zpg','zph','zpi','zpj','zpk','zpl','zpm','zpn','zpo','zpp','zpq','zpr','zps','zpt','zpu','zpv','zpw','zpx','zpy','zpz','zra','zrg','zrn','zro','zrp','zrs','zsk','zsl','zsr','ztc','zte','ztg','ztl','ztm','ztn','ztp','ztq','zts','ztt','ztu','ztx','zty','zua','zuh','zul','zum','zun','zuy','zwa','zxx','zyp','zza']
def validate_iso_codes():
#if options.shortdesc != None:
# if not options.shortdesc in codelist_iso639_1:
# print "Warning! ShortDesc is not a valid ISO 639-1 code."
if options.langcode != None:
if not ((options.langcode in codelist_iso639_2) or (options.langcode in codelist_iso639_3)):
print "Warning! LangCode is not a valid ISO 639-2 or ISO 639-3 code."
#KB_LAYOUT = 'pk'
#KB_SHORT_DESC = 'ur'
#KB_DESC = 'Urdu (Pakistan)'
#KB_LANGCODE = 'urd'
KB_LAYOUT = options.kbname
KB_SHORT_DESC = options.shortdesc
KB_DESC = options.description
KB_LANGCODE = options.langcode
XKBCONF_XML = "/usr/share/X11/xkb/rules/evdev.xml"
XKB_SYMBOLS_DIR = "/usr/share/X11/xkb/symbols/"
# in-place prettyprint formatter
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
def backup_xml(xmlfile, xmlfilebak):
shutil.copyfile(xmlfile, xmlfilebak)
def gen_xml(xmlfile):
tree = ET.ElementTree(file=xmlfile)
root = tree.getroot()
layoutlist = tree.find('layoutList')
#Play it safe. Make sure we are not overwriting an existing layout.
for layout in layoutlist:
if layout.find('configItem/name').text == KB_LAYOUT and not options.forced:
print "Keyboard layout {0} already exists in {1}. Exiting to prevent unexpected behavior (safe mode).".format(KB_LAYOUT, xmlfile)
return 1
target_layout = ET.Element('layout')
target_configitem = ET.SubElement(target_layout, 'configItem')
target_name = ET.SubElement(target_configitem, 'name')
target_name.text = KB_LAYOUT
target_shortdescription = ET.SubElement(target_configitem, 'shortDescription')
target_shortdescription.text = KB_SHORT_DESC
target_description = ET.SubElement(target_configitem, 'description')
target_description.text = KB_DESC
target_languagelist = ET.SubElement(target_configitem, 'languageList')
target_iso639id = ET.SubElement(target_languagelist, 'iso639Id')
target_iso639id.text = KB_LANGCODE
indent(target_layout)
print "Generated XML:"
ET.dump(target_layout)
layoutlist.append(target_layout)
#indent(root)
indent(target_layout,2)
#ET.dump(root)
tree.write(xmlfile)
return 0
def copy_kbfile(kbfile):
OUTFILE = XKB_SYMBOLS_DIR+'/'+KB_LAYOUT
if os.path.exists(OUTFILE) and not options.forced:
print "File {0} already exists. Not overwriting (safe mode).".format(OUTFILE)
exit(1)
else:
shutil.copyfile(kbfile, OUTFILE)
def main():
try:
copy_kbfile(options.filename)
print "Copied the keyboard layout file", options.filename
except:
print "Could not copy", options.filename
exit(1)
XKBCONF_XML_BAK = XKBCONF_XML+'-'+time.strftime('%Y-%m-%d-%H:%M:%S')
try:
backup_xml(XKBCONF_XML, XKBCONF_XML_BAK)
print "Backed up", XKBCONF_XML, "to", XKBCONF_XML_BAK
except:
print "Could not make a backup of", XKBCONF_XML, "to", XKBCONF_XML_BAK
exit(1)
try:
if gen_xml(XKBCONF_XML) == 0:
print "Generated new XML config at", XKBCONF_XML
except IOError:
print "Could not write new config to", XKBCONF_XML
exit(1)
except:
print "Could not generate", XKBCONF_XML
exit(1)
return 0
if __name__ == '__main__':
main()