diff --git a/.prettierignore b/.prettierignore index dfff9a5..194cc8e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,5 @@ -cryptonote_utils/biginteger.js -cryptonote_utils/sha3.js -cryptonote_utils/nacl-fast-cn.js -cryptonote_utils/mnemonic.js -cryptonote_utils/cryptonote_crypto_EMSCRIPTEN.js -cryptonote_utils/crc32.js +cryptonote_utils/MyMoneroCoreCpp.js +cryptonote_utils/MyMoneroCoreCpp.wasm package.json yarn.lock diff --git a/cryptonote_utils/crc32.js b/cryptonote_utils/crc32.js deleted file mode 100644 index 2d18fa8..0000000 --- a/cryptonote_utils/crc32.js +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2014-2018, MyMonero.com -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are -// permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list -// of conditions and the following disclaimer in the documentation and/or other -// materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific -// prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -(function(exports) -{ - var crc32 = (function () { - 'use strict'; - var crc32 = {}; - - crc32.Utf8Encode = function (string) { - return unescape(encodeURIComponent(string)); - }; - - crc32.run = function (str) { - var crc = new crc32.Type(); - crc.processString(str); - return crc.checksum(); - }; - - crc32.table = [ - 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, - 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, - 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, - 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, - 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, - 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, - 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, - 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, - 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, - 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, - 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, - 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, - 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, - 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, - 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, - 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, - 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, - 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, - 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, - 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, - 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, - 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, - 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, - 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, - 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, - 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, - 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, - 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, - 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, - 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, - 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, - 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117 - ]; - crc32.Type = function () { - this.rem_ = 0xFFFFFFFF; - this.checksum = function () { - return ((this.rem_ ^ 0xFFFFFFFF) >>> 0); - }; - this.processString = function (str) { - str = crc32.Utf8Encode(str); - for (var i = 0; i < str.length; i++) { - var byte_index = ((str.charCodeAt(i) ^ this.rem_) >>> 0) & 0xFF; - this.rem_ = ((this.rem_ >>> 8) ^ crc32.table[byte_index]) >>> 0; - } - }; - return this; - }; - - return crc32; - })(); - exports.crc32 = crc32; -})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/cryptonote_utils/cryptonote_base58.js b/cryptonote_utils/cryptonote_base58.js deleted file mode 100644 index 7386e48..0000000 --- a/cryptonote_utils/cryptonote_base58.js +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (c) 2014-2018, MyMonero.com -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are -// permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list -// of conditions and the following disclaimer in the documentation and/or other -// materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific -// prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// v--- These should maybe be injected into context -const JSBigInt = require("./biginteger").BigInteger; - -var cnBase58 = (function() { - var b58 = {}; - // - var alphabet_str = - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - var alphabet = []; - for (var i = 0; i < alphabet_str.length; i++) { - alphabet.push(alphabet_str.charCodeAt(i)); - } - var encoded_block_sizes = [0, 2, 3, 5, 6, 7, 9, 10, 11]; - - var alphabet_size = alphabet.length; - var full_block_size = 8; - var full_encoded_block_size = 11; - - var UINT64_MAX = new JSBigInt(2).pow(64); - - function hextobin(hex) { - if (hex.length % 2 !== 0) throw "Hex string has invalid length!"; - var res = new Uint8Array(hex.length / 2); - for (var i = 0; i < hex.length / 2; ++i) { - res[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16); - } - return res; - } - - function bintohex(bin) { - var out = []; - for (var i = 0; i < bin.length; ++i) { - out.push(("0" + bin[i].toString(16)).slice(-2)); - } - return out.join(""); - } - - function strtobin(str) { - var res = new Uint8Array(str.length); - for (var i = 0; i < str.length; i++) { - res[i] = str.charCodeAt(i); - } - return res; - } - - function bintostr(bin) { - var out = []; - for (var i = 0; i < bin.length; i++) { - out.push(String.fromCharCode(bin[i])); - } - return out.join(""); - } - - function uint8_be_to_64(data) { - if (data.length < 1 || data.length > 8) { - throw "Invalid input length"; - } - var res = JSBigInt.ZERO; - var twopow8 = new JSBigInt(2).pow(8); - var i = 0; - switch (9 - data.length) { - case 1: - res = res.add(data[i++]); - case 2: - res = res.multiply(twopow8).add(data[i++]); - case 3: - res = res.multiply(twopow8).add(data[i++]); - case 4: - res = res.multiply(twopow8).add(data[i++]); - case 5: - res = res.multiply(twopow8).add(data[i++]); - case 6: - res = res.multiply(twopow8).add(data[i++]); - case 7: - res = res.multiply(twopow8).add(data[i++]); - case 8: - res = res.multiply(twopow8).add(data[i++]); - break; - default: - throw "Impossible condition"; - } - return res; - } - - function uint64_to_8be(num, size) { - var res = new Uint8Array(size); - if (size < 1 || size > 8) { - throw "Invalid input length"; - } - var twopow8 = new JSBigInt(2).pow(8); - for (var i = size - 1; i >= 0; i--) { - res[i] = num.remainder(twopow8).toJSValue(); - num = num.divide(twopow8); - } - return res; - } - - b58.encode_block = function(data, buf, index) { - if (data.length < 1 || data.length > full_encoded_block_size) { - throw "Invalid block length: " + data.length; - } - var num = uint8_be_to_64(data); - var i = encoded_block_sizes[data.length] - 1; - // while num > 0 - while (num.compare(0) === 1) { - var div = num.divRem(alphabet_size); - // remainder = num % alphabet_size - var remainder = div[1]; - // num = num / alphabet_size - num = div[0]; - buf[index + i] = alphabet[remainder.toJSValue()]; - i--; - } - return buf; - }; - - b58.encode = function(hex) { - var data = hextobin(hex); - if (data.length === 0) { - return ""; - } - var full_block_count = Math.floor(data.length / full_block_size); - var last_block_size = data.length % full_block_size; - var res_size = - full_block_count * full_encoded_block_size + - encoded_block_sizes[last_block_size]; - - var res = new Uint8Array(res_size); - var i; - for (i = 0; i < res_size; ++i) { - res[i] = alphabet[0]; - } - for (i = 0; i < full_block_count; i++) { - res = b58.encode_block( - data.subarray( - i * full_block_size, - i * full_block_size + full_block_size, - ), - res, - i * full_encoded_block_size, - ); - } - if (last_block_size > 0) { - res = b58.encode_block( - data.subarray( - full_block_count * full_block_size, - full_block_count * full_block_size + last_block_size, - ), - res, - full_block_count * full_encoded_block_size, - ); - } - return bintostr(res); - }; - - b58.decode_block = function(data, buf, index) { - if (data.length < 1 || data.length > full_encoded_block_size) { - throw "Invalid block length: " + data.length; - } - - var res_size = encoded_block_sizes.indexOf(data.length); - if (res_size <= 0) { - throw "Invalid block size"; - } - var res_num = new JSBigInt(0); - var order = new JSBigInt(1); - for (var i = data.length - 1; i >= 0; i--) { - var digit = alphabet.indexOf(data[i]); - if (digit < 0) { - throw "Invalid symbol"; - } - var product = order.multiply(digit).add(res_num); - // if product > UINT64_MAX - if (product.compare(UINT64_MAX) === 1) { - throw "Overflow"; - } - res_num = product; - order = order.multiply(alphabet_size); - } - if ( - res_size < full_block_size && - new JSBigInt(2).pow(8 * res_size).compare(res_num) <= 0 - ) { - throw "Overflow 2"; - } - buf.set(uint64_to_8be(res_num, res_size), index); - return buf; - }; - - b58.decode = function(enc) { - enc = strtobin(enc); - if (enc.length === 0) { - return ""; - } - var full_block_count = Math.floor(enc.length / full_encoded_block_size); - var last_block_size = enc.length % full_encoded_block_size; - var last_block_decoded_size = encoded_block_sizes.indexOf( - last_block_size, - ); - if (last_block_decoded_size < 0) { - throw "Invalid encoded length"; - } - var data_size = - full_block_count * full_block_size + last_block_decoded_size; - var data = new Uint8Array(data_size); - for (var i = 0; i < full_block_count; i++) { - data = b58.decode_block( - enc.subarray( - i * full_encoded_block_size, - i * full_encoded_block_size + full_encoded_block_size, - ), - data, - i * full_block_size, - ); - } - if (last_block_size > 0) { - data = b58.decode_block( - enc.subarray( - full_block_count * full_encoded_block_size, - full_block_count * full_encoded_block_size + - last_block_size, - ), - data, - full_block_count * full_block_size, - ); - } - return bintohex(data); - }; - - return b58; -})(); - -exports.cnBase58 = cnBase58; diff --git a/cryptonote_utils/cryptonote_utils.js b/cryptonote_utils/cryptonote_utils.js index 5cf5314..e2ca445 100644 --- a/cryptonote_utils/cryptonote_utils.js +++ b/cryptonote_utils/cryptonote_utils.js @@ -32,7 +32,6 @@ // // v--- These should maybe be injected into a context and supplied to currencyConfig for future platforms const JSBigInt = require("./biginteger").BigInteger; -const mnemonic = require("./mnemonic"); const nettype_utils = require("./nettype"); // Math.random = function() diff --git a/cryptonote_utils/mnemonic.js b/cryptonote_utils/mnemonic.js deleted file mode 100644 index f33fdfe..0000000 --- a/cryptonote_utils/mnemonic.js +++ /dev/null @@ -1,1240 +0,0 @@ -/* -mnemonic.js : Converts between 4-byte aligned strings and a human-readable -sequence of words. Uses 1626 common words taken from wikipedia article: -http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists/Contemporary_poetry -Originally written in python special for Electrum (lightweight Bitcoin client). -This version has been reimplemented in javascript and placed in public domain. -*/ -/* This file has been modified to export its various functions and properties */ - - -(function(exports) -{ - var isNodeJSOrElectronRenderer - if (typeof window !== 'undefined' && window.IsElectronRendererProcess !== true) { - isNodeJSOrElectronRenderer = false - } else { - isNodeJSOrElectronRenderer = true - } - // - var crc32 = require('./crc32').crc32 - var nodeJS__crypto; - if (isNodeJSOrElectronRenderer == true) { - nodeJS__crypto = require('crypto') - } - // - var mn_default_wordset = 'english'; - exports.mn_default_wordset = mn_default_wordset; - - function mn_get_checksum_index(words, prefix_len) { - var trimmed_words = ""; - for (var i = 0; i < words.length; i++) { - trimmed_words += words[i].slice(0, prefix_len); - } - var checksum = crc32.run(trimmed_words); - var index = checksum % words.length; - return index; - } - exports.mn_get_checksum_index = mn_get_checksum_index; - - function mn_encode(str, wordset_name) { - 'use strict'; - wordset_name = wordset_name || mn_default_wordset; - var wordset = mn_words[wordset_name]; - var out = []; - var n = wordset.words.length; - for (var j = 0; j < str.length; j += 8) { - str = str.slice(0, j) + mn_swap_endian_4byte(str.slice(j, j + 8)) + str.slice(j + 8); - } - for (var i = 0; i < str.length; i += 8) { - var x = parseInt(str.substr(i, 8), 16); - var w1 = (x % n); - var w2 = (Math.floor(x / n) + w1) % n; - var w3 = (Math.floor(Math.floor(x / n) / n) + w2) % n; - out = out.concat([wordset.words[w1], wordset.words[w2], wordset.words[w3]]); - } - if (wordset.prefix_len > 0) { - out.push(out[mn_get_checksum_index(out, wordset.prefix_len)]); - } - return out.join(' '); - } - exports.mn_encode = mn_encode - - function mn_swap_endian_4byte(str) { - 'use strict'; - if (str.length !== 8) throw 'Invalid input length: ' + str.length; - return str.slice(6, 8) + str.slice(4, 6) + str.slice(2, 4) + str.slice(0, 2); - } - exports.mn_swap_endian_4byte = mn_swap_endian_4byte; - - function mn_decode(str, wordset_name) { - 'use strict'; - wordset_name = wordset_name || mn_default_wordset; - var wordset = mn_words[wordset_name]; - var out = ''; - var n = wordset.words.length; - var wlist = str.toLowerCase().split(' '); - var checksum_word = ''; - if (wlist.length < 12) throw "You've entered too few words, please try again"; - if ((wordset.prefix_len === 0 && (wlist.length % 3 !== 0)) || - (wordset.prefix_len > 0 && (wlist.length % 3 === 2))) throw "You've entered too few words, please try again"; - if (wordset.prefix_len > 0 && (wlist.length % 3 === 0)) throw "You seem to be missing the last word in your private key, please try again"; - if (wordset.prefix_len > 0) { - // Pop checksum from mnemonic - checksum_word = wlist.pop(); - } - // Decode mnemonic - for (var i = 0; i < wlist.length; i += 3) { - var w1, w2, w3; - if (wordset.prefix_len === 0) { - w1 = wordset.words.indexOf(wlist[i]); - w2 = wordset.words.indexOf(wlist[i + 1]); - w3 = wordset.words.indexOf(wlist[i + 2]); - } else { - w1 = wordset.trunc_words.indexOf(wlist[i].slice(0, wordset.prefix_len)); - w2 = wordset.trunc_words.indexOf(wlist[i + 1].slice(0, wordset.prefix_len)); - w3 = wordset.trunc_words.indexOf(wlist[i + 2].slice(0, wordset.prefix_len)); - } - if (w1 === -1 || w2 === -1 || w3 === -1) { - throw "invalid word in mnemonic"; - } - var x = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n); - if (x % n != w1) throw 'Something went wrong when decoding your private key, please try again'; - out += mn_swap_endian_4byte(('0000000' + x.toString(16)).slice(-8)); - } - // Verify checksum - if (wordset.prefix_len > 0) { - var index = mn_get_checksum_index(wlist, wordset.prefix_len); - var expected_checksum_word = wlist[index]; - if (expected_checksum_word.slice(0, wordset.prefix_len) !== checksum_word.slice(0, wordset.prefix_len)) { - throw "Your private key could not be verified, please try again"; - } - } - return out; - } - exports.mn_decode = mn_decode; - - function mn_random(bits) { - 'use strict'; - if (bits % 32 !== 0) throw "Something weird went wrong: Invalid number of bits - " + bits; - if (isNodeJSOrElectronRenderer == false) { - // browser implementation - var array = new Uint32Array(bits / 32); - - var i = 0; - - function arr_is_zero() { - for (var j = 0; j < bits / 32; ++j) { - if (array[j] !== 0) return false; - } - return true; - } - - do { - /// Doing this in the loop is chunky, blame Microsoft and the in-flux status of the window.crypto standard - if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) { - window.crypto.getRandomValues(array); - } else if (typeof window !== 'undefined' && typeof window.msCrypto === 'object' && typeof window.msCrypto.getRandomValues === 'function') { - window.msCrypto.getRandomValues(array); - } else { - throw "Unfortunately MyMonero only runs on browsers that support the JavaScript Crypto API"; - } - - ++i; - } while (i < 5 && arr_is_zero()); - if (arr_is_zero()) { - throw "Something went wrong and we could not securely generate random data for your account"; - } - // Convert to hex - var out = ''; - for (var j = 0; j < bits / 32; ++j) { - out += ('0000000' + array[j].toString(16)).slice(-8); - } - - return out; - } else { - // node.js implementation - // v---- Declared above - const buffer = nodeJS__crypto.randomBytes(bits / 8) // assuming 8 bits in byte - const hexString = buffer.toString("hex") - // - return hexString - } - } - exports.mn_random = mn_random; - - var mn_words = { - 'electrum': { - prefix_len: 0, - words: [ - "like", "just", "love", "know", "never", "want", "time", "out", "there", - "make", "look", "eye", "down", "only", "think", "heart", "back", "then", - "into", "about", "more", "away", "still", "them", "take", "thing", "even", - "through", "long", "always", "world", "too", "friend", "tell", "try", - "hand", "thought", "over", "here", "other", "need", "smile", "again", - "much", "cry", "been", "night", "ever", "little", "said", "end", "some", - "those", "around", "mind", "people", "girl", "leave", "dream", "left", - "turn", "myself", "give", "nothing", "really", "off", "before", - "something", "find", "walk", "wish", "good", "once", "place", "ask", - "stop", "keep", "watch", "seem", "everything", "wait", "got", "yet", - "made", "remember", "start", "alone", "run", "hope", "maybe", "believe", - "body", "hate", "after", "close", "talk", "stand", "own", "each", "hurt", - "help", "home", "god", "soul", "new", "many", "two", "inside", "should", - "true", "first", "fear", "mean", "better", "play", "another", "gone", - "change", "use", "wonder", "someone", "hair", "cold", "open", "best", - "any", "behind", "happen", "water", "dark", "laugh", "stay", "forever", - "name", "work", "show", "sky", "break", "came", "deep", "door", "put", - "black", "together", "upon", "happy", "such", "great", "white", "matter", - "fill", "past", "please", "burn", "cause", "enough", "touch", "moment", - "soon", "voice", "scream", "anything", "stare", "sound", "red", "everyone", - "hide", "kiss", "truth", "death", "beautiful", "mine", "blood", "broken", - "very", "pass", "next", "forget", "tree", "wrong", "air", "mother", - "understand", "lip", "hit", "wall", "memory", "sleep", "free", "high", - "realize", "school", "might", "skin", "sweet", "perfect", "blue", "kill", - "breath", "dance", "against", "fly", "between", "grow", "strong", "under", - "listen", "bring", "sometimes", "speak", "pull", "person", "become", - "family", "begin", "ground", "real", "small", "father", "sure", "feet", - "rest", "young", "finally", "land", "across", "today", "different", "guy", - "line", "fire", "reason", "reach", "second", "slowly", "write", "eat", - "smell", "mouth", "step", "learn", "three", "floor", "promise", "breathe", - "darkness", "push", "earth", "guess", "save", "song", "above", "along", - "both", "color", "house", "almost", "sorry", "anymore", "brother", "okay", - "dear", "game", "fade", "already", "apart", "warm", "beauty", "heard", - "notice", "question", "shine", "began", "piece", "whole", "shadow", - "secret", "street", "within", "finger", "point", "morning", "whisper", - "child", "moon", "green", "story", "glass", "kid", "silence", "since", - "soft", "yourself", "empty", "shall", "angel", "answer", "baby", "bright", - "dad", "path", "worry", "hour", "drop", "follow", "power", "war", "half", - "flow", "heaven", "act", "chance", "fact", "least", "tired", "children", - "near", "quite", "afraid", "rise", "sea", "taste", "window", "cover", - "nice", "trust", "lot", "sad", "cool", "force", "peace", "return", "blind", - "easy", "ready", "roll", "rose", "drive", "held", "music", "beneath", - "hang", "mom", "paint", "emotion", "quiet", "clear", "cloud", "few", - "pretty", "bird", "outside", "paper", "picture", "front", "rock", "simple", - "anyone", "meant", "reality", "road", "sense", "waste", "bit", "leaf", - "thank", "happiness", "meet", "men", "smoke", "truly", "decide", "self", - "age", "book", "form", "alive", "carry", "escape", "damn", "instead", - "able", "ice", "minute", "throw", "catch", "leg", "ring", "course", - "goodbye", "lead", "poem", "sick", "corner", "desire", "known", "problem", - "remind", "shoulder", "suppose", "toward", "wave", "drink", "jump", - "woman", "pretend", "sister", "week", "human", "joy", "crack", "grey", - "pray", "surprise", "dry", "knee", "less", "search", "bleed", "caught", - "clean", "embrace", "future", "king", "son", "sorrow", "chest", "hug", - "remain", "sat", "worth", "blow", "daddy", "final", "parent", "tight", - "also", "create", "lonely", "safe", "cross", "dress", "evil", "silent", - "bone", "fate", "perhaps", "anger", "class", "scar", "snow", "tiny", - "tonight", "continue", "control", "dog", "edge", "mirror", "month", - "suddenly", "comfort", "given", "loud", "quickly", "gaze", "plan", "rush", - "stone", "town", "battle", "ignore", "spirit", "stood", "stupid", "yours", - "brown", "build", "dust", "hey", "kept", "pay", "phone", "twist", - "although", "ball", "beyond", "hidden", "nose", "taken", "fail", "float", - "pure", "somehow", "wash", "wrap", "angry", "cheek", "creature", - "forgotten", "heat", "rip", "single", "space", "special", "weak", - "whatever", "yell", "anyway", "blame", "job", "choose", "country", "curse", - "drift", "echo", "figure", "grew", "laughter", "neck", "suffer", "worse", - "yeah", "disappear", "foot", "forward", "knife", "mess", "somewhere", - "stomach", "storm", "beg", "idea", "lift", "offer", "breeze", "field", - "five", "often", "simply", "stuck", "win", "allow", "confuse", "enjoy", - "except", "flower", "seek", "strength", "calm", "grin", "gun", "heavy", - "hill", "large", "ocean", "shoe", "sigh", "straight", "summer", "tongue", - "accept", "crazy", "everyday", "exist", "grass", "mistake", "sent", "shut", - "surround", "table", "ache", "brain", "destroy", "heal", "nature", "shout", - "sign", "stain", "choice", "doubt", "glance", "glow", "mountain", "queen", - "stranger", "throat", "tomorrow", "city", "either", "fish", "flame", - "rather", "shape", "spin", "spread", "ash", "distance", "finish", "image", - "imagine", "important", "nobody", "shatter", "warmth", "became", "feed", - "flesh", "funny", "lust", "shirt", "trouble", "yellow", "attention", - "bare", "bite", "money", "protect", "amaze", "appear", "born", "choke", - "completely", "daughter", "fresh", "friendship", "gentle", "probably", - "six", "deserve", "expect", "grab", "middle", "nightmare", "river", - "thousand", "weight", "worst", "wound", "barely", "bottle", "cream", - "regret", "relationship", "stick", "test", "crush", "endless", "fault", - "itself", "rule", "spill", "art", "circle", "join", "kick", "mask", - "master", "passion", "quick", "raise", "smooth", "unless", "wander", - "actually", "broke", "chair", "deal", "favorite", "gift", "note", "number", - "sweat", "box", "chill", "clothes", "lady", "mark", "park", "poor", - "sadness", "tie", "animal", "belong", "brush", "consume", "dawn", "forest", - "innocent", "pen", "pride", "stream", "thick", "clay", "complete", "count", - "draw", "faith", "press", "silver", "struggle", "surface", "taught", - "teach", "wet", "bless", "chase", "climb", "enter", "letter", "melt", - "metal", "movie", "stretch", "swing", "vision", "wife", "beside", "crash", - "forgot", "guide", "haunt", "joke", "knock", "plant", "pour", "prove", - "reveal", "steal", "stuff", "trip", "wood", "wrist", "bother", "bottom", - "crawl", "crowd", "fix", "forgive", "frown", "grace", "loose", "lucky", - "party", "release", "surely", "survive", "teacher", "gently", "grip", - "speed", "suicide", "travel", "treat", "vein", "written", "cage", "chain", - "conversation", "date", "enemy", "however", "interest", "million", "page", - "pink", "proud", "sway", "themselves", "winter", "church", "cruel", "cup", - "demon", "experience", "freedom", "pair", "pop", "purpose", "respect", - "shoot", "softly", "state", "strange", "bar", "birth", "curl", "dirt", - "excuse", "lord", "lovely", "monster", "order", "pack", "pants", "pool", - "scene", "seven", "shame", "slide", "ugly", "among", "blade", "blonde", - "closet", "creek", "deny", "drug", "eternity", "gain", "grade", "handle", - "key", "linger", "pale", "prepare", "swallow", "swim", "tremble", "wheel", - "won", "cast", "cigarette", "claim", "college", "direction", "dirty", - "gather", "ghost", "hundred", "loss", "lung", "orange", "present", "swear", - "swirl", "twice", "wild", "bitter", "blanket", "doctor", "everywhere", - "flash", "grown", "knowledge", "numb", "pressure", "radio", "repeat", - "ruin", "spend", "unknown", "buy", "clock", "devil", "early", "false", - "fantasy", "pound", "precious", "refuse", "sheet", "teeth", "welcome", - "add", "ahead", "block", "bury", "caress", "content", "depth", "despite", - "distant", "marry", "purple", "threw", "whenever", "bomb", "dull", - "easily", "grasp", "hospital", "innocence", "normal", "receive", "reply", - "rhyme", "shade", "someday", "sword", "toe", "visit", "asleep", "bought", - "center", "consider", "flat", "hero", "history", "ink", "insane", "muscle", - "mystery", "pocket", "reflection", "shove", "silently", "smart", "soldier", - "spot", "stress", "train", "type", "view", "whether", "bus", "energy", - "explain", "holy", "hunger", "inch", "magic", "mix", "noise", "nowhere", - "prayer", "presence", "shock", "snap", "spider", "study", "thunder", - "trail", "admit", "agree", "bag", "bang", "bound", "butterfly", "cute", - "exactly", "explode", "familiar", "fold", "further", "pierce", "reflect", - "scent", "selfish", "sharp", "sink", "spring", "stumble", "universe", - "weep", "women", "wonderful", "action", "ancient", "attempt", "avoid", - "birthday", "branch", "chocolate", "core", "depress", "drunk", - "especially", "focus", "fruit", "honest", "match", "palm", "perfectly", - "pillow", "pity", "poison", "roar", "shift", "slightly", "thump", "truck", - "tune", "twenty", "unable", "wipe", "wrote", "coat", "constant", "dinner", - "drove", "egg", "eternal", "flight", "flood", "frame", "freak", "gasp", - "glad", "hollow", "motion", "peer", "plastic", "root", "screen", "season", - "sting", "strike", "team", "unlike", "victim", "volume", "warn", "weird", - "attack", "await", "awake", "built", "charm", "crave", "despair", "fought", - "grant", "grief", "horse", "limit", "message", "ripple", "sanity", - "scatter", "serve", "split", "string", "trick", "annoy", "blur", "boat", - "brave", "clearly", "cling", "connect", "fist", "forth", "imagination", - "iron", "jock", "judge", "lesson", "milk", "misery", "nail", "naked", - "ourselves", "poet", "possible", "princess", "sail", "size", "snake", - "society", "stroke", "torture", "toss", "trace", "wise", "bloom", "bullet", - "cell", "check", "cost", "darling", "during", "footstep", "fragile", - "hallway", "hardly", "horizon", "invisible", "journey", "midnight", "mud", - "nod", "pause", "relax", "shiver", "sudden", "value", "youth", "abuse", - "admire", "blink", "breast", "bruise", "constantly", "couple", "creep", - "curve", "difference", "dumb", "emptiness", "gotta", "honor", "plain", - "planet", "recall", "rub", "ship", "slam", "soar", "somebody", "tightly", - "weather", "adore", "approach", "bond", "bread", "burst", "candle", - "coffee", "cousin", "crime", "desert", "flutter", "frozen", "grand", - "heel", "hello", "language", "level", "movement", "pleasure", "powerful", - "random", "rhythm", "settle", "silly", "slap", "sort", "spoken", "steel", - "threaten", "tumble", "upset", "aside", "awkward", "bee", "blank", "board", - "button", "card", "carefully", "complain", "crap", "deeply", "discover", - "drag", "dread", "effort", "entire", "fairy", "giant", "gotten", "greet", - "illusion", "jeans", "leap", "liquid", "march", "mend", "nervous", "nine", - "replace", "rope", "spine", "stole", "terror", "accident", "apple", - "balance", "boom", "childhood", "collect", "demand", "depression", - "eventually", "faint", "glare", "goal", "group", "honey", "kitchen", - "laid", "limb", "machine", "mere", "mold", "murder", "nerve", "painful", - "poetry", "prince", "rabbit", "shelter", "shore", "shower", "soothe", - "stair", "steady", "sunlight", "tangle", "tease", "treasure", "uncle", - "begun", "bliss", "canvas", "cheer", "claw", "clutch", "commit", "crimson", - "crystal", "delight", "doll", "existence", "express", "fog", "football", - "gay", "goose", "guard", "hatred", "illuminate", "mass", "math", "mourn", - "rich", "rough", "skip", "stir", "student", "style", "support", "thorn", - "tough", "yard", "yearn", "yesterday", "advice", "appreciate", "autumn", - "bank", "beam", "bowl", "capture", "carve", "collapse", "confusion", - "creation", "dove", "feather", "girlfriend", "glory", "government", - "harsh", "hop", "inner", "loser", "moonlight", "neighbor", "neither", - "peach", "pig", "praise", "screw", "shield", "shimmer", "sneak", "stab", - "subject", "throughout", "thrown", "tower", "twirl", "wow", "army", - "arrive", "bathroom", "bump", "cease", "cookie", "couch", "courage", "dim", - "guilt", "howl", "hum", "husband", "insult", "led", "lunch", "mock", - "mostly", "natural", "nearly", "needle", "nerd", "peaceful", "perfection", - "pile", "price", "remove", "roam", "sanctuary", "serious", "shiny", - "shook", "sob", "stolen", "tap", "vain", "void", "warrior", "wrinkle", - "affection", "apologize", "blossom", "bounce", "bridge", "cheap", - "crumble", "decision", "descend", "desperately", "dig", "dot", "flip", - "frighten", "heartbeat", "huge", "lazy", "lick", "odd", "opinion", - "process", "puzzle", "quietly", "retreat", "score", "sentence", "separate", - "situation", "skill", "soak", "square", "stray", "taint", "task", "tide", - "underneath", "veil", "whistle", "anywhere", "bedroom", "bid", "bloody", - "burden", "careful", "compare", "concern", "curtain", "decay", "defeat", - "describe", "double", "dreamer", "driver", "dwell", "evening", "flare", - "flicker", "grandma", "guitar", "harm", "horrible", "hungry", "indeed", - "lace", "melody", "monkey", "nation", "object", "obviously", "rainbow", - "salt", "scratch", "shown", "shy", "stage", "stun", "third", "tickle", - "useless", "weakness", "worship", "worthless", "afternoon", "beard", - "boyfriend", "bubble", "busy", "certain", "chin", "concrete", "desk", - "diamond", "doom", "drawn", "due", "felicity", "freeze", "frost", "garden", - "glide", "harmony", "hopefully", "hunt", "jealous", "lightning", "mama", - "mercy", "peel", "physical", "position", "pulse", "punch", "quit", "rant", - "respond", "salty", "sane", "satisfy", "savior", "sheep", "slept", - "social", "sport", "tuck", "utter", "valley", "wolf", "aim", "alas", - "alter", "arrow", "awaken", "beaten", "belief", "brand", "ceiling", - "cheese", "clue", "confidence", "connection", "daily", "disguise", "eager", - "erase", "essence", "everytime", "expression", "fan", "flag", "flirt", - "foul", "fur", "giggle", "glorious", "ignorance", "law", "lifeless", - "measure", "mighty", "muse", "north", "opposite", "paradise", "patience", - "patient", "pencil", "petal", "plate", "ponder", "possibly", "practice", - "slice", "spell", "stock", "strife", "strip", "suffocate", "suit", - "tender", "tool", "trade", "velvet", "verse", "waist", "witch", "aunt", - "bench", "bold", "cap", "certainly", "click", "companion", "creator", - "dart", "delicate", "determine", "dish", "dragon", "drama", "drum", "dude", - "everybody", "feast", "forehead", "former", "fright", "fully", "gas", - "hook", "hurl", "invite", "juice", "manage", "moral", "possess", "raw", - "rebel", "royal", "scale", "scary", "several", "slight", "stubborn", - "swell", "talent", "tea", "terrible", "thread", "torment", "trickle", - "usually", "vast", "violence", "weave", "acid", "agony", "ashamed", "awe", - "belly", "blend", "blush", "character", "cheat", "common", "company", - "coward", "creak", "danger", "deadly", "defense", "define", "depend", - "desperate", "destination", "dew", "duck", "dusty", "embarrass", "engine", - "example", "explore", "foe", "freely", "frustrate", "generation", "glove", - "guilty", "health", "hurry", "idiot", "impossible", "inhale", "jaw", - "kingdom", "mention", "mist", "moan", "mumble", "mutter", "observe", "ode", - "pathetic", "pattern", "pie", "prefer", "puff", "rape", "rare", "revenge", - "rude", "scrape", "spiral", "squeeze", "strain", "sunset", "suspend", - "sympathy", "thigh", "throne", "total", "unseen", "weapon", "weary" - ] - }, - 'english': { - prefix_len: 3, - words: [ - "abbey", "abducts", "ability", "ablaze", "abnormal", "abort", "abrasive", "absorb", - "abyss", "academy", "aces", "aching", "acidic", "acoustic", "acquire", "across", - "actress", "acumen", "adapt", "addicted", "adept", "adhesive", "adjust", "adopt", - "adrenalin", "adult", "adventure", "aerial", "afar", "affair", "afield", "afloat", - "afoot", "afraid", "after", "against", "agenda", "aggravate", "agile", "aglow", - "agnostic", "agony", "agreed", "ahead", "aided", "ailments", "aimless", "airport", - "aisle", "ajar", "akin", "alarms", "album", "alchemy", "alerts", "algebra", - "alkaline", "alley", "almost", "aloof", "alpine", "already", "also", "altitude", - "alumni", "always", "amaze", "ambush", "amended", "amidst", "ammo", "amnesty", - "among", "amply", "amused", "anchor", "android", "anecdote", "angled", "ankle", - "annoyed", "answers", "antics", "anvil", "anxiety", "anybody", "apart", "apex", - "aphid", "aplomb", "apology", "apply", "apricot", "aptitude", "aquarium", "arbitrary", - "archer", "ardent", "arena", "argue", "arises", "army", "around", "arrow", - "arsenic", "artistic", "ascend", "ashtray", "aside", "asked", "asleep", "aspire", - "assorted", "asylum", "athlete", "atlas", "atom", "atrium", "attire", "auburn", - "auctions", "audio", "august", "aunt", "austere", "autumn", "avatar", "avidly", - "avoid", "awakened", "awesome", "awful", "awkward", "awning", "awoken", "axes", - "axis", "axle", "aztec", "azure", "baby", "bacon", "badge", "baffles", - "bagpipe", "bailed", "bakery", "balding", "bamboo", "banjo", "baptism", "basin", - "batch", "bawled", "bays", "because", "beer", "befit", "begun", "behind", - "being", "below", "bemused", "benches", "berries", "bested", "betting", "bevel", - "beware", "beyond", "bias", "bicycle", "bids", "bifocals", "biggest", "bikini", - "bimonthly", "binocular", "biology", "biplane", "birth", "biscuit", "bite", "biweekly", - "blender", "blip", "bluntly", "boat", "bobsled", "bodies", "bogeys", "boil", - "boldly", "bomb", "border", "boss", "both", "bounced", "bovine", "bowling", - "boxes", "boyfriend", "broken", "brunt", "bubble", "buckets", "budget", "buffet", - "bugs", "building", "bulb", "bumper", "bunch", "business", "butter", "buying", - "buzzer", "bygones", "byline", "bypass", "cabin", "cactus", "cadets", "cafe", - "cage", "cajun", "cake", "calamity", "camp", "candy", "casket", "catch", - "cause", "cavernous", "cease", "cedar", "ceiling", "cell", "cement", "cent", - "certain", "chlorine", "chrome", "cider", "cigar", "cinema", "circle", "cistern", - "citadel", "civilian", "claim", "click", "clue", "coal", "cobra", "cocoa", - "code", "coexist", "coffee", "cogs", "cohesive", "coils", "colony", "comb", - "cool", "copy", "corrode", "costume", "cottage", "cousin", "cowl", "criminal", - "cube", "cucumber", "cuddled", "cuffs", "cuisine", "cunning", "cupcake", "custom", - "cycling", "cylinder", "cynical", "dabbing", "dads", "daft", "dagger", "daily", - "damp", "dangerous", "dapper", "darted", "dash", "dating", "dauntless", "dawn", - "daytime", "dazed", "debut", "decay", "dedicated", "deepest", "deftly", "degrees", - "dehydrate", "deity", "dejected", "delayed", "demonstrate", "dented", "deodorant", "depth", - "desk", "devoid", "dewdrop", "dexterity", "dialect", "dice", "diet", "different", - "digit", "dilute", "dime", "dinner", "diode", "diplomat", "directed", "distance", - "ditch", "divers", "dizzy", "doctor", "dodge", "does", "dogs", "doing", - "dolphin", "domestic", "donuts", "doorway", "dormant", "dosage", "dotted", "double", - "dove", "down", "dozen", "dreams", "drinks", "drowning", "drunk", "drying", - "dual", "dubbed", "duckling", "dude", "duets", "duke", "dullness", "dummy", - "dunes", "duplex", "duration", "dusted", "duties", "dwarf", "dwelt", "dwindling", - "dying", "dynamite", "dyslexic", "each", "eagle", "earth", "easy", "eating", - "eavesdrop", "eccentric", "echo", "eclipse", "economics", "ecstatic", "eden", "edgy", - "edited", "educated", "eels", "efficient", "eggs", "egotistic", "eight", "either", - "eject", "elapse", "elbow", "eldest", "eleven", "elite", "elope", "else", - "eluded", "emails", "ember", "emerge", "emit", "emotion", "empty", "emulate", - "energy", "enforce", "enhanced", "enigma", "enjoy", "enlist", "enmity", "enough", - "enraged", "ensign", "entrance", "envy", "epoxy", "equip", "erase", "erected", - "erosion", "error", "eskimos", "espionage", "essential", "estate", "etched", "eternal", - "ethics", "etiquette", "evaluate", "evenings", "evicted", "evolved", "examine", "excess", - "exhale", "exit", "exotic", "exquisite", "extra", "exult", "fabrics", "factual", - "fading", "fainted", "faked", "fall", "family", "fancy", "farming", "fatal", - "faulty", "fawns", "faxed", "fazed", "feast", "february", "federal", "feel", - "feline", "females", "fences", "ferry", "festival", "fetches", "fever", "fewest", - "fiat", "fibula", "fictional", "fidget", "fierce", "fifteen", "fight", "films", - "firm", "fishing", "fitting", "five", "fixate", "fizzle", "fleet", "flippant", - "flying", "foamy", "focus", "foes", "foggy", "foiled", "folding", "fonts", - "foolish", "fossil", "fountain", "fowls", "foxes", "foyer", "framed", "friendly", - "frown", "fruit", "frying", "fudge", "fuel", "fugitive", "fully", "fuming", - "fungal", "furnished", "fuselage", "future", "fuzzy", "gables", "gadget", "gags", - "gained", "galaxy", "gambit", "gang", "gasp", "gather", "gauze", "gave", - "gawk", "gaze", "gearbox", "gecko", "geek", "gels", "gemstone", "general", - "geometry", "germs", "gesture", "getting", "geyser", "ghetto", "ghost", "giant", - "giddy", "gifts", "gigantic", "gills", "gimmick", "ginger", "girth", "giving", - "glass", "gleeful", "glide", "gnaw", "gnome", "goat", "goblet", "godfather", - "goes", "goggles", "going", "goldfish", "gone", "goodbye", "gopher", "gorilla", - "gossip", "gotten", "gourmet", "governing", "gown", "greater", "grunt", "guarded", - "guest", "guide", "gulp", "gumball", "guru", "gusts", "gutter", "guys", - "gymnast", "gypsy", "gyrate", "habitat", "hacksaw", "haggled", "hairy", "hamburger", - "happens", "hashing", "hatchet", "haunted", "having", "hawk", "haystack", "hazard", - "hectare", "hedgehog", "heels", "hefty", "height", "hemlock", "hence", "heron", - "hesitate", "hexagon", "hickory", "hiding", "highway", "hijack", "hiker", "hills", - "himself", "hinder", "hippo", "hire", "history", "hitched", "hive", "hoax", - "hobby", "hockey", "hoisting", "hold", "honked", "hookup", "hope", "hornet", - "hospital", "hotel", "hounded", "hover", "howls", "hubcaps", "huddle", "huge", - "hull", "humid", "hunter", "hurried", "husband", "huts", "hybrid", "hydrogen", - "hyper", "iceberg", "icing", "icon", "identity", "idiom", "idled", "idols", - "igloo", "ignore", "iguana", "illness", "imagine", "imbalance", "imitate", "impel", - "inactive", "inbound", "incur", "industrial", "inexact", "inflamed", "ingested", "initiate", - "injury", "inkling", "inline", "inmate", "innocent", "inorganic", "input", "inquest", - "inroads", "insult", "intended", "inundate", "invoke", "inwardly", "ionic", "irate", - "iris", "irony", "irritate", "island", "isolated", "issued", "italics", "itches", - "items", "itinerary", "itself", "ivory", "jabbed", "jackets", "jaded", "jagged", - "jailed", "jamming", "january", "jargon", "jaunt", "javelin", "jaws", "jazz", - "jeans", "jeers", "jellyfish", "jeopardy", "jerseys", "jester", "jetting", "jewels", - "jigsaw", "jingle", "jittery", "jive", "jobs", "jockey", "jogger", "joining", - "joking", "jolted", "jostle", "journal", "joyous", "jubilee", "judge", "juggled", - "juicy", "jukebox", "july", "jump", "junk", "jury", "justice", "juvenile", - "kangaroo", "karate", "keep", "kennel", "kept", "kernels", "kettle", "keyboard", - "kickoff", "kidneys", "king", "kiosk", "kisses", "kitchens", "kiwi", "knapsack", - "knee", "knife", "knowledge", "knuckle", "koala", "laboratory", "ladder", "lagoon", - "lair", "lakes", "lamb", "language", "laptop", "large", "last", "later", - "launching", "lava", "lawsuit", "layout", "lazy", "lectures", "ledge", "leech", - "left", "legion", "leisure", "lemon", "lending", "leopard", "lesson", "lettuce", - "lexicon", "liar", "library", "licks", "lids", "lied", "lifestyle", "light", - "likewise", "lilac", "limits", "linen", "lion", "lipstick", "liquid", "listen", - "lively", "loaded", "lobster", "locker", "lodge", "lofty", "logic", "loincloth", - "long", "looking", "lopped", "lordship", "losing", "lottery", "loudly", "love", - "lower", "loyal", "lucky", "luggage", "lukewarm", "lullaby", "lumber", "lunar", - "lurk", "lush", "luxury", "lymph", "lynx", "lyrics", "macro", "madness", - "magically", "mailed", "major", "makeup", "malady", "mammal", "maps", "masterful", - "match", "maul", "maverick", "maximum", "mayor", "maze", "meant", "mechanic", - "medicate", "meeting", "megabyte", "melting", "memoir", "menu", "merger", "mesh", - "metro", "mews", "mice", "midst", "mighty", "mime", "mirror", "misery", - "mittens", "mixture", "moat", "mobile", "mocked", "mohawk", "moisture", "molten", - "moment", "money", "moon", "mops", "morsel", "mostly", "motherly", "mouth", - "movement", "mowing", "much", "muddy", "muffin", "mugged", "mullet", "mumble", - "mundane", "muppet", "mural", "musical", "muzzle", "myriad", "mystery", "myth", - "nabbing", "nagged", "nail", "names", "nanny", "napkin", "narrate", "nasty", - "natural", "nautical", "navy", "nearby", "necklace", "needed", "negative", "neither", - "neon", "nephew", "nerves", "nestle", "network", "neutral", "never", "newt", - "nexus", "nibs", "niche", "niece", "nifty", "nightly", "nimbly", "nineteen", - "nirvana", "nitrogen", "nobody", "nocturnal", "nodes", "noises", "nomad", "noodles", - "northern", "nostril", "noted", "nouns", "novelty", "nowhere", "nozzle", "nuance", - "nucleus", "nudged", "nugget", "nuisance", "null", "number", "nuns", "nurse", - "nutshell", "nylon", "oaks", "oars", "oasis", "oatmeal", "obedient", "object", - "obliged", "obnoxious", "observant", "obtains", "obvious", "occur", "ocean", "october", - "odds", "odometer", "offend", "often", "oilfield", "ointment", "okay", "older", - "olive", "olympics", "omega", "omission", "omnibus", "onboard", "oncoming", "oneself", - "ongoing", "onion", "online", "onslaught", "onto", "onward", "oozed", "opacity", - "opened", "opposite", "optical", "opus", "orange", "orbit", "orchid", "orders", - "organs", "origin", "ornament", "orphans", "oscar", "ostrich", "otherwise", "otter", - "ouch", "ought", "ounce", "ourselves", "oust", "outbreak", "oval", "oven", - "owed", "owls", "owner", "oxidant", "oxygen", "oyster", "ozone", "pact", - "paddles", "pager", "pairing", "palace", "pamphlet", "pancakes", "paper", "paradise", - "pastry", "patio", "pause", "pavements", "pawnshop", "payment", "peaches", "pebbles", - "peculiar", "pedantic", "peeled", "pegs", "pelican", "pencil", "people", "pepper", - "perfect", "pests", "petals", "phase", "pheasants", "phone", "phrases", "physics", - "piano", "picked", "pierce", "pigment", "piloted", "pimple", "pinched", "pioneer", - "pipeline", "pirate", "pistons", "pitched", "pivot", "pixels", "pizza", "playful", - "pledge", "pliers", "plotting", "plus", "plywood", "poaching", "pockets", "podcast", - "poetry", "point", "poker", "polar", "ponies", "pool", "popular", "portents", - "possible", "potato", "pouch", "poverty", "powder", "pram", "present", "pride", - "problems", "pruned", "prying", "psychic", "public", "puck", "puddle", "puffin", - "pulp", "pumpkins", "punch", "puppy", "purged", "push", "putty", "puzzled", - "pylons", "pyramid", "python", "queen", "quick", "quote", "rabbits", "racetrack", - "radar", "rafts", "rage", "railway", "raking", "rally", "ramped", "randomly", - "rapid", "rarest", "rash", "rated", "ravine", "rays", "razor", "react", - "rebel", "recipe", "reduce", "reef", "refer", "regular", "reheat", "reinvest", - "rejoices", "rekindle", "relic", "remedy", "renting", "reorder", "repent", "request", - "reruns", "rest", "return", "reunion", "revamp", "rewind", "rhino", "rhythm", - "ribbon", "richly", "ridges", "rift", "rigid", "rims", "ringing", "riots", - "ripped", "rising", "ritual", "river", "roared", "robot", "rockets", "rodent", - "rogue", "roles", "romance", "roomy", "roped", "roster", "rotate", "rounded", - "rover", "rowboat", "royal", "ruby", "rudely", "ruffled", "rugged", "ruined", - "ruling", "rumble", "runway", "rural", "rustled", "ruthless", "sabotage", "sack", - "sadness", "safety", "saga", "sailor", "sake", "salads", "sample", "sanity", - "sapling", "sarcasm", "sash", "satin", "saucepan", "saved", "sawmill", "saxophone", - "sayings", "scamper", "scenic", "school", "science", "scoop", "scrub", "scuba", - "seasons", "second", "sedan", "seeded", "segments", "seismic", "selfish", "semifinal", - "sensible", "september", "sequence", "serving", "session", "setup", "seventh", "sewage", - "shackles", "shelter", "shipped", "shocking", "shrugged", "shuffled", "shyness", "siblings", - "sickness", "sidekick", "sieve", "sifting", "sighting", "silk", "simplest", "sincerely", - "sipped", "siren", "situated", "sixteen", "sizes", "skater", "skew", "skirting", - "skulls", "skydive", "slackens", "sleepless", "slid", "slower", "slug", "smash", - "smelting", "smidgen", "smog", "smuggled", "snake", "sneeze", "sniff", "snout", - "snug", "soapy", "sober", "soccer", "soda", "software", "soggy", "soil", - "solved", "somewhere", "sonic", "soothe", "soprano", "sorry", "southern", "sovereign", - "sowed", "soya", "space", "speedy", "sphere", "spiders", "splendid", "spout", - "sprig", "spud", "spying", "square", "stacking", "stellar", "stick", "stockpile", - "strained", "stunning", "stylishly", "subtly", "succeed", "suddenly", "suede", "suffice", - "sugar", "suitcase", "sulking", "summon", "sunken", "superior", "surfer", "sushi", - "suture", "swagger", "swept", "swiftly", "sword", "swung", "syllabus", "symptoms", - "syndrome", "syringe", "system", "taboo", "tacit", "tadpoles", "tagged", "tail", - "taken", "talent", "tamper", "tanks", "tapestry", "tarnished", "tasked", "tattoo", - "taunts", "tavern", "tawny", "taxi", "teardrop", "technical", "tedious", "teeming", - "tell", "template", "tender", "tepid", "tequila", "terminal", "testing", "tether", - "textbook", "thaw", "theatrics", "thirsty", "thorn", "threaten", "thumbs", "thwart", - "ticket", "tidy", "tiers", "tiger", "tilt", "timber", "tinted", "tipsy", - "tirade", "tissue", "titans", "toaster", "tobacco", "today", "toenail", "toffee", - "together", "toilet", "token", "tolerant", "tomorrow", "tonic", "toolbox", "topic", - "torch", "tossed", "total", "touchy", "towel", "toxic", "toyed", "trash", - "trendy", "tribal", "trolling", "truth", "trying", "tsunami", "tubes", "tucks", - "tudor", "tuesday", "tufts", "tugs", "tuition", "tulips", "tumbling", "tunnel", - "turnip", "tusks", "tutor", "tuxedo", "twang", "tweezers", "twice", "twofold", - "tycoon", "typist", "tyrant", "ugly", "ulcers", "ultimate", "umbrella", "umpire", - "unafraid", "unbending", "uncle", "under", "uneven", "unfit", "ungainly", "unhappy", - "union", "unjustly", "unknown", "unlikely", "unmask", "unnoticed", "unopened", "unplugs", - "unquoted", "unrest", "unsafe", "until", "unusual", "unveil", "unwind", "unzip", - "upbeat", "upcoming", "update", "upgrade", "uphill", "upkeep", "upload", "upon", - "upper", "upright", "upstairs", "uptight", "upwards", "urban", "urchins", "urgent", - "usage", "useful", "usher", "using", "usual", "utensils", "utility", "utmost", - "utopia", "uttered", "vacation", "vague", "vain", "value", "vampire", "vane", - "vapidly", "vary", "vastness", "vats", "vaults", "vector", "veered", "vegan", - "vehicle", "vein", "velvet", "venomous", "verification", "vessel", "veteran", "vexed", - "vials", "vibrate", "victim", "video", "viewpoint", "vigilant", "viking", "village", - "vinegar", "violin", "vipers", "virtual", "visited", "vitals", "vivid", "vixen", - "vocal", "vogue", "voice", "volcano", "vortex", "voted", "voucher", "vowels", - "voyage", "vulture", "wade", "waffle", "wagtail", "waist", "waking", "wallets", - "wanted", "warped", "washing", "water", "waveform", "waxing", "wayside", "weavers", - "website", "wedge", "weekday", "weird", "welders", "went", "wept", "were", - "western", "wetsuit", "whale", "when", "whipped", "whole", "wickets", "width", - "wield", "wife", "wiggle", "wildly", "winter", "wipeout", "wiring", "wise", - "withdrawn", "wives", "wizard", "wobbly", "woes", "woken", "wolf", "womanly", - "wonders", "woozy", "worry", "wounded", "woven", "wrap", "wrist", "wrong", - "yacht", "yahoo", "yanks", "yard", "yawning", "yearbook", "yellow", "yesterday", - "yeti", "yields", "yodel", "yoga", "younger", "yoyo", "zapped", "zeal", - "zebra", "zero", "zesty", "zigzags", "zinger", "zippers", "zodiac", "zombie", - "zones", "zoom" - ] - }, - 'spanish': { - prefix_len: 4, - words: [ - "ábaco", "abdomen", "abeja", "abierto", "abogado", "abono", "aborto", "abrazo", - "abrir", "abuelo", "abuso", "acabar", "academia", "acceso", "acción", "aceite", - "acelga", "acento", "aceptar", "ácido", "aclarar", "acné", "acoger", "acoso", - "activo", "acto", "actriz", "actuar", "acudir", "acuerdo", "acusar", "adicto", - "admitir", "adoptar", "adorno", "aduana", "adulto", "aéreo", "afectar", "afición", - "afinar", "afirmar", "ágil", "agitar", "agonía", "agosto", "agotar", "agregar", - "agrio", "agua", "agudo", "águila", "aguja", "ahogo", "ahorro", "aire", - "aislar", "ajedrez", "ajeno", "ajuste", "alacrán", "alambre", "alarma", "alba", - "álbum", "alcalde", "aldea", "alegre", "alejar", "alerta", "aleta", "alfiler", - "alga", "algodón", "aliado", "aliento", "alivio", "alma", "almeja", "almíbar", - "altar", "alteza", "altivo", "alto", "altura", "alumno", "alzar", "amable", - "amante", "amapola", "amargo", "amasar", "ámbar", "ámbito", "ameno", "amigo", - "amistad", "amor", "amparo", "amplio", "ancho", "anciano", "ancla", "andar", - "andén", "anemia", "ángulo", "anillo", "ánimo", "anís", "anotar", "antena", - "antiguo", "antojo", "anual", "anular", "anuncio", "añadir", "añejo", "año", - "apagar", "aparato", "apetito", "apio", "aplicar", "apodo", "aporte", "apoyo", - "aprender", "aprobar", "apuesta", "apuro", "arado", "araña", "arar", "árbitro", - "árbol", "arbusto", "archivo", "arco", "arder", "ardilla", "arduo", "área", - "árido", "aries", "armonía", "arnés", "aroma", "arpa", "arpón", "arreglo", - "arroz", "arruga", "arte", "artista", "asa", "asado", "asalto", "ascenso", - "asegurar", "aseo", "asesor", "asiento", "asilo", "asistir", "asno", "asombro", - "áspero", "astilla", "astro", "astuto", "asumir", "asunto", "atajo", "ataque", - "atar", "atento", "ateo", "ático", "atleta", "átomo", "atraer", "atroz", - "atún", "audaz", "audio", "auge", "aula", "aumento", "ausente", "autor", - "aval", "avance", "avaro", "ave", "avellana", "avena", "avestruz", "avión", - "aviso", "ayer", "ayuda", "ayuno", "azafrán", "azar", "azote", "azúcar", - "azufre", "azul", "baba", "babor", "bache", "bahía", "baile", "bajar", - "balanza", "balcón", "balde", "bambú", "banco", "banda", "baño", "barba", - "barco", "barniz", "barro", "báscula", "bastón", "basura", "batalla", "batería", - "batir", "batuta", "baúl", "bazar", "bebé", "bebida", "bello", "besar", - "beso", "bestia", "bicho", "bien", "bingo", "blanco", "bloque", "blusa", - "boa", "bobina", "bobo", "boca", "bocina", "boda", "bodega", "boina", - "bola", "bolero", "bolsa", "bomba", "bondad", "bonito", "bono", "bonsái", - "borde", "borrar", "bosque", "bote", "botín", "bóveda", "bozal", "bravo", - "brazo", "brecha", "breve", "brillo", "brinco", "brisa", "broca", "broma", - "bronce", "brote", "bruja", "brusco", "bruto", "buceo", "bucle", "bueno", - "buey", "bufanda", "bufón", "búho", "buitre", "bulto", "burbuja", "burla", - "burro", "buscar", "butaca", "buzón", "caballo", "cabeza", "cabina", "cabra", - "cacao", "cadáver", "cadena", "caer", "café", "caída", "caimán", "caja", - "cajón", "cal", "calamar", "calcio", "caldo", "calidad", "calle", "calma", - "calor", "calvo", "cama", "cambio", "camello", "camino", "campo", "cáncer", - "candil", "canela", "canguro", "canica", "canto", "caña", "cañón", "caoba", - "caos", "capaz", "capitán", "capote", "captar", "capucha", "cara", "carbón", - "cárcel", "careta", "carga", "cariño", "carne", "carpeta", "carro", "carta", - "casa", "casco", "casero", "caspa", "castor", "catorce", "catre", "caudal", - "causa", "cazo", "cebolla", "ceder", "cedro", "celda", "célebre", "celoso", - "célula", "cemento", "ceniza", "centro", "cerca", "cerdo", "cereza", "cero", - "cerrar", "certeza", "césped", "cetro", "chacal", "chaleco", "champú", "chancla", - "chapa", "charla", "chico", "chiste", "chivo", "choque", "choza", "chuleta", - "chupar", "ciclón", "ciego", "cielo", "cien", "cierto", "cifra", "cigarro", - "cima", "cinco", "cine", "cinta", "ciprés", "circo", "ciruela", "cisne", - "cita", "ciudad", "clamor", "clan", "claro", "clase", "clave", "cliente", - "clima", "clínica", "cobre", "cocción", "cochino", "cocina", "coco", "código", - "codo", "cofre", "coger", "cohete", "cojín", "cojo", "cola", "colcha", - "colegio", "colgar", "colina", "collar", "colmo", "columna", "combate", "comer", - "comida", "cómodo", "compra", "conde", "conejo", "conga", "conocer", "consejo", - "contar", "copa", "copia", "corazón", "corbata", "corcho", "cordón", "corona", - "correr", "coser", "cosmos", "costa", "cráneo", "cráter", "crear", "crecer", - "creído", "crema", "cría", "crimen", "cripta", "crisis", "cromo", "crónica", - "croqueta", "crudo", "cruz", "cuadro", "cuarto", "cuatro", "cubo", "cubrir", - "cuchara", "cuello", "cuento", "cuerda", "cuesta", "cueva", "cuidar", "culebra", - "culpa", "culto", "cumbre", "cumplir", "cuna", "cuneta", "cuota", "cupón", - "cúpula", "curar", "curioso", "curso", "curva", "cutis", "dama", "danza", - "dar", "dardo", "dátil", "deber", "débil", "década", "decir", "dedo", - "defensa", "definir", "dejar", "delfín", "delgado", "delito", "demora", "denso", - "dental", "deporte", "derecho", "derrota", "desayuno", "deseo", "desfile", "desnudo", - "destino", "desvío", "detalle", "detener", "deuda", "día", "diablo", "diadema", - "diamante", "diana", "diario", "dibujo", "dictar", "diente", "dieta", "diez", - "difícil", "digno", "dilema", "diluir", "dinero", "directo", "dirigir", "disco", - "diseño", "disfraz", "diva", "divino", "doble", "doce", "dolor", "domingo", - "don", "donar", "dorado", "dormir", "dorso", "dos", "dosis", "dragón", - "droga", "ducha", "duda", "duelo", "dueño", "dulce", "dúo", "duque", - "durar", "dureza", "duro", "ébano", "ebrio", "echar", "eco", "ecuador", - "edad", "edición", "edificio", "editor", "educar", "efecto", "eficaz", "eje", - "ejemplo", "elefante", "elegir", "elemento", "elevar", "elipse", "élite", "elixir", - "elogio", "eludir", "embudo", "emitir", "emoción", "empate", "empeño", "empleo", - "empresa", "enano", "encargo", "enchufe", "encía", "enemigo", "enero", "enfado", - "enfermo", "engaño", "enigma", "enlace", "enorme", "enredo", "ensayo", "enseñar", - "entero", "entrar", "envase", "envío", "época", "equipo", "erizo", "escala", - "escena", "escolar", "escribir", "escudo", "esencia", "esfera", "esfuerzo", "espada", - "espejo", "espía", "esposa", "espuma", "esquí", "estar", "este", "estilo", - "estufa", "etapa", "eterno", "ética", "etnia", "evadir", "evaluar", "evento", - "evitar", "exacto", "examen", "exceso", "excusa", "exento", "exigir", "exilio", - "existir", "éxito", "experto", "explicar", "exponer", "extremo", "fábrica", "fábula", - "fachada", "fácil", "factor", "faena", "faja", "falda", "fallo", "falso", - "faltar", "fama", "familia", "famoso", "faraón", "farmacia", "farol", "farsa", - "fase", "fatiga", "fauna", "favor", "fax", "febrero", "fecha", "feliz", - "feo", "feria", "feroz", "fértil", "fervor", "festín", "fiable", "fianza", - "fiar", "fibra", "ficción", "ficha", "fideo", "fiebre", "fiel", "fiera", - "fiesta", "figura", "fijar", "fijo", "fila", "filete", "filial", "filtro", - "fin", "finca", "fingir", "finito", "firma", "flaco", "flauta", "flecha", - "flor", "flota", "fluir", "flujo", "flúor", "fobia", "foca", "fogata", - "fogón", "folio", "folleto", "fondo", "forma", "forro", "fortuna", "forzar", - "fosa", "foto", "fracaso", "frágil", "franja", "frase", "fraude", "freír", - "freno", "fresa", "frío", "frito", "fruta", "fuego", "fuente", "fuerza", - "fuga", "fumar", "función", "funda", "furgón", "furia", "fusil", "fútbol", - "futuro", "gacela", "gafas", "gaita", "gajo", "gala", "galería", "gallo", - "gamba", "ganar", "gancho", "ganga", "ganso", "garaje", "garza", "gasolina", - "gastar", "gato", "gavilán", "gemelo", "gemir", "gen", "género", "genio", - "gente", "geranio", "gerente", "germen", "gesto", "gigante", "gimnasio", "girar", - "giro", "glaciar", "globo", "gloria", "gol", "golfo", "goloso", "golpe", - "goma", "gordo", "gorila", "gorra", "gota", "goteo", "gozar", "grada", - "gráfico", "grano", "grasa", "gratis", "grave", "grieta", "grillo", "gripe", - "gris", "grito", "grosor", "grúa", "grueso", "grumo", "grupo", "guante", - "guapo", "guardia", "guerra", "guía", "guiño", "guion", "guiso", "guitarra", - "gusano", "gustar", "haber", "hábil", "hablar", "hacer", "hacha", "hada", - "hallar", "hamaca", "harina", "haz", "hazaña", "hebilla", "hebra", "hecho", - "helado", "helio", "hembra", "herir", "hermano", "héroe", "hervir", "hielo", - "hierro", "hígado", "higiene", "hijo", "himno", "historia", "hocico", "hogar", - "hoguera", "hoja", "hombre", "hongo", "honor", "honra", "hora", "hormiga", - "horno", "hostil", "hoyo", "hueco", "huelga", "huerta", "hueso", "huevo", - "huida", "huir", "humano", "húmedo", "humilde", "humo", "hundir", "huracán", - "hurto", "icono", "ideal", "idioma", "ídolo", "iglesia", "iglú", "igual", - "ilegal", "ilusión", "imagen", "imán", "imitar", "impar", "imperio", "imponer", - "impulso", "incapaz", "índice", "inerte", "infiel", "informe", "ingenio", "inicio", - "inmenso", "inmune", "innato", "insecto", "instante", "interés", "íntimo", "intuir", - "inútil", "invierno", "ira", "iris", "ironía", "isla", "islote", "jabalí", - "jabón", "jamón", "jarabe", "jardín", "jarra", "jaula", "jazmín", "jefe", - "jeringa", "jinete", "jornada", "joroba", "joven", "joya", "juerga", "jueves", - "juez", "jugador", "jugo", "juguete", "juicio", "junco", "jungla", "junio", - "juntar", "júpiter", "jurar", "justo", "juvenil", "juzgar", "kilo", "koala", - "labio", "lacio", "lacra", "lado", "ladrón", "lagarto", "lágrima", "laguna", - "laico", "lamer", "lámina", "lámpara", "lana", "lancha", "langosta", "lanza", - "lápiz", "largo", "larva", "lástima", "lata", "látex", "latir", "laurel", - "lavar", "lazo", "leal", "lección", "leche", "lector", "leer", "legión", - "legumbre", "lejano", "lengua", "lento", "leña", "león", "leopardo", "lesión", - "letal", "letra", "leve", "leyenda", "libertad", "libro", "licor", "líder", - "lidiar", "lienzo", "liga", "ligero", "lima", "límite", "limón", "limpio", - "lince", "lindo", "línea", "lingote", "lino", "linterna", "líquido", "liso", - "lista", "litera", "litio", "litro", "llaga", "llama", "llanto", "llave", - "llegar", "llenar", "llevar", "llorar", "llover", "lluvia", "lobo", "loción", - "loco", "locura", "lógica", "logro", "lombriz", "lomo", "lonja", "lote", - "lucha", "lucir", "lugar", "lujo", "luna", "lunes", "lupa", "lustro", - "luto", "luz", "maceta", "macho", "madera", "madre", "maduro", "maestro", - "mafia", "magia", "mago", "maíz", "maldad", "maleta", "malla", "malo", - "mamá", "mambo", "mamut", "manco", "mando", "manejar", "manga", "maniquí", - "manjar", "mano", "manso", "manta", "mañana", "mapa", "máquina", "mar", - "marco", "marea", "marfil", "margen", "marido", "mármol", "marrón", "martes", - "marzo", "masa", "máscara", "masivo", "matar", "materia", "matiz", "matriz", - "máximo", "mayor", "mazorca", "mecha", "medalla", "medio", "médula", "mejilla", - "mejor", "melena", "melón", "memoria", "menor", "mensaje", "mente", "menú", - "mercado", "merengue", "mérito", "mes", "mesón", "meta", "meter", "método", - "metro", "mezcla", "miedo", "miel", "miembro", "miga", "mil", "milagro", - "militar", "millón", "mimo", "mina", "minero", "mínimo", "minuto", "miope", - "mirar", "misa", "miseria", "misil", "mismo", "mitad", "mito", "mochila", - "moción", "moda", "modelo", "moho", "mojar", "molde", "moler", "molino", - "momento", "momia", "monarca", "moneda", "monja", "monto", "moño", "morada", - "morder", "moreno", "morir", "morro", "morsa", "mortal", "mosca", "mostrar", - "motivo", "mover", "móvil", "mozo", "mucho", "mudar", "mueble", "muela", - "muerte", "muestra", "mugre", "mujer", "mula", "muleta", "multa", "mundo", - "muñeca", "mural", "muro", "músculo", "museo", "musgo", "música", "muslo", - "nácar", "nación", "nadar", "naipe", "naranja", "nariz", "narrar", "nasal", - "natal", "nativo", "natural", "náusea", "naval", "nave", "navidad", "necio", - "néctar", "negar", "negocio", "negro", "neón", "nervio", "neto", "neutro", - "nevar", "nevera", "nicho", "nido", "niebla", "nieto", "niñez", "niño", - "nítido", "nivel", "nobleza", "noche", "nómina", "noria", "norma", "norte", - "nota", "noticia", "novato", "novela", "novio", "nube", "nuca", "núcleo", - "nudillo", "nudo", "nuera", "nueve", "nuez", "nulo", "número", "nutria", - "oasis", "obeso", "obispo", "objeto", "obra", "obrero", "observar", "obtener", - "obvio", "oca", "ocaso", "océano", "ochenta", "ocho", "ocio", "ocre", - "octavo", "octubre", "oculto", "ocupar", "ocurrir", "odiar", "odio", "odisea", - "oeste", "ofensa", "oferta", "oficio", "ofrecer", "ogro", "oído", "oír", - "ojo", "ola", "oleada", "olfato", "olivo", "olla", "olmo", "olor", - "olvido", "ombligo", "onda", "onza", "opaco", "opción", "ópera", "opinar", - "oponer", "optar", "óptica", "opuesto", "oración", "orador", "oral", "órbita", - "orca", "orden", "oreja", "órgano", "orgía", "orgullo", "oriente", "origen", - "orilla", "oro", "orquesta", "oruga", "osadía", "oscuro", "osezno", "oso", - "ostra", "otoño", "otro", "oveja", "óvulo", "óxido", "oxígeno", "oyente", - "ozono", "pacto", "padre", "paella", "página", "pago", "país", "pájaro", - "palabra", "palco", "paleta", "pálido", "palma", "paloma", "palpar", "pan", - "panal", "pánico", "pantera", "pañuelo", "papá", "papel", "papilla", "paquete", - "parar", "parcela", "pared", "parir", "paro", "párpado", "parque", "párrafo", - "parte", "pasar", "paseo", "pasión", "paso", "pasta", "pata", "patio", - "patria", "pausa", "pauta", "pavo", "payaso", "peatón", "pecado", "pecera", - "pecho", "pedal", "pedir", "pegar", "peine", "pelar", "peldaño", "pelea", - "peligro", "pellejo", "pelo", "peluca", "pena", "pensar", "peñón", "peón", - "peor", "pepino", "pequeño", "pera", "percha", "perder", "pereza", "perfil", - "perico", "perla", "permiso", "perro", "persona", "pesa", "pesca", "pésimo", - "pestaña", "pétalo", "petróleo", "pez", "pezuña", "picar", "pichón", "pie", - "piedra", "pierna", "pieza", "pijama", "pilar", "piloto", "pimienta", "pino", - "pintor", "pinza", "piña", "piojo", "pipa", "pirata", "pisar", "piscina", - "piso", "pista", "pitón", "pizca", "placa", "plan", "plata", "playa", - "plaza", "pleito", "pleno", "plomo", "pluma", "plural", "pobre", "poco", - "poder", "podio", "poema", "poesía", "poeta", "polen", "policía", "pollo", - "polvo", "pomada", "pomelo", "pomo", "pompa", "poner", "porción", "portal", - "posada", "poseer", "posible", "poste", "potencia", "potro", "pozo", "prado", - "precoz", "pregunta", "premio", "prensa", "preso", "previo", "primo", "príncipe", - "prisión", "privar", "proa", "probar", "proceso", "producto", "proeza", "profesor", - "programa", "prole", "promesa", "pronto", "propio", "próximo", "prueba", "público", - "puchero", "pudor", "pueblo", "puerta", "puesto", "pulga", "pulir", "pulmón", - "pulpo", "pulso", "puma", "punto", "puñal", "puño", "pupa", "pupila", - "puré", "quedar", "queja", "quemar", "querer", "queso", "quieto", "química", - "quince", "quitar", "rábano", "rabia", "rabo", "ración", "radical", "raíz", - "rama", "rampa", "rancho", "rango", "rapaz", "rápido", "rapto", "rasgo", - "raspa", "rato", "rayo", "raza", "razón", "reacción", "realidad", "rebaño", - "rebote", "recaer", "receta", "rechazo", "recoger", "recreo", "recto", "recurso", - "red", "redondo", "reducir", "reflejo", "reforma", "refrán", "refugio", "regalo", - "regir", "regla", "regreso", "rehén", "reino", "reír", "reja", "relato", - "relevo", "relieve", "relleno", "reloj", "remar", "remedio", "remo", "rencor", - "rendir", "renta", "reparto", "repetir", "reposo", "reptil", "res", "rescate", - "resina", "respeto", "resto", "resumen", "retiro", "retorno", "retrato", "reunir", - "revés", "revista", "rey", "rezar", "rico", "riego", "rienda", "riesgo", - "rifa", "rígido", "rigor", "rincón", "riñón", "río", "riqueza", "risa", - "ritmo", "rito" - ] - }, - 'portuguese': { - prefix_len: 3, - words: [ - "abaular", "abdominal", "abeto", "abissinio", "abjeto", "ablucao", "abnegar", "abotoar", - "abrutalhar", "absurdo", "abutre", "acautelar", "accessorios", "acetona", "achocolatado", "acirrar", - "acne", "acovardar", "acrostico", "actinomicete", "acustico", "adaptavel", "adeus", "adivinho", - "adjunto", "admoestar", "adnominal", "adotivo", "adquirir", "adriatico", "adsorcao", "adutora", - "advogar", "aerossol", "afazeres", "afetuoso", "afixo", "afluir", "afortunar", "afrouxar", - "aftosa", "afunilar", "agentes", "agito", "aglutinar", "aiatola", "aimore", "aino", - "aipo", "airoso", "ajeitar", "ajoelhar", "ajudante", "ajuste", "alazao", "albumina", - "alcunha", "alegria", "alexandre", "alforriar", "alguns", "alhures", "alivio", "almoxarife", - "alotropico", "alpiste", "alquimista", "alsaciano", "altura", "aluviao", "alvura", "amazonico", - "ambulatorio", "ametodico", "amizades", "amniotico", "amovivel", "amurada", "anatomico", "ancorar", - "anexo", "anfora", "aniversario", "anjo", "anotar", "ansioso", "anturio", "anuviar", - "anverso", "anzol", "aonde", "apaziguar", "apito", "aplicavel", "apoteotico", "aprimorar", - "aprumo", "apto", "apuros", "aquoso", "arauto", "arbusto", "arduo", "aresta", - "arfar", "arguto", "aritmetico", "arlequim", "armisticio", "aromatizar", "arpoar", "arquivo", - "arrumar", "arsenio", "arturiano", "aruaque", "arvores", "asbesto", "ascorbico", "aspirina", - "asqueroso", "assustar", "astuto", "atazanar", "ativo", "atletismo", "atmosferico", "atormentar", - "atroz", "aturdir", "audivel", "auferir", "augusto", "aula", "aumento", "aurora", - "autuar", "avatar", "avexar", "avizinhar", "avolumar", "avulso", "axiomatico", "azerbaijano", - "azimute", "azoto", "azulejo", "bacteriologista", "badulaque", "baforada", "baixote", "bajular", - "balzaquiana", "bambuzal", "banzo", "baoba", "baqueta", "barulho", "bastonete", "batuta", - "bauxita", "bavaro", "bazuca", "bcrepuscular", "beato", "beduino", "begonia", "behaviorista", - "beisebol", "belzebu", "bemol", "benzido", "beocio", "bequer", "berro", "besuntar", - "betume", "bexiga", "bezerro", "biatlon", "biboca", "bicuspide", "bidirecional", "bienio", - "bifurcar", "bigorna", "bijuteria", "bimotor", "binormal", "bioxido", "bipolarizacao", "biquini", - "birutice", "bisturi", "bituca", "biunivoco", "bivalve", "bizarro", "blasfemo", "blenorreia", - "blindar", "bloqueio", "blusao", "boazuda", "bofete", "bojudo", "bolso", "bombordo", - "bonzo", "botina", "boquiaberto", "bostoniano", "botulismo", "bourbon", "bovino", "boximane", - "bravura", "brevidade", "britar", "broxar", "bruno", "bruxuleio", "bubonico", "bucolico", - "buda", "budista", "bueiro", "buffer", "bugre", "bujao", "bumerangue", "burundines", - "busto", "butique", "buzios", "caatinga", "cabuqui", "cacunda", "cafuzo", "cajueiro", - "camurca", "canudo", "caquizeiro", "carvoeiro", "casulo", "catuaba", "cauterizar", "cebolinha", - "cedula", "ceifeiro", "celulose", "cerzir", "cesto", "cetro", "ceus", "cevar", - "chavena", "cheroqui", "chita", "chovido", "chuvoso", "ciatico", "cibernetico", "cicuta", - "cidreira", "cientistas", "cifrar", "cigarro", "cilio", "cimo", "cinzento", "cioso", - "cipriota", "cirurgico", "cisto", "citrico", "ciumento", "civismo", "clavicula", "clero", - "clitoris", "cluster", "coaxial", "cobrir", "cocota", "codorniz", "coexistir", "cogumelo", - "coito", "colusao", "compaixao", "comutativo", "contentamento", "convulsivo", "coordenativa", "coquetel", - "correto", "corvo", "costureiro", "cotovia", "covil", "cozinheiro", "cretino", "cristo", - "crivo", "crotalo", "cruzes", "cubo", "cucuia", "cueiro", "cuidar", "cujo", - "cultural", "cunilingua", "cupula", "curvo", "custoso", "cutucar", "czarismo", "dablio", - "dacota", "dados", "daguerreotipo", "daiquiri", "daltonismo", "damista", "dantesco", "daquilo", - "darwinista", "dasein", "dativo", "deao", "debutantes", "decurso", "deduzir", "defunto", - "degustar", "dejeto", "deltoide", "demover", "denunciar", "deputado", "deque", "dervixe", - "desvirtuar", "deturpar", "deuteronomio", "devoto", "dextrose", "dezoito", "diatribe", "dicotomico", - "didatico", "dietista", "difuso", "digressao", "diluvio", "diminuto", "dinheiro", "dinossauro", - "dioxido", "diplomatico", "dique", "dirimivel", "disturbio", "diurno", "divulgar", "dizivel", - "doar", "dobro", "docura", "dodoi", "doer", "dogue", "doloso", "domo", - "donzela", "doping", "dorsal", "dossie", "dote", "doutro", "doze", "dravidico", - "dreno", "driver", "dropes", "druso", "dubnio", "ducto", "dueto", "dulija", - "dundum", "duodeno", "duquesa", "durou", "duvidoso", "duzia", "ebano", "ebrio", - "eburneo", "echarpe", "eclusa", "ecossistema", "ectoplasma", "ecumenismo", "eczema", "eden", - "editorial", "edredom", "edulcorar", "efetuar", "efigie", "efluvio", "egiptologo", "egresso", - "egua", "einsteiniano", "eira", "eivar", "eixos", "ejetar", "elastomero", "eldorado", - "elixir", "elmo", "eloquente", "elucidativo", "emaranhar", "embutir", "emerito", "emfa", - "emitir", "emotivo", "empuxo", "emulsao", "enamorar", "encurvar", "enduro", "enevoar", - "enfurnar", "enguico", "enho", "enigmista", "enlutar", "enormidade", "enpreendimento", "enquanto", - "enriquecer", "enrugar", "entusiastico", "enunciar", "envolvimento", "enxuto", "enzimatico", "eolico", - "epiteto", "epoxi", "epura", "equivoco", "erario", "erbio", "ereto", "erguido", - "erisipela", "ermo", "erotizar", "erros", "erupcao", "ervilha", "esburacar", "escutar", - "esfuziante", "esguio", "esloveno", "esmurrar", "esoterismo", "esperanca", "espirito", "espurio", - "essencialmente", "esturricar", "esvoacar", "etario", "eterno", "etiquetar", "etnologo", "etos", - "etrusco", "euclidiano", "euforico", "eugenico", "eunuco", "europio", "eustaquio", "eutanasia", - "evasivo", "eventualidade", "evitavel", "evoluir", "exaustor", "excursionista", "exercito", "exfoliado", - "exito", "exotico", "expurgo", "exsudar", "extrusora", "exumar", "fabuloso", "facultativo", - "fado", "fagulha", "faixas", "fajuto", "faltoso", "famoso", "fanzine", "fapesp", - "faquir", "fartura", "fastio", "faturista", "fausto", "favorito", "faxineira", "fazer", - "fealdade", "febril", "fecundo", "fedorento", "feerico", "feixe", "felicidade", "felipe", - "feltro", "femur", "fenotipo", "fervura", "festivo", "feto", "feudo", "fevereiro", - "fezinha", "fiasco", "fibra", "ficticio", "fiduciario", "fiesp", "fifa", "figurino", - "fijiano", "filtro", "finura", "fiorde", "fiquei", "firula", "fissurar", "fitoteca", - "fivela", "fixo", "flavio", "flexor", "flibusteiro", "flotilha", "fluxograma", "fobos", - "foco", "fofura", "foguista", "foie", "foliculo", "fominha", "fonte", "forum", - "fosso", "fotossintese", "foxtrote", "fraudulento", "frevo", "frivolo", "frouxo", "frutose", - "fuba", "fucsia", "fugitivo", "fuinha", "fujao", "fulustreco", "fumo", "funileiro", - "furunculo", "fustigar", "futurologo", "fuxico", "fuzue", "gabriel", "gado", "gaelico", - "gafieira", "gaguejo", "gaivota", "gajo", "galvanoplastico", "gamo", "ganso", "garrucha", - "gastronomo", "gatuno", "gaussiano", "gaviao", "gaxeta", "gazeteiro", "gear", "geiser", - "geminiano", "generoso", "genuino", "geossinclinal", "gerundio", "gestual", "getulista", "gibi", - "gigolo", "gilete", "ginseng", "giroscopio", "glaucio", "glacial", "gleba", "glifo", - "glote", "glutonia", "gnostico", "goela", "gogo", "goitaca", "golpista", "gomo", - "gonzo", "gorro", "gostou", "goticula", "gourmet", "governo", "gozo", "graxo", - "grevista", "grito", "grotesco", "gruta", "guaxinim", "gude", "gueto", "guizo", - "guloso", "gume", "guru", "gustativo", "gustavo", "gutural", "habitue", "haitiano", - "halterofilista", "hamburguer", "hanseniase", "happening", "harpista", "hastear", "haveres", "hebreu", - "hectometro", "hedonista", "hegira", "helena", "helminto", "hemorroidas", "henrique", "heptassilabo", - "hertziano", "hesitar", "heterossexual", "heuristico", "hexagono", "hiato", "hibrido", "hidrostatico", - "hieroglifo", "hifenizar", "higienizar", "hilario", "himen", "hino", "hippie", "hirsuto", - "historiografia", "hitlerista", "hodometro", "hoje", "holograma", "homus", "honroso", "hoquei", - "horto", "hostilizar", "hotentote", "huguenote", "humilde", "huno", "hurra", "hutu", - "iaia", "ialorixa", "iambico", "iansa", "iaque", "iara", "iatista", "iberico", - "ibis", "icar", "iceberg", "icosagono", "idade", "ideologo", "idiotice", "idoso", - "iemenita", "iene", "igarape", "iglu", "ignorar", "igreja", "iguaria", "iidiche", - "ilativo", "iletrado", "ilharga", "ilimitado", "ilogismo", "ilustrissimo", "imaturo", "imbuzeiro", - "imerso", "imitavel", "imovel", "imputar", "imutavel", "inaveriguavel", "incutir", "induzir", - "inextricavel", "infusao", "ingua", "inhame", "iniquo", "injusto", "inning", "inoxidavel", - "inquisitorial", "insustentavel", "intumescimento", "inutilizavel", "invulneravel", "inzoneiro", "iodo", "iogurte", - "ioio", "ionosfera", "ioruba", "iota", "ipsilon", "irascivel", "iris", "irlandes", - "irmaos", "iroques", "irrupcao", "isca", "isento", "islandes", "isotopo", "isqueiro", - "israelita", "isso", "isto", "iterbio", "itinerario", "itrio", "iuane", "iugoslavo", - "jabuticabeira", "jacutinga", "jade", "jagunco", "jainista", "jaleco", "jambo", "jantarada", - "japones", "jaqueta", "jarro", "jasmim", "jato", "jaula", "javel", "jazz", - "jegue", "jeitoso", "jejum", "jenipapo", "jeova", "jequitiba", "jersei", "jesus", - "jetom", "jiboia", "jihad", "jilo", "jingle", "jipe", "jocoso", "joelho", - "joguete", "joio", "jojoba", "jorro", "jota", "joule", "joviano", "jubiloso", - "judoca", "jugular", "juizo", "jujuba", "juliano", "jumento", "junto", "jururu", - "justo", "juta", "juventude", "labutar", "laguna", "laico", "lajota", "lanterninha", - "lapso", "laquear", "lastro", "lauto", "lavrar", "laxativo", "lazer", "leasing", - "lebre", "lecionar", "ledo", "leguminoso", "leitura", "lele", "lemure", "lento", - "leonardo", "leopardo", "lepton", "leque", "leste", "letreiro", "leucocito", "levitico", - "lexicologo", "lhama", "lhufas", "liame", "licoroso", "lidocaina", "liliputiano", "limusine", - "linotipo", "lipoproteina", "liquidos", "lirismo", "lisura", "liturgico", "livros", "lixo", - "lobulo", "locutor", "lodo", "logro", "lojista", "lombriga", "lontra", "loop", - "loquaz", "lorota", "losango", "lotus", "louvor", "luar", "lubrificavel", "lucros", - "lugubre", "luis", "luminoso", "luneta", "lustroso", "luto", "luvas", "luxuriante", - "luzeiro", "maduro", "maestro", "mafioso", "magro", "maiuscula", "majoritario", "malvisto", - "mamute", "manutencao", "mapoteca", "maquinista", "marzipa", "masturbar", "matuto", "mausoleu", - "mavioso", "maxixe", "mazurca", "meandro", "mecha", "medusa", "mefistofelico", "megera", - "meirinho", "melro", "memorizar", "menu", "mequetrefe", "mertiolate", "mestria", "metroviario", - "mexilhao", "mezanino", "miau", "microssegundo", "midia", "migratorio", "mimosa", "minuto", - "miosotis", "mirtilo", "misturar", "mitzvah", "miudos", "mixuruca", "mnemonico", "moagem", - "mobilizar", "modulo", "moer", "mofo", "mogno", "moita", "molusco", "monumento", - "moqueca", "morubixaba", "mostruario", "motriz", "mouse", "movivel", "mozarela", "muarra", - "muculmano", "mudo", "mugir", "muitos", "mumunha", "munir", "muon", "muquira", - "murros", "musselina", "nacoes", "nado", "naftalina", "nago", "naipe", "naja", - "nalgum", "namoro", "nanquim", "napolitano", "naquilo", "nascimento", "nautilo", "navios", - "nazista", "nebuloso", "nectarina", "nefrologo", "negus", "nelore", "nenufar", "nepotismo", - "nervura", "neste", "netuno", "neutron", "nevoeiro", "newtoniano", "nexo", "nhenhenhem", - "nhoque", "nigeriano", "niilista", "ninho", "niobio", "niponico", "niquelar", "nirvana", - "nisto", "nitroglicerina", "nivoso", "nobreza", "nocivo", "noel", "nogueira", "noivo", - "nojo", "nominativo", "nonuplo", "noruegues", "nostalgico", "noturno", "nouveau", "nuanca", - "nublar", "nucleotideo", "nudista", "nulo", "numismatico", "nunquinha", "nupcias", "nutritivo", - "nuvens", "oasis", "obcecar", "obeso", "obituario", "objetos", "oblongo", "obnoxio", - "obrigatorio", "obstruir", "obtuso", "obus", "obvio", "ocaso", "occipital", "oceanografo", - "ocioso", "oclusivo", "ocorrer", "ocre", "octogono", "odalisca", "odisseia", "odorifico", - "oersted", "oeste", "ofertar", "ofidio", "oftalmologo", "ogiva", "ogum", "oigale", - "oitavo", "oitocentos", "ojeriza", "olaria", "oleoso", "olfato", "olhos", "oliveira", - "olmo", "olor", "olvidavel", "ombudsman", "omeleteira", "omitir", "omoplata", "onanismo", - "ondular", "oneroso", "onomatopeico", "ontologico", "onus", "onze", "opalescente", "opcional", - "operistico", "opio", "oposto", "oprobrio", "optometrista", "opusculo", "oratorio", "orbital", - "orcar", "orfao", "orixa", "orla", "ornitologo", "orquidea", "ortorrombico", "orvalho", - "osculo", "osmotico", "ossudo", "ostrogodo", "otario", "otite", "ouro", "ousar", - "outubro", "ouvir", "ovario", "overnight", "oviparo", "ovni", "ovoviviparo", "ovulo", - "oxala", "oxente", "oxiuro", "oxossi", "ozonizar", "paciente", "pactuar", "padronizar", - "paete", "pagodeiro", "paixao", "pajem", "paludismo", "pampas", "panturrilha", "papudo", - "paquistanes", "pastoso", "patua", "paulo", "pauzinhos", "pavoroso", "paxa", "pazes", - "peao", "pecuniario", "pedunculo", "pegaso", "peixinho", "pejorativo", "pelvis", "penuria", - "pequno", "petunia", "pezada", "piauiense", "pictorico", "pierro", "pigmeu", "pijama", - "pilulas", "pimpolho", "pintura", "piorar", "pipocar", "piqueteiro", "pirulito", "pistoleiro", - "pituitaria", "pivotar", "pixote", "pizzaria", "plistoceno", "plotar", "pluviometrico", "pneumonico", - "poco", "podridao", "poetisa", "pogrom", "pois", "polvorosa", "pomposo", "ponderado", - "pontudo", "populoso", "poquer", "porvir", "posudo", "potro", "pouso", "povoar", - "prazo", "prezar", "privilegios", "proximo", "prussiano", "pseudopode", "psoriase", "pterossauros", - "ptialina", "ptolemaico", "pudor", "pueril", "pufe", "pugilista", "puir", "pujante", - "pulverizar", "pumba", "punk", "purulento", "pustula", "putsch", "puxe", "quatrocentos", - "quetzal", "quixotesco", "quotizavel", "rabujice", "racista", "radonio", "rafia", "ragu", - "rajado", "ralo", "rampeiro", "ranzinza", "raptor", "raquitismo", "raro", "rasurar", - "ratoeira", "ravioli", "razoavel", "reavivar", "rebuscar", "recusavel", "reduzivel", "reexposicao", - "refutavel", "regurgitar", "reivindicavel", "rejuvenescimento", "relva", "remuneravel", "renunciar", "reorientar", - "repuxo", "requisito", "resumo", "returno", "reutilizar", "revolvido", "rezonear", "riacho", - "ribossomo", "ricota", "ridiculo", "rifle", "rigoroso", "rijo", "rimel", "rins", - "rios", "riqueza", "riquixa", "rissole", "ritualistico", "rivalizar", "rixa", "robusto", - "rococo", "rodoviario", "roer", "rogo", "rojao", "rolo", "rompimento", "ronronar", - "roqueiro", "rorqual", "rosto", "rotundo", "rouxinol", "roxo", "royal", "ruas", - "rucula", "rudimentos", "ruela", "rufo", "rugoso", "ruivo", "rule", "rumoroso", - "runico", "ruptura", "rural", "rustico", "rutilar", "saariano", "sabujo", "sacudir", - "sadomasoquista", "safra", "sagui", "sais", "samurai", "santuario", "sapo", "saquear", - "sartriano", "saturno", "saude", "sauva", "saveiro", "saxofonista", "sazonal", "scherzo", - "script", "seara", "seborreia", "secura", "seduzir", "sefardim", "seguro", "seja", - "selvas", "sempre", "senzala", "sepultura", "sequoia", "sestercio", "setuplo", "seus", - "seviciar", "sezonismo", "shalom", "siames", "sibilante", "sicrano", "sidra", "sifilitico", - "signos", "silvo", "simultaneo", "sinusite", "sionista", "sirio", "sisudo", "situar", - "sivan", "slide", "slogan", "soar", "sobrio", "socratico", "sodomizar", "soerguer", - "software", "sogro", "soja", "solver", "somente", "sonso", "sopro", "soquete", - "sorveteiro", "sossego", "soturno", "sousafone", "sovinice", "sozinho", "suavizar", "subverter", - "sucursal", "sudoriparo", "sufragio", "sugestoes", "suite", "sujo", "sultao", "sumula", - "suntuoso", "suor", "supurar", "suruba", "susto", "suturar", "suvenir", "tabuleta", - "taco", "tadjique", "tafeta", "tagarelice", "taitiano", "talvez", "tampouco", "tanzaniano", - "taoista", "tapume", "taquion", "tarugo", "tascar", "tatuar", "tautologico", "tavola", - "taxionomista", "tchecoslovaco", "teatrologo", "tectonismo", "tedioso", "teflon", "tegumento", "teixo", - "telurio", "temporas", "tenue", "teosofico", "tepido", "tequila", "terrorista", "testosterona", - "tetrico", "teutonico", "teve", "texugo", "tiara", "tibia", "tiete", "tifoide", - "tigresa", "tijolo", "tilintar", "timpano", "tintureiro", "tiquete", "tiroteio", "tisico", - "titulos", "tive", "toar", "toboga", "tofu", "togoles", "toicinho", "tolueno", - "tomografo", "tontura", "toponimo", "toquio", "torvelinho", "tostar", "toto", "touro", - "toxina", "trazer", "trezentos", "trivialidade", "trovoar", "truta", "tuaregue", "tubular", - "tucano", "tudo", "tufo", "tuiste", "tulipa", "tumultuoso", "tunisino", "tupiniquim", - "turvo", "tutu", "ucraniano", "udenista", "ufanista", "ufologo", "ugaritico", "uiste", - "uivo", "ulceroso", "ulema", "ultravioleta", "umbilical", "umero", "umido", "umlaut", - "unanimidade", "unesco", "ungulado", "unheiro", "univoco", "untuoso", "urano", "urbano", - "urdir", "uretra", "urgente", "urinol", "urna", "urologo", "urro", "ursulina", - "urtiga", "urupe", "usavel", "usbeque", "usei", "usineiro", "usurpar", "utero", - "utilizar", "utopico", "uvular", "uxoricidio", "vacuo", "vadio", "vaguear", "vaivem", - "valvula", "vampiro", "vantajoso", "vaporoso", "vaquinha", "varziano", "vasto", "vaticinio", - "vaudeville", "vazio", "veado", "vedico", "veemente", "vegetativo", "veio", "veja", - "veludo", "venusiano", "verdade", "verve", "vestuario", "vetusto", "vexatorio", "vezes", - "viavel", "vibratorio", "victor", "vicunha", "vidros", "vietnamita", "vigoroso", "vilipendiar", - "vime", "vintem", "violoncelo", "viquingue", "virus", "visualizar", "vituperio", "viuvo", - "vivo", "vizir", "voar", "vociferar", "vodu", "vogar", "voile", "volver", - "vomito", "vontade", "vortice", "vosso", "voto", "vovozinha", "voyeuse", "vozes", - "vulva", "vupt", "western", "xadrez", "xale", "xampu", "xango", "xarope", - "xaual", "xavante", "xaxim", "xenonio", "xepa", "xerox", "xicara", "xifopago", - "xiita", "xilogravura", "xinxim", "xistoso", "xixi", "xodo", "xogum", "xucro", - "zabumba", "zagueiro", "zambiano", "zanzar", "zarpar", "zebu", "zefiro", "zeloso", - "zenite", "zumbi" - ] - }, - 'japanese': { - prefix_len: 3, - words: [ - "あいこくしん", "あいさつ", "あいだ", "あおぞら", "あかちゃん", "あきる", "あけがた", "あける", - "あこがれる", "あさい", "あさひ", "あしあと", "あじわう", "あずかる", "あずき", "あそぶ", - "あたえる", "あたためる", "あたりまえ", "あたる", "あつい", "あつかう", "あっしゅく", "あつまり", - "あつめる", "あてな", "あてはまる", "あひる", "あぶら", "あぶる", "あふれる", "あまい", - "あまど", "あまやかす", "あまり", "あみもの", "あめりか", "あやまる", "あゆむ", "あらいぐま", - "あらし", "あらすじ", "あらためる", "あらゆる", "あらわす", "ありがとう", "あわせる", "あわてる", - "あんい", "あんがい", "あんこ", "あんぜん", "あんてい", "あんない", "あんまり", "いいだす", - "いおん", "いがい", "いがく", "いきおい", "いきなり", "いきもの", "いきる", "いくじ", - "いくぶん", "いけばな", "いけん", "いこう", "いこく", "いこつ", "いさましい", "いさん", - "いしき", "いじゅう", "いじょう", "いじわる", "いずみ", "いずれ", "いせい", "いせえび", - "いせかい", "いせき", "いぜん", "いそうろう", "いそがしい", "いだい", "いだく", "いたずら", - "いたみ", "いたりあ", "いちおう", "いちじ", "いちど", "いちば", "いちぶ", "いちりゅう", - "いつか", "いっしゅん", "いっせい", "いっそう", "いったん", "いっち", "いってい", "いっぽう", - "いてざ", "いてん", "いどう", "いとこ", "いない", "いなか", "いねむり", "いのち", - "いのる", "いはつ", "いばる", "いはん", "いびき", "いひん", "いふく", "いへん", - "いほう", "いみん", "いもうと", "いもたれ", "いもり", "いやがる", "いやす", "いよかん", - "いよく", "いらい", "いらすと", "いりぐち", "いりょう", "いれい", "いれもの", "いれる", - "いろえんぴつ", "いわい", "いわう", "いわかん", "いわば", "いわゆる", "いんげんまめ", "いんさつ", - "いんしょう", "いんよう", "うえき", "うえる", "うおざ", "うがい", "うかぶ", "うかべる", - "うきわ", "うくらいな", "うくれれ", "うけたまわる", "うけつけ", "うけとる", "うけもつ", "うける", - "うごかす", "うごく", "うこん", "うさぎ", "うしなう", "うしろがみ", "うすい", "うすぎ", - "うすぐらい", "うすめる", "うせつ", "うちあわせ", "うちがわ", "うちき", "うちゅう", "うっかり", - "うつくしい", "うったえる", "うつる", "うどん", "うなぎ", "うなじ", "うなずく", "うなる", - "うねる", "うのう", "うぶげ", "うぶごえ", "うまれる", "うめる", "うもう", "うやまう", - "うよく", "うらがえす", "うらぐち", "うらない", "うりあげ", "うりきれ", "うるさい", "うれしい", - "うれゆき", "うれる", "うろこ", "うわき", "うわさ", "うんこう", "うんちん", "うんてん", - "うんどう", "えいえん", "えいが", "えいきょう", "えいご", "えいせい", "えいぶん", "えいよう", - "えいわ", "えおり", "えがお", "えがく", "えきたい", "えくせる", "えしゃく", "えすて", - "えつらん", "えのぐ", "えほうまき", "えほん", "えまき", "えもじ", "えもの", "えらい", - "えらぶ", "えりあ", "えんえん", "えんかい", "えんぎ", "えんげき", "えんしゅう", "えんぜつ", - "えんそく", "えんちょう", "えんとつ", "おいかける", "おいこす", "おいしい", "おいつく", "おうえん", - "おうさま", "おうじ", "おうせつ", "おうたい", "おうふく", "おうべい", "おうよう", "おえる", - "おおい", "おおう", "おおどおり", "おおや", "おおよそ", "おかえり", "おかず", "おがむ", - "おかわり", "おぎなう", "おきる", "おくさま", "おくじょう", "おくりがな", "おくる", "おくれる", - "おこす", "おこなう", "おこる", "おさえる", "おさない", "おさめる", "おしいれ", "おしえる", - "おじぎ", "おじさん", "おしゃれ", "おそらく", "おそわる", "おたがい", "おたく", "おだやか", - "おちつく", "おっと", "おつり", "おでかけ", "おとしもの", "おとなしい", "おどり", "おどろかす", - "おばさん", "おまいり", "おめでとう", "おもいで", "おもう", "おもたい", "おもちゃ", "おやつ", - "おやゆび", "およぼす", "おらんだ", "おろす", "おんがく", "おんけい", "おんしゃ", "おんせん", - "おんだん", "おんちゅう", "おんどけい", "かあつ", "かいが", "がいき", "がいけん", "がいこう", - "かいさつ", "かいしゃ", "かいすいよく", "かいぜん", "かいぞうど", "かいつう", "かいてん", "かいとう", - "かいふく", "がいへき", "かいほう", "かいよう", "がいらい", "かいわ", "かえる", "かおり", - "かかえる", "かがく", "かがし", "かがみ", "かくご", "かくとく", "かざる", "がぞう", - "かたい", "かたち", "がちょう", "がっきゅう", "がっこう", "がっさん", "がっしょう", "かなざわし", - "かのう", "がはく", "かぶか", "かほう", "かほご", "かまう", "かまぼこ", "かめれおん", - "かゆい", "かようび", "からい", "かるい", "かろう", "かわく", "かわら", "がんか", - "かんけい", "かんこう", "かんしゃ", "かんそう", "かんたん", "かんち", "がんばる", "きあい", - "きあつ", "きいろ", "ぎいん", "きうい", "きうん", "きえる", "きおう", "きおく", - "きおち", "きおん", "きかい", "きかく", "きかんしゃ", "ききて", "きくばり", "きくらげ", - "きけんせい", "きこう", "きこえる", "きこく", "きさい", "きさく", "きさま", "きさらぎ", - "ぎじかがく", "ぎしき", "ぎじたいけん", "ぎじにってい", "ぎじゅつしゃ", "きすう", "きせい", "きせき", - "きせつ", "きそう", "きぞく", "きぞん", "きたえる", "きちょう", "きつえん", "ぎっちり", - "きつつき", "きつね", "きてい", "きどう", "きどく", "きない", "きなが", "きなこ", - "きぬごし", "きねん", "きのう", "きのした", "きはく", "きびしい", "きひん", "きふく", - "きぶん", "きぼう", "きほん", "きまる", "きみつ", "きむずかしい", "きめる", "きもだめし", - "きもち", "きもの", "きゃく", "きやく", "ぎゅうにく", "きよう", "きょうりゅう", "きらい", - "きらく", "きりん", "きれい", "きれつ", "きろく", "ぎろん", "きわめる", "ぎんいろ", - "きんかくじ", "きんじょ", "きんようび", "ぐあい", "くいず", "くうかん", "くうき", "くうぐん", - "くうこう", "ぐうせい", "くうそう", "ぐうたら", "くうふく", "くうぼ", "くかん", "くきょう", - "くげん", "ぐこう", "くさい", "くさき", "くさばな", "くさる", "くしゃみ", "くしょう", - "くすのき", "くすりゆび", "くせげ", "くせん", "ぐたいてき", "くださる", "くたびれる", "くちこみ", - "くちさき", "くつした", "ぐっすり", "くつろぐ", "くとうてん", "くどく", "くなん", "くねくね", - "くのう", "くふう", "くみあわせ", "くみたてる", "くめる", "くやくしょ", "くらす", "くらべる", - "くるま", "くれる", "くろう", "くわしい", "ぐんかん", "ぐんしょく", "ぐんたい", "ぐんて", - "けあな", "けいかく", "けいけん", "けいこ", "けいさつ", "げいじゅつ", "けいたい", "げいのうじん", - "けいれき", "けいろ", "けおとす", "けおりもの", "げきか", "げきげん", "げきだん", "げきちん", - "げきとつ", "げきは", "げきやく", "げこう", "げこくじょう", "げざい", "けさき", "げざん", - "けしき", "けしごむ", "けしょう", "げすと", "けたば", "けちゃっぷ", "けちらす", "けつあつ", - "けつい", "けつえき", "けっこん", "けつじょ", "けっせき", "けってい", "けつまつ", "げつようび", - "げつれい", "けつろん", "げどく", "けとばす", "けとる", "けなげ", "けなす", "けなみ", - "けぬき", "げねつ", "けねん", "けはい", "げひん", "けぶかい", "げぼく", "けまり", - "けみかる", "けむし", "けむり", "けもの", "けらい", "けろけろ", "けわしい", "けんい", - "けんえつ", "けんお", "けんか", "げんき", "けんげん", "けんこう", "けんさく", "けんしゅう", - "けんすう", "げんそう", "けんちく", "けんてい", "けんとう", "けんない", "けんにん", "げんぶつ", - "けんま", "けんみん", "けんめい", "けんらん", "けんり", "こあくま", "こいぬ", "こいびと", - "ごうい", "こうえん", "こうおん", "こうかん", "ごうきゅう", "ごうけい", "こうこう", "こうさい", - "こうじ", "こうすい", "ごうせい", "こうそく", "こうたい", "こうちゃ", "こうつう", "こうてい", - "こうどう", "こうない", "こうはい", "ごうほう", "ごうまん", "こうもく", "こうりつ", "こえる", - "こおり", "ごかい", "ごがつ", "ごかん", "こくご", "こくさい", "こくとう", "こくない", - "こくはく", "こぐま", "こけい", "こける", "ここのか", "こころ", "こさめ", "こしつ", - "こすう", "こせい", "こせき", "こぜん", "こそだて", "こたい", "こたえる", "こたつ", - "こちょう", "こっか", "こつこつ", "こつばん", "こつぶ", "こてい", "こてん", "ことがら", - "ことし", "ことば", "ことり", "こなごな", "こねこね", "このまま", "このみ", "このよ", - "ごはん", "こひつじ", "こふう", "こふん", "こぼれる", "ごまあぶら", "こまかい", "ごますり", - "こまつな", "こまる", "こむぎこ", "こもじ", "こもち", "こもの", "こもん", "こやく", - "こやま", "こゆう", "こゆび", "こよい", "こよう", "こりる", "これくしょん", "ころっけ", - "こわもて", "こわれる", "こんいん", "こんかい", "こんき", "こんしゅう", "こんすい", "こんだて", - "こんとん", "こんなん", "こんびに", "こんぽん", "こんまけ", "こんや", "こんれい", "こんわく", - "ざいえき", "さいかい", "さいきん", "ざいげん", "ざいこ", "さいしょ", "さいせい", "ざいたく", - "ざいちゅう", "さいてき", "ざいりょう", "さうな", "さかいし", "さがす", "さかな", "さかみち", - "さがる", "さぎょう", "さくし", "さくひん", "さくら", "さこく", "さこつ", "さずかる", - "ざせき", "さたん", "さつえい", "ざつおん", "ざっか", "ざつがく", "さっきょく", "ざっし", - "さつじん", "ざっそう", "さつたば", "さつまいも", "さてい", "さといも", "さとう", "さとおや", - "さとし", "さとる", "さのう", "さばく", "さびしい", "さべつ", "さほう", "さほど", - "さます", "さみしい", "さみだれ", "さむけ", "さめる", "さやえんどう", "さゆう", "さよう", - "さよく", "さらだ", "ざるそば", "さわやか", "さわる", "さんいん", "さんか", "さんきゃく", - "さんこう", "さんさい", "ざんしょ", "さんすう", "さんせい", "さんそ", "さんち", "さんま", - "さんみ", "さんらん", "しあい", "しあげ", "しあさって", "しあわせ", "しいく", "しいん", - "しうち", "しえい", "しおけ", "しかい", "しかく", "じかん", "しごと", "しすう", - "じだい", "したうけ", "したぎ", "したて", "したみ", "しちょう", "しちりん", "しっかり", - "しつじ", "しつもん", "してい", "してき", "してつ", "じてん", "じどう", "しなぎれ", - "しなもの", "しなん", "しねま", "しねん", "しのぐ", "しのぶ", "しはい", "しばかり", - "しはつ", "しはらい", "しはん", "しひょう", "しふく", "じぶん", "しへい", "しほう", - "しほん", "しまう", "しまる", "しみん", "しむける", "じむしょ", "しめい", "しめる", - "しもん", "しゃいん", "しゃうん", "しゃおん", "じゃがいも", "しやくしょ", "しゃくほう", "しゃけん", - "しゃこ", "しゃざい", "しゃしん", "しゃせん", "しゃそう", "しゃたい", "しゃちょう", "しゃっきん", - "じゃま", "しゃりん", "しゃれい", "じゆう", "じゅうしょ", "しゅくはく", "じゅしん", "しゅっせき", - "しゅみ", "しゅらば", "じゅんばん", "しょうかい", "しょくたく", "しょっけん", "しょどう", "しょもつ", - "しらせる", "しらべる", "しんか", "しんこう", "じんじゃ", "しんせいじ", "しんちく", "しんりん", - "すあげ", "すあし", "すあな", "ずあん", "すいえい", "すいか", "すいとう", "ずいぶん", - "すいようび", "すうがく", "すうじつ", "すうせん", "すおどり", "すきま", "すくう", "すくない", - "すける", "すごい", "すこし", "ずさん", "すずしい", "すすむ", "すすめる", "すっかり", - "ずっしり", "ずっと", "すてき", "すてる", "すねる", "すのこ", "すはだ", "すばらしい", - "ずひょう", "ずぶぬれ", "すぶり", "すふれ", "すべて", "すべる", "ずほう", "すぼん", - "すまい", "すめし", "すもう", "すやき", "すらすら", "するめ", "すれちがう", "すろっと", - "すわる", "すんぜん", "すんぽう", "せあぶら", "せいかつ", "せいげん", "せいじ", "せいよう", - "せおう", "せかいかん", "せきにん", "せきむ", "せきゆ", "せきらんうん", "せけん", "せこう", - "せすじ", "せたい", "せたけ", "せっかく", "せっきゃく", "ぜっく", "せっけん", "せっこつ", - "せっさたくま", "せつぞく", "せつだん", "せつでん", "せっぱん", "せつび", "せつぶん", "せつめい", - "せつりつ", "せなか", "せのび", "せはば", "せびろ", "せぼね", "せまい", "せまる", - "せめる", "せもたれ", "せりふ", "ぜんあく", "せんい", "せんえい", "せんか", "せんきょ", - "せんく", "せんげん", "ぜんご", "せんさい", "せんしゅ", "せんすい", "せんせい", "せんぞ", - "せんたく", "せんちょう", "せんてい", "せんとう", "せんぬき", "せんねん", "せんぱい", "ぜんぶ", - "ぜんぽう", "せんむ", "せんめんじょ", "せんもん", "せんやく", "せんゆう", "せんよう", "ぜんら", - "ぜんりゃく", "せんれい", "せんろ", "そあく", "そいとげる", "そいね", "そうがんきょう", "そうき", - "そうご", "そうしん", "そうだん", "そうなん", "そうび", "そうめん", "そうり", "そえもの", - "そえん", "そがい", "そげき", "そこう", "そこそこ", "そざい", "そしな", "そせい", - "そせん", "そそぐ", "そだてる", "そつう", "そつえん", "そっかん", "そつぎょう", "そっけつ", - "そっこう", "そっせん", "そっと", "そとがわ", "そとづら", "そなえる", "そなた", "そふぼ", - "そぼく", "そぼろ", "そまつ", "そまる", "そむく", "そむりえ", "そめる", "そもそも", - "そよかぜ", "そらまめ", "そろう", "そんかい", "そんけい", "そんざい", "そんしつ", "そんぞく", - "そんちょう", "ぞんび", "ぞんぶん", "そんみん", "たあい", "たいいん", "たいうん", "たいえき", - "たいおう", "だいがく", "たいき", "たいぐう", "たいけん", "たいこ", "たいざい", "だいじょうぶ", - "だいすき", "たいせつ", "たいそう", "だいたい", "たいちょう", "たいてい", "だいどころ", "たいない", - "たいねつ", "たいのう", "たいはん", "だいひょう", "たいふう", "たいへん", "たいほ", "たいまつばな", - "たいみんぐ", "たいむ", "たいめん", "たいやき", "たいよう", "たいら", "たいりょく", "たいる", - "たいわん", "たうえ", "たえる", "たおす", "たおる", "たおれる", "たかい", "たかね", - "たきび", "たくさん", "たこく", "たこやき", "たさい", "たしざん", "だじゃれ", "たすける", - "たずさわる", "たそがれ", "たたかう", "たたく", "ただしい", "たたみ", "たちばな", "だっかい", - "だっきゃく", "だっこ", "だっしゅつ", "だったい", "たてる", "たとえる", "たなばた", "たにん", - "たぬき", "たのしみ", "たはつ", "たぶん", "たべる", "たぼう", "たまご", "たまる", - "だむる", "ためいき", "ためす", "ためる", "たもつ", "たやすい", "たよる", "たらす", - "たりきほんがん", "たりょう", "たりる", "たると", "たれる", "たれんと", "たろっと", "たわむれる", - "だんあつ", "たんい", "たんおん", "たんか", "たんき", "たんけん", "たんご", "たんさん", - "たんじょうび", "だんせい", "たんそく", "たんたい", "だんち", "たんてい", "たんとう", "だんな", - "たんにん", "だんねつ", "たんのう", "たんぴん", "だんぼう", "たんまつ", "たんめい", "だんれつ", - "だんろ", "だんわ", "ちあい", "ちあん", "ちいき", "ちいさい", "ちえん", "ちかい", - "ちから", "ちきゅう", "ちきん", "ちけいず", "ちけん", "ちこく", "ちさい", "ちしき", - "ちしりょう", "ちせい", "ちそう", "ちたい", "ちたん", "ちちおや", "ちつじょ", "ちてき", - "ちてん", "ちぬき", "ちぬり", "ちのう", "ちひょう", "ちへいせん", "ちほう", "ちまた", - "ちみつ", "ちみどろ", "ちめいど", "ちゃんこなべ", "ちゅうい", "ちゆりょく", "ちょうし", "ちょさくけん", - "ちらし", "ちらみ", "ちりがみ", "ちりょう", "ちるど", "ちわわ", "ちんたい", "ちんもく", - "ついか", "ついたち", "つうか", "つうじょう", "つうはん", "つうわ", "つかう", "つかれる", - "つくね", "つくる", "つけね", "つける", "つごう", "つたえる", "つづく", "つつじ", - "つつむ", "つとめる", "つながる", "つなみ", "つねづね", "つのる", "つぶす", "つまらない", - "つまる", "つみき", "つめたい", "つもり", "つもる", "つよい", "つるぼ", "つるみく", - "つわもの", "つわり", "てあし", "てあて", "てあみ", "ていおん", "ていか", "ていき", - "ていけい", "ていこく", "ていさつ", "ていし", "ていせい", "ていたい", "ていど", "ていねい", - "ていひょう", "ていへん", "ていぼう", "てうち", "ておくれ", "てきとう", "てくび", "でこぼこ", - "てさぎょう", "てさげ", "てすり", "てそう", "てちがい", "てちょう", "てつがく", "てつづき", - "でっぱ", "てつぼう", "てつや", "でぬかえ", "てぬき", "てぬぐい", "てのひら", "てはい", - "てぶくろ", "てふだ", "てほどき", "てほん", "てまえ", "てまきずし", "てみじか", "てみやげ", - "てらす", "てれび", "てわけ", "てわたし", "でんあつ", "てんいん", "てんかい", "てんき", - "てんぐ", "てんけん", "てんごく", "てんさい", "てんし", "てんすう", "でんち", "てんてき", - "てんとう", "てんない", "てんぷら", "てんぼうだい", "てんめつ", "てんらんかい", "でんりょく", "でんわ", - "どあい", "といれ", "どうかん", "とうきゅう", "どうぐ", "とうし", "とうむぎ", "とおい", - "とおか", "とおく", "とおす", "とおる", "とかい", "とかす", "ときおり", "ときどき", - "とくい", "とくしゅう", "とくてん", "とくに", "とくべつ", "とけい", "とける", "とこや", - "とさか", "としょかん", "とそう", "とたん", "とちゅう", "とっきゅう", "とっくん", "とつぜん", - "とつにゅう", "とどける", "ととのえる", "とない", "となえる", "となり", "とのさま", "とばす", - "どぶがわ", "とほう", "とまる", "とめる", "ともだち", "ともる", "どようび", "とらえる", - "とんかつ", "どんぶり", "ないかく", "ないこう", "ないしょ", "ないす", "ないせん", "ないそう", - "なおす", "ながい", "なくす", "なげる", "なこうど", "なさけ", "なたでここ", "なっとう", - "なつやすみ", "ななおし", "なにごと", "なにもの", "なにわ", "なのか", "なふだ", "なまいき", - "なまえ", "なまみ", "なみだ", "なめらか", "なめる", "なやむ", "ならう", "ならび", - "ならぶ", "なれる", "なわとび", "なわばり", "にあう", "にいがた", "にうけ", "におい", - "にかい", "にがて", "にきび", "にくしみ", "にくまん", "にげる", "にさんかたんそ", "にしき", - "にせもの", "にちじょう", "にちようび", "にっか", "にっき", "にっけい", "にっこう", "にっさん", - "にっしょく", "にっすう", "にっせき", "にってい", "になう", "にほん", "にまめ", "にもつ", - "にやり", "にゅういん", "にりんしゃ", "にわとり", "にんい", "にんか", "にんき", "にんげん", - "にんしき", "にんずう", "にんそう", "にんたい", "にんち", "にんてい", "にんにく", "にんぷ", - "にんまり", "にんむ", "にんめい", "にんよう", "ぬいくぎ", "ぬかす", "ぬぐいとる", "ぬぐう", - "ぬくもり", "ぬすむ", "ぬまえび", "ぬめり", "ぬらす", "ぬんちゃく", "ねあげ", "ねいき", - "ねいる", "ねいろ", "ねぐせ", "ねくたい", "ねくら", "ねこぜ", "ねこむ", "ねさげ", - "ねすごす", "ねそべる", "ねだん", "ねつい", "ねっしん", "ねつぞう", "ねったいぎょ", "ねぶそく", - "ねふだ", "ねぼう", "ねほりはほり", "ねまき", "ねまわし", "ねみみ", "ねむい", "ねむたい", - "ねもと", "ねらう", "ねわざ", "ねんいり", "ねんおし", "ねんかん", "ねんきん", "ねんぐ", - "ねんざ", "ねんし", "ねんちゃく", "ねんど", "ねんぴ", "ねんぶつ", "ねんまつ", "ねんりょう", - "ねんれい", "のいず", "のおづま", "のがす", "のきなみ", "のこぎり", "のこす", "のこる", - "のせる", "のぞく", "のぞむ", "のたまう", "のちほど", "のっく", "のばす", "のはら", - "のべる", "のぼる", "のみもの", "のやま", "のらいぬ", "のらねこ", "のりもの", "のりゆき", - "のれん", "のんき", "ばあい", "はあく", "ばあさん", "ばいか", "ばいく", "はいけん", - "はいご", "はいしん", "はいすい", "はいせん", "はいそう", "はいち", "ばいばい", "はいれつ", - "はえる", "はおる", "はかい", "ばかり", "はかる", "はくしゅ", "はけん", "はこぶ", - "はさみ", "はさん", "はしご", "ばしょ", "はしる", "はせる", "ぱそこん", "はそん", - "はたん", "はちみつ", "はつおん", "はっかく", "はづき", "はっきり", "はっくつ", "はっけん", - "はっこう", "はっさん", "はっしん", "はったつ", "はっちゅう", "はってん", "はっぴょう", "はっぽう", - "はなす", "はなび", "はにかむ", "はぶらし", "はみがき", "はむかう", "はめつ", "はやい", - "はやし", "はらう", "はろうぃん", "はわい", "はんい", "はんえい", "はんおん", "はんかく", - "はんきょう", "ばんぐみ", "はんこ", "はんしゃ", "はんすう", "はんだん", "ぱんち", "ぱんつ", - "はんてい", "はんとし", "はんのう", "はんぱ", "はんぶん", "はんぺん", "はんぼうき", "はんめい", - "はんらん", "はんろん", "ひいき", "ひうん", "ひえる", "ひかく", "ひかり", "ひかる", - "ひかん", "ひくい", "ひけつ", "ひこうき", "ひこく", "ひさい", "ひさしぶり", "ひさん", - "びじゅつかん", "ひしょ" - ] - } - }; - exports.mn_words = mn_words; - - (function() { - 'use strict'; - for (var i in mn_words) { - if (mn_words.hasOwnProperty(i)) { - if (mn_words[i].prefix_len === 0) { - continue; - } - mn_words[i].trunc_words = []; - for (var j = 0; j < mn_words[i].words.length; ++j) { - mn_words[i].trunc_words.push(mn_words[i].words[j].slice(0, mn_words[i].prefix_len)); - } - } - } - })(); - -})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/cryptonote_utils/nacl-fast-cn.js b/cryptonote_utils/nacl-fast-cn.js deleted file mode 100644 index 536b667..0000000 --- a/cryptonote_utils/nacl-fast-cn.js +++ /dev/null @@ -1,571 +0,0 @@ -(function(nacl) { -'use strict'; - -// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. -// Public domain. -// -// Implementation derived from TweetNaCl version 20140427. -// See for details: http://tweetnacl.cr.yp.to/ - -// modified 2017 for some CN functions by luigi1111 - -var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; -}; - -// Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; - -var _0 = new Uint8Array(16); -var _9 = new Uint8Array(32); _9[0] = 9; - -var gf0 = gf(), - gf1 = gf([1]), - _121665 = gf([0xdb41, 1]), - D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), - D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), - X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), - Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), - I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); - -function vn(x, xi, y, yi, n) { - var i,d = 0; - for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; - return (1 & ((d - 1) >>> 8)) - 1; -} - -function crypto_verify_16(x, xi, y, yi) { - return vn(x,xi,y,yi,16); -} - -function crypto_verify_32(x, xi, y, yi) { - return vn(x,xi,y,yi,32); -} - -function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i]|0; -} - -function car25519(o) { - var i, v, c = 1; - for (i = 0; i < 16; i++) { - v = o[i] + c + 65535; - c = Math.floor(v / 65536); - o[i] = v - c * 65536; - } - o[0] += c-1 + 37 * (c-1); -} - -function sel25519(p, q, b) { - var t, c = ~(b-1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } -} - -function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - o[2*i+1] = t[i]>>8; - } -} - -function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); -} - -function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; -} - -function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); - o[15] &= 0x7fff; -} - -function A(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; -} - -function Z(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; -} - -function M(o, a, b) { - var v, c, - t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, - t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, - t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, - t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, - b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], - b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], - b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; - - v = a[0]; - t0 += v * b0; t1 += v * b1; t2 += v * b2; t3 += v * b3; - t4 += v * b4; t5 += v * b5; t6 += v * b6; t7 += v * b7; - t8 += v * b8; t9 += v * b9; t10 += v * b10; t11 += v * b11; - t12 += v * b12; t13 += v * b13; t14 += v * b14; t15 += v * b15; - v = a[1]; - t1 += v * b0; t2 += v * b1; t3 += v * b2; t4 += v * b3; - t5 += v * b4; t6 += v * b5; t7 += v * b6; t8 += v * b7; - t9 += v * b8; t10 += v * b9; t11 += v * b10; t12 += v * b11; - t13 += v * b12; t14 += v * b13; t15 += v * b14; t16 += v * b15; - v = a[2]; - t2 += v * b0; t3 += v * b1; t4 += v * b2; t5 += v * b3; - t6 += v * b4; t7 += v * b5; t8 += v * b6; t9 += v * b7; - t10 += v * b8; t11 += v * b9; t12 += v * b10; t13 += v * b11; - t14 += v * b12; t15 += v * b13; t16 += v * b14; t17 += v * b15; - v = a[3]; - t3 += v * b0; t4 += v * b1; t5 += v * b2; t6 += v * b3; - t7 += v * b4; t8 += v * b5; t9 += v * b6; t10 += v * b7; - t11 += v * b8; t12 += v * b9; t13 += v * b10; t14 += v * b11; - t15 += v * b12; t16 += v * b13; t17 += v * b14; t18 += v * b15; - v = a[4]; - t4 += v * b0; t5 += v * b1; t6 += v * b2; t7 += v * b3; - t8 += v * b4; t9 += v * b5; t10 += v * b6; t11 += v * b7; - t12 += v * b8; t13 += v * b9; t14 += v * b10; t15 += v * b11; - t16 += v * b12; t17 += v * b13; t18 += v * b14; t19 += v * b15; - v = a[5]; - t5 += v * b0; t6 += v * b1; t7 += v * b2; t8 += v * b3; - t9 += v * b4; t10 += v * b5; t11 += v * b6; t12 += v * b7; - t13 += v * b8; t14 += v * b9; t15 += v * b10; t16 += v * b11; - t17 += v * b12; t18 += v * b13; t19 += v * b14; t20 += v * b15; - v = a[6]; - t6 += v * b0; t7 += v * b1; t8 += v * b2; t9 += v * b3; - t10 += v * b4; t11 += v * b5; t12 += v * b6; t13 += v * b7; - t14 += v * b8; t15 += v * b9; t16 += v * b10; t17 += v * b11; - t18 += v * b12; t19 += v * b13; t20 += v * b14; t21 += v * b15; - v = a[7]; - t7 += v * b0; t8 += v * b1; t9 += v * b2; t10 += v * b3; - t11 += v * b4; t12 += v * b5; t13 += v * b6; t14 += v * b7; - t15 += v * b8; t16 += v * b9; t17 += v * b10; t18 += v * b11; - t19 += v * b12; t20 += v * b13; t21 += v * b14; t22 += v * b15; - v = a[8]; - t8 += v * b0; t9 += v * b1; t10 += v * b2; t11 += v * b3; - t12 += v * b4; t13 += v * b5; t14 += v * b6; t15 += v * b7; - t16 += v * b8; t17 += v * b9; t18 += v * b10; t19 += v * b11; - t20 += v * b12; t21 += v * b13; t22 += v * b14; t23 += v * b15; - v = a[9]; - t9 += v * b0; t10 += v * b1; t11 += v * b2; t12 += v * b3; - t13 += v * b4; t14 += v * b5; t15 += v * b6; t16 += v * b7; - t17 += v * b8; t18 += v * b9; t19 += v * b10; t20 += v * b11; - t21 += v * b12; t22 += v * b13; t23 += v * b14; t24 += v * b15; - v = a[10]; - t10 += v * b0; t11 += v * b1; t12 += v * b2; t13 += v * b3; - t14 += v * b4; t15 += v * b5; t16 += v * b6; t17 += v * b7; - t18 += v * b8; t19 += v * b9; t20 += v * b10; t21 += v * b11; - t22 += v * b12; t23 += v * b13; t24 += v * b14; t25 += v * b15; - v = a[11]; - t11 += v * b0; t12 += v * b1; t13 += v * b2; t14 += v * b3; - t15 += v * b4; t16 += v * b5; t17 += v * b6; t18 += v * b7; - t19 += v * b8; t20 += v * b9; t21 += v * b10; t22 += v * b11; - t23 += v * b12; t24 += v * b13; t25 += v * b14; t26 += v * b15; - v = a[12]; - t12 += v * b0; t13 += v * b1; t14 += v * b2; t15 += v * b3; - t16 += v * b4; t17 += v * b5; t18 += v * b6; t19 += v * b7; - t20 += v * b8; t21 += v * b9; t22 += v * b10; t23 += v * b11; - t24 += v * b12; t25 += v * b13; t26 += v * b14; t27 += v * b15; - v = a[13]; - t13 += v * b0; t14 += v * b1; t15 += v * b2; t16 += v * b3; - t17 += v * b4; t18 += v * b5; t19 += v * b6; t20 += v * b7; - t21 += v * b8; t22 += v * b9; t23 += v * b10; t24 += v * b11; - t25 += v * b12; t26 += v * b13; t27 += v * b14; t28 += v * b15; - v = a[14]; - t14 += v * b0; t15 += v * b1; t16 += v * b2; t17 += v * b3; - t18 += v * b4; t19 += v * b5; t20 += v * b6; t21 += v * b7; - t22 += v * b8; t23 += v * b9; t24 += v * b10; t25 += v * b11; - t26 += v * b12; t27 += v * b13; t28 += v * b14; t29 += v * b15; - v = a[15]; - t15 += v * b0; t16 += v * b1; t17 += v * b2; t18 += v * b3; - t19 += v * b4; t20 += v * b5; t21 += v * b6; t22 += v * b7; - t23 += v * b8; t24 += v * b9; t25 += v * b10; t26 += v * b11; - t27 += v * b12; t28 += v * b13; t29 += v * b14; t30 += v * b15; - - t0 += 38 * t16; t1 += 38 * t17; t2 += 38 * t18; t3 += 38 * t19; - t4 += 38 * t20; t5 += 38 * t21; t6 += 38 * t22; t7 += 38 * t23; - t8 += 38 * t24; t9 += 38 * t25; t10 += 38 * t26; t11 += 38 * t27; - t12 += 38 * t28; t13 += 38 * t29; t14 += 38 * t30; // t15 left as is - - // first car - c = 1; - v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; - v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; - v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; - v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; - v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; - v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; - v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; - v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; - v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; - v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; - v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; - v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; - v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; - v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; - v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; - v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; - t0 += c-1 + 37 * (c-1); - - // second car - c = 1; - v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; - v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; - v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; - v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; - v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; - v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; - v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; - v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; - v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; - v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; - v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; - v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; - v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; - v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; - v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; - v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; - t0 += c-1 + 37 * (c-1); - - o[ 0] = t0; - o[ 1] = t1; - o[ 2] = t2; - o[ 3] = t3; - o[ 4] = t4; - o[ 5] = t5; - o[ 6] = t6; - o[ 7] = t7; - o[ 8] = t8; - o[ 9] = t9; - o[10] = t10; - o[11] = t11; - o[12] = t12; - o[13] = t13; - o[14] = t14; - o[15] = t15; -} - -function S(o, a) { - M(o, a, a); -} - -function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if(a !== 2 && a !== 4) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; -} - -function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { - S(c, c); - if(a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; -} - -function add(p, q) { - var a = gf(), b = gf(), c = gf(), - d = gf(), e = gf(), f = gf(), - g = gf(), h = gf(), t = gf(); - - Z(a, p[1], p[0]); - Z(t, q[1], q[0]); - M(a, a, t); - A(b, p[0], p[1]); - A(t, q[0], q[1]); - M(b, b, t); - M(c, p[3], q[3]); - M(c, c, D2); - M(d, p[2], q[2]); - A(d, d, d); - Z(e, b, a); - Z(f, d, c); - A(g, d, c); - A(h, b, a); - - M(p[0], e, f); - M(p[1], h, g); - M(p[2], g, f); - M(p[3], e, h); -} - -function cswap(p, q, b) { - var i; - for (i = 0; i < 4; i++) { - sel25519(p[i], q[i], b); - } -} - -function pack(r, p) { - var tx = gf(), ty = gf(), zi = gf(); - inv25519(zi, p[2]); - M(tx, p[0], zi); - M(ty, p[1], zi); - pack25519(r, ty); - r[31] ^= par25519(tx) << 7; -} - -function scalarmult(p, q, s) { - var b, i; - set25519(p[0], gf0); - set25519(p[1], gf1); - set25519(p[2], gf1); - set25519(p[3], gf0); - for (i = 255; i >= 0; --i) { - b = (s[(i/8)|0] >> (i&7)) & 1; - cswap(p, q, b); - add(q, p); - add(p, p); - cswap(p, q, b); - } -} - -function scalarbase(p, s) { - var q = [gf(), gf(), gf(), gf()]; - set25519(q[0], X); - set25519(q[1], Y); - set25519(q[2], gf1); - M(q[3], X, Y); - scalarmult(p, q, s); -} - -//new functions for CN - scalar operations are handled externally -// this only handles curve operations, except for Hp() - -//why do we negate points when unpacking them??? -function ge_neg(pub) { - pub[31] ^= 0x80; -} - -//res = s*G -function ge_scalarmult_base(s) { - var p = [gf(), gf(), gf(), gf()]; - scalarbase(p, s); - var pk = new Uint8Array(32); - pack(pk, p); - return pk; -} - -//res = s*P -function ge_scalarmult(P, s) { - var p = [gf(), gf(), gf(), gf()], - upk = [gf(), gf(), gf(), gf()], - res = new Uint8Array(32); - ge_neg(P); - if (unpackneg(upk, P) !== 0) throw "non-0 error on point decode"; - scalarmult(p, upk, s); - pack(res, p); - return res; -} - -//res = c*P + r*G -function ge_double_scalarmult_base_vartime(c, P, r) { - var uP = [gf(), gf(), gf(), gf()], - cP = [gf(), gf(), gf(), gf()], - rG = [gf(), gf(), gf(), gf()], - res = new Uint8Array(32); - ge_neg(P); - if (unpackneg(uP, P) !== 0) throw "non-0 error on point decode"; - scalarmult(cP, uP, c); - scalarbase(rG, r); - add(rG, cP); - pack(res, rG); - return res; -} - -//name changed to reflect not using precomp; res = r*Pb + c*I -function ge_double_scalarmult_postcomp_vartime(r, Pb, c, I) { - var uPb = [gf(), gf(), gf(), gf()], - uI = [gf(), gf(), gf(), gf()], - cI = [gf(), gf(), gf(), gf()], - rPb = [gf(), gf(), gf(), gf()], - res = new Uint8Array(32); - ge_neg(Pb); - if (unpackneg(uPb, Pb) !== 0) throw "non-0 error on point decode"; - scalarmult(rPb, uPb, r); - ge_neg(I); - if (unpackneg(uI, I) !== 0) throw "non-0 error on point decode"; - scalarmult(cI, uI, c); - add(rPb, cI); - pack(res, rPb); - return res; -} - -//res = P + Q -function ge_add(P, Q) { - var uP = [gf(), gf(), gf(), gf()], - uQ = [gf(), gf(), gf(), gf()], - res = new Uint8Array(32); - ge_neg(P); - ge_neg(Q); - if (unpackneg(uP, P) !== 0) throw "non-0 error on point decode"; - if (unpackneg(uQ, Q) !== 0) throw "non-0 error on point decode"; - add(uP, uQ); - pack(res, uP); - return res; -} - -var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); - -function modL(r, x) { - var carry, i, j, k; - for (i = 63; i >= 32; --i) { - carry = 0; - for (j = i - 32, k = i - 12; j < k; ++j) { - x[j] += carry - 16 * x[i] * L[j - (i - 32)]; - carry = (x[j] + 128) >> 8; - x[j] -= carry * 256; - } - x[j] += carry; - x[i] = 0; - } - carry = 0; - for (j = 0; j < 32; j++) { - x[j] += carry - (x[31] >> 4) * L[j]; - carry = x[j] >> 8; - x[j] &= 255; - } - for (j = 0; j < 32; j++) x[j] -= carry * L[j]; - for (i = 0; i < 32; i++) { - x[i+1] += x[i] >> 8; - r[i] = x[i] & 255; - } -} - -function reduce(r) { - var x = new Float64Array(64), i; - for (i = 0; i < 64; i++) x[i] = r[i]; - for (i = 0; i < 64; i++) r[i] = 0; - modL(r, x); -} - -function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), - den = gf(), den2 = gf(), den4 = gf(), - den6 = gf(); - - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); - - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); - - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); - - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); - - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; - - if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); - - M(r[3], r[0], r[1]); - return 0; -} - -nacl.ll = { - - ge_scalarmult_base: ge_scalarmult_base, - ge_scalarmult: ge_scalarmult, - ge_double_scalarmult_base_vartime: ge_double_scalarmult_base_vartime, - ge_add: ge_add, - ge_double_scalarmult_postcomp_vartime: ge_double_scalarmult_postcomp_vartime - -}; - - -/* High-level API */ - -function cleanup(arr) { - for (var i = 0; i < arr.length; i++) arr[i] = 0; -} - -nacl.randomBytes = function(n) { - var b = new Uint8Array(n); - randombytes(b, n); - return b; -}; - -nacl.setPRNG = function(fn) { - randombytes = fn; -}; - -(function() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; - if (crypto && crypto.getRandomValues) { - // Browsers. - var QUOTA = 65536; - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - for (i = 0; i < n; i += QUOTA) { - crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); - } - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } else if (typeof require !== 'undefined') { - // Node.js. - crypto = require('crypto'); - if (crypto && crypto.randomBytes) { - nacl.setPRNG(function(x, n) { - var i, v = crypto.randomBytes(n); - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } - } -})(); - -})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/cryptonote_utils/sha3.js b/cryptonote_utils/sha3.js deleted file mode 100644 index dcf3d53..0000000 --- a/cryptonote_utils/sha3.js +++ /dev/null @@ -1,473 +0,0 @@ -/* - * js-sha3 v0.5.1 - * https://github.com/emn178/js-sha3 - * - * Copyright 2015, emn178@gmail.com - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/MIT - */ -;(function(root, undefined) { - 'use strict'; - - var NODE_JS = typeof(module) != 'undefined'; - if(NODE_JS) { - root = global; - if(root.JS_SHA3_TEST) { - root.navigator = { userAgent: 'Chrome'}; - } - } - var HEX_CHARS = '0123456789abcdef'.split(''); - var SHAKE_PADDING = [31, 7936, 2031616, 520093696]; - var KECCAK_PADDING = [1, 256, 65536, 16777216]; - var PADDING = [6, 1536, 393216, 100663296]; - var SHIFT = [0, 8, 16, 24]; - var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, - 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, - 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, - 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, - 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648]; - var BITS = [224, 256, 384, 512]; - var SHAKE_BITS = [128, 256]; - var OUTPUT_TYPES = ['hex', 'buffer', 'array']; - - var createOutputMethod = function(bits, padding, outputType) { - return function(message) { - return new Keccak(bits, padding, bits).update(message)[outputType](); - } - }; - - var createShakeOutputMethod = function(bits, padding, outputType) { - return function(message, outputBits) { - return new Keccak(bits, padding, outputBits).update(message)[outputType](); - } - }; - - var createMethod = function(bits, padding) { - var method = createOutputMethod(bits, padding, 'hex'); - method.create = function() { - return new Keccak(bits, padding, bits); - }; - method.update = function(message) { - return method.create().update(message); - }; - for(var i = 0;i < OUTPUT_TYPES.length;++i) { - var type = OUTPUT_TYPES[i]; - method[type] = createOutputMethod(bits, padding, type); - } - return method; - }; - - var createShakeMethod = function(bits, padding) { - var method = createShakeOutputMethod(bits, padding, 'hex'); - method.create = function(outputBits) { - return new Keccak(bits, padding, outputBits); - }; - method.update = function(message, outputBits) { - return method.create(outputBits).update(message); - }; - for(var i = 0;i < OUTPUT_TYPES.length;++i) { - var type = OUTPUT_TYPES[i]; - method[type] = createShakeOutputMethod(bits, padding, type); - } - return method; - }; - - var algorithms = [ - {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod}, - {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod}, - {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod} - ]; - - var methods = {}; - - for(var i = 0;i < algorithms.length;++i) { - var algorithm = algorithms[i]; - var bits = algorithm.bits; - var createMethod = algorithm.createMethod; - for(var j = 0;j < bits.length;++j) { - var method = algorithm.createMethod(bits[j], algorithm.padding); - methods[algorithm.name +'_' + bits[j]] = method; - } - } - - function Keccak(bits, padding, outputBits) { - this.blocks = []; - this.s = []; - this.padding = padding; - this.outputBits = outputBits; - this.reset = true; - this.block = 0; - this.start = 0; - this.blockCount = (1600 - (bits << 1)) >> 5; - this.byteCount = this.blockCount << 2; - this.outputBlocks = outputBits >> 5; - this.extraBytes = (outputBits & 31) >> 3; - - for(var i = 0;i < 50;++i) { - this.s[i] = 0; - } - }; - - Keccak.prototype.update = function(message) { - var notString = typeof(message) != 'string'; - if(notString && message.constructor == root.ArrayBuffer) { - message = new Uint8Array(message); - } - var length = message.length, blocks = this.blocks, byteCount = this.byteCount, - blockCount = this.blockCount, index = 0, s = this.s, i, code; - - while(index < length) { - if(this.reset) { - this.reset = false; - blocks[0] = this.block; - for(i = 1;i < blockCount + 1;++i) { - blocks[i] = 0; - } - } - if(notString) { - for (i = this.start;index < length && i < byteCount; ++index) { - blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; - } - } else { - for (i = this.start;index < length && i < byteCount; ++index) { - code = message.charCodeAt(index); - if (code < 0x80) { - blocks[i >> 2] |= code << SHIFT[i++ & 3]; - } else if (code < 0x800) { - blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } else if (code < 0xd800 || code >= 0xe000) { - blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } else { - code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); - blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } - } - } - this.lastByteIndex = i; - if(i >= byteCount) { - this.start = i - byteCount; - this.block = blocks[blockCount]; - for(i = 0;i < blockCount;++i) { - s[i] ^= blocks[i]; - } - f(s); - this.reset = true; - } else { - this.start = i; - } - } - return this; - }; - - Keccak.prototype.finalize = function() { - var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s; - blocks[i >> 2] |= this.padding[i & 3]; - if(this.lastByteIndex == this.byteCount) { - blocks[0] = blocks[blockCount]; - for(i = 1;i < blockCount + 1;++i) { - blocks[i] = 0; - } - } - blocks[blockCount - 1] |= 0x80000000; - for(i = 0;i < blockCount;++i) { - s[i] ^= blocks[i]; - } - f(s); - }; - - Keccak.prototype.toString = Keccak.prototype.hex = function() { - this.finalize(); - - var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, - extraBytes = this.extraBytes, i = 0, j = 0; - var hex = '', block; - while(j < outputBlocks) { - for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) { - block = s[i]; - hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + - HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + - HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + - HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; - } - if(j % blockCount == 0) { - f(s); - } - } - if(extraBytes) { - block = s[i]; - if(extraBytes > 0) { - hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; - } - if(extraBytes > 1) { - hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; - } - if(extraBytes > 2) { - hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; - } - } - return hex; - }; - - Keccak.prototype.buffer = function() { - this.finalize(); - - var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, - extraBytes = this.extraBytes, i = 0, j = 0; - var bytes = this.outputBits >> 3; - var buffer; - if(extraBytes) { - buffer = new ArrayBuffer((outputBlocks + 1) << 2); - } else { - buffer = new ArrayBuffer(bytes); - } - var array = new Uint32Array(buffer); - while(j < outputBlocks) { - for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) { - array[j] = s[i]; - } - if(j % blockCount == 0) { - f(s); - } - } - if(extraBytes) { - array[i] = s[i]; - buffer = buffer.slice(0, bytes); - } - return buffer; - }; - - Keccak.prototype.digest = Keccak.prototype.array = function() { - this.finalize(); - - var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, - extraBytes = this.extraBytes, i = 0, j = 0; - var array = [], offset, block; - while(j < outputBlocks) { - for(i = 0;i < blockCount && j < outputBlocks;++i, ++j) { - offset = j << 2; - block = s[i]; - array[offset] = block & 0xFF; - array[offset + 1] = (block >> 8) & 0xFF; - array[offset + 2] = (block >> 16) & 0xFF; - array[offset + 3] = (block >> 24) & 0xFF; - } - if(j % blockCount == 0) { - f(s); - } - } - if(extraBytes) { - offset = j << 2; - block = s[i]; - if(extraBytes > 0) { - array[offset] = block & 0xFF; - } - if(extraBytes > 1) { - array[offset + 1] = (block >> 8) & 0xFF; - } - if(extraBytes > 2) { - array[offset + 2] = (block >> 16) & 0xFF; - } - } - return array; - }; - - var f = function(s) { - var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, - b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, - b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, - b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; - for(n = 0; n < 48; n += 2) { - c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; - c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; - c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; - c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; - c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; - c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; - c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; - c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; - c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; - c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; - - h = c8 ^ ((c2 << 1) | (c3 >>> 31)); - l = c9 ^ ((c3 << 1) | (c2 >>> 31)); - s[0] ^= h; - s[1] ^= l; - s[10] ^= h; - s[11] ^= l; - s[20] ^= h; - s[21] ^= l; - s[30] ^= h; - s[31] ^= l; - s[40] ^= h; - s[41] ^= l; - h = c0 ^ ((c4 << 1) | (c5 >>> 31)); - l = c1 ^ ((c5 << 1) | (c4 >>> 31)); - s[2] ^= h; - s[3] ^= l; - s[12] ^= h; - s[13] ^= l; - s[22] ^= h; - s[23] ^= l; - s[32] ^= h; - s[33] ^= l; - s[42] ^= h; - s[43] ^= l; - h = c2 ^ ((c6 << 1) | (c7 >>> 31)); - l = c3 ^ ((c7 << 1) | (c6 >>> 31)); - s[4] ^= h; - s[5] ^= l; - s[14] ^= h; - s[15] ^= l; - s[24] ^= h; - s[25] ^= l; - s[34] ^= h; - s[35] ^= l; - s[44] ^= h; - s[45] ^= l; - h = c4 ^ ((c8 << 1) | (c9 >>> 31)); - l = c5 ^ ((c9 << 1) | (c8 >>> 31)); - s[6] ^= h; - s[7] ^= l; - s[16] ^= h; - s[17] ^= l; - s[26] ^= h; - s[27] ^= l; - s[36] ^= h; - s[37] ^= l; - s[46] ^= h; - s[47] ^= l; - h = c6 ^ ((c0 << 1) | (c1 >>> 31)); - l = c7 ^ ((c1 << 1) | (c0 >>> 31)); - s[8] ^= h; - s[9] ^= l; - s[18] ^= h; - s[19] ^= l; - s[28] ^= h; - s[29] ^= l; - s[38] ^= h; - s[39] ^= l; - s[48] ^= h; - s[49] ^= l; - - b0 = s[0]; - b1 = s[1]; - b32 = (s[11] << 4) | (s[10] >>> 28); - b33 = (s[10] << 4) | (s[11] >>> 28); - b14 = (s[20] << 3) | (s[21] >>> 29); - b15 = (s[21] << 3) | (s[20] >>> 29); - b46 = (s[31] << 9) | (s[30] >>> 23); - b47 = (s[30] << 9) | (s[31] >>> 23); - b28 = (s[40] << 18) | (s[41] >>> 14); - b29 = (s[41] << 18) | (s[40] >>> 14); - b20 = (s[2] << 1) | (s[3] >>> 31); - b21 = (s[3] << 1) | (s[2] >>> 31); - b2 = (s[13] << 12) | (s[12] >>> 20); - b3 = (s[12] << 12) | (s[13] >>> 20); - b34 = (s[22] << 10) | (s[23] >>> 22); - b35 = (s[23] << 10) | (s[22] >>> 22); - b16 = (s[33] << 13) | (s[32] >>> 19); - b17 = (s[32] << 13) | (s[33] >>> 19); - b48 = (s[42] << 2) | (s[43] >>> 30); - b49 = (s[43] << 2) | (s[42] >>> 30); - b40 = (s[5] << 30) | (s[4] >>> 2); - b41 = (s[4] << 30) | (s[5] >>> 2); - b22 = (s[14] << 6) | (s[15] >>> 26); - b23 = (s[15] << 6) | (s[14] >>> 26); - b4 = (s[25] << 11) | (s[24] >>> 21); - b5 = (s[24] << 11) | (s[25] >>> 21); - b36 = (s[34] << 15) | (s[35] >>> 17); - b37 = (s[35] << 15) | (s[34] >>> 17); - b18 = (s[45] << 29) | (s[44] >>> 3); - b19 = (s[44] << 29) | (s[45] >>> 3); - b10 = (s[6] << 28) | (s[7] >>> 4); - b11 = (s[7] << 28) | (s[6] >>> 4); - b42 = (s[17] << 23) | (s[16] >>> 9); - b43 = (s[16] << 23) | (s[17] >>> 9); - b24 = (s[26] << 25) | (s[27] >>> 7); - b25 = (s[27] << 25) | (s[26] >>> 7); - b6 = (s[36] << 21) | (s[37] >>> 11); - b7 = (s[37] << 21) | (s[36] >>> 11); - b38 = (s[47] << 24) | (s[46] >>> 8); - b39 = (s[46] << 24) | (s[47] >>> 8); - b30 = (s[8] << 27) | (s[9] >>> 5); - b31 = (s[9] << 27) | (s[8] >>> 5); - b12 = (s[18] << 20) | (s[19] >>> 12); - b13 = (s[19] << 20) | (s[18] >>> 12); - b44 = (s[29] << 7) | (s[28] >>> 25); - b45 = (s[28] << 7) | (s[29] >>> 25); - b26 = (s[38] << 8) | (s[39] >>> 24); - b27 = (s[39] << 8) | (s[38] >>> 24); - b8 = (s[48] << 14) | (s[49] >>> 18); - b9 = (s[49] << 14) | (s[48] >>> 18); - - s[0] = b0 ^ (~b2 & b4); - s[1] = b1 ^ (~b3 & b5); - s[10] = b10 ^ (~b12 & b14); - s[11] = b11 ^ (~b13 & b15); - s[20] = b20 ^ (~b22 & b24); - s[21] = b21 ^ (~b23 & b25); - s[30] = b30 ^ (~b32 & b34); - s[31] = b31 ^ (~b33 & b35); - s[40] = b40 ^ (~b42 & b44); - s[41] = b41 ^ (~b43 & b45); - s[2] = b2 ^ (~b4 & b6); - s[3] = b3 ^ (~b5 & b7); - s[12] = b12 ^ (~b14 & b16); - s[13] = b13 ^ (~b15 & b17); - s[22] = b22 ^ (~b24 & b26); - s[23] = b23 ^ (~b25 & b27); - s[32] = b32 ^ (~b34 & b36); - s[33] = b33 ^ (~b35 & b37); - s[42] = b42 ^ (~b44 & b46); - s[43] = b43 ^ (~b45 & b47); - s[4] = b4 ^ (~b6 & b8); - s[5] = b5 ^ (~b7 & b9); - s[14] = b14 ^ (~b16 & b18); - s[15] = b15 ^ (~b17 & b19); - s[24] = b24 ^ (~b26 & b28); - s[25] = b25 ^ (~b27 & b29); - s[34] = b34 ^ (~b36 & b38); - s[35] = b35 ^ (~b37 & b39); - s[44] = b44 ^ (~b46 & b48); - s[45] = b45 ^ (~b47 & b49); - s[6] = b6 ^ (~b8 & b0); - s[7] = b7 ^ (~b9 & b1); - s[16] = b16 ^ (~b18 & b10); - s[17] = b17 ^ (~b19 & b11); - s[26] = b26 ^ (~b28 & b20); - s[27] = b27 ^ (~b29 & b21); - s[36] = b36 ^ (~b38 & b30); - s[37] = b37 ^ (~b39 & b31); - s[46] = b46 ^ (~b48 & b40); - s[47] = b47 ^ (~b49 & b41); - s[8] = b8 ^ (~b0 & b2); - s[9] = b9 ^ (~b1 & b3); - s[18] = b18 ^ (~b10 & b12); - s[19] = b19 ^ (~b11 & b13); - s[28] = b28 ^ (~b20 & b22); - s[29] = b29 ^ (~b21 & b23); - s[38] = b38 ^ (~b30 & b32); - s[39] = b39 ^ (~b31 & b33); - s[48] = b48 ^ (~b40 & b42); - s[49] = b49 ^ (~b41 & b43); - - s[0] ^= RC[n]; - s[1] ^= RC[n + 1]; - } - } - - if(!root.JS_SHA3_TEST && NODE_JS) { - module.exports = methods; - } else if(root) { - for(var key in methods) { - root[key] = methods[key]; - } - } -}(this)); diff --git a/monero_utils/monero_paymentID_utils.js b/monero_utils/monero_paymentID_utils.js index aca1519..ada7ddb 100644 --- a/monero_utils/monero_paymentID_utils.js +++ b/monero_utils/monero_paymentID_utils.js @@ -32,8 +32,9 @@ const monero_utils = require("./monero_cryptonote_utils_instance"); // // Note: long (64 char, plaintext) payment ids are deprecated. // -function New_Short_TransactionID() { - return monero_utils.rand_8(); +function New_Short_TransactionID() +{ + return monero_utils.new_payment_id(); } exports.New_Short_TransactionID = New_Short_TransactionID; exports.New_TransactionID = New_Short_TransactionID; diff --git a/monero_utils/monero_txParsing_utils.js b/monero_utils/monero_txParsing_utils.js index 08b721d..d97a81e 100644 --- a/monero_utils/monero_txParsing_utils.js +++ b/monero_utils/monero_txParsing_utils.js @@ -29,7 +29,6 @@ "use strict"; // const monero_config = require("./monero_config"); -const monero_utils = require("./monero_cryptonote_utils_instance"); // function IsTransactionConfirmed(tx, blockchain_height) { return blockchain_height - tx.height > monero_config.txMinConfirms; diff --git a/monero_utils/monero_wallet_utils.js b/monero_utils/monero_wallet_utils.js index b2dda07..2a88568 100644 --- a/monero_utils/monero_wallet_utils.js +++ b/monero_utils/monero_wallet_utils.js @@ -28,9 +28,7 @@ "use strict"; // -const mnemonic = require("../cryptonote_utils/mnemonic"); const monero_utils = require("./monero_cryptonote_utils_instance"); -const monero_config = require("./monero_config"); // // //////////////////////////////////////////////////////////////////////////////// diff --git a/package.json b/package.json index 25051fa..9f963ca 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,7 @@ "testEnvironment":"node", "coveragePathIgnorePatterns": [ "node_modules", - "cryptonote_utils/biginteger.js", - "cryptonote_utils/nacl-fast-cn.js", - "cryptonote_utils/sha3.js", - "cryptonote_utils/cryptonote_crypto_EMSCRIPTEN.js", + "cryptonote_utils/MyMoneroCoreCpp.js", "tests/emjs/*" ] } diff --git a/wallaby.js b/wallaby.js index ae352b2..d3cd46b 100644 --- a/wallaby.js +++ b/wallaby.js @@ -40,10 +40,7 @@ module.exports = function(wallaby) { ], filesWithNoCoverageCalculated: [ - "cryptonote_utils/nacl-fast-cn.js", - "cryptonote_utils/biginteger.js", - "cryptonote_utils/sha3.js", - "cryptonote_utils/cryptonote_crypto_EMSCRIPTEN.js", + "cryptonote_utils/MyMoneroCoreCpp.js", ], tests: ["./tests/**/*spec.js"],