]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blobdiff - bip39-standalone.html
Test suggested word for first four letters of word
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / bip39-standalone.html
index 8476014d5debecb1b61b5310ad309b1a53b5becb..5158b108ebed17ffe074807684de320592685a40 100644 (file)
                 width: auto!important;
                 display: inline-block;
             }
-            .languages * {
+            .languages a {
                 padding-left: 10px;
             }
+            .languages a:nth-of-type(1) {
+                margin-left: -12px;
+                padding-left: 0;
+            }
             .monospace {
                 font-family: monospace;
             }
             .card-suit.spade {
                 color: #000;
             }
+            .qr-container {
+                position: fixed;
+                top: 0;
+                right: 0;
+                text-align: center;
+                background-color: #FFF;
+                border: 1px solid #CCC;
+            }
+            .qr-image {
+                margin: 5px;
+            }
+            .qr-hint,
+            .qr-warning {
+                padding: 2px;
+                max-width: 150px;
+            }
+            .more-info {
+                cursor: help;
+                border-bottom: 1px dashed #000;
+                text-decoration: none;
+            }
         </style>
     </head>
     <body>
                         <div class="form-group">
                             <div class="col-sm-2"></div>
                             <div class="col-sm-10">
-                                <p>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum)</p>
-                                <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a></p>
+                                <p data-translate>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).</p>
+                                <p data-translate-html>
+                                    For more info see the
+                                    <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a>.
+                                </p>
                             </div>
                         </div>
                         <div class="form-group generate-container">
                             <div class="col-sm-10">
                                 <div class="form-inline">
                                     <div class="input-group-inline">
+                                        <span data-translate>Generate a random mnemonic, or enter your own below</span>:
                                         <button class="btn generate">Generate</button>
-                                        <span>a random</span>
                                         <select id="strength" class="strength form-control">
                                             <option value="3">3</option>
                                             <option value="6">6</option>
                                             <option value="21">21</option>
                                             <option value="24">24</option>
                                         </select>
-                                        word mnemonic, or enter your own below.
+                                        <span data-translate>words</span>
                                     </div>
                                 </div>
                             </div>
                         </div>
                         <div class="entropy-container hidden">
                             <div class="form-group text-danger">
-                                <label class="col-sm-2 control-label">Warning</label>
+                                <label class="col-sm-2 control-label" data-translate>Warning</label>
                                 <div class="col-sm-10 form-control-static">
-                                    Entropy is an advanced feature.
-                                    Your mnemonic may be insecure if this feature is used incorrectly.
-                                    <a href="#entropy-notes">Read more</a>
+                                    <span data-translate>Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.</span>
+                                    <a href="#entropy-notes" data-translate>Read more</a>
                                 </div>
                             </div>
                             <div class="form-group">
-                                <label for="entropy" class="col-sm-2 control-label">Entropy</label>
+                                <label for="entropy" class="col-sm-2 control-label" data-translate>Entropy</label>
                                 <div class="col-sm-7">
-                                    <textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards"></textarea>
+                                    <textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea>
                                     <div class="row">
-                                        <label class="col-sm-3 control-label">Strength</label>
+                                        <label class="col-sm-3 control-label" data-translate>Strength</label>
                                         <div class="strength col-sm-3 form-control-static"></div>
-                                        <label class="col-sm-3 control-label">Event Count</label>
+                                        <label class="col-sm-3 control-label" data-translate>Event Count</label>
                                         <div class="event-count col-sm-3 form-control-static"></div>
                                     </div>
                                     <div class="row">
-                                        <label class="col-sm-3 control-label">Entropy Type</label>
+                                        <label class="col-sm-3 control-label" data-translate>Entropy Type</label>
                                         <div class="type col-sm-3 form-control-static"></div>
-                                        <label class="col-sm-3 control-label">Bits Per Event</label>
+                                        <label class="col-sm-3 control-label" data-translate>Bits Per Event</label>
                                         <div class="bits-per-event col-sm-3 form-control-static"></div>
                                     </div>
                                     <div class="row">
-                                        <label class="col-sm-3 control-label">Word Count</label>
+                                        <label class="col-sm-3 control-label" data-translate>Word Count</label>
                                         <div class="word-count col-sm-3 form-control-static"></div>
-                                        <label class="col-sm-3 control-label">Total Bits</label>
+                                        <label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Total bits of entropy may be less than indicated if any entropy event uses a weak source.">Total Bits</span></label>
                                         <div class="bits col-sm-3 form-control-static"></div>
                                     </div>
-                                    <label class="col-sm-3 control-label">Filtered Entropy</label>
+                                    <label class="col-sm-3 control-label" data-translate>Filtered Entropy</label>
                                     <div class="filtered col-sm-9 form-control-static"></div>
-                                    <label class="col-sm-3 control-label">Raw Binary</label>
+                                    <label class="col-sm-3 control-label" data-translate>Raw Binary</label>
                                     <div class="binary col-sm-9 form-control-static"></div>
-                                    <label class="col-sm-3 control-label">Mnemonic Length</label>
+                                    <label class="col-sm-3 control-label" data-translate>Mnemonic Length</label>
                                     <div class="col-sm-9">
                                         <select class="mnemonic-length form-control">
-                                            <option value="raw">From entropy length (3 words per 32 bits)</option>
-                                            <option value="12">12 Words</option>
-                                            <option value="15">15 Words</option>
-                                            <option value="18">18 Words</option>
-                                            <option value="21">21 Words</option>
-                                            <option value="24">24 Words</option>
+                                            <option value="raw" data-translate>From entropy length (3 words per 32 bits)</option>
+                                            <option value="12">12 <span data-translate>Words</span></option>
+                                            <option value="15" selected>15 <span data-translate>Words</option>
+                                            <option value="18">18 <span data-translate>Words</span></option>
+                                            <option value="21">21 <span data-translate>Words</span></option>
+                                            <option value="24">24 <span data-translate>Words</span></option>
                                         </select>
                                     </div>
                                 </div>
                                 <div class="col-sm-3">
-                                    <p>Valid entropy values include:</p>
+                                    <p data-translate>Valid entropy values include:</p>
                                     <ul>
-                                        <li><strong>Binary</strong> [0-1]<br>101010011</li>
-                                        <li><strong>Base 6</strong> [0-5]<br>123434014</li>
-                                        <li><strong>Dice</strong> [1-6]<br>62535634</li>
-                                        <li><strong>Base 10</strong> [0-9]<br>90834528</li>
-                                        <li><strong>Hex</strong> [0-9A-F]<br>4187a8bfd9</li>
-                                        <li><strong>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li>
+                                        <li><strong data-translate>Binary</strong> [0-1]<br>101010011</li>
+                                        <li><strong data-translate>Base 6</strong> [0-5]<br>123434014</li>
+                                        <li><strong data-translate>Dice</strong> [1-6]<br>62535634</li>
+                                        <li><strong data-translate>Base 10</strong> [0-9]<br>90834528</li>
+                                        <li><strong data-translate>Hex</strong> [0-9A-F]<br>4187a8bfd9</li>
+                                        <li><strong data-translate>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li>
                                     </ul>
                                 </div>
                             </div>
                             <div class="col-sm-10 checkbox">
                                 <label>
                                     <input type="checkbox" class="use-entropy">
