Added support for self-supplied keys (e.g. vanity addresses). Embedded fonts for more reliable printing.

The "Print Front" tab now includes a link to disable random address
generation so you supply your own key or vanity address. An ubuntu font
is now embedded. All cryptographic javascript functions were re-copied
over from bitaddress.org to make doing a "diff" easier, since
bitaddress recently overhauled its code formatting.
This commit is contained in:
Canton Becker 2013-10-06 12:55:33 -06:00
parent 4e5b4133ef
commit 0ac0aed874
8 changed files with 5019 additions and 4555 deletions

61
README
View file

@ -3,27 +3,66 @@ If you're on already at https://github.com/cantonbecker/bitcoinpaperwallet
Then just look for the button that says "Download ZIP". Look to your right --> Then just look for the button that says "Download ZIP". Look to your right -->
******************************************************************************* *******************************************************************************
*** bitcoinpaperwallet *** *** bitcoinpaperwallet ***
is a fork of bitaddress.org, the JavaScript Client-Side Bitcoin Wallet Generator This project is a fork of bitaddress.org, the original trustworthy
JavaScript powered offline bitcoin address generator.
This removes much of the (albeit excellent) functionality from Here's how this project differs:
bitaddress.org to create a streamined step-by-step 2 sided tri-fold
paper wallet printer for novices. (Tamper-resistant features abound.)
Includes a tool to help users "calibrate" their printer
for more consistent output between different browsers. Renamed main
.html file to avoid confusion with bitaddress.org. Moved images into
their own directory since they are quite large and might not do
well encoded into the JS anymore.
1) This generator is ONLY for printing paper wallets. Use bitaddress.org if
you need to bulk-generate addresses, etc.
2) This attractive paper wallet design is two-sided and folds up to
hide the private key. Optional tamper-evident hologram tape can be purchased
to provide extra security against snooping.
3) A tool is included to help calibrate the printer output for proper
sizing and two-sided alignment.
4) Images and resources have been moved out of the .html file (where they were
base-64 encoded) and into an images directory to make the code easier to review.
All cryptographic functions are verifiably identical to those in bitaddress.org.
(Run a "diff" between this project and bitaddress.org if you want to be sure.)
You can also bypass the random key generator and supply your own keys or so-called
"vanity addresses".
*** HOW TO USE THIS GENERATOR ***
1) Extract the ZIP file
2) Open up the 'generate-wallet.html' file with your web browser.
Rendering and printing seems to work best using:
OS X: Safari or Chrome or Firefox
Windows: Chrome or Firefox
Linux: Firefox
*** HOW TO VERIFY THE AUTHENTICITY OF THIS DOWNLOAD ***
After downloading the ZIP package for this generator, you should find a file
named generate-wallet.html.sig which you can use to:
* Verify that generate-wallet.html hasn't been tampered with, and
* Get proof that it really was authored by Canton Becker (canton@gmail.com)
whose GPG public key and fingerprint can be confirmed at http://cantonbecker.com
For example, if you have GPG installed, you can type:
gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html
And then verify the signature's fingerprint against Canton Becker's published signatures.
- Canton Becker - Canton Becker
http://cantonbecker.com http://cantonbecker.com
canton@gmail.com canton@gmail.com
--- original bitaddress.org README continues below ---
----------------------------------------------------------
--- The original bitaddress.org README continues below ---
----------------------------------------------------------
Now Bitcoin addresses and their corresponding private key can be conveniently Now Bitcoin addresses and their corresponding private key can be conveniently
generated in a web browser. generated in a web browser.

View file

