use crate::data::caniuse::region::RegionData;
const KEYS: &[&str] = &[
"AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA",
"BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BW", "BY",
"BZ", "CA", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CX",
"CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ER", "ES", "ET", "FI", "FJ",
"FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP",
"GQ", "GR", "GT", "GU", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN",
"IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR",
"KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC",
"MD", "ME", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV",
"MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ",
"OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA",
"RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SK", "SL", "SM",
"SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD", "TG", "TH", "TJ", "TL", "TM", "TN", "TO",
"TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN",
"VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW", "alt-af", "alt-an", "alt-as", "alt-eu",
"alt-na", "alt-oc", "alt-sa", "alt-ww",
];
const BROWSER_RANGES: &[u32] = &[
0u32, 179u32, 403u32, 657u32, 831u32, 974u32, 1177u32, 1374u32, 1591u32, 1770u32, 1899u32,
2155u32, 2407u32, 2580u32, 2719u32, 2927u32, 3143u32, 3318u32, 3475u32, 3720u32, 3934u32,
4170u32, 4360u32, 4578u32, 4840u32, 4955u32, 5146u32, 5345u32, 5529u32, 5681u32, 5859u32,
6059u32, 6293u32, 6474u32, 6735u32, 6974u32, 7113u32, 7287u32, 7536u32, 7751u32, 7880u32,
8078u32, 8351u32, 8613u32, 8790u32, 8986u32, 9315u32, 9511u32, 9575u32, 9798u32, 10044u32,
10330u32, 10510u32, 10704u32, 10884u32, 11092u32, 11304u32, 11491u32, 11702u32, 11931u32,
12038u32, 12269u32, 12473u32, 12719u32, 12927u32, 13030u32, 13154u32, 13291u32, 13562u32,
13736u32, 13982u32, 14147u32, 14382u32, 14570u32, 14718u32, 14984u32, 15124u32, 15271u32,
15503u32, 15729u32, 15914u32, 16092u32, 16299u32, 16491u32, 16659u32, 16821u32, 16993u32,
17266u32, 17445u32, 17649u32, 17887u32, 18098u32, 18300u32, 18509u32, 18724u32, 18887u32,
19068u32, 19247u32, 19511u32, 19718u32, 19980u32, 20135u32, 20304u32, 20478u32, 20745u32,
20932u32, 21094u32, 21286u32, 21398u32, 21555u32, 21726u32, 21795u32, 22018u32, 22217u32,
22387u32, 22587u32, 22756u32, 22929u32, 23112u32, 23279u32, 23447u32, 23662u32, 23855u32,
24098u32, 24313u32, 24515u32, 24721u32, 24947u32, 25093u32, 25286u32, 25490u32, 25752u32,
25874u32, 26080u32, 26275u32, 26495u32, 26684u32, 26892u32, 27032u32, 27230u32, 27430u32,
27527u32, 27704u32, 27901u32, 28083u32, 28313u32, 28510u32, 28714u32, 28953u32, 29171u32,
29361u32, 29577u32, 29653u32, 29909u32, 30075u32, 30342u32, 30572u32, 30753u32, 30837u32,
30913u32, 31129u32, 31309u32, 31483u32, 31681u32, 31865u32, 32074u32, 32265u32, 32484u32,
32718u32, 32836u32, 32902u32, 33113u32, 33294u32, 33510u32, 33622u32, 33787u32, 34000u32,
34208u32, 34413u32, 34677u32, 34945u32, 35179u32, 35379u32, 35537u32, 35797u32, 36002u32,
36233u32, 36480u32, 36570u32, 36806u32, 37038u32, 37275u32, 37416u32, 37582u32, 37777u32,
37953u32, 38085u32, 38275u32, 38485u32, 38686u32, 38837u32, 39028u32, 39237u32, 39437u32,
39677u32, 39934u32, 40086u32, 40274u32, 40421u32, 40637u32, 40834u32, 40916u32, 41153u32,
41411u32, 41657u32, 41905u32, 42164u32, 42347u32, 42519u32, 42614u32, 42786u32, 42944u32,
43103u32, 43260u32, 43431u32, 43587u32, 43679u32, 43834u32, 44026u32, 44198u32, 44410u32,
44644u32, 44903u32, 45092u32, 45195u32, 45401u32, 45637u32, 45846u32, 46044u32, 46201u32,
46417u32,
];
const VERSION_RANGES: &[u32] = &[
0u32, 215u32, 507u32, 840u32, 1057u32, 1229u32, 1489u32, 1735u32, 2029u32, 2256u32, 2412u32,
2743u32, 3069u32, 3279u32, 3447u32, 3728u32, 4008u32, 4228u32, 4419u32, 4727u32, 5005u32,
5309u32, 5563u32, 5853u32, 6210u32, 6349u32, 6593u32, 6858u32, 7087u32, 7271u32, 7496u32,
7754u32, 8064u32, 8281u32, 8618u32, 8935u32, 9114u32, 9336u32, 9650u32, 9928u32, 10086u32,
10344u32, 10706u32, 11045u32, 11261u32, 11518u32, 11958u32, 12212u32, 12297u32, 12590u32,
12906u32, 13277u32, 13505u32, 13739u32, 13967u32, 14243u32, 14523u32, 14758u32, 15025u32,
15324u32, 15459u32, 15745u32, 16012u32, 16324u32, 16584u32, 16713u32, 16865u32, 17030u32,
17377u32, 17605u32, 17923u32, 18126u32, 18436u32, 18668u32, 18848u32, 19198u32, 19366u32,
19546u32, 19873u32, 20167u32, 20393u32, 20625u32, 20881u32, 21113u32, 21320u32, 21524u32,
21742u32, 22091u32, 22317u32, 22571u32, 22886u32, 23146u32, 23385u32, 23643u32, 23908u32,
24105u32, 24332u32, 24560u32, 24902u32, 25146u32, 25483u32, 25672u32, 25886u32, 26100u32,
26441u32, 26678u32, 26877u32, 27107u32, 27246u32, 27445u32, 27652u32, 27743u32, 28027u32,
28271u32, 28473u32, 28719u32, 28929u32, 29142u32, 29370u32, 29580u32, 29785u32, 30065u32,
30312u32, 30624u32, 30886u32, 31132u32, 31396u32, 31684u32, 31866u32, 32103u32, 32361u32,
32713u32, 32862u32, 33126u32, 33375u32, 33652u32, 33884u32, 34137u32, 34305u32, 34553u32,
34816u32, 34938u32, 35152u32, 35389u32, 35613u32, 35916u32, 36156u32, 36413u32, 36720u32,
36995u32, 37232u32, 37519u32, 37618u32, 37956u32, 38161u32, 38511u32, 38795u32, 39017u32,
39124u32, 39223u32, 39487u32, 39716u32, 39932u32, 40179u32, 40407u32, 40669u32, 40902u32,
41190u32, 41491u32, 41632u32, 41719u32, 41994u32, 42218u32, 42495u32, 42634u32, 42837u32,
43115u32, 43363u32, 43610u32, 43955u32, 44312u32, 44614u32, 44859u32, 45053u32, 45377u32,
45651u32, 45948u32, 46266u32, 46379u32, 46684u32, 46983u32, 47302u32, 47476u32, 47686u32,
47937u32, 48162u32, 48336u32, 48572u32, 48856u32, 49111u32, 49298u32, 49551u32, 49831u32,
50080u32, 50395u32, 50727u32, 50920u32, 51161u32, 51337u32, 51611u32, 51854u32, 51959u32,
52247u32, 52586u32, 52904u32, 53232u32, 53565u32, 53810u32, 54026u32, 54145u32, 54364u32,
54562u32, 54755u32, 54945u32, 55156u32, 55343u32, 55459u32, 55648u32, 55907u32, 56123u32,
56390u32, 56695u32, 57036u32, 57276u32, 57401u32, 57653u32, 57960u32, 58217u32, 58461u32,
58656u32, 58921u32,
];
const PERCENT_RANGES: &[u32] = &[
0u32, 383u32, 849u32, 1361u32, 1724u32, 2028u32, 2460u32, 2879u32, 3323u32, 3690u32, 3968u32,
4498u32, 5021u32, 5377u32, 5659u32, 6088u32, 6540u32, 6910u32, 7230u32, 7739u32, 8165u32,
8649u32, 9059u32, 9496u32, 10025u32, 10269u32, 10677u32, 11082u32, 11461u32, 11786u32,
12142u32, 12555u32, 13049u32, 13434u32, 13977u32, 14455u32, 14732u32, 15088u32, 15606u32,
16054u32, 16320u32, 16728u32, 17277u32, 17827u32, 18197u32, 18608u32, 19272u32, 19677u32,
19742u32, 20200u32, 20700u32, 21289u32, 21653u32, 22058u32, 22427u32, 22873u32, 23307u32,
23695u32, 24127u32, 24596u32, 24812u32, 25281u32, 25684u32, 26194u32, 26617u32, 26834u32,
27086u32, 27387u32, 27947u32, 28305u32, 28815u32, 29167u32, 29664u32, 30055u32, 30369u32,
30921u32, 31213u32, 31522u32, 31995u32, 32453u32, 32836u32, 33185u32, 33614u32, 34006u32,
34357u32, 34676u32, 35038u32, 35597u32, 35975u32, 36392u32, 36873u32, 37305u32, 37725u32,
38161u32, 38616u32, 38963u32, 39321u32, 39687u32, 40219u32, 40658u32, 41195u32, 41521u32,
41881u32, 42246u32, 42796u32, 43179u32, 43513u32, 43922u32, 44147u32, 44462u32, 44818u32,
44960u32, 45407u32, 45831u32, 46188u32, 46610u32, 46953u32, 47314u32, 47692u32, 48049u32,
48386u32, 48816u32, 49203u32, 49702u32, 50157u32, 50577u32, 51006u32, 51477u32, 51788u32,
52193u32, 52609u32, 53134u32, 53379u32, 53813u32, 54212u32, 54661u32, 55056u32, 55484u32,
55777u32, 56186u32, 56596u32, 56792u32, 57173u32, 57576u32, 57949u32, 58407u32, 58822u32,
59255u32, 59737u32, 60180u32, 60566u32, 60993u32, 61157u32, 61680u32, 62023u32, 62574u32,
63052u32, 63430u32, 63601u32, 63756u32, 64206u32, 64582u32, 64949u32, 65360u32, 65737u32,
66154u32, 66550u32, 67000u32, 67477u32, 67732u32, 67850u32, 68300u32, 68672u32, 69112u32,
69343u32, 69684u32, 70128u32, 70560u32, 70975u32, 71517u32, 72069u32, 72540u32, 72959u32,
73273u32, 73813u32, 74220u32, 74704u32, 75216u32, 75384u32, 75871u32, 76346u32, 76831u32,
77118u32, 77459u32, 77851u32, 78214u32, 78479u32, 78882u32, 79308u32, 79713u32, 80031u32,
80410u32, 80840u32, 81246u32, 81729u32, 82252u32, 82559u32, 82943u32, 83241u32, 83690u32,
84116u32, 84276u32, 84762u32, 85276u32, 85787u32, 86287u32, 86829u32, 87207u32, 87560u32,
87749u32, 88119u32, 88438u32, 88772u32, 89108u32, 89466u32, 89778u32, 89971u32, 90291u32,
90666u32, 91014u32, 91455u32, 91921u32, 92441u32, 92838u32, 93042u32, 93478u32, 93968u32,
94408u32, 94818u32, 95137u32, 95597u32,
];
pub fn get_usage_by_region(region: &str) -> Option<RegionData> {
let index = KEYS.binary_search(®ion).ok()?;
let browser_start = BROWSER_RANGES[index];
let browser_end = BROWSER_RANGES[index + 1];
let version_start = VERSION_RANGES[index];
let version_end = VERSION_RANGES[index + 1];
let percent_start = PERCENT_RANGES[index];
let percent_end = PERCENT_RANGES[index + 1];
Some(RegionData::new(
browser_start,
browser_end,
version_start,
version_end,
percent_start,
percent_end,
))
}