-                                    Supply my own source of entropy
+                                    <span data-translate>Supply my own source of entropy</span>
                                 </label>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label class="col-sm-2 control-label"></label>
+                            <label class="col-sm-2 control-label" data-translate>Mnemonic Language</label>
                             <div class="col-sm-10 languages">
-                                <a href="#english">English</a>
-                                <a href="#japanese" title="Japanese">日本語</a>
-                                <a href="#spanish"  title="Spanish">Español</a>
-                                <a href="#chinese_simplified"  title="Chinese (Simplified)">中文(简体)</a>
-                                <a href="#chinese_traditional"  title="Chinese (Traditional)">中文(繁體)</a>
-                                <a href="#french"  title="French">Français</a>
-                                <a href="#italian"  title="Italian">Italiano</a>
+                                <div class="form-control no-border">
+                                    <a href="#english">English</a>
+                                    <a href="#japanese" title="Japanese">日本語</a>
+                                    <a href="#spanish"  title="Spanish">Español</a>
+                                    <a href="#chinese_simplified"  title="Chinese (Simplified)">中文(简体)</a>
+                                    <a href="#chinese_traditional"  title="Chinese (Traditional)">中文(繁體)</a>
+                                    <a href="#french"  title="French">Français</a>
+                                    <a href="#italian"  title="Italian">Italiano</a>
+                                </div>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="phrase" class="col-sm-2 control-label">BIP39 Mnemonic</label>
+                            <label for="phrase" class="col-sm-2 control-label" data-translate>BIP39 Mnemonic</label>
                             <div class="col-sm-10">
-                                <textarea id="phrase" class="phrase form-control"></textarea>
+                                <textarea id="phrase" class="phrase form-control" data-show-qr></textarea>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="passphrase" class="col-sm-2 control-label">BIP39 Passphrase (optional)</label>
+                            <label for="passphrase" class="col-sm-2 control-label" data-translate>BIP39 Passphrase (optional)</label>
                             <div class="col-sm-10">
                                 <textarea id="passphrase" class="passphrase form-control"></textarea>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="seed" class="col-sm-2 control-label">BIP39 Seed</label>
+                            <label for="seed" class="col-sm-2 control-label" data-translate>BIP39 Seed</label>
                             <div class="col-sm-10">
-                                <textarea id="seed" class="seed form-control" readonly="readonly"></textarea>
+                                <textarea id="seed" class="seed form-control" readonly="readonly" data-show-qr></textarea>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="network-phrase" class="col-sm-2 control-label">Coin</label>
+                            <label for="network-phrase" class="col-sm-2 control-label" data-translate>Coin</label>
                             <div class="col-sm-10">
                                 <select id="network-phrase" class="network form-control">
                                     <!-- populated by javascript -->
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="root-key" class="col-sm-2 control-label">BIP32 Root Key</label>
+                            <label for="root-key" class="col-sm-2 control-label" data-translate>BIP32 Root Key</label>
                             <div class="col-sm-10">
-                                <textarea id="root-key" class="root-key form-control"></textarea>
+                                <textarea id="root-key" class="root-key form-control" data-show-qr></textarea>
                             </div>
                         </div>
                     </form>
                                 <br>
                                 <div class="col-sm-2"></div>
                                 <div class="col-sm-10">
-                                    <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a></p>
+                                    <p data-translate-html>
+                                        For more info see the
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a>.
+                                    </p>
                                 </div>
                                 <div class="form-group">
                                     <label for="purpose" class="col-sm-2 control-label">
-                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank">Purpose</a>
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank" data-translate>Purpose</a>
                                     </label>
                                     <div class="col-sm-10">
                                         <input id="purpose" type="text" class="purpose form-control" value="44">
                                 </div>
                                 <div class="form-group">
                                     <label for="coin" class="col-sm-2 control-label">
-                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank">Coin</a>
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank" data-translate>Coin</a>
                                     </label>
                                     <div class="col-sm-10">
                                         <input id="coin" type="text" class="coin form-control" value="0">
                                 </div>
                                 <div class="form-group">
                                     <label for="account" class="col-sm-2 control-label">
-                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank">Account</a>
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank" data-translate>Account</a>
                                     </label>
                                     <div class="col-sm-10">
                                         <input id="account" type="text" class="account form-control" value="0">
                                 </div>
                                 <div class="form-group">
                                     <label for="change" class="col-sm-2 control-label">
-                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank">External / Internal</a>
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank" data-translate>External / Internal</a>
                                     </label>
                                     <div class="col-sm-10">
                                         <input id="change" type="text" class="change form-control" value="0">
                                     </div>
                                 </div>
                                 <div class="form-group">
-                                    <label for="bip44-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
+                                    <label class="col-sm-2 control-label">
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <p data-translate>The account extended keys can be used for importing to most BIP44 compatible wallets, such as mycelium or electrum.</p>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="account-xprv" class="col-sm-2 control-label">
+                                        <span data-translate>Account Extended Private Key</span>
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="account-xpub" class="col-sm-2 control-label">
+                                        <span data-translate>Account Extended Public Key</span>
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-2 control-label">
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <p data-translate>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="bip44-path" class="col-sm-2 control-label" data-translate>BIP32 Derivation Path</label>
                                     <div class="col-sm-10">
                                         <input id="bip44-path" type="text" class="path form-control" value="m/44'/0'/0'/0" readonly="readonly">
                                     </div>
                                 <br>
                                 <div class="col-sm-2"></div>
                                 <div class="col-sm-10">
-                                    <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a></p>
+                                    <p data-translate>
+                                        For more info see the
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a>
+                                    </p>
                                 </div>
                                 <div class="form-group">
-                                    <label for="bip32-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
+                                    <label for="bip32-path" class="col-sm-2 control-label" data-translate>BIP32 Derivation Path</label>
                                     <div class="col-sm-10">
                                         <input id="bip32-path" type="text" class="path form-control" value="m/0">
                                     </div>
                                     <div class="col-sm-2"></div>
                                     <label class="col-sm-10">
                                         <input class="hardened-addresses" type="checkbox">
-                                        Use hardened addresses
+                                        <span data-translate>Use hardened addresses</span>
                                     </label>
                                 </div>
                                 <div class="form-group">
-                                    <label class="col-sm-2 control-label">Hive Wallet</label>
+                                    <label for="core-path" class="col-sm-2 control-label" data-translate>Bitcoin Core</label>
                                     <div class="col-sm-10">
-                                        <p class="form-control no-border">
-                                        Use path <code>m/0'/0</code>.
-                                        For more info see the <a href="https://www.hivewallet.com/" target="_blank">Hive Wallet homepage</a>
+                                        <p class="form-control no-border" data-translate-html>
+                                        Use path <code>m/0'/0'</code> with hardened addresses.
                                         </p>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <label for="mycelium-path" class="col-sm-2 control-label">Mycelium Wallet</label>