@ -9,7 +9,9 @@
Contact: Canton Becker / canton@gmail.com Contact: Canton Becker / canton@gmail.com
generate-wallet.html is always distributed with a PGP signature "generate-wallet.html.sig" which you generate-wallet.html is always distributed with a PGP signature "generate-wallet.html.sig" which you
can use to validate the integrity and authorship of this file. can use to validate the integrity and authorship of this file like so:
gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html
Wallet design and portions of this code are ©Copyright 2013 Canton Becker and bitaddress.org Wallet design and portions of this code are ©Copyright 2013 Canton Becker and bitaddress.org
Other portions of this code are copyrighted by their respective authors - see below. Other portions of this code are copyrighted by their respective authors - see below.
@ -46,6 +48,7 @@
window.BigInteger BSD License window.BigInteger BSD License
window.QRCode MIT License window.QRCode MIT License
window.Bitcoin MIT License window.Bitcoin MIT License
window.Crypto_scrypt MIT License
ninja.(*) MIT License // lots of code from bitaddress.org ninja.(*) MIT License // lots of code from bitaddress.org
parser.setUA GPLv2 & MIT // UAParser.js parser.setUA GPLv2 & MIT // UAParser.js
@ -71,6 +74,7 @@
<title>Bitcoin Paper Wallet Generator</title> <title>Bitcoin Paper Wallet Generator</title>
<script type="text/javascript"> <script type="text/javascript">
// Array.prototype.map function is in the public domain. // Array.prototype.map function is in the public domain.
// Production steps of ECMA-262, Edition 5, 15.4.4.19 // Production steps of ECMA-262, Edition 5, 15.4.4.19
@ -130,7 +134,6 @@
}; };
} }
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.5.4 Crypto.js * Crypto-JS v2.5.4 Crypto.js
@ -282,7 +285,6 @@
})(); })();
} }
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.5.4 SHA256.js * Crypto-JS v2.5.4 SHA256.js
@ -420,7 +422,6 @@
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.5.4 PBKDF2.js * Crypto-JS v2.5.4 PBKDF2.js
@ -477,7 +478,6 @@
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.5.4 HMAC.js * Crypto-JS v2.5.4 HMAC.js
@ -523,7 +523,6 @@
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.5.4 AES.js * Crypto-JS v2.5.4 AES.js
@ -933,7 +932,6 @@
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS 2.5.4 BlockModes.js * Crypto-JS 2.5.4 BlockModes.js
@ -1346,7 +1344,6 @@
})(Crypto); })(Crypto);
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Crypto-JS v2.0.0 RIPEMD-160 * Crypto-JS v2.0.0 RIPEMD-160
@ -1513,7 +1510,6 @@
} }
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Random number generator with ArcFour PRNG * Random number generator with ArcFour PRNG
@ -1627,7 +1623,7 @@
sr.pool = new Array(); sr.pool = new Array();
sr.pptr = 0; sr.pptr = 0;
var t; var t;
// Use webcrypto if available; // Use webcrypto if available; -- Thanks to Gavin Andresen for this contribution
// see http://www.w3.org/2012/webcrypto/WebCryptoAPI/#Crypto-method-getRandomValues // see http://www.w3.org/2012/webcrypto/WebCryptoAPI/#Crypto-method-getRandomValues
if (window.crypto && window.crypto.getRandomValues) { if (window.crypto && window.crypto.getRandomValues) {
sr.pool = new Uint8Array(sr.poolSize); sr.pool = new Uint8Array(sr.poolSize);
@ -1653,7 +1649,6 @@
} }
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js //https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js
/*! /*!
@ -2300,7 +2295,6 @@
} }
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/*! /*!
* Basic JavaScript BN library - subset useful for RSA encryption. v1.3 * Basic JavaScript BN library - subset useful for RSA encryption. v1.3
@ -3574,7 +3568,6 @@
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// QRCode for JavaScript // QRCode for JavaScript
@ -4611,7 +4604,6 @@
}; };
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
/* /*
Copyright (c) 2011 Stefan Thomas Copyright (c) 2011 Stefan Thomas
@ -4630,7 +4622,6 @@
'object' === typeof module ? module.exports : (window.Bitcoin = {}) 'object' === typeof module ? module.exports : (window.Bitcoin = {})
); );
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js //https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js
(function (Bitcoin) { (function (Bitcoin) {
@ -4705,7 +4696,6 @@
'undefined' != typeof Bitcoin ? Bitcoin : module.exports 'undefined' != typeof Bitcoin ? Bitcoin : module.exports
); );
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js //https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js
Bitcoin.Address = function (bytes) { Bitcoin.Address = function (bytes) {
@ -4762,7 +4752,6 @@
return hash; return hash;
}; };
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js //https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js
Bitcoin.ECDSA = (function () { Bitcoin.ECDSA = (function () {
@ -5048,7 +5037,6 @@
return ECDSA; return ECDSA;
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js //https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js
Bitcoin.ECKey = (function () { Bitcoin.ECKey = (function () {
@ -5106,6 +5094,7 @@
ECKey.prototype.setCompressed = function (v) { ECKey.prototype.setCompressed = function (v) {
this.compressed = !!v; this.compressed = !!v;
if (this.pubPoint) this.pubPoint.compressed = this.compressed; if (this.pubPoint) this.pubPoint.compressed = this.compressed;
return this;
}; };
/* /*
@ -5175,6 +5164,7 @@
var ecPoint = ecparams.getCurve().decodePointHex(pub); var ecPoint = ecparams.getCurve().decodePointHex(pub);
this.setCompressed(ecPoint.compressed); this.setCompressed(ecPoint.compressed);
this.pubPoint = ecPoint; this.pubPoint = ecPoint;
return this;
}; };
// Sipa Private Key Wallet Import Format // Sipa Private Key Wallet Import Format
@ -5311,7 +5301,6 @@
return ECKey; return ECKey;
})(); })();
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js //https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js
// Bitcoin utility functions // Bitcoin utility functions
@ -5412,9 +5401,310 @@
*/ */
sha256ripe160: function (data) { sha256ripe160: function (data) {
return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true }); return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
},
// double sha256
dsha256: function (data) {
return Crypto.SHA256(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
} }
}; };
</script> </script>
<script type="text/javascript">
/*
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 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.
*/
// https://github.com/cheongwy/node-scrypt-js
(function () {
var MAX_VALUE = 2147483647;
var workerUrl = null;
//function scrypt(byte[] passwd, byte[] salt, int N, int r, int p, int dkLen)
/*
* N = Cpu cost
* r = Memory cost
* p = parallelization cost
*
*/
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
if (N > MAX_VALUE / 128 / r) throw Error("Parameter N is too large");
if (r > MAX_VALUE / 128 / p) throw Error("Parameter r is too large");
var PBKDF2_opts = { iterations: 1, hasher: Crypto.SHA256, asBytes: true };
var B = Crypto.PBKDF2(passwd, salt, p * 128 * r, PBKDF2_opts);
try {
var i = 0;
var worksDone = 0;
var makeWorker = function () {
if (!workerUrl) {
var code = '(' + scryptCore.toString() + ')()';
var blob;
try {
blob = new Blob([code], { type: "text/javascript" });
} catch (e) {
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
blob = new BlobBuilder();
blob.append(code);
blob = blob.getBlob("text/javascript");
}
workerUrl = URL.createObjectURL(blob);
}
var worker = new Worker(workerUrl);
worker.onmessage = function (event) {
var Bi = event.data[0], Bslice = event.data[1];
worksDone++;
if (i < p) {
worker.postMessage([N, r, p, B, i++]);
}
var length = Bslice.length, destPos = Bi * 128 * r, srcPos = 0;
while (length--) {
B[destPos++] = Bslice[srcPos++];
}
if (worksDone == p) {
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
}
};
return worker;
};
var workers = [makeWorker(), makeWorker()];
workers[0].postMessage([N, r, p, B, i++]);
if (p > 1) {
workers[1].postMessage([N, r, p, B, i++]);
}
} catch (e) {
window.setTimeout(function () {
scryptCore();
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
}, 0);
}
// using this function to enclose everything needed to create a worker (but also invokable directly for synchronous use)
function scryptCore() {
var XY = [], V = [];
if (typeof B === 'undefined') {
onmessage = function (event) {
var data = event.data;
var N = data[0], r = data[1], p = data[2], B = data[3], i = data[4];
var Bslice = [];
arraycopy32(B, i * 128 * r, Bslice, 0, 128 * r);
smix(Bslice, 0, r, N, V, XY);
postMessage([i, Bslice]);
};
} else {
for (var i = 0; i < p; i++) {
smix(B, i * 128 * r, r, N, V, XY);
}
}
function smix(B, Bi, r, N, V, XY) {
var Xi = 0;
var Yi = 128 * r;
var i;
arraycopy32(B, Bi, XY, Xi, Yi);
for (i = 0; i < N; i++) {
arraycopy32(XY, Xi, V, i * Yi, Yi);
blockmix_salsa8(XY, Xi, Yi, r);
}
for (i = 0; i < N; i++) {
var j = integerify(XY, Xi, r) & (N - 1);
blockxor(V, j * Yi, XY, Xi, Yi);
blockmix_salsa8(XY, Xi, Yi, r);
}
arraycopy32(XY, Xi, B, Bi, Yi);
}
function blockmix_salsa8(BY, Bi, Yi, r) {
var X = [];
var i;
arraycopy32(BY, Bi + (2 * r - 1) * 64, X, 0, 64);
for (i = 0; i < 2 * r; i++) {
blockxor(BY, i * 64, X, 0, 64);
salsa20_8(X);
arraycopy32(X, 0, BY, Yi + (i * 64), 64);
}
for (i = 0; i < r; i++) {
arraycopy32(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64);
}
for (i = 0; i < r; i++) {
arraycopy32(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
}
}
function R(a, b) {
return (a << b) | (a >>> (32 - b));
}
function salsa20_8(B) {
var B32 = new Array(32);
var x = new Array(32);
var i;
for (i = 0; i < 16; i++) {
B32[i] = (B[i * 4 + 0] & 0xff) << 0;
B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
}
arraycopy(B32, 0, x, 0, 16);
for (i = 8; i > 0; i -= 2) {
x[4] ^= R(x[0] + x[12], 7); x[8] ^= R(x[4] + x[0], 9);
x[12] ^= R(x[8] + x[4], 13); x[0] ^= R(x[12] + x[8], 18);
x[9] ^= R(x[5] + x[1], 7); x[13] ^= R(x[9] + x[5], 9);
x[1] ^= R(x[13] + x[9], 13); x[5] ^= R(x[1] + x[13], 18);
x[14] ^= R(x[10] + x[6], 7); x[2] ^= R(x[14] + x[10], 9);
x[6] ^= R(x[2] + x[14], 13); x[10] ^= R(x[6] + x[2], 18);
x[3] ^= R(x[15] + x[11], 7); x[7] ^= R(x[3] + x[15], 9);
x[11] ^= R(x[7] + x[3], 13); x[15] ^= R(x[11] + x[7], 18);
x[1] ^= R(x[0] + x[3], 7); x[2] ^= R(x[1] + x[0], 9);
x[3] ^= R(x[2] + x[1], 13); x[0] ^= R(x[3] + x[2], 18);
x[6] ^= R(x[5] + x[4], 7); x[7] ^= R(x[6] + x[5], 9);
x[4] ^= R(x[7] + x[6], 13); x[5] ^= R(x[4] + x[7], 18);
x[11] ^= R(x[10] + x[9], 7); x[8] ^= R(x[11] + x[10], 9);
x[9] ^= R(x[8] + x[11], 13); x[10] ^= R(x[9] + x[8], 18);
x[12] ^= R(x[15] + x[14], 7); x[13] ^= R(x[12] + x[15], 9);
x[14] ^= R(x[13] + x[12], 13); x[15] ^= R(x[14] + x[13], 18);
}
for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i];
for (i = 0; i < 16; i++) {
var bi = i * 4;
B[bi + 0] = (B32[i] >> 0 & 0xff);
B[bi + 1] = (B32[i] >> 8 & 0xff);
B[bi + 2] = (B32[i] >> 16 & 0xff);
B[bi + 3] = (B32[i] >> 24 & 0xff);
}
}
function blockxor(S, Si, D, Di, len) {
var i = len >> 6;
while (i--) {
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
}
}
function integerify(B, bi, r) {
var n;
bi += (2 * r - 1) * 64;
n = (B[bi + 0] & 0xff) << 0;
n |= (B[bi + 1] & 0xff) << 8;
n |= (B[bi + 2] & 0xff) << 16;
n |= (B[bi + 3] & 0xff) << 24;
return n;
}
function arraycopy(src, srcPos, dest, destPos, length) {
while (length--) {
dest[destPos++] = src[srcPos++];
}
}
function arraycopy32(src, srcPos, dest, destPos, length) {
var i = length >> 5;
while (i--) {
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
}
}
} // scryptCore
}; // window.Crypto_scrypt
})();
</script>
@ -5969,10 +6259,20 @@
<style type="text/css"> <style type="text/css">
.more { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAAB1UlEQVQ4jYWTS04bQRCGv3q0x8gMYJCwknCGLDgLVwiH4grhLFaUXdhkQ0A8pBg/FOLpnmbhMYzxRKlNS1Vdf/31V5XknGnb+eXJCBjzbzu9OLu+azu845Opysej4wHmshF4uJ2TUrb3CV0gIBAKRboC5C2vdkDE9fdty6/xDegvXz+NgDbFUejZ+PjDgExmtpxS9vYwMe5u5iyX8RRoa5Ic+C4qx9KUN1MGu4E618yqJ5axAp44KA7ZL3eYzp/HKdVIw7WK8d6BuDvcod9TQlBEIOXEdPlElSoUJabIIs4Z7h9yNDwgqOMayLXw7epHVIBggrsgspZPUBQyiCgugRQji7TAVDF1XB2TlQoOYCqovkmpopS9fcoiM3ue0rOCYf8IU8NklWxiiOQ3EPXtWagIqo6KYWYEc4IGvMViA6RrnCJKVS9B8ypRHG1YKNa0Ur+C+MPt/I2BKWVZUO4FgvQ47PcptEDF+T2Z8TiZUMWIyGtpd+Bze5VTSqP57O/4YG+AN/RXbSiPkwmL5z/be/L+mM4vT2JKeUW7EXD1erMz/Lo4u77f0K9DDhdA1XG11jh9vWBb99Z9gAg5QZ2hzpmUa0RSW4f/gqSY0s3Vz+tufEjvHS8Tg6BXC7qVbQAAAABJRU5ErkJggg==)
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; } /* import ubuntu mono bold as our font for display public & private keys.
.less { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAABuklEQVQ4ja2US25TQRBFT336OSEY5ESyBfEakNiLt0AW5S2QvQQxAiZIYBwSz/yByH7dxcB2bPMME+hJS/W5fetWVUtE8K/HfzdcXfdfqsr4onuGuRz4Jrdzcg6Gg9HfQYAxAqmlSMMlQJO5/oliE4AtQLcR++btZQ+wPVsvVXbTfXFGEMyWU9rVM0yMu/Gc5bJ+DdztxWcH3otKVzbPmyq5LnwfzSgEBMxlhqJEBFWVKKUgG66rur53oH7aOeWkUlJSRCBHZracssorlLXttHpCpzonaYukjmsiivDu08daAZIJ7oLIVg9BUQgQUVwSua5Z5AWmiqnj6pisVXAAU0F1J6WK0q6e024Fs4cplbXonFxgapisk00MkdiBqDd7oSKoOiqGmZHMSZrwPRYHIMfaKaKsyhI01oni6IaFYptSyiOIT27nOwaq5FyQrUAIC/nBhK+UErRSos55z4878CrneJyTnHOvquymf3mOb+hvy/jw+QuLh5/NORkORvsGrq77dc6xpr0RcH07y3oF8G04GN0f6HdEDhdA1XG1vXb6dsAa+3Z8AREiQwkoEeQoiBzocHDkf/wnvwC5IpRVsUDNUgAAAABJRU5ErkJggg==) NOTE: This font has been stripped down such that it only includes characters A-Z, a-Z, and 0-9 */
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; } @font-face {
font-family: 'ubuntu_mono_bold';
src: url('images/ubuntumono-b-webfont.eot');
src: url('images/ubuntumono-b-webfont.eot?#iefix') format('embedded-opentype'),
url('images/ubuntumono-b-webfont.woff') format('woff'),
url('images/ubuntumono-b-webfont.ttf') format('truetype'),
url('images/ubuntumono-b-webfont.svg#ubuntu_monobold') format('svg');
font-weight: bold;
font-style: normal;
}
.right { text-align: right; } .right { text-align: right; }
.walletarea { display: none; border-top: 2px solid #f7931a; } .walletarea { display: none; border-top: 2px solid #f7931a; }
.keyarea { font-family: Courier New; height: 110px; text-align: left; position: relative; padding: 5px; } .keyarea { font-family: Courier New; height: 110px; text-align: left; position: relative; padding: 5px; }
@ -5996,7 +6296,7 @@
#main { position: relative; margin: 0px auto; width: 1010px; color: #444; } /* removed text-align: center; */ #main { position: relative; margin: 0px auto; width: 1010px; color: #444; } /* removed text-align: center; */
#logoback { background-image:url(images/logo.png); background-position: top left; background-repeat: no-repeat; } #logoback { background-image:url(images/logo.png); background-position: top left; background-repeat: no-repeat; }
#generate { font-family: Courier New; height: 158px; text-align: left; position: relative; padding: 5px; border: 2px solid #f7931a; } #generate { font-family: Courier New; height: 158px; text-align: left; position: relative; padding: 5px; border: none; }
#generate span { padding: 5px 5px 0 5px; } #generate span { padding: 5px 5px 0 5px; }
#menu { visibility: hidden; font-size: 90%; padding: 0 12px;} #menu { visibility: hidden; font-size: 90%; padding: 0 12px;}
@ -6019,7 +6319,10 @@
#paperarea { min-height: 120px; display: none; } #paperarea { min-height: 120px; display: none; }
#paperarea .keyarea { border: 2px solid #f7931a; border-top: 0; } #paperarea .keyarea { border: 2px solid #f7931a; border-top: 0; }
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: Ubuntu, Arial; padding: 0; margin: 0; }
/* alphanum for public-private keys*/
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: ubuntu_mono_bold, Arial, Helvetica, sans-serif; padding: 0; margin: 0; font-size: 13px;}
#paperarea .artwallet .papersvg { width: 1010px; height: 331px; border: 0; margin: 0; padding: 0; left: 0; } #paperarea .artwallet .papersvg { width: 1010px; height: 331px; border: 0; margin: 0; padding: 0; left: 0; }
#paperarea .artwallet .qrcode_public { top: 120px; left: 41px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF; #paperarea .artwallet .qrcode_public { top: 120px; left: 41px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
padding: 5px 5px 2px 5px; } padding: 5px 5px 2px 5px; }
@ -6027,8 +6330,8 @@
padding: 5px 5px 2px 5px; } padding: 5px 5px 2px 5px; }
#paperarea .artwallet .btcaddress #paperarea .artwallet .btcaddress
{ {
position: absolute; top: 275px; left: 40px; z-index: 100; font-size: 11px; background-color: transparent; position: absolute; top: 275px; left: 40px; z-index: 100; background-color: transparent;
font-weight:bold; color: #1739ad; margin: 0; color: #1739ad; margin: 0;
-webkit-transform-origin:top left; -webkit-transform-origin:top left;
/* -webkit-transform:rotate(-90deg); */ /* -webkit-transform:rotate(-90deg); */
-moz-transform-origin:top left; -moz-transform-origin:top left;
@ -6043,8 +6346,8 @@
#paperarea .artwallet .dupbtcaddress #paperarea .artwallet .dupbtcaddress
{ {
position: absolute; top: 45px; left: 40px; z-index: 100; font-size: 11px; background-color: transparent; position: absolute; top: 45px; left: 40px; z-index: 100; background-color: transparent;
font-weight:bold; color: #1739ad; margin: 0; color: #1739ad; margin: 0;
/* -webkit-transform-origin:top left; */ /* -webkit-transform-origin:top left; */
-webkit-transform:rotate(-180deg); -webkit-transform:rotate(-180deg);
/* -moz-transform-origin:top left; */ /* -moz-transform-origin:top left; */
@ -6059,8 +6362,8 @@
#paperarea .artwallet .btcprivwif #paperarea .artwallet .btcprivwif
{ {
position: absolute; top: 245px; left: 610px; z-index: 100; font-size: 11px; background-color: transparent; position: absolute; top: 245px; left: 610px; z-index: 100; background-color: transparent;
font-weight:bold; color: #000000; margin: 0; color: #000000; margin: 0;
-webkit-transform-origin:top left; -webkit-transform-origin:top left;
/*-webkit-transform:rotate(-90deg);*/ /*-webkit-transform:rotate(-90deg);*/
-moz-transform-origin:top left; -moz-transform-origin:top left;
@ -6075,8 +6378,8 @@
#paperarea .artwallet .dupbtcprivwif #paperarea .artwallet .dupbtcprivwif
{ {
position: absolute; top: 75px; left: 610px; z-index: 100; font-size: 11px; background-color: transparent; position: absolute; top: 75px; left: 610px; z-index: 100; background-color: transparent;
font-weight:bold; color: #000000; margin: 0; color: #000000; margin: 0;
/* -webkit-transform-origin:top left; */ /* -webkit-transform-origin:top left; */
-webkit-transform:rotate(-180deg); -webkit-transform:rotate(-180deg);
/* -moz-transform-origin:top left; */ /* -moz-transform-origin:top left; */
@ -6089,46 +6392,47 @@
transform:rotate(-180deg); transform:rotate(-180deg);
} }
.nicerButton { .nicerButton { /* thanks http://www.cssbuttongenerator.com */
-moz-box-shadow:inset 0px 1px 0px 0px #fce2c1; -moz-box-shadow:inset 0px 1px 0px 0px #c1ed9c;
-webkit-box-shadow:inset 0px 1px 0px 0px #fce2c1; -webkit-box-shadow:inset 0px 1px 0px 0px #c1ed9c;
box-shadow:inset 0px 1px 0px 0px #fce2c1; box-shadow:inset 0px 1px 0px 0px #c1ed9c;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ffc477), color-stop(1, #fb9e25) ); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #9dce2c), color-stop(1, #8cb82b) );
background:-moz-linear-gradient( center top, #ffc477 5%, #fb9e25 100% ); background:-moz-linear-gradient( center top, #9dce2c 5%, #8cb82b 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc477', endColorstr='#fb9e25'); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9dce2c', endColorstr='#8cb82b');
background-color:#ffc477; background-color:#9dce2c;
-webkit-border-top-left-radius:20px; -webkit-border-top-left-radius:12px;
-moz-border-radius-topleft:20px; -moz-border-radius-topleft:12px;
border-top-left-radius:20px; border-top-left-radius:12px;
-webkit-border-top-right-radius:20px; -webkit-border-top-right-radius:12px;
-moz-border-radius-topright:20px; -moz-border-radius-topright:12px;
border-top-right-radius:20px; border-top-right-radius:12px;
-webkit-border-bottom-right-radius:20px; -webkit-border-bottom-right-radius:12px;
-moz-border-radius-bottomright:20px; -moz-border-radius-bottomright:12px;
border-bottom-right-radius:20px; border-bottom-right-radius:12px;
-webkit-border-bottom-left-radius:20px; -webkit-border-bottom-left-radius:12px;
-moz-border-radius-bottomleft:20px; -moz-border-radius-bottomleft:12px;
border-bottom-left-radius:20px; border-bottom-left-radius:12px;
text-indent:0; text-indent:0;
border:1px solid #eeb44f; border:1px solid #83c41a;
display:inline-block; display:inline-block;
color:#ffffff !important; color:#ffffff !important;
font-family:Arial; font-family:Arial;
font-size:13px; font-size:14px;
font-weight:bold; font-weight:bold;
font-style:normal; font-style:normal;
height:40px; height:35px;
line-height:40px; line-height:35px;
width:200px; width:189px;
text-decoration:none !important; text-decoration:none;
text-align:center; text-align:center;
text-shadow:1px 1px 0px #cc9f52; text-shadow:1px 1px 0px #689324;
} }
.nicerButton:hover { .nicerButton:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #fb9e25), color-stop(1, #ffc477) ); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #8cb82b), color-stop(1, #9dce2c) );
background:-moz-linear-gradient( center top, #fb9e25 5%, #ffc477 100% ); background:-moz-linear-gradient( center top, #8cb82b 5%, #9dce2c 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fb9e25', endColorstr='#ffc477'); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#8cb82b', endColorstr='#9dce2c');
background-color:#fb9e25; background-color:#8cb82b;
text-decoration: none;
}.nicerButton:active { }.nicerButton:active {
position:relative; position:relative;
top:1px; top:1px;
@ -6157,7 +6461,7 @@
-webkit-animation: blink 0.5s infinite linear alternate; -webkit-animation: blink 0.5s infinite linear alternate;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
} }
#generatelabelmovemouse { margin: 30px 150px; padding: 30px; font-weight: bold; background-color: #EBFDBF; text-align: center; } #generatelabelmovemouse { margin: 30px 150px; padding: 30px; font-weight: bold; text-align: center; -webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;background-color:#F0FED0;-webkit-box-shadow: #B3B3B3 1px 1px 1px;-moz-box-shadow: #B3B3B3 1px 1px 1px; box-shadow: #B3B3B3 1px 1px 1px; }
#generatelabelbitcoinaddress { text-align: center;} #generatelabelbitcoinaddress { text-align: center;}
@media screen @media screen
@ -6207,9 +6511,11 @@
.footer .copyright { font-size: 75%; clear: both; padding: 5px 0; } .footer .copyright { font-size: 75%; clear: both; padding: 5px 0; }
.footer .copyright span { padding: 10px 10px; } .footer .copyright span { padding: 10px 10px; }
#siginfo { margin: 10px 200px; border: 1px solid #666; padding: 10px; background-color: #999; color: #FFF;} #siginfo { margin: 10px 200px; border: 1px solid #666; padding: 10px; background-color: #999; color: #FFF; z-index: 10000;}
#siginfo a, #siginfo a:visited { color: #EFFED3;} #siginfo a, #siginfo a:visited { color: #EFFED3;}
#siginfo .closeme { float: right; padding: 0 0 30px 20px; margin: 0;} #siginfo .closeme { float: right; padding: 0 0 30px 20px; margin: 0;}
#supplyKeys { float: left; background-color: #EEFED0; border: 1px solid #CCCCCC; padding: 8px; }
} }
@media print @media print
@ -6238,8 +6544,8 @@
<span><a href="?culture=fr" id="culturefr">Français</a></span> --> <span><a href="?culture=fr" id="culturefr">Français</a></span> -->
&nbsp; &nbsp;
</div> </div>
<div id="tagline">Open Source Client-Side JavaScript Bitcoin Wallet Generator <span>Updated September 5, 2013</span></div> <div id="tagline">Open Source JavaScript Bitcoin Wallet Generator <span>Updated October 1, 2013</span></div>
<div id="tagsite">For help &amp; security tips, visit <a href="https://bitcoinpaperwallet.com">bitcoinpaperwallet.com</a></div> <div id="tagsite">For help, security tips, or wallet supplies visit <a href="https://bitcoinpaperwallet.com">bitcoinpaperwallet.com</a></div>
<div id="tagwarning"></div> <div id="tagwarning"></div>
<div class="menu" id="menu"> <div class="menu" id="menu">
@ -6281,6 +6587,8 @@
<span id="instructions1"><em>Here's an overview of what will happen, step by step.</em></span> <span id="instructions1"><em>Here's an overview of what will happen, step by step.</em></span>
<br /><br /> <br /><br />
<img src="images/finished-sample-sealed.jpg" width="400" height="203" alt="Sealed Wallet" style="float: right; margin: 0 0 20px 20px;">
<span id="instructions3"><b>Step 1: Calibrate Printer</b><br /> <span id="instructions3"><b>Step 1: Calibrate Printer</b><br />
Before printing out a wallet you'll need to "calibrate" your printer for <b>zoom</b> and <b>horizontal shift</b> to accommodate your particular browser / printer combination. Without proper callibration, your wallet will end up the wrong size or with a misaligned reverse side.</span> Before printing out a wallet you'll need to "calibrate" your printer for <b>zoom</b> and <b>horizontal shift</b> to accommodate your particular browser / printer combination. Without proper callibration, your wallet will end up the wrong size or with a misaligned reverse side.</span>
<br /><br /> <br /><br />
@ -6291,7 +6599,7 @@
Then you will put the same page back in your printer (but upside down) to print out the back side of your wallet. This isn't just for good looks: the back side design includes additional tamper-resistant safeguards.</span> Then you will put the same page back in your printer (but upside down) to print out the back side of your wallet. This isn't just for good looks: the back side design includes additional tamper-resistant safeguards.</span>
<br /><br /> <br /><br />
<span id="instructions6"><b>Step 4: Cut, Fold, Seal &amp; Fund</b><br /> <span id="instructions6"><b>Step 4: Cut, Fold, Seal &amp; Fund</b><br />
Find your scissors! Time to cut out your wallet, fold it, and seal it with opaque (light-blocking) tape&mdash;or better yet <a href="https://bitcoinpaperwallet.com/#purchase" target="_blank">tamper-evident holographic tape</a>.) Now you're ready to transfer bitcoins from your online holdings to your new wallet.</span> Find your scissors! Time to cut out your wallet, fold it, and seal it with opaque (light-blocking) tape&mdash;or better yet <a href="https://bitcoinpaperwallet.com/#purchase" target="_blank"><strong>tamper-evident holographic tape with serial numbers</strong></a>.) Now you're ready to transfer bitcoins from your online holdings to your new wallet.</span>
<br /><br /> <br /><br />
<span id="instructions2"><a href="http://www.youtube.com/watch?v=a47rrYBWjWQ" target="_blank" class="nicerButton" style="width: 400px;">90 second video demonstration on YouTube &raquo;</a></span> <span id="instructions2"><a href="http://www.youtube.com/watch?v=a47rrYBWjWQ" target="_blank" class="nicerButton" style="width: 400px;">90 second video demonstration on YouTube &raquo;</a></span>
@ -6343,7 +6651,20 @@
<span><label id="paperlabeladdressesperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span> <span><label id="paperlabeladdressesperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span>
<span><label id="paperlabeladdressestogenerate">Addresses to generate:</label> <input type="text" id="paperlimit" /></span> <span><label id="paperlabeladdressestogenerate">Addresses to generate:</label> <input type="text" id="paperlimit" /></span>
</div> </div>
<span><input type="button" id="papergenerate" value="Generate a new wallet" onClick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked); printCounter=0;" /></span>
<div id="keyButtons" style="display: block; float: left;">
<input type="button" id="papergenerate" value="Random-generate new keys" onClick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked); printCounter=0;" />
<input type="button" id="papergenerate" value="Supply my own key or vanity address..." onClick="document.getElementById('keyButtons').style.display='none'; document.getElementById('supplyKeys').style.display='block';" />
</div>
<div id="supplyKeys" style="display: none;">
<p style="padding: 0; margin: 0;"><input placeholder="Paste your PRIVATE key here" id="suppliedPrivateKey" name="suppliedPrivateKey" size="75" spellcheck="false" style="font-family: ubuntu_mono_bold, 'Courier New', Courier, monospace;" />&nbsp;<input type="button" id="papergenerate" value="Test &amp; Apply &raquo;" onClick="testAndApplyVanityKey();" />
</p>
<p style="margin: 0; padding:0;"><a href="#" style="font-size: 11px;" onClick="document.getElementById('keyButtons').style.display='block'; document.getElementById('supplyKeys').style.display='none';">&laquo; Back</a></p>
</div>
<span class="print"> <span class="print">
<a href="#" class="nicerButton" onClick="doPrint('generate');">Print Wallet Front</a> <a href="#" class="nicerButton" onClick="doPrint('generate');">Print Wallet Front</a>
</span> </span>
@ -6432,6 +6753,21 @@
</div> </div>
</div> </div>
<div class="authorpgp"> <div class="authorpgp">
<div id="siginfo" style="display: none; position: absolute; top: -300px;">
<p class="closeme"><a href="#" onClick="document.getElementById('siginfo').style.display='none'; return(false);">X</a></p>
After downloading the <a href="https://github.com/cantonbecker/bitcoinpaperwallet" target="_blank">ZIP package</a> for this generator, you should find a file named <b>generate-wallet.html.sig</b>
which you can use to:
<ol><li> verify that <strong>generate-wallet.html</strong> hasn't been tampered with, and</li>
<li>get proof that it really was authored by Canton Becker (canton@gmail.com) whose public key and fingerprint can be confirmed at <a href="http://cantonbecker.com">cantonbecker.com</a>, bitcointalk.org, etc.</li>
</ol>
For example, if you have GPG installed, just open the terminal, change directory (cd) to where this file lives, and type:<br />
<code>gpg --verify --with-fingerprint generate-wallet.html.sig generate-wallet.html</code>
<br /><br />And then verify the signature's fingerprint against Canton Becker's <a href="http://cantonbecker.com">published PGP/GPG fingerprint</a>.<br /><br />
<a href="http://www.google.com/search?q=how+to+verify+PGP+%22.sig%22+signature+on+file">Learn how to verify a PGP-signed file &raquo;</a>
</div>
<span class="item"><b>Security Details</b></span> <span class="item"><b>Security Details</b></span>
<span class="item" style="font-size: 75%;"><a href="https://bitcoinpaperwallet.com/#security" target="_blank">For extra security</a>, do not run this generator directly from the bitcoinpaperwallet.com website.<br /> <span class="item" style="font-size: 75%;"><a href="https://bitcoinpaperwallet.com/#security" target="_blank">For extra security</a>, do not run this generator directly from the bitcoinpaperwallet.com website.<br />
Download the generator and run the HTML as a local file in your browser instead.</span> Download the generator and run the HTML as a local file in your browser instead.</span>
@ -6441,21 +6777,6 @@
<span class="item" id="footerlabelsig" style="font-size: 75%;"><a href="#" onClick="document.getElementById('siginfo').style.display='block'; return(false);">Validate PGP/GPG signature</a></span> <span class="item" id="footerlabelsig" style="font-size: 75%;"><a href="#" onClick="document.getElementById('siginfo').style.display='block'; return(false);">Validate PGP/GPG signature</a></span>
<div id="siginfo" style="display: none;">
<p class="closeme"><a href="#" onClick="document.getElementById('siginfo').style.display='none'; return(false);">X</a></p>
After downloading the ZIP package for this generator, you should find a file named <b>generate-wallet.html.sig</b>
which you can use to:
<ol><li> verify that <strong>generate-wallet.html</strong> hasn't been tampered with, and</li>
<li>get proof that it really was authored by Canton Becker (canton@gmail.com) whose public key was published in May 2013.</li>
</ol>
For example, if you have GPG installed, you can type:<br />
<code>gpg --verify generate-wallet.html.sig generate-wallet.html</code>
<br /><br />
<a href="http://www.google.com/search?q=how+to+verify+PGP+%22.sig%22+signature+on+file">Learn how to verify a PGP-signed file &raquo;</a>
</div>
</div> </div>
<div class="copyright"> <div class="copyright">
<span id="footerlabelcopyright1">&copy; Copyright 2013 Canton Becker (<a href="mailto:canton@gmail.com">canton@gmail.com</a>) and Pointbiz/bitaddress.org</span> <span id="footerlabelcopyright1">&copy; Copyright 2013 Canton Becker (<a href="mailto:canton@gmail.com">canton@gmail.com</a>) and Pointbiz/bitaddress.org</span>
@ -7555,9 +7876,9 @@
<script type="text/javascript"> <script type="text/javascript">
/**************************************************** /********************************************************
Brand new JS functions added for bitcionpaperwallet Brand new JS functions added for bitcoinpaperwallet.com
****************************************************/ ********************************************************/
var inlineMediaStyle = null; var inlineMediaStyle = null;
@ -7609,12 +7930,25 @@
if (myContext == 'generate') { if (myContext == 'generate') {
window.printCounter ++; window.printCounter ++;
if (window.printCounter == 2) { if (window.printCounter == 2) {
alert (" *** WARNING *** WARNING *** WARNING *** \n\nYou are about to print a second wallet with the same set of keys. \n\nUnless you intended to make a backup wallet, cancel this print job and click the 'Generate a new wallet' button first."); alert (" *** WARNING *** WARNING *** WARNING *** \n\nYou are about to print a second wallet with the same set of keys. \n\nUnless you intended to make a backup wallet, cancel this print job and generate a fresh set of keys.");
} }
} }
window.print(); window.print();
} }
function testAndApplyVanityKey() { /* Verify that a self-entered key is valid, and compute the corresponding public address, render the wallet. */
var suppliedKey = document.getElementById('suppliedPrivateKey').value;
suppliedKey = suppliedKey.trim(); // in case any spaces or whitespace got pasted in
document.getElementById('suppliedPrivateKey').value = suppliedKey;
if (!ninja.privateKey.isPrivateKey(suppliedKey)) {
alert ('*** INVALID KEY! ***\r\rThis should be the private "WIF" Wallet Import Format key -- not the public key (or "Vanity Key") itself. These always start with the number 5 and look something like this:\r\r5HuzK5hG43U7v53R7REt4Eu33BsVfhm86PA3Q6iANs13kwqUgSx');
} else {
var computedPublicAddress = new Bitcoin.ECKey(suppliedKey).getBitcoinAddress();
alert ('OK! This is a valid private key whose public address is:\r\r'+computedPublicAddress);
ninja.wallets.paperwallet.showArtisticWallet(1, computedPublicAddress, suppliedKey);
window.printCounter = 0;
}
}
</script> </script>

