diff --git a/Cargo.lock b/Cargo.lock index eee9af2..35d3c25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -48,10 +48,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "once_cell" -version = "1.16.0" +name = "phf" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + +[[package]] +name = "proc-macro2" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +dependencies = [ + "unicode-ident", +] [[package]] name = "qrcode" @@ -62,6 +107,24 @@ dependencies = [ "checked_int_cast", ] +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + [[package]] name = "rand_core" version = "0.6.3" @@ -93,6 +156,29 @@ dependencies = [ "serde", ] +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "syn" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + [[package]] name = "ur" version = "0.2.0" @@ -101,7 +187,7 @@ dependencies = [ "bitcoin_hashes", "crc", "hex", - "once_cell", + "phf", "qrcode", "rand_xoshiro", "serde", diff --git a/Cargo.toml b/Cargo.toml index c346913..7880864 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ anyhow = "1.0.64" bitcoin_hashes = "0.11.0" crc = "3.0.0" hex = "0.4.3" -once_cell = "1.16.0" +phf = { version = "0.11.1", features = ["macros"], default-features = false } rand_xoshiro = "0.6.0" serde = "1.0.147" serde_cbor = { version = "0.11.2", features = ["tags"] } diff --git a/src/bytewords.rs b/src/bytewords.rs index d757ff3..571b682 100644 --- a/src/bytewords.rs +++ b/src/bytewords.rs @@ -111,7 +111,7 @@ fn decode_minimal(encoded: &str) -> Result, Error> { fn decode_from_index( keys: &mut dyn Iterator, - indexes: &std::collections::HashMap<&'static str, u8>, + indexes: &phf::Map<&'static str, u8>, ) -> Result, Error> { strip_checksum( &keys diff --git a/src/constants.rs b/src/constants.rs index 69e0c10..9bb9eac 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,3 +1,5 @@ +use phf::phf_map; + #[rustfmt::skip] pub(crate) const WORDS: [&str; 256] = [ "able", "acid", "also", "apex", "aqua", "arch", "atom", "aunt", @@ -34,270 +36,264 @@ pub(crate) const WORDS: [&str; 256] = [ "yoga", "yurt", "zaps", "zero", "zest", "zinc", "zone", "zoom", ]; -pub(crate) static WORD_IDXS: once_cell::sync::Lazy> = - once_cell::sync::Lazy::new(|| { - [ - ("able", 0), - ("acid", 1), - ("also", 2), - ("apex", 3), - ("aqua", 4), - ("arch", 5), - ("atom", 6), - ("aunt", 7), - ("away", 8), - ("axis", 9), - ("back", 10), - ("bald", 11), - ("barn", 12), - ("belt", 13), - ("beta", 14), - ("bias", 15), - ("blue", 16), - ("body", 17), - ("brag", 18), - ("brew", 19), - ("bulb", 20), - ("buzz", 21), - ("calm", 22), - ("cash", 23), - ("cats", 24), - ("chef", 25), - ("city", 26), - ("claw", 27), - ("code", 28), - ("cola", 29), - ("cook", 30), - ("cost", 31), - ("crux", 32), - ("curl", 33), - ("cusp", 34), - ("cyan", 35), - ("dark", 36), - ("data", 37), - ("days", 38), - ("deli", 39), - ("dice", 40), - ("diet", 41), - ("door", 42), - ("down", 43), - ("draw", 44), - ("drop", 45), - ("drum", 46), - ("dull", 47), - ("duty", 48), - ("each", 49), - ("easy", 50), - ("echo", 51), - ("edge", 52), - ("epic", 53), - ("even", 54), - ("exam", 55), - ("exit", 56), - ("eyes", 57), - ("fact", 58), - ("fair", 59), - ("fern", 60), - ("figs", 61), - ("film", 62), - ("fish", 63), - ("fizz", 64), - ("flap", 65), - ("flew", 66), - ("flux", 67), - ("foxy", 68), - ("free", 69), - ("frog", 70), - ("fuel", 71), - ("fund", 72), - ("gala", 73), - ("game", 74), - ("gear", 75), - ("gems", 76), - ("gift", 77), - ("girl", 78), - ("glow", 79), - ("good", 80), - ("gray", 81), - ("grim", 82), - ("guru", 83), - ("gush", 84), - ("gyro", 85), - ("half", 86), - ("hang", 87), - ("hard", 88), - ("hawk", 89), - ("heat", 90), - ("help", 91), - ("high", 92), - ("hill", 93), - ("holy", 94), - ("hope", 95), - ("horn", 96), - ("huts", 97), - ("iced", 98), - ("idea", 99), - ("idle", 100), - ("inch", 101), - ("inky", 102), - ("into", 103), - ("iris", 104), - ("iron", 105), - ("item", 106), - ("jade", 107), - ("jazz", 108), - ("join", 109), - ("jolt", 110), - ("jowl", 111), - ("judo", 112), - ("jugs", 113), - ("jump", 114), - ("junk", 115), - ("jury", 116), - ("keep", 117), - ("keno", 118), - ("kept", 119), - ("keys", 120), - ("kick", 121), - ("kiln", 122), - ("king", 123), - ("kite", 124), - ("kiwi", 125), - ("knob", 126), - ("lamb", 127), - ("lava", 128), - ("lazy", 129), - ("leaf", 130), - ("legs", 131), - ("liar", 132), - ("limp", 133), - ("lion", 134), - ("list", 135), - ("logo", 136), - ("loud", 137), - ("love", 138), - ("luau", 139), - ("luck", 140), - ("lung", 141), - ("main", 142), - ("many", 143), - ("math", 144), - ("maze", 145), - ("memo", 146), - ("menu", 147), - ("meow", 148), - ("mild", 149), - ("mint", 150), - ("miss", 151), - ("monk", 152), - ("nail", 153), - ("navy", 154), - ("need", 155), - ("news", 156), - ("next", 157), - ("noon", 158), - ("note", 159), - ("numb", 160), - ("obey", 161), - ("oboe", 162), - ("omit", 163), - ("onyx", 164), - ("open", 165), - ("oval", 166), - ("owls", 167), - ("paid", 168), - ("part", 169), - ("peck", 170), - ("play", 171), - ("plus", 172), - ("poem", 173), - ("pool", 174), - ("pose", 175), - ("puff", 176), - ("puma", 177), - ("purr", 178), - ("quad", 179), - ("quiz", 180), - ("race", 181), - ("ramp", 182), - ("real", 183), - ("redo", 184), - ("rich", 185), - ("road", 186), - ("rock", 187), - ("roof", 188), - ("ruby", 189), - ("ruin", 190), - ("runs", 191), - ("rust", 192), - ("safe", 193), - ("saga", 194), - ("scar", 195), - ("sets", 196), - ("silk", 197), - ("skew", 198), - ("slot", 199), - ("soap", 200), - ("solo", 201), - ("song", 202), - ("stub", 203), - ("surf", 204), - ("swan", 205), - ("taco", 206), - ("task", 207), - ("taxi", 208), - ("tent", 209), - ("tied", 210), - ("time", 211), - ("tiny", 212), - ("toil", 213), - ("tomb", 214), - ("toys", 215), - ("trip", 216), - ("tuna", 217), - ("twin", 218), - ("ugly", 219), - ("undo", 220), - ("unit", 221), - ("urge", 222), - ("user", 223), - ("vast", 224), - ("very", 225), - ("veto", 226), - ("vial", 227), - ("vibe", 228), - ("view", 229), - ("visa", 230), - ("void", 231), - ("vows", 232), - ("wall", 233), - ("wand", 234), - ("warm", 235), - ("wasp", 236), - ("wave", 237), - ("waxy", 238), - ("webs", 239), - ("what", 240), - ("when", 241), - ("whiz", 242), - ("wolf", 243), - ("work", 244), - ("yank", 245), - ("yawn", 246), - ("yell", 247), - ("yoga", 248), - ("yurt", 249), - ("zaps", 250), - ("zero", 251), - ("zest", 252), - ("zinc", 253), - ("zone", 254), - ("zoom", 255), - ] - .iter() - .copied() - .collect() - }); +pub(crate) static WORD_IDXS: phf::Map<&'static str, u8> = phf_map! { + "able" => 0, + "acid" => 1, + "also" => 2, + "apex" => 3, + "aqua" => 4, + "arch" => 5, + "atom" => 6, + "aunt" => 7, + "away" => 8, + "axis" => 9, + "back" => 10, + "bald" => 11, + "barn" => 12, + "belt" => 13, + "beta" => 14, + "bias" => 15, + "blue" => 16, + "body" => 17, + "brag" => 18, + "brew" => 19, + "bulb" => 20, + "buzz" => 21, + "calm" => 22, + "cash" => 23, + "cats" => 24, + "chef" => 25, + "city" => 26, + "claw" => 27, + "code" => 28, + "cola" => 29, + "cook" => 30, + "cost" => 31, + "crux" => 32, + "curl" => 33, + "cusp" => 34, + "cyan" => 35, + "dark" => 36, + "data" => 37, + "days" => 38, + "deli" => 39, + "dice" => 40, + "diet" => 41, + "door" => 42, + "down" => 43, + "draw" => 44, + "drop" => 45, + "drum" => 46, + "dull" => 47, + "duty" => 48, + "each" => 49, + "easy" => 50, + "echo" => 51, + "edge" => 52, + "epic" => 53, + "even" => 54, + "exam" => 55, + "exit" => 56, + "eyes" => 57, + "fact" => 58, + "fair" => 59, + "fern" => 60, + "figs" => 61, + "film" => 62, + "fish" => 63, + "fizz" => 64, + "flap" => 65, + "flew" => 66, + "flux" => 67, + "foxy" => 68, + "free" => 69, + "frog" => 70, + "fuel" => 71, + "fund" => 72, + "gala" => 73, + "game" => 74, + "gear" => 75, + "gems" => 76, + "gift" => 77, + "girl" => 78, + "glow" => 79, + "good" => 80, + "gray" => 81, + "grim" => 82, + "guru" => 83, + "gush" => 84, + "gyro" => 85, + "half" => 86, + "hang" => 87, + "hard" => 88, + "hawk" => 89, + "heat" => 90, + "help" => 91, + "high" => 92, + "hill" => 93, + "holy" => 94, + "hope" => 95, + "horn" => 96, + "huts" => 97, + "iced" => 98, + "idea" => 99, + "idle" => 100, + "inch" => 101, + "inky" => 102, + "into" => 103, + "iris" => 104, + "iron" => 105, + "item" => 106, + "jade" => 107, + "jazz" => 108, + "join" => 109, + "jolt" => 110, + "jowl" => 111, + "judo" => 112, + "jugs" => 113, + "jump" => 114, + "junk" => 115, + "jury" => 116, + "keep" => 117, + "keno" => 118, + "kept" => 119, + "keys" => 120, + "kick" => 121, + "kiln" => 122, + "king" => 123, + "kite" => 124, + "kiwi" => 125, + "knob" => 126, + "lamb" => 127, + "lava" => 128, + "lazy" => 129, + "leaf" => 130, + "legs" => 131, + "liar" => 132, + "limp" => 133, + "lion" => 134, + "list" => 135, + "logo" => 136, + "loud" => 137, + "love" => 138, + "luau" => 139, + "luck" => 140, + "lung" => 141, + "main" => 142, + "many" => 143, + "math" => 144, + "maze" => 145, + "memo" => 146, + "menu" => 147, + "meow" => 148, + "mild" => 149, + "mint" => 150, + "miss" => 151, + "monk" => 152, + "nail" => 153, + "navy" => 154, + "need" => 155, + "news" => 156, + "next" => 157, + "noon" => 158, + "note" => 159, + "numb" => 160, + "obey" => 161, + "oboe" => 162, + "omit" => 163, + "onyx" => 164, + "open" => 165, + "oval" => 166, + "owls" => 167, + "paid" => 168, + "part" => 169, + "peck" => 170, + "play" => 171, + "plus" => 172, + "poem" => 173, + "pool" => 174, + "pose" => 175, + "puff" => 176, + "puma" => 177, + "purr" => 178, + "quad" => 179, + "quiz" => 180, + "race" => 181, + "ramp" => 182, + "real" => 183, + "redo" => 184, + "rich" => 185, + "road" => 186, + "rock" => 187, + "roof" => 188, + "ruby" => 189, + "ruin" => 190, + "runs" => 191, + "rust" => 192, + "safe" => 193, + "saga" => 194, + "scar" => 195, + "sets" => 196, + "silk" => 197, + "skew" => 198, + "slot" => 199, + "soap" => 200, + "solo" => 201, + "song" => 202, + "stub" => 203, + "surf" => 204, + "swan" => 205, + "taco" => 206, + "task" => 207, + "taxi" => 208, + "tent" => 209, + "tied" => 210, + "time" => 211, + "tiny" => 212, + "toil" => 213, + "tomb" => 214, + "toys" => 215, + "trip" => 216, + "tuna" => 217, + "twin" => 218, + "ugly" => 219, + "undo" => 220, + "unit" => 221, + "urge" => 222, + "user" => 223, + "vast" => 224, + "very" => 225, + "veto" => 226, + "vial" => 227, + "vibe" => 228, + "view" => 229, + "visa" => 230, + "void" => 231, + "vows" => 232, + "wall" => 233, + "wand" => 234, + "warm" => 235, + "wasp" => 236, + "wave" => 237, + "waxy" => 238, + "webs" => 239, + "what" => 240, + "when" => 241, + "whiz" => 242, + "wolf" => 243, + "work" => 244, + "yank" => 245, + "yawn" => 246, + "yell" => 247, + "yoga" => 248, + "yurt" => 249, + "zaps" => 250, + "zero" => 251, + "zest" => 252, + "zinc" => 253, + "zone" => 254, + "zoom" => 255, +}; #[rustfmt::skip] pub(crate) const MINIMALS: [&str; 256] = [ @@ -335,267 +331,261 @@ pub(crate) const MINIMALS: [&str; 256] = [ "ya", "yt", "zs", "zo", "zt", "zc", "ze", "zm", ]; -pub(crate) static MINIMAL_IDXS: once_cell::sync::Lazy> = - once_cell::sync::Lazy::new(|| { - [ - ("ae", 0), - ("ad", 1), - ("ao", 2), - ("ax", 3), - ("aa", 4), - ("ah", 5), - ("am", 6), - ("at", 7), - ("ay", 8), - ("as", 9), - ("bk", 10), - ("bd", 11), - ("bn", 12), - ("bt", 13), - ("ba", 14), - ("bs", 15), - ("be", 16), - ("by", 17), - ("bg", 18), - ("bw", 19), - ("bb", 20), - ("bz", 21), - ("cm", 22), - ("ch", 23), - ("cs", 24), - ("cf", 25), - ("cy", 26), - ("cw", 27), - ("ce", 28), - ("ca", 29), - ("ck", 30), - ("ct", 31), - ("cx", 32), - ("cl", 33), - ("cp", 34), - ("cn", 35), - ("dk", 36), - ("da", 37), - ("ds", 38), - ("di", 39), - ("de", 40), - ("dt", 41), - ("dr", 42), - ("dn", 43), - ("dw", 44), - ("dp", 45), - ("dm", 46), - ("dl", 47), - ("dy", 48), - ("eh", 49), - ("ey", 50), - ("eo", 51), - ("ee", 52), - ("ec", 53), - ("en", 54), - ("em", 55), - ("et", 56), - ("es", 57), - ("ft", 58), - ("fr", 59), - ("fn", 60), - ("fs", 61), - ("fm", 62), - ("fh", 63), - ("fz", 64), - ("fp", 65), - ("fw", 66), - ("fx", 67), - ("fy", 68), - ("fe", 69), - ("fg", 70), - ("fl", 71), - ("fd", 72), - ("ga", 73), - ("ge", 74), - ("gr", 75), - ("gs", 76), - ("gt", 77), - ("gl", 78), - ("gw", 79), - ("gd", 80), - ("gy", 81), - ("gm", 82), - ("gu", 83), - ("gh", 84), - ("go", 85), - ("hf", 86), - ("hg", 87), - ("hd", 88), - ("hk", 89), - ("ht", 90), - ("hp", 91), - ("hh", 92), - ("hl", 93), - ("hy", 94), - ("he", 95), - ("hn", 96), - ("hs", 97), - ("id", 98), - ("ia", 99), - ("ie", 100), - ("ih", 101), - ("iy", 102), - ("io", 103), - ("is", 104), - ("in", 105), - ("im", 106), - ("je", 107), - ("jz", 108), - ("jn", 109), - ("jt", 110), - ("jl", 111), - ("jo", 112), - ("js", 113), - ("jp", 114), - ("jk", 115), - ("jy", 116), - ("kp", 117), - ("ko", 118), - ("kt", 119), - ("ks", 120), - ("kk", 121), - ("kn", 122), - ("kg", 123), - ("ke", 124), - ("ki", 125), - ("kb", 126), - ("lb", 127), - ("la", 128), - ("ly", 129), - ("lf", 130), - ("ls", 131), - ("lr", 132), - ("lp", 133), - ("ln", 134), - ("lt", 135), - ("lo", 136), - ("ld", 137), - ("le", 138), - ("lu", 139), - ("lk", 140), - ("lg", 141), - ("mn", 142), - ("my", 143), - ("mh", 144), - ("me", 145), - ("mo", 146), - ("mu", 147), - ("mw", 148), - ("md", 149), - ("mt", 150), - ("ms", 151), - ("mk", 152), - ("nl", 153), - ("ny", 154), - ("nd", 155), - ("ns", 156), - ("nt", 157), - ("nn", 158), - ("ne", 159), - ("nb", 160), - ("oy", 161), - ("oe", 162), - ("ot", 163), - ("ox", 164), - ("on", 165), - ("ol", 166), - ("os", 167), - ("pd", 168), - ("pt", 169), - ("pk", 170), - ("py", 171), - ("ps", 172), - ("pm", 173), - ("pl", 174), - ("pe", 175), - ("pf", 176), - ("pa", 177), - ("pr", 178), - ("qd", 179), - ("qz", 180), - ("re", 181), - ("rp", 182), - ("rl", 183), - ("ro", 184), - ("rh", 185), - ("rd", 186), - ("rk", 187), - ("rf", 188), - ("ry", 189), - ("rn", 190), - ("rs", 191), - ("rt", 192), - ("se", 193), - ("sa", 194), - ("sr", 195), - ("ss", 196), - ("sk", 197), - ("sw", 198), - ("st", 199), - ("sp", 200), - ("so", 201), - ("sg", 202), - ("sb", 203), - ("sf", 204), - ("sn", 205), - ("to", 206), - ("tk", 207), - ("ti", 208), - ("tt", 209), - ("td", 210), - ("te", 211), - ("ty", 212), - ("tl", 213), - ("tb", 214), - ("ts", 215), - ("tp", 216), - ("ta", 217), - ("tn", 218), - ("uy", 219), - ("uo", 220), - ("ut", 221), - ("ue", 222), - ("ur", 223), - ("vt", 224), - ("vy", 225), - ("vo", 226), - ("vl", 227), - ("ve", 228), - ("vw", 229), - ("va", 230), - ("vd", 231), - ("vs", 232), - ("wl", 233), - ("wd", 234), - ("wm", 235), - ("wp", 236), - ("we", 237), - ("wy", 238), - ("ws", 239), - ("wt", 240), - ("wn", 241), - ("wz", 242), - ("wf", 243), - ("wk", 244), - ("yk", 245), - ("yn", 246), - ("yl", 247), - ("ya", 248), - ("yt", 249), - ("zs", 250), - ("zo", 251), - ("zt", 252), - ("zc", 253), - ("ze", 254), - ("zm", 255), - ] - .iter() - .copied() - .collect() - }); +pub(crate) static MINIMAL_IDXS: phf::Map<&'static str, u8> = phf_map! { + "ae" => 0, + "ad" => 1, + "ao" => 2, + "ax" => 3, + "aa" => 4, + "ah" => 5, + "am" => 6, + "at" => 7, + "ay" => 8, + "as" => 9, + "bk" => 10, + "bd" => 11, + "bn" => 12, + "bt" => 13, + "ba" => 14, + "bs" => 15, + "be" => 16, + "by" => 17, + "bg" => 18, + "bw" => 19, + "bb" => 20, + "bz" => 21, + "cm" => 22, + "ch" => 23, + "cs" => 24, + "cf" => 25, + "cy" => 26, + "cw" => 27, + "ce" => 28, + "ca" => 29, + "ck" => 30, + "ct" => 31, + "cx" => 32, + "cl" => 33, + "cp" => 34, + "cn" => 35, + "dk" => 36, + "da" => 37, + "ds" => 38, + "di" => 39, + "de" => 40, + "dt" => 41, + "dr" => 42, + "dn" => 43, + "dw" => 44, + "dp" => 45, + "dm" => 46, + "dl" => 47, + "dy" => 48, + "eh" => 49, + "ey" => 50, + "eo" => 51, + "ee" => 52, + "ec" => 53, + "en" => 54, + "em" => 55, + "et" => 56, + "es" => 57, + "ft" => 58, + "fr" => 59, + "fn" => 60, + "fs" => 61, + "fm" => 62, + "fh" => 63, + "fz" => 64, + "fp" => 65, + "fw" => 66, + "fx" => 67, + "fy" => 68, + "fe" => 69, + "fg" => 70, + "fl" => 71, + "fd" => 72, + "ga" => 73, + "ge" => 74, + "gr" => 75, + "gs" => 76, + "gt" => 77, + "gl" => 78, + "gw" => 79, + "gd" => 80, + "gy" => 81, + "gm" => 82, + "gu" => 83, + "gh" => 84, + "go" => 85, + "hf" => 86, + "hg" => 87, + "hd" => 88, + "hk" => 89, + "ht" => 90, + "hp" => 91, + "hh" => 92, + "hl" => 93, + "hy" => 94, + "he" => 95, + "hn" => 96, + "hs" => 97, + "id" => 98, + "ia" => 99, + "ie" => 100, + "ih" => 101, + "iy" => 102, + "io" => 103, + "is" => 104, + "in" => 105, + "im" => 106, + "je" => 107, + "jz" => 108, + "jn" => 109, + "jt" => 110, + "jl" => 111, + "jo" => 112, + "js" => 113, + "jp" => 114, + "jk" => 115, + "jy" => 116, + "kp" => 117, + "ko" => 118, + "kt" => 119, + "ks" => 120, + "kk" => 121, + "kn" => 122, + "kg" => 123, + "ke" => 124, + "ki" => 125, + "kb" => 126, + "lb" => 127, + "la" => 128, + "ly" => 129, + "lf" => 130, + "ls" => 131, + "lr" => 132, + "lp" => 133, + "ln" => 134, + "lt" => 135, + "lo" => 136, + "ld" => 137, + "le" => 138, + "lu" => 139, + "lk" => 140, + "lg" => 141, + "mn" => 142, + "my" => 143, + "mh" => 144, + "me" => 145, + "mo" => 146, + "mu" => 147, + "mw" => 148, + "md" => 149, + "mt" => 150, + "ms" => 151, + "mk" => 152, + "nl" => 153, + "ny" => 154, + "nd" => 155, + "ns" => 156, + "nt" => 157, + "nn" => 158, + "ne" => 159, + "nb" => 160, + "oy" => 161, + "oe" => 162, + "ot" => 163, + "ox" => 164, + "on" => 165, + "ol" => 166, + "os" => 167, + "pd" => 168, + "pt" => 169, + "pk" => 170, + "py" => 171, + "ps" => 172, + "pm" => 173, + "pl" => 174, + "pe" => 175, + "pf" => 176, + "pa" => 177, + "pr" => 178, + "qd" => 179, + "qz" => 180, + "re" => 181, + "rp" => 182, + "rl" => 183, + "ro" => 184, + "rh" => 185, + "rd" => 186, + "rk" => 187, + "rf" => 188, + "ry" => 189, + "rn" => 190, + "rs" => 191, + "rt" => 192, + "se" => 193, + "sa" => 194, + "sr" => 195, + "ss" => 196, + "sk" => 197, + "sw" => 198, + "st" => 199, + "sp" => 200, + "so" => 201, + "sg" => 202, + "sb" => 203, + "sf" => 204, + "sn" => 205, + "to" => 206, + "tk" => 207, + "ti" => 208, + "tt" => 209, + "td" => 210, + "te" => 211, + "ty" => 212, + "tl" => 213, + "tb" => 214, + "ts" => 215, + "tp" => 216, + "ta" => 217, + "tn" => 218, + "uy" => 219, + "uo" => 220, + "ut" => 221, + "ue" => 222, + "ur" => 223, + "vt" => 224, + "vy" => 225, + "vo" => 226, + "vl" => 227, + "ve" => 228, + "vw" => 229, + "va" => 230, + "vd" => 231, + "vs" => 232, + "wl" => 233, + "wd" => 234, + "wm" => 235, + "wp" => 236, + "we" => 237, + "wy" => 238, + "ws" => 239, + "wt" => 240, + "wn" => 241, + "wz" => 242, + "wf" => 243, + "wk" => 244, + "yk" => 245, + "yn" => 246, + "yl" => 247, + "ya" => 248, + "yt" => 249, + "zs" => 250, + "zo" => 251, + "zt" => 252, + "zc" => 253, + "ze" => 254, + "zm" => 255, +};