-                                    <div class="col-sm-10">
-                                        <p class="form-control no-border">
-                                        Use path <code>m/44'/0'/0'/0</code>.
-                                        For more info see the <a href="http://www.mycelium.com/" target="_blank">Mycelium Wallet homepage</a>
+                                        <p class="form-control no-border" data-translate-html>
+                                            For more info see the
+                                            <a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a>
                                         </p>
                                     </div>
                                 </div>
                                 <div class="form-group">
-                                    <label for="core-path" class="col-sm-2 control-label">Bitcoin Core</label>
+                                    <label class="col-sm-2 control-label" data-translate>Block Explorers</label>
                                     <div class="col-sm-10">
                                         <p class="form-control no-border">
-                                        Use path <code>m/0'/0'</code> with hardened addresses.
-                                        For more info see the <a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a>
+                                            <span data-translate-html>Use path <code>m/44'/0'/0'</code>.</span>
+                                            <span data-translate-html>Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.</span>
                                         </p>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <label class="col-sm-2 control-label">Block Explorers</label>
-                                    <div class="col-sm-10">
                                         <p class="form-control no-border">
-                                        Use path <code>m/44'/0'/0'</code>.
-                                        Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xpriv</code> key.
+                                            <span data-translate>Can be used with</span>:
+                                            <a href="https://blockchain.info/" target="_blank">blockchain.info</a>
                                         </p>
                                     </div>
                                 </div>
                     </div>
                     <form class="form-horizontal" role="form">
                         <div class="form-group">
-                            <label for="extended-priv-key" class="col-sm-2 control-label">BIP32 Extended Key</label>
+                            <label for="extended-priv-key" class="col-sm-2 control-label" data-translate>BIP32 Extended Private Key</label>
                             <div class="col-sm-10">
-                                <textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly"></textarea>
+                                <textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly" data-show-qr></textarea>
                             </div>
                         </div>
                         <div class="form-group">
-                            <label for="extended-pub-key" class="col-sm-2 control-label">BIP32 Extended Key (addresses only)</label>
+                            <label for="extended-pub-key" class="col-sm-2 control-label" data-translate>BIP32 Extended Public Key</label>
                             <div class="col-sm-10">
-                                <textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly"></textarea>
+                                <textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly" data-show-qr></textarea>
                             </div>
                         </div>
                     </form>
             <div class="row">
                 <div class="col-md-12">
                     <h2>Derived Addresses</h2>
-                    <p>Note these addreses are derived from the <strong>BIP32 Extended Key</strong></p>
+                    <p data-translate>Note these addreses are derived from the BIP32 Extended Key</p>
                     <table class="table table-striped">
                         <thead>
                             <th>
                                 <div class="input-group">
-                                    Path&nbsp;&nbsp;
-                                    <button class="index-toggle">Toggle</button>
+                                    <span data-translate>Path</span>&nbsp;&nbsp;
+                                    <button class="index-toggle" data-translate>Toggle</button>
                                 </div>
                             </th>
                             <th>
                                 <div class="input-group">
-                                    Address&nbsp;&nbsp;
-                                    <button class="address-toggle">Toggle</button>
+                                    <span data-translate>Address</span>&nbsp;&nbsp;
+                                    <button class="address-toggle" data-translate>Toggle</button>
                                 </div>
                             </th>
                             <th>
                                 <div class="input-group">
-                                    Public Key&nbsp;&nbsp;
-                                    <button class="public-key-toggle">Toggle</button>
+                                    <span data-translate>Public Key</span>&nbsp;&nbsp;
+                                    <button class="public-key-toggle" data-translate>Toggle</button>
                                 </div>
                             </th>
                             <th>
                                 <div class="input-group">
-                                    Private Key&nbsp;&nbsp;
-                                    <button class="private-key-toggle">Toggle</button>
+                                    <span data-translate>Private Key</span>&nbsp;&nbsp;
+                                    <button class="private-key-toggle" data-translate>Toggle</button>
                                 </div>
                             </th>
                         </thead>
                         <tbody class="addresses monospace">
-                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
-                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
-                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
-                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
-                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
+                            <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
                         </tbody>
                     </table>
                 </div>
             </div>
-            <span>Show next </button>
+            <span data-translate>Show more rows</span>:
             <input type="number" class="rows-to-add" value="20">
-            <button class="more">Show</button>
+            <button class="more" data-translate>Show</button>
 
             <hr>
 
             <div class="row">
                 <div class="col-md-12">
-                    <h2>More info</h2>
-                    <h3>BIP39 <span class="small">Mnemonic code for generating deterministic keys</span></h3>
-                    <p>
+                    <h2 data-translate>More info</h2>
+                    <h3>BIP39 <span class="small" data-translate>Mnemonic code for generating deterministic keys</span></h3>
+                    <p data-translate-html>
                         Read more at the
                         <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec</a>
                     </p>
-                    <h3>BIP32 <span class="small">Hierarchical Deterministic Wallets</span></h3>
-                    <p>
+                    <h3>BIP32 <span class="small" data-translate>Hierarchical Deterministic Wallets</span></h3>
+                    <p data-translate-html>
                         Read more at the
                         <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">official BIP32 spec</a>
-                        and see the demo at
+                    </p>
+                    <p data-translate-html>
+                        See the demo at
                         <a href="http://bip32.org/" target="_blank">bip32.org</a>
                     </p>
-                    <h3>BIP44 <span class="small">Multi-Account Hierarchy for Deterministic Wallets</span></h3>
-                    <p>
+                    <h3>BIP44 <span class="small" data-translate>Multi-Account Hierarchy for Deterministic Wallets</span></h3>
+                    <p data-translate-html>
                         Read more at the
                         <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a>
                     </p>
-                    <h3>Private Keys</h3>
+                    <h3 data-translate>Private Keys</h3>
+                    <p>
+                        <span data-translate-html>
+                            Use private keys at
+                            <a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>.
+                        </span>
+                        <span data-translate>Be careful - it can be easy to make mistakes if you don't know what you're doing.</span>
+                    </p>
+                    <h3 id="entropy-notes" data-translate>Entropy</h3>
+                    <p>
+                        <span data-translate-html>
+                            Entropy values must be sourced from a
+                            <a href="https://en.wikipedia.org/wiki/Random_number_generation" target="_blank">strong source of randomness</a>.
+                        </span>
+                        <span data-translate>This means flipping a fair coin, rolling a fair dice, noise measurements etc.</span>
+                        <span data-translate-html>
+                            Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address,
+                            keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't
+                            random enough for the needs of this tool.
+                        </span>
+                    </p>
+                    <p>
+                        <strong><span data-translate>Do not store entropy.</span></strong>
+                    </p>
                     <p>
-                        Use private keys at
-                        <a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>,
-                        but be careful - it can be easy to make mistakes if you
-                        don't know what you're doing
+                        <span data-translate>Storing entropy (such as keeping a deck of cards in a specific shuffled order) is unreliable compared to storing a mnemonic.</span>
+                        <span data-translate>Instead of storing entropy, store the mnemonic generated from the entropy.</span>
+                        <span data-translate-html><a href="https://en.wikipedia.org/wiki/Steganography#Physical" target="_blank">Steganography</a> may be beneficial when storing the mnemonic.</span>
                     </p>