View file

@ -1,11 +1,11 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org Comment: GPGTools - http://gpgtools.org
iQEcBAABAgAGBQJSKMgdAAoJEJJ3rXE24dm2oKoH/Rq+RgpDtbZWLdZVKAzPbxlt iQEcBAABAgAGBQJSUbAUAAoJEJJ3rXE24dm2TA4H/1uWo42AgJWbcPGfuoh/gd2E
K8x3scTqgbZKHEA4iT7n/bFN8XMm9MD4pCoJ6Jb32NoCFnOLuPvAhvC+ETS2vpQ1 d/O2jmbw1lA3D+OHLyqVQFAs+PSIT3u/DS2q/sOMbuoNJKwEU8PE9miyEI0X3yhc
3w5r+lkbgNsJ7rM5+tgXUjoniClmJ4sLTnAUT3T2dt3elwnG7bjgMiww1OESCKtw FuAhJiO6KBtpA2Yp6xqgzPrboZ/wLmdhnzxsZojIfVh+XQh5cTDrMMjq5p2UaZUj
9Gpgc/15GuKhKfx3KdeSULNW+XtUFYVOtepQfW2F1cEXtG89/XrSkUy+VJABsQLK 2HUk41zJ/HrmrlG+eIlHm8vZL1iTgWurR+/zHu0ieDx+3NcEdOHyjsPXhlTLmv7y
E3FJoTAzQ7zcCvq1FS0BOM/lG5R1ECBQBl7AXtnMVBKAEH38Em98ybPHAzjUsEPw sxk+mYFOebMcuT2lWqwAcO4fMmpQW1aQ15/HsqA5CEbr0uS56u/jRfOj6avWDiSu
G9tMV1d+MW2HPK3JnceMJRfEPBEUJGTw7D1WmiisHLf7GTJ81EUDVZwVSb4rNZc= GKZqjqdWHikDqWz5jXHdE2pNJ2HJuphHE0MVyseL6FYOWVAkyPAgOeyKNZG3ktY=
=LxBv =PeD6
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 32 KiB

