>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
15 | l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
16 | (function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
17 | _doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
18 | f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
19 | m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
20 | E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
21 | 4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
22 | (function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
28 | this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
29 | 1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
30 | decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
31 | b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
32 | (function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
33 | 16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;dd||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
34 | 8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
35 | d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
36 |
--------------------------------------------------------------------------------
/sass/styles.scss:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: "HKGroteskRegular";
3 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Regular.otf") format("opentype");
4 | }
5 | @font-face {
6 | font-family: "HKGroteskBold";
7 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Bold.otf") format("opentype");
8 | }
9 | @font-face {
10 | font-family: "HKGroteskLight";
11 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Light.otf") format("opentype");
12 | }
13 | @font-face {
14 | font-family: "HKGroteskMedium";
15 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Medium.otf") format("opentype");
16 | }
17 | @font-face {
18 | font-family: "AquaticoRegular";
19 | src: url("/assets/fonts/aquatico/Aquatico-Regular.otf") format("opentype");
20 | }
21 |
22 | $mobileWidthBreak: 1130px;
23 | $mobileHeightBreak: 600px;
24 | $mobileSectionOneWidthBreak: 745px;
25 |
26 | @media print {
27 | header {
28 | display: none;
29 | }
30 | footer {
31 | display: none;
32 | }
33 | }
34 |
35 | header {
36 | text-align: center;
37 | position: fixed;
38 | width: 100%;
39 | z-index: 2;
40 | .links {
41 | display: inline-block;
42 | vertical-align: top;
43 | a {
44 | color: #FFFFFF;
45 | text-decoration: none;
46 | margin: 0.5rem 0.5rem;
47 | display: inline-block;
48 | &:hover {
49 | color: #FFC345
50 | }
51 | @media (max-width: $mobileWidthBreak) {
52 | font-size: 0.9rem;
53 | }
54 | }
55 | }
56 | .logo {
57 | display: inline-block;
58 | vertical-align: top;
59 | text-decoration: none;
60 | div {
61 | width: 14rem;
62 | height: 10rem;
63 | background-repeat: no-repeat;
64 | background-image: url(/assets/img/bithereum-top.png);
65 | background-size: contain;
66 | background-position: top center;
67 | margin: 0 2rem;
68 | }
69 | h1 {
70 | color: #FFFFFF;
71 | font-size: 1.4rem;
72 | display: none;
73 | color: #FFC345;
74 | text-transform: uppercase;
75 | margin: 0.3rem 2rem 0 2rem;
76 | font-family: "HKGroteskMedium";
77 | }
78 | }
79 | .social {
80 | display: inline-block;
81 | vertical-align: top;
82 | a {
83 | color: #FFFFFF;
84 | text-decoration: none;
85 | margin: 0.5rem 0.6rem;
86 | display: inline-block;
87 | font-size: 1.3rem;
88 | &:hover {
89 | color: #FFC345
90 | }
91 | }
92 | }
93 | &.condensed {
94 | background-color: #1E2631;
95 | box-shadow: 0px 0px 4px 1px #1E2631;
96 | padding: 0.5rem;
97 | .logo {
98 | div {
99 | display: none;
100 | }
101 | h1 {
102 | display: inline-block;
103 | }
104 | }
105 | }
106 | @media (max-width: $mobileWidthBreak) {
107 | background-color: #1E2631;
108 | box-shadow: 0px 0px 4px 1px #1E2631;
109 | padding: 0.5rem;
110 | .social {
111 | display: none;
112 | }
113 | .links {
114 | display: block;
115 | }
116 | .logo {
117 | div {
118 | display: none;
119 | }
120 | h1 {
121 | display: inline-block;
122 | }
123 | }
124 | }
125 | }
126 |
127 | .page#page-redemption {
128 |
129 | section#redemption {
130 | width: 100%;
131 | min-height: 30rem;
132 | background: url(/assets/img/btc-eth-bg.png) #1E2631;
133 | background-position: center center;
134 | background-size: cover;
135 | background-repeat: no-repeat;
136 | padding: 5rem 0 5rem 0;
137 |
138 | .content {
139 | margin: 0 auto;
140 | width: 90%;
141 | max-width: 38rem;
142 | display: block;
143 | h2 {
144 | color: #FFFFFF;
145 | text-align: center;
146 | font-size: 1.8rem;
147 | }
148 | p {
149 | line-height: 1.5;
150 | color: #FFFFFF;
151 | margin-bottom: 2rem;
152 | }
153 | a {
154 | color: #FFC345;
155 | text-decoration: none;
156 | }
157 | h3 {
158 | color: #FFC345;
159 | display: inline-block;
160 | margin: 0 0.5rem;
161 | @media (max-width: 40em) {
162 | margin: 0.5rem 0;
163 | }
164 | }
165 |
166 | .steps {
167 | .step {
168 | display: none;
169 | margin-bottom: 5rem;
170 | &.show {
171 | display: block;
172 | }
173 | .count {
174 | width: 1.8rem;
175 | height: 1.8rem;
176 | border-radius: 2.5rem;
177 | box-sizing: border-box;
178 | background-color: #FFC345;
179 | color: #000000;
180 | text-align: center;
181 | padding: 0.2rem 0 0 0;
182 | font-size: 1.2rem;
183 | display: inline-block;
184 | font-family: "HKGroteskBold";
185 | @media (max-width: 40em) {
186 | display: none;
187 | }
188 | }
189 | #generateaddress {
190 | background-color: #FFC345;
191 | color: #000000;
192 | padding: 0.8rem 2rem;
193 | border-radius: 0.3rem;
194 | display: block;
195 | text-align: center;
196 | max-width: 10rem;
197 | margin: 2rem 0;
198 | &:hover {
199 | opacity: 0.8;
200 | }
201 | }
202 |
203 | #bthaddress {
204 | display: none;
205 | text-align: center;
206 | &.show {
207 | display: block;
208 | }
209 | #publicaddressQRCode {
210 | vertical-align: top;
211 | max-width: 13rem;
212 | display: inline-block;
213 | text-align: center;
214 | margin: 1rem 2rem 4rem 2rem;
215 | #publicaddressQR {
216 | display: block;
217 | margin: 1rem auto;
218 | width: 11.25rem;
219 | }
220 | strong {
221 | color: #00a30c;
222 | display: block;
223 | text-align: center;
224 | font-size: 1.4rem;
225 | margin-bottom: 1rem;
226 | }
227 | span {
228 | color: #FFFFFF;
229 | }
230 | }
231 |
232 | #privatekeyQRCode {
233 | vertical-align: top;
234 | max-width: 13rem;
235 | display: inline-block;
236 | text-align: center;
237 | margin: 1rem 2rem 4rem 2rem;
238 | #privatekeyQR {
239 | display: block;
240 | margin: 1rem auto;
241 | width: 11.25rem;
242 | }
243 | strong {
244 | color: #ff0000;
245 | display: block;
246 | text-align: center;
247 | font-size: 1.4rem;
248 | margin-bottom: 1rem;
249 | }
250 | span {
251 | color: #FFFFFF;
252 | }
253 | }
254 |
255 | #publicaddressText {
256 | display: block;
257 | margin-bottom: 3rem;
258 | strong {
259 | color: #FFFFFF;
260 | display: block;
261 | margin-bottom: 0.5rem;
262 | }
263 | span {
264 | word-wrap: break-word;
265 | background-color: #ffcf6a;
266 | display: block;
267 | padding: 0.5rem;
268 | border-radius: 0.5rem;
269 | font-size: 0.85rem;
270 | }
271 | }
272 |
273 | #privatekeyText {
274 | display: block;
275 | margin-bottom: 3rem;
276 | strong {
277 | color: #FFFFFF;
278 | display: block;
279 | margin-bottom: 0.5rem;
280 | }
281 | span {
282 | word-wrap: break-word;
283 | background-color: #ffcf6a;
284 | display: block;
285 | padding: 0.5rem;
286 | border-radius: 0.5rem;
287 | font-size: 0.85rem;
288 | }
289 | }
290 | }
291 |
292 | #hexedpublicaddressText {
293 | display: block;
294 | margin-bottom: 3rem;
295 | text-align: center;
296 | strong {
297 | color: #FFFFFF;
298 | display: block;
299 | margin-bottom: 0.5rem;
300 | }
301 | span {
302 | word-wrap: break-word;
303 | background-color: #ffcf6a;
304 | display: block;
305 | padding: 0.5rem;
306 | border-radius: 0.5rem;
307 | font-size: 0.85rem;
308 | }
309 | }
310 |
311 | }
312 | }
313 |
314 | .wallets {
315 | text-align: center;
316 |
317 | .wallet {
318 | display: inline-block;
319 | margin: 1rem;
320 | text-decoration: none;
321 |
322 |
323 | &:hover {
324 | .image {
325 | border-color: #FFC345;
326 | opacity: 1;
327 | transition: all 0.5s ease;
328 | }
329 | .name {
330 | color: #FFC345;
331 | opacity: 1;
332 | transition: all 0.5s ease;
333 | }
334 | }
335 |
336 | .image {
337 | background-color: #FFFFFF;
338 | padding: 1rem;
339 | border-radius: 0.5rem;
340 | margin-bottom: 0.5rem;
341 | border: 0.2rem solid transparent;
342 | opacity: 0.8;
343 | transition: all 0.5s ease;
344 |
345 | & > div {
346 | width: 5rem;
347 | height: 5rem;
348 | background-position: center center;
349 | background-repeat: no-repeat;
350 | background-size: contain;
351 | overflow: hidden;
352 | }
353 | }
354 | .name {
355 | text-align: center;
356 | color: #FFFFFF;
357 | opacity: 0.8;
358 | }
359 | }
360 | }
361 |
362 | @media print {
363 | & > h2 {
364 | display: none;
365 | }
366 | & > p {
367 | display: none;
368 | }
369 | .step {
370 | &[data-step="1"] {
371 | display: none!important;
372 | }
373 | &[data-step="2"] {
374 | .count, h3, p, a {
375 | display: none;
376 | }
377 | }
378 | &[data-step="3"] {
379 | display: none!important;
380 | }
381 | &[data-step="4"] {
382 | display: none!important;
383 | }
384 | }
385 | }
386 | }
387 | }
388 | }
389 |
390 | footer {
391 |
392 | .copyright {
393 | color: #F6C357;
394 | line-height: 2;
395 | padding: 0 3rem;
396 | font-size: 0.8rem;
397 | box-sizing: border-box;
398 | display: block;
399 | margin-top: 2rem;
400 | padding-bottom: 2rem;
401 | display: block;
402 | }
403 |
404 | #footer-holder {
405 | background-color: #1E2631;
406 | max-height: 30rem;
407 | overflow: hidden;
408 | text-align: center;
409 | position: relative;
410 |
411 | @media (max-width: $mobileWidthBreak) {
412 | max-height: auto;
413 | min-height: 30rem;
414 | }
415 |
416 | .content {
417 | width: 100%;
418 | position: absolute;
419 | z-index: 1;
420 | top: 3rem;
421 | h2 {
422 | color: #FFFFFF;
423 | font-size: 2.5rem;
424 | font-family: "HKGroteskLight";
425 | }
426 | a.btn {
427 | padding: 0.8rem 3rem;
428 | margin: 0.5rem;
429 | background-color: #FFFFFF;
430 | text-decoration: none;
431 | color: #F8C545;
432 | font-family: "HKGroteskMedium";
433 | border-radius: 2rem;
434 | font-size: 1.1rem;
435 | display: inline-block;
436 | &:hover {
437 | background-color: #F8C545;
438 | color: #FFFFFF;
439 | }
440 | }
441 | .social {
442 | a {
443 | &:hover {
444 | color: #F8C545;
445 | }
446 | color: #FFFFFF;
447 | font-size: 1.8rem;
448 | display: inline-block;
449 | margin: 2rem 1rem;
450 | @media (max-width: $mobileWidthBreak) {
451 | font-size: 1.1rem;
452 | margin: 1rem 0.3rem;
453 | }
454 | }
455 | }
456 | }
457 |
458 | .footer-logo {
459 | width: 13rem;
460 | height: 4rem;
461 | background-image: url(/assets/img/footer-logo.png);
462 | background-position: center center;
463 | background-repeat: no-repeat;
464 | background-size: contain;
465 | margin: 1rem auto;
466 | display: block;
467 | @media (max-width: $mobileWidthBreak) {
468 | width: 10rem;
469 | height: 3rem;
470 | }
471 | }
472 | }
473 | }
474 |
--------------------------------------------------------------------------------
/public/assets/css/styles.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: "HKGroteskRegular";
3 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Regular.otf") format("opentype"); }
4 | @font-face {
5 | font-family: "HKGroteskBold";
6 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Bold.otf") format("opentype"); }
7 | @font-face {
8 | font-family: "HKGroteskLight";
9 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Light.otf") format("opentype"); }
10 | @font-face {
11 | font-family: "HKGroteskMedium";
12 | src: url("/assets/fonts/hk-grotesk/HKGrotesk-Medium.otf") format("opentype"); }
13 | @font-face {
14 | font-family: "AquaticoRegular";
15 | src: url("/assets/fonts/aquatico/Aquatico-Regular.otf") format("opentype"); }
16 | @media print {
17 | header {
18 | display: none; }
19 |
20 | footer {
21 | display: none; } }
22 | header {
23 | text-align: center;
24 | position: fixed;
25 | width: 100%;
26 | z-index: 2; }
27 | header .links {
28 | display: inline-block;
29 | vertical-align: top; }
30 | header .links a {
31 | color: #FFFFFF;
32 | text-decoration: none;
33 | margin: 0.5rem 0.5rem;
34 | display: inline-block; }
35 | header .links a:hover {
36 | color: #FFC345; }
37 | @media (max-width: 1130px) {
38 | header .links a {
39 | font-size: 0.9rem; } }
40 | header .logo {
41 | display: inline-block;
42 | vertical-align: top;
43 | text-decoration: none; }
44 | header .logo div {
45 | width: 14rem;
46 | height: 10rem;
47 | background-repeat: no-repeat;
48 | background-image: url(/assets/img/bithereum-top.png);
49 | background-size: contain;
50 | background-position: top center;
51 | margin: 0 2rem; }
52 | header .logo h1 {
53 | color: #FFFFFF;
54 | font-size: 1.4rem;
55 | display: none;
56 | color: #FFC345;
57 | text-transform: uppercase;
58 | margin: 0.3rem 2rem 0 2rem;
59 | font-family: "HKGroteskMedium"; }
60 | header .social {
61 | display: inline-block;
62 | vertical-align: top; }
63 | header .social a {
64 | color: #FFFFFF;
65 | text-decoration: none;
66 | margin: 0.5rem 0.6rem;
67 | display: inline-block;
68 | font-size: 1.3rem; }
69 | header .social a:hover {
70 | color: #FFC345; }
71 | header.condensed {
72 | background-color: #1E2631;
73 | box-shadow: 0px 0px 4px 1px #1E2631;
74 | padding: 0.5rem; }
75 | header.condensed .logo div {
76 | display: none; }
77 | header.condensed .logo h1 {
78 | display: inline-block; }
79 | @media (max-width: 1130px) {
80 | header {
81 | background-color: #1E2631;
82 | box-shadow: 0px 0px 4px 1px #1E2631;
83 | padding: 0.5rem; }
84 | header .social {
85 | display: none; }
86 | header .links {
87 | display: block; }
88 | header .logo div {
89 | display: none; }
90 | header .logo h1 {
91 | display: inline-block; } }
92 |
93 | .page#page-redemption section#redemption {
94 | width: 100%;
95 | min-height: 30rem;
96 | background: url(/assets/img/btc-eth-bg.png) #1E2631;
97 | background-position: center center;
98 | background-size: cover;
99 | background-repeat: no-repeat;
100 | padding: 5rem 0 5rem 0; }
101 | .page#page-redemption section#redemption .content {
102 | margin: 0 auto;
103 | width: 90%;
104 | max-width: 38rem;
105 | display: block; }
106 | .page#page-redemption section#redemption .content h2 {
107 | color: #FFFFFF;
108 | text-align: center;
109 | font-size: 1.8rem; }
110 | .page#page-redemption section#redemption .content p {
111 | line-height: 1.5;
112 | color: #FFFFFF;
113 | margin-bottom: 2rem; }
114 | .page#page-redemption section#redemption .content a {
115 | color: #FFC345;
116 | text-decoration: none; }
117 | .page#page-redemption section#redemption .content h3 {
118 | color: #FFC345;
119 | display: inline-block;
120 | margin: 0 0.5rem; }
121 | @media (max-width: 40em) {
122 | .page#page-redemption section#redemption .content h3 {
123 | margin: 0.5rem 0; } }
124 | .page#page-redemption section#redemption .content .steps .step {
125 | display: none;
126 | margin-bottom: 5rem; }
127 | .page#page-redemption section#redemption .content .steps .step.show {
128 | display: block; }
129 | .page#page-redemption section#redemption .content .steps .step .count {
130 | width: 1.8rem;
131 | height: 1.8rem;
132 | border-radius: 2.5rem;
133 | box-sizing: border-box;
134 | background-color: #FFC345;
135 | color: #000000;
136 | text-align: center;
137 | padding: 0.2rem 0 0 0;
138 | font-size: 1.2rem;
139 | display: inline-block;
140 | font-family: "HKGroteskBold"; }
141 | @media (max-width: 40em) {
142 | .page#page-redemption section#redemption .content .steps .step .count {
143 | display: none; } }
144 | .page#page-redemption section#redemption .content .steps .step #generateaddress {
145 | background-color: #FFC345;
146 | color: #000000;
147 | padding: 0.8rem 2rem;
148 | border-radius: 0.3rem;
149 | display: block;
150 | text-align: center;
151 | max-width: 10rem;
152 | margin: 2rem 0; }
153 | .page#page-redemption section#redemption .content .steps .step #generateaddress:hover {
154 | opacity: 0.8; }
155 | .page#page-redemption section#redemption .content .steps .step #bthaddress {
156 | display: none;
157 | text-align: center; }
158 | .page#page-redemption section#redemption .content .steps .step #bthaddress.show {
159 | display: block; }
160 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressQRCode {
161 | vertical-align: top;
162 | max-width: 13rem;
163 | display: inline-block;
164 | text-align: center;
165 | margin: 1rem 2rem 4rem 2rem; }
166 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressQRCode #publicaddressQR {
167 | display: block;
168 | margin: 1rem auto;
169 | width: 11.25rem; }
170 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressQRCode strong {
171 | color: #00a30c;
172 | display: block;
173 | text-align: center;
174 | font-size: 1.4rem;
175 | margin-bottom: 1rem; }
176 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressQRCode span {
177 | color: #FFFFFF; }
178 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyQRCode {
179 | vertical-align: top;
180 | max-width: 13rem;
181 | display: inline-block;
182 | text-align: center;
183 | margin: 1rem 2rem 4rem 2rem; }
184 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyQRCode #privatekeyQR {
185 | display: block;
186 | margin: 1rem auto;
187 | width: 11.25rem; }
188 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyQRCode strong {
189 | color: #ff0000;
190 | display: block;
191 | text-align: center;
192 | font-size: 1.4rem;
193 | margin-bottom: 1rem; }
194 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyQRCode span {
195 | color: #FFFFFF; }
196 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressText {
197 | display: block;
198 | margin-bottom: 3rem; }
199 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressText strong {
200 | color: #FFFFFF;
201 | display: block;
202 | margin-bottom: 0.5rem; }
203 | .page#page-redemption section#redemption .content .steps .step #bthaddress #publicaddressText span {
204 | word-wrap: break-word;
205 | background-color: #ffcf6a;
206 | display: block;
207 | padding: 0.5rem;
208 | border-radius: 0.5rem;
209 | font-size: 0.85rem; }
210 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyText {
211 | display: block;
212 | margin-bottom: 3rem; }
213 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyText strong {
214 | color: #FFFFFF;
215 | display: block;
216 | margin-bottom: 0.5rem; }
217 | .page#page-redemption section#redemption .content .steps .step #bthaddress #privatekeyText span {
218 | word-wrap: break-word;
219 | background-color: #ffcf6a;
220 | display: block;
221 | padding: 0.5rem;
222 | border-radius: 0.5rem;
223 | font-size: 0.85rem; }
224 | .page#page-redemption section#redemption .content .steps .step #hexedpublicaddressText {
225 | display: block;
226 | margin-bottom: 3rem;
227 | text-align: center; }
228 | .page#page-redemption section#redemption .content .steps .step #hexedpublicaddressText strong {
229 | color: #FFFFFF;
230 | display: block;
231 | margin-bottom: 0.5rem; }
232 | .page#page-redemption section#redemption .content .steps .step #hexedpublicaddressText span {
233 | word-wrap: break-word;
234 | background-color: #ffcf6a;
235 | display: block;
236 | padding: 0.5rem;
237 | border-radius: 0.5rem;
238 | font-size: 0.85rem; }
239 | .page#page-redemption section#redemption .content .wallets {
240 | text-align: center; }
241 | .page#page-redemption section#redemption .content .wallets .wallet {
242 | display: inline-block;
243 | margin: 1rem;
244 | text-decoration: none; }
245 | .page#page-redemption section#redemption .content .wallets .wallet:hover .image {
246 | border-color: #FFC345;
247 | opacity: 1;
248 | transition: all 0.5s ease; }
249 | .page#page-redemption section#redemption .content .wallets .wallet:hover .name {
250 | color: #FFC345;
251 | opacity: 1;
252 | transition: all 0.5s ease; }
253 | .page#page-redemption section#redemption .content .wallets .wallet .image {
254 | background-color: #FFFFFF;
255 | padding: 1rem;
256 | border-radius: 0.5rem;
257 | margin-bottom: 0.5rem;
258 | border: 0.2rem solid transparent;
259 | opacity: 0.8;
260 | transition: all 0.5s ease; }
261 | .page#page-redemption section#redemption .content .wallets .wallet .image > div {
262 | width: 5rem;
263 | height: 5rem;
264 | background-position: center center;
265 | background-repeat: no-repeat;
266 | background-size: contain;
267 | overflow: hidden; }
268 | .page#page-redemption section#redemption .content .wallets .wallet .name {
269 | text-align: center;
270 | color: #FFFFFF;
271 | opacity: 0.8; }
272 | @media print {
273 | .page#page-redemption section#redemption .content > h2 {
274 | display: none; }
275 | .page#page-redemption section#redemption .content > p {
276 | display: none; }
277 | .page#page-redemption section#redemption .content .step[data-step="1"] {
278 | display: none !important; }
279 | .page#page-redemption section#redemption .content .step[data-step="2"] .count, .page#page-redemption section#redemption .content .step[data-step="2"] h3, .page#page-redemption section#redemption .content .step[data-step="2"] p, .page#page-redemption section#redemption .content .step[data-step="2"] a {
280 | display: none; }
281 | .page#page-redemption section#redemption .content .step[data-step="3"] {
282 | display: none !important; }
283 | .page#page-redemption section#redemption .content .step[data-step="4"] {
284 | display: none !important; } }
285 |
286 | footer .copyright {
287 | color: #F6C357;
288 | line-height: 2;
289 | padding: 0 3rem;
290 | font-size: 0.8rem;
291 | box-sizing: border-box;
292 | display: block;
293 | margin-top: 2rem;
294 | padding-bottom: 2rem;
295 | display: block; }
296 | footer #footer-holder {
297 | background-color: #1E2631;
298 | max-height: 30rem;
299 | overflow: hidden;
300 | text-align: center;
301 | position: relative; }
302 | @media (max-width: 1130px) {
303 | footer #footer-holder {
304 | max-height: auto;
305 | min-height: 30rem; } }
306 | footer #footer-holder .content {
307 | width: 100%;
308 | position: absolute;
309 | z-index: 1;
310 | top: 3rem; }
311 | footer #footer-holder .content h2 {
312 | color: #FFFFFF;
313 | font-size: 2.5rem;
314 | font-family: "HKGroteskLight"; }
315 | footer #footer-holder .content a.btn {
316 | padding: 0.8rem 3rem;
317 | margin: 0.5rem;
318 | background-color: #FFFFFF;
319 | text-decoration: none;
320 | color: #F8C545;
321 | font-family: "HKGroteskMedium";
322 | border-radius: 2rem;
323 | font-size: 1.1rem;
324 | display: inline-block; }
325 | footer #footer-holder .content a.btn:hover {
326 | background-color: #F8C545;
327 | color: #FFFFFF; }
328 | footer #footer-holder .content .social a {
329 | color: #FFFFFF;
330 | font-size: 1.8rem;
331 | display: inline-block;
332 | margin: 2rem 1rem; }
333 | footer #footer-holder .content .social a:hover {
334 | color: #F8C545; }
335 | @media (max-width: 1130px) {
336 | footer #footer-holder .content .social a {
337 | font-size: 1.1rem;
338 | margin: 1rem 0.3rem; } }
339 | footer #footer-holder .footer-logo {
340 | width: 13rem;
341 | height: 4rem;
342 | background-image: url(/assets/img/footer-logo.png);
343 | background-position: center center;
344 | background-repeat: no-repeat;
345 | background-size: contain;
346 | margin: 1rem auto;
347 | display: block; }
348 | @media (max-width: 1130px) {
349 | footer #footer-holder .footer-logo {
350 | width: 10rem;
351 | height: 3rem; } }
352 |
--------------------------------------------------------------------------------
/public/assets/js/particles/particles.min.js:
--------------------------------------------------------------------------------
1 | /* -----------------------------------------------
2 | /* Author : Vincent Garreau - vincentgarreau.com
3 | /* MIT license: http://opensource.org/licenses/MIT
4 | /* Demo / Generator : vincentgarreau.com/particles.js
5 | /* GitHub : github.com/VincentGarreau/particles.js
6 | /* How to use? : Check the GitHub README
7 | /* v2.0.0
8 | /* ----------------------------------------------- */
9 | function hexToRgb(e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector("#"+e+" > .particles-js-canvas-el");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:"#fff"},shape:{type:"circle",stroke:{width:0,color:"#ff0000"},polygon:{nb_sides:5},image:{src:"",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:"#fff",opacity:1,width:1},move:{enable:!0,speed:2,direction:"none",random:!1,straight:!1,out_mode:"out",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:"canvas",events:{onhover:{enable:!0,mode:"grab"},onclick:{enable:!0,mode:"push"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext("2d")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener("resize",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},"object"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else"random"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:"string"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,this.vo=i.particles.opacity.anim.speed/100,i.particles.opacity.anim.sync||(this.vo=this.vo*Math.random()));var n={};switch(i.particles.move.direction){case"top":n={x:0,y:-1};break;case"top-right":n={x:.5,y:-.5};break;case"right":n={x:1,y:-0};break;case"bottom-right":n={x:.5,y:.5};break;case"bottom":n={x:0,y:1};break;case"bottom-left":n={x:-.5,y:1};break;case"left":n={x:-1,y:0};break;case"top-left":n={x:-.5,y:-.5};break;default:n={x:0,y:0}}i.particles.move.straight?(this.vx=n.x,this.vy=n.y,i.particles.move.random&&(this.vx=this.vx*Math.random(),this.vy=this.vy*Math.random())):(this.vx=n.x+Math.random()-.5,this.vy=n.y+Math.random()-.5),this.vx_i=this.vx,this.vy_i=this.vy;var r=i.particles.shape.type;if("object"==typeof r){if(r instanceof Array){var c=r[Math.floor(Math.random()*r.length)];this.shape=c}}else this.shape=r;if("image"==this.shape){var o=i.particles.shape;this.img={src:o.image.src,ratio:o.image.width/o.image.height},this.img.ratio||(this.img.ratio=1),"svg"==i.tmp.img_type&&void 0!=i.tmp.source_svg&&(i.fn.vendors.createSvgImg(this),i.tmp.pushing&&(this.img.loaded=!1))}},i.fn.particle.prototype.draw=function(){function e(){i.canvas.ctx.drawImage(r,a.x-t,a.y-t,2*t,2*t/a.img.ratio)}var a=this;if(void 0!=a.radius_bubble)var t=a.radius_bubble;else var t=a.radius;if(void 0!=a.opacity_bubble)var s=a.opacity_bubble;else var s=a.opacity;if(a.color.rgb)var n="rgba("+a.color.rgb.r+","+a.color.rgb.g+","+a.color.rgb.b+","+s+")";else var n="hsla("+a.color.hsl.h+","+a.color.hsl.s+"%,"+a.color.hsl.l+"%,"+s+")";switch(i.canvas.ctx.fillStyle=n,i.canvas.ctx.beginPath(),a.shape){case"circle":i.canvas.ctx.arc(a.x,a.y,t,0,2*Math.PI,!1);break;case"edge":i.canvas.ctx.rect(a.x-t,a.y-t,2*t,2*t);break;case"triangle":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t,a.y+t/1.66,2*t,3,2);break;case"polygon":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t/(i.particles.shape.polygon.nb_sides/3.5),a.y-t/.76,2.66*t/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,1);break;case"star":i.fn.vendors.drawShape(i.canvas.ctx,a.x-2*t/(i.particles.shape.polygon.nb_sides/4),a.y-t/1.52,2*t*2.66/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,2);break;case"image":if("svg"==i.tmp.img_type)var r=a.img.obj;else var r=i.tmp.img_obj;r&&e()}i.canvas.ctx.closePath(),i.particles.shape.stroke.width>0&&(i.canvas.ctx.strokeStyle=i.particles.shape.stroke.color,i.canvas.ctx.lineWidth=i.particles.shape.stroke.width,i.canvas.ctx.stroke()),i.canvas.ctx.fill()},i.fn.particlesCreate=function(){for(var e=0;e=i.particles.opacity.value&&(a.opacity_status=!1),a.opacity+=a.vo):(a.opacity<=i.particles.opacity.anim.opacity_min&&(a.opacity_status=!0),a.opacity-=a.vo),a.opacity<0&&(a.opacity=0)),i.particles.size.anim.enable&&(1==a.size_status?(a.radius>=i.particles.size.value&&(a.size_status=!1),a.radius+=a.vs):(a.radius<=i.particles.size.anim.size_min&&(a.size_status=!0),a.radius-=a.vs),a.radius<0&&(a.radius=0)),"bounce"==i.particles.move.out_mode)var s={x_left:a.radius,x_right:i.canvas.w,y_top:a.radius,y_bottom:i.canvas.h};else var s={x_left:-a.radius,x_right:i.canvas.w+a.radius,y_top:-a.radius,y_bottom:i.canvas.h+a.radius};switch(a.x-a.radius>i.canvas.w?(a.x=s.x_left,a.y=Math.random()*i.canvas.h):a.x+a.radius<0&&(a.x=s.x_right,a.y=Math.random()*i.canvas.h),a.y-a.radius>i.canvas.h?(a.y=s.y_top,a.x=Math.random()*i.canvas.w):a.y+a.radius<0&&(a.y=s.y_bottom,a.x=Math.random()*i.canvas.w),i.particles.move.out_mode){case"bounce":a.x+a.radius>i.canvas.w?a.vx=-a.vx:a.x-a.radius<0&&(a.vx=-a.vx),a.y+a.radius>i.canvas.h?a.vy=-a.vy:a.y-a.radius<0&&(a.vy=-a.vy)}if(isInArray("grab",i.interactivity.events.onhover.mode)&&i.fn.modes.grabParticle(a),(isInArray("bubble",i.interactivity.events.onhover.mode)||isInArray("bubble",i.interactivity.events.onclick.mode))&&i.fn.modes.bubbleParticle(a),(isInArray("repulse",i.interactivity.events.onhover.mode)||isInArray("repulse",i.interactivity.events.onclick.mode))&&i.fn.modes.repulseParticle(a),i.particles.line_linked.enable||i.particles.move.attract.enable)for(var n=e+1;n0){var c=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+c.r+","+c.g+","+c.b+","+r+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(a.x,a.y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}},i.fn.interact.attractParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=t/(1e3*i.particles.move.attract.rotateX),c=s/(1e3*i.particles.move.attract.rotateY);e.vx-=r,e.vy-=c,a.vx+=r,a.vy+=c}},i.fn.interact.bounceParticles=function(e,a){var t=e.x-a.x,i=e.y-a.y,s=Math.sqrt(t*t+i*i),n=e.radius+a.radius;n>=s&&(e.vx=-e.vx,e.vy=-e.vy,a.vx=-a.vx,a.vy=-a.vy)},i.fn.modes.pushParticles=function(e,a){i.tmp.pushing=!0;for(var t=0;e>t;t++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value,{x:a?a.pos_x:Math.random()*i.canvas.w,y:a?a.pos_y:Math.random()*i.canvas.h})),t==e-1&&(i.particles.move.enable||i.fn.particlesDraw(),i.tmp.pushing=!1)},i.fn.modes.removeParticles=function(e){i.particles.array.splice(0,e),i.particles.move.enable||i.fn.particlesDraw()},i.fn.modes.bubbleParticle=function(e){function a(){e.opacity_bubble=e.opacity,e.radius_bubble=e.radius}function t(a,t,s,n,c){if(a!=t)if(i.tmp.bubble_duration_end){if(void 0!=s){var o=n-p*(n-a)/i.interactivity.modes.bubble.duration,l=a-o;d=a+l,"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else if(r<=i.interactivity.modes.bubble.distance){if(void 0!=s)var v=s;else var v=n;if(v!=a){var d=n-p*(n-a)/i.interactivity.modes.bubble.duration;"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else"size"==c&&(e.radius_bubble=void 0),"opacity"==c&&(e.opacity_bubble=void 0)}if(i.interactivity.events.onhover.enable&&isInArray("bubble",i.interactivity.events.onhover.mode)){var s=e.x-i.interactivity.mouse.pos_x,n=e.y-i.interactivity.mouse.pos_y,r=Math.sqrt(s*s+n*n),c=1-r/i.interactivity.modes.bubble.distance;if(r<=i.interactivity.modes.bubble.distance){if(c>=0&&"mousemove"==i.interactivity.status){if(i.interactivity.modes.bubble.size!=i.particles.size.value)if(i.interactivity.modes.bubble.size>i.particles.size.value){var o=e.radius+i.interactivity.modes.bubble.size*c;o>=0&&(e.radius_bubble=o)}else{var l=e.radius-i.interactivity.modes.bubble.size,o=e.radius-l*c;o>0?e.radius_bubble=o:e.radius_bubble=0}if(i.interactivity.modes.bubble.opacity!=i.particles.opacity.value)if(i.interactivity.modes.bubble.opacity>i.particles.opacity.value){var v=i.interactivity.modes.bubble.opacity*c;v>e.opacity&&v<=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}else{var v=e.opacity-(i.particles.opacity.value-i.interactivity.modes.bubble.opacity)*c;v=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}}}else a();"mouseleave"==i.interactivity.status&&a()}else if(i.interactivity.events.onclick.enable&&isInArray("bubble",i.interactivity.events.onclick.mode)){if(i.tmp.bubble_clicking){var s=e.x-i.interactivity.mouse.click_pos_x,n=e.y-i.interactivity.mouse.click_pos_y,r=Math.sqrt(s*s+n*n),p=((new Date).getTime()-i.interactivity.mouse.click_time)/1e3;p>i.interactivity.modes.bubble.duration&&(i.tmp.bubble_duration_end=!0),p>2*i.interactivity.modes.bubble.duration&&(i.tmp.bubble_clicking=!1,i.tmp.bubble_duration_end=!1)}i.tmp.bubble_clicking&&(t(i.interactivity.modes.bubble.size,i.particles.size.value,e.radius_bubble,e.radius,"size"),t(i.interactivity.modes.bubble.opacity,i.particles.opacity.value,e.opacity_bubble,e.opacity,"opacity"))}},i.fn.modes.repulseParticle=function(e){function a(){var a=Math.atan2(d,p);if(e.vx=u*Math.cos(a),e.vy=u*Math.sin(a),"bounce"==i.particles.move.out_mode){var t={x:e.x+e.vx,y:e.y+e.vy};t.x+e.radius>i.canvas.w?e.vx=-e.vx:t.x-e.radius<0&&(e.vx=-e.vx),t.y+e.radius>i.canvas.h?e.vy=-e.vy:t.y-e.radius<0&&(e.vy=-e.vy)}}if(i.interactivity.events.onhover.enable&&isInArray("repulse",i.interactivity.events.onhover.mode)&&"mousemove"==i.interactivity.status){var t=e.x-i.interactivity.mouse.pos_x,s=e.y-i.interactivity.mouse.pos_y,n=Math.sqrt(t*t+s*s),r={x:t/n,y:s/n},c=i.interactivity.modes.repulse.distance,o=100,l=clamp(1/c*(-1*Math.pow(n/c,2)+1)*c*o,0,50),v={x:e.x+r.x*l,y:e.y+r.y*l};"bounce"==i.particles.move.out_mode?(v.x-e.radius>0&&v.x+e.radius0&&v.y+e.radius=m&&a()}else 0==i.tmp.repulse_clicking&&(e.vx=e.vx_i,e.vy=e.vy_i)},i.fn.modes.grabParticle=function(e){if(i.interactivity.events.onhover.enable&&"mousemove"==i.interactivity.status){var a=e.x-i.interactivity.mouse.pos_x,t=e.y-i.interactivity.mouse.pos_y,s=Math.sqrt(a*a+t*t);if(s<=i.interactivity.modes.grab.distance){var n=i.interactivity.modes.grab.line_linked.opacity-s/(1/i.interactivity.modes.grab.line_linked.opacity)/i.interactivity.modes.grab.distance;if(n>0){var r=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+r.r+","+r.g+","+r.b+","+n+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x,i.interactivity.mouse.pos_y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}}},i.fn.vendors.eventsListeners=function(){"window"==i.interactivity.detect_on?i.interactivity.el=window:i.interactivity.el=i.canvas.el,(i.interactivity.events.onhover.enable||i.interactivity.events.onclick.enable)&&(i.interactivity.el.addEventListener("mousemove",function(e){if(i.interactivity.el==window)var a=e.clientX,t=e.clientY;else var a=e.offsetX||e.clientX,t=e.offsetY||e.clientY;i.interactivity.mouse.pos_x=a,i.interactivity.mouse.pos_y=t,i.tmp.retina&&(i.interactivity.mouse.pos_x*=i.canvas.pxratio,i.interactivity.mouse.pos_y*=i.canvas.pxratio),i.interactivity.status="mousemove"}),i.interactivity.el.addEventListener("mouseleave",function(e){i.interactivity.mouse.pos_x=null,i.interactivity.mouse.pos_y=null,i.interactivity.status="mouseleave"})),i.interactivity.events.onclick.enable&&i.interactivity.el.addEventListener("click",function(){if(i.interactivity.mouse.click_pos_x=i.interactivity.mouse.pos_x,i.interactivity.mouse.click_pos_y=i.interactivity.mouse.pos_y,i.interactivity.mouse.click_time=(new Date).getTime(),i.interactivity.events.onclick.enable)switch(i.interactivity.events.onclick.mode){case"push":i.particles.move.enable?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):1==i.interactivity.modes.push.particles_nb?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):i.interactivity.modes.push.particles_nb>1&&i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb);break;case"remove":i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb);break;case"bubble":i.tmp.bubble_clicking=!0;break;case"repulse":i.tmp.repulse_clicking=!0,i.tmp.repulse_count=0,i.tmp.repulse_finish=!1,setTimeout(function(){i.tmp.repulse_clicking=!1},1e3*i.interactivity.modes.repulse.duration)}})},i.fn.vendors.densityAutoParticles=function(){if(i.particles.number.density.enable){var e=i.canvas.el.width*i.canvas.el.height/1e3;i.tmp.retina&&(e/=2*i.canvas.pxratio);var a=e*i.particles.number.value/i.particles.number.density.value_area,t=i.particles.array.length-a;0>t?i.fn.modes.pushParticles(Math.abs(t)):i.fn.modes.removeParticles(t)}},i.fn.vendors.checkOverlap=function(e,a){for(var t=0;tv;v++)e.lineTo(i,0),e.translate(i,0),e.rotate(l);e.fill(),e.restore()},i.fn.vendors.exportImg=function(){window.open(i.canvas.el.toDataURL("image/png"),"_blank")},i.fn.vendors.loadImg=function(e){if(i.tmp.img_error=void 0,""!=i.particles.shape.image.src)if("svg"==e){var a=new XMLHttpRequest;a.open("GET",i.particles.shape.image.src),a.onreadystatechange=function(e){4==a.readyState&&(200==a.status?(i.tmp.source_svg=e.currentTarget.response,i.fn.vendors.checkBeforeDraw()):(console.log("Error pJS - Image not found"),i.tmp.img_error=!0))},a.send()}else{var t=new Image;t.addEventListener("load",function(){i.tmp.img_obj=t,i.fn.vendors.checkBeforeDraw()}),t.src=i.particles.shape.image.src}else console.log("Error pJS - No image.src"),i.tmp.img_error=!0},i.fn.vendors.draw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type?i.tmp.count_svg>=i.particles.number.value?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):void 0!=i.tmp.img_obj?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame))},i.fn.vendors.checkBeforeDraw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type&&void 0==i.tmp.source_svg?i.tmp.checkAnimFrame=requestAnimFrame(check):(cancelRequestAnimFrame(i.tmp.checkAnimFrame),i.tmp.img_error||(i.fn.vendors.init(),i.fn.vendors.draw())):(i.fn.vendors.init(),i.fn.vendors.draw())},i.fn.vendors.init=function(){i.fn.retinaInit(),i.fn.canvasInit(),i.fn.canvasSize(),i.fn.canvasPaint(),i.fn.particlesCreate(),i.fn.vendors.densityAutoParticles(),i.particles.line_linked.color_rgb_line=hexToRgb(i.particles.line_linked.color)},i.fn.vendors.start=function(){isInArray("image",i.particles.shape.type)?(i.tmp.img_type=i.particles.shape.image.src.substr(i.particles.shape.image.src.length-3),i.fn.vendors.loadImg(i.tmp.img_type)):i.fn.vendors.checkBeforeDraw()},i.fn.vendors.eventsListeners(),i.fn.vendors.start()};Object.deepExtend=function(e,a){for(var t in a)a[t]&&a[t].constructor&&a[t].constructor===Object?(e[t]=e[t]||{},arguments.callee(e[t],a[t])):e[t]=a[t];return e},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),window.cancelRequestAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),window.pJSDom=[],window.particlesJS=function(e,a){"string"!=typeof e&&(a=e,e="particles-js"),e||(e="particles-js");var t=document.getElementById(e),i="particles-js-canvas-el",s=t.getElementsByClassName(i);if(s.length)for(;s.length>0;)t.removeChild(s[0]);var n=document.createElement("canvas");n.className=i,n.style.width="100%",n.style.height="100%";var r=document.getElementById(e).appendChild(n);null!=r&&pJSDom.push(new pJS(e,a))},window.particlesJS.load=function(e,a,t){var i=new XMLHttpRequest;i.open("GET",a),i.onreadystatechange=function(a){if(4==i.readyState)if(200==i.status){var s=JSON.parse(a.currentTarget.response);window.particlesJS(e,s),t&&t()}else console.log("Error pJS - XMLHttpRequest status: "+i.status),console.log("Error pJS - File config not found")},i.send()};
--------------------------------------------------------------------------------
/public/assets/js/wallet/ellipticcurve.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Basic Javascript Elliptic Curve implementation
3 | * Ported loosely from BouncyCastle's Java EC code
4 | * Only Fp curves implemented for now
5 | *
6 | * Copyright Tom Wu, bitaddress.org BSD License.
7 | * http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
8 | */
9 | (function () {
10 |
11 | // Constructor function of Global EllipticCurve object
12 | var ec = window.EllipticCurve = function () { };
13 |
14 |
15 | // ----------------
16 | // ECFieldElementFp constructor
17 | // q instanceof BigInteger
18 | // x instanceof BigInteger
19 | ec.FieldElementFp = function (q, x) {
20 | this.x = x;
21 | // TODO if(x.compareTo(q) >= 0) error
22 | this.q = q;
23 | };
24 |
25 | ec.FieldElementFp.prototype.equals = function (other) {
26 | if (other == this) return true;
27 | return (this.q.equals(other.q) && this.x.equals(other.x));
28 | };
29 |
30 | ec.FieldElementFp.prototype.toBigInteger = function () {
31 | return this.x;
32 | };
33 |
34 | ec.FieldElementFp.prototype.negate = function () {
35 | return new ec.FieldElementFp(this.q, this.x.negate().mod(this.q));
36 | };
37 |
38 | ec.FieldElementFp.prototype.add = function (b) {
39 | return new ec.FieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
40 | };
41 |
42 | ec.FieldElementFp.prototype.subtract = function (b) {
43 | return new ec.FieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
44 | };
45 |
46 | ec.FieldElementFp.prototype.multiply = function (b) {
47 | return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
48 | };
49 |
50 | ec.FieldElementFp.prototype.square = function () {
51 | return new ec.FieldElementFp(this.q, this.x.square().mod(this.q));
52 | };
53 |
54 | ec.FieldElementFp.prototype.divide = function (b) {
55 | return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
56 | };
57 |
58 | ec.FieldElementFp.prototype.getByteLength = function () {
59 | return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
60 | };
61 |
62 | // D.1.4 91
63 | /**
64 | * return a sqrt root - the routine verifies that the calculation
65 | * returns the right value - if none exists it returns null.
66 | *
67 | * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
68 | * Ported to JavaScript by bitaddress.org
69 | */
70 | ec.FieldElementFp.prototype.sqrt = function () {
71 | if (!this.q.testBit(0)) throw new Error("even value of q");
72 |
73 | // p mod 4 == 3
74 | if (this.q.testBit(1)) {
75 | // z = g^(u+1) + p, p = 4u + 3
76 | var z = new ec.FieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q));
77 | return z.square().equals(this) ? z : null;
78 | }
79 |
80 | // p mod 4 == 1
81 | var qMinusOne = this.q.subtract(BigInteger.ONE);
82 | var legendreExponent = qMinusOne.shiftRight(1);
83 | if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) return null;
84 | var u = qMinusOne.shiftRight(2);
85 | var k = u.shiftLeft(1).add(BigInteger.ONE);
86 | var Q = this.x;
87 | var fourQ = Q.shiftLeft(2).mod(this.q);
88 | var U, V;
89 |
90 | do {
91 | var rand = new SecureRandom();
92 | var P;
93 | do {
94 | P = new BigInteger(this.q.bitLength(), rand);
95 | }
96 | while (P.compareTo(this.q) >= 0 || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));
97 |
98 | var result = ec.FieldElementFp.fastLucasSequence(this.q, P, Q, k);
99 |
100 | U = result[0];
101 | V = result[1];
102 | if (V.multiply(V).mod(this.q).equals(fourQ)) {
103 | // Integer division by 2, mod q
104 | if (V.testBit(0)) {
105 | V = V.add(this.q);
106 | }
107 | V = V.shiftRight(1);
108 | return new ec.FieldElementFp(this.q, V);
109 | }
110 | }
111 | while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));
112 |
113 | return null;
114 | };
115 |
116 | /*
117 | * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
118 | * Ported to JavaScript by bitaddress.org
119 | */
120 | ec.FieldElementFp.fastLucasSequence = function (p, P, Q, k) {
121 | // TODO Research and apply "common-multiplicand multiplication here"
122 |
123 | var n = k.bitLength();
124 | var s = k.getLowestSetBit();
125 | var Uh = BigInteger.ONE;
126 | var Vl = BigInteger.TWO;
127 | var Vh = P;
128 | var Ql = BigInteger.ONE;
129 | var Qh = BigInteger.ONE;
130 |
131 | for (var j = n - 1; j >= s + 1; --j) {
132 | Ql = Ql.multiply(Qh).mod(p);
133 | if (k.testBit(j)) {
134 | Qh = Ql.multiply(Q).mod(p);
135 | Uh = Uh.multiply(Vh).mod(p);
136 | Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
137 | Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p);
138 | }
139 | else {
140 | Qh = Ql;
141 | Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
142 | Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
143 | Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
144 | }
145 | }
146 |
147 | Ql = Ql.multiply(Qh).mod(p);
148 | Qh = Ql.multiply(Q).mod(p);
149 | Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
150 | Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
151 | Ql = Ql.multiply(Qh).mod(p);
152 |
153 | for (var j = 1; j <= s; ++j) {
154 | Uh = Uh.multiply(Vl).mod(p);
155 | Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
156 | Ql = Ql.multiply(Ql).mod(p);
157 | }
158 |
159 | return [Uh, Vl];
160 | };
161 |
162 | // ----------------
163 | // ECPointFp constructor
164 | ec.PointFp = function (curve, x, y, z, compressed) {
165 | this.curve = curve;
166 | this.x = x;
167 | this.y = y;
168 | // Projective coordinates: either zinv == null or z * zinv == 1
169 | // z and zinv are just BigIntegers, not fieldElements
170 | if (z == null) {
171 | this.z = BigInteger.ONE;
172 | }
173 | else {
174 | this.z = z;
175 | }
176 | this.zinv = null;
177 | // compression flag
178 | this.compressed = !!compressed;
179 | };
180 |
181 | ec.PointFp.prototype.getX = function () {
182 | if (this.zinv == null) {
183 | this.zinv = this.z.modInverse(this.curve.q);
184 | }
185 | var r = this.x.toBigInteger().multiply(this.zinv);
186 | this.curve.reduce(r);
187 | return this.curve.fromBigInteger(r);
188 | };
189 |
190 | ec.PointFp.prototype.getY = function () {
191 | if (this.zinv == null) {
192 | this.zinv = this.z.modInverse(this.curve.q);
193 | }
194 | var r = this.y.toBigInteger().multiply(this.zinv);
195 | this.curve.reduce(r);
196 | return this.curve.fromBigInteger(r);
197 | };
198 |
199 | ec.PointFp.prototype.equals = function (other) {
200 | if (other == this) return true;
201 | if (this.isInfinity()) return other.isInfinity();
202 | if (other.isInfinity()) return this.isInfinity();
203 | var u, v;
204 | // u = Y2 * Z1 - Y1 * Z2
205 | u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
206 | if (!u.equals(BigInteger.ZERO)) return false;
207 | // v = X2 * Z1 - X1 * Z2
208 | v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
209 | return v.equals(BigInteger.ZERO);
210 | };
211 |
212 | ec.PointFp.prototype.isInfinity = function () {
213 | if ((this.x == null) && (this.y == null)) return true;
214 | return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
215 | };
216 |
217 | ec.PointFp.prototype.negate = function () {
218 | return new ec.PointFp(this.curve, this.x, this.y.negate(), this.z);
219 | };
220 |
221 | ec.PointFp.prototype.add = function (b) {
222 | if (this.isInfinity()) return b;
223 | if (b.isInfinity()) return this;
224 |
225 | // u = Y2 * Z1 - Y1 * Z2
226 | var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
227 | // v = X2 * Z1 - X1 * Z2
228 | var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);
229 |
230 |
231 | if (BigInteger.ZERO.equals(v)) {
232 | if (BigInteger.ZERO.equals(u)) {
233 | return this.twice(); // this == b, so double
234 | }
235 | return this.curve.getInfinity(); // this = -b, so infinity
236 | }
237 |
238 | var THREE = new BigInteger("3");
239 | var x1 = this.x.toBigInteger();
240 | var y1 = this.y.toBigInteger();
241 | var x2 = b.x.toBigInteger();
242 | var y2 = b.y.toBigInteger();
243 |
244 | var v2 = v.square();
245 | var v3 = v2.multiply(v);
246 | var x1v2 = x1.multiply(v2);
247 | var zu2 = u.square().multiply(this.z);
248 |
249 | // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
250 | var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
251 | // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
252 | var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
253 | // z3 = v^3 * z1 * z2
254 | var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);
255 |
256 | return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
257 | };
258 |
259 | ec.PointFp.prototype.twice = function () {
260 | if (this.isInfinity()) return this;
261 | if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
262 |
263 | // TODO: optimized handling of constants
264 | var THREE = new BigInteger("3");
265 | var x1 = this.x.toBigInteger();
266 | var y1 = this.y.toBigInteger();
267 |
268 | var y1z1 = y1.multiply(this.z);
269 | var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
270 | var a = this.curve.a.toBigInteger();
271 |
272 | // w = 3 * x1^2 + a * z1^2
273 | var w = x1.square().multiply(THREE);
274 | if (!BigInteger.ZERO.equals(a)) {
275 | w = w.add(this.z.square().multiply(a));
276 | }
277 | w = w.mod(this.curve.q);
278 | //this.curve.reduce(w);
279 | // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
280 | var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
281 | // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
282 | var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
283 | // z3 = 8 * (y1 * z1)^3
284 | var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);
285 |
286 | return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
287 | };
288 |
289 | // Simple NAF (Non-Adjacent Form) multiplication algorithm
290 | // TODO: modularize the multiplication algorithm
291 | ec.PointFp.prototype.multiply = function (k) {
292 | if (this.isInfinity()) return this;
293 | if (k.signum() == 0) return this.curve.getInfinity();
294 |
295 | var e = k;
296 | var h = e.multiply(new BigInteger("3"));
297 |
298 | var neg = this.negate();
299 | var R = this;
300 |
301 | var i;
302 | for (i = h.bitLength() - 2; i > 0; --i) {
303 | R = R.twice();
304 |
305 | var hBit = h.testBit(i);
306 | var eBit = e.testBit(i);
307 |
308 | if (hBit != eBit) {
309 | R = R.add(hBit ? this : neg);
310 | }
311 | }
312 |
313 | return R;
314 | };
315 |
316 | // Compute this*j + x*k (simultaneous multiplication)
317 | ec.PointFp.prototype.multiplyTwo = function (j, x, k) {
318 | var i;
319 | if (j.bitLength() > k.bitLength())
320 | i = j.bitLength() - 1;
321 | else
322 | i = k.bitLength() - 1;
323 |
324 | var R = this.curve.getInfinity();
325 | var both = this.add(x);
326 | while (i >= 0) {
327 | R = R.twice();
328 | if (j.testBit(i)) {
329 | if (k.testBit(i)) {
330 | R = R.add(both);
331 | }
332 | else {
333 | R = R.add(this);
334 | }
335 | }
336 | else {
337 | if (k.testBit(i)) {
338 | R = R.add(x);
339 | }
340 | }
341 | --i;
342 | }
343 |
344 | return R;
345 | };
346 |
347 | // patched by bitaddress.org and Casascius for use with Bitcoin.ECKey
348 | // patched by coretechs to support compressed public keys
349 | ec.PointFp.prototype.getEncoded = function (compressed) {
350 | var x = this.getX().toBigInteger();
351 | var y = this.getY().toBigInteger();
352 | var len = 32; // integerToBytes will zero pad if integer is less than 32 bytes. 32 bytes length is required by the Bitcoin protocol.
353 | var enc = ec.integerToBytes(x, len);
354 |
355 | // when compressed prepend byte depending if y point is even or odd
356 | if (compressed) {
357 | if (y.isEven()) {
358 | enc.unshift(0x02);
359 | }
360 | else {
361 | enc.unshift(0x03);
362 | }
363 | }
364 | else {
365 | enc.unshift(0x04);
366 | enc = enc.concat(ec.integerToBytes(y, len)); // uncompressed public key appends the bytes of the y point
367 | }
368 | return enc;
369 | };
370 |
371 | ec.PointFp.decodeFrom = function (curve, enc) {
372 | var type = enc[0];
373 | var dataLen = enc.length - 1;
374 |
375 | // Extract x and y as byte arrays
376 | var xBa = enc.slice(1, 1 + dataLen / 2);
377 | var yBa = enc.slice(1 + dataLen / 2, 1 + dataLen);
378 |
379 | // Prepend zero byte to prevent interpretation as negative integer
380 | xBa.unshift(0);
381 | yBa.unshift(0);
382 |
383 | // Convert to BigIntegers
384 | var x = new BigInteger(xBa);
385 | var y = new BigInteger(yBa);
386 |
387 | // Return point
388 | return new ec.PointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
389 | };
390 |
391 | ec.PointFp.prototype.add2D = function (b) {
392 | if (this.isInfinity()) return b;
393 | if (b.isInfinity()) return this;
394 |
395 | if (this.x.equals(b.x)) {
396 | if (this.y.equals(b.y)) {
397 | // this = b, i.e. this must be doubled
398 | return this.twice();
399 | }
400 | // this = -b, i.e. the result is the point at infinity
401 | return this.curve.getInfinity();
402 | }
403 |
404 | var x_x = b.x.subtract(this.x);
405 | var y_y = b.y.subtract(this.y);
406 | var gamma = y_y.divide(x_x);
407 |
408 | var x3 = gamma.square().subtract(this.x).subtract(b.x);
409 | var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
410 |
411 | return new ec.PointFp(this.curve, x3, y3);
412 | };
413 |
414 | ec.PointFp.prototype.twice2D = function () {
415 | if (this.isInfinity()) return this;
416 | if (this.y.toBigInteger().signum() == 0) {
417 | // if y1 == 0, then (x1, y1) == (x1, -y1)
418 | // and hence this = -this and thus 2(x1, y1) == infinity
419 | return this.curve.getInfinity();
420 | }
421 |
422 | var TWO = this.curve.fromBigInteger(BigInteger.valueOf(2));
423 | var THREE = this.curve.fromBigInteger(BigInteger.valueOf(3));
424 | var gamma = this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO));
425 |
426 | var x3 = gamma.square().subtract(this.x.multiply(TWO));
427 | var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
428 |
429 | return new ec.PointFp(this.curve, x3, y3);
430 | };
431 |
432 | ec.PointFp.prototype.multiply2D = function (k) {
433 | if (this.isInfinity()) return this;
434 | if (k.signum() == 0) return this.curve.getInfinity();
435 |
436 | var e = k;
437 | var h = e.multiply(new BigInteger("3"));
438 |
439 | var neg = this.negate();
440 | var R = this;
441 |
442 | var i;
443 | for (i = h.bitLength() - 2; i > 0; --i) {
444 | R = R.twice();
445 |
446 | var hBit = h.testBit(i);
447 | var eBit = e.testBit(i);
448 |
449 | if (hBit != eBit) {
450 | R = R.add2D(hBit ? this : neg);
451 | }
452 | }
453 |
454 | return R;
455 | };
456 |
457 | ec.PointFp.prototype.isOnCurve = function () {
458 | var x = this.getX().toBigInteger();
459 | var y = this.getY().toBigInteger();
460 | var a = this.curve.getA().toBigInteger();
461 | var b = this.curve.getB().toBigInteger();
462 | var n = this.curve.getQ();
463 | var lhs = y.multiply(y).mod(n);
464 | var rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n);
465 | return lhs.equals(rhs);
466 | };
467 |
468 | ec.PointFp.prototype.toString = function () {
469 | return '(' + this.getX().toBigInteger().toString() + ',' + this.getY().toBigInteger().toString() + ')';
470 | };
471 |
472 | /**
473 | * Validate an elliptic curve point.
474 | *
475 | * See SEC 1, section 3.2.2.1: Elliptic Curve Public Key Validation Primitive
476 | */
477 | ec.PointFp.prototype.validate = function () {
478 | var n = this.curve.getQ();
479 |
480 | // Check Q != O
481 | if (this.isInfinity()) {
482 | throw new Error("Point is at infinity.");
483 | }
484 |
485 | // Check coordinate bounds
486 | var x = this.getX().toBigInteger();
487 | var y = this.getY().toBigInteger();
488 | if (x.compareTo(BigInteger.ONE) < 0 || x.compareTo(n.subtract(BigInteger.ONE)) > 0) {
489 | throw new Error('x coordinate out of bounds');
490 | }
491 | if (y.compareTo(BigInteger.ONE) < 0 || y.compareTo(n.subtract(BigInteger.ONE)) > 0) {
492 | throw new Error('y coordinate out of bounds');
493 | }
494 |
495 | // Check y^2 = x^3 + ax + b (mod n)
496 | if (!this.isOnCurve()) {
497 | throw new Error("Point is not on the curve.");
498 | }
499 |
500 | // Check nQ = 0 (Q is a scalar multiple of G)
501 | if (this.multiply(n).isInfinity()) {
502 | // TODO: This check doesn't work - fix.
503 | throw new Error("Point is not a scalar multiple of G.");
504 | }
505 |
506 | return true;
507 | };
508 |
509 |
510 |
511 |
512 | // ----------------
513 | // ECCurveFp constructor
514 | ec.CurveFp = function (q, a, b) {
515 | this.q = q;
516 | this.a = this.fromBigInteger(a);
517 | this.b = this.fromBigInteger(b);
518 | this.infinity = new ec.PointFp(this, null, null);
519 | this.reducer = new Barrett(this.q);
520 | }
521 |
522 | ec.CurveFp.prototype.getQ = function () {
523 | return this.q;
524 | };
525 |
526 | ec.CurveFp.prototype.getA = function () {
527 | return this.a;
528 | };
529 |
530 | ec.CurveFp.prototype.getB = function () {
531 | return this.b;
532 | };
533 |
534 | ec.CurveFp.prototype.equals = function (other) {
535 | if (other == this) return true;
536 | return (this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));
537 | };
538 |
539 | ec.CurveFp.prototype.getInfinity = function () {
540 | return this.infinity;
541 | };
542 |
543 | ec.CurveFp.prototype.fromBigInteger = function (x) {
544 | return new ec.FieldElementFp(this.q, x);
545 | };
546 |
547 | ec.CurveFp.prototype.reduce = function (x) {
548 | this.reducer.reduce(x);
549 | };
550 |
551 | // for now, work with hex strings because they're easier in JS
552 | // compressed support added by bitaddress.org
553 | ec.CurveFp.prototype.decodePointHex = function (s) {
554 | var firstByte = parseInt(s.substr(0, 2), 16);
555 | switch (firstByte) { // first byte
556 | case 0:
557 | return this.infinity;
558 | case 2: // compressed
559 | case 3: // compressed
560 | var yTilde = firstByte & 1;
561 | var xHex = s.substr(2, s.length - 2);
562 | var X1 = new BigInteger(xHex, 16);
563 | return this.decompressPoint(yTilde, X1);
564 | case 4: // uncompressed
565 | case 6: // hybrid
566 | case 7: // hybrid
567 | var len = (s.length - 2) / 2;
568 | var xHex = s.substr(2, len);
569 | var yHex = s.substr(len + 2, len);
570 |
571 | return new ec.PointFp(this,
572 | this.fromBigInteger(new BigInteger(xHex, 16)),
573 | this.fromBigInteger(new BigInteger(yHex, 16)));
574 |
575 | default: // unsupported
576 | return null;
577 | }
578 | };
579 |
580 | ec.CurveFp.prototype.encodePointHex = function (p) {
581 | if (p.isInfinity()) return "00";
582 | var xHex = p.getX().toBigInteger().toString(16);
583 | var yHex = p.getY().toBigInteger().toString(16);
584 | var oLen = this.getQ().toString(16).length;
585 | if ((oLen % 2) != 0) oLen++;
586 | while (xHex.length < oLen) {
587 | xHex = "0" + xHex;
588 | }
589 | while (yHex.length < oLen) {
590 | yHex = "0" + yHex;
591 | }
592 | return "04" + xHex + yHex;
593 | };
594 |
595 | /*
596 | * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
597 | * Ported to JavaScript by bitaddress.org
598 | *
599 | * Number yTilde
600 | * BigInteger X1
601 | */
602 | ec.CurveFp.prototype.decompressPoint = function (yTilde, X1) {
603 | var x = this.fromBigInteger(X1);
604 | var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
605 | var beta = alpha.sqrt();
606 | // if we can't find a sqrt we haven't got a point on the curve - run!
607 | if (beta == null) throw new Error("Invalid point compression");
608 | var betaValue = beta.toBigInteger();
609 | var bit0 = betaValue.testBit(0) ? 1 : 0;
610 | if (bit0 != yTilde) {
611 | // Use the other root
612 | beta = this.fromBigInteger(this.getQ().subtract(betaValue));
613 | }
614 | return new ec.PointFp(this, x, beta, null, true);
615 | };
616 |
617 |
618 | ec.fromHex = function (s) { return new BigInteger(s, 16); };
619 |
620 | ec.integerToBytes = function (i, len) {
621 | var bytes = i.toByteArrayUnsigned();
622 | if (len < bytes.length) {
623 | bytes = bytes.slice(bytes.length - len);
624 | } else while (len > bytes.length) {
625 | bytes.unshift(0);
626 | }
627 | return bytes;
628 | };
629 |
630 |
631 | // Named EC curves
632 | // ----------------
633 | // X9ECParameters constructor
634 | ec.X9Parameters = function (curve, g, n, h) {
635 | this.curve = curve;
636 | this.g = g;
637 | this.n = n;
638 | this.h = h;
639 | }
640 | ec.X9Parameters.prototype.getCurve = function () { return this.curve; };
641 | ec.X9Parameters.prototype.getG = function () { return this.g; };
642 | ec.X9Parameters.prototype.getN = function () { return this.n; };
643 | ec.X9Parameters.prototype.getH = function () { return this.h; };
644 |
645 | // secp256k1 is the Curve used by Bitcoin
646 | ec.secNamedCurves = {
647 | // used by Bitcoin
648 | "secp256k1": function () {
649 | // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
650 | var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
651 | var a = BigInteger.ZERO;
652 | var b = ec.fromHex("7");
653 | var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
654 | var h = BigInteger.ONE;
655 | var curve = new ec.CurveFp(p, a, b);
656 | var G = curve.decodePointHex("04"
657 | + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
658 | + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
659 | return new ec.X9Parameters(curve, G, n, h);
660 | }
661 | };
662 |
663 | // secp256k1 called by Bitcoin's ECKEY
664 | ec.getSECCurveByName = function (name) {
665 | if (ec.secNamedCurves[name] == undefined) return null;
666 | return ec.secNamedCurves[name]();
667 | }
668 | })();
669 |
--------------------------------------------------------------------------------
/public/assets/js/wallet/qrcode.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @fileoverview
3 | * - Using the 'QRCode for Javascript library'
4 | * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
5 | * - this library has no dependencies.
6 | *
7 | * @author davidshimjs
8 | * @see http://www.d-project.com/
9 | * @see http://jeromeetienne.github.com/jquery-qrcode/
10 | */
11 | var QRCode;
12 |
13 | (function () {
14 | //---------------------------------------------------------------------
15 | // QRCode for JavaScript
16 | //
17 | // Copyright (c) 2009 Kazuhiko Arase
18 | //
19 | // URL: http://www.d-project.com/
20 | //
21 | // Licensed under the MIT license:
22 | // http://www.opensource.org/licenses/mit-license.php
23 | //
24 | // The word "QR Code" is registered trademark of
25 | // DENSO WAVE INCORPORATED
26 | // http://www.denso-wave.com/qrcode/faqpatent-e.html
27 | //
28 | //---------------------------------------------------------------------
29 | function QR8bitByte(data) {
30 | this.mode = QRMode.MODE_8BIT_BYTE;
31 | this.data = data;
32 | this.parsedData = [];
33 |
34 | // Added to support UTF-8 Characters
35 | for (var i = 0, l = this.data.length; i < l; i++) {
36 | var byteArray = [];
37 | var code = this.data.charCodeAt(i);
38 |
39 | if (code > 0x10000) {
40 | byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
41 | byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
42 | byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
43 | byteArray[3] = 0x80 | (code & 0x3F);
44 | } else if (code > 0x800) {
45 | byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
46 | byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
47 | byteArray[2] = 0x80 | (code & 0x3F);
48 | } else if (code > 0x80) {
49 | byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
50 | byteArray[1] = 0x80 | (code & 0x3F);
51 | } else {
52 | byteArray[0] = code;
53 | }
54 |
55 | this.parsedData.push(byteArray);
56 | }
57 |
58 | this.parsedData = Array.prototype.concat.apply([], this.parsedData);
59 |
60 | if (this.parsedData.length != this.data.length) {
61 | this.parsedData.unshift(191);
62 | this.parsedData.unshift(187);
63 | this.parsedData.unshift(239);
64 | }
65 | }
66 |
67 | QR8bitByte.prototype = {
68 | getLength: function (buffer) {
69 | return this.parsedData.length;
70 | },
71 | write: function (buffer) {
72 | for (var i = 0, l = this.parsedData.length; i < l; i++) {
73 | buffer.put(this.parsedData[i], 8);
74 | }
75 | }
76 | };
77 |
78 | function QRCodeModel(typeNumber, errorCorrectLevel) {
79 | this.typeNumber = typeNumber;
80 | this.errorCorrectLevel = errorCorrectLevel;
81 | this.modules = null;
82 | this.moduleCount = 0;
83 | this.dataCache = null;
84 | this.dataList = [];
85 | }
86 |
87 | QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
88 | return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);}
90 | if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
91 | this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
92 | return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
98 | for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
99 | for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
100 | this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);}
101 | var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
102 | this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
103 | row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. ("
106 | +buffer.getLengthInBits()
107 | +">"
108 | +totalDataCount*8
109 | +")");}
110 | if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
111 | while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
112 | while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
113 | buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
114 | buffer.put(QRCodeModel.PAD1,8);}
115 | return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}}
117 | var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
121 | return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
122 | return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
123 | return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}}
129 | for(var row=0;row=256){n-=255;}
136 | return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
151 | if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
152 | this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
153 |
154 | function _isSupportCanvas() {
155 | return typeof CanvasRenderingContext2D != "undefined";
156 | }
157 |
158 | // android 2.x doesn't support Data-URI spec
159 | function _getAndroid() {
160 | var android = false;
161 | var sAgent = navigator.userAgent;
162 |
163 | if (/android/i.test(sAgent)) { // android
164 | android = true;
165 | var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
166 |
167 | if (aMat && aMat[1]) {
168 | android = parseFloat(aMat[1]);
169 | }
170 | }
171 |
172 | return android;
173 | }
174 |
175 | var svgDrawer = (function() {
176 |
177 | var Drawing = function (el, htOption) {
178 | this._el = el;
179 | this._htOption = htOption;
180 | };
181 |
182 | Drawing.prototype.draw = function (oQRCode) {
183 | var _htOption = this._htOption;
184 | var _el = this._el;
185 | var nCount = oQRCode.getModuleCount();
186 | var nWidth = Math.floor(_htOption.width / nCount);
187 | var nHeight = Math.floor(_htOption.height / nCount);
188 |
189 | this.clear();
190 |
191 | function makeSVG(tag, attrs) {
192 | var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
193 | for (var k in attrs)
194 | if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
195 | return el;
196 | }
197 |
198 | var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
199 | svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
200 | _el.appendChild(svg);
201 |
202 | svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
203 | svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
204 |
205 | for (var row = 0; row < nCount; row++) {
206 | for (var col = 0; col < nCount; col++) {
207 | if (oQRCode.isDark(row, col)) {
208 | var child = makeSVG("use", {"x": String(row), "y": String(col)});
209 | child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
210 | svg.appendChild(child);
211 | }
212 | }
213 | }
214 | };
215 | Drawing.prototype.clear = function () {
216 | while (this._el.hasChildNodes())
217 | this._el.removeChild(this._el.lastChild);
218 | };
219 | return Drawing;
220 | })();
221 |
222 | var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
223 |
224 | // Drawing in DOM by using Table tag
225 | var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
226 | var Drawing = function (el, htOption) {
227 | this._el = el;
228 | this._htOption = htOption;
229 | };
230 |
231 | /**
232 | * Draw the QRCode
233 | *
234 | * @param {QRCode} oQRCode
235 | */
236 | Drawing.prototype.draw = function (oQRCode) {
237 | var _htOption = this._htOption;
238 | var _el = this._el;
239 | var nCount = oQRCode.getModuleCount();
240 | var nWidth = Math.floor(_htOption.width / nCount);
241 | var nHeight = Math.floor(_htOption.height / nCount);
242 | var aHTML = [''];
243 |
244 | for (var row = 0; row < nCount; row++) {
245 | aHTML.push('');
246 |
247 | for (var col = 0; col < nCount; col++) {
248 | aHTML.push(' | ');
249 | }
250 |
251 | aHTML.push('
');
252 | }
253 |
254 | aHTML.push('
');
255 | _el.innerHTML = aHTML.join('');
256 |
257 | // Fix the margin values as real size.
258 | var elTable = _el.childNodes[0];
259 | var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
260 | var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
261 |
262 | if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
263 | elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
264 | }
265 | };
266 |
267 | /**
268 | * Clear the QRCode
269 | */
270 | Drawing.prototype.clear = function () {
271 | this._el.innerHTML = '';
272 | };
273 |
274 | return Drawing;
275 | })() : (function () { // Drawing in Canvas
276 | function _onMakeImage() {
277 | this._elImage.src = this._elCanvas.toDataURL("image/png");
278 | this._elImage.style.display = "block";
279 | this._elCanvas.style.display = "none";
280 | }
281 |
282 | // Android 2.1 bug workaround
283 | // http://code.google.com/p/android/issues/detail?id=5141
284 | if (this._android && this._android <= 2.1) {
285 | var factor = 1 / window.devicePixelRatio;
286 | var drawImage = CanvasRenderingContext2D.prototype.drawImage;
287 | CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
288 | if (("nodeName" in image) && /img/i.test(image.nodeName)) {
289 | for (var i = arguments.length - 1; i >= 1; i--) {
290 | arguments[i] = arguments[i] * factor;
291 | }
292 | } else if (typeof dw == "undefined") {
293 | arguments[1] *= factor;
294 | arguments[2] *= factor;
295 | arguments[3] *= factor;
296 | arguments[4] *= factor;
297 | }
298 |
299 | drawImage.apply(this, arguments);
300 | };
301 | }
302 |
303 | /**
304 | * Check whether the user's browser supports Data URI or not
305 | *
306 | * @private
307 | * @param {Function} fSuccess Occurs if it supports Data URI
308 | * @param {Function} fFail Occurs if it doesn't support Data URI
309 | */
310 | function _safeSetDataURI(fSuccess, fFail) {
311 | var self = this;
312 | self._fFail = fFail;
313 | self._fSuccess = fSuccess;
314 |
315 | // Check it just once
316 | if (self._bSupportDataURI === null) {
317 | var el = document.createElement("img");
318 | var fOnError = function() {
319 | self._bSupportDataURI = false;
320 |
321 | if (self._fFail) {
322 | self._fFail.call(self);
323 | }
324 | };
325 | var fOnSuccess = function() {
326 | self._bSupportDataURI = true;
327 |
328 | if (self._fSuccess) {
329 | self._fSuccess.call(self);
330 | }
331 | };
332 |
333 | el.onabort = fOnError;
334 | el.onerror = fOnError;
335 | el.onload = fOnSuccess;
336 | el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
337 | return;
338 | } else if (self._bSupportDataURI === true && self._fSuccess) {
339 | self._fSuccess.call(self);
340 | } else if (self._bSupportDataURI === false && self._fFail) {
341 | self._fFail.call(self);
342 | }
343 | };
344 |
345 | /**
346 | * Drawing QRCode by using canvas
347 | *
348 | * @constructor
349 | * @param {HTMLElement} el
350 | * @param {Object} htOption QRCode Options
351 | */
352 | var Drawing = function (el, htOption) {
353 | this._bIsPainted = false;
354 | this._android = _getAndroid();
355 |
356 | this._htOption = htOption;
357 | this._elCanvas = document.createElement("canvas");
358 | this._elCanvas.width = htOption.width;
359 | this._elCanvas.height = htOption.height;
360 | el.appendChild(this._elCanvas);
361 | this._el = el;
362 | this._oContext = this._elCanvas.getContext("2d");
363 | this._bIsPainted = false;
364 | this._elImage = document.createElement("img");
365 | this._elImage.alt = "Scan me!";
366 | this._elImage.style.display = "none";
367 | this._el.appendChild(this._elImage);
368 | this._bSupportDataURI = null;
369 | };
370 |
371 | /**
372 | * Draw the QRCode
373 | *
374 | * @param {QRCode} oQRCode
375 | */
376 | Drawing.prototype.draw = function (oQRCode) {
377 | var _elImage = this._elImage;
378 | var _oContext = this._oContext;
379 | var _htOption = this._htOption;
380 |
381 | var nCount = oQRCode.getModuleCount();
382 | var nWidth = _htOption.width / nCount;
383 | var nHeight = _htOption.height / nCount;
384 | var nRoundedWidth = Math.round(nWidth);
385 | var nRoundedHeight = Math.round(nHeight);
386 |
387 | _elImage.style.display = "none";
388 | this.clear();
389 |
390 | for (var row = 0; row < nCount; row++) {
391 | for (var col = 0; col < nCount; col++) {
392 | var bIsDark = oQRCode.isDark(row, col);
393 | var nLeft = col * nWidth;
394 | var nTop = row * nHeight;
395 | _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
396 | _oContext.lineWidth = 1;
397 | _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
398 | _oContext.fillRect(nLeft, nTop, nWidth, nHeight);
399 |
400 | // 안티 앨리어싱 방지 처리
401 | _oContext.strokeRect(
402 | Math.floor(nLeft) + 0.5,
403 | Math.floor(nTop) + 0.5,
404 | nRoundedWidth,
405 | nRoundedHeight
406 | );
407 |
408 | _oContext.strokeRect(
409 | Math.ceil(nLeft) - 0.5,
410 | Math.ceil(nTop) - 0.5,
411 | nRoundedWidth,
412 | nRoundedHeight
413 | );
414 | }
415 | }
416 |
417 | this._bIsPainted = true;
418 | };
419 |
420 | /**
421 | * Make the image from Canvas if the browser supports Data URI.
422 | */
423 | Drawing.prototype.makeImage = function () {
424 | if (this._bIsPainted) {
425 | _safeSetDataURI.call(this, _onMakeImage);
426 | }
427 | };
428 |
429 | /**
430 | * Return whether the QRCode is painted or not
431 | *
432 | * @return {Boolean}
433 | */
434 | Drawing.prototype.isPainted = function () {
435 | return this._bIsPainted;
436 | };
437 |
438 | /**
439 | * Clear the QRCode
440 | */
441 | Drawing.prototype.clear = function () {
442 | this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
443 | this._bIsPainted = false;
444 | };
445 |
446 | /**
447 | * @private
448 | * @param {Number} nNumber
449 | */
450 | Drawing.prototype.round = function (nNumber) {
451 | if (!nNumber) {
452 | return nNumber;
453 | }
454 |
455 | return Math.floor(nNumber * 1000) / 1000;
456 | };
457 |
458 | return Drawing;
459 | })();
460 |
461 | /**
462 | * Get the type by string length
463 | *
464 | * @private
465 | * @param {String} sText
466 | * @param {Number} nCorrectLevel
467 | * @return {Number} type
468 | */
469 | function _getTypeNumber(sText, nCorrectLevel) {
470 | var nType = 1;
471 | var length = _getUTF8Length(sText);
472 |
473 | for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
474 | var nLimit = 0;
475 |
476 | switch (nCorrectLevel) {
477 | case QRErrorCorrectLevel.L :
478 | nLimit = QRCodeLimitLength[i][0];
479 | break;
480 | case QRErrorCorrectLevel.M :
481 | nLimit = QRCodeLimitLength[i][1];
482 | break;
483 | case QRErrorCorrectLevel.Q :
484 | nLimit = QRCodeLimitLength[i][2];
485 | break;
486 | case QRErrorCorrectLevel.H :
487 | nLimit = QRCodeLimitLength[i][3];
488 | break;
489 | }
490 |
491 | if (length <= nLimit) {
492 | break;
493 | } else {
494 | nType++;
495 | }
496 | }
497 |
498 | if (nType > QRCodeLimitLength.length) {
499 | throw new Error("Too long data");
500 | }
501 |
502 | return nType;
503 | }
504 |
505 | function _getUTF8Length(sText) {
506 | var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
507 | return replacedText.length + (replacedText.length != sText ? 3 : 0);
508 | }
509 |
510 | /**
511 | * @class QRCode
512 | * @constructor
513 | * @example
514 | * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
515 | *
516 | * @example
517 | * var oQRCode = new QRCode("test", {
518 | * text : "http://naver.com",
519 | * width : 128,
520 | * height : 128
521 | * });
522 | *
523 | * oQRCode.clear(); // Clear the QRCode.
524 | * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
525 | *
526 | * @param {HTMLElement|String} el target element or 'id' attribute of element.
527 | * @param {Object|String} vOption
528 | * @param {String} vOption.text QRCode link data
529 | * @param {Number} [vOption.width=256]
530 | * @param {Number} [vOption.height=256]
531 | * @param {String} [vOption.colorDark="#000000"]
532 | * @param {String} [vOption.colorLight="#ffffff"]
533 | * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
534 | */
535 | QRCode = function (el, vOption) {
536 | this._htOption = {
537 | width : 256,
538 | height : 256,
539 | typeNumber : 4,
540 | colorDark : "#000000",
541 | colorLight : "#ffffff",
542 | correctLevel : QRErrorCorrectLevel.H
543 | };
544 |
545 | if (typeof vOption === 'string') {
546 | vOption = {
547 | text : vOption
548 | };
549 | }
550 |
551 | // Overwrites options
552 | if (vOption) {
553 | for (var i in vOption) {
554 | this._htOption[i] = vOption[i];
555 | }
556 | }
557 |
558 | if (typeof el == "string") {
559 | el = document.getElementById(el);
560 | }
561 |
562 | if (this._htOption.useSVG) {
563 | Drawing = svgDrawer;
564 | }
565 |
566 | this._android = _getAndroid();
567 | this._el = el;
568 | this._oQRCode = null;
569 | this._oDrawing = new Drawing(this._el, this._htOption);
570 |
571 | if (this._htOption.text) {
572 | this.makeCode(this._htOption.text);
573 | }
574 | };
575 |
576 | /**
577 | * Make the QRCode
578 | *
579 | * @param {String} sText link data
580 | */
581 | QRCode.prototype.makeCode = function (sText) {
582 | this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
583 | this._oQRCode.addData(sText);
584 | this._oQRCode.make();
585 | this._el.title = sText;
586 | this._oDrawing.draw(this._oQRCode);
587 | this.makeImage();
588 | };
589 |
590 | /**
591 | * Make the Image from Canvas element
592 | * - It occurs automatically
593 | * - Android below 3 doesn't support Data-URI spec.
594 | *
595 | * @private
596 | */
597 | QRCode.prototype.makeImage = function () {
598 | if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
599 | this._oDrawing.makeImage();
600 | }
601 | };
602 |
603 | /**
604 | * Clear the QRCode
605 | */
606 | QRCode.prototype.clear = function () {
607 | this._oDrawing.clear();
608 | };
609 |
610 | /**
611 | * @name QRCode.CorrectLevel
612 | */
613 | QRCode.CorrectLevel = QRErrorCorrectLevel;
614 | })();
615 |
--------------------------------------------------------------------------------