-                    <h3 id="entropy-notes">Entropy</h3>
                     <p>
-                    Entropy values must be sourced from a
-                    <a href="https://en.wikipedia.org/wiki/Random_number_generation" target="_blank">strong source of randomness</a>.
-                    This means flipping a fair coin, rolling a fair dice, noise measurements etc. Do <strong>NOT</strong> use
-                    phrases from books, lyrics from songs, your birthday or steet address, keyboard mashing, or anything you <i>think</i>
-                    is random, because chances are <em>overwhelming</em> that it isn't random enough for the needs of this tool.
+                        <span data-translate-html>
+                            The random mnemonic generator on this page uses a
+                            <a href="https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues" target="_blank">cryptographically secure random number generator</a>.
+                        </span>
+                        <span data-translate>The built in random generator can generally be trusted more than your own intuition about randomness.</span>
+                        <span data-translate>If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.</span>
+                        <span data-translate>In that case you might choose to use your own source of entropy.</span>
                     </p>
                     <p>
-                    The random mnemonic generator on this page uses a
-                    <a href="https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues" target="_blank">cryptographically secure random number generator</a>,
-                    and can generally be trusted more than your own intuition about randomness.
-                    If cryptographic randomness isn't available in your browser, this page will show a warning and <i>will not generate
-                    random mnemonics</i>.
+                        <a href="https://bitcointalk.org/index.php?topic=311000.msg3345309#msg3345309" target="_blank" data-translate>You are not a good source of entropy.</a>
                     </p>
+                    <h3 data-translate>License</h3>
                     <p>
-                    <a href="https://bitcointalk.org/index.php?topic=311000.msg3345309#msg3345309" target="_blank">You are not a good source of entropy.</a>
+                    <span data-translate-html>Please refer to <a href="https://github.com/iancoleman/bip39/blob/master/LICENSE" target="_blank">the software license</a> for more detail.
+                    </span>
                     </p>
+                    <p data-translate>The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.</p>
                 </div>
             </div>
 
             <div class="row">
                 <div class="col-md-12">
 
-                    <h2>Offline Usage</h2>
+                    <h2 data-translate>Offline Usage</h2>
 
-                    <p>
+                    <p data-translate>
                     You can use this tool without having to be online.
                     </p>
-                    <p>
+                    <p data-translate>
                     In your browser, select file save-as, and save this page
                     as a file.
                     </p>
-                    <p>
+                    <p data-translate>
                     Double-click that file to open it in a browser
                     on any offline computer.
                     </p>
                     <p>
-                    Alternatively, download it from
-                    <a href="https://github.com/iancoleman/bip39">
-                        https://github.com/iancoleman/bip39
-                    </a>
+                    <span data-translate>Alternatively, download the file from the repository</span>
+                    -
+                    <a href="https://github.com/iancoleman/bip39">https://github.com/iancoleman/bip39</a>
+                    </p>
 
                 </div>
             </div>
             <div class="row">
                 <div class="col-md-12">
 
-                    <h2>This project is 100% open-source code</h2>
+                    <h2 data-translate>This project is 100% open-source code</h2>
 
                     <p>
-                        <span>Get the source code at - </span>
+                        <span data-translate>Get the source code from the repository</span>
+                        -
                         <a href="https://github.com/iancoleman/bip39" target="_blank">
                             https://github.com/iancoleman/bip39
                         </a>
                     </p>
 
-                    <h3>Libraries</h3>
+                    <h3 data-translate>Libraries</h3>
 
                     <p>
                         <span>BitcoinJS - </span>
 
         </div>
 
+        <div class="qr-container hidden">
+            <div class="qr-hint bg-primary hidden" data-translate>Click field to hide QR</div>
+            <div class="qr-hint bg-primary" data-translate>Click field to show QR</div>
+            <div class="qr-hider hidden">
+                <div class="qr-image"></div>
+                <div class="qr-warning bg-primary" data-translate>Caution: Scanner may keep history</div>
+            </div>
+        </div>
+
         <div class="feedback-container">
             <div class="feedback">Loading...</div>
         </div>
         <script type="text/template" id="address-row-template">
             <tr>
                 <td class="index"><span></span></td>
-                <td class="address"><span></span></td>
-                <td class="pubkey"><span></span></td>
-                <td class="privkey"><span></span></td>
+                <td class="address"><span data-show-qr></span></td>
+                <td class="pubkey"><span data-show-qr></span></td>
+                <td class="privkey"><span data-show-qr></span></td>
             </tr>
         </script>
         <script>/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
@@ -789,6 +877,35 @@ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires j
   }
 }());
 
+</script>
+        <script>(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
+write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
+for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
+7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
+0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
+setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
+j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
+b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
+c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
+0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
+(d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
+78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
+j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
+a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
+a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
+2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
+LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
+this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
+[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
+116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
+43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
+3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
+55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
+45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
+(a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
+correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
+j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
+d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;$(a).appendTo(this)})}})($);
 </script>
         <script>(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.bitcoin = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
 // (public) Constructor
@@ -14600,6 +14717,255 @@ sjcl.hash.sha256.prototype = {
     h[7] = h[7]+h7 | 0;
   }
 };