BIN
images/ubuntumono-b-webfont.eot Executable file

Binary file not shown.

91
images/ubuntumono-b-webfont.svg Executable file
View file

@ -0,0 +1,91 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="ubuntu_monobold" horiz-adv-x="1024" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="500" />
<glyph unicode="&#xd;" />
<glyph />
<glyph />
<glyph unicode=" " />
<glyph unicode="0" d="M72 637q0 332 114.5 495.5t325.5 163.5q215 0 327.5 -162.5t112.5 -496.5q0 -336 -112.5 -500t-327.5 -164t-327.5 164t-112.5 500zM299 637q0 -219 55.5 -333t157.5 -114q104 0 158.5 114t54.5 333q0 217 -54.5 330.5t-158.5 113.5q-102 0 -157.5 -113.5t-55.5 -330.5z M399 657q0 55 31 96.5t84 41.5q49 0 81 -41.5t32 -96.5t-32 -95t-81 -40q-53 0 -84 40t-31 95z" />
<glyph unicode="1" d="M98 1004q49 18 106.5 46.5t115 63.5t108.5 74t88 80h172v-1059h252v-209h-770v209h266v709q-57 -41 -131 -73t-125 -50z" />
<glyph unicode="2" d="M88 1128q82 86 189.5 127t214.5 41q78 0 149.5 -22.5t126.5 -67.5t88 -113.5t33 -158.5q0 -66 -24.5 -126t-65.5 -117.5t-92.5 -111t-104.5 -102.5q-27 -25 -61.5 -58.5t-65.5 -69.5t-52.5 -72.5t-21.5 -67.5h545v-209h-827q-6 20 -5 51t1 43q0 102 37.5 188.5t96 159 t125 135t125 120t96.5 110.5t38 108q0 78 -47 120t-119 42q-59 0 -125 -28.5t-129 -96.5z" />
<glyph unicode="3" d="M84 43l49 211q47 -20 122 -43t179 -23q129 0 181.5 55.5t52.5 137.5q0 100 -80 140t-203 40h-78v209h94q39 0 78 8t70 26.5t50 49.5t19 78q0 70 -41.5 109.5t-115.5 39.5q-72 0 -142.5 -23.5t-121.5 -58.5l-91 185q55 37 146.5 74.5t206.5 37.5q106 0 185 -26.5 t130 -74.5t75.5 -113.5t24.5 -141.5t-43 -145.5t-114 -106.5q98 -41 152.5 -121t54.5 -190q0 -88 -29 -162t-88 -128t-151.5 -84t-219.5 -30q-47 0 -99 7.5t-100.5 17.5t-89.5 22.5t-63 22.5z" />
<glyph unicode="4" d="M55 299v184q39 80 100.5 181.5t135.5 208t155.5 210t163.5 185.5h226v-762h137v-207h-137v-299h-252v299h-529zM297 506h287v446q-37 -47 -76 -100t-77 -111.5t-72.5 -118t-61.5 -116.5z" />
<glyph unicode="5" d="M72 39l51 209q45 -23 114.5 -41.5t174.5 -18.5q74 0 122 16.5t75.5 42t37.5 58.5t10 68q0 53 -17 97t-69.5 76t-148.5 49t-252 17q20 172 32.5 337t18.5 319h647v-209h-436q-4 -66 -10 -137.5t-10 -116.5q254 -16 378.5 -123t124.5 -299q0 -88 -30.5 -163t-94 -130 t-157.5 -86t-219 -31q-49 0 -100.5 6.5t-98.5 15.5t-85 21.5t-58 22.5z" />
<glyph unicode="6" d="M94 518q0 184 54.5 325.5t154.5 238t241.5 145.5t313.5 49l14 -215q-82 -2 -159.5 -16.5t-143 -48t-113.5 -87t-71 -133.5q39 16 75.5 25.5t65.5 9.5q111 0 188 -33t126 -88t70.5 -129t21.5 -155q0 -74 -23.5 -150t-73 -139.5t-125 -103.5t-180.5 -40 q-213 0 -324.5 132.5t-111.5 412.5zM342 496q0 -59 8 -113.5t28.5 -97.5t56.5 -69t89 -26q43 0 74 20.5t50.5 51.5t28.5 68t9 71q0 96 -43 148.5t-149 52.5q-39 0 -80 -8t-68 -23q-2 -18 -3 -36.5t-1 -38.5z" />
<glyph unicode="7" d="M100 1059v209h828v-191q-55 -63 -121 -178t-124 -260t-102 -310t-55 -329h-256q6 131 43 277.5t89.5 290t114 271.5t116.5 220h-533z" />
<glyph unicode="8" d="M78 317q0 96 45 181.5t141 150.5q-90 61 -122.5 131t-32.5 148q0 61 21.5 127.5t68.5 120t124.5 88t192.5 34.5q182 0 289.5 -89.5t107.5 -241.5q0 -88 -43 -173t-135 -143q117 -68 165 -147.5t48 -175.5q0 -61 -23.5 -125t-75.5 -114t-136 -83t-207 -33q-96 0 -175 23.5 t-135.5 68t-87 109t-30.5 143.5zM313 348q0 -82 58.5 -124t138.5 -42q92 0 146.5 44.5t54.5 105.5q0 41 -15.5 71.5t-49.5 56t-87 51.5t-127 54q-57 -47 -88 -105.5t-31 -111.5zM346 944q0 -72 47 -117t166 -94q63 47 90 103.5t27 109.5q0 72 -48 108t-116 36 q-66 0 -116 -37t-50 -109z" />
<glyph unicode="9" d="M92 868q0 74 25.5 151t76 139.5t126 102t178.5 39.5q213 0 325.5 -143t112.5 -399q0 -184 -53.5 -326.5t-152.5 -239t-239.5 -146.5t-312.5 -50l-8 217q164 2 293 70.5t182 216.5q-80 -35 -143 -35q-111 0 -188.5 31.5t-127 87t-72 128t-22.5 156.5zM338 872 q0 -96 45.5 -147t151.5 -51q39 0 81.5 8t69.5 23q2 16 3 39.5t1 46.5q0 51 -9 103t-30.5 95t-57.5 69.5t-89 26.5q-45 0 -77 -17t-51.5 -46t-28.5 -68t-9 -82z" />
<glyph unicode="A" d="M18 0q90 375 182.5 683t178.5 585h274q90 -279 179.5 -591t173.5 -677h-271l-59 293h-338l-57 -293h-263zM385 502h248q-12 68 -24.5 131t-28 125.5t-33 127t-37.5 136.5q-20 -72 -37.5 -136.5t-33 -127t-29 -126t-25.5 -130.5z" />
<glyph unicode="B" d="M111 20v1231q72 12 157.5 21.5t169.5 9.5q143 0 233.5 -29.5t141.5 -78t69.5 -107.5t18.5 -119q0 -90 -44 -159.5t-118 -110.5q129 -47 175.5 -127t46.5 -168q0 -115 -39 -191.5t-105.5 -122.5t-158 -65.5t-195.5 -19.5q-84 0 -174 9t-178 27zM362 211q27 -4 59 -6t62 -2 q43 0 84 7t73 26.5t52.5 55.5t20.5 91q0 92 -58.5 132t-156.5 40h-136v-344zM362 764h99q96 0 145 42t49 116q0 45 -14 72.5t-38.5 43t-57.5 20.5t-68 5q-29 0 -59.5 -2t-55.5 -6v-291z" />
<glyph unicode="C" d="M55 635q0 158 43 280.5t120 207.5t182.5 129t230.5 44q68 0 122 -11t95 -25.5t68.5 -31t41.5 -24.5l-65 -200q-47 31 -113.5 52t-152.5 21q-59 0 -115.5 -21.5t-100.5 -71.5t-72 -134t-28 -209q0 -217 75 -332.5t245 -115.5q98 0 162.5 22.5t103.5 44.5l64 -199 q-53 -33 -144.5 -60.5t-210.5 -27.5q-268 0 -409.5 172t-141.5 490z" />
<glyph unicode="D" d="M111 14v1237q86 18 161.5 24.5t141.5 6.5q125 0 228 -37t175 -115.5t112 -200.5t40 -294q0 -176 -44 -300t-122 -202t-185.5 -113.5t-236.5 -35.5q-68 0 -132.5 7t-137.5 23zM362 205q10 -2 22.5 -2h23.5q86 0 144 32.5t94 90t51.5 136.5t15.5 173q0 82 -12.5 159.5 t-43 137t-84 95.5t-137.5 36q-16 0 -36.5 -1t-37.5 -5v-852z" />
<glyph unicode="E" d="M129 0v1268h768v-209h-516v-285h448v-209h-448v-356h561v-209h-813z" />
<glyph unicode="F" d="M129 0v1268h776v-209h-524v-307h459v-209h-459v-543h-252z" />
<glyph unicode="G" d="M55 635q0 162 43 285.5t117 207.5t174 126t215 42q74 0 132.5 -11t101.5 -25.5t70.5 -31t41.5 -24.5l-65 -200q-45 29 -110.5 51t-135.5 22q-90 0 -151.5 -32.5t-101.5 -91t-57.5 -139.5t-17.5 -179q0 -227 72 -334.5t211 -107.5q23 0 49.5 2t48.5 6v463h252v-633 q-45 -16 -140 -37t-231 -21q-119 0 -214 42t-162.5 125t-104.5 207t-37 288z" />
<glyph unicode="H" d="M92 0v1268h252v-500h336v500h252v-1268h-252v559h-336v-559h-252z" />
<glyph unicode="I" d="M111 0v209h276v850h-276v209h804v-209h-274v-850h274v-209h-804z" />
<glyph unicode="J" d="M86 86l96 201q51 -33 113.5 -63.5t128.5 -30.5q98 0 158.5 52t60.5 193v621h-424v209h678v-844q0 -92 -23.5 -174t-78 -143.5t-140.5 -97.5t-209 -36q-129 0 -215 33t-145 80z" />
<glyph unicode="K" d="M92 0v1268h252v-527q45 57 94 127t93 139.5t81 137t62 123.5h284q-29 -55 -68.5 -126t-90.5 -147.5t-109.5 -156.5t-122.5 -154q63 -61 129 -141t124.5 -171t105.5 -186.5t75 -185.5h-284q-23 72 -65 155t-93 161.5t-107.5 147t-107.5 116.5v-580h-252z" />
<glyph unicode="L" d="M145 0v1268h254v-1059h543v-209h-797z" />
<glyph unicode="M" d="M47 0q6 156 13.5 324t15.5 333.5t19 321.5t26 289h209q14 -43 35.5 -110.5t46 -145.5t49 -158t47.5 -147q25 76 51.5 156.5t51 155.5t45 140.5t36.5 108.5h209q14 -166 27.5 -324t23 -312.5t15.5 -311t10 -320.5h-232l13 985l-156 -536h-184l-150 536l11 -985h-232z" />
<glyph unicode="N" d="M94 0v1268h203q57 -90 114.5 -195.5t112 -210t100.5 -203t78 -172.5v781h228v-1268h-203q-86 211 -187.5 421t-217.5 421v-842h-228z" />
<glyph unicode="O" d="M55 635q0 328 121 494.5t336 166.5q223 0 340 -166.5t117 -494.5t-119 -495t-336 -167q-223 0 -341 167t-118 495zM311 635q0 -92 7.5 -173t29 -140.5t60 -94t104.5 -34.5q63 0 103 34.5t61.5 95t29 140.5t7.5 172t-7.5 173t-29 140.5t-60 94t-104.5 34.5t-104.5 -34.5 t-60 -95t-29 -140.5t-7.5 -172z" />
<glyph unicode="P" d="M111 0v1251q37 8 83 14.5t93 9.5t92 5t80 2q242 0 375 -99.5t133 -324.5q0 -227 -134.5 -328.5t-379.5 -101.5h-91v-428h-251zM362 647h103q121 0 182.5 48t61.5 165q0 111 -61 157t-161 46q-23 0 -62.5 -1t-62.5 -5v-410z" />
<glyph unicode="Q" d="M55 629q0 328 121 494.5t336 166.5q223 0 340 -167t117 -494q0 -287 -92.5 -452t-266.5 -200q23 -51 110 -84.5t238 -60.5l-53 -180q-240 33 -361.5 109.5t-144.5 220.5q-166 41 -255 203.5t-89 443.5zM311 629q0 -92 7.5 -172t29 -140.5t60 -95.5t104.5 -35q63 0 103 35 t61.5 95.5t29 140.5t7.5 172t-7.5 173t-29 140t-60 94t-104.5 35t-104.5 -35t-60 -95t-29 -140t-7.5 -172z" />
<glyph unicode="R" d="M111 0v1249q37 8 81 15.5t89 10.5t85.5 5t71.5 2q109 0 197 -24.5t151.5 -76t97.5 -130t34 -185.5q0 -111 -45.5 -201t-149.5 -137q35 -53 74 -117.5t75.5 -135t70.5 -141.5t58 -134h-264q-47 123 -109.5 236.5t-133.5 230.5h-132v-467h-251zM362 676h56q129 0 186.5 50 t57.5 142q0 100 -61.5 147.5t-162.5 47.5q-14 0 -34.5 -1t-41.5 -5v-381z" />
<glyph unicode="S" d="M82 70l74 204q55 -33 131.5 -61.5t187.5 -28.5q63 0 105.5 13.5t67 37t33.5 53t9 60.5q0 39 -22.5 70t-57.5 54.5t-78 43t-86 35.5q-57 20 -118.5 47t-111.5 68t-83 101t-33 151q0 178 116 278t319 100q117 0 203.5 -26.5t146.5 -59.5l-74 -194q-51 29 -113.5 49 t-144.5 20q-201 0 -201 -145q0 -37 20.5 -64.5t52.5 -49t72 -38t78 -30.5q59 -23 124 -50.5t119 -73.5t89 -114.5t35 -173.5q0 -178 -115.5 -275.5t-351.5 -97.5q-158 0 -252 34t-141 63z" />
<glyph unicode="T" d="M51 1059v209h922v-209h-334v-1059h-254v1059h-334z" />
<glyph unicode="U" d="M80 459v809h254v-793q0 -80 8 -134t27.5 -87t54.5 -47t88 -14t88 14t55.5 48t28.5 88t8 134v791h252v-809q0 -111 -20.5 -201t-71.5 -153.5t-135 -97.5t-209 -34q-123 0 -206 34t-132 97.5t-69.5 153.5t-20.5 201z" />
<glyph unicode="V" d="M27 1268h266q12 -98 36.5 -228.5t54.5 -268.5t63.5 -272t66.5 -241q33 104 65.5 238.5t61.5 272.5t53.5 269t40.5 230h264q-25 -123 -60.5 -274.5t-81.5 -318.5t-101.5 -340t-114.5 -335h-260q-49 141 -104.5 319.5t-104.5 355.5t-88 334.5t-57 258.5z" />
<glyph unicode="W" d="M47 1268h234q-2 -121 -4.5 -250t-4.5 -257t-4 -250t-2 -228q18 66 42 143.5t45.5 153t40 139t28.5 100.5h184q8 -39 24.5 -96t36 -127t43 -149.5t46.5 -163.5q0 106 -2 228t-4 249t-4.5 257t-2.5 251h234q-6 -156 -12.5 -321t-14.5 -327.5t-19 -320.5t-26 -299h-209 q-45 129 -90 277.5t-90 283.5q-45 -129 -94 -280.5t-90 -280.5h-209q-16 141 -28.5 300t-22 321.5t-15.5 327.5t-10 319z" />
<glyph unicode="X" d="M23 0q20 55 60 133t88 168t101.5 185.5t102.5 183.5l-332 598h272l201 -406l211 406h254l-324 -592q55 -88 108.5 -184.5t99.5 -187.5t81 -170t55 -134h-272q-39 104 -95 231t-118 254q-59 -121 -118.5 -251t-102.5 -234h-272z" />
<glyph unicode="Y" d="M27 1268h270q47 -147 104.5 -300t118.5 -280q23 47 52.5 119t59.5 151.5t57.5 161.5t49.5 148h260q-39 -104 -77.5 -202.5t-81.5 -195t-92.5 -191.5t-106.5 -196v-483h-254v481q-113 199 -198 388.5t-162 398.5z" />
<glyph unicode="Z" d="M94 0v145q45 88 96.5 185.5t115 208t138 239.5t164.5 281h-487v209h790v-176q-88 -135 -161.5 -254t-137 -226.5t-120 -207t-107.5 -195.5h545v-209h-836z" />
<glyph unicode="a" d="M90 295q0 84 33 141.5t88 92t127 50t149 15.5q98 0 175 -16v30q0 72 -45.5 120t-155.5 48q-72 0 -138.5 -10t-107.5 -25l-35 203q47 16 133.5 29.5t178.5 13.5q119 0 197.5 -27.5t125.5 -78t67.5 -123t20.5 -162.5v-573q-55 -12 -163.5 -29t-243.5 -17q-92 0 -167 16.5 t-128.5 54.5t-82 98.5t-28.5 148.5zM338 301q0 -66 49 -93.5t127 -27.5q41 0 80 1t68 5v222q-25 4 -60 7t-63 3q-39 0 -76 -5t-64.5 -17.5t-44 -35t-16.5 -59.5z" />
<glyph unicode="b" d="M127 29v1349l252 43v-481q53 25 102 34t99 9q94 0 165.5 -36t119.5 -102.5t73 -158.5t25 -205q0 -115 -31 -208t-90.5 -158.5t-145.5 -101.5t-196 -36q-98 0 -200.5 14.5t-172.5 37.5zM379 205q29 -6 60.5 -8t54.5 -2q98 0 155.5 66t57.5 226q0 135 -44.5 207t-134.5 72 q-41 0 -80.5 -11.5t-68.5 -27.5v-522z" />
<glyph unicode="c" d="M90 481q0 104 33 196.5t100.5 161t171 108.5t246.5 40q86 0 155.5 -12t141.5 -41l-55 -203q-41 14 -91.5 25.5t-127.5 11.5q-90 0 -150.5 -21.5t-97.5 -59.5t-53.5 -91t-16.5 -115q0 -133 75 -208.5t255 -75.5q59 0 123.5 8t118.5 26l36 -206q-53 -20 -128.5 -34 t-178.5 -14q-147 0 -252.5 39t-173 106.5t-99.5 160t-32 198.5z" />
<glyph unicode="d" d="M57 475q0 236 97.5 372t287.5 136q51 0 100.5 -11t86.5 -32v438l252 43v-1392q-70 -23 -170.5 -37.5t-196.5 -14.5q-225 0 -341 133.5t-116 364.5zM313 487q0 -129 48.5 -210.5t154.5 -81.5q31 0 57.5 2t55.5 6v524q-29 16 -66 27.5t-78 11.5q-90 0 -131 -72t-41 -207z " />
<glyph unicode="e" d="M63 473q0 127 39 223.5t102.5 161t145.5 97t168 32.5q213 0 323.5 -126t110.5 -367q0 -25 -1 -51.5t-3 -43.5h-624q0 -94 77.5 -148t200.5 -54q76 0 144.5 16t115.5 33l35 -215q-66 -23 -139.5 -38.5t-165.5 -15.5q-123 0 -220.5 32t-166 94.5t-105.5 154.5t-37 215z M324 573h385q0 39 -10.5 75t-33 64.5t-57.5 46t-86 17.5q-49 0 -85 -16.5t-59.5 -45t-36.5 -65.5t-17 -76z" />
<glyph unicode="f" d="M74 754v209h211v55q0 117 33.5 193.5t91 122.5t131 65.5t151.5 19.5q80 0 164 -14t152 -47l-43 -205q-47 16 -118 33.5t-134 17.5q-35 0 -67 -6t-55.5 -26.5t-37.5 -58.5t-14 -99v-51h395v-209h-395v-754h-254v754h-211z" />
<glyph unicode="g" d="M68 512q0 238 131 354.5t356 116.5q158 0 342 -51v-815q0 -236 -113.5 -348.5t-365.5 -112.5q-90 0 -173 18.5t-159 42.5l47 213q59 -23 125 -42t164 -19q66 0 108.5 15.5t67.5 42t35 62.5t10 77v38q-53 -20 -97 -30.5t-95 -10.5q-188 0 -285.5 119t-97.5 330zM324 512 q0 -119 43 -181.5t135 -62.5q41 0 76.5 10.5t64.5 26.5v463q-29 6 -51.5 8t-46.5 2q-221 0 -221 -266z" />
<glyph unicode="h" d="M129 0v1378l252 43v-467q31 10 74 19.5t75 9.5q106 0 178 -31.5t115 -90t61.5 -139.5t18.5 -179v-543h-252v510q0 135 -30.5 194.5t-116.5 59.5q-35 0 -69 -8t-54 -15v-741h-252z" />
<glyph unicode="i" d="M74 754v209h518v-596q0 -86 31.5 -128t105.5 -42q35 0 84 9t111 38l32 -203q-78 -37 -146.5 -50.5t-125.5 -13.5q-98 0 -164.5 29t-106.5 83t-56.5 132t-16.5 178v355h-266zM264 1239q0 76 46 119t112 43t113 -43t47 -119q0 -74 -47.5 -117t-112.5 -43q-66 0 -112 43 t-46 117z" />
<glyph unicode="j" d="M100 -260l78 213q51 -29 124 -54.5t132 -25.5q63 0 98 38t35 140v703h-389v209h641v-900q0 -117 -28.5 -195.5t-78.5 -126.5t-119 -68.5t-149 -20.5q-98 0 -182 24.5t-162 63.5zM471 1239q0 76 46 119t112 43t112.5 -43t46.5 -119q0 -74 -47 -117t-112 -43q-66 0 -112 43 t-46 117z" />
<glyph unicode="k" d="M129 0v1378l254 43v-839q37 43 75 91t73.5 99t68.5 99.5t57 91.5h304q-37 -47 -84.5 -102.5t-97.5 -113t-100 -110.5t-91 -98q51 -49 110.5 -118t116.5 -142.5t105.5 -147.5t76.5 -131h-288q-25 51 -65 115.5t-85 127t-91 119t-85 93.5v-455h-254z" />
<glyph unicode="l" d="M74 1200v209h518v-1044q0 -98 39 -133t98 -35q76 0 127 20.5t68 26.5l32 -203q-6 -4 -27.5 -14.5t-56 -21.5t-85 -19.5t-113.5 -8.5q-174 0 -254 103.5t-80 302.5v817h-266z" />
<glyph unicode="m" d="M59 0v926q80 23 158 35t137 12q53 0 95.5 -13.5t72.5 -44.5q35 23 82 40.5t98 17.5q80 0 131.5 -24.5t81 -74t40 -124t10.5 -175.5v-575h-205v588q0 57 -7.5 92t-18.5 53.5t-26.5 24.5t-31.5 6q-18 0 -39 -3t-37 -11q6 -39 10 -86.5t4 -104.5v-192h-204v221 q0 98 -19.5 137t-62.5 39q-12 0 -29.5 -2t-34.5 -6v-756h-205z" />
<glyph unicode="n" d="M129 0v932q68 18 167 34.5t216 16.5q115 0 190.5 -31.5t119.5 -90t62.5 -139.5t18.5 -179v-543h-252v510q0 135 -30.5 194.5t-124.5 59.5q-29 0 -56.5 -2t-58.5 -6v-756h-252z" />
<glyph unicode="o" d="M59 483q0 113 34 206t94.5 159.5t144.5 102.5t182 36q100 0 183 -36t143.5 -102.5t93.5 -159.5t33 -206q0 -115 -33 -208t-92.5 -160.5t-142.5 -104.5t-185 -37t-185 37t-143.5 104.5t-93.5 161t-33 207.5zM315 481q0 -129 46.5 -208.5t148.5 -79.5q98 0 148.5 79.5 t50.5 208.5t-46.5 208t-148.5 79q-98 0 -148.5 -79t-50.5 -208z" />
<glyph unicode="p" d="M129 -338v1270q70 23 171 37t200 14q223 0 342 -135.5t119 -366.5q0 -111 -25 -204t-72 -159.5t-118.5 -103.5t-165.5 -37q-96 0 -199 48v-363h-252zM381 231q25 -16 65.5 -26t81.5 -10q90 0 133.5 72.5t43.5 205.5q0 129 -51.5 212t-155.5 83q-29 0 -62 -3l-55 -5v-529z " />
<glyph unicode="q" d="M63 481q0 111 31 204t89.5 158.5t145.5 102.5t197 37q47 0 99.5 -4t101.5 -11t93 -16.5t77 -19.5v-1270h-252v365q-47 -23 -99 -36.5t-100 -13.5q-94 0 -165.5 36t-119.5 101.5t-73 158.5t-25 208zM319 473q0 -133 44.5 -205.5t134.5 -72.5q43 0 80.5 10t66.5 26v529 q-18 2 -50 5t-67 3q-104 0 -156.5 -83t-52.5 -212z" />
<glyph unicode="r" d="M182 0v899q100 37 206 59.5t247 22.5q20 0 58 -2t81 -7t87 -12.5t79 -19.5l-45 -233q-25 6 -58.5 12t-68.5 11t-67.5 7t-55.5 2q-53 0 -104.5 -5t-104.5 -19v-715h-254z" />
<glyph unicode="s" d="M111 57l39 211q72 -29 152.5 -53.5t164.5 -24.5q92 0 141 13.5t49 54.5q0 27 -15 45.5t-43 31.5t-63.5 25.5t-74.5 24.5q-55 16 -112.5 37.5t-104.5 54.5t-78 83t-31 126q0 61 23.5 115.5t74 96.5t128 65.5t186.5 23.5q94 0 175 -14.5t140 -40.5l-39 -213 q-35 10 -108.5 33.5t-165.5 23.5q-96 0 -130 -23.5t-34 -50.5q0 -23 15.5 -40t41 -31.5t59.5 -27.5t72 -25q55 -18 115 -41t108 -57t78.5 -86t30.5 -128q0 -59 -22.5 -112.5t-74.5 -92t-136 -61.5t-207 -23q-125 0 -213 29t-141 51z" />
<glyph unicode="t" d="M74 754v209h219v241l252 41v-282h403v-209h-403v-389q0 -53 10 -86t28.5 -51.5t45 -24.5t59.5 -6q35 0 64.5 2t57.5 7t57.5 15t64.5 27l35 -217q-70 -29 -151 -41.5t-157 -12.5q-88 0 -155.5 14.5t-114.5 55.5t-71.5 116t-24.5 195v396h-219z" />
<glyph unicode="u" d="M121 426v537h252v-504q0 -133 31.5 -197.5t123.5 -64.5q57 0 115 10v756h254v-930q-70 -18 -169 -37t-216 -19q-119 0 -194.5 33t-119.5 93.5t-60.5 142.5t-16.5 180z" />
<glyph unicode="v" d="M29 963h264q18 -78 43.5 -166t54.5 -177.5t58.5 -173.5t56.5 -153q27 70 59.5 153.5t64.5 173t61.5 177.5t47.5 166h256q-86 -291 -190.5 -536t-196.5 -427h-211q-92 182 -187 427t-181 536z" />
<glyph unicode="w" d="M23 963h215q8 -178 17 -348.5t34 -350.5q27 78 46 144.5t34.5 127t29 117t27.5 115.5h182q12 -59 25.5 -115.5t29 -117t33 -127t41.5 -144.5q12 94 20.5 180t13.5 171t8 170t7 178h215q-23 -281 -62.5 -529t-88.5 -434h-191q-23 63 -42 116.5t-36.5 103.5t-35 104.5 t-35.5 119.5q-20 -66 -36.5 -118t-34 -103t-36 -104t-45.5 -119h-190q-25 90 -46.5 199.5t-40 233.5t-32.5 257t-26 273z" />
<glyph unicode="x" d="M41 0q31 57 71 119.5t84 127t92 128t93 121.5l-338 467h264l213 -301l197 301h256l-311 -463q49 -59 96 -126t90 -134.5t78 -129t59 -110.5h-262q-55 104 -110.5 186t-104.5 148q-61 -82 -110.5 -160t-100.5 -174h-256z" />
<glyph unicode="y" d="M41 -307l47 211q41 -18 73 -25.5t68 -7.5q74 0 119 49t72 117q-90 180 -180 412.5t-164 513.5h262q18 -76 41.5 -162t50.5 -172t56.5 -169t60.5 -155q20 72 42.5 155t43 168t40 171t36.5 164h258q-39 -135 -75 -265.5t-75 -254.5t-83 -242.5t-95 -231.5q-39 -82 -77 -141 t-84 -97t-102.5 -56.5t-131.5 -18.5q-63 0 -115.5 10t-87.5 27z" />
<glyph unicode="z" d="M137 0v154q47 78 102.5 159.5t111 160.5t108.5 150.5t96 129.5h-397v209h714v-185q-29 -33 -82 -97.5t-115.5 -144t-125 -166.5t-111.5 -161h455v-209h-756z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="710" />
<glyph unicode="&#x2001;" horiz-adv-x="1421" />
<glyph unicode="&#x2002;" horiz-adv-x="710" />
<glyph unicode="&#x2003;" horiz-adv-x="1421" />
<glyph unicode="&#x2004;" horiz-adv-x="473" />
<glyph unicode="&#x2005;" horiz-adv-x="355" />
<glyph unicode="&#x2006;" horiz-adv-x="236" />
<glyph unicode="&#x2007;" horiz-adv-x="236" />
<glyph unicode="&#x2008;" horiz-adv-x="177" />
<glyph unicode="&#x2009;" horiz-adv-x="284" />
<glyph unicode="&#x200a;" horiz-adv-x="78" />
<glyph unicode="&#x202f;" horiz-adv-x="284" />
<glyph unicode="&#x205f;" horiz-adv-x="355" />
<glyph unicode="&#xe000;" horiz-adv-x="962" d="M0 0v963h963v-963h-963z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 18 KiB

BIN
images/ubuntumono-b-webfont.ttf Executable file

Binary file not shown.

BIN
images/ubuntumono-b-webfont.woff Executable file

Binary file not shown.