├── src ├── mnemonic.d.ts ├── params.d.ts ├── params.js ├── cipherseed.d.ts ├── cipherseed.js └── mnemonic.js ├── ts_src ├── params.ts ├── mnemonic.spec.ts ├── cipherseed.ts ├── cipherseed.spec.ts └── mnemonic.ts ├── jest.json ├── tsconfig.json ├── LICENSE ├── tslint.json ├── package.json ├── .gitignore └── README.md /src/mnemonic.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare function mnemonicFromBytes(bytes: Buffer): string; 3 | export declare function mnemonicToBytes(mnemonic: string): Buffer; 4 | -------------------------------------------------------------------------------- /src/params.d.ts: -------------------------------------------------------------------------------- 1 | export declare const PARAMS: { 2 | n: number; 3 | r: number; 4 | p: number; 5 | }[]; 6 | export declare const DEFAULT_PASSWORD = "aezeed"; 7 | export declare const CIPHER_SEED_VERSION = 0; 8 | export declare const ONE_DAY: number; 9 | -------------------------------------------------------------------------------- /ts_src/params.ts: -------------------------------------------------------------------------------- 1 | export const PARAMS = [ 2 | { 3 | // version 0 4 | n: 32768, 5 | r: 8, 6 | p: 1, 7 | }, 8 | ]; 9 | export const DEFAULT_PASSWORD = 'aezeed'; 10 | export const CIPHER_SEED_VERSION = 0; 11 | export const ONE_DAY = 24 * 60 * 60 * 1000; 12 | -------------------------------------------------------------------------------- /src/params.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.ONE_DAY = exports.CIPHER_SEED_VERSION = exports.DEFAULT_PASSWORD = exports.PARAMS = void 0; 4 | exports.PARAMS = [ 5 | { 6 | // version 0 7 | n: 32768, 8 | r: 8, 9 | p: 1, 10 | }, 11 | ]; 12 | exports.DEFAULT_PASSWORD = 'aezeed'; 13 | exports.CIPHER_SEED_VERSION = 0; 14 | exports.ONE_DAY = 24 * 60 * 60 * 1000; 15 | -------------------------------------------------------------------------------- /jest.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": [ 3 | "ts", 4 | "js", 5 | "json" 6 | ], 7 | "transform": { 8 | "^.+\\.ts$": "ts-jest" 9 | }, 10 | "testRegex": "/ts_src/.*\\.spec\\.ts$", 11 | "testURL": "http://localhost/", 12 | "coverageThreshold": { 13 | "global": { 14 | "statements": 90, 15 | "branches": 90, 16 | "functions": 90, 17 | "lines": 90 18 | } 19 | }, 20 | "collectCoverageFrom": [ 21 | "ts_src/**/*.ts", 22 | "!**/node_modules/**" 23 | ], 24 | "coverageReporters": [ 25 | "lcov", 26 | "text" 27 | ], 28 | "verbose": true 29 | } 30 | -------------------------------------------------------------------------------- /src/cipherseed.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const daysSinceGenesis: (time: Date) => number; 3 | export declare class CipherSeed { 4 | entropy: Buffer; 5 | salt: Buffer; 6 | internalVersion: number; 7 | birthday: number; 8 | private static decipher; 9 | static fromMnemonic(mnemonic: string, password?: string): CipherSeed; 10 | static random(): CipherSeed; 11 | static changePassword(mnemonic: string, oldPassword: string | null, newPassword: string): string; 12 | constructor(entropy: Buffer, salt: Buffer, internalVersion?: number, birthday?: number); 13 | get birthDate(): Date; 14 | toMnemonic(password?: string, cipherSeedVersion?: number): string; 15 | private encipher; 16 | } 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2015", 4 | "module": "commonjs", 5 | "outDir": "./src", 6 | "declaration": true, 7 | "rootDir": "./ts_src", 8 | "types": [ 9 | "node", 10 | "jest" 11 | ], 12 | "allowJs": false, 13 | "strict": true, 14 | "noImplicitAny": true, 15 | "strictNullChecks": true, 16 | "strictFunctionTypes": true, 17 | "strictBindCallApply": true, 18 | "strictPropertyInitialization": true, 19 | "noImplicitThis": true, 20 | "alwaysStrict": true, 21 | "esModuleInterop": false, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true 24 | }, 25 | "include": [ 26 | "ts_src/**/*.ts" 27 | ], 28 | "exclude": [ 29 | "**/*.spec.ts", 30 | "node_modules/**/*" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 bitcoinjs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "rules": { 5 | "arrow-parens": [true, "ban-single-arg-parens"], 6 | "curly": false, 7 | "indent": [ 8 | true, 9 | "spaces", 10 | 2 11 | ], 12 | "interface-name": [false], 13 | "match-default-export-name": true, 14 | "max-classes-per-file": [false], 15 | "member-access": [true, "no-public"], 16 | "no-bitwise": false, 17 | "no-console": false, 18 | "no-empty": [true, "allow-empty-catch"], 19 | "no-implicit-dependencies": [true, "dev"], 20 | "no-return-await": true, 21 | "no-var-requires": false, 22 | "no-unused-expression": false, 23 | "object-literal-sort-keys": false, 24 | "quotemark": [true, "single", "avoid-escape"], 25 | "typedef": [ 26 | true, 27 | "call-signature", 28 | "arrow-call-signature", 29 | "property-declaration" 30 | ], 31 | "variable-name": [ 32 | true, 33 | "ban-keywords", 34 | "check-format", 35 | "allow-leading-underscore", 36 | "allow-pascal-case" 37 | ] 38 | }, 39 | "rulesDirectory": [] 40 | } 41 | -------------------------------------------------------------------------------- /ts_src/mnemonic.spec.ts: -------------------------------------------------------------------------------- 1 | import { mnemonicFromBytes, mnemonicToBytes } from './mnemonic'; 2 | 3 | const bytes = Buffer.from( 4 | '000a9f416caaa8988c1848a053fc14f6bb815981eea3195b481d4efe3eb8846b3f', 5 | 'hex', 6 | ); 7 | 8 | // This is a valid aezeed v0, a valid BIP39, and a valid Electrum v2 segwit seed 9 | const mnemonic = 10 | 'abandon female space sun pride era corn animal park paper ' + 11 | 'ahead uniform retreat proud amateur stamp bone surge also ' + 12 | 'over token fox balance gun'; 13 | const wrongLength = 14 | 'above judge emerge veteran reform crunch system all ' + 15 | 'snap please shoulder vault hurt city quarter cover enlist ' + 16 | 'swear success suggest drink wagon enrich body body'; 17 | const wrongWord = 18 | 'zzzzz judge emerge veteran reform crunch system all ' + 19 | 'snap please shoulder vault hurt city quarter cover enlist ' + 20 | 'swear success suggest drink wagon enrich body'; 21 | 22 | describe('mnemonic', () => { 23 | it('should convert mnemonic to bytes', () => { 24 | expect(mnemonicToBytes(mnemonic)).toEqual(bytes); 25 | }); 26 | it('should convert bytes to mnemonic', () => { 27 | expect(mnemonicFromBytes(bytes)).toEqual(mnemonic); 28 | }); 29 | it('should fail with wrong word count', () => { 30 | expect(() => { 31 | mnemonicToBytes(wrongLength); 32 | }).toThrow(/^Invalid Mnemonic$/); 33 | }); 34 | it('should fail with unknown word', () => { 35 | expect(() => { 36 | mnemonicToBytes(wrongWord); 37 | }).toThrow(/^Invalid Mnemonic$/); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aezeed", 3 | "version": "0.0.5", 4 | "description": "A package for encoding, decoding, and generating mnemonics of the aezeed specification.", 5 | "main": "src/cipherseed.js", 6 | "types": "src/cipherseed.d.ts", 7 | "files": [ 8 | "src" 9 | ], 10 | "scripts": { 11 | "build": "npm run clean && tsc -p tsconfig.json", 12 | "clean": "rm -rf src", 13 | "coverage": "npm run unit -- --coverage", 14 | "format": "npm run prettier -- --write", 15 | "format:ci": "npm run prettier -- --check", 16 | "gitdiff": "git diff --exit-code", 17 | "gitdiff:ci": "npm run build && npm run gitdiff", 18 | "lint": "tslint -p tsconfig.json -c tslint.json", 19 | "prepublishOnly": "npm run test && npm run gitdiff", 20 | "prettier": "prettier 'ts_src/**/*.ts' --single-quote --trailing-comma=all --ignore-path ./.prettierignore", 21 | "test": "npm run build && npm run format:ci && npm run lint && npm run unit", 22 | "unit": "jest --config=jest.json --runInBand" 23 | }, 24 | "repository": { 25 | "type": "git", 26 | "url": "git+https://github.com/bitcoinjs/aezeed.git" 27 | }, 28 | "keywords": [ 29 | "aezeed", 30 | "bitcoin", 31 | "lightning", 32 | "lnd" 33 | ], 34 | "author": "Jonathan Underwood", 35 | "license": "MIT", 36 | "bugs": { 37 | "url": "https://github.com/bitcoinjs/aezeed/issues" 38 | }, 39 | "homepage": "https://github.com/bitcoinjs/aezeed#readme", 40 | "dependencies": { 41 | "aez": "^1.0.1", 42 | "crc-32": "^1.2.1", 43 | "randombytes": "^2.1.0", 44 | "scryptsy": "^2.1.0" 45 | }, 46 | "devDependencies": { 47 | "@types/jest": "^26.0.10", 48 | "@types/node": "^14.6.0", 49 | "@types/randombytes": "^2.0.0", 50 | "@types/scryptsy": "^2.0.0", 51 | "jest": "^26.4.2", 52 | "prettier": "^2.1.0", 53 | "ts-jest": "^26.2.0", 54 | "tslint": "^6.1.3", 55 | "typescript": "^4.0.2" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aezeed 2 | A package for encoding, decoding, and generating mnemonics of the aezeed specification. (WIP) 3 | 4 | # Example 5 | 6 | * TypeScript types are available as well. commonjs example below. 7 | 8 | ```js 9 | const { CipherSeed } = require('aezeed'); 10 | ``` 11 | 12 | * You can also pass the 16 byte entropy and 5 byte salt as Buffers to the constructor. 13 | * random() uses randombytes under the hood to generate the 21 random bytes needed. 14 | 15 | ```js 16 | // Make a random seed and password protect it. 17 | const mnemonic1 = CipherSeed.random().toMnemonic('strongPassword'); 18 | console.log(mnemonic1); 19 | 20 | // Or no password protection (default password is 'aezeed' when not passed) 21 | const mnemonic2 = CipherSeed.random().toMnemonic(); 22 | console.log(mnemonic2); 23 | ``` 24 | 25 | * You can decode mnemonics as well. 26 | * `birthDate` is a Date object of the approximate day when the wallet was generated. (rounded down to the nearest 18:15:05 UTC (the time-of-day of the timestamp in the Bitcoin genesis block)) 27 | * `birthday` is a number, represents the number of days since the genesis block. 28 | * `entropy` is the 16 bytes needed for generating the root key for the BIP32 HD key. 29 | 30 | ```js 31 | // Decoding to get at the entropy and birthday values with password 32 | const mnemonic3 = 33 | 'able mix price funny host express lawsuit congress antique float pig ' + 34 | 'exchange vapor drip wide cup style apple tumble verb fix blush tongue ' + 35 | 'market'; 36 | const cipherSeed1 = CipherSeed.fromMnemonic(mnemonic3, 'strongPassword'); 37 | console.log(cipherSeed1.entropy); 38 | // 39 | console.log(cipherSeed1.birthDate); 40 | // 41 | 42 | // Without password 43 | const mnemonic4 = 44 | 'able concert slush lend olive cost wagon dawn board robot park snap ' + 45 | 'dignity churn fiction quote shrimp hammer wing jump immune skill sunset ' + 46 | 'west'; 47 | const cipherSeed2 = CipherSeed.fromMnemonic(mnemonic4); 48 | console.log(cipherSeed2.entropy); 49 | // 50 | console.log(cipherSeed2.birthDate); 51 | // 52 | ``` 53 | -------------------------------------------------------------------------------- /src/cipherseed.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.CipherSeed = exports.daysSinceGenesis = void 0; 4 | const scrypt = require("scryptsy"); 5 | const rng = require("randombytes"); 6 | const mn = require("./mnemonic"); 7 | const params_1 = require("./params"); 8 | const aez = require('aez'); 9 | const crc = require('crc-32/crc32c'); 10 | const BITCOIN_GENESIS = new Date('2009-01-03T18:15:05.000Z').getTime(); 11 | exports.daysSinceGenesis = (time) => Math.floor((time.getTime() - BITCOIN_GENESIS) / params_1.ONE_DAY); 12 | class CipherSeed { 13 | constructor(entropy, salt, internalVersion = 0, birthday = exports.daysSinceGenesis(new Date())) { 14 | this.entropy = entropy; 15 | this.salt = salt; 16 | this.internalVersion = internalVersion; 17 | this.birthday = birthday; 18 | if (entropy && entropy.length !== 16) 19 | throw new Error('incorrect entropy length'); 20 | if (salt && salt.length !== 5) 21 | throw new Error('incorrect salt length'); 22 | } 23 | static decipher(cipherBuf, password) { 24 | if (cipherBuf[0] >= params_1.PARAMS.length) { 25 | throw new Error('Invalid cipherSeedVersion'); 26 | } 27 | const cipherSeedVersion = cipherBuf[0]; 28 | const params = params_1.PARAMS[cipherSeedVersion]; 29 | const checksum = Buffer.allocUnsafe(4); 30 | const checksumNum = crc.buf(cipherBuf.slice(0, 29)); 31 | checksum.writeInt32BE(checksumNum); 32 | if (!checksum.equals(cipherBuf.slice(29))) { 33 | throw new Error('CRC checksum mismatch'); 34 | } 35 | const salt = cipherBuf.slice(24, 29); 36 | const key = scrypt(Buffer.from(password, 'utf8'), salt, params.n, params.r, params.p, 32); 37 | const adBytes = Buffer.allocUnsafe(6); 38 | adBytes.writeUInt8(cipherSeedVersion, 0); 39 | salt.copy(adBytes, 1); 40 | const plainText = aez.decrypt(key, null, [adBytes], 4, cipherBuf.slice(1, 24)); 41 | if (plainText === null) 42 | throw new Error('Invalid Password'); 43 | return new CipherSeed(plainText.slice(3, 19), salt, plainText[0], plainText.readUInt16BE(1)); 44 | } 45 | static fromMnemonic(mnemonic, password = params_1.DEFAULT_PASSWORD) { 46 | const bytes = mn.mnemonicToBytes(mnemonic); 47 | return CipherSeed.decipher(bytes, password); 48 | } 49 | static random() { 50 | return new CipherSeed(rng(16), rng(5)); 51 | } 52 | static changePassword(mnemonic, oldPassword, newPassword) { 53 | const pwd = oldPassword === null ? params_1.DEFAULT_PASSWORD : oldPassword; 54 | const cs = CipherSeed.fromMnemonic(mnemonic, pwd); 55 | return cs.toMnemonic(newPassword); 56 | } 57 | get birthDate() { 58 | return new Date(BITCOIN_GENESIS + this.birthday * params_1.ONE_DAY); 59 | } 60 | toMnemonic(password = params_1.DEFAULT_PASSWORD, cipherSeedVersion = params_1.CIPHER_SEED_VERSION) { 61 | return mn.mnemonicFromBytes(this.encipher(password, cipherSeedVersion)); 62 | } 63 | encipher(password, cipherSeedVersion) { 64 | const pwBuf = Buffer.from(password, 'utf8'); 65 | const params = params_1.PARAMS[cipherSeedVersion]; 66 | const key = scrypt(pwBuf, this.salt, params.n, params.r, params.p, 32); 67 | const seedBytes = Buffer.allocUnsafe(19); 68 | seedBytes.writeUInt8(this.internalVersion, 0); 69 | seedBytes.writeUInt16BE(this.birthday, 1); 70 | this.entropy.copy(seedBytes, 3); 71 | const adBytes = Buffer.allocUnsafe(6); 72 | adBytes.writeUInt8(cipherSeedVersion, 0); 73 | this.salt.copy(adBytes, 1); 74 | const cipherText = aez.encrypt(key, null, [adBytes], 4, seedBytes); 75 | const cipherSeedBytes = Buffer.allocUnsafe(33); 76 | cipherSeedBytes.writeUInt8(cipherSeedVersion, 0); 77 | cipherText.copy(cipherSeedBytes, 1); 78 | this.salt.copy(cipherSeedBytes, 24); 79 | const checksumNum = crc.buf(cipherSeedBytes.slice(0, 29)); 80 | cipherSeedBytes.writeInt32BE(checksumNum, 29); 81 | return cipherSeedBytes; 82 | } 83 | } 84 | exports.CipherSeed = CipherSeed; 85 | -------------------------------------------------------------------------------- /ts_src/cipherseed.ts: -------------------------------------------------------------------------------- 1 | import * as scrypt from 'scryptsy'; 2 | import * as rng from 'randombytes'; 3 | import * as mn from './mnemonic'; 4 | import { 5 | PARAMS, 6 | DEFAULT_PASSWORD, 7 | ONE_DAY, 8 | CIPHER_SEED_VERSION, 9 | } from './params'; 10 | const aez = require('aez'); 11 | const crc = require('crc-32/crc32c'); 12 | 13 | const BITCOIN_GENESIS = new Date('2009-01-03T18:15:05.000Z').getTime(); 14 | export const daysSinceGenesis = (time: Date): number => 15 | Math.floor((time.getTime() - BITCOIN_GENESIS) / ONE_DAY); 16 | 17 | export class CipherSeed { 18 | private static decipher(cipherBuf: Buffer, password: string): CipherSeed { 19 | if (cipherBuf[0] >= PARAMS.length) { 20 | throw new Error('Invalid cipherSeedVersion'); 21 | } 22 | const cipherSeedVersion = cipherBuf[0]; 23 | const params = PARAMS[cipherSeedVersion]; 24 | 25 | const checksum = Buffer.allocUnsafe(4); 26 | const checksumNum = crc.buf(cipherBuf.slice(0, 29)); 27 | checksum.writeInt32BE(checksumNum); 28 | if (!checksum.equals(cipherBuf.slice(29))) { 29 | throw new Error('CRC checksum mismatch'); 30 | } 31 | const salt = cipherBuf.slice(24, 29); 32 | const key = scrypt( 33 | Buffer.from(password, 'utf8'), 34 | salt, 35 | params.n, 36 | params.r, 37 | params.p, 38 | 32, 39 | ); 40 | 41 | const adBytes = Buffer.allocUnsafe(6); 42 | adBytes.writeUInt8(cipherSeedVersion, 0); 43 | salt.copy(adBytes, 1); 44 | 45 | const plainText: Buffer | null = aez.decrypt( 46 | key, 47 | null, 48 | [adBytes], 49 | 4, 50 | cipherBuf.slice(1, 24), 51 | ); 52 | if (plainText === null) throw new Error('Invalid Password'); 53 | 54 | return new CipherSeed( 55 | plainText.slice(3, 19), 56 | salt, 57 | plainText[0], 58 | plainText.readUInt16BE(1), 59 | ); 60 | } 61 | 62 | static fromMnemonic( 63 | mnemonic: string, 64 | password: string = DEFAULT_PASSWORD, 65 | ): CipherSeed { 66 | const bytes = mn.mnemonicToBytes(mnemonic); 67 | return CipherSeed.decipher(bytes, password); 68 | } 69 | 70 | static random(): CipherSeed { 71 | return new CipherSeed(rng(16), rng(5)); 72 | } 73 | 74 | static changePassword( 75 | mnemonic: string, 76 | oldPassword: string | null, 77 | newPassword: string, 78 | ): string { 79 | const pwd = oldPassword === null ? DEFAULT_PASSWORD : oldPassword; 80 | const cs = CipherSeed.fromMnemonic(mnemonic, pwd); 81 | return cs.toMnemonic(newPassword); 82 | } 83 | 84 | constructor( 85 | public entropy: Buffer, 86 | public salt: Buffer, 87 | public internalVersion: number = 0, 88 | public birthday: number = daysSinceGenesis(new Date()), 89 | ) { 90 | if (entropy && entropy.length !== 16) 91 | throw new Error('incorrect entropy length'); 92 | if (salt && salt.length !== 5) throw new Error('incorrect salt length'); 93 | } 94 | 95 | get birthDate(): Date { 96 | return new Date(BITCOIN_GENESIS + this.birthday * ONE_DAY); 97 | } 98 | 99 | toMnemonic( 100 | password: string = DEFAULT_PASSWORD, 101 | cipherSeedVersion: number = CIPHER_SEED_VERSION, 102 | ): string { 103 | return mn.mnemonicFromBytes(this.encipher(password, cipherSeedVersion)); 104 | } 105 | 106 | private encipher(password: string, cipherSeedVersion: number): Buffer { 107 | const pwBuf = Buffer.from(password, 'utf8'); 108 | const params = PARAMS[cipherSeedVersion]; 109 | const key = scrypt(pwBuf, this.salt, params.n, params.r, params.p, 32); 110 | 111 | const seedBytes = Buffer.allocUnsafe(19); 112 | seedBytes.writeUInt8(this.internalVersion, 0); 113 | seedBytes.writeUInt16BE(this.birthday, 1); 114 | this.entropy.copy(seedBytes, 3); 115 | 116 | const adBytes = Buffer.allocUnsafe(6); 117 | adBytes.writeUInt8(cipherSeedVersion, 0); 118 | this.salt.copy(adBytes, 1); 119 | 120 | const cipherText = aez.encrypt(key, null, [adBytes], 4, seedBytes); 121 | 122 | const cipherSeedBytes = Buffer.allocUnsafe(33); 123 | cipherSeedBytes.writeUInt8(cipherSeedVersion, 0); 124 | cipherText.copy(cipherSeedBytes, 1); 125 | this.salt.copy(cipherSeedBytes, 24); 126 | 127 | const checksumNum = crc.buf(cipherSeedBytes.slice(0, 29)); 128 | cipherSeedBytes.writeInt32BE(checksumNum, 29); 129 | 130 | return cipherSeedBytes; 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /ts_src/cipherseed.spec.ts: -------------------------------------------------------------------------------- 1 | import { mocked } from 'ts-jest/utils'; 2 | import * as params from './params'; 3 | import { CipherSeed, daysSinceGenesis } from './cipherseed'; 4 | let lndVersion0TestVectors: Vector[]; 5 | let extraVersion0TestVectors: Vector[]; 6 | 7 | describe('CipherSeed', () => { 8 | // This is used for running the various vectors 9 | const runVector = (vector: Vector): void => { 10 | const birthday = daysSinceGenesis(vector.time); 11 | expect(birthday).toBe(vector.expectedBirthday); 12 | const seed = new CipherSeed( 13 | vector.entropy, 14 | vector.salt, 15 | vector.version, 16 | birthday, 17 | ); 18 | const mnemonic = seed.toMnemonic(vector.password); 19 | expect(mnemonic).toBe(vector.expectedMnemonic); 20 | }; 21 | 22 | // Actually run each vector 23 | it('should pass lnd vectors', () => { 24 | lndVersion0TestVectors.forEach(runVector); 25 | }); 26 | it('should pass extra vectors', () => { 27 | extraVersion0TestVectors.forEach(runVector); 28 | }); 29 | 30 | it('should decode from mnemonic', () => { 31 | const cSeed = CipherSeed.fromMnemonic(mnemonic); 32 | expect(cSeed).toEqual(CSEED); 33 | }); 34 | it('should encode to the same mnemonic', () => { 35 | const newMnemonic = CSEED.toMnemonic(); 36 | expect(newMnemonic).toEqual(mnemonic); 37 | }); 38 | it('should get birthDate', () => { 39 | expect(CSEED.birthDate).toEqual(new Date('2009-01-03T18:15:05.000Z')); 40 | }); 41 | it('should allow changing password', () => { 42 | const newMnemonic = CipherSeed.changePassword(mnemonic, null, 'notDefault'); 43 | const sameMnemonic = CipherSeed.changePassword( 44 | newMnemonic, 45 | 'notDefault', 46 | 'aezeed', 47 | ); 48 | expect(newMnemonic).toEqual( 49 | 'abandon ski rough double differ easy match patient dynamic ' + 50 | 'engage crystal artefact attract puppy slam abstract outer ' + 51 | 'item response grow obscure amount vivid vessel', 52 | ); 53 | expect(sameMnemonic).toEqual(mnemonic); 54 | }); 55 | it('should encode and decode with password', () => { 56 | const seed = CipherSeed.random(); 57 | const mnemonic = seed.toMnemonic('strongPw'); 58 | const seed2 = CipherSeed.fromMnemonic(mnemonic, 'strongPw'); 59 | expect(seed2).toEqual(seed); 60 | }); 61 | it('should generate a random mnemonic', () => { 62 | expect(CipherSeed.random()).toBeTruthy(); 63 | }); 64 | it('should fail on incorrect checksum', () => { 65 | expect(() => { 66 | CipherSeed.fromMnemonic(wrongChecksum); 67 | }).toThrow(/^CRC checksum mismatch$/); 68 | }); 69 | it('should fail on incorrect version', () => { 70 | expect(() => { 71 | CipherSeed.fromMnemonic(wrongVersion); 72 | }).toThrow(/^Invalid cipherSeedVersion$/); 73 | }); 74 | it('should fail on incorrect password', () => { 75 | expect(() => { 76 | CipherSeed.fromMnemonic(mnemonic, 'wrong'); 77 | }).toThrow(/^Invalid Password$/); 78 | }); 79 | it('should fail on incorrect entropy length', () => { 80 | expect(() => { 81 | new CipherSeed(Buffer.from([1, 2, 3]), Buffer.from([1, 2, 3, 4, 5])); 82 | }).toThrow(/^incorrect entropy length$/); 83 | }); 84 | it('should fail on incorrect salt length', () => { 85 | expect(() => { 86 | new CipherSeed( 87 | Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), 88 | Buffer.from([1, 2, 3]), 89 | ); 90 | }).toThrow(/^incorrect salt length$/); 91 | }); 92 | }); 93 | 94 | // Mock the PARAMS to make them weaking, testing is faster. 95 | // These mock params match LND (so we can test against their vectors) 96 | jest.mock('./params'); 97 | const mockedParams = mocked(params, true); 98 | mockedParams.PARAMS[0] = { 99 | n: 16, 100 | r: 8, 101 | p: 1, 102 | }; 103 | 104 | const entropy = Buffer.from('dadeb38984dadeb38984dadeb3898442', 'hex'); 105 | const CSEED = new CipherSeed(entropy, Buffer.from('dadeb38984', 'hex'), 0, 0); 106 | const mnemonic = 107 | 'abandon razor cage merit again upon sort only grace brother ' + 108 | 'dinosaur reform path poverty despair detail tattoo bitter ' + 109 | 'response grow obscure broccoli dirt swallow'; 110 | 111 | const wrongChecksum = 112 | 'above judge emerge veteran reform crunch system all ' + 113 | 'snap please shoulder vault hurt city quarter cover enlist ' + 114 | 'swear success suggest drink wagon enrich boil'; 115 | const wrongVersion = 116 | 'airport judge emerge veteran reform crunch system all ' + 117 | 'snap please shoulder vault hurt city quarter cover enlist ' + 118 | 'swear success suggest drink wagon enrich body'; 119 | 120 | // From LND repository 121 | // ./aezeed/cipherseed_test.go#L23-L63 122 | // at commit 63bd8e77760f77650e854e69cff5b8a4acc18862 123 | 124 | const testEntropy = Buffer.from('81b637d86359e6960de795e41e0b4cfd', 'hex'); 125 | const testSalt = Buffer.from([0x73, 0x61, 0x6c, 0x74, 0x31]); 126 | const BitcoinGenesisDate = new Date('2009-01-03T18:15:05.000Z'); 127 | lndVersion0TestVectors = [ 128 | { 129 | version: 0, 130 | time: BitcoinGenesisDate, 131 | entropy: testEntropy, 132 | salt: testSalt, 133 | password: undefined, 134 | expectedMnemonic: 135 | 'ability liquid travel stem barely drastic pact cupboard apple thrive ' + 136 | 'morning oak feature tissue couch old math inform success suggest drink ' + 137 | 'motion know royal', 138 | expectedBirthday: 0, 139 | }, 140 | { 141 | version: 0, 142 | time: new Date(1521799345000), // 03/23/2018 @ 10:02am (UTC) 143 | entropy: testEntropy, 144 | salt: testSalt, 145 | password: '!very_safe_55345_password*', 146 | expectedMnemonic: 147 | 'able tree stool crush transfer cloud cross three profit outside hen ' + 148 | 'citizen plate ride require leg siren drum success suggest drink ' + 149 | 'require fiscal upgrade', 150 | expectedBirthday: 3365, 151 | }, 152 | ]; 153 | 154 | extraVersion0TestVectors = [ 155 | { 156 | version: 0, 157 | time: new Date(4062184705000), // 09/22/2098 @ 12:38:25am (UTC) 158 | entropy: testEntropy, 159 | salt: testSalt, 160 | password: 'LsD58g1jZH3dKsSpdaVa6J9Lxd', 161 | expectedMnemonic: 162 | 'abandon spare anxiety dry resemble hub false behind bachelor van ' + 163 | 'express chunk belt flat flash junior moon fatal success suggest ' + 164 | 'drink share document thrive', 165 | expectedBirthday: 0x8000, // 0x8000 to make sure we handle unsigned properly 166 | }, 167 | ]; 168 | 169 | interface Vector { 170 | version: number; 171 | time: Date; 172 | entropy: Buffer; 173 | salt: Buffer; 174 | password?: string; 175 | expectedMnemonic: string; 176 | expectedBirthday: number; 177 | } 178 | -------------------------------------------------------------------------------- /ts_src/mnemonic.ts: -------------------------------------------------------------------------------- 1 | export function mnemonicFromBytes(bytes: Buffer): string { 2 | const bits = bytesToBinary(Array.from(bytes)); 3 | 4 | const chunks = bits.match(/(.{1,11})/g)!; 5 | const words = chunks.map((binary: string): string => { 6 | const index = binaryToByte(binary); 7 | return WORDLIST[index]; 8 | }); 9 | 10 | return words.join(' '); 11 | } 12 | 13 | export function mnemonicToBytes(mnemonic: string): Buffer { 14 | const INVALID = 'Invalid Mnemonic'; 15 | const words = mnemonic.split(' '); 16 | if (words.length !== 24) throw new Error(INVALID); 17 | const bits = words 18 | .map((word: string): string => { 19 | const index = WORDLIST.indexOf(word); 20 | if (index === -1) throw new Error(INVALID); 21 | 22 | return lpad(index.toString(2), '0', 11); 23 | }) 24 | .join(''); 25 | const entropyBytes = bits.match(/(.{8})/g)!.map(binaryToByte); 26 | return Buffer.from(entropyBytes); 27 | } 28 | 29 | function bytesToBinary(bytes: number[]): string { 30 | return bytes.map((x: number): string => lpad(x.toString(2), '0', 8)).join(''); 31 | } 32 | 33 | function binaryToByte(bin: string): number { 34 | return parseInt(bin, 2); 35 | } 36 | 37 | function lpad(str: string, padString: string, length: number): string { 38 | while (str.length < length) str = padString + str; 39 | return str; 40 | } 41 | 42 | const WORDLIST = [ 43 | 'abandon', 44 | 'ability', 45 | 'able', 46 | 'about', 47 | 'above', 48 | 'absent', 49 | 'absorb', 50 | 'abstract', 51 | 'absurd', 52 | 'abuse', 53 | 'access', 54 | 'accident', 55 | 'account', 56 | 'accuse', 57 | 'achieve', 58 | 'acid', 59 | 'acoustic', 60 | 'acquire', 61 | 'across', 62 | 'act', 63 | 'action', 64 | 'actor', 65 | 'actress', 66 | 'actual', 67 | 'adapt', 68 | 'add', 69 | 'addict', 70 | 'address', 71 | 'adjust', 72 | 'admit', 73 | 'adult', 74 | 'advance', 75 | 'advice', 76 | 'aerobic', 77 | 'affair', 78 | 'afford', 79 | 'afraid', 80 | 'again', 81 | 'age', 82 | 'agent', 83 | 'agree', 84 | 'ahead', 85 | 'aim', 86 | 'air', 87 | 'airport', 88 | 'aisle', 89 | 'alarm', 90 | 'album', 91 | 'alcohol', 92 | 'alert', 93 | 'alien', 94 | 'all', 95 | 'alley', 96 | 'allow', 97 | 'almost', 98 | 'alone', 99 | 'alpha', 100 | 'already', 101 | 'also', 102 | 'alter', 103 | 'always', 104 | 'amateur', 105 | 'amazing', 106 | 'among', 107 | 'amount', 108 | 'amused', 109 | 'analyst', 110 | 'anchor', 111 | 'ancient', 112 | 'anger', 113 | 'angle', 114 | 'angry', 115 | 'animal', 116 | 'ankle', 117 | 'announce', 118 | 'annual', 119 | 'another', 120 | 'answer', 121 | 'antenna', 122 | 'antique', 123 | 'anxiety', 124 | 'any', 125 | 'apart', 126 | 'apology', 127 | 'appear', 128 | 'apple', 129 | 'approve', 130 | 'april', 131 | 'arch', 132 | 'arctic', 133 | 'area', 134 | 'arena', 135 | 'argue', 136 | 'arm', 137 | 'armed', 138 | 'armor', 139 | 'army', 140 | 'around', 141 | 'arrange', 142 | 'arrest', 143 | 'arrive', 144 | 'arrow', 145 | 'art', 146 | 'artefact', 147 | 'artist', 148 | 'artwork', 149 | 'ask', 150 | 'aspect', 151 | 'assault', 152 | 'asset', 153 | 'assist', 154 | 'assume', 155 | 'asthma', 156 | 'athlete', 157 | 'atom', 158 | 'attack', 159 | 'attend', 160 | 'attitude', 161 | 'attract', 162 | 'auction', 163 | 'audit', 164 | 'august', 165 | 'aunt', 166 | 'author', 167 | 'auto', 168 | 'autumn', 169 | 'average', 170 | 'avocado', 171 | 'avoid', 172 | 'awake', 173 | 'aware', 174 | 'away', 175 | 'awesome', 176 | 'awful', 177 | 'awkward', 178 | 'axis', 179 | 'baby', 180 | 'bachelor', 181 | 'bacon', 182 | 'badge', 183 | 'bag', 184 | 'balance', 185 | 'balcony', 186 | 'ball', 187 | 'bamboo', 188 | 'banana', 189 | 'banner', 190 | 'bar', 191 | 'barely', 192 | 'bargain', 193 | 'barrel', 194 | 'base', 195 | 'basic', 196 | 'basket', 197 | 'battle', 198 | 'beach', 199 | 'bean', 200 | 'beauty', 201 | 'because', 202 | 'become', 203 | 'beef', 204 | 'before', 205 | 'begin', 206 | 'behave', 207 | 'behind', 208 | 'believe', 209 | 'below', 210 | 'belt', 211 | 'bench', 212 | 'benefit', 213 | 'best', 214 | 'betray', 215 | 'better', 216 | 'between', 217 | 'beyond', 218 | 'bicycle', 219 | 'bid', 220 | 'bike', 221 | 'bind', 222 | 'biology', 223 | 'bird', 224 | 'birth', 225 | 'bitter', 226 | 'black', 227 | 'blade', 228 | 'blame', 229 | 'blanket', 230 | 'blast', 231 | 'bleak', 232 | 'bless', 233 | 'blind', 234 | 'blood', 235 | 'blossom', 236 | 'blouse', 237 | 'blue', 238 | 'blur', 239 | 'blush', 240 | 'board', 241 | 'boat', 242 | 'body', 243 | 'boil', 244 | 'bomb', 245 | 'bone', 246 | 'bonus', 247 | 'book', 248 | 'boost', 249 | 'border', 250 | 'boring', 251 | 'borrow', 252 | 'boss', 253 | 'bottom', 254 | 'bounce', 255 | 'box', 256 | 'boy', 257 | 'bracket', 258 | 'brain', 259 | 'brand', 260 | 'brass', 261 | 'brave', 262 | 'bread', 263 | 'breeze', 264 | 'brick', 265 | 'bridge', 266 | 'brief', 267 | 'bright', 268 | 'bring', 269 | 'brisk', 270 | 'broccoli', 271 | 'broken', 272 | 'bronze', 273 | 'broom', 274 | 'brother', 275 | 'brown', 276 | 'brush', 277 | 'bubble', 278 | 'buddy', 279 | 'budget', 280 | 'buffalo', 281 | 'build', 282 | 'bulb', 283 | 'bulk', 284 | 'bullet', 285 | 'bundle', 286 | 'bunker', 287 | 'burden', 288 | 'burger', 289 | 'burst', 290 | 'bus', 291 | 'business', 292 | 'busy', 293 | 'butter', 294 | 'buyer', 295 | 'buzz', 296 | 'cabbage', 297 | 'cabin', 298 | 'cable', 299 | 'cactus', 300 | 'cage', 301 | 'cake', 302 | 'call', 303 | 'calm', 304 | 'camera', 305 | 'camp', 306 | 'can', 307 | 'canal', 308 | 'cancel', 309 | 'candy', 310 | 'cannon', 311 | 'canoe', 312 | 'canvas', 313 | 'canyon', 314 | 'capable', 315 | 'capital', 316 | 'captain', 317 | 'car', 318 | 'carbon', 319 | 'card', 320 | 'cargo', 321 | 'carpet', 322 | 'carry', 323 | 'cart', 324 | 'case', 325 | 'cash', 326 | 'casino', 327 | 'castle', 328 | 'casual', 329 | 'cat', 330 | 'catalog', 331 | 'catch', 332 | 'category', 333 | 'cattle', 334 | 'caught', 335 | 'cause', 336 | 'caution', 337 | 'cave', 338 | 'ceiling', 339 | 'celery', 340 | 'cement', 341 | 'census', 342 | 'century', 343 | 'cereal', 344 | 'certain', 345 | 'chair', 346 | 'chalk', 347 | 'champion', 348 | 'change', 349 | 'chaos', 350 | 'chapter', 351 | 'charge', 352 | 'chase', 353 | 'chat', 354 | 'cheap', 355 | 'check', 356 | 'cheese', 357 | 'chef', 358 | 'cherry', 359 | 'chest', 360 | 'chicken', 361 | 'chief', 362 | 'child', 363 | 'chimney', 364 | 'choice', 365 | 'choose', 366 | 'chronic', 367 | 'chuckle', 368 | 'chunk', 369 | 'churn', 370 | 'cigar', 371 | 'cinnamon', 372 | 'circle', 373 | 'citizen', 374 | 'city', 375 | 'civil', 376 | 'claim', 377 | 'clap', 378 | 'clarify', 379 | 'claw', 380 | 'clay', 381 | 'clean', 382 | 'clerk', 383 | 'clever', 384 | 'click', 385 | 'client', 386 | 'cliff', 387 | 'climb', 388 | 'clinic', 389 | 'clip', 390 | 'clock', 391 | 'clog', 392 | 'close', 393 | 'cloth', 394 | 'cloud', 395 | 'clown', 396 | 'club', 397 | 'clump', 398 | 'cluster', 399 | 'clutch', 400 | 'coach', 401 | 'coast', 402 | 'coconut', 403 | 'code', 404 | 'coffee', 405 | 'coil', 406 | 'coin', 407 | 'collect', 408 | 'color', 409 | 'column', 410 | 'combine', 411 | 'come', 412 | 'comfort', 413 | 'comic', 414 | 'common', 415 | 'company', 416 | 'concert', 417 | 'conduct', 418 | 'confirm', 419 | 'congress', 420 | 'connect', 421 | 'consider', 422 | 'control', 423 | 'convince', 424 | 'cook', 425 | 'cool', 426 | 'copper', 427 | 'copy', 428 | 'coral', 429 | 'core', 430 | 'corn', 431 | 'correct', 432 | 'cost', 433 | 'cotton', 434 | 'couch', 435 | 'country', 436 | 'couple', 437 | 'course', 438 | 'cousin', 439 | 'cover', 440 | 'coyote', 441 | 'crack', 442 | 'cradle', 443 | 'craft', 444 | 'cram', 445 | 'crane', 446 | 'crash', 447 | 'crater', 448 | 'crawl', 449 | 'crazy', 450 | 'cream', 451 | 'credit', 452 | 'creek', 453 | 'crew', 454 | 'cricket', 455 | 'crime', 456 | 'crisp', 457 | 'critic', 458 | 'crop', 459 | 'cross', 460 | 'crouch', 461 | 'crowd', 462 | 'crucial', 463 | 'cruel', 464 | 'cruise', 465 | 'crumble', 466 | 'crunch', 467 | 'crush', 468 | 'cry', 469 | 'crystal', 470 | 'cube', 471 | 'culture', 472 | 'cup', 473 | 'cupboard', 474 | 'curious', 475 | 'current', 476 | 'curtain', 477 | 'curve', 478 | 'cushion', 479 | 'custom', 480 | 'cute', 481 | 'cycle', 482 | 'dad', 483 | 'damage', 484 | 'damp', 485 | 'dance', 486 | 'danger', 487 | 'daring', 488 | 'dash', 489 | 'daughter', 490 | 'dawn', 491 | 'day', 492 | 'deal', 493 | 'debate', 494 | 'debris', 495 | 'decade', 496 | 'december', 497 | 'decide', 498 | 'decline', 499 | 'decorate', 500 | 'decrease', 501 | 'deer', 502 | 'defense', 503 | 'define', 504 | 'defy', 505 | 'degree', 506 | 'delay', 507 | 'deliver', 508 | 'demand', 509 | 'demise', 510 | 'denial', 511 | 'dentist', 512 | 'deny', 513 | 'depart', 514 | 'depend', 515 | 'deposit', 516 | 'depth', 517 | 'deputy', 518 | 'derive', 519 | 'describe', 520 | 'desert', 521 | 'design', 522 | 'desk', 523 | 'despair', 524 | 'destroy', 525 | 'detail', 526 | 'detect', 527 | 'develop', 528 | 'device', 529 | 'devote', 530 | 'diagram', 531 | 'dial', 532 | 'diamond', 533 | 'diary', 534 | 'dice', 535 | 'diesel', 536 | 'diet', 537 | 'differ', 538 | 'digital', 539 | 'dignity', 540 | 'dilemma', 541 | 'dinner', 542 | 'dinosaur', 543 | 'direct', 544 | 'dirt', 545 | 'disagree', 546 | 'discover', 547 | 'disease', 548 | 'dish', 549 | 'dismiss', 550 | 'disorder', 551 | 'display', 552 | 'distance', 553 | 'divert', 554 | 'divide', 555 | 'divorce', 556 | 'dizzy', 557 | 'doctor', 558 | 'document', 559 | 'dog', 560 | 'doll', 561 | 'dolphin', 562 | 'domain', 563 | 'donate', 564 | 'donkey', 565 | 'donor', 566 | 'door', 567 | 'dose', 568 | 'double', 569 | 'dove', 570 | 'draft', 571 | 'dragon', 572 | 'drama', 573 | 'drastic', 574 | 'draw', 575 | 'dream', 576 | 'dress', 577 | 'drift', 578 | 'drill', 579 | 'drink', 580 | 'drip', 581 | 'drive', 582 | 'drop', 583 | 'drum', 584 | 'dry', 585 | 'duck', 586 | 'dumb', 587 | 'dune', 588 | 'during', 589 | 'dust', 590 | 'dutch', 591 | 'duty', 592 | 'dwarf', 593 | 'dynamic', 594 | 'eager', 595 | 'eagle', 596 | 'early', 597 | 'earn', 598 | 'earth', 599 | 'easily', 600 | 'east', 601 | 'easy', 602 | 'echo', 603 | 'ecology', 604 | 'economy', 605 | 'edge', 606 | 'edit', 607 | 'educate', 608 | 'effort', 609 | 'egg', 610 | 'eight', 611 | 'either', 612 | 'elbow', 613 | 'elder', 614 | 'electric', 615 | 'elegant', 616 | 'element', 617 | 'elephant', 618 | 'elevator', 619 | 'elite', 620 | 'else', 621 | 'embark', 622 | 'embody', 623 | 'embrace', 624 | 'emerge', 625 | 'emotion', 626 | 'employ', 627 | 'empower', 628 | 'empty', 629 | 'enable', 630 | 'enact', 631 | 'end', 632 | 'endless', 633 | 'endorse', 634 | 'enemy', 635 | 'energy', 636 | 'enforce', 637 | 'engage', 638 | 'engine', 639 | 'enhance', 640 | 'enjoy', 641 | 'enlist', 642 | 'enough', 643 | 'enrich', 644 | 'enroll', 645 | 'ensure', 646 | 'enter', 647 | 'entire', 648 | 'entry', 649 | 'envelope', 650 | 'episode', 651 | 'equal', 652 | 'equip', 653 | 'era', 654 | 'erase', 655 | 'erode', 656 | 'erosion', 657 | 'error', 658 | 'erupt', 659 | 'escape', 660 | 'essay', 661 | 'essence', 662 | 'estate', 663 | 'eternal', 664 | 'ethics', 665 | 'evidence', 666 | 'evil', 667 | 'evoke', 668 | 'evolve', 669 | 'exact', 670 | 'example', 671 | 'excess', 672 | 'exchange', 673 | 'excite', 674 | 'exclude', 675 | 'excuse', 676 | 'execute', 677 | 'exercise', 678 | 'exhaust', 679 | 'exhibit', 680 | 'exile', 681 | 'exist', 682 | 'exit', 683 | 'exotic', 684 | 'expand', 685 | 'expect', 686 | 'expire', 687 | 'explain', 688 | 'expose', 689 | 'express', 690 | 'extend', 691 | 'extra', 692 | 'eye', 693 | 'eyebrow', 694 | 'fabric', 695 | 'face', 696 | 'faculty', 697 | 'fade', 698 | 'faint', 699 | 'faith', 700 | 'fall', 701 | 'false', 702 | 'fame', 703 | 'family', 704 | 'famous', 705 | 'fan', 706 | 'fancy', 707 | 'fantasy', 708 | 'farm', 709 | 'fashion', 710 | 'fat', 711 | 'fatal', 712 | 'father', 713 | 'fatigue', 714 | 'fault', 715 | 'favorite', 716 | 'feature', 717 | 'february', 718 | 'federal', 719 | 'fee', 720 | 'feed', 721 | 'feel', 722 | 'female', 723 | 'fence', 724 | 'festival', 725 | 'fetch', 726 | 'fever', 727 | 'few', 728 | 'fiber', 729 | 'fiction', 730 | 'field', 731 | 'figure', 732 | 'file', 733 | 'film', 734 | 'filter', 735 | 'final', 736 | 'find', 737 | 'fine', 738 | 'finger', 739 | 'finish', 740 | 'fire', 741 | 'firm', 742 | 'first', 743 | 'fiscal', 744 | 'fish', 745 | 'fit', 746 | 'fitness', 747 | 'fix', 748 | 'flag', 749 | 'flame', 750 | 'flash', 751 | 'flat', 752 | 'flavor', 753 | 'flee', 754 | 'flight', 755 | 'flip', 756 | 'float', 757 | 'flock', 758 | 'floor', 759 | 'flower', 760 | 'fluid', 761 | 'flush', 762 | 'fly', 763 | 'foam', 764 | 'focus', 765 | 'fog', 766 | 'foil', 767 | 'fold', 768 | 'follow', 769 | 'food', 770 | 'foot', 771 | 'force', 772 | 'forest', 773 | 'forget', 774 | 'fork', 775 | 'fortune', 776 | 'forum', 777 | 'forward', 778 | 'fossil', 779 | 'foster', 780 | 'found', 781 | 'fox', 782 | 'fragile', 783 | 'frame', 784 | 'frequent', 785 | 'fresh', 786 | 'friend', 787 | 'fringe', 788 | 'frog', 789 | 'front', 790 | 'frost', 791 | 'frown', 792 | 'frozen', 793 | 'fruit', 794 | 'fuel', 795 | 'fun', 796 | 'funny', 797 | 'furnace', 798 | 'fury', 799 | 'future', 800 | 'gadget', 801 | 'gain', 802 | 'galaxy', 803 | 'gallery', 804 | 'game', 805 | 'gap', 806 | 'garage', 807 | 'garbage', 808 | 'garden', 809 | 'garlic', 810 | 'garment', 811 | 'gas', 812 | 'gasp', 813 | 'gate', 814 | 'gather', 815 | 'gauge', 816 | 'gaze', 817 | 'general', 818 | 'genius', 819 | 'genre', 820 | 'gentle', 821 | 'genuine', 822 | 'gesture', 823 | 'ghost', 824 | 'giant', 825 | 'gift', 826 | 'giggle', 827 | 'ginger', 828 | 'giraffe', 829 | 'girl', 830 | 'give', 831 | 'glad', 832 | 'glance', 833 | 'glare', 834 | 'glass', 835 | 'glide', 836 | 'glimpse', 837 | 'globe', 838 | 'gloom', 839 | 'glory', 840 | 'glove', 841 | 'glow', 842 | 'glue', 843 | 'goat', 844 | 'goddess', 845 | 'gold', 846 | 'good', 847 | 'goose', 848 | 'gorilla', 849 | 'gospel', 850 | 'gossip', 851 | 'govern', 852 | 'gown', 853 | 'grab', 854 | 'grace', 855 | 'grain', 856 | 'grant', 857 | 'grape', 858 | 'grass', 859 | 'gravity', 860 | 'great', 861 | 'green', 862 | 'grid', 863 | 'grief', 864 | 'grit', 865 | 'grocery', 866 | 'group', 867 | 'grow', 868 | 'grunt', 869 | 'guard', 870 | 'guess', 871 | 'guide', 872 | 'guilt', 873 | 'guitar', 874 | 'gun', 875 | 'gym', 876 | 'habit', 877 | 'hair', 878 | 'half', 879 | 'hammer', 880 | 'hamster', 881 | 'hand', 882 | 'happy', 883 | 'harbor', 884 | 'hard', 885 | 'harsh', 886 | 'harvest', 887 | 'hat', 888 | 'have', 889 | 'hawk', 890 | 'hazard', 891 | 'head', 892 | 'health', 893 | 'heart', 894 | 'heavy', 895 | 'hedgehog', 896 | 'height', 897 | 'hello', 898 | 'helmet', 899 | 'help', 900 | 'hen', 901 | 'hero', 902 | 'hidden', 903 | 'high', 904 | 'hill', 905 | 'hint', 906 | 'hip', 907 | 'hire', 908 | 'history', 909 | 'hobby', 910 | 'hockey', 911 | 'hold', 912 | 'hole', 913 | 'holiday', 914 | 'hollow', 915 | 'home', 916 | 'honey', 917 | 'hood', 918 | 'hope', 919 | 'horn', 920 | 'horror', 921 | 'horse', 922 | 'hospital', 923 | 'host', 924 | 'hotel', 925 | 'hour', 926 | 'hover', 927 | 'hub', 928 | 'huge', 929 | 'human', 930 | 'humble', 931 | 'humor', 932 | 'hundred', 933 | 'hungry', 934 | 'hunt', 935 | 'hurdle', 936 | 'hurry', 937 | 'hurt', 938 | 'husband', 939 | 'hybrid', 940 | 'ice', 941 | 'icon', 942 | 'idea', 943 | 'identify', 944 | 'idle', 945 | 'ignore', 946 | 'ill', 947 | 'illegal', 948 | 'illness', 949 | 'image', 950 | 'imitate', 951 | 'immense', 952 | 'immune', 953 | 'impact', 954 | 'impose', 955 | 'improve', 956 | 'impulse', 957 | 'inch', 958 | 'include', 959 | 'income', 960 | 'increase', 961 | 'index', 962 | 'indicate', 963 | 'indoor', 964 | 'industry', 965 | 'infant', 966 | 'inflict', 967 | 'inform', 968 | 'inhale', 969 | 'inherit', 970 | 'initial', 971 | 'inject', 972 | 'injury', 973 | 'inmate', 974 | 'inner', 975 | 'innocent', 976 | 'input', 977 | 'inquiry', 978 | 'insane', 979 | 'insect', 980 | 'inside', 981 | 'inspire', 982 | 'install', 983 | 'intact', 984 | 'interest', 985 | 'into', 986 | 'invest', 987 | 'invite', 988 | 'involve', 989 | 'iron', 990 | 'island', 991 | 'isolate', 992 | 'issue', 993 | 'item', 994 | 'ivory', 995 | 'jacket', 996 | 'jaguar', 997 | 'jar', 998 | 'jazz', 999 | 'jealous', 1000 | 'jeans', 1001 | 'jelly', 1002 | 'jewel', 1003 | 'job', 1004 | 'join', 1005 | 'joke', 1006 | 'journey', 1007 | 'joy', 1008 | 'judge', 1009 | 'juice', 1010 | 'jump', 1011 | 'jungle', 1012 | 'junior', 1013 | 'junk', 1014 | 'just', 1015 | 'kangaroo', 1016 | 'keen', 1017 | 'keep', 1018 | 'ketchup', 1019 | 'key', 1020 | 'kick', 1021 | 'kid', 1022 | 'kidney', 1023 | 'kind', 1024 | 'kingdom', 1025 | 'kiss', 1026 | 'kit', 1027 | 'kitchen', 1028 | 'kite', 1029 | 'kitten', 1030 | 'kiwi', 1031 | 'knee', 1032 | 'knife', 1033 | 'knock', 1034 | 'know', 1035 | 'lab', 1036 | 'label', 1037 | 'labor', 1038 | 'ladder', 1039 | 'lady', 1040 | 'lake', 1041 | 'lamp', 1042 | 'language', 1043 | 'laptop', 1044 | 'large', 1045 | 'later', 1046 | 'latin', 1047 | 'laugh', 1048 | 'laundry', 1049 | 'lava', 1050 | 'law', 1051 | 'lawn', 1052 | 'lawsuit', 1053 | 'layer', 1054 | 'lazy', 1055 | 'leader', 1056 | 'leaf', 1057 | 'learn', 1058 | 'leave', 1059 | 'lecture', 1060 | 'left', 1061 | 'leg', 1062 | 'legal', 1063 | 'legend', 1064 | 'leisure', 1065 | 'lemon', 1066 | 'lend', 1067 | 'length', 1068 | 'lens', 1069 | 'leopard', 1070 | 'lesson', 1071 | 'letter', 1072 | 'level', 1073 | 'liar', 1074 | 'liberty', 1075 | 'library', 1076 | 'license', 1077 | 'life', 1078 | 'lift', 1079 | 'light', 1080 | 'like', 1081 | 'limb', 1082 | 'limit', 1083 | 'link', 1084 | 'lion', 1085 | 'liquid', 1086 | 'list', 1087 | 'little', 1088 | 'live', 1089 | 'lizard', 1090 | 'load', 1091 | 'loan', 1092 | 'lobster', 1093 | 'local', 1094 | 'lock', 1095 | 'logic', 1096 | 'lonely', 1097 | 'long', 1098 | 'loop', 1099 | 'lottery', 1100 | 'loud', 1101 | 'lounge', 1102 | 'love', 1103 | 'loyal', 1104 | 'lucky', 1105 | 'luggage', 1106 | 'lumber', 1107 | 'lunar', 1108 | 'lunch', 1109 | 'luxury', 1110 | 'lyrics', 1111 | 'machine', 1112 | 'mad', 1113 | 'magic', 1114 | 'magnet', 1115 | 'maid', 1116 | 'mail', 1117 | 'main', 1118 | 'major', 1119 | 'make', 1120 | 'mammal', 1121 | 'man', 1122 | 'manage', 1123 | 'mandate', 1124 | 'mango', 1125 | 'mansion', 1126 | 'manual', 1127 | 'maple', 1128 | 'marble', 1129 | 'march', 1130 | 'margin', 1131 | 'marine', 1132 | 'market', 1133 | 'marriage', 1134 | 'mask', 1135 | 'mass', 1136 | 'master', 1137 | 'match', 1138 | 'material', 1139 | 'math', 1140 | 'matrix', 1141 | 'matter', 1142 | 'maximum', 1143 | 'maze', 1144 | 'meadow', 1145 | 'mean', 1146 | 'measure', 1147 | 'meat', 1148 | 'mechanic', 1149 | 'medal', 1150 | 'media', 1151 | 'melody', 1152 | 'melt', 1153 | 'member', 1154 | 'memory', 1155 | 'mention', 1156 | 'menu', 1157 | 'mercy', 1158 | 'merge', 1159 | 'merit', 1160 | 'merry', 1161 | 'mesh', 1162 | 'message', 1163 | 'metal', 1164 | 'method', 1165 | 'middle', 1166 | 'midnight', 1167 | 'milk', 1168 | 'million', 1169 | 'mimic', 1170 | 'mind', 1171 | 'minimum', 1172 | 'minor', 1173 | 'minute', 1174 | 'miracle', 1175 | 'mirror', 1176 | 'misery', 1177 | 'miss', 1178 | 'mistake', 1179 | 'mix', 1180 | 'mixed', 1181 | 'mixture', 1182 | 'mobile', 1183 | 'model', 1184 | 'modify', 1185 | 'mom', 1186 | 'moment', 1187 | 'monitor', 1188 | 'monkey', 1189 | 'monster', 1190 | 'month', 1191 | 'moon', 1192 | 'moral', 1193 | 'more', 1194 | 'morning', 1195 | 'mosquito', 1196 | 'mother', 1197 | 'motion', 1198 | 'motor', 1199 | 'mountain', 1200 | 'mouse', 1201 | 'move', 1202 | 'movie', 1203 | 'much', 1204 | 'muffin', 1205 | 'mule', 1206 | 'multiply', 1207 | 'muscle', 1208 | 'museum', 1209 | 'mushroom', 1210 | 'music', 1211 | 'must', 1212 | 'mutual', 1213 | 'myself', 1214 | 'mystery', 1215 | 'myth', 1216 | 'naive', 1217 | 'name', 1218 | 'napkin', 1219 | 'narrow', 1220 | 'nasty', 1221 | 'nation', 1222 | 'nature', 1223 | 'near', 1224 | 'neck', 1225 | 'need', 1226 | 'negative', 1227 | 'neglect', 1228 | 'neither', 1229 | 'nephew', 1230 | 'nerve', 1231 | 'nest', 1232 | 'net', 1233 | 'network', 1234 | 'neutral', 1235 | 'never', 1236 | 'news', 1237 | 'next', 1238 | 'nice', 1239 | 'night', 1240 | 'noble', 1241 | 'noise', 1242 | 'nominee', 1243 | 'noodle', 1244 | 'normal', 1245 | 'north', 1246 | 'nose', 1247 | 'notable', 1248 | 'note', 1249 | 'nothing', 1250 | 'notice', 1251 | 'novel', 1252 | 'now', 1253 | 'nuclear', 1254 | 'number', 1255 | 'nurse', 1256 | 'nut', 1257 | 'oak', 1258 | 'obey', 1259 | 'object', 1260 | 'oblige', 1261 | 'obscure', 1262 | 'observe', 1263 | 'obtain', 1264 | 'obvious', 1265 | 'occur', 1266 | 'ocean', 1267 | 'october', 1268 | 'odor', 1269 | 'off', 1270 | 'offer', 1271 | 'office', 1272 | 'often', 1273 | 'oil', 1274 | 'okay', 1275 | 'old', 1276 | 'olive', 1277 | 'olympic', 1278 | 'omit', 1279 | 'once', 1280 | 'one', 1281 | 'onion', 1282 | 'online', 1283 | 'only', 1284 | 'open', 1285 | 'opera', 1286 | 'opinion', 1287 | 'oppose', 1288 | 'option', 1289 | 'orange', 1290 | 'orbit', 1291 | 'orchard', 1292 | 'order', 1293 | 'ordinary', 1294 | 'organ', 1295 | 'orient', 1296 | 'original', 1297 | 'orphan', 1298 | 'ostrich', 1299 | 'other', 1300 | 'outdoor', 1301 | 'outer', 1302 | 'output', 1303 | 'outside', 1304 | 'oval', 1305 | 'oven', 1306 | 'over', 1307 | 'own', 1308 | 'owner', 1309 | 'oxygen', 1310 | 'oyster', 1311 | 'ozone', 1312 | 'pact', 1313 | 'paddle', 1314 | 'page', 1315 | 'pair', 1316 | 'palace', 1317 | 'palm', 1318 | 'panda', 1319 | 'panel', 1320 | 'panic', 1321 | 'panther', 1322 | 'paper', 1323 | 'parade', 1324 | 'parent', 1325 | 'park', 1326 | 'parrot', 1327 | 'party', 1328 | 'pass', 1329 | 'patch', 1330 | 'path', 1331 | 'patient', 1332 | 'patrol', 1333 | 'pattern', 1334 | 'pause', 1335 | 'pave', 1336 | 'payment', 1337 | 'peace', 1338 | 'peanut', 1339 | 'pear', 1340 | 'peasant', 1341 | 'pelican', 1342 | 'pen', 1343 | 'penalty', 1344 | 'pencil', 1345 | 'people', 1346 | 'pepper', 1347 | 'perfect', 1348 | 'permit', 1349 | 'person', 1350 | 'pet', 1351 | 'phone', 1352 | 'photo', 1353 | 'phrase', 1354 | 'physical', 1355 | 'piano', 1356 | 'picnic', 1357 | 'picture', 1358 | 'piece', 1359 | 'pig', 1360 | 'pigeon', 1361 | 'pill', 1362 | 'pilot', 1363 | 'pink', 1364 | 'pioneer', 1365 | 'pipe', 1366 | 'pistol', 1367 | 'pitch', 1368 | 'pizza', 1369 | 'place', 1370 | 'planet', 1371 | 'plastic', 1372 | 'plate', 1373 | 'play', 1374 | 'please', 1375 | 'pledge', 1376 | 'pluck', 1377 | 'plug', 1378 | 'plunge', 1379 | 'poem', 1380 | 'poet', 1381 | 'point', 1382 | 'polar', 1383 | 'pole', 1384 | 'police', 1385 | 'pond', 1386 | 'pony', 1387 | 'pool', 1388 | 'popular', 1389 | 'portion', 1390 | 'position', 1391 | 'possible', 1392 | 'post', 1393 | 'potato', 1394 | 'pottery', 1395 | 'poverty', 1396 | 'powder', 1397 | 'power', 1398 | 'practice', 1399 | 'praise', 1400 | 'predict', 1401 | 'prefer', 1402 | 'prepare', 1403 | 'present', 1404 | 'pretty', 1405 | 'prevent', 1406 | 'price', 1407 | 'pride', 1408 | 'primary', 1409 | 'print', 1410 | 'priority', 1411 | 'prison', 1412 | 'private', 1413 | 'prize', 1414 | 'problem', 1415 | 'process', 1416 | 'produce', 1417 | 'profit', 1418 | 'program', 1419 | 'project', 1420 | 'promote', 1421 | 'proof', 1422 | 'property', 1423 | 'prosper', 1424 | 'protect', 1425 | 'proud', 1426 | 'provide', 1427 | 'public', 1428 | 'pudding', 1429 | 'pull', 1430 | 'pulp', 1431 | 'pulse', 1432 | 'pumpkin', 1433 | 'punch', 1434 | 'pupil', 1435 | 'puppy', 1436 | 'purchase', 1437 | 'purity', 1438 | 'purpose', 1439 | 'purse', 1440 | 'push', 1441 | 'put', 1442 | 'puzzle', 1443 | 'pyramid', 1444 | 'quality', 1445 | 'quantum', 1446 | 'quarter', 1447 | 'question', 1448 | 'quick', 1449 | 'quit', 1450 | 'quiz', 1451 | 'quote', 1452 | 'rabbit', 1453 | 'raccoon', 1454 | 'race', 1455 | 'rack', 1456 | 'radar', 1457 | 'radio', 1458 | 'rail', 1459 | 'rain', 1460 | 'raise', 1461 | 'rally', 1462 | 'ramp', 1463 | 'ranch', 1464 | 'random', 1465 | 'range', 1466 | 'rapid', 1467 | 'rare', 1468 | 'rate', 1469 | 'rather', 1470 | 'raven', 1471 | 'raw', 1472 | 'razor', 1473 | 'ready', 1474 | 'real', 1475 | 'reason', 1476 | 'rebel', 1477 | 'rebuild', 1478 | 'recall', 1479 | 'receive', 1480 | 'recipe', 1481 | 'record', 1482 | 'recycle', 1483 | 'reduce', 1484 | 'reflect', 1485 | 'reform', 1486 | 'refuse', 1487 | 'region', 1488 | 'regret', 1489 | 'regular', 1490 | 'reject', 1491 | 'relax', 1492 | 'release', 1493 | 'relief', 1494 | 'rely', 1495 | 'remain', 1496 | 'remember', 1497 | 'remind', 1498 | 'remove', 1499 | 'render', 1500 | 'renew', 1501 | 'rent', 1502 | 'reopen', 1503 | 'repair', 1504 | 'repeat', 1505 | 'replace', 1506 | 'report', 1507 | 'require', 1508 | 'rescue', 1509 | 'resemble', 1510 | 'resist', 1511 | 'resource', 1512 | 'response', 1513 | 'result', 1514 | 'retire', 1515 | 'retreat', 1516 | 'return', 1517 | 'reunion', 1518 | 'reveal', 1519 | 'review', 1520 | 'reward', 1521 | 'rhythm', 1522 | 'rib', 1523 | 'ribbon', 1524 | 'rice', 1525 | 'rich', 1526 | 'ride', 1527 | 'ridge', 1528 | 'rifle', 1529 | 'right', 1530 | 'rigid', 1531 | 'ring', 1532 | 'riot', 1533 | 'ripple', 1534 | 'risk', 1535 | 'ritual', 1536 | 'rival', 1537 | 'river', 1538 | 'road', 1539 | 'roast', 1540 | 'robot', 1541 | 'robust', 1542 | 'rocket', 1543 | 'romance', 1544 | 'roof', 1545 | 'rookie', 1546 | 'room', 1547 | 'rose', 1548 | 'rotate', 1549 | 'rough', 1550 | 'round', 1551 | 'route', 1552 | 'royal', 1553 | 'rubber', 1554 | 'rude', 1555 | 'rug', 1556 | 'rule', 1557 | 'run', 1558 | 'runway', 1559 | 'rural', 1560 | 'sad', 1561 | 'saddle', 1562 | 'sadness', 1563 | 'safe', 1564 | 'sail', 1565 | 'salad', 1566 | 'salmon', 1567 | 'salon', 1568 | 'salt', 1569 | 'salute', 1570 | 'same', 1571 | 'sample', 1572 | 'sand', 1573 | 'satisfy', 1574 | 'satoshi', 1575 | 'sauce', 1576 | 'sausage', 1577 | 'save', 1578 | 'say', 1579 | 'scale', 1580 | 'scan', 1581 | 'scare', 1582 | 'scatter', 1583 | 'scene', 1584 | 'scheme', 1585 | 'school', 1586 | 'science', 1587 | 'scissors', 1588 | 'scorpion', 1589 | 'scout', 1590 | 'scrap', 1591 | 'screen', 1592 | 'script', 1593 | 'scrub', 1594 | 'sea', 1595 | 'search', 1596 | 'season', 1597 | 'seat', 1598 | 'second', 1599 | 'secret', 1600 | 'section', 1601 | 'security', 1602 | 'seed', 1603 | 'seek', 1604 | 'segment', 1605 | 'select', 1606 | 'sell', 1607 | 'seminar', 1608 | 'senior', 1609 | 'sense', 1610 | 'sentence', 1611 | 'series', 1612 | 'service', 1613 | 'session', 1614 | 'settle', 1615 | 'setup', 1616 | 'seven', 1617 | 'shadow', 1618 | 'shaft', 1619 | 'shallow', 1620 | 'share', 1621 | 'shed', 1622 | 'shell', 1623 | 'sheriff', 1624 | 'shield', 1625 | 'shift', 1626 | 'shine', 1627 | 'ship', 1628 | 'shiver', 1629 | 'shock', 1630 | 'shoe', 1631 | 'shoot', 1632 | 'shop', 1633 | 'short', 1634 | 'shoulder', 1635 | 'shove', 1636 | 'shrimp', 1637 | 'shrug', 1638 | 'shuffle', 1639 | 'shy', 1640 | 'sibling', 1641 | 'sick', 1642 | 'side', 1643 | 'siege', 1644 | 'sight', 1645 | 'sign', 1646 | 'silent', 1647 | 'silk', 1648 | 'silly', 1649 | 'silver', 1650 | 'similar', 1651 | 'simple', 1652 | 'since', 1653 | 'sing', 1654 | 'siren', 1655 | 'sister', 1656 | 'situate', 1657 | 'six', 1658 | 'size', 1659 | 'skate', 1660 | 'sketch', 1661 | 'ski', 1662 | 'skill', 1663 | 'skin', 1664 | 'skirt', 1665 | 'skull', 1666 | 'slab', 1667 | 'slam', 1668 | 'sleep', 1669 | 'slender', 1670 | 'slice', 1671 | 'slide', 1672 | 'slight', 1673 | 'slim', 1674 | 'slogan', 1675 | 'slot', 1676 | 'slow', 1677 | 'slush', 1678 | 'small', 1679 | 'smart', 1680 | 'smile', 1681 | 'smoke', 1682 | 'smooth', 1683 | 'snack', 1684 | 'snake', 1685 | 'snap', 1686 | 'sniff', 1687 | 'snow', 1688 | 'soap', 1689 | 'soccer', 1690 | 'social', 1691 | 'sock', 1692 | 'soda', 1693 | 'soft', 1694 | 'solar', 1695 | 'soldier', 1696 | 'solid', 1697 | 'solution', 1698 | 'solve', 1699 | 'someone', 1700 | 'song', 1701 | 'soon', 1702 | 'sorry', 1703 | 'sort', 1704 | 'soul', 1705 | 'sound', 1706 | 'soup', 1707 | 'source', 1708 | 'south', 1709 | 'space', 1710 | 'spare', 1711 | 'spatial', 1712 | 'spawn', 1713 | 'speak', 1714 | 'special', 1715 | 'speed', 1716 | 'spell', 1717 | 'spend', 1718 | 'sphere', 1719 | 'spice', 1720 | 'spider', 1721 | 'spike', 1722 | 'spin', 1723 | 'spirit', 1724 | 'split', 1725 | 'spoil', 1726 | 'sponsor', 1727 | 'spoon', 1728 | 'sport', 1729 | 'spot', 1730 | 'spray', 1731 | 'spread', 1732 | 'spring', 1733 | 'spy', 1734 | 'square', 1735 | 'squeeze', 1736 | 'squirrel', 1737 | 'stable', 1738 | 'stadium', 1739 | 'staff', 1740 | 'stage', 1741 | 'stairs', 1742 | 'stamp', 1743 | 'stand', 1744 | 'start', 1745 | 'state', 1746 | 'stay', 1747 | 'steak', 1748 | 'steel', 1749 | 'stem', 1750 | 'step', 1751 | 'stereo', 1752 | 'stick', 1753 | 'still', 1754 | 'sting', 1755 | 'stock', 1756 | 'stomach', 1757 | 'stone', 1758 | 'stool', 1759 | 'story', 1760 | 'stove', 1761 | 'strategy', 1762 | 'street', 1763 | 'strike', 1764 | 'strong', 1765 | 'struggle', 1766 | 'student', 1767 | 'stuff', 1768 | 'stumble', 1769 | 'style', 1770 | 'subject', 1771 | 'submit', 1772 | 'subway', 1773 | 'success', 1774 | 'such', 1775 | 'sudden', 1776 | 'suffer', 1777 | 'sugar', 1778 | 'suggest', 1779 | 'suit', 1780 | 'summer', 1781 | 'sun', 1782 | 'sunny', 1783 | 'sunset', 1784 | 'super', 1785 | 'supply', 1786 | 'supreme', 1787 | 'sure', 1788 | 'surface', 1789 | 'surge', 1790 | 'surprise', 1791 | 'surround', 1792 | 'survey', 1793 | 'suspect', 1794 | 'sustain', 1795 | 'swallow', 1796 | 'swamp', 1797 | 'swap', 1798 | 'swarm', 1799 | 'swear', 1800 | 'sweet', 1801 | 'swift', 1802 | 'swim', 1803 | 'swing', 1804 | 'switch', 1805 | 'sword', 1806 | 'symbol', 1807 | 'symptom', 1808 | 'syrup', 1809 | 'system', 1810 | 'table', 1811 | 'tackle', 1812 | 'tag', 1813 | 'tail', 1814 | 'talent', 1815 | 'talk', 1816 | 'tank', 1817 | 'tape', 1818 | 'target', 1819 | 'task', 1820 | 'taste', 1821 | 'tattoo', 1822 | 'taxi', 1823 | 'teach', 1824 | 'team', 1825 | 'tell', 1826 | 'ten', 1827 | 'tenant', 1828 | 'tennis', 1829 | 'tent', 1830 | 'term', 1831 | 'test', 1832 | 'text', 1833 | 'thank', 1834 | 'that', 1835 | 'theme', 1836 | 'then', 1837 | 'theory', 1838 | 'there', 1839 | 'they', 1840 | 'thing', 1841 | 'this', 1842 | 'thought', 1843 | 'three', 1844 | 'thrive', 1845 | 'throw', 1846 | 'thumb', 1847 | 'thunder', 1848 | 'ticket', 1849 | 'tide', 1850 | 'tiger', 1851 | 'tilt', 1852 | 'timber', 1853 | 'time', 1854 | 'tiny', 1855 | 'tip', 1856 | 'tired', 1857 | 'tissue', 1858 | 'title', 1859 | 'toast', 1860 | 'tobacco', 1861 | 'today', 1862 | 'toddler', 1863 | 'toe', 1864 | 'together', 1865 | 'toilet', 1866 | 'token', 1867 | 'tomato', 1868 | 'tomorrow', 1869 | 'tone', 1870 | 'tongue', 1871 | 'tonight', 1872 | 'tool', 1873 | 'tooth', 1874 | 'top', 1875 | 'topic', 1876 | 'topple', 1877 | 'torch', 1878 | 'tornado', 1879 | 'tortoise', 1880 | 'toss', 1881 | 'total', 1882 | 'tourist', 1883 | 'toward', 1884 | 'tower', 1885 | 'town', 1886 | 'toy', 1887 | 'track', 1888 | 'trade', 1889 | 'traffic', 1890 | 'tragic', 1891 | 'train', 1892 | 'transfer', 1893 | 'trap', 1894 | 'trash', 1895 | 'travel', 1896 | 'tray', 1897 | 'treat', 1898 | 'tree', 1899 | 'trend', 1900 | 'trial', 1901 | 'tribe', 1902 | 'trick', 1903 | 'trigger', 1904 | 'trim', 1905 | 'trip', 1906 | 'trophy', 1907 | 'trouble', 1908 | 'truck', 1909 | 'true', 1910 | 'truly', 1911 | 'trumpet', 1912 | 'trust', 1913 | 'truth', 1914 | 'try', 1915 | 'tube', 1916 | 'tuition', 1917 | 'tumble', 1918 | 'tuna', 1919 | 'tunnel', 1920 | 'turkey', 1921 | 'turn', 1922 | 'turtle', 1923 | 'twelve', 1924 | 'twenty', 1925 | 'twice', 1926 | 'twin', 1927 | 'twist', 1928 | 'two', 1929 | 'type', 1930 | 'typical', 1931 | 'ugly', 1932 | 'umbrella', 1933 | 'unable', 1934 | 'unaware', 1935 | 'uncle', 1936 | 'uncover', 1937 | 'under', 1938 | 'undo', 1939 | 'unfair', 1940 | 'unfold', 1941 | 'unhappy', 1942 | 'uniform', 1943 | 'unique', 1944 | 'unit', 1945 | 'universe', 1946 | 'unknown', 1947 | 'unlock', 1948 | 'until', 1949 | 'unusual', 1950 | 'unveil', 1951 | 'update', 1952 | 'upgrade', 1953 | 'uphold', 1954 | 'upon', 1955 | 'upper', 1956 | 'upset', 1957 | 'urban', 1958 | 'urge', 1959 | 'usage', 1960 | 'use', 1961 | 'used', 1962 | 'useful', 1963 | 'useless', 1964 | 'usual', 1965 | 'utility', 1966 | 'vacant', 1967 | 'vacuum', 1968 | 'vague', 1969 | 'valid', 1970 | 'valley', 1971 | 'valve', 1972 | 'van', 1973 | 'vanish', 1974 | 'vapor', 1975 | 'various', 1976 | 'vast', 1977 | 'vault', 1978 | 'vehicle', 1979 | 'velvet', 1980 | 'vendor', 1981 | 'venture', 1982 | 'venue', 1983 | 'verb', 1984 | 'verify', 1985 | 'version', 1986 | 'very', 1987 | 'vessel', 1988 | 'veteran', 1989 | 'viable', 1990 | 'vibrant', 1991 | 'vicious', 1992 | 'victory', 1993 | 'video', 1994 | 'view', 1995 | 'village', 1996 | 'vintage', 1997 | 'violin', 1998 | 'virtual', 1999 | 'virus', 2000 | 'visa', 2001 | 'visit', 2002 | 'visual', 2003 | 'vital', 2004 | 'vivid', 2005 | 'vocal', 2006 | 'voice', 2007 | 'void', 2008 | 'volcano', 2009 | 'volume', 2010 | 'vote', 2011 | 'voyage', 2012 | 'wage', 2013 | 'wagon', 2014 | 'wait', 2015 | 'walk', 2016 | 'wall', 2017 | 'walnut', 2018 | 'want', 2019 | 'warfare', 2020 | 'warm', 2021 | 'warrior', 2022 | 'wash', 2023 | 'wasp', 2024 | 'waste', 2025 | 'water', 2026 | 'wave', 2027 | 'way', 2028 | 'wealth', 2029 | 'weapon', 2030 | 'wear', 2031 | 'weasel', 2032 | 'weather', 2033 | 'web', 2034 | 'wedding', 2035 | 'weekend', 2036 | 'weird', 2037 | 'welcome', 2038 | 'west', 2039 | 'wet', 2040 | 'whale', 2041 | 'what', 2042 | 'wheat', 2043 | 'wheel', 2044 | 'when', 2045 | 'where', 2046 | 'whip', 2047 | 'whisper', 2048 | 'wide', 2049 | 'width', 2050 | 'wife', 2051 | 'wild', 2052 | 'will', 2053 | 'win', 2054 | 'window', 2055 | 'wine', 2056 | 'wing', 2057 | 'wink', 2058 | 'winner', 2059 | 'winter', 2060 | 'wire', 2061 | 'wisdom', 2062 | 'wise', 2063 | 'wish', 2064 | 'witness', 2065 | 'wolf', 2066 | 'woman', 2067 | 'wonder', 2068 | 'wood', 2069 | 'wool', 2070 | 'word', 2071 | 'work', 2072 | 'world', 2073 | 'worry', 2074 | 'worth', 2075 | 'wrap', 2076 | 'wreck', 2077 | 'wrestle', 2078 | 'wrist', 2079 | 'write', 2080 | 'wrong', 2081 | 'yard', 2082 | 'year', 2083 | 'yellow', 2084 | 'you', 2085 | 'young', 2086 | 'youth', 2087 | 'zebra', 2088 | 'zero', 2089 | 'zone', 2090 | 'zoo', 2091 | ]; 2092 | -------------------------------------------------------------------------------- /src/mnemonic.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.mnemonicToBytes = exports.mnemonicFromBytes = void 0; 4 | function mnemonicFromBytes(bytes) { 5 | const bits = bytesToBinary(Array.from(bytes)); 6 | const chunks = bits.match(/(.{1,11})/g); 7 | const words = chunks.map((binary) => { 8 | const index = binaryToByte(binary); 9 | return WORDLIST[index]; 10 | }); 11 | return words.join(' '); 12 | } 13 | exports.mnemonicFromBytes = mnemonicFromBytes; 14 | function mnemonicToBytes(mnemonic) { 15 | const INVALID = 'Invalid Mnemonic'; 16 | const words = mnemonic.split(' '); 17 | if (words.length !== 24) 18 | throw new Error(INVALID); 19 | const bits = words 20 | .map((word) => { 21 | const index = WORDLIST.indexOf(word); 22 | if (index === -1) 23 | throw new Error(INVALID); 24 | return lpad(index.toString(2), '0', 11); 25 | }) 26 | .join(''); 27 | const entropyBytes = bits.match(/(.{8})/g).map(binaryToByte); 28 | return Buffer.from(entropyBytes); 29 | } 30 | exports.mnemonicToBytes = mnemonicToBytes; 31 | function bytesToBinary(bytes) { 32 | return bytes.map((x) => lpad(x.toString(2), '0', 8)).join(''); 33 | } 34 | function binaryToByte(bin) { 35 | return parseInt(bin, 2); 36 | } 37 | function lpad(str, padString, length) { 38 | while (str.length < length) 39 | str = padString + str; 40 | return str; 41 | } 42 | const WORDLIST = [ 43 | 'abandon', 44 | 'ability', 45 | 'able', 46 | 'about', 47 | 'above', 48 | 'absent', 49 | 'absorb', 50 | 'abstract', 51 | 'absurd', 52 | 'abuse', 53 | 'access', 54 | 'accident', 55 | 'account', 56 | 'accuse', 57 | 'achieve', 58 | 'acid', 59 | 'acoustic', 60 | 'acquire', 61 | 'across', 62 | 'act', 63 | 'action', 64 | 'actor', 65 | 'actress', 66 | 'actual', 67 | 'adapt', 68 | 'add', 69 | 'addict', 70 | 'address', 71 | 'adjust', 72 | 'admit', 73 | 'adult', 74 | 'advance', 75 | 'advice', 76 | 'aerobic', 77 | 'affair', 78 | 'afford', 79 | 'afraid', 80 | 'again', 81 | 'age', 82 | 'agent', 83 | 'agree', 84 | 'ahead', 85 | 'aim', 86 | 'air', 87 | 'airport', 88 | 'aisle', 89 | 'alarm', 90 | 'album', 91 | 'alcohol', 92 | 'alert', 93 | 'alien', 94 | 'all', 95 | 'alley', 96 | 'allow', 97 | 'almost', 98 | 'alone', 99 | 'alpha', 100 | 'already', 101 | 'also', 102 | 'alter', 103 | 'always', 104 | 'amateur', 105 | 'amazing', 106 | 'among', 107 | 'amount', 108 | 'amused', 109 | 'analyst', 110 | 'anchor', 111 | 'ancient', 112 | 'anger', 113 | 'angle', 114 | 'angry', 115 | 'animal', 116 | 'ankle', 117 | 'announce', 118 | 'annual', 119 | 'another', 120 | 'answer', 121 | 'antenna', 122 | 'antique', 123 | 'anxiety', 124 | 'any', 125 | 'apart', 126 | 'apology', 127 | 'appear', 128 | 'apple', 129 | 'approve', 130 | 'april', 131 | 'arch', 132 | 'arctic', 133 | 'area', 134 | 'arena', 135 | 'argue', 136 | 'arm', 137 | 'armed', 138 | 'armor', 139 | 'army', 140 | 'around', 141 | 'arrange', 142 | 'arrest', 143 | 'arrive', 144 | 'arrow', 145 | 'art', 146 | 'artefact', 147 | 'artist', 148 | 'artwork', 149 | 'ask', 150 | 'aspect', 151 | 'assault', 152 | 'asset', 153 | 'assist', 154 | 'assume', 155 | 'asthma', 156 | 'athlete', 157 | 'atom', 158 | 'attack', 159 | 'attend', 160 | 'attitude', 161 | 'attract', 162 | 'auction', 163 | 'audit', 164 | 'august', 165 | 'aunt', 166 | 'author', 167 | 'auto', 168 | 'autumn', 169 | 'average', 170 | 'avocado', 171 | 'avoid', 172 | 'awake', 173 | 'aware', 174 | 'away', 175 | 'awesome', 176 | 'awful', 177 | 'awkward', 178 | 'axis', 179 | 'baby', 180 | 'bachelor', 181 | 'bacon', 182 | 'badge', 183 | 'bag', 184 | 'balance', 185 | 'balcony', 186 | 'ball', 187 | 'bamboo', 188 | 'banana', 189 | 'banner', 190 | 'bar', 191 | 'barely', 192 | 'bargain', 193 | 'barrel', 194 | 'base', 195 | 'basic', 196 | 'basket', 197 | 'battle', 198 | 'beach', 199 | 'bean', 200 | 'beauty', 201 | 'because', 202 | 'become', 203 | 'beef', 204 | 'before', 205 | 'begin', 206 | 'behave', 207 | 'behind', 208 | 'believe', 209 | 'below', 210 | 'belt', 211 | 'bench', 212 | 'benefit', 213 | 'best', 214 | 'betray', 215 | 'better', 216 | 'between', 217 | 'beyond', 218 | 'bicycle', 219 | 'bid', 220 | 'bike', 221 | 'bind', 222 | 'biology', 223 | 'bird', 224 | 'birth', 225 | 'bitter', 226 | 'black', 227 | 'blade', 228 | 'blame', 229 | 'blanket', 230 | 'blast', 231 | 'bleak', 232 | 'bless', 233 | 'blind', 234 | 'blood', 235 | 'blossom', 236 | 'blouse', 237 | 'blue', 238 | 'blur', 239 | 'blush', 240 | 'board', 241 | 'boat', 242 | 'body', 243 | 'boil', 244 | 'bomb', 245 | 'bone', 246 | 'bonus', 247 | 'book', 248 | 'boost', 249 | 'border', 250 | 'boring', 251 | 'borrow', 252 | 'boss', 253 | 'bottom', 254 | 'bounce', 255 | 'box', 256 | 'boy', 257 | 'bracket', 258 | 'brain', 259 | 'brand', 260 | 'brass', 261 | 'brave', 262 | 'bread', 263 | 'breeze', 264 | 'brick', 265 | 'bridge', 266 | 'brief', 267 | 'bright', 268 | 'bring', 269 | 'brisk', 270 | 'broccoli', 271 | 'broken', 272 | 'bronze', 273 | 'broom', 274 | 'brother', 275 | 'brown', 276 | 'brush', 277 | 'bubble', 278 | 'buddy', 279 | 'budget', 280 | 'buffalo', 281 | 'build', 282 | 'bulb', 283 | 'bulk', 284 | 'bullet', 285 | 'bundle', 286 | 'bunker', 287 | 'burden', 288 | 'burger', 289 | 'burst', 290 | 'bus', 291 | 'business', 292 | 'busy', 293 | 'butter', 294 | 'buyer', 295 | 'buzz', 296 | 'cabbage', 297 | 'cabin', 298 | 'cable', 299 | 'cactus', 300 | 'cage', 301 | 'cake', 302 | 'call', 303 | 'calm', 304 | 'camera', 305 | 'camp', 306 | 'can', 307 | 'canal', 308 | 'cancel', 309 | 'candy', 310 | 'cannon', 311 | 'canoe', 312 | 'canvas', 313 | 'canyon', 314 | 'capable', 315 | 'capital', 316 | 'captain', 317 | 'car', 318 | 'carbon', 319 | 'card', 320 | 'cargo', 321 | 'carpet', 322 | 'carry', 323 | 'cart', 324 | 'case', 325 | 'cash', 326 | 'casino', 327 | 'castle', 328 | 'casual', 329 | 'cat', 330 | 'catalog', 331 | 'catch', 332 | 'category', 333 | 'cattle', 334 | 'caught', 335 | 'cause', 336 | 'caution', 337 | 'cave', 338 | 'ceiling', 339 | 'celery', 340 | 'cement', 341 | 'census', 342 | 'century', 343 | 'cereal', 344 | 'certain', 345 | 'chair', 346 | 'chalk', 347 | 'champion', 348 | 'change', 349 | 'chaos', 350 | 'chapter', 351 | 'charge', 352 | 'chase', 353 | 'chat', 354 | 'cheap', 355 | 'check', 356 | 'cheese', 357 | 'chef', 358 | 'cherry', 359 | 'chest', 360 | 'chicken', 361 | 'chief', 362 | 'child', 363 | 'chimney', 364 | 'choice', 365 | 'choose', 366 | 'chronic', 367 | 'chuckle', 368 | 'chunk', 369 | 'churn', 370 | 'cigar', 371 | 'cinnamon', 372 | 'circle', 373 | 'citizen', 374 | 'city', 375 | 'civil', 376 | 'claim', 377 | 'clap', 378 | 'clarify', 379 | 'claw', 380 | 'clay', 381 | 'clean', 382 | 'clerk', 383 | 'clever', 384 | 'click', 385 | 'client', 386 | 'cliff', 387 | 'climb', 388 | 'clinic', 389 | 'clip', 390 | 'clock', 391 | 'clog', 392 | 'close', 393 | 'cloth', 394 | 'cloud', 395 | 'clown', 396 | 'club', 397 | 'clump', 398 | 'cluster', 399 | 'clutch', 400 | 'coach', 401 | 'coast', 402 | 'coconut', 403 | 'code', 404 | 'coffee', 405 | 'coil', 406 | 'coin', 407 | 'collect', 408 | 'color', 409 | 'column', 410 | 'combine', 411 | 'come', 412 | 'comfort', 413 | 'comic', 414 | 'common', 415 | 'company', 416 | 'concert', 417 | 'conduct', 418 | 'confirm', 419 | 'congress', 420 | 'connect', 421 | 'consider', 422 | 'control', 423 | 'convince', 424 | 'cook', 425 | 'cool', 426 | 'copper', 427 | 'copy', 428 | 'coral', 429 | 'core', 430 | 'corn', 431 | 'correct', 432 | 'cost', 433 | 'cotton', 434 | 'couch', 435 | 'country', 436 | 'couple', 437 | 'course', 438 | 'cousin', 439 | 'cover', 440 | 'coyote', 441 | 'crack', 442 | 'cradle', 443 | 'craft', 444 | 'cram', 445 | 'crane', 446 | 'crash', 447 | 'crater', 448 | 'crawl', 449 | 'crazy', 450 | 'cream', 451 | 'credit', 452 | 'creek', 453 | 'crew', 454 | 'cricket', 455 | 'crime', 456 | 'crisp', 457 | 'critic', 458 | 'crop', 459 | 'cross', 460 | 'crouch', 461 | 'crowd', 462 | 'crucial', 463 | 'cruel', 464 | 'cruise', 465 | 'crumble', 466 | 'crunch', 467 | 'crush', 468 | 'cry', 469 | 'crystal', 470 | 'cube', 471 | 'culture', 472 | 'cup', 473 | 'cupboard', 474 | 'curious', 475 | 'current', 476 | 'curtain', 477 | 'curve', 478 | 'cushion', 479 | 'custom', 480 | 'cute', 481 | 'cycle', 482 | 'dad', 483 | 'damage', 484 | 'damp', 485 | 'dance', 486 | 'danger', 487 | 'daring', 488 | 'dash', 489 | 'daughter', 490 | 'dawn', 491 | 'day', 492 | 'deal', 493 | 'debate', 494 | 'debris', 495 | 'decade', 496 | 'december', 497 | 'decide', 498 | 'decline', 499 | 'decorate', 500 | 'decrease', 501 | 'deer', 502 | 'defense', 503 | 'define', 504 | 'defy', 505 | 'degree', 506 | 'delay', 507 | 'deliver', 508 | 'demand', 509 | 'demise', 510 | 'denial', 511 | 'dentist', 512 | 'deny', 513 | 'depart', 514 | 'depend', 515 | 'deposit', 516 | 'depth', 517 | 'deputy', 518 | 'derive', 519 | 'describe', 520 | 'desert', 521 | 'design', 522 | 'desk', 523 | 'despair', 524 | 'destroy', 525 | 'detail', 526 | 'detect', 527 | 'develop', 528 | 'device', 529 | 'devote', 530 | 'diagram', 531 | 'dial', 532 | 'diamond', 533 | 'diary', 534 | 'dice', 535 | 'diesel', 536 | 'diet', 537 | 'differ', 538 | 'digital', 539 | 'dignity', 540 | 'dilemma', 541 | 'dinner', 542 | 'dinosaur', 543 | 'direct', 544 | 'dirt', 545 | 'disagree', 546 | 'discover', 547 | 'disease', 548 | 'dish', 549 | 'dismiss', 550 | 'disorder', 551 | 'display', 552 | 'distance', 553 | 'divert', 554 | 'divide', 555 | 'divorce', 556 | 'dizzy', 557 | 'doctor', 558 | 'document', 559 | 'dog', 560 | 'doll', 561 | 'dolphin', 562 | 'domain', 563 | 'donate', 564 | 'donkey', 565 | 'donor', 566 | 'door', 567 | 'dose', 568 | 'double', 569 | 'dove', 570 | 'draft', 571 | 'dragon', 572 | 'drama', 573 | 'drastic', 574 | 'draw', 575 | 'dream', 576 | 'dress', 577 | 'drift', 578 | 'drill', 579 | 'drink', 580 | 'drip', 581 | 'drive', 582 | 'drop', 583 | 'drum', 584 | 'dry', 585 | 'duck', 586 | 'dumb', 587 | 'dune', 588 | 'during', 589 | 'dust', 590 | 'dutch', 591 | 'duty', 592 | 'dwarf', 593 | 'dynamic', 594 | 'eager', 595 | 'eagle', 596 | 'early', 597 | 'earn', 598 | 'earth', 599 | 'easily', 600 | 'east', 601 | 'easy', 602 | 'echo', 603 | 'ecology', 604 | 'economy', 605 | 'edge', 606 | 'edit', 607 | 'educate', 608 | 'effort', 609 | 'egg', 610 | 'eight', 611 | 'either', 612 | 'elbow', 613 | 'elder', 614 | 'electric', 615 | 'elegant', 616 | 'element', 617 | 'elephant', 618 | 'elevator', 619 | 'elite', 620 | 'else', 621 | 'embark', 622 | 'embody', 623 | 'embrace', 624 | 'emerge', 625 | 'emotion', 626 | 'employ', 627 | 'empower', 628 | 'empty', 629 | 'enable', 630 | 'enact', 631 | 'end', 632 | 'endless', 633 | 'endorse', 634 | 'enemy', 635 | 'energy', 636 | 'enforce', 637 | 'engage', 638 | 'engine', 639 | 'enhance', 640 | 'enjoy', 641 | 'enlist', 642 | 'enough', 643 | 'enrich', 644 | 'enroll', 645 | 'ensure', 646 | 'enter', 647 | 'entire', 648 | 'entry', 649 | 'envelope', 650 | 'episode', 651 | 'equal', 652 | 'equip', 653 | 'era', 654 | 'erase', 655 | 'erode', 656 | 'erosion', 657 | 'error', 658 | 'erupt', 659 | 'escape', 660 | 'essay', 661 | 'essence', 662 | 'estate', 663 | 'eternal', 664 | 'ethics', 665 | 'evidence', 666 | 'evil', 667 | 'evoke', 668 | 'evolve', 669 | 'exact', 670 | 'example', 671 | 'excess', 672 | 'exchange', 673 | 'excite', 674 | 'exclude', 675 | 'excuse', 676 | 'execute', 677 | 'exercise', 678 | 'exhaust', 679 | 'exhibit', 680 | 'exile', 681 | 'exist', 682 | 'exit', 683 | 'exotic', 684 | 'expand', 685 | 'expect', 686 | 'expire', 687 | 'explain', 688 | 'expose', 689 | 'express', 690 | 'extend', 691 | 'extra', 692 | 'eye', 693 | 'eyebrow', 694 | 'fabric', 695 | 'face', 696 | 'faculty', 697 | 'fade', 698 | 'faint', 699 | 'faith', 700 | 'fall', 701 | 'false', 702 | 'fame', 703 | 'family', 704 | 'famous', 705 | 'fan', 706 | 'fancy', 707 | 'fantasy', 708 | 'farm', 709 | 'fashion', 710 | 'fat', 711 | 'fatal', 712 | 'father', 713 | 'fatigue', 714 | 'fault', 715 | 'favorite', 716 | 'feature', 717 | 'february', 718 | 'federal', 719 | 'fee', 720 | 'feed', 721 | 'feel', 722 | 'female', 723 | 'fence', 724 | 'festival', 725 | 'fetch', 726 | 'fever', 727 | 'few', 728 | 'fiber', 729 | 'fiction', 730 | 'field', 731 | 'figure', 732 | 'file', 733 | 'film', 734 | 'filter', 735 | 'final', 736 | 'find', 737 | 'fine', 738 | 'finger', 739 | 'finish', 740 | 'fire', 741 | 'firm', 742 | 'first', 743 | 'fiscal', 744 | 'fish', 745 | 'fit', 746 | 'fitness', 747 | 'fix', 748 | 'flag', 749 | 'flame', 750 | 'flash', 751 | 'flat', 752 | 'flavor', 753 | 'flee', 754 | 'flight', 755 | 'flip', 756 | 'float', 757 | 'flock', 758 | 'floor', 759 | 'flower', 760 | 'fluid', 761 | 'flush', 762 | 'fly', 763 | 'foam', 764 | 'focus', 765 | 'fog', 766 | 'foil', 767 | 'fold', 768 | 'follow', 769 | 'food', 770 | 'foot', 771 | 'force', 772 | 'forest', 773 | 'forget', 774 | 'fork', 775 | 'fortune', 776 | 'forum', 777 | 'forward', 778 | 'fossil', 779 | 'foster', 780 | 'found', 781 | 'fox', 782 | 'fragile', 783 | 'frame', 784 | 'frequent', 785 | 'fresh', 786 | 'friend', 787 | 'fringe', 788 | 'frog', 789 | 'front', 790 | 'frost', 791 | 'frown', 792 | 'frozen', 793 | 'fruit', 794 | 'fuel', 795 | 'fun', 796 | 'funny', 797 | 'furnace', 798 | 'fury', 799 | 'future', 800 | 'gadget', 801 | 'gain', 802 | 'galaxy', 803 | 'gallery', 804 | 'game', 805 | 'gap', 806 | 'garage', 807 | 'garbage', 808 | 'garden', 809 | 'garlic', 810 | 'garment', 811 | 'gas', 812 | 'gasp', 813 | 'gate', 814 | 'gather', 815 | 'gauge', 816 | 'gaze', 817 | 'general', 818 | 'genius', 819 | 'genre', 820 | 'gentle', 821 | 'genuine', 822 | 'gesture', 823 | 'ghost', 824 | 'giant', 825 | 'gift', 826 | 'giggle', 827 | 'ginger', 828 | 'giraffe', 829 | 'girl', 830 | 'give', 831 | 'glad', 832 | 'glance', 833 | 'glare', 834 | 'glass', 835 | 'glide', 836 | 'glimpse', 837 | 'globe', 838 | 'gloom', 839 | 'glory', 840 | 'glove', 841 | 'glow', 842 | 'glue', 843 | 'goat', 844 | 'goddess', 845 | 'gold', 846 | 'good', 847 | 'goose', 848 | 'gorilla', 849 | 'gospel', 850 | 'gossip', 851 | 'govern', 852 | 'gown', 853 | 'grab', 854 | 'grace', 855 | 'grain', 856 | 'grant', 857 | 'grape', 858 | 'grass', 859 | 'gravity', 860 | 'great', 861 | 'green', 862 | 'grid', 863 | 'grief', 864 | 'grit', 865 | 'grocery', 866 | 'group', 867 | 'grow', 868 | 'grunt', 869 | 'guard', 870 | 'guess', 871 | 'guide', 872 | 'guilt', 873 | 'guitar', 874 | 'gun', 875 | 'gym', 876 | 'habit', 877 | 'hair', 878 | 'half', 879 | 'hammer', 880 | 'hamster', 881 | 'hand', 882 | 'happy', 883 | 'harbor', 884 | 'hard', 885 | 'harsh', 886 | 'harvest', 887 | 'hat', 888 | 'have', 889 | 'hawk', 890 | 'hazard', 891 | 'head', 892 | 'health', 893 | 'heart', 894 | 'heavy', 895 | 'hedgehog', 896 | 'height', 897 | 'hello', 898 | 'helmet', 899 | 'help', 900 | 'hen', 901 | 'hero', 902 | 'hidden', 903 | 'high', 904 | 'hill', 905 | 'hint', 906 | 'hip', 907 | 'hire', 908 | 'history', 909 | 'hobby', 910 | 'hockey', 911 | 'hold', 912 | 'hole', 913 | 'holiday', 914 | 'hollow', 915 | 'home', 916 | 'honey', 917 | 'hood', 918 | 'hope', 919 | 'horn', 920 | 'horror', 921 | 'horse', 922 | 'hospital', 923 | 'host', 924 | 'hotel', 925 | 'hour', 926 | 'hover', 927 | 'hub', 928 | 'huge', 929 | 'human', 930 | 'humble', 931 | 'humor', 932 | 'hundred', 933 | 'hungry', 934 | 'hunt', 935 | 'hurdle', 936 | 'hurry', 937 | 'hurt', 938 | 'husband', 939 | 'hybrid', 940 | 'ice', 941 | 'icon', 942 | 'idea', 943 | 'identify', 944 | 'idle', 945 | 'ignore', 946 | 'ill', 947 | 'illegal', 948 | 'illness', 949 | 'image', 950 | 'imitate', 951 | 'immense', 952 | 'immune', 953 | 'impact', 954 | 'impose', 955 | 'improve', 956 | 'impulse', 957 | 'inch', 958 | 'include', 959 | 'income', 960 | 'increase', 961 | 'index', 962 | 'indicate', 963 | 'indoor', 964 | 'industry', 965 | 'infant', 966 | 'inflict', 967 | 'inform', 968 | 'inhale', 969 | 'inherit', 970 | 'initial', 971 | 'inject', 972 | 'injury', 973 | 'inmate', 974 | 'inner', 975 | 'innocent', 976 | 'input', 977 | 'inquiry', 978 | 'insane', 979 | 'insect', 980 | 'inside', 981 | 'inspire', 982 | 'install', 983 | 'intact', 984 | 'interest', 985 | 'into', 986 | 'invest', 987 | 'invite', 988 | 'involve', 989 | 'iron', 990 | 'island', 991 | 'isolate', 992 | 'issue', 993 | 'item', 994 | 'ivory', 995 | 'jacket', 996 | 'jaguar', 997 | 'jar', 998 | 'jazz', 999 | 'jealous', 1000 | 'jeans', 1001 | 'jelly', 1002 | 'jewel', 1003 | 'job', 1004 | 'join', 1005 | 'joke', 1006 | 'journey', 1007 | 'joy', 1008 | 'judge', 1009 | 'juice', 1010 | 'jump', 1011 | 'jungle', 1012 | 'junior', 1013 | 'junk', 1014 | 'just', 1015 | 'kangaroo', 1016 | 'keen', 1017 | 'keep', 1018 | 'ketchup', 1019 | 'key', 1020 | 'kick', 1021 | 'kid', 1022 | 'kidney', 1023 | 'kind', 1024 | 'kingdom', 1025 | 'kiss', 1026 | 'kit', 1027 | 'kitchen', 1028 | 'kite', 1029 | 'kitten', 1030 | 'kiwi', 1031 | 'knee', 1032 | 'knife', 1033 | 'knock', 1034 | 'know', 1035 | 'lab', 1036 | 'label', 1037 | 'labor', 1038 | 'ladder', 1039 | 'lady', 1040 | 'lake', 1041 | 'lamp', 1042 | 'language', 1043 | 'laptop', 1044 | 'large', 1045 | 'later', 1046 | 'latin', 1047 | 'laugh', 1048 | 'laundry', 1049 | 'lava', 1050 | 'law', 1051 | 'lawn', 1052 | 'lawsuit', 1053 | 'layer', 1054 | 'lazy', 1055 | 'leader', 1056 | 'leaf', 1057 | 'learn', 1058 | 'leave', 1059 | 'lecture', 1060 | 'left', 1061 | 'leg', 1062 | 'legal', 1063 | 'legend', 1064 | 'leisure', 1065 | 'lemon', 1066 | 'lend', 1067 | 'length', 1068 | 'lens', 1069 | 'leopard', 1070 | 'lesson', 1071 | 'letter', 1072 | 'level', 1073 | 'liar', 1074 | 'liberty', 1075 | 'library', 1076 | 'license', 1077 | 'life', 1078 | 'lift', 1079 | 'light', 1080 | 'like', 1081 | 'limb', 1082 | 'limit', 1083 | 'link', 1084 | 'lion', 1085 | 'liquid', 1086 | 'list', 1087 | 'little', 1088 | 'live', 1089 | 'lizard', 1090 | 'load', 1091 | 'loan', 1092 | 'lobster', 1093 | 'local', 1094 | 'lock', 1095 | 'logic', 1096 | 'lonely', 1097 | 'long', 1098 | 'loop', 1099 | 'lottery', 1100 | 'loud', 1101 | 'lounge', 1102 | 'love', 1103 | 'loyal', 1104 | 'lucky', 1105 | 'luggage', 1106 | 'lumber', 1107 | 'lunar', 1108 | 'lunch', 1109 | 'luxury', 1110 | 'lyrics', 1111 | 'machine', 1112 | 'mad', 1113 | 'magic', 1114 | 'magnet', 1115 | 'maid', 1116 | 'mail', 1117 | 'main', 1118 | 'major', 1119 | 'make', 1120 | 'mammal', 1121 | 'man', 1122 | 'manage', 1123 | 'mandate', 1124 | 'mango', 1125 | 'mansion', 1126 | 'manual', 1127 | 'maple', 1128 | 'marble', 1129 | 'march', 1130 | 'margin', 1131 | 'marine', 1132 | 'market', 1133 | 'marriage', 1134 | 'mask', 1135 | 'mass', 1136 | 'master', 1137 | 'match', 1138 | 'material', 1139 | 'math', 1140 | 'matrix', 1141 | 'matter', 1142 | 'maximum', 1143 | 'maze', 1144 | 'meadow', 1145 | 'mean', 1146 | 'measure', 1147 | 'meat', 1148 | 'mechanic', 1149 | 'medal', 1150 | 'media', 1151 | 'melody', 1152 | 'melt', 1153 | 'member', 1154 | 'memory', 1155 | 'mention', 1156 | 'menu', 1157 | 'mercy', 1158 | 'merge', 1159 | 'merit', 1160 | 'merry', 1161 | 'mesh', 1162 | 'message', 1163 | 'metal', 1164 | 'method', 1165 | 'middle', 1166 | 'midnight', 1167 | 'milk', 1168 | 'million', 1169 | 'mimic', 1170 | 'mind', 1171 | 'minimum', 1172 | 'minor', 1173 | 'minute', 1174 | 'miracle', 1175 | 'mirror', 1176 | 'misery', 1177 | 'miss', 1178 | 'mistake', 1179 | 'mix', 1180 | 'mixed', 1181 | 'mixture', 1182 | 'mobile', 1183 | 'model', 1184 | 'modify', 1185 | 'mom', 1186 | 'moment', 1187 | 'monitor', 1188 | 'monkey', 1189 | 'monster', 1190 | 'month', 1191 | 'moon', 1192 | 'moral', 1193 | 'more', 1194 | 'morning', 1195 | 'mosquito', 1196 | 'mother', 1197 | 'motion', 1198 | 'motor', 1199 | 'mountain', 1200 | 'mouse', 1201 | 'move', 1202 | 'movie', 1203 | 'much', 1204 | 'muffin', 1205 | 'mule', 1206 | 'multiply', 1207 | 'muscle', 1208 | 'museum', 1209 | 'mushroom', 1210 | 'music', 1211 | 'must', 1212 | 'mutual', 1213 | 'myself', 1214 | 'mystery', 1215 | 'myth', 1216 | 'naive', 1217 | 'name', 1218 | 'napkin', 1219 | 'narrow', 1220 | 'nasty', 1221 | 'nation', 1222 | 'nature', 1223 | 'near', 1224 | 'neck', 1225 | 'need', 1226 | 'negative', 1227 | 'neglect', 1228 | 'neither', 1229 | 'nephew', 1230 | 'nerve', 1231 | 'nest', 1232 | 'net', 1233 | 'network', 1234 | 'neutral', 1235 | 'never', 1236 | 'news', 1237 | 'next', 1238 | 'nice', 1239 | 'night', 1240 | 'noble', 1241 | 'noise', 1242 | 'nominee', 1243 | 'noodle', 1244 | 'normal', 1245 | 'north', 1246 | 'nose', 1247 | 'notable', 1248 | 'note', 1249 | 'nothing', 1250 | 'notice', 1251 | 'novel', 1252 | 'now', 1253 | 'nuclear', 1254 | 'number', 1255 | 'nurse', 1256 | 'nut', 1257 | 'oak', 1258 | 'obey', 1259 | 'object', 1260 | 'oblige', 1261 | 'obscure', 1262 | 'observe', 1263 | 'obtain', 1264 | 'obvious', 1265 | 'occur', 1266 | 'ocean', 1267 | 'october', 1268 | 'odor', 1269 | 'off', 1270 | 'offer', 1271 | 'office', 1272 | 'often', 1273 | 'oil', 1274 | 'okay', 1275 | 'old', 1276 | 'olive', 1277 | 'olympic', 1278 | 'omit', 1279 | 'once', 1280 | 'one', 1281 | 'onion', 1282 | 'online', 1283 | 'only', 1284 | 'open', 1285 | 'opera', 1286 | 'opinion', 1287 | 'oppose', 1288 | 'option', 1289 | 'orange', 1290 | 'orbit', 1291 | 'orchard', 1292 | 'order', 1293 | 'ordinary', 1294 | 'organ', 1295 | 'orient', 1296 | 'original', 1297 | 'orphan', 1298 | 'ostrich', 1299 | 'other', 1300 | 'outdoor', 1301 | 'outer', 1302 | 'output', 1303 | 'outside', 1304 | 'oval', 1305 | 'oven', 1306 | 'over', 1307 | 'own', 1308 | 'owner', 1309 | 'oxygen', 1310 | 'oyster', 1311 | 'ozone', 1312 | 'pact', 1313 | 'paddle', 1314 | 'page', 1315 | 'pair', 1316 | 'palace', 1317 | 'palm', 1318 | 'panda', 1319 | 'panel', 1320 | 'panic', 1321 | 'panther', 1322 | 'paper', 1323 | 'parade', 1324 | 'parent', 1325 | 'park', 1326 | 'parrot', 1327 | 'party', 1328 | 'pass', 1329 | 'patch', 1330 | 'path', 1331 | 'patient', 1332 | 'patrol', 1333 | 'pattern', 1334 | 'pause', 1335 | 'pave', 1336 | 'payment', 1337 | 'peace', 1338 | 'peanut', 1339 | 'pear', 1340 | 'peasant', 1341 | 'pelican', 1342 | 'pen', 1343 | 'penalty', 1344 | 'pencil', 1345 | 'people', 1346 | 'pepper', 1347 | 'perfect', 1348 | 'permit', 1349 | 'person', 1350 | 'pet', 1351 | 'phone', 1352 | 'photo', 1353 | 'phrase', 1354 | 'physical', 1355 | 'piano', 1356 | 'picnic', 1357 | 'picture', 1358 | 'piece', 1359 | 'pig', 1360 | 'pigeon', 1361 | 'pill', 1362 | 'pilot', 1363 | 'pink', 1364 | 'pioneer', 1365 | 'pipe', 1366 | 'pistol', 1367 | 'pitch', 1368 | 'pizza', 1369 | 'place', 1370 | 'planet', 1371 | 'plastic', 1372 | 'plate', 1373 | 'play', 1374 | 'please', 1375 | 'pledge', 1376 | 'pluck', 1377 | 'plug', 1378 | 'plunge', 1379 | 'poem', 1380 | 'poet', 1381 | 'point', 1382 | 'polar', 1383 | 'pole', 1384 | 'police', 1385 | 'pond', 1386 | 'pony', 1387 | 'pool', 1388 | 'popular', 1389 | 'portion', 1390 | 'position', 1391 | 'possible', 1392 | 'post', 1393 | 'potato', 1394 | 'pottery', 1395 | 'poverty', 1396 | 'powder', 1397 | 'power', 1398 | 'practice', 1399 | 'praise', 1400 | 'predict', 1401 | 'prefer', 1402 | 'prepare', 1403 | 'present', 1404 | 'pretty', 1405 | 'prevent', 1406 | 'price', 1407 | 'pride', 1408 | 'primary', 1409 | 'print', 1410 | 'priority', 1411 | 'prison', 1412 | 'private', 1413 | 'prize', 1414 | 'problem', 1415 | 'process', 1416 | 'produce', 1417 | 'profit', 1418 | 'program', 1419 | 'project', 1420 | 'promote', 1421 | 'proof', 1422 | 'property', 1423 | 'prosper', 1424 | 'protect', 1425 | 'proud', 1426 | 'provide', 1427 | 'public', 1428 | 'pudding', 1429 | 'pull', 1430 | 'pulp', 1431 | 'pulse', 1432 | 'pumpkin', 1433 | 'punch', 1434 | 'pupil', 1435 | 'puppy', 1436 | 'purchase', 1437 | 'purity', 1438 | 'purpose', 1439 | 'purse', 1440 | 'push', 1441 | 'put', 1442 | 'puzzle', 1443 | 'pyramid', 1444 | 'quality', 1445 | 'quantum', 1446 | 'quarter', 1447 | 'question', 1448 | 'quick', 1449 | 'quit', 1450 | 'quiz', 1451 | 'quote', 1452 | 'rabbit', 1453 | 'raccoon', 1454 | 'race', 1455 | 'rack', 1456 | 'radar', 1457 | 'radio', 1458 | 'rail', 1459 | 'rain', 1460 | 'raise', 1461 | 'rally', 1462 | 'ramp', 1463 | 'ranch', 1464 | 'random', 1465 | 'range', 1466 | 'rapid', 1467 | 'rare', 1468 | 'rate', 1469 | 'rather', 1470 | 'raven', 1471 | 'raw', 1472 | 'razor', 1473 | 'ready', 1474 | 'real', 1475 | 'reason', 1476 | 'rebel', 1477 | 'rebuild', 1478 | 'recall', 1479 | 'receive', 1480 | 'recipe', 1481 | 'record', 1482 | 'recycle', 1483 | 'reduce', 1484 | 'reflect', 1485 | 'reform', 1486 | 'refuse', 1487 | 'region', 1488 | 'regret', 1489 | 'regular', 1490 | 'reject', 1491 | 'relax', 1492 | 'release', 1493 | 'relief', 1494 | 'rely', 1495 | 'remain', 1496 | 'remember', 1497 | 'remind', 1498 | 'remove', 1499 | 'render', 1500 | 'renew', 1501 | 'rent', 1502 | 'reopen', 1503 | 'repair', 1504 | 'repeat', 1505 | 'replace', 1506 | 'report', 1507 | 'require', 1508 | 'rescue', 1509 | 'resemble', 1510 | 'resist', 1511 | 'resource', 1512 | 'response', 1513 | 'result', 1514 | 'retire', 1515 | 'retreat', 1516 | 'return', 1517 | 'reunion', 1518 | 'reveal', 1519 | 'review', 1520 | 'reward', 1521 | 'rhythm', 1522 | 'rib', 1523 | 'ribbon', 1524 | 'rice', 1525 | 'rich', 1526 | 'ride', 1527 | 'ridge', 1528 | 'rifle', 1529 | 'right', 1530 | 'rigid', 1531 | 'ring', 1532 | 'riot', 1533 | 'ripple', 1534 | 'risk', 1535 | 'ritual', 1536 | 'rival', 1537 | 'river', 1538 | 'road', 1539 | 'roast', 1540 | 'robot', 1541 | 'robust', 1542 | 'rocket', 1543 | 'romance', 1544 | 'roof', 1545 | 'rookie', 1546 | 'room', 1547 | 'rose', 1548 | 'rotate', 1549 | 'rough', 1550 | 'round', 1551 | 'route', 1552 | 'royal', 1553 | 'rubber', 1554 | 'rude', 1555 | 'rug', 1556 | 'rule', 1557 | 'run', 1558 | 'runway', 1559 | 'rural', 1560 | 'sad', 1561 | 'saddle', 1562 | 'sadness', 1563 | 'safe', 1564 | 'sail', 1565 | 'salad', 1566 | 'salmon', 1567 | 'salon', 1568 | 'salt', 1569 | 'salute', 1570 | 'same', 1571 | 'sample', 1572 | 'sand', 1573 | 'satisfy', 1574 | 'satoshi', 1575 | 'sauce', 1576 | 'sausage', 1577 | 'save', 1578 | 'say', 1579 | 'scale', 1580 | 'scan', 1581 | 'scare', 1582 | 'scatter', 1583 | 'scene', 1584 | 'scheme', 1585 | 'school', 1586 | 'science', 1587 | 'scissors', 1588 | 'scorpion', 1589 | 'scout', 1590 | 'scrap', 1591 | 'screen', 1592 | 'script', 1593 | 'scrub', 1594 | 'sea', 1595 | 'search', 1596 | 'season', 1597 | 'seat', 1598 | 'second', 1599 | 'secret', 1600 | 'section', 1601 | 'security', 1602 | 'seed', 1603 | 'seek', 1604 | 'segment', 1605 | 'select', 1606 | 'sell', 1607 | 'seminar', 1608 | 'senior', 1609 | 'sense', 1610 | 'sentence', 1611 | 'series', 1612 | 'service', 1613 | 'session', 1614 | 'settle', 1615 | 'setup', 1616 | 'seven', 1617 | 'shadow', 1618 | 'shaft', 1619 | 'shallow', 1620 | 'share', 1621 | 'shed', 1622 | 'shell', 1623 | 'sheriff', 1624 | 'shield', 1625 | 'shift', 1626 | 'shine', 1627 | 'ship', 1628 | 'shiver', 1629 | 'shock', 1630 | 'shoe', 1631 | 'shoot', 1632 | 'shop', 1633 | 'short', 1634 | 'shoulder', 1635 | 'shove', 1636 | 'shrimp', 1637 | 'shrug', 1638 | 'shuffle', 1639 | 'shy', 1640 | 'sibling', 1641 | 'sick', 1642 | 'side', 1643 | 'siege', 1644 | 'sight', 1645 | 'sign', 1646 | 'silent', 1647 | 'silk', 1648 | 'silly', 1649 | 'silver', 1650 | 'similar', 1651 | 'simple', 1652 | 'since', 1653 | 'sing', 1654 | 'siren', 1655 | 'sister', 1656 | 'situate', 1657 | 'six', 1658 | 'size', 1659 | 'skate', 1660 | 'sketch', 1661 | 'ski', 1662 | 'skill', 1663 | 'skin', 1664 | 'skirt', 1665 | 'skull', 1666 | 'slab', 1667 | 'slam', 1668 | 'sleep', 1669 | 'slender', 1670 | 'slice', 1671 | 'slide', 1672 | 'slight', 1673 | 'slim', 1674 | 'slogan', 1675 | 'slot', 1676 | 'slow', 1677 | 'slush', 1678 | 'small', 1679 | 'smart', 1680 | 'smile', 1681 | 'smoke', 1682 | 'smooth', 1683 | 'snack', 1684 | 'snake', 1685 | 'snap', 1686 | 'sniff', 1687 | 'snow', 1688 | 'soap', 1689 | 'soccer', 1690 | 'social', 1691 | 'sock', 1692 | 'soda', 1693 | 'soft', 1694 | 'solar', 1695 | 'soldier', 1696 | 'solid', 1697 | 'solution', 1698 | 'solve', 1699 | 'someone', 1700 | 'song', 1701 | 'soon', 1702 | 'sorry', 1703 | 'sort', 1704 | 'soul', 1705 | 'sound', 1706 | 'soup', 1707 | 'source', 1708 | 'south', 1709 | 'space', 1710 | 'spare', 1711 | 'spatial', 1712 | 'spawn', 1713 | 'speak', 1714 | 'special', 1715 | 'speed', 1716 | 'spell', 1717 | 'spend', 1718 | 'sphere', 1719 | 'spice', 1720 | 'spider', 1721 | 'spike', 1722 | 'spin', 1723 | 'spirit', 1724 | 'split', 1725 | 'spoil', 1726 | 'sponsor', 1727 | 'spoon', 1728 | 'sport', 1729 | 'spot', 1730 | 'spray', 1731 | 'spread', 1732 | 'spring', 1733 | 'spy', 1734 | 'square', 1735 | 'squeeze', 1736 | 'squirrel', 1737 | 'stable', 1738 | 'stadium', 1739 | 'staff', 1740 | 'stage', 1741 | 'stairs', 1742 | 'stamp', 1743 | 'stand', 1744 | 'start', 1745 | 'state', 1746 | 'stay', 1747 | 'steak', 1748 | 'steel', 1749 | 'stem', 1750 | 'step', 1751 | 'stereo', 1752 | 'stick', 1753 | 'still', 1754 | 'sting', 1755 | 'stock', 1756 | 'stomach', 1757 | 'stone', 1758 | 'stool', 1759 | 'story', 1760 | 'stove', 1761 | 'strategy', 1762 | 'street', 1763 | 'strike', 1764 | 'strong', 1765 | 'struggle', 1766 | 'student', 1767 | 'stuff', 1768 | 'stumble', 1769 | 'style', 1770 | 'subject', 1771 | 'submit', 1772 | 'subway', 1773 | 'success', 1774 | 'such', 1775 | 'sudden', 1776 | 'suffer', 1777 | 'sugar', 1778 | 'suggest', 1779 | 'suit', 1780 | 'summer', 1781 | 'sun', 1782 | 'sunny', 1783 | 'sunset', 1784 | 'super', 1785 | 'supply', 1786 | 'supreme', 1787 | 'sure', 1788 | 'surface', 1789 | 'surge', 1790 | 'surprise', 1791 | 'surround', 1792 | 'survey', 1793 | 'suspect', 1794 | 'sustain', 1795 | 'swallow', 1796 | 'swamp', 1797 | 'swap', 1798 | 'swarm', 1799 | 'swear', 1800 | 'sweet', 1801 | 'swift', 1802 | 'swim', 1803 | 'swing', 1804 | 'switch', 1805 | 'sword', 1806 | 'symbol', 1807 | 'symptom', 1808 | 'syrup', 1809 | 'system', 1810 | 'table', 1811 | 'tackle', 1812 | 'tag', 1813 | 'tail', 1814 | 'talent', 1815 | 'talk', 1816 | 'tank', 1817 | 'tape', 1818 | 'target', 1819 | 'task', 1820 | 'taste', 1821 | 'tattoo', 1822 | 'taxi', 1823 | 'teach', 1824 | 'team', 1825 | 'tell', 1826 | 'ten', 1827 | 'tenant', 1828 | 'tennis', 1829 | 'tent', 1830 | 'term', 1831 | 'test', 1832 | 'text', 1833 | 'thank', 1834 | 'that', 1835 | 'theme', 1836 | 'then', 1837 | 'theory', 1838 | 'there', 1839 | 'they', 1840 | 'thing', 1841 | 'this', 1842 | 'thought', 1843 | 'three', 1844 | 'thrive', 1845 | 'throw', 1846 | 'thumb', 1847 | 'thunder', 1848 | 'ticket', 1849 | 'tide', 1850 | 'tiger', 1851 | 'tilt', 1852 | 'timber', 1853 | 'time', 1854 | 'tiny', 1855 | 'tip', 1856 | 'tired', 1857 | 'tissue', 1858 | 'title', 1859 | 'toast', 1860 | 'tobacco', 1861 | 'today', 1862 | 'toddler', 1863 | 'toe', 1864 | 'together', 1865 | 'toilet', 1866 | 'token', 1867 | 'tomato', 1868 | 'tomorrow', 1869 | 'tone', 1870 | 'tongue', 1871 | 'tonight', 1872 | 'tool', 1873 | 'tooth', 1874 | 'top', 1875 | 'topic', 1876 | 'topple', 1877 | 'torch', 1878 | 'tornado', 1879 | 'tortoise', 1880 | 'toss', 1881 | 'total', 1882 | 'tourist', 1883 | 'toward', 1884 | 'tower', 1885 | 'town', 1886 | 'toy', 1887 | 'track', 1888 | 'trade', 1889 | 'traffic', 1890 | 'tragic', 1891 | 'train', 1892 | 'transfer', 1893 | 'trap', 1894 | 'trash', 1895 | 'travel', 1896 | 'tray', 1897 | 'treat', 1898 | 'tree', 1899 | 'trend', 1900 | 'trial', 1901 | 'tribe', 1902 | 'trick', 1903 | 'trigger', 1904 | 'trim', 1905 | 'trip', 1906 | 'trophy', 1907 | 'trouble', 1908 | 'truck', 1909 | 'true', 1910 | 'truly', 1911 | 'trumpet', 1912 | 'trust', 1913 | 'truth', 1914 | 'try', 1915 | 'tube', 1916 | 'tuition', 1917 | 'tumble', 1918 | 'tuna', 1919 | 'tunnel', 1920 | 'turkey', 1921 | 'turn', 1922 | 'turtle', 1923 | 'twelve', 1924 | 'twenty', 1925 | 'twice', 1926 | 'twin', 1927 | 'twist', 1928 | 'two', 1929 | 'type', 1930 | 'typical', 1931 | 'ugly', 1932 | 'umbrella', 1933 | 'unable', 1934 | 'unaware', 1935 | 'uncle', 1936 | 'uncover', 1937 | 'under', 1938 | 'undo', 1939 | 'unfair', 1940 | 'unfold', 1941 | 'unhappy', 1942 | 'uniform', 1943 | 'unique', 1944 | 'unit', 1945 | 'universe', 1946 | 'unknown', 1947 | 'unlock', 1948 | 'until', 1949 | 'unusual', 1950 | 'unveil', 1951 | 'update', 1952 | 'upgrade', 1953 | 'uphold', 1954 | 'upon', 1955 | 'upper', 1956 | 'upset', 1957 | 'urban', 1958 | 'urge', 1959 | 'usage', 1960 | 'use', 1961 | 'used', 1962 | 'useful', 1963 | 'useless', 1964 | 'usual', 1965 | 'utility', 1966 | 'vacant', 1967 | 'vacuum', 1968 | 'vague', 1969 | 'valid', 1970 | 'valley', 1971 | 'valve', 1972 | 'van', 1973 | 'vanish', 1974 | 'vapor', 1975 | 'various', 1976 | 'vast', 1977 | 'vault', 1978 | 'vehicle', 1979 | 'velvet', 1980 | 'vendor', 1981 | 'venture', 1982 | 'venue', 1983 | 'verb', 1984 | 'verify', 1985 | 'version', 1986 | 'very', 1987 | 'vessel', 1988 | 'veteran', 1989 | 'viable', 1990 | 'vibrant', 1991 | 'vicious', 1992 | 'victory', 1993 | 'video', 1994 | 'view', 1995 | 'village', 1996 | 'vintage', 1997 | 'violin', 1998 | 'virtual', 1999 | 'virus', 2000 | 'visa', 2001 | 'visit', 2002 | 'visual', 2003 | 'vital', 2004 | 'vivid', 2005 | 'vocal', 2006 | 'voice', 2007 | 'void', 2008 | 'volcano', 2009 | 'volume', 2010 | 'vote', 2011 | 'voyage', 2012 | 'wage', 2013 | 'wagon', 2014 | 'wait', 2015 | 'walk', 2016 | 'wall', 2017 | 'walnut', 2018 | 'want', 2019 | 'warfare', 2020 | 'warm', 2021 | 'warrior', 2022 | 'wash', 2023 | 'wasp', 2024 | 'waste', 2025 | 'water', 2026 | 'wave', 2027 | 'way', 2028 | 'wealth', 2029 | 'weapon', 2030 | 'wear', 2031 | 'weasel', 2032 | 'weather', 2033 | 'web', 2034 | 'wedding', 2035 | 'weekend', 2036 | 'weird', 2037 | 'welcome', 2038 | 'west', 2039 | 'wet', 2040 | 'whale', 2041 | 'what', 2042 | 'wheat', 2043 | 'wheel', 2044 | 'when', 2045 | 'where', 2046 | 'whip', 2047 | 'whisper', 2048 | 'wide', 2049 | 'width', 2050 | 'wife', 2051 | 'wild', 2052 | 'will', 2053 | 'win', 2054 | 'window', 2055 | 'wine', 2056 | 'wing', 2057 | 'wink', 2058 | 'winner', 2059 | 'winter', 2060 | 'wire', 2061 | 'wisdom', 2062 | 'wise', 2063 | 'wish', 2064 | 'witness', 2065 | 'wolf', 2066 | 'woman', 2067 | 'wonder', 2068 | 'wood', 2069 | 'wool', 2070 | 'word', 2071 | 'work', 2072 | 'world', 2073 | 'worry', 2074 | 'worth', 2075 | 'wrap', 2076 | 'wreck', 2077 | 'wrestle', 2078 | 'wrist', 2079 | 'write', 2080 | 'wrong', 2081 | 'yard', 2082 | 'year', 2083 | 'yellow', 2084 | 'you', 2085 | 'young', 2086 | 'youth', 2087 | 'zebra', 2088 | 'zero', 2089 | 'zone', 2090 | 'zoo', 2091 | ]; 2092 | --------------------------------------------------------------------------------