+</script>
+        <script>// An extremely basic translation library
+//
+// Example usage:
+//
+// Set some html to be translated. Do this using the 'data-translate' attribute:
+//
+//   <div data-translate>Test</div>
+//   <div data-translate-html><em>keep em tag</em></div>
+//   <input data-translate-placeholder placeholder="Example placeholder">
+//   <span data-translate-title title="Example title"></span>
+//
+// Obtain all the phrases to be translated via js debug console:
+//
+//   Translate.phrasesAsJson();
+//
+// Use that template to translate the phrases into another language.
+// Leave the key the same. Change the value to the new language.
+//
+// Create a js file to load the new phrases. In this example for Spanish,
+// es.js will contain the following code:
+//
+//   Translate.loadForeignPhrases("es", {
+//       "Test": "Test in Spanish",
+//       "<em>keep em tag</em>": "<em>keep em tag in Spanish</em>",
+//       "Example placeholder": "Example placeholder in Spanish"
+//       "Example title": "Example title in Spanish"
+//   });
+//
+// In your UI put a listener for clicking on the Spanish button:
+//
+//   mySpanishButton.addEventListener("click", function() {
+//       Translate.setLanguage("es");
+//   });
+//   myEnglishButton.addEventListener("click", function() {
+//       Translate.setLanguage("en");
+//   });
+
+Translate = new (function() {
+
+    var defaultLanguage = "en";
+
+    var allPhrases = {};
+    allPhrases[defaultLanguage] = {};
+
+    // Node types
+
+    var text = {
+        selector: "[data-translate]",
+        getKey: function() {
+            return this.textContent.trim().replace(/\s+/g, " ");
+        },
+        setPhrase: function(p) {
+            this.textContent = p;
+        },
+    }
+
+    var html = {
+        selector: "[data-translate-html]",
+        getKey: function() {
+            return this.innerHTML.trim().replace(/\s+/g, " ");
+        },
+        setPhrase: function(p) {
+            this.innerHTML = p;
+        },
+    }
+
+    var placeholder = {
+        selector: "[data-translate-placeholder]",
+        getKey: function() {
+            return this.getAttribute("placeholder").trim().replace(/\s+/g, " ");
+        },
+        setPhrase: function(p) {
+            this.setAttribute("placeholder", p);
+        },
+    }
+
+    var title = {
+        selector: "[data-translate-title]",
+        getKey: function() {
+            return this.getAttribute("title").trim().replace(/\s+/g, " ");
+        },
+        setPhrase: function(p) {
+            this.setAttribute("title", p);
+        },
+    }
+
+    // Get elements to be translated
+    var allEls = getEls(text)
+        .concat(getEls(html))
+        .concat(getEls(placeholder))
+        .concat(getEls(title));
+
+    // Provides access to phrases from a non-default language.
+    // See phrases_en.js for example usage.
+    this.loadForeignPhrases = function(language, phrases) {
+        allPhrases[language] =  phrases;
+    }
+
+    // Displays a different language, eg "en" or "fr"
+    this.setLanguage = function(language) {
+        for (var i=0; i<allEls.length; i++) {
+            var el = allEls[i];
+            var key = el.key;
+            if (!(language in allPhrases)) {
+                console.log(language + " not in allPhrases");
+                return;
+            }
+            if (!(key in allPhrases[language])) {
+                console.log(language + " does not contain phrase: " + key);
+                return;
+            }
+            var phrase = allPhrases[language][key];
+            el.setPhrase(phrase);
+        }
+    }
+
+    // Converts the phrases to a key-pair json file.
+    // This is a good way to export phrases for use in translation tools.
+    this.phrasesAsJson = function(language) {
+        var keys = [];
+        for (var i=0; i<allEls.length; i++) {
+            var el = allEls[i];
+            var key = el.key;
+            keys.push(key);
+        }
+        keys.sort();
+        var output = {};
+        for (var i=0; i<keys.length; i++) {
+            var key = keys[i];
+            var translated = "";
+            if (language in allPhrases && key in allPhrases[language]) {
+                translated = allPhrases[language][key];
+            }
+            output[key] = translated;
+        }
+        return JSON.stringify(output, null, 2);
+    }
+
+    function getEls(nodeType) {
+        var nodes = document.querySelectorAll(nodeType.selector);
+        var els = [];
+        for (var i=0; i<nodes.length; i++) {
+            var node = nodes[i];
+            node.getKey = nodeType.getKey;
+            node.setPhrase = nodeType.setPhrase;
+            node.key = node.getKey();
+            allPhrases[defaultLanguage][node.key] = node.key;
+            els.push(node);
+        }
+        return els;
+    }
+
+})();
+</script>
+        <script>Translate.loadForeignPhrases("en",
+{
+  "<code>m/44'/0'/0'/0</code> generates public addresses": "<code>m/44'/0'/0'/0</code> generates public addresses",
+  "<code>m/44'/0'/0'/1</code> generates change addresses": "<code>m/44'/0'/0'/1</code> generates change addresses",
+  "<code>m/44'/0'/0'</code> generates extended keys for import / export": "<code>m/44'/0'/0'</code> generates extended keys for import / export",
+  "<code>m/44'/0'/1'</code> for the next account. Continue incrementing for more accounts (most use a single account).": "<code>m/44'/0'/1'</code> for the next account. Continue incrementing for more accounts (most use a single account).",
+  "Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards": "Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards",
+  "Account": "Account",
+  "Address": "Address",
+  "Alternatively, download the file from the repository": "Alternatively, download the file from the repository",
+  "BIP32 Derivation Path": "BIP32 Derivation Path",
+  "BIP32 Extended Key": "BIP32 Extended Key",
+  "BIP32 Extended Key (addresses only)": "BIP32 Extended Key (addresses only)",
+  "BIP32 Root Key": "BIP32 Root Key",
+  "BIP39 Mnemonic": "BIP39 Mnemonic",
+  "BIP39 Passphrase (optional)": "BIP39 Passphrase (optional)",
+  "BIP39 Seed": "BIP39 Seed",
+  "Base 10": "Base 10",
+  "Base 6": "Base 6",
+  "Be careful - it can be easy to make mistakes if you don't know what you're doing.": "Be careful - it can be easy to make mistakes if you don't know what you're doing.",
+  "Binary": "Binary",
+  "Bitcoin Core": "Bitcoin Core",
+  "Bits Per Event": "Bits Per Event",
+  "Block Explorers": "Block Explorers",
+  "Can be used with": "Can be used with",
+  "Card": "Card",
+  "Coin": "Coin",
+  "Dice": "Dice",
+  "Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address, keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't random enough for the needs of this tool.": "Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address, keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't random enough for the needs of this tool.",
+  "Double-click that file to open it in a browser on any offline computer.": "Double-click that file to open it in a browser on any offline computer.",
+  "Entropy": "Entropy",
+  "Entropy Type": "Entropy Type",
+  "Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.": "Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.",
+  "Entropy values must be sourced from a <a href=\"https://en.wikipedia.org/wiki/Random_number_generation\" target=\"_blank\">strong source of randomness</a>.": "Entropy values must be sourced from a <a href=\"https://en.wikipedia.org/wiki/Random_number_generation\" target=\"_blank\">strong source of randomness</a>.",
+  "Event Count": "Event Count",
+  "External / Internal": "External / Internal",
+  "Filtered Entropy": "Filtered Entropy",
+  "For more info see the <a href=\"http://www.mycelium.com/\" target=\"_blank\">Mycelium Wallet homepage</a>": "For more info see the <a href=\"http://www.mycelium.com/\" target=\"_blank\">Mycelium Wallet homepage</a>",
+  "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\" target=\"_blank\">BIP39 spec</a>.": "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\" target=\"_blank\">BIP39 spec</a>.",
+  "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">BIP44 spec</a>.": "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">BIP44 spec</a>.",
+  "For more info see the <a href=\"https://github.com/bitcoin/bitcoin/pull/8035\" target=\"_blank\">Bitcoin Core BIP32 implementation</a>": "For more info see the <a href=\"https://github.com/bitcoin/bitcoin/pull/8035\" target=\"_blank\">Bitcoin Core BIP32 implementation</a>",
+  "For more info see the BIP32 spec": "For more info see the BIP32 spec",
+  "From entropy length (3 words per 32 bits)": "From entropy length (3 words per 32 bits)",
+  "Generate a random mnemonic, or enter your own below": "Generate a random mnemonic, or enter your own below",
+  "Get the source code from the repository": "Get the source code from the repository",
+  "Hex": "Hex",
+  "Hierarchical Deterministic Wallets": "Hierarchical Deterministic Wallets",
+  "If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.": "If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.",
+  "In that case you might choose to use your own source of entropy.": "In that case you might choose to use your own source of entropy.",
+  "In your browser, select file save-as, and save this page as a file.": "In your browser, select file save-as, and save this page as a file.",
+  "Libraries": "Libraries",
+  "Mnemonic Language": "Mnemonic Language",
+  "Mnemonic Length": "Mnemonic Length",
+  "Mnemonic code for generating deterministic keys": "Mnemonic code for generating deterministic keys",
+  "More info": "More info",
+  "Multi-Account Hierarchy for Deterministic Wallets": "Multi-Account Hierarchy for Deterministic Wallets",
+  "Mycelium Wallet": "Mycelium Wallet",
+  "Note these addreses are derived from the BIP32 Extended Key": "Note these addreses are derived from the BIP32 Extended Key",
+  "Offline Usage": "Offline Usage",
+  "Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.": "Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.",
+  "Path": "Path",
+  "Private Key": "Private Key",
+  "Private Keys": "Private Keys",
+  "Public Key": "Public Key",
+  "Purpose": "Purpose",
+  "Raw Binary": "Raw Binary",
+  "Read more": "Read more",
+  "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\" target=\"_blank\">official BIP32 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\" target=\"_blank\">official BIP32 spec</a>",
+  "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\">official BIP39 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\">official BIP39 spec</a>",
+  "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">official BIP44 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">official BIP44 spec</a>",
+  "See the demo at <a href=\"http://bip32.org/\" target=\"_blank\">bip32.org</a>": "See the demo at <a href=\"http://bip32.org/\" target=\"_blank\">bip32.org</a>",
+  "Show": "Show",
+  "Show more rows": "Show more rows",
+  "Strength": "Strength",
+  "Supply my own source of entropy": "Supply my own source of entropy",
+  "The built in random generator can generally be trusted more than your own intuition about randomness.": "The built in random generator can generally be trusted more than your own intuition about randomness.",
+  "The random mnemonic generator on this page uses a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues\" target=\"_blank\">cryptographically secure random number generator</a>.": "The random mnemonic generator on this page uses a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues\" target=\"_blank\">cryptographically secure random number generator</a>.",
+  "This means flipping a fair coin, rolling a fair dice, noise measurements etc.": "This means flipping a fair coin, rolling a fair dice, noise measurements etc.",
+  "This project is 100% open-source code": "This project is 100% open-source code",
+  "Toggle": "Toggle",
+  "Total Bits": "Total Bits",
+  "Use hardened addresses": "Use hardened addresses",
+  "Use path <code>m/0'/0'</code> with hardened addresses.": "Use path <code>m/0'/0'</code> with hardened addresses.",
+  "Use path <code>m/44'/0'/0'</code>.": "Use path <code>m/44'/0'/0'</code>.",
+  "Use private keys at <a href=\"https://web.archive.org/web/20150707020924/https://brainwallet.org/\" target=\"_blank\">brainwallet.org</a>.": "Use private keys at <a href=\"https://web.archive.org/web/20150707020924/https://brainwallet.org/\" target=\"_blank\">brainwallet.org</a>.",
+  "Valid entropy values include:": "Valid entropy values include:",
+  "Warning": "Warning",
+  "Word Count": "Word Count",
+  "You are not a good source of entropy.": "You are not a good source of entropy.",
+  "You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).": "You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).",
+  "You can use this tool without having to be online.": "You can use this tool without having to be online.",
+  "words": "words"
+}
+);
 </script>
         <script>WORDLISTS = typeof WORDLISTS == "undefined" ? {} : WORDLISTS;
 WORDLISTS["english"] = [
@@ -17949,6 +18315,8 @@ var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o
 
 window.Entropy = new (function() {
 
+    var TWO = new BigInteger(2);
+
     // matchers returns an array of the matched events for each type of entropy.
     // eg
     // matchers.binary("010") returns ["0", "1", "0"]
@@ -18051,39 +18419,13 @@ window.Entropy = new (function() {
         while (entropyBin.length < expectedBits) {
             entropyBin = "0" + entropyBin;
         }
-        // Assume cards are NOT replaced.
-        // Additional entropy decreases as more cards are used. This means
-        // total possible entropy is measured using n!, not base^n.
-        // eg the second last card can be only one of two, not one of fifty two
-        // so the added entropy for that card is only one bit at most
+        // Calculate the number of bits per event
+        var bitsPerEvent = Math.log2(base.asInt);
+        // Cards binary must be handled differently, since they're not replaced
         if (base.asInt == 52) {
-            // Get the maximum value WITHOUT replacement
-            var totalDecks = Math.ceil(base.parts.length / 52);
-            var totalCards = totalDecks * 52;
-            var totalCombos = factorial(52).pow(totalDecks);
-            var totalRemainingCards = totalCards - base.parts.length;
-            var remainingDecks = Math.floor(totalRemainingCards / 52);
-            var remainingCards = totalRemainingCards % 52;
-            var remainingCombos = factorial(52).pow(remainingDecks).multiply(factorial(remainingCards));
-            var currentCombos = totalCombos.divide(remainingCombos);
-            var numberOfBits = Math.log2(currentCombos);
-            var maxWithoutReplace = BigInteger.pow(2, numberOfBits);
-            // aggresive flooring of numberOfBits by BigInteger.pow means a
-            // more accurate result can be had for small numbers using the
-            // built-in Math.pow function.
-            if (numberOfBits < 32) {
-                maxWithoutReplace = BigInteger(Math.round(Math.pow(2, numberOfBits)));
-            }
-            // Get the maximum value WITH replacement
-            var maxWithReplace = BigInteger.pow(52, base.parts.length);
-            // Calculate the new value by scaling the original value down
-            var withoutReplace = entropyInt.multiply(maxWithoutReplace).divide(maxWithReplace);
-            // Left pad with zeros based on number of bits
-            var entropyBin = withoutReplace.toString(2);
-            var numberOfBitsInt = Math.floor(numberOfBits);
-            while (entropyBin.length < numberOfBitsInt) {
-                entropyBin = "0" + entropyBin;
-            }
+            var cardEntropy = processCardEntropy(base.parts);
+            entropyBin = cardEntropy.binaryStr;
+            bitsPerEvent = cardEntropy.bitsPerEvent;
         }
         // Supply a 'filtered' entropy string for display purposes
         var entropyClean = base.parts.join("");
@@ -18105,11 +18447,24 @@ window.Entropy = new (function() {
             binaryStr: entropyBin,
             cleanStr: entropyClean,
             cleanHtml: entropyHtml,
+            bitsPerEvent: bitsPerEvent,
             base: base,
         }
         return e;
     }
 
+    function getSortedDeck() {
+        var s = [];
+        var suits = "CDHS";
+        var values = "A23456789TJQK";
+        for (var i=0; i<suits.length; i++) {
+            for (var j=0; j<values.length; j++) {
+                s.push(values[j]+suits[i]);
+            }
+        }
+        return s;
+    }
+
     function getBase(str) {
         // Need to get the lowest base for the supplied entropy.
         // This prevents interpreting, say, dice rolls as hexadecimal.
@@ -18180,6 +18535,90 @@ window.Entropy = new (function() {
         }
     }
 
+    // Assume cards are NOT replaced.
+    // Additional entropy decreases as more cards are used. This means
+    // total possible entropy is measured using n!, not base^n.
+    // eg the second last card can be only one of two, not one of fifty two
+    // so the added entropy for that card is only one bit at most
+    function processCardEntropy(cards) {
+        // Track how many instances of each card have been used, and thus
+        // how many decks are in use.
+        var cardCounts = {};
+        var numberOfDecks = 0;
+        // Work out number of decks by max(duplicates)
+        for (var i=0; i<cards.length; i++) {
+            // Get the card that was drawn
+            var cardLower = cards[i];
+            var card = cardLower.toUpperCase();
+            // Initialize the count for this card if needed
+            if (!(card in cardCounts)) {
+                cardCounts[card] = 0;
+            }
+            cardCounts[card] += 1;
+            // See if this is max(duplicates)
+            if (cardCounts[card] > numberOfDecks) {
+                numberOfDecks = cardCounts[card];
+            }
+        }
+        // Work out the total number of bits for this many decks
+        // See http://crypto.stackexchange.com/q/41886
+        var gainedBits = 0;
+        // Equivalent of Math.log2(factorial(52*numberOfDecks))
+        // which becomes infinity for numberOfDecks > 4
+        for (var i=1; i<=52*numberOfDecks; i++) {
+            gainedBits = gainedBits + Math.log2(i);
+        }
+        var lostBits = 52 * Math.log2(factorial(numberOfDecks));
+        var maxBits = gainedBits - lostBits;
+        // Convert the drawn cards to a binary representation.
+        // The exact technique for doing this is unclear.
+        // See
+        // http://crypto.stackexchange.com/a/41896
+        // "I even doubt that this is well defined (only the average entropy
+        // is, I believe)."
+        // See
+        // https://github.com/iancoleman/bip39/issues/33#issuecomment-263021856
+        // "The binary representation can be the first log(permutations,2) bits
+        // of the sha-2 hash of the normalized deck string."
+        //
+        // In this specific implementation, the first N bits of the hash of the
+        // normalized cards string is being used. Uppercase, no spaces; eg
+        // sha256("AH8DQSTC2H")
+        var totalCards = numberOfDecks * 52;
+        var percentUsed = cards.length / totalCards;
+        // Calculate the average number of bits of entropy for the number of
+        // cards drawn.
+        var numberOfBits = Math.floor(maxBits * percentUsed);
+        // Create a normalized string of the selected cards
+        var normalizedCards = cards.join("").toUpperCase();
+        // Convert to binary using the SHA256 hash of the normalized cards.
+        // If the number of bits is more than 256, multiple hashes
+        // are used until the required number of bits is reached.
+        var entropyBin = "";
+        var iterations = 0;
+        while (entropyBin.length < numberOfBits) {
+            var hashedCards = sjcl.hash.sha256.hash(normalizedCards + ":" + iterations);
+            var hashHex = sjcl.codec.hex.fromBits(hashedCards);
+            for (var i=0; i<hashHex.length; i++) {
+                var decimal = parseInt(hashHex[i], 16);
+                var binary = decimal.toString(2);
+                while (binary.length < 4) {
+                    binary = "0" + binary;
+                }
+                entropyBin = entropyBin + binary;
+            }
+            iterations = iterations + 1;
+        }
+        // Truncate to the appropriate number of bits.
+        entropyBin = entropyBin.substring(0, numberOfBits);
+        // Get the number of bits per event
+        bitsPerEvent = maxBits / totalCards;
+        return {
+            binaryStr: entropyBin,
+            bitsPerEvent: bitsPerEvent,
+        }
+    }
+
     // Polyfill for Math.log2
     // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log2#Polyfill
     Math.log2 = Math.log2 || function(x) {
@@ -18209,7 +18648,7 @@ window.Entropy = new (function() {
     // mnemonics is populated as required by getLanguage
     var mnemonics = { "english": new Mnemonic("english") };
     var mnemonic = mnemonics["english"];
-    var seed = null
+    var seed = null;
     var bip32RootKey = null;
     var bip32ExtendedKey = null;
     var network = bitcoin.networks.bitcoin;
@@ -18219,6 +18658,7 @@ window.Entropy = new (function() {
     var showAddress = true;
     var showPubKey = true;
     var showPrivKey = true;
+    var showQr = false;
 
     var entropyChangeTimeoutEvent = null;
     var phraseChangeTimeoutEvent = null;
@@ -18256,6 +18696,8 @@ window.Entropy = new (function() {
     DOM.bip44purpose = $("#bip44 .purpose");
     DOM.bip44coin = $("#bip44 .coin");
     DOM.bip44account = $("#bip44 .account");
+    DOM.bip44accountXprv = $("#bip44 .account-xprv");
+    DOM.bip44accountXpub = $("#bip44 .account-xpub");
     DOM.bip44change = $("#bip44 .change");
     DOM.generatedStrength = $(".generate-container .strength");
     DOM.hardenedAddresses = $(".hardened-addresses");
@@ -18269,6 +18711,11 @@ window.Entropy = new (function() {
     DOM.publicKeyToggle = $(".public-key-toggle");
     DOM.privateKeyToggle = $(".private-key-toggle");
     DOM.languages = $(".languages a");
+    DOM.qrContainer = $(".qr-container");
+    DOM.qrHider = DOM.qrContainer.find(".qr-hider");
+    DOM.qrImage = DOM.qrContainer.find(".qr-image");
+    DOM.qrHint = DOM.qrContainer.find(".qr-hint");
+    DOM.showQrEls = $("[data-show-qr]");
 
     function init() {
         // Events
@@ -18293,6 +18740,7 @@ window.Entropy = new (function() {
         DOM.publicKeyToggle.on("click", togglePublicKeys);
         DOM.privateKeyToggle.on("click", togglePrivateKeys);
         DOM.languages.on("click", languageChanged);
+        setQrEvents(DOM.showQrEls);
         disableForms();
         hidePending();
         hideValidationError();
@@ -18425,11 +18873,11 @@ window.Entropy = new (function() {
         // Calculate and display
         calcBip32RootKeyFromBase58(rootKeyBase58);
         calcForDerivationPath();
-        hidePending();
     }
 
     function calcForDerivationPath() {
         showPending();
+        clearAddressesList();
         hideValidationError();
         // Get the derivation path
         var derivationPath = getDerivationPath();
@@ -18438,7 +18886,10 @@ window.Entropy = new (function() {
             showValidationError(errorText);
             return;
         }
-        calcBip32ExtendedKey(derivationPath);
+        bip32ExtendedKey = calcBip32ExtendedKey(derivationPath);
+        if (bip44TabSelected()) {
+            displayBip44Info();
+        }
         displayBip32Info();
         hidePending();
     }
@@ -18518,7 +18969,11 @@ window.Entropy = new (function() {
     }
 
     function calcBip32ExtendedKey(path) {
-        bip32ExtendedKey = bip32RootKey;
+        // Check there's a root key to derive from
+        if (!bip32RootKey) {
+            return bip32RootKey;
+        }
+        var extendedKey = bip32RootKey;
         // Derive the key from the path
         var pathBits = path.split("/");
         for (var i=0; i<pathBits.length; i++) {
@@ -18528,13 +18983,19 @@ window.Entropy = new (function() {
                 continue;
             }
             var hardened = bit[bit.length-1] == "'";
-            if (hardened) {
-                bip32ExtendedKey = bip32ExtendedKey.deriveHardened(index);
+            var isPriv = "privKey" in extendedKey;
+            var invalidDerivationPath = hardened && !isPriv;
+            if (invalidDerivationPath) {
+                extendedKey = null;
+            }
+            else if (hardened) {
+                extendedKey = extendedKey.deriveHardened(index);
             }
             else {
-                bip32ExtendedKey = bip32ExtendedKey.derive(index);
+                extendedKey = extendedKey.derive(index);
             }
         }
+        return extendedKey
     }
 
     function showValidationError(errorText) {
@@ -18587,7 +19048,7 @@ window.Entropy = new (function() {
     }
 
     function getDerivationPath() {
-        if (DOM.bip44tab.hasClass("active")) {
+        if (bip44TabSelected()) {
             var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44);
             var coin = parseIntNoNaN(DOM.bip44coin.val(), 0);
             var account = parseIntNoNaN(DOM.bip44account.val(), 0);
@@ -18602,7 +19063,7 @@ window.Entropy = new (function() {
             console.log("Using derivation path from BIP44 tab: " + derivationPath);
             return derivationPath;
         }
-        else if (DOM.bip32tab.hasClass("active")) {
+        else if (bip32TabSelected()) {
             var derivationPath = DOM.bip32path.val();
             console.log("Using derivation path from BIP32 tab: " + derivationPath);
             return derivationPath;
@@ -18646,15 +19107,47 @@ window.Entropy = new (function() {
                 }
             }
         }
+        // Check root key exists or else derivation path is useless!
+        if (!bip32RootKey) {
+            return "No root key";
+        }
+        // Check no hardened derivation path when using xpub keys
+        var hardened = path.indexOf("'") > -1;
+        var isXpubkey = !("privKey" in bip32RootKey);
+        if (hardened && isXpubkey) {
+            return "Hardened derivation path is invalid with xpub key";
+        }
         return false;
     }
 
+    function displayBip44Info() {
+        // Get the derivation path for the account
+        var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44);
+        var coin = parseIntNoNaN(DOM.bip44coin.val(), 0);
+        var account = parseIntNoNaN(DOM.bip44account.val(), 0);
+        var path = "m/";
+        path += purpose + "'/";
+        path += coin + "'/";
+        path += account + "'/";
+        // Calculate the account extended keys
+        var accountExtendedKey = calcBip32ExtendedKey(path);
+        var accountXprv = accountExtendedKey.toBase58();
+        var accountXpub = accountExtendedKey.toBase58(false);
+        // Display the extended keys
+        DOM.bip44accountXprv.val(accountXprv);
+        DOM.bip44accountXpub.val(accountXpub);
+    }
+
     function displayBip32Info() {
         // Display the key
         DOM.seed.val(seed);
         var rootKey = bip32RootKey.toBase58();
         DOM.rootKey.val(rootKey);
-        var extendedPrivKey = bip32ExtendedKey.toBase58();
+        var xprvkeyB58 = "NA";
+        if (bip32ExtendedKey.privKey) {
+            xprvkeyB58 = bip32ExtendedKey.toBase58();
+        }
+        var extendedPrivKey = xprvkeyB58;
         DOM.extendedPrivKey.val(extendedPrivKey);
         var extendedPubKey = bip32ExtendedKey.toBase58(false);
         DOM.extendedPubKey.val(extendedPubKey);
@@ -18688,7 +19181,10 @@ window.Entropy = new (function() {
                     key = bip32ExtendedKey.derive(index);
                 }
                 var address = key.getAddress().toString();
-                var privkey = key.privKey.toWIF(network);
+                var privkey = "NA";
+                if (key.privKey) {
+                    privkey = key.privKey.toWIF(network);
+                }
                 var pubkey = key.pubKey.toHex();
                 var indexText = getDerivationPath() + "/" + index;
                 if (useHardenedAddresses) {
@@ -18761,6 +19257,8 @@ window.Entropy = new (function() {
             privkeyCell.addClass("invisible");
         }
         DOM.addresses.append(row);
+        var rowShowQrEls = row.find("[data-show-qr]");
+        setQrEvents(rowShowQrEls);
     }
 
     function hasStrongRandom() {
@@ -18794,6 +19292,9 @@ window.Entropy = new (function() {
         var closestWord = words[0];
         for (var i=0; i<words.length; i++) {
             var comparedTo = words[i];
+            if (comparedTo.indexOf(word) == 0) {
+                return comparedTo;
+            }
             var distance = Levenshtein.get(word, comparedTo);
             if (distance < minDistance) {
                 closestWord = comparedTo;
@@ -19034,10 +19535,7 @@ window.Entropy = new (function() {
         }
         var entropyTypeStr = getEntropyTypeStr(entropy);
         var wordCount = Math.floor(numberOfBits / 32) * 3;
-        var bitsPerEvent = Math.log2(entropy.base.asInt).toFixed(2);
-        if (entropy.base.asInt == 52) {
-            bitsPerEvent = bitsPerEvent + " (or less)";
-        }
+        var bitsPerEvent = entropy.bitsPerEvent.toFixed(2);
         DOM.entropyFiltered.html(entropy.cleanHtml);
         DOM.entropyType.text(entropyTypeStr);
         DOM.entropyStrength.text(strength);
@@ -19111,6 +19609,46 @@ window.Entropy = new (function() {
         return typeStr;
     }
 
+    function setQrEvents(els) {
+        els.on("mouseenter", createQr);
+        els.on("mouseleave", destroyQr);
+        els.on("click", toggleQr);
+    }
+
+    function createQr(e) {
+        var content = e.target.textContent || e.target.value;
+        if (content) {
+            var size = 130;
+            DOM.qrImage.qrcode({width: size, height: size, text: content});
+            if (!showQr) {
+                DOM.qrHider.addClass("hidden");
+            }
+            else {
+                DOM.qrHider.removeClass("hidden");
+            }
+            DOM.qrContainer.removeClass("hidden");
+        }
+    }
+
+    function destroyQr() {
+        DOM.qrImage.text("");
+        DOM.qrContainer.addClass("hidden");
+    }
+
+    function toggleQr() {
+        showQr = !showQr;
+        DOM.qrHider.toggleClass("hidden");
+        DOM.qrHint.toggleClass("hidden");
+    }
+
+    function bip44TabSelected() {
+        return DOM.bip44tab.hasClass("active");
+    }
+
+    function bip32TabSelected() {
+        return DOM.bip32tab.hasClass("active");
+    }
+
     var networks = [
         {
             name: "Bitcoin",