mirror of
https://gitlab.freedesktop.org/uchardet/uchardet.git
synced 2025-12-06 16:56:40 +08:00
src, script: add concept of alphabet_mapping in language models.
This allows to handle cases where some characters are actually alternative/variants of another. For instance, a same word can be written with both variants, while both are considered correct and equivalent. Browsing a bit Slovenian Wikipedia, it looks like they only use them for titles there. I use this the first time on characters with diacritics in Slovene. Indeed these are so rarely used that they would hardly show in the stats and worse, any sequence using these in tested text would likely show as negative sequences hence drop the confidence in Slovenian. As a consequence, various Slovene text would show up as Slovak as it's close enough and contains the same character with diacritics in a common way.
This commit is contained in:
parent
ba7d72e3b0
commit
338a51564a
@ -115,6 +115,8 @@ if not hasattr(lang, 'custom_case_mapping'):
|
||||
lang.custom_case_mapping = None
|
||||
if not hasattr(lang, 'alphabet') or lang.alphabet is None:
|
||||
lang.alphabet = None
|
||||
if not hasattr(lang, 'alphabet_mapping') or lang.alphabet_mapping is None:
|
||||
lang.alphabet_mapping = None
|
||||
if not hasattr(lang, 'unicode_ranges') or lang.unicode_ranges is None:
|
||||
lang.unicode_ranges = None
|
||||
if not hasattr(lang, 'frequent_ranges') or lang.frequent_ranges is None:
|
||||
@ -155,6 +157,20 @@ if lang.alphabet is not None:
|
||||
#alphabet.append(l)
|
||||
lang.alphabet = list(set(lang.alphabet))
|
||||
|
||||
if lang.alphabet_mapping is not None:
|
||||
alphabet_mapping = {}
|
||||
for char in lang.alphabet_mapping:
|
||||
# Allowing to provide an alphabet in string format rather than list.
|
||||
for alt_char in list(lang.alphabet_mapping[char]):
|
||||
# While it's easier to write from main character to
|
||||
# equivalencies in the language file, we reverse the mapping
|
||||
# for simpler usage.
|
||||
if lang.case_mapping or lang.custom_case_mapping is not None:
|
||||
alphabet_mapping[alt_char] = local_lowercase(char, lang)
|
||||
else:
|
||||
alphabet_mapping[alt_char] = char
|
||||
lang.alphabet_mapping = alphabet_mapping
|
||||
|
||||
def normalize_codepoint_ranges(input_range):
|
||||
output_range = []
|
||||
if input_range is not None:
|
||||
@ -213,6 +229,11 @@ def process_text(content, lang):
|
||||
# In python 3, strings are UTF-8.
|
||||
# Looping through them return expected characters.
|
||||
for char in content:
|
||||
# Map to main equivalent character.
|
||||
if lang.alphabet_mapping is not None and \
|
||||
char in lang.alphabet_mapping:
|
||||
char = lang.alphabet_mapping[char]
|
||||
|
||||
unicode_value = ord(char)
|
||||
is_letter = False
|
||||
if unicode_value in characters:
|
||||
@ -501,6 +522,8 @@ for charset in charsets:
|
||||
# composed lowercase, we lowercase it.
|
||||
if lang.case_mapping or lang.custom_case_mapping is not None:
|
||||
uchar = local_lowercase(uchar, lang)
|
||||
if lang.alphabet_mapping is not None and uchar in lang.alphabet_mapping:
|
||||
uchar = lang.alphabet_mapping[uchar]
|
||||
for order, (char, ratio) in enumerate(sorted_ratios):
|
||||
if char == ord(uchar):
|
||||
CTOM_str += '{:3},'.format(min(249, order))
|
||||
@ -549,7 +572,21 @@ if lang.case_mapping:
|
||||
# This happens for some case such as 'SS' as uppercase of 'ß'.
|
||||
# Just ignore such cases.
|
||||
sys.stderr.write("Ignoring '{}' as uppercase equivalent of '{}'.\n".format(uppercased, char))
|
||||
sorted_chars += equivalent
|
||||
|
||||
if lang.alphabet_mapping is not None:
|
||||
for alt_c in lang.alphabet_mapping:
|
||||
for char, ratio, order in sorted_chars:
|
||||
if alt_c == chr(char):
|
||||
sys.stderr.write("ALREADY {}\n".format(alt_c))
|
||||
exit(1)
|
||||
elif char == ord(lang.alphabet_mapping[alt_c]):
|
||||
equivalent += [(ord(alt_c), ratio, order)]
|
||||
break
|
||||
else:
|
||||
sys.stderr.write("Base equivalent for {} not found in frequent characters!\n".format(alt_c))
|
||||
exit(1)
|
||||
|
||||
sorted_chars += equivalent
|
||||
|
||||
# Order by code point.
|
||||
sorted_chars = sorted(sorted_chars, key=operator.itemgetter(0))
|
||||
|
||||
@ -1,150 +1,53 @@
|
||||
= Logs of language model for Slovene (sl) =
|
||||
|
||||
- Generated by BuildLangModel.py
|
||||
- Started: 2021-03-21 12:30:22.611188
|
||||
- Started: 2021-03-21 14:46:51.759879
|
||||
- Maximum depth: 4
|
||||
- Max number of pages: 100
|
||||
- Max number of pages: 1
|
||||
|
||||
== Parsed pages ==
|
||||
|
||||
Ljubljana (revision 5468628)
|
||||
1689 (revision 4230028)
|
||||
1918 (revision 5249637)
|
||||
1926 (revision 5456617)
|
||||
1929 (revision 5444196)
|
||||
1930. (revision 5118014)
|
||||
2011 (revision 5469547)
|
||||
25. junij (revision 5447338)
|
||||
A1 (radio) (revision 5360678)
|
||||
ACH Volley (revision 5089458)
|
||||
AKC Metelkova mesto (revision 5323280)
|
||||
Abecedarium (revision 5092193)
|
||||
Academia operosorum Labacensis (revision 5228146)
|
||||
Adam Bohorič (revision 5414191)
|
||||
Ajdovščina (revision 5423173)
|
||||
Albert Kosmač (revision 5368699)
|
||||
Albin Belar (revision 5197298)
|
||||
Aleksander Bajt (revision 4917916)
|
||||
Aleksandrija (revision 5405515)
|
||||
Aleš Kunaver (revision 5029295)
|
||||
Alojzij Šuštar (revision 5442498)
|
||||
Alpe (revision 5464842)
|
||||
Amsterdam (revision 5359727)
|
||||
Anastasius Grün (revision 5070788)
|
||||
Andorra la Vella (revision 5390252)
|
||||
Andrej Fleischmann (revision 4930149)
|
||||
Andrej Smole (revision 5467820)
|
||||
Angela Vode (revision 5466809)
|
||||
Anica Cevc (revision 5414746)
|
||||
Anja Bukovec (revision 5041799)
|
||||
Anton Aleksander Auersperg (revision 5070788)
|
||||
Anton Alojzij Wolf (revision 5361749)
|
||||
Anton Bitenc (revision 5463597)
|
||||
Anton Bonaventura Jeglič (revision 5414522)
|
||||
Anton Cerar (revision 5376771)
|
||||
Anton Codelli (izumitelj) (revision 5161385)
|
||||
Anton Foerster (revision 5270593)
|
||||
Anton Gvajc (revision 5035801)
|
||||
Anton Lajovic (revision 4867406)
|
||||
Anton Melik (revision 5272303)
|
||||
Anton Ocvirk (revision 5470942)
|
||||
Anton Peterlin (revision 4979305)
|
||||
Anton Stres (revision 5464457)
|
||||
Anton Tomaž Linhart (revision 5413399)
|
||||
Anton Verovšek (revision 5412417)
|
||||
Anton Vodnik (revision 5180239)
|
||||
Anton Šivic (revision 5410565)
|
||||
Antwerpen (revision 5375367)
|
||||
Arena Stožice (revision 5462141)
|
||||
Argentinski park, Ljubljana (revision 5398130)
|
||||
Argonavti (revision 5425545)
|
||||
Arne Hodalič (revision 5417283)
|
||||
Art nouveau (revision 5371096)
|
||||
Ateizem (revision 5427207)
|
||||
Atene (revision 5360039)
|
||||
Ati Soss (revision 5463553)
|
||||
Atila (revision 5425308)
|
||||
Avgusta Danilova (revision 4788392)
|
||||
Avstro-Ogrska (revision 5431606)
|
||||
Avtobusna postaja Ljubljana (revision 4479008)
|
||||
Avtocesta A1 (revision 5292269)
|
||||
Avtocesta A2 (revision 5387166)
|
||||
Aškerčeva cesta, Ljubljana (revision 4578067)
|
||||
BTC (revision 5450525)
|
||||
Bajer (potok) (revision 5147457)
|
||||
Bakrorez (revision 5375208)
|
||||
Bangkok (revision 5378204)
|
||||
Barje (revision 5180470)
|
||||
Barok (revision 5463042)
|
||||
Bejrut (revision 5356724)
|
||||
Benetke (revision 5424094)
|
||||
Beograd (revision 5448139)
|
||||
Berlin (revision 5435344)
|
||||
Bern (revision 5466493)
|
||||
Biblija (revision 5404188)
|
||||
Bicike(lj) (revision 5468628)
|
||||
Bine Rogelj (revision 5086972)
|
||||
Biodiverziteta (revision 5352270)
|
||||
Bizoviški potok (revision 5305268)
|
||||
Bled (revision 5469179)
|
||||
Bleiweisova cesta, Ljubljana (revision 5184903)
|
||||
Bogo Grafenauer (revision 5311308)
|
||||
Bogota (revision 5363243)
|
||||
Bojan Adamič (revision 5409135)
|
||||
Bojan Čop (revision 5247252)
|
||||
Bojan Štih (revision 5305724)
|
||||
Boris Kobe (revision 5296972)
|
||||
Boris Sket (revision 5413264)
|
||||
Borut Lesjak (revision 5273043)
|
||||
Botanični vrt, Ljubljana (revision 5142111)
|
||||
Botanični vrt Ljubljana (revision 5142111)
|
||||
Botanični vrt Univerze v Ljubljani (revision 5142111)
|
||||
Bovec (revision 5330651)
|
||||
Boštjan Putrih (revision 5124433)
|
||||
Boštjan Žekš (revision 5415317)
|
||||
Božena Ravnihar (revision 5415042)
|
||||
Božo Vodušek (revision 5122962)
|
||||
Božo Škerlj (revision 5268384)
|
||||
|
||||
== End of Parsed pages ==
|
||||
|
||||
- Wikipedia parsing ended at: 2021-03-21 12:38:56.631283
|
||||
- Wikipedia parsing ended at: 2021-03-21 14:47:12.578759
|
||||
|
||||
57 characters appeared 519434 times.
|
||||
34 characters appeared 32235 times.
|
||||
|
||||
Most Frequent characters:
|
||||
[ 0] Char e: 10.223242991409881 %
|
||||
[ 1] Char a: 10.130257164529084 %
|
||||
[ 2] Char i: 8.972265966417293 %
|
||||
[ 3] Char o: 8.507144314773388 %
|
||||
[ 4] Char n: 7.334329289187846 %
|
||||
[ 5] Char r: 5.438226993227244 %
|
||||
[ 6] Char s: 5.162157271183634 %
|
||||
[ 7] Char l: 5.052614961669818 %
|
||||
[ 8] Char t: 4.829679997843807 %
|
||||
[ 9] Char j: 4.445223069725894 %
|
||||
[10] Char v: 4.3826549667522725 %
|
||||
[11] Char k: 3.543664835185991 %
|
||||
[12] Char d: 3.1351432520782234 %
|
||||
[13] Char p: 2.8430945991213514 %
|
||||
[14] Char m: 2.7564618411578756 %
|
||||
[15] Char u: 2.3069340859473964 %
|
||||
[16] Char z: 2.0064146744340956 %
|
||||
[17] Char b: 1.937300985303234 %
|
||||
[18] Char g: 1.6027060223242993 %
|
||||
[19] Char h: 1.1235306121663196 %
|
||||
[20] Char č: 1.0794441642249064 %
|
||||
[21] Char c: 1.048256371358055 %
|
||||
[22] Char š: 0.9687467512715764 %
|
||||
[23] Char ž: 0.5263421339380941 %
|
||||
[24] Char f: 0.41391206582549467 %
|
||||
|
||||
The first 25 characters have an accumulated ratio of 0.9976974938105708.
|
||||
|
||||
880 sequences found.
|
||||
|
||||
First 449 (typical positive ratio): 0.9950499684040537
|
||||
Next 172 (621-449): 0.003957684836286113
|
||||
Rest: 0.000992346759660201
|
||||
|
||||
- Processing end: 2021-03-21 12:38:56.993560
|
||||
[ 0] Char e: 10.097719869706841 %
|
||||
[ 1] Char a: 9.846440204746393 %
|
||||
[ 2] Char i: 8.760663874670389 %
|
||||
[ 3] Char o: 8.515588645881806 %
|
||||
[ 4] Char n: 7.299519156196681 %
|
||||
[ 5] Char l: 5.546765937645416 %
|
||||
[ 6] Char j: 5.264464091825656 %
|
||||
[ 7] Char r: 5.053513261982317 %
|
||||
[ 8] Char s: 5.000775554521483 %
|
||||
[ 9] Char t: 4.814642469365596 %
|
||||
[10] Char v: 4.374127501163332 %
|
||||
[11] Char k: 3.4993020009306655 %
|
||||
[12] Char m: 2.9253916550333487 %
|
||||
[13] Char d: 2.888165038002172 %
|
||||
[14] Char p: 2.869551729486583 %
|
||||
[15] Char u: 2.574841011323096 %
|
||||
[16] Char b: 2.233597021870638 %
|
||||
[17] Char z: 1.8458197611292075 %
|
||||
[18] Char g: 1.48596246316116 %
|
||||
[19] Char č: 1.181945090739879 %
|
||||
[20] Char š: 1.0671630215604158 %
|
||||
[21] Char h: 1.0361408407011012 %
|
||||
[22] Char c: 0.9492787342950209 %
|
||||
[23] Char ž: 0.5739103458973166 %
|
||||
[24] Char f: 0.210950829843338 %
|
||||
[25] Char x: 0.018613308515588647 %
|
||||
[26] Char w: 0.018613308515588647 %
|
||||
[27] Char y: 0.015511090429657206 %
|
||||
[28] Char ü: 0.009306654257794323 %
|
||||
[29] Char ö: 0.006204436171862882 %
|
||||
[30] Char q: 0.006204436171862882 %
|
||||
[31] Char ř: 0.003102218085931441 %
|
||||
[32] Char á: 0.003102218085931441 %
|
||||
[33] Char ý: 0.003102218085931441 %
|
||||
@ -58,6 +58,17 @@ charsets = ['ISO-8859-2', 'ISO-8859-16',
|
||||
# exist. Maybe this would have to be separate models for variants of
|
||||
# the language.
|
||||
alphabet = 'abcčdefghijklmnoprsštuvzž'
|
||||
#alphabet = 'abcčdefghijklmnoprsštuvzž' + 'áȃȁéêèẹ́ȇẹ̑ȅə̀ə̏íìȋȉóôòóọ́ȏọ̑ȍúùȗȕŕȓ'
|
||||
# Equivalent letters. This is because Slovene use some diacritics but
|
||||
# they are so rarely used (in title mostly for Wikipedia) that counting
|
||||
# them in the stats would be counter-productive. Moreover they are not
|
||||
# letter of their own, but really replace the non-diatrical letter to
|
||||
# help with disambiguition. For instance "gol" both means "naked" and
|
||||
# "goal" and could sometimes be written "gòl" for the former meaning or
|
||||
# "gól" for the latter.
|
||||
alphabet_mapping = {'a': 'áȃȁ', 'e': 'éêèẹ́ȇ ẹ̑ȅə̀ə̏', 'i': 'íìȋȉ',
|
||||
'o': 'óôòóọ́ȏ ọ̑ȍ', 'u': 'úùȗȕ', 'r': 'ŕȓ'}
|
||||
|
||||
start_pages = ['Ljubljana']
|
||||
wikipedia_code = code
|
||||
case_mapping = True
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
/**
|
||||
* Generated by BuildLangModel.py
|
||||
* On: 2021-03-21 12:38:56.631590
|
||||
* On: 2021-03-21 14:41:34.895906
|
||||
**/
|
||||
|
||||
/* Character Mapping Table:
|
||||
@ -68,18 +68,18 @@ static const unsigned char Iso_8859_2_CharToOrderMap[] =
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 1X */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* 2X */
|
||||
NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,SYM,SYM,SYM,SYM,SYM,SYM, /* 3X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 4X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 6X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 4X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 6X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 8X */
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 9X */
|
||||
SYM, 57,SYM, 48,SYM, 58, 59,SYM,SYM, 22, 60, 61, 62,SYM, 23, 63, /* AX */
|
||||
SYM, 64,SYM, 48,SYM, 65, 66,SYM,SYM, 22, 67, 68, 69,SYM, 23, 70, /* BX */
|
||||
71, 34, 72, 73, 33, 74, 30, 45, 20, 29, 75, 46, 76, 37, 51, 77, /* CX */
|
||||
35, 53, 78, 36, 49, 79, 31,SYM, 41, 80, 81, 82, 28, 43, 83, 44, /* DX */
|
||||
84, 34, 85, 86, 33, 87, 30, 45, 20, 29, 88, 46, 89, 37, 51, 90, /* EX */
|
||||
35, 53, 91, 36, 49, 92, 31,SYM, 41, 93, 94, 95, 28, 43, 96,SYM, /* FX */
|
||||
SYM, 33,SYM, 34,SYM, 35, 36,SYM,SYM, 20, 37, 38, 39,SYM, 23, 40, /* AX */
|
||||
SYM, 41,SYM, 42,SYM, 43, 44,SYM,SYM, 20, 45, 46, 47,SYM, 23, 48, /* BX */
|
||||
7, 2, 49, 50, 51, 52, 53, 54, 19, 1, 55, 56, 57, 3, 58, 59, /* CX */
|
||||
60, 61, 62, 0, 0, 63, 29,SYM, 31, 64, 15, 65, 28, 32, 66, 67, /* DX */
|
||||
7, 2, 68, 69, 70, 71, 72, 73, 19, 1, 74, 75, 76, 3, 77, 78, /* EX */
|
||||
79, 80, 81, 0, 0, 82, 29,SYM, 31, 83, 15, 84, 28, 32, 85,SYM, /* FX */
|
||||
};
|
||||
/*X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
|
||||
@ -89,18 +89,18 @@ static const unsigned char Iso_8859_16_CharToOrderMap[] =
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 1X */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* 2X */
|
||||
NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,SYM,SYM,SYM,SYM,SYM,SYM, /* 3X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 4X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 6X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 4X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 6X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 8X */
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 9X */
|
||||
SYM, 97, 98, 48,SYM,SYM, 22,SYM, 22,SYM, 99,SYM,100,SYM,101,102, /* AX */
|
||||
SYM,SYM, 20, 48, 23,SYM,SYM,SYM, 23, 20,103,SYM, 52, 52,104,105, /* BX */
|
||||
39, 34,106,107, 33, 30, 47, 45, 38, 29,108, 46, 50, 37, 51,109, /* CX */
|
||||
35, 53, 56, 36, 49,110, 31,111,112, 54,113, 55, 28,114,115, 44, /* DX */
|
||||
39, 34,116,117, 33, 30, 47, 45, 38, 29,118, 46, 50, 37, 51,119, /* EX */
|
||||
35, 53, 56, 36, 49,120, 31,121,122, 54,123, 55, 28,124,125,126, /* FX */
|
||||
SYM, 86, 87, 88,SYM,SYM, 20,SYM, 20,SYM, 89,SYM, 90,SYM, 91, 92, /* AX */
|
||||
SYM,SYM, 19, 93, 23,SYM,SYM,SYM, 23, 19, 94,SYM, 95, 96, 97, 98, /* BX */
|
||||
99, 2,100,101,102,103,104,105, 1, 1, 1,106, 3, 3,107,108, /* CX */
|
||||
109,110, 0, 0, 0,111, 29,112,113, 15, 15,114, 28,115,116,117, /* DX */
|
||||
118, 2,119,120,121,122,123,124, 1, 1, 1,125, 3, 3,126,127, /* EX */
|
||||
128,129, 0, 0, 0,130, 29,131,132, 15, 15,133, 28,134,135,136, /* FX */
|
||||
};
|
||||
/*X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
|
||||
@ -110,18 +110,18 @@ static const unsigned char Windows_1250_CharToOrderMap[] =
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 1X */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* 2X */
|
||||
NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,SYM,SYM,SYM,SYM,SYM,SYM, /* 3X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 4X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 6X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
SYM,ILL,SYM,ILL,SYM,SYM,SYM,SYM,ILL,SYM, 22,SYM,127,128, 23,129, /* 8X */
|
||||
ILL,SYM,SYM,SYM,SYM,SYM,SYM,SYM,ILL,SYM, 22,SYM,130,131, 23,132, /* 9X */
|
||||
SYM,SYM,SYM, 48,SYM,133,SYM,SYM,SYM,SYM,134,SYM,SYM,SYM,SYM,135, /* AX */
|
||||
SYM,SYM,SYM, 48,SYM,SYM,SYM,SYM,SYM,136,137,SYM,138,SYM,139,140, /* BX */
|
||||
141, 34,142,143, 33,144, 30, 45, 20, 29,145, 46,146, 37, 51,147, /* CX */
|
||||
35, 53,148, 36, 49,149, 31,SYM, 41,150,151,152, 28, 43,153, 44, /* DX */
|
||||
154, 34,155,156, 33,157, 30, 45, 20, 29,158, 46,159, 37, 51,160, /* EX */
|
||||
35, 53,161, 36, 49,162, 31,SYM, 41,163,164,165, 28, 43,166,SYM, /* FX */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 4X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 6X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
SYM,ILL,SYM,ILL,SYM,SYM,SYM,SYM,ILL,SYM, 20,SYM,137,138, 23,139, /* 8X */
|
||||
ILL,SYM,SYM,SYM,SYM,SYM,SYM,SYM,ILL,SYM, 20,SYM,140,141, 23,142, /* 9X */
|
||||
SYM,SYM,SYM,143,SYM,144,SYM,SYM,SYM,SYM,145,SYM,SYM,SYM,SYM,146, /* AX */
|
||||
SYM,SYM,SYM,147,SYM,SYM,SYM,SYM,SYM,148,149,SYM,150,SYM,151,152, /* BX */
|
||||
7, 2,153,154,155,156,157,158, 19, 1,159,160,161, 3,162,163, /* CX */
|
||||
164,165,166, 0, 0,167, 29,SYM, 31,168, 15,169, 28, 32,170,171, /* DX */
|
||||
7, 2,172,173,174,175,176,177, 19, 1,178,179,180, 3,181,182, /* EX */
|
||||
183,184,185, 0, 0,186, 29,SYM, 31,187, 15,188, 28, 32,189,SYM, /* FX */
|
||||
};
|
||||
/*X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
|
||||
@ -131,18 +131,18 @@ static const unsigned char Ibm852_CharToOrderMap[] =
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 1X */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* 2X */
|
||||
NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,SYM,SYM,SYM,SYM,SYM,SYM, /* 3X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 4X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 6X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
45, 28, 29,167, 33,168, 30, 45, 48, 46,169,170, 51,171, 33, 30, /* 8X */
|
||||
29,172,173, 49, 31,174,175,176,177, 31, 28,178,179, 48,SYM, 20, /* 9X */
|
||||
34, 37, 36,180,181,182, 23, 23,183,184,SYM,185, 20,186,SYM,SYM, /* AX */
|
||||
SYM,SYM,SYM,SYM,SYM, 34,187,188,189,SYM,SYM,SYM,SYM,190,191,SYM, /* BX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,192,193,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* CX */
|
||||
35, 35,194, 46,195,196, 37, 51,197,SYM,SYM,SYM,SYM,198,199,SYM, /* DX */
|
||||
36, 44, 49, 53, 53,200, 22, 22,201,202,203,204, 43, 43,205,SYM, /* EX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,206, 41, 41,SYM,SYM, /* FX */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 4X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 6X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
190, 28, 1,191,192,193,194,195,196,197,198,199,200,201,202,203, /* 8X */
|
||||
1,204,205, 0, 29,206,207,208,209, 29, 28,210,211,212,SYM, 19, /* 9X */
|
||||
2, 3, 0, 15,213,214, 23, 23,215,216,SYM,217, 19,218,SYM,SYM, /* AX */
|
||||
SYM,SYM,SYM,SYM,SYM, 2,219,220,221,SYM,SYM,SYM,SYM,222,223,SYM, /* BX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,224,225,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* CX */
|
||||
226,227,228,229,230,231, 3,232,233,SYM,SYM,SYM,SYM,234,235,SYM, /* DX */
|
||||
0,236, 0,237,238,239, 20, 20, 7, 15, 7,240, 32, 32,241,SYM, /* EX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,242, 31, 31,SYM,SYM, /* FX */
|
||||
};
|
||||
/*X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
|
||||
@ -152,69 +152,73 @@ static const unsigned char Mac_Centraleurope_CharToOrderMap[] =
|
||||
CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR,CTR, /* 1X */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM, /* 2X */
|
||||
NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,NUM,SYM,SYM,SYM,SYM,SYM,SYM, /* 3X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 4X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 1, 17, 21, 12, 0, 24, 18, 19, 2, 9, 11, 7, 14, 4, 3, /* 6X */
|
||||
13, 32, 5, 6, 8, 15, 10, 25, 27, 26, 16,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
33, 42, 42, 29,207, 31, 28, 34,208, 20, 33, 20, 30, 30, 29,209, /* 8X */
|
||||
210,211, 37,212, 40, 40,213, 36,214, 49, 31,215,216,217,218, 28, /* 9X */
|
||||
SYM,SYM,219,SYM,SYM,SYM,SYM, 44,SYM,SYM,SYM,220,SYM,SYM,221,222, /* AX */
|
||||
223,224,SYM,SYM,225,226,SYM,SYM, 48,227,228,229,230,231,232,233, /* BX */
|
||||
234, 53,SYM,SYM, 53,235,SYM,SYM,SYM,SYM,SYM,236,237,238,239,240, /* CX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,241,242,243, 41,SYM,SYM, 41,244, /* DX */
|
||||
245, 22,SYM,SYM, 22,246,247, 34,248,249, 37, 23, 23,249, 36, 49, /* EX */
|
||||
249,249,249,249,249,249,249,249, 43, 43,249,249, 48,249,249,SYM, /* FX */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 4X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,SYM, /* 5X */
|
||||
SYM, 2, 16, 22, 13, 1, 24, 18, 21, 3, 6, 11, 5, 12, 4, 0, /* 6X */
|
||||
14, 30, 7, 8, 9, 15, 10, 26, 25, 27, 17,SYM,SYM,SYM,SYM,CTR, /* 7X */
|
||||
243,244,245, 1,246, 29, 28, 2,247, 19,248, 19,249,249, 1,249, /* 8X */
|
||||
249,249, 3,249,249,249,249, 0,249, 0, 29,249, 15,249,249, 28, /* 9X */
|
||||
SYM,SYM,249,SYM,SYM,SYM,SYM,249,SYM,SYM,SYM,249,SYM,SYM,249,249, /* AX */
|
||||
249,249,SYM,SYM,249,249,SYM,SYM,249,249,249,249,249,249,249,249, /* BX */
|
||||
249,249,SYM,SYM,249,249,SYM,SYM,SYM,SYM,SYM,249,249,249,249,249, /* CX */
|
||||
SYM,SYM,SYM,SYM,SYM,SYM,SYM,SYM,249, 7, 7, 31,SYM,SYM, 31,249, /* DX */
|
||||
249, 20,SYM,SYM, 20,249,249, 2,249,249, 3, 23, 23,249, 0, 0, /* EX */
|
||||
249,249, 15,249,249,249,249,249, 32, 32,249,249,249,249,249,SYM, /* FX */
|
||||
};
|
||||
/*X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
|
||||
|
||||
static const int Unicode_Char_size = 50;
|
||||
static const int Unicode_Char_size = 81;
|
||||
static const unsigned int Unicode_CharOrder[] =
|
||||
{
|
||||
65, 1, 66, 17, 67, 21, 68, 12, 69, 0, 70, 24, 71, 18, 72, 19,
|
||||
73, 2, 74, 9, 75, 11, 76, 7, 77, 14, 78, 4, 79, 3, 80, 13,
|
||||
82, 5, 83, 6, 84, 8, 85, 15, 86, 10, 90, 16, 97, 1, 98, 17,
|
||||
99, 21, 100, 12, 101, 0, 102, 24, 103, 18, 104, 19, 105, 2,106, 9,
|
||||
107, 11, 108, 7, 109, 14, 110, 4, 111, 3, 112, 13, 114, 5,115, 6,
|
||||
116, 8, 117, 15, 118, 10, 122, 16, 268, 20, 269, 20, 352, 22,353, 22,
|
||||
381, 23, 382, 23,
|
||||
32, 0, 65, 2, 66, 16, 67, 22, 68, 13, 69, 1, 70, 24, 71, 18,
|
||||
72, 21, 73, 3, 74, 6, 75, 11, 76, 5, 77, 12, 78, 4, 79, 0,
|
||||
80, 14, 82, 7, 83, 8, 84, 9, 85, 15, 86, 10, 90, 17, 97, 2,
|
||||
98, 16, 99, 22, 100, 13, 101, 1, 102, 24, 103, 18, 104, 21, 105, 3,
|
||||
106, 6, 107, 11, 108, 5, 109, 12, 110, 4, 111, 0, 112, 14, 114, 7,
|
||||
115, 8, 116, 9, 117, 15, 118, 10, 122, 17, 225, 2, 232, 1, 233, 1,
|
||||
234, 1, 236, 3, 237, 3, 242, 0, 243, 0, 244, 0, 249, 15, 250, 15,
|
||||
268, 19, 269, 19, 341, 7, 352, 20, 353, 20, 381, 23, 382, 23, 513, 2,
|
||||
515, 2, 517, 1, 519, 1, 521, 3, 523, 3, 525, 0, 527, 0, 531, 7,
|
||||
533, 15, 535, 15, 601, 1, 768, 1, 769, 0, 783, 1, 785, 0,7865, 1,
|
||||
7885, 0,
|
||||
};
|
||||
|
||||
|
||||
/* Model Table:
|
||||
* Total considered sequences: 880 / 625
|
||||
* - Positive sequences: first 449 (0.9950499684040537)
|
||||
* - Probable sequences: next 172 (621-449) (0.003957684836286113)
|
||||
* - Neutral sequences: last 4 (0.000992346759660201)
|
||||
* - Negative sequences: -255 (off-ratio)
|
||||
* Total considered sequences: 480 / 625
|
||||
* - Positive sequences: first 360 (0.9950453499390822)
|
||||
* - Probable sequences: next 83 (443-360) (0.00397996480303231)
|
||||
* - Neutral sequences: last 182 (0.0009746852578854659)
|
||||
* - Negative sequences: 145 (off-ratio)
|
||||
* Negative sequences: TODO
|
||||
*/
|
||||
static const PRUint8 SloveneLangModel[] =
|
||||
{
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,
|
||||
3,3,3,3,3,3,3,3,3,2,3,3,1,3,3,3,2,3,2,3,2,3,1,1,2,
|
||||
3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,2,3,0,3,0,0,1,
|
||||
3,3,3,3,3,3,3,2,3,1,3,3,3,3,3,3,2,3,1,3,2,3,3,0,1,
|
||||
3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,3,3,3,3,2,3,3,3,2,0,
|
||||
3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,0,1,1,2,0,3,2,0,2,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,2,
|
||||
3,3,3,3,3,3,3,3,3,2,1,2,1,2,1,3,2,1,1,3,2,2,2,0,2,
|
||||
3,3,3,3,3,3,3,3,2,1,3,3,2,3,3,3,1,3,1,1,3,3,3,1,2,
|
||||
3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,2,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,3,1,1,
|
||||
3,3,3,3,3,3,3,3,3,3,3,2,3,1,3,3,3,2,2,1,3,2,2,0,0,
|
||||
3,3,3,3,3,3,2,3,2,1,2,2,2,1,2,3,0,2,2,3,0,1,0,0,0,
|
||||
3,3,3,3,3,3,2,3,3,0,1,3,2,1,3,3,0,2,2,0,2,0,0,0,2,
|
||||
3,3,3,3,3,3,1,3,1,3,3,3,0,0,1,3,0,2,0,0,0,1,0,0,0,
|
||||
3,3,3,3,2,3,2,3,3,1,3,3,1,0,2,3,1,1,1,3,0,3,0,0,2,
|
||||
3,3,3,3,3,2,0,3,3,3,3,3,1,3,2,3,0,0,0,0,3,2,1,0,0,
|
||||
3,3,3,3,3,2,0,0,0,3,1,2,0,0,1,3,0,3,2,0,0,1,0,0,0,
|
||||
3,3,3,3,2,3,3,3,2,2,0,1,0,0,2,3,0,2,2,0,0,0,0,0,3,
|
||||
3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,2,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
|
||||
3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,
|
||||
3,3,3,3,0,1,3,0,3,3,0,3,0,3,3,3,2,2,3,3,3,3,3,0,3,
|
||||
3,3,3,3,3,3,3,0,3,3,3,3,3,1,3,3,3,2,3,0,1,3,3,1,2,
|
||||
3,3,3,3,3,2,0,0,3,2,3,2,3,2,3,3,3,0,0,0,3,1,2,0,0,
|
||||
3,3,3,3,3,2,3,0,3,3,3,3,3,3,1,3,3,3,3,2,3,3,3,3,0,
|
||||
3,3,3,3,3,3,2,3,0,3,3,3,3,0,3,3,3,0,0,2,0,0,3,0,0,
|
||||
3,3,3,3,3,3,3,3,3,2,3,3,2,0,2,3,0,0,1,0,0,2,2,0,0,
|
||||
3,3,3,3,3,3,2,3,3,3,0,3,0,0,3,2,3,3,1,2,3,0,3,0,0,
|
||||
3,3,3,3,3,3,3,3,2,3,3,2,3,3,1,3,0,0,0,0,0,1,3,0,1,
|
||||
3,3,3,3,3,3,0,3,3,0,2,2,1,2,3,3,3,0,0,1,3,0,0,0,0,
|
||||
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,0,1,2,2,2,0,
|
||||
3,3,3,3,3,3,1,3,3,2,0,1,1,0,2,3,0,0,0,0,2,2,0,0,0,
|
||||
3,1,3,2,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,1,3,3,2,
|
||||
3,3,3,3,3,3,3,3,3,3,2,0,3,3,0,3,2,3,2,3,0,0,0,0,0,
|
||||
3,3,3,3,3,3,2,3,3,2,3,1,3,3,3,3,3,1,3,0,3,3,0,0,0,
|
||||
3,3,3,3,2,3,0,3,0,0,0,0,0,0,0,3,2,0,0,0,0,2,0,0,0,
|
||||
3,3,3,3,3,2,3,3,0,0,2,3,0,0,0,3,0,0,0,0,0,0,0,0,0,
|
||||
3,3,3,3,3,3,2,0,0,3,0,3,3,0,3,1,0,0,0,3,0,0,2,0,0,
|
||||
3,3,3,3,3,2,0,3,0,2,0,2,2,2,0,3,0,0,0,0,0,0,0,0,0,
|
||||
3,3,3,3,0,2,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,3,0,0,2,
|
||||
3,3,3,3,3,0,3,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,
|
||||
3,3,3,3,0,0,0,3,3,1,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,
|
||||
};
|
||||
|
||||
|
||||
@ -223,7 +227,7 @@ const SequenceModel Iso_8859_2SloveneModel =
|
||||
Iso_8859_2_CharToOrderMap,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9990076532403398,
|
||||
(float)0.9990253147421145,
|
||||
PR_FALSE,
|
||||
"ISO-8859-2",
|
||||
"sl"
|
||||
@ -234,7 +238,7 @@ const SequenceModel Iso_8859_16SloveneModel =
|
||||
Iso_8859_16_CharToOrderMap,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9990076532403398,
|
||||
(float)0.9990253147421145,
|
||||
PR_FALSE,
|
||||
"ISO-8859-16",
|
||||
"sl"
|
||||
@ -245,7 +249,7 @@ const SequenceModel Windows_1250SloveneModel =
|
||||
Windows_1250_CharToOrderMap,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9990076532403398,
|
||||
(float)0.9990253147421145,
|
||||
PR_FALSE,
|
||||
"WINDOWS-1250",
|
||||
"sl"
|
||||
@ -256,7 +260,7 @@ const SequenceModel Ibm852SloveneModel =
|
||||
Ibm852_CharToOrderMap,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9990076532403398,
|
||||
(float)0.9990253147421145,
|
||||
PR_FALSE,
|
||||
"IBM852",
|
||||
"sl"
|
||||
@ -267,7 +271,7 @@ const SequenceModel Mac_CentraleuropeSloveneModel =
|
||||
Mac_Centraleurope_CharToOrderMap,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9990076532403398,
|
||||
(float)0.9990253147421145,
|
||||
PR_FALSE,
|
||||
"MAC-CENTRALEUROPE",
|
||||
"sl"
|
||||
@ -277,8 +281,8 @@ const LanguageModel SloveneModel =
|
||||
{
|
||||
"sl",
|
||||
Unicode_CharOrder,
|
||||
50,
|
||||
81,
|
||||
SloveneLangModel,
|
||||
25,
|
||||
(float)0.9976974938105708,
|
||||
(float)0.9993179075502389